What the MCP server does
Finn runs a remote MCP server. Connect an AI assistant to it, such as Claude, ChatGPT, Cursor or Claude Code, and the assistant can work in your Finn workspace on your behalf:
- Finn agents: list and read your voice and chat agents, create new ones as drafts, edit drafts, and read aggregate call stats.
- CRM: search and read records, timelines, follow-ups, documents and forms; ask the CRM questions in plain English; add notes and follow-ups, create records and edit fields; move stages, submit forms, attach files, import sheets and create outside-party links.
What a key can do is set by its scopes, chosen when you generate it. A key never does more than its owner can do in the dashboard.
It's deliberately limited. No tool can place a call, send an email or message, start or stop a deployment, delete or merge anything, export data in bulk, read transcripts or recordings, touch billing, or take a Finn out of draft. Stage moves, form submits, file attaches, imports and outside-party links show you a preview and ask before they happen.
Server
| URL | https://mcp.hirefinn.ai/mcp |
| Transport | Streamable HTTP. There's no package to install and nothing to run locally. |
| Auth | A personal MCP key: finn_mcp_ followed by 48 hex characters |
If you connected with the older finn-mcp-73965536364.asia-southeast1.run.app address, it still works for now. Switch to the address above when you next reconnect.
The key belongs to the person who generated it. Everything the assistant does happens as that person, in their organization. You can't pass an organization or creator ID to change that.
Get a key
- In the dashboard, go to Settings → Integrations and find AI Assistants (MCP).
- Click Generate key.
- Enter a Key name, for example "work laptop". In Claude, the connector shows up under this name.
- Under What this key can do, pick its scopes (see Scopes below). Finn agents is on by default.
- Under Organizations, keep All my organizations or pick Only these organizations.
- Set Expires. Keys that see sensitive fields or make CRM changes must expire; they default to 90 days and can last up to 365.
- Click Generate.
The key is shown once. The dialog that shows it also gives you a ready-made connector link and Claude Code command. Copy what you need before you click Done, I've copied it.
The key list shows each key's scopes, when it was created, when it was last used and when it expires. Revoke stops a key on its next request. Finns already created with it aren't affected. There's no public API for creating or revoking keys. To change a key's scopes, generate a new key and revoke the old one.
Scopes
| Scope | In the dashboard | What it adds |
|---|---|---|
finn | Finn agents | The Finn agent tools: list, read, create and edit draft voice and chat agents, and read call stats. Every key made before scopes existed has this one. |
crm:read | Read CRM | Search and read records, stages, timelines, follow-ups, documents, forms and pipeline stats; Ask the CRM. Added automatically with any other crm: scope. |
crm:write | Make changes | Add notes and follow-ups, create records, edit fields and tags, tick stage checks, set document status, assign reference numbers, save form drafts and views, start AI document drafts. Can't move stages, delete or send. |
crm:stage | Move stages and submit forms | Move a record to another stage (its checks must be met) and submit forms. Asks you to confirm each one. Submitting forms also needs crm:sensitive:read. |
crm:docs:write | Attach files | Upload a file (up to 5 MB) to a record. Adds files, never replaces or removes them. |
crm:sensitive:read | See sensitive fields | Shows the fields your organization marks sensitive (for example ID numbers) and form answers. Without it they come back redacted. |
crm:import | Import sheets | Import up to 500 rows of a CSV into the CRM. Admins only. Shows a preview and asks first. |
crm:share | Create outside links | Make a form or upload link for someone outside your team, valid up to 30 days. Asks first. Doesn't send it. |
The server only lists the tools a key's scopes allow, and the backend checks the scope again on every request.
Connect a client
Claude (web or desktop)
The dialog's Claude app tab shows Your connector link:
https://mcp.hirefinn.ai/mcp/finn_mcp_...
- In Claude, open Customize → Connectors, click + and choose Add custom connector.
- Paste the link as the remote MCP server URL and click Add.
- In a new chat, open + → Connectors and switch Finn on.
The link contains your key, so anyone who has it can act as you. Treat it like a password, and revoke the key if it leaks.
On Claude's Free plan you can add one custom connector. On Team and Enterprise plans, only an Owner can add one, under Organization settings → Connectors, and everyone else then clicks Connect.
Claude Code
The dialog's Claude Code tab shows the command with your key filled in:
claude mcp add --transport http finn https://mcp.hirefinn.ai/mcp --header "Authorization: Bearer finn_mcp_..."
Run it in a terminal, then start claude.
Cursor
Add Finn to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json in a project:
{
"mcpServers": {
"finn": {
"url": "https://mcp.hirefinn.ai/mcp",
"headers": { "Authorization": "Bearer finn_mcp_..." }
}
}
}
Then open Cursor Settings → MCP and check that Finn is listed and switched on. Don't commit a project file that contains your key.
ChatGPT
ChatGPT connects to remote MCP servers in developer mode (Plus, Pro, Business, Enterprise and Edu plans, on the web). On Business and Enterprise an admin may need to allow custom connectors first.
- In ChatGPT, open Settings → Apps & Connectors → Advanced settings and turn on Developer mode.
- Back in Apps & Connectors, click Create.
- Give it a name, such as "Finn", and paste your connector link (
https://mcp.hirefinn.ai/mcp/finn_mcp_...) as the MCP server URL. - Set authentication to No authentication: the key is in the link.
- Confirm that you trust the server, and click Create.
- In a new chat, turn Finn on from the tools menu.
The link contains your key, as with Claude. Menu names in ChatGPT change between releases; if yours differ, look for developer mode and custom connectors.
Other clients
Any MCP client that supports streamable HTTP works. Point it at https://mcp.hirefinn.ai/mcp and send Authorization: Bearer finn_mcp_.... If the client only takes a URL, use the connector link with the key in it.
To check the connection, ask the assistant to list your Finns. It should call list_finns. With only CRM scopes, ask for your follow-ups instead: it should call crm_list_follow_ups.
Tools
There are 50: 18 Finn agent tools with the finn scope and 32 CRM tools across the crm: scopes. A key sees only the tools its scopes allow.
Finn agent tools (finn)
| Tool | Changes anything | What it does |
|---|---|---|
list_finns | No | Your Finns, newest first: id, name, status, channel (voice or chat), use case. Can list only voice or only chat agents. |
get_finn | No | One Finn's persona and settings, including its channel, time zone and call handling |
get_finn_settings | No | What get_finn doesn't show: agent handbook toggles, speech settings, whether the call flow canvas is on, per-task settings and attached knowledge-base documents |
get_finn_flow | No | The call flow canvas: its steps, how they connect, and whether it's on |
get_finn_variables | No | The Finn's {placeholders}, {{variables}}, their CSV column mapping, and its post-call fields |
get_finn_stats | No | Call totals, answer and success rates, minutes, cost and breakdowns for a date range. Defaults to the last 30 days. Aggregates only. |
summarize_finn_outcomes | No | Totals for each post-call field over a date range: choice counts, number averages, common text answers. Aggregates only. |
list_orgs | No | The organizations your key belongs to, and your role |
list_voices | No | Voice IDs, filterable by provider and a search term |
get_share_link | Creates a link if there isn't one | The Finn's public share link |
create_finn | Creates a draft | A new voice or chat agent from a name, identity, style and response guidelines, plus optional use case, language, voice and opening line |
generate_finn | Creates a draft | A complete draft voice or chat agent from a plain-language brief, using the dashboard's AI Copilot. Takes up to a minute. |
duplicate_finn | Creates a draft | A copy of a Finn. The call flow canvas, agent handbook, speech settings and share link aren't copied. |
update_finn_draft | Edits a draft | Changes a draft's persona fields, time zone and, for voice agents, call handling. Fields you don't name keep their values. |
update_finn_variables | Edits a draft | Maps {placeholders} to audience CSV columns, turns mapping on or off, and sets post-call fields |
update_finn_handbook | Edits a draft | Turns agent handbook guidelines on or off: tone, fillers, empathy, read-back, NATO spelling, spoken numbers, smart matching, AI disclosure, scope |
update_finn_speech_settings | Edits a draft | Voicemail, ending on silence, ring time, noise filtering, response speed, speaking speed, interruptions, background volume, words to listen for, pronunciations |
set_finn_flow_enabled | Edits a draft | Whether a voice draft follows its call flow canvas or its workflow prompt. The canvas itself isn't changed. |
Tools that create or edit a Finn return a link to it in the dashboard. A dashboard tab that was already open won't list a new Finn until you reload it.
The edit tools only work on drafts. A Finn that has been deployed is edited in the dashboard.
Chat agents
Pass channel: "chat" to create_finn or generate_finn to make a text chat agent instead of a voice agent. It's the same as choosing Chat AI Agent in the dashboard, and the link the tool returns opens it in the chat agent builder. Editing or copying a chat agent keeps it a chat agent.
Connecting a chat agent to your website, WhatsApp, SMS or email inbox is done in the dashboard, under Chat AI Agents.
Call handling
update_finn_draft sets the same options as the call handling panel in the dashboard. They apply to voice agents only.
| Field | Values |
|---|---|
limitCallDuration | 1 min, 3 mins, 5 mins, 10 mins, 15 mins, 30 mins, 60 mins or None |
maxIdleDuration | How long the caller can stay silent before the idle reminder: 10s, 20s, 30s, 45s, 60s, 90s, 120s or None |
idleReminder | What the Finn says after that silence |
voicemailDetection | true to hang up on voicemail |
timezone | An IANA time zone such as Asia/Kolkata. Works for chat agents too. |
The CSV column mapping that get_finn_variables and update_finn_variables read and write isn't applied on phone calls, and neither are single-brace {placeholders}. Calls fill {{ column }} variables in the welcome message and system prompt straight from the audience row. See variables.
get_share_link returns the existing link if there is one. If sharing was switched off or the link has expired, it says so rather than making a new one. Anyone with a share link can talk to the Finn in a browser, which uses your credits.
CRM tools
Every CRM tool takes an org_id and starts with crm_. Call crm_get_schema first: it returns the organization's record kinds, stages, custom fields (and which are sensitive), document types, and the filters search accepts.
| Tool | Scope | What it does |
|---|---|---|
crm_get_schema | crm:read | The CRM's setup: record kinds, stages, custom fields, document types, filter catalog |
crm_search_records | crm:read | Find records by free text (name, phone, email, reference number) or by a filter |
crm_count_records | crm:read | How many records match a filter; optionally per stage |
crm_get_record | crm:read | One record in full: fields, stage, assignee, sections and links |
crm_get_timeline | crm:read | Notes, stage changes, field changes, and call summaries (never transcripts) |
crm_get_stage_gate | crm:read | What a record still needs before it can move to a stage |
crm_list_documents | crm:read | A record's documents (names, types, status; never contents) and forms checklist |
crm_list_forms | crm:read | The organization's form templates. Not the answers. |
crm_list_follow_ups | crm:read | Follow-ups: yours, the team's or unassigned; open, overdue or done |
crm_my_work | crm:read | Records assigned to you that need action now |
crm_list_views | crm:read | Saved views (named filters) |
crm_get_pipeline_stats | crm:read | Records per stage, a summary, and response speed for a period |
crm_find_duplicates | crm:read | Records that look like duplicates. Merging stays in the dashboard. |
crm_ask | crm:read | Ask a question in plain English; returns the filter it understood and the count. Counts toward the daily Ask limit. |
crm_get_form_submissions | crm:sensitive:read | A record's submitted forms and drafts, with answers |
crm_add_note | crm:write | Add a comment to a record's timeline, optionally mentioning teammates |
crm_create_follow_up | crm:write | Create a follow-up on a record |
crm_update_follow_up | crm:write | Mark a follow-up done or cancelled, snooze it, or change it |
crm_create_record | crm:write | Add a record. Refused if the number already exists. |
crm_update_fields | crm:write | Change a record's name, tags or custom fields. Not its stage or assignee. |
crm_tick_stage_check | crm:write | Tick or untick a stage check. Waiving one stays in the dashboard. |
crm_assign_reference_no | crm:write | Give a record its reference number, if it has none |
crm_assign_case_id | crm:write | Older name for crm_assign_reference_no |
crm_set_document_status | crm:write | Mark a required document verified, rejected or missing |
crm_save_form_draft | crm:write + crm:sensitive:read | Save form answers as a draft for a person to check and submit |
crm_save_view | crm:write | Save a filter as one of your own views |
crm_draft_document | crm:write | Start an AI draft of a document from a published template, for a person to review. Nothing is sent. |
crm_move_stage | crm:stage | Move a record to another stage. Its checks must be met. Asks first. |
crm_submit_form | crm:stage + crm:sensitive:read | Submit a form on a record. Asks first. |
crm_attach_document | crm:docs:write | Attach a file to a record. Asks first. |
crm_import_csv | crm:import | Import up to 500 CSV rows: new records, filled-in fields. Shows a preview and asks first. |
crm_create_outside_party_link | crm:share | A personal link for someone outside the team to fill a form or upload files. Asks first. |
"Asks first" means the first call returns a preview and a one-time confirmation; the assistant shows it to you and repeats the call only after you say yes.
What the MCP can't do
- Build or edit a call flow canvas, or attach tools. See workflow editor.
- Connect a chat agent to a channel, or send emails or messages. Email from the CRM is drafts only.
- Place calls or create deployments. Use the dashboard, or the API: see api-calls and api-deployments.
- Delete, merge, enrich or bulk-export records, or override a stage check.
- Read call transcripts or recordings, or file contents.
- Start or manage Finn Operator cases. Use the dashboard.
- Notify the assistant when something happens. For events, use webhooks.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| Every call fails with an auth error | The key was revoked or mistyped. Keys must be finn_mcp_ plus 48 hex characters exactly. Generate a new one. |
| The Finn tools don't appear in Claude | The connector isn't switched on for this chat. Open + → Connectors and turn Finn on. |
| The assistant created a Finn you can't see | It's in the organization of the key's owner. Ask the assistant which account it used, and reload the dashboard. |
| An edit is refused | The Finn isn't a draft. Edit it in the dashboard. |
| The CRM tools don't appear | The key has no crm: scopes. Generate a new key with the scopes you need. |
| Sensitive fields come back redacted | The key doesn't have crm:sensitive:read. |
| A CRM call is refused for an organization | The key is limited to other organizations, or you're not a member of that one. |
| A voice fails on a call | The voice ID was made up. Have the assistant call list_voices and pick one from the list. |
Related
- API authentication: API keys for the REST API, which are separate from MCP keys
- api-finns