MCP server
Build from your editor.
One server URL. Everything the dashboard does, Claude, ChatGPT or Cursor can do: agents, tables, workflows, credentials, swarm tests, demos. The dashboard is optional.
claude ~ anyreachbuild 0%
Build an order-status agent for hearthandflame.com. Sync Shopify orders into a table, add a refund workflow with approval over $500, deploy to phone, chat and email, run 20 swarm calls with different personas and show me what failed.
credentials.create shopify · oauth2 · refresher template
tables.create orders · 10,412 rows · embeddings synced
workflows.create refund · 6 steps · approval gate > $500
agents.create order-status v1 · phone + chat + email
ivr_swarm.run 20 personas · goals · against +1 415 ··· 0142
18 pass · 2 fail · refund over $500 skipped approval
swarm 07 · "refund the oven" · $612 · approval step never reached
workflows.update refund v2 · approval before shopify.refund
ivr_swarm.run 20 / 20 goals met
agents.publish v2 · +1 415 555 0142 · widget · support@hearthandflame.com
›
Settings → Connectors → Add custom connector URL: https://api.anyreach.ai/mcp → sign in with your Anyreach account. No client ID, no secret.
// .cursor/mcp.json (Cursor needs the published client ID)
{ "mcpServers": {
"anyreach": { "url": "https://api.anyreach.ai/mcp",
"clientId": "see docs.anyreach.ai/mcp" }
} }
Any client that supports remote servers + Client ID Metadata Documents connects with the URL alone: https://api.anyreach.ai/mcp
OAuth or API key, scoped per org. Everything the dashboard does, the server does. Including the parts you'd rather script.
What the server exposes.
Grouped by entity. The assistant finds the operation with search_tools and runs it with call_tool, with your permissions, across every org you belong to. File uploads are the one thing that stays in the dashboard.
Agents
- agents.create · update · clone
- agents.versions · compare · publish
- agents.from_website
- agents.improve · audit instructions
- agents.capability_doc
Tables
- tables.create · schema · replace
- tables.upsert · delete rows
- tables.search vector + filters
- tables.query · saved queries
- tables.sync view · embeddings
Workflows
- workflows.create · versions · publish
- workflows.triggers · test mode
- workflows.run · run_async
- workflows.preview code · http step
- actions.list · test
Credentials
- credentials.create · update
- credentials.secret set · delete
- credentials.refresh
- referenced as $credential(name)
Quality
- metrics.create · lint · preview
- evaluations.run · agreement
- calibration.sets · golden labels
- ivr_swarm.run personas · goals
Telephony
- numbers.search · purchase · attach
- trunks.create · SIP deploy
- routing.inbound
- handoff.connections · test
Channels
- widgets.create · presets · auto-brand
- experiments.start · results
- email.domains · addresses
- conversations.dial · message · events
Demos & campaigns
- demos.create · batch
- demos.run IVR leg · agent leg
- campaigns.create · contacts · start
- dashboard.brief · live
Three sessions, verbatim.
What a developer types, what comes back. No dashboard opened.
buildclaude
Make a returns agent for the Shopify store. Per-SKU return windows live in the policy table. Email + chat only.
tables.get policy · 412 rows · window_days per sku
workflows.create rma · 5 steps · label via shippo
agents.create returns v1 · chat + email · tools: tables.get, workflows.run:rma
agents.publish v1 · returns@store.com · widget
swarmcursor
Run a 30-call swarm against returns v1 on +1 415 ··· 0142. Personas: angry, confused, off-topic. Goals: get a refund, change address. Show failures only.
ivr_swarm.run 30 · 3 personas · 2 goals · phone
27 goals met · 3 missed
call 04 · angry · refund promised for a 48-day-old order · window is 30
call 19 · off-topic · agent answered a pricing question it shouldn't
call 22 · confused · asked for order number twice
agents.improve v2 draft · 3 instruction edits proposed
migrateclaude
Here is my Vapi assistant export (pasted). Build the same agent here, keep the ElevenLabs voice, attach my number.
agents.create support v1 · 14 tools mapped · 2 squads → 1 agent
credentials.create elevenlabs · voice Rachel · kept
numbers.attach +1 415 ··· 0142 → support v1
diff 3 tools mapped to tables.search · 1 webhook → workflow
agents.publish support v1 · cutover at 02:00 local
Without MCP: three requests.
REST, an org API key, no SDK to install. The number is real; the agent answers.
1create the agent
POST https://api.anyreach.ai/core/agents
Authorization: Bearer ak_… · body: name, instructions, model, voice, tools
201 · agent_01k7 · version 1 · draft
POST /core/agents/agent_01k7/versions/1/publish
published
2attach a channel
POST /core/phone-numbers { "area_code": "415" }
+1 415 555 0142
PATCH /core/phone-numbers/+14155550142 { "agent_id": "agent_01k7" }
or the web widget: one script tag from the dashboard
3call it
dial +1 415 555 0142, or:
POST /core/conversations/dial { "agent_id": "agent_01k7", "to": "+1650…0199" }
GET /core/conversations/{id}/events
call.ended · 48s · transcript · recording