Model Context Protocol · AI agents

Give your AI agent
a phone line.

The IVR Solutions MCP server lets Claude, Cursor or any AI bot place calls, mask numbers, manage agents and run your whole telephony account — over a single hosted endpoint, using your own API key. Every REST endpoint becomes a tool the model can call.

Overview

MCP (Model Context Protocol) is the open standard for connecting AI assistants to external tools. Our MCP server wraps the IVR Solutions REST API so that an AI agent can operate your telephony in plain language — no glue code.

  • Hosted & remote — one HTTPS endpoint. Nothing to install or run.
  • Bring your own key — the agent authenticates with your existing API token; we store no credentials.
  • Full API as tools — all 103 visible endpoints are exposed as callable tools, generated from the same OpenAPI specs as the REST reference and always in sync.
  • Works everywhere — Claude Desktop, Claude in the API, Cursor, VS Code (Continue), and any MCP-compatible client.

Endpoints

Two MCP endpoints, matching the two API products. Authenticate each with the matching token.

Voice · Client API
https://mcp.ivrsolutions.in/mcp
55 tools

Click-to-call, number masking, auto-dialer, agents, DIDs, call logs and more. Use your IVR Solutions API token.

Partner API
https://mcp.ivrsolutions.in/mcp/partner
48 tools

Onboard and manage end-clients: registration, KYC, provisioning, wallet and credits. Use your partner API key.

Transport is Streamable HTTP (JSON-RPC 2.0 over HTTPS POST). A GET /health on the server returns the live tool counts.

Get your API key

The MCP server uses the same token as the REST API. To get it:

  1. Sign in to IVR Solutions.
  2. Open Settings → API token (or Integrations → API documentation).
  3. Copy the token — you'll send it as a Bearer credential below.
!
Treat your token like a password. It can place real calls and spend account credits. Never commit it to a repo or paste it into client-side code. Rotate it from the dashboard if it leaks.

3 stepsQuick start

Connect in under a minute with Claude Desktop or Cursor.

1 · Add the server to your MCP config

claude_desktop_config.json  /  .cursor/mcp.json
{
  "mcpServers": {
    "ivr": {
      "url": "https://mcp.ivrsolutions.in/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_IVR_API_KEY"
      }
    }
  }
}

2 · Restart the client

Claude Desktop / Cursor reads the config on launch. After restarting, the ivr tools appear in the tool list (the 🔌 / hammer icon).

3 · Ask it to do something

Type a natural request — the model picks the right tool and fills in the parameters. See Using it for examples.

i
Partner / reseller? Use https://mcp.ivrsolutions.in/mcp/partner with your partner key instead.

Connect a client

The server speaks standard remote MCP, so any compliant client works. Pick yours:

Edit claude_desktop_config.json (Settings → Developer → Edit Config) and add the ivr server, then restart Claude Desktop.

claude_desktop_config.json
{ "mcpServers": { "ivr": {
  "url": "https://mcp.ivrsolutions.in/mcp",
  "headers": { "Authorization": "Bearer YOUR_IVR_API_KEY" }
} } }

Create .cursor/mcp.json in your project (or the global config via Settings → MCP). Same shape as Claude Desktop.

.cursor/mcp.json
{ "mcpServers": { "ivr": {
  "url": "https://mcp.ivrsolutions.in/mcp",
  "headers": { "Authorization": "Bearer YOUR_IVR_API_KEY" }
} } }

From the Claude API, attach the server as an mcp_servers connector. The model can then call IVR tools during the turn.

messages request — mcp_servers
"mcp_servers": [{
  "type": "url",
  "url": "https://mcp.ivrsolutions.in/mcp",
  "name": "ivr",
  "authorization_token": "YOUR_IVR_API_KEY"
}]

Send the beta header anthropic-beta: mcp-client-2025-04-04 as required by the MCP connector.

In VS Code with the Continue extension (or any MCP-enabled extension), add the server under mcpServers in the extension config — identical JSON to Claude Desktop.

~/.continue/config.json
"mcpServers": [{
  "name": "ivr",
  "url": "https://mcp.ivrsolutions.in/mcp",
  "requestOptions": { "headers": { "Authorization": "Bearer YOUR_IVR_API_KEY" } }
}]

Any client that can POST JSON-RPC over HTTP works. Point it at the endpoint, set the bearer header, and send an Accept header that allows both JSON and SSE. See Protocol & raw calls for full request examples.

Authentication — what to send

Every request carries your API token as a Bearer header. The server validates it by forwarding to the REST API as you — it holds no keys of its own and stores nothing.

request header on every call
Authorization: Bearer YOUR_IVR_API_KEY
  • Voice endpoint /mcp → your IVR Solutions API token.
  • Partner endpoint /mcp/partner → your partner API key.
  • A missing or malformed token returns a JSON-RPC error with HTTP 401.

You act with exactly the permissions of that token — the agent can never do more than you could via the REST API.

Using it

Once connected, just talk to your assistant. It reads each tool's description (carried over from the API docs, including the How it works / Use it for notes) and chooses the right one. Examples:

Voice / Client API

Call +91 98765 43210 from my agent on extension 2101.→ clickToCallGet / clickToCallPost
Connect the buyer and seller privately over my DID — mask both numbers.→ clickConnect
Start an outbound dialer campaign for this list of numbers.→ dialer tools
Pull today's call logs and summarise the missed calls.→ getCallLogs

Partner API

Onboard a client called Acme Corp, email ops@acme.com, mobile 9876543210.→ partner_register
Buy a Mumbai DID and assign it to that client, then add an agent.→ partner_buy_did → partner_add_agent
Run KYC for the new client — PAN then Aadhaar OTP.→ partner_verify_pan → partner_aadhar_otp
Top up 500 credits for client #1234 and extend their validity.→ partner_add_client_credits
i
The model asks for any missing details (a DID, an extension, a phone number) before it calls a tool. You stay in control — most clients show a confirmation before a tool runs.

Protocol & raw calls

The server implements MCP over Streamable HTTP. If you're building a custom client, here is the full exchange with curl. Note the Accept header must list both application/json and text/event-stream.

1 · Initialize

POST /mcp
curl -X POST https://mcp.ivrsolutions.in/mcp \
  -H "Authorization: Bearer YOUR_IVR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize",
       "params":{"protocolVersion":"2025-03-26","capabilities":{},
                 "clientInfo":{"name":"my-app","version":"1.0"}}}'

2 · List tools

POST /mcp
curl -X POST https://mcp.ivrsolutions.in/mcp \
  -H "Authorization: Bearer YOUR_IVR_API_KEY" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'

3 · Call a tool

POST /mcp — place a masked call
curl -X POST https://mcp.ivrsolutions.in/mcp \
  -H "Authorization: Bearer YOUR_IVR_API_KEY" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
       "params":{"name":"clickConnect",
                 "arguments":{"first_phone":"+919876543210",
                              "second_phone":"+919123456789",
                              "did":"+911143104567"}}}'

The server forwards the call to https://api.ivrsolutions.in/api/click_connect with your token and returns the JSON response in the tool result.

103Tool catalogue

Every visible endpoint is a tool. The tool name is the operation's operationId; its input is the endpoint's parameters and body, flattened into one object (auth is injected automatically). Switch API and search:

Click to Call 4

GET clickToCallGet /api/c2c_get Click To Call (GET)
POST clickToCallPost /api/c2c_post Click To Call (POST)
POST c2c_advance /api/c2c_advance Click To Call (advanced)
POST v1_click_to_call_record /v1/click_to_call_record Click-to-call recordings

Number Masking 3

POST clickConnect /api/click_connect Start a masked call (Click-Connect)
POST click_connect_update /api/click_connect_update Manage a masked-call session
POST click_connect_logs /api/click_connect_logs Masked-call logs

Auto Dialer 13

GET getCallFlows /api/get_callflow Get Call Flows
POST dialByFlow /api/dial_by_flow Dial and Play Flow ID
POST dialByText /api/dial_by_text Dial and Play Text
GET getDialersList /api/get_dialers_list Get Auto Dialer List
POST addToDialer /api/add_to_ivrdialer Add Number to Dialer
POST addToDialerBulk /api/add_to_ivrdialerbulk Add Numbers to Dialer (Bulk)
POST changeDialerStatus /api/change_dialer_status Change Dialer Status
GET getCustomerLists /api/customerlist Get Customer Lists
POST createCustomerList /api/create_customerlist Create Customer List
POST createTextDialer /api/create_text_dialer Create Text Dialer
POST editTextDialer /api/edit_text_dialer Edit Text Dialer
POST add_to_dialer /api/add_to_dialer Add records to dialer (bulk)
POST v1_dial_by_flow_get /v1/dial_by_flow_get Dial by flow (query style)

Agents 8

POST enableDisableUsers /api/enable_disable_users Activate / Deactivate Agents
POST addAgent /ivrappv2/addagent Add Agent
POST updateAgentDid /ivrappv2/update_agent_did Update Agent DID
GET get_agents /api/get_agents List agents
POST get_extension /api/get_extension List extensions
POST get_extension_details /api/get_extension_details Get extension details
POST deactivate_group_user /api/deactivate_group_user Deactivate extension user
POST add_group_user /api/add_group_user Add group user / extension

Call Logs 9

POST getCallLogs /api/call_logs Get Call Logs
GET getCallLogByNumber /api/calllog_by_number Get Call Logs by Number
POST getC2CLogs /api/click_to_call_log Get Click-to-Call Logs
GET getC2CLogByNumber /api/c2clog_by_number Get Click-to-Call Logs by Number
POST getDialerLogs /api/dialer_logs Get Dialer Logs
GET getCallStatus /api/get_call_status Get Call Status Options
POST updateCallNote /api/update_call_note Update Call Remark
POST v1_all_call_logs /v1/all_call_logs Fetch all call logs (incremental)
POST v1_add_note /v1/add_note Add a note to a call

DID 6

POST getLinkedDids /ivrappv2/get_dids Get Linked DIDs
GET getDidRegions /ivrappv2/get_did_region Get DID Regions
POST searchDids /ivrappv2/search_dids Search Available DIDs
POST buyDid /ivrappv2/buy_did Buy DID
POST get_dids /api/get_dids List linked DIDs
POST get_available_dids /api/get_available_dids Search available DIDs

Voice Bots 5

POST get_voicebot /api/get_voicebot List voice bots
POST dial_by_aivoicebot /api/dial_by_aivoicebot Dial by AI voice bot
POST dial_by_voicebot /api/dial_by_voicebot Dial by voice bot
POST v1_get_voicebots /v1/get_voicebots List voice bots
POST v1_get_voicebot_data /v1/get_voicebot_data Get voice bot data

Text Templates 3

POST create_text_template /api/create_text_template Create text template
POST check_text_template_status /api/check_text_template_status Check text template status
GET get_text_template_list /api/get_text_template_list List text templates

Contacts 3

POST add_contact /api/add_contact Add contact
GET get_variables /api/get_variables List call/template variables
POST v1_Caller_info /v1/Caller_info Look up caller info

Webhooks 1

POST add_webhook_url /api/add_webhook_url Register webhook URL

Local (stdio) mode

Prefer to run it yourself — for testing, air-gapped setups, or to plug directly into Claude Desktop without the hosted endpoint? The same server ships a stdio entry point.

run locally
# build once
npm install && npm run build

# run over stdio with your key
IVR_API_KEY=your_token IVR_API=voice node dist/local.js

Then point Claude Desktop at the command:

claude_desktop_config.json — local
{ "mcpServers": { "ivr": {
  "command": "node",
  "args": ["/path/to/dist/local.js"],
  "env": { "IVR_API_KEY": "your_token", "IVR_API": "voice" }
} } }

Security & scoping

  • No stored credentials. Your token lives only in the request that carries it; the server holds nothing.
  • Token-scoped. The agent can only do what your token permits on the REST API — nothing more.
  • The full API is exposed, including actions that spend money (buying DIDs, adding credits) or change config (agents, flows). For unattended/autonomous bots, consider a token with limited scope, and keep human-in-the-loop confirmation on in your client.
  • Hide sensitive endpoints from agents by marking them x-internal: true in the OpenAPI spec — the MCP server skips them, just like the docs.
  • TLS only. Remote MCP runs exclusively over HTTPS.

Troubleshooting

The tools don't show up in my client

Fully restart the client after editing its config (most read MCP config only at launch). Confirm the JSON is valid and the url has no trailing slash.

Every call returns "Token Invalid" / 401

The bearer token is wrong, expired, or you're using a voice token on /mcp/partner (or vice-versa). Re-copy it from Settings → API token.

"Not Acceptable" / 406 from a custom client

Your Accept header must include both application/json and text/event-stream.

A tool exists in the docs but not as a tool

It's likely marked x-internal (hidden on purpose). Hidden endpoints are excluded from the MCP surface.

i
Still stuck, or want a tailored tool surface for your use case? Email support@ivrsolutions.in — every API here is fully customizable.