{"schema_version":"2026-03-01","name":"legacycore","display_name":"LegacyCore","version":"2.0.0","description":"MCP server for LegacyCore, the SI Final Expense Operating System for final expense and life insurance agencies. Exposes an agent or agency book of policies, premium payments, at-risk policies and conservation, commissions and earnings, carrier portal status sync, Portal Worker submission jobs, call transcripts and coaching, Do-Not-Call checks, referrals and follow-ups. Agents see their own book; managers see their downline; admins see the agency.","vendor":{"name":"LEGACYCORE LLC","url":"https://www.legacycore.io","contact":"contact@legacycore.io"},"documentation":"https://www.legacycore.io/integrations/mcp","privacy_policy":"https://www.legacycore.io/privacy","terms_of_service":"https://www.legacycore.io/terms-of-service","transport":{"type":"streamable-http","url":"https://www.legacycore.io/api/mcp"},"authentication":{"type":"oauth2","protected_resource_metadata":"https://www.legacycore.io/.well-known/oauth-protected-resource","authorization_server_metadata":"https://www.legacycore.io/.well-known/oauth-authorization-server","dynamic_client_registration":"https://www.legacycore.io/register","access_levels":[{"name":"Read only","description":"See the book, commissions, calls and reports. Cannot change anything."},{"name":"Read and act","description":"Read only, plus update policies, payments, notes, DNC and follow-ups in your own book."},{"name":"Full access","description":"Every tool across the agency, including admin controls. Admins only."}],"scopes_supported":["admin:ai_concurrency","admin:kill_switches","admin:organization","admin:pipeline_test","read:analytics","read:applications","read:approvals","read:audit","read:billing","read:calls","read:carrier_2fa","read:carriers","read:commissions","read:compliance","read:crm","read:profile","read:qualification","read:reports","read:submission_queue","read:system","write:applications","write:carrier_sync","write:carriers","write:commissions","write:conservation","write:conversations","write:dnc","write:notifications"],"api_key":{"header":"Authorization: Bearer lc_…","prefix":"lc_","for":"Unattended agents with nobody present to approve a sign-in. Keys are created in LegacyCore Settings › API keys."}},"tool_count":104,"read_only_tool_count":77,"tools":[{"name":"test_pipeline","description":"Trigger end-to-end mock AI application pipeline test","scopes":["admin:pipeline_test"],"read_only":false,"destructive":false},{"name":"get_pipeline_status","description":"Processing + approval status for AI pipeline messages by message_ids; for a single approval record use get_approval_status","scopes":["read:approvals"],"read_only":true,"destructive":false},{"name":"send_policy_summary","description":"Trigger the real policy email for an application (email only; client SMS is off)","scopes":["write:notifications"],"read_only":false,"destructive":false},{"name":"get_approval_status","description":"Status of ONE approval by approval_id (approved/rejected/pending); for message-level status use get_pipeline_status","scopes":["read:approvals"],"read_only":true,"destructive":false},{"name":"list_pending_approvals","description":"AI action approvals awaiting a human decision (the approval queue)","scopes":["read:approvals"],"read_only":true,"destructive":false},{"name":"list_ai_messages","description":"Recent AI-drafted client messages (email; historical SMS rows included) with their approval status; this is the message log, not the queue (use list_pending_approvals)","scopes":["read:approvals"],"read_only":true,"destructive":false},{"name":"list_applications","description":"List, filter, or SEARCH applications — by status/carrier/agent, or a `search` term (client name or phone) to find a specific caller’s application","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"get_application","description":"Get one application by id","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"append_application_note","description":"Record a durable, immutable note or case event (e.g. an opt-out/DNC request) on an application in the append-only event_log; does not change the application status; returns the note id","scopes":["write:conversations"],"read_only":false,"destructive":false},{"name":"get_application_notes","description":"Return an application's durable notes/events from the event_log, oldest-first","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"get_lead_memory","description":"Recall durable facts already known about a contact across prior calls, texts, and applications (coverage goal, budget, existing coverage, objections). Call BEFORE drafting a client-facing reply so it references what the client already said","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"set_application_dnc_status","description":"Set an application's dnc_status directly (clear | do_not_contact | do_not_call | do_not_text | do_not_email) so record, resolver, and audit agree; mirrors call-blocking states to dnc_list; logs a DNC_STATUS_CHANGED event; never changes the business status","scopes":["write:dnc"],"read_only":false,"destructive":false},{"name":"resolve_case","description":"Resolve any of application_id/policy_number/phone/email/name/conversation_id to one joined case: contact, conversation, application, policy, consent (DNC), status, confidence + blockers[]. Recommended first call for a client.","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"get_application_timeline","description":"Unified activity timeline for one application (messages, conservation, events, audit) + compact NL digest for grounding","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"list_pending_client_drafts","description":"Pending AI-drafted client messages awaiting approval (welcome email + replies; legacy SMS drafts are never sent) — the onboarding queue; READ-ONLY (does not send). Filter by application_id, agent_id, or trigger","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"create_application","description":"Insert a new agent_application","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"update_application_status","description":"Set status and/or payment notes. A downgrading status for a client in force on another policy or carrier is rejected (blocked_cross_carrier_active); admin-only override_cross_carrier_guard + override_reason, audited","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"update_application","description":"Partial update of client, medical, and policy fields on an application (only provided fields change; at least one is required besides application_id). Excludes recording_url (use PATCH /api/v1/applications) and ap (auto-derived). Returns the full updated record.","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"submit_client_draft","description":"File an approval-pending client-reply EMAIL draft (client SMS is off; sent to the email on the application) for a human to approve and send; does NOT send. Used by the CS agent on inbound client messages","scopes":["write:conversations"],"read_only":false,"destructive":false},{"name":"list_agents","description":"List profiles (agents)","scopes":["read:profile"],"read_only":true,"destructive":false},{"name":"get_agent_performance","description":"Aggregated agent performance metrics","scopes":["read:analytics"],"read_only":true,"destructive":false},{"name":"get_analytics_report","description":"Full book-of-business analytics report (production, book health, persistency cohorts, economics, conservation, carrier/tier/lead-source/product mix, leaderboard, trend) — same data as /manager and /agent analytics pages","scopes":["read:analytics"],"read_only":true,"destructive":false},{"name":"get_agent_talk_wait_metrics","description":"Talk/wait metrics from warm_transfer_requests (human) and Retell call history (AI), for a date window","scopes":["read:analytics"],"read_only":true,"destructive":false},{"name":"get_human_agent_availability","description":"Live human-agent availability, sorted by longest-waiting first","scopes":["read:profile"],"read_only":true,"destructive":false},{"name":"get_optimal_transfer_target","description":"Pick the best available human agent for a live transfer, based on state licensing + FIFO fairness","scopes":["read:profile"],"read_only":true,"destructive":false},{"name":"list_commissions","description":"Commission book as the Finance page shows it: booked, paid, pending per agent, the back-end forecast, and optionally each policy. One agent, a manager team, or the whole agency","scopes":["read:commissions"],"read_only":true,"destructive":false},{"name":"update_commission_status","description":"Update commission status/payment details on an application (Paid/Pending/Partial/Not Applicable). At least one of commission_status, commission_amount, or commission_payment_reference is required","scopes":["write:commissions"],"read_only":false,"destructive":false},{"name":"get_revenue_summary","description":"Premium (AP) and commission totals grouped by status, carrier, agent or month. Commission is the split-adjusted amount the Finance page shows","scopes":["read:reports"],"read_only":true,"destructive":false},{"name":"check_kill_switches","description":"Show current kill-switch state","scopes":["admin:kill_switches"],"read_only":true,"destructive":false},{"name":"toggle_kill_switch","description":"Enable/disable a named kill switch (admin). Requires a reason of at least 10 characters","scopes":["admin:kill_switches"],"read_only":false,"destructive":true},{"name":"get_ai_concurrency_status","description":"Show Retell concurrency cap + current utilization","scopes":["read:system"],"read_only":true,"destructive":false},{"name":"set_ai_concurrency_limit","description":"Update Retell concurrency cap (admin)","scopes":["admin:ai_concurrency"],"read_only":false,"destructive":false},{"name":"get_system_health","description":"Health check across LegacyCore + downstream APIs","scopes":["read:system"],"read_only":true,"destructive":false},{"name":"get_live_ai_calls","description":"Retell AI calls in progress right now (real-time snapshot); for historical calls use list_retell_calls","scopes":["read:calls"],"read_only":true,"destructive":false},{"name":"list_retell_calls","description":"List Retell AI voice-agent calls; for in-progress calls use get_live_ai_calls","scopes":["read:calls"],"read_only":true,"destructive":false},{"name":"get_retell_call","description":"Get one Retell call","scopes":["read:calls"],"read_only":true,"destructive":false},{"name":"list_retell_agents","description":"List Retell agents","scopes":["read:calls"],"read_only":true,"destructive":false},{"name":"retry_call_transcription","description":"Re-run transcription + AI summary for an application's call recording (handles long/large audio); idempotent, skips if already done unless force=true","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"get_call_transcript","description":"Get the stored verbatim call transcript for an application; returns has_transcript=false with guidance if not transcribed yet","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"get_call_summary","description":"Get the stored AI call summary + score for an application; returns has_summary=false with guidance if not generated yet","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"get_policy_summary","description":"Get the stored, data-derived policy summary for an application — a clean breakdown (name, carrier, product, premium, face amount, status, beneficiary, contact) built from this row, not a call transcript; use when get_call_summary has no recording to work from","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"check_dnc_status","description":"Fast single-phone DNC + national-registry check; for a full compliance verdict (DNC + consent + history) use investigate_phone","scopes":["read:compliance"],"read_only":true,"destructive":false},{"name":"add_to_dnc","description":"Add phone to DNC list (write — TCPA-sensitive). Requires a reason","scopes":["write:dnc"],"read_only":false,"destructive":false},{"name":"get_dnc_audit","description":"Bulk cross-ref of ALL applications against the DNC list; for one phone use investigate_phone","scopes":["read:compliance"],"read_only":true,"destructive":false},{"name":"get_compliance_log","description":"Raw TCPA consent records by phone/date; for a verdict on one phone use investigate_phone","scopes":["read:compliance"],"read_only":true,"destructive":false},{"name":"list_compliance_violations","description":"Bulk rollup of TCPA/DNC/kill-switch incidents across the book; for one phone use investigate_phone","scopes":["read:compliance"],"read_only":true,"destructive":false},{"name":"list_at_risk_policies","description":"Conservation-actionable policies (unpaid / pending-first-payment / lapsed / needs-attention, dead ones excluded), each with a risk_reason + payment evidence; for pipeline stage + next action use get_conservation_queue","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"trigger_conservation","description":"Kick off conservation outreach for one application. Requires a reason","scopes":["write:conservation"],"read_only":false,"destructive":false},{"name":"get_conservation_queue","description":"Per-policy conservation pipeline — last outreach stage, matched rule, next action; for the plain at-risk list use list_at_risk_policies","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"get_billing_status","description":"Stripe subscription status across all customers","scopes":["read:billing"],"read_only":true,"destructive":false},{"name":"list_failed_payments","description":"Recent Stripe failed payments","scopes":["read:billing"],"read_only":true,"destructive":false},{"name":"get_daily_report","description":"Daily production summary (demo-filtered)","scopes":["read:reports"],"read_only":true,"destructive":false},{"name":"get_nemoclaw_submission_queue","description":"Carrier submission queue across the agency: portal-worker eApp jobs (open by default), counts per status, and how many workers are online. Client shown as first name + last initial","scopes":["read:submission_queue"],"read_only":true,"destructive":false},{"name":"check_profit_first_qualification","description":"Check profit-first qualification (age >= 50 + checking acct)","scopes":["read:qualification"],"read_only":true,"destructive":false},{"name":"query_event_log","description":"Query the immutable event log","scopes":["read:audit"],"read_only":true,"destructive":false},{"name":"create_notification","description":"CANONICAL notification tool for external agents: creates an in-app bell notification AND fans out to web push in one call","scopes":["write:notifications"],"read_only":false,"destructive":false},{"name":"get_hermes_status","description":"Hermes Conservation CS heartbeat status (ONLINE/STALE/OFFLINE) + queue depth + self-checks","scopes":["read:system"],"read_only":true,"destructive":false},{"name":"get_policy_summary_status","description":"Check whether the policy-summary PDF for an application is ready","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"list_api_key_calls","description":"Audit-log query against api_keys_private.api_key_usage_logs (filter by api_key_id/prefix/tool_name/window; group_by=tool|status|none)","scopes":["read:audit"],"read_only":true,"destructive":false},{"name":"investigate_phone","description":"Compliance investigator: single-call join of DNC + compliance log + event log + applications + call history. Returns verdict.","scopes":["read:compliance"],"read_only":true,"destructive":false},{"name":"carrier_sync_open_session","description":"Open a durable carrier-sync run BEFORE portal extraction. Returns run_id, portal URL, mapping version and whether the carrier has any status mappings yet","scopes":["write:carrier_sync"],"read_only":false,"destructive":false},{"name":"carrier_sync_validate_rows","description":"Shape-check extracted portal rows before ingest: missing fields, duplicate policy numbers, bad premium shapes, absent raw_data, prompt-injection-looking text. Writes nothing","scopes":["read:carriers"],"read_only":true,"destructive":false},{"name":"carrier_sync_match_rows","description":"Preview row matching. Key: normalized policy number within agent_id, then client name + effective date; 2+ candidates = ambiguous. Writes nothing. The cross-carrier guard later matches the client by name + DOB, else name + phone","scopes":["read:carriers"],"read_only":true,"destructive":false},{"name":"carrier_sync_dry_run","description":"Full update plan with per-row diffs; writes NOTHING to applications. Leaves the run open: status dry_run_completed, ingest_rows works on the same run_id. Cross-carrier guard blocks show as blocked_cross_carrier_active","scopes":["write:carrier_sync"],"read_only":true,"destructive":false},{"name":"carrier_sync_ingest_rows","description":"The single live-write path. Never writes ambiguous, unmatched or unmapped rows, nor a downgrade (declined/cancelled/lapsed...) for a client in force on another policy or carrier: blocked_cross_carrier_active, counted in the summary","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"carrier_sync_create_missing_applications","description":"Reviewed create: adds applications for policy numbers you pick from one run's unmatched_policies, for that run's agent only. Missing DOB or premium saves as draft. Idempotent per run + policy","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"carrier_sync_get_run","description":"Full state of one sync run: ledger, per-row decisions, evidence, reconciled counts. The recovery path when a worker process dies mid-run","scopes":["read:carriers"],"read_only":true,"destructive":false},{"name":"carrier_sync_list_recent_runs","description":"Recent carrier-sync runs, newest first — answers \"did this carrier already sync today?\" before opening a duplicate run","scopes":["read:carriers"],"read_only":true,"destructive":false},{"name":"carrier_sync_list_configs","description":"Configured carriers with portal URL, enabled state, alias list, status-mapping count and versions. Read before syncing all carriers","scopes":["read:carriers"],"read_only":true,"destructive":false},{"name":"carrier_sync_upsert_status_mapping","description":"Map a newly discovered raw carrier status to a canonical LegacyCore status. Elevated: agency-wide config, audited, rejects non-canonical targets","scopes":["write:carriers"],"read_only":false,"destructive":false},{"name":"carrier_sync_attach_evidence","description":"Attach evidence to a sync run — screenshot reference, phase timing, blocker context, extract summary or portal URL. Stored as data, never interpreted","scopes":["write:carrier_sync"],"read_only":false,"destructive":false},{"name":"carrier_sync_get_update_capabilities","description":"Exactly which application columns the sync engine may write, which it will not, and why. The authoritative field contract for portal sync","scopes":["read:carriers"],"read_only":true,"destructive":false},{"name":"carrier_sync_run_all_plan","description":"Backend-approved plan for syncing every configured carrier: run order, recommended mode, and per-carrier blockers. Runs no browser automation","scopes":["read:carriers"],"read_only":true,"destructive":false},{"name":"carrier_2fa_get_code","description":"SENSITIVE: read a live carrier 2FA code from the agent's connected mailbox, ignoring anything older than requested_after. retry=false means the setup is broken and polling will never help","scopes":["read:carrier_2fa"],"read_only":true,"destructive":false},{"name":"portal_worker_status","description":"Is the portal worker for this agent online? The portal worker is the local runner on the agent computer that fills carrier eApps. Lists each paired worker with its last-seen time and expected carriers. Contains no client data","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"portal_worker_list_jobs","description":"Carrier eApp jobs sent from the Portal Worker page, newest first, each with its latest progress step. Client shown as first name + last initial only; no SSN, DOB or address","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"portal_worker_get_job_progress","description":"Every progress step of one portal-worker job (picked up, signed in, page filled, needs you, handed off), plus whether its worker is online. Pass after_seq to get only new steps","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"portal_worker_recover_job","description":"Cancel or retry one portal-worker eApp job. Retry needs carrier_outcome not_submitted (the agent confirmed nothing reached the carrier); cancel wipes the stored SSNs","scopes":["write:applications"],"read_only":false,"destructive":true},{"name":"get_policy_payments","description":"Monthly premium payments recorded for one policy or every policy in the agent book (PAID, MISSED, PENDING, NSF, WAIVED per month)","scopes":["read:applications"],"read_only":true,"destructive":false},{"name":"update_policy_payment","description":"Record one month of a client premium payment (PAID, MISSED, PENDING, NSF, WAIVED). Same write and audit trail as the payment grid; month 1 also sets the policy paid status","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"list_referrals","description":"Referral contacts harvested from the agent clients (beneficiaries and family), newest first, with counts per status","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"harvest_referrals","description":"Pull referral contacts (beneficiary name, phone, relationship) from one active policy into the referral list. Never contacts anyone","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"list_letters","description":"Handwritten letters sent to the agent clients through Handwrytten, newest first, with status and how each was paid for","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"get_earnings_statement","description":"Yearly earnings statement as the Tax Center builds it: gross paid, pending, chargebacks, net, by quarter and month","scopes":["read:commissions"],"read_only":true,"destructive":false},{"name":"get_wallet","description":"Agent wallet balance (pays for voice minutes, letters, avatar videos) and its latest transactions","scopes":["read:billing"],"read_only":true,"destructive":false},{"name":"get_goals","description":"Production goals: the agent personal monthly, quarterly and yearly targets with actuals, plus team goals when the agent is a manager","scopes":["read:analytics"],"read_only":true,"destructive":false},{"name":"list_voice_calls","description":"Recent calls handled by the agent voice agents (xAI Grok voice, Retell, ElevenLabs): status, duration, cost, summary. Caller shown as last four digits","scopes":["read:calls"],"read_only":true,"destructive":false},{"name":"list_live_call_sessions","description":"Live Call Co-Pilot sessions the agent ran on their own calls: when, how long, and whether one is active now","scopes":["read:calls"],"read_only":true,"destructive":false},{"name":"list_funnel_leads","description":"Leads assigned to the agent in the lead funnel with their stage and score, counts per stage. Client shown as first name + last initial","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"get_coaching_insights","description":"SI coaching reviews of the agent calls: performance score, strengths, improvement areas and suggestions, newest first","scopes":["read:analytics"],"read_only":true,"destructive":false},{"name":"get_calendar_events","description":"Upcoming events on the agent connected Google Calendar for the next N days (default 14). Fails with calendar_not_connected if they never connected it","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"create_follow_up_event","description":"Book a client follow-up on the agent Google Calendar (\"Follow-up: client name\", carrier, product, phone, notes)","scopes":["write:applications"],"read_only":false,"destructive":false},{"name":"list_access_sessions","description":"Context-aware access: sign-in sessions seen in the last N hours with risk scores, and every non-allow decision (step-up, block). Agency-wide, full-access keys only","scopes":["read:audit"],"read_only":true,"destructive":false},{"name":"list_demo_bookings","description":"Prospect demo bookings from the public site: upcoming by default, with agency, size, qualification and source. Full-access keys only","scopes":["admin:organization"],"read_only":true,"destructive":false},{"name":"list_avatar_videos","description":"The agent My Avatar videos: purpose, status, length and credits used, newest first","scopes":["read:profile"],"read_only":true,"destructive":false},{"name":"social_list_channels","description":"Social accounts connected in the agent Postiz workspace (id, name, network). Call before social_create_post to get channel ids","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"social_check_post","description":"Checks post text for insurance advertising red flags (guaranteed approval, free coverage, government program, carrier names). Run before posting","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"social_create_post","description":"Posts to the agent social channels through their Postiz workspace: type draft (default, agent reviews in Postiz), schedule (needs scheduled_for, ISO time) or now. Logged on the agent Social page","scopes":["write:conversations"],"read_only":false,"destructive":false},{"name":"social_list_posts","description":"The agent social post log, newest first: type, status, channels, schedule and whether it came from the app or a bot","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"voice_caller_policies","description":"The caller own policies (carrier, product, status, premium, draft day) with a sentence to say. If it returns needs_verification, ask for the date of birth and call again with it","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"voice_payment_status","description":"Whether the caller premium payments are up to date: first payment received, latest month, missed drafts, draft day, with a sentence to say","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"voice_check_dnc","description":"Is the caller number on the do-not-call list? Returns a sentence to say","scopes":["read:crm"],"read_only":true,"destructive":false},{"name":"voice_add_to_dnc","description":"The caller asked not to be called again: add their number to the internal do-not-call list (TCPA). Use whenever a caller says stop calling","scopes":["write:dnc"],"read_only":false,"destructive":false},{"name":"voice_request_callback","description":"Ask the agent to call the caller back: a bell and push notification with the reason, preferred time and a link to the policy","scopes":["write:notifications"],"read_only":false,"destructive":false}],"resources":[{"uri":"https://www.legacycore.io/llms.txt","name":"Site overview for LLMs","mimeType":"text/plain"},{"uri":"https://www.legacycore.io/api/mcp/manifest","name":"MCP tool manifest with input schemas","mimeType":"application/json"},{"uri":"https://www.legacycore.io/api/aeo/openapi.json","name":"OpenAPI 3.1 specification for /api/v1","mimeType":"application/json"}],"when_to_use":"Use for final expense and life insurance agency work: looking up or updating policies, checking premium drafts and missed payments, finding and working at-risk policies, commissions and chargebacks, carrier status sync, Portal Worker jobs, call transcripts, Do-Not-Call checks before outreach, referrals and follow-ups. Do not use for consumer insurance purchases, quotes or claims filing.","well_known":{"discovery":"https://www.legacycore.io/.well-known/mcp","manifest":"https://www.legacycore.io/.well-known/mcp.json","server_card":"https://www.legacycore.io/.well-known/mcp/server-card.json"}}