@anychat-ai/mcp
v0.85.0
Published
Anychat MCP server — drive your Anychat workspace (agents, playbooks, channels, people, outreach) from Claude Code, Claude Desktop, Cursor, or any MCP host.
Maintainers
Readme
@anychat-ai/mcp
Drive your Anychat workspace from Claude Code, Claude Desktop, Cursor, or any MCP host.
Anychat is the agent framework for business messaging — RCS, WhatsApp, Apple Messages for Business and SMS. This Model Context Protocol server exposes the Anychat public API as tools, so an AI agent can read and change your agents, playbooks, channels, people and outreach with your own API key and your own permissions — nothing it does exceeds what you could do with curl.
Docs: https://docs.anychat.ai/integrations/mcp/ · API reference: https://docs.anychat.ai/reference/agent-api/
Setup
- Create an API key in the Anychat console: Workspace → API keys. Give it only the scopes you want your agent to have (e.g.
agents:write,people:read,messages:read). - Add the server to your host.
Claude Code
claude mcp add anychat --env ANYCHAT_API_KEY=sk-any-... -- npx -y @anychat-ai/mcpClaude Desktop / Cursor / other MCP hosts — add to the mcpServers config:
{
"mcpServers": {
"anychat": {
"command": "npx",
"args": ["-y", "@anychat-ai/mcp"],
"env": { "ANYCHAT_API_KEY": "sk-any-..." }
}
}
}Check the key (prints org, role, scopes):
ANYCHAT_API_KEY=sk-any-... npx -y @anychat-ai/mcp checkEnvironment
| Variable | Required | Default |
| ------------------ | -------- | ------------------------- |
| ANYCHAT_API_KEY | yes | — |
| ANYCHAT_API_URL | no | https://api.anychat.ai |
| ANYCHAT_DOCS_URL | no | https://docs.anychat.ai |
Flags: --profile core|full picks the tool set (default full, see Profiles); --read-only registers only read tools. Subcommands: check, tools, --version, --help.
Tools
205 tools, a 1:1 projection of the Agent API grouped as the reference is (orient → Definition → Capabilities → Channels → People → Outreach → Campaigns → Tests → Personas → Emulator → Activity → Org → Docs). npx -y @anychat-ai/mcp tools prints the live table.
Every tool carries MCP annotations: read tools are readOnlyHint; write tools change configuration; destructive tools (deletes, outreach sends to real people, provisioning requests, imports over an existing agent, secret rotation) are destructiveHint so your host asks before running them.
Profiles
Every tool definition (name, description, input schema) is sent to the model on every call, so a big table has a real per-turn cost. Two profiles trade breadth for weight:
full(default) — all 205 tools.core— 83 tools, the everyday set:whoami; agents (list / get / create / update / export / import, apply template, catalogs); the whole Definition (identity, personality, standing instructions, guardrails, rules, goals, playbooks, message templates,lint_agent); the media library (list / add / update / delete); tool bindings (list / upsert); scheduling config; People field definitions; Things (read); Facts (read / replace); business info (read / replace); channels (list / get / request / bind, early access, launch); people (list / get / update, list segments); Outreach (list / get / create / update, preview an opener, send it to one person) and sending settings; personas (list / create / reset, send a sandbox turn); emulator links (list / create); conversations / messages / logs / activity; org; docs. About half the tokens offull.
Pick one with --profile core on the CLI or createServer({ profile: 'core' }) in code; the Profile column below shows which set each tool belongs to, and npx -y @anychat-ai/mcp tools --profile core lists just that set. Nothing else changes: full stays the default, and the core set only ever grows — a tool leaves it only when the route behind it is retired.
npm run tokens (in a checkout, after npm run build) prints the estimated per-tool token weight — what the model pays for each definition — sorted heaviest first, with totals per profile.
| Tool | Kind | Scope | Profile | Purpose |
| ------------------------------------ | ----------- | ---------------------- | ------- | --------------------------------------------------- |
| whoami | read | (any) | core | Who am I |
| list_agents | read | agents:read | core | List agents |
| get_agent | read | agents:read | core | Get agent |
| create_agent | write | agents:write | core | Create agent |
| update_agent | write | agents:write | core | Update agent |
| delete_agent | destructive | agents:write | full | Delete agent |
| export_agent | read | agents:read | core | Export agent |
| import_agent | destructive | agents:write | core | Import agent document |
| apply_agent_template | destructive | templates:apply | core | Apply agent template |
| get_template_update | read | agents:read | full | Check for a template update |
| preview_template_update | read | agents:read | full | Preview a template update (three-way merge) |
| apply_template_update | destructive | agents:write | full | Apply a template update |
| list_catalog_items | read | catalogs:read | core | List a system catalog |
| get_catalog_item | read | catalogs:read | core | Get a catalog item |
| get_identity | read | agents:read | core | Get agent identity |
| update_identity | write | agents:write | core | Update agent identity |
| get_personality | read | agents:read | core | Get agent personality |
| set_personality | write | agents:write | core | Set agent personality |
| import_personality_template | write | templates:apply | full | Import personality template |
| get_standing_instructions | read | agents:read | core | Get standing instructions |
| set_standing_instructions | write | agents:write | core | Set standing instructions |
| get_guardrails | read | agents:read | core | Get agent guardrails |
| set_guardrails | write | agents:write | core | Set agent guardrails |
| update_guardrails | write | agents:write | full | Update agent guardrails |
| import_guardrail_template | write | templates:apply | full | Import guardrail template |
| get_rules | read | agents:read | core | Get agent rules |
| replace_rules | write | agents:write | core | Replace agent rules |
| list_playbooks | read | agents:read | core | List playbooks |
| get_playbook | read | agents:read | core | Get playbook |
| create_playbook | write | agents:write | core | Create playbook |
| update_playbook | write | agents:write | core | Update playbook |
| delete_playbook | destructive | agents:write | core | Delete playbook |
| set_default_playbook | write | agents:write | core | Set default playbook |
| import_playbook_template | write | templates:apply | full | Import playbook template |
| generate_playbook_flow | write | agents:write | full | Generate a playbook flow (draft) |
| list_message_templates | read | agents:read | core | List Message Templates |
| get_message_template | read | agents:read | core | Get Message Template |
| upsert_message_template | write | agents:write | core | Create or replace Message Template |
| delete_message_template | destructive | agents:write | core | Delete Message Template |
| preview_message_template | read | agents:read | full | Preview Message Template |
| lint_agent | read | agents:read | core | Lint agent definition |
| review_agent | write | agents:write | full | Review agent definition (model) |
| get_agent_review | read | agents:read | full | Get agent review |
| dismiss_review_finding | write | agents:write | full | Dismiss a review finding |
| get_agent_review_quota | read | agents:read | full | Get review quota |
| get_goals | read | agents:read | core | Get agent goals |
| replace_goals | write | agents:write | core | Replace agent goals |
| list_media | read | agents:read | core | List media |
| get_media | read | agents:read | full | Get media item |
| add_media | write | agents:write | core | Add media |
| update_media | write | agents:write | core | Update media |
| replace_media_content | write | agents:write | full | Replace media file |
| describe_media | write | agents:write | full | Regenerate media description |
| delete_media | destructive | agents:write | core | Delete media |
| list_connections | read | agents:read | core | List connected accounts |
| get_connection | read | agents:read | full | Get a connected account |
| delete_connection | destructive | agents:write | full | Disconnect an account |
| list_integrations | read | agents:read | full | List custom integrations |
| get_integration | read | agents:read | full | Get a custom integration |
| upsert_integration | write | agents:write | full | Create or replace a custom integration |
| delete_integration | destructive | agents:write | full | Delete a custom integration |
| get_scheduling_config | read | agents:read | core | Get scheduling config |
| replace_scheduling_config | write | agents:write | core | Replace scheduling config |
| get_notifications_config | read | agents:read | core | Get notifications config |
| replace_notifications_config | write | agents:write | core | Replace notifications config |
| get_people_fields | read | agents:read | core | Get people field definitions |
| replace_people_fields | write | agents:write | core | Replace people field definitions |
| list_outreach_links | read | agents:read | full | List test links |
| create_outreach_link | write | agents:write | full | Create a test link |
| update_outreach_link | write | agents:write | full | Pause or resume a test link |
| delete_outreach_link | destructive | agents:write | full | Delete a test link |
| redeem_outreach_link | write | agents:write | full | Redeem a test link as a persona |
| get_things | read | agents:read | core | Get Things |
| replace_things | write | agents:write | full | Replace Things |
| get_collections | read | agents:read | full | Get collections |
| replace_collections | write | agents:write | full | Replace collections |
| get_facts | read | agents:read | core | Get Facts |
| replace_facts | write | agents:write | core | Replace Facts |
| suggest_fact_paraphrases | write | agents:write | full | Suggest Fact paraphrases |
| get_fact_usage | read | agents:read | full | Get Fact usage |
| get_business_info | read | agents:read | core | Get business info |
| replace_business_info | write | agents:write | core | Replace business info |
| list_knowledge_sources | read | knowledge:read | full | List knowledge Sources |
| get_knowledge_source | read | knowledge:read | full | Get one knowledge Source |
| get_knowledge_source_content | read | knowledge:read | full | Get a knowledge Source content |
| create_knowledge_source | write | knowledge:write | full | Add a knowledge Source |
| delete_knowledge_source | destructive | knowledge:write | full | Delete a knowledge Source |
| refresh_knowledge_source | write | knowledge:write | full | Refresh a knowledge Source |
| convert_knowledge_source_to_facts | write | knowledge:write | full | Convert a knowledge Source to Facts |
| get_automated_outreach_config | read | agents:read | full | Get Automated Outreach config |
| replace_automated_outreach_config | write | agents:write | full | Replace Automated Outreach config |
| list_automated_outreach_runs | read | agents:read | full | List Automated Outreach runs |
| start_automated_outreach_run | destructive | agents:write | full | Run Automated Outreach now |
| list_channels | read | agents:read | core | List channel bindings |
| get_channel | read | agents:read | core | Get a channel binding |
| request_channel | destructive | agents:write | core | Request a managed channel |
| bind_channel | write | agents:write | core | Bind an unmanaged channel (bring your own provider) |
| update_channel | write | agents:write | full | Update a channel binding |
| disable_channel | write | agents:write | full | Disable a channel binding |
| enable_channel | write | agents:write | full | Enable a channel binding |
| test_channel_connection | write | agents:write | core | Test a channel's connection |
| get_channel_early_access | read | agents:read | core | Get a channel's launch state and early-access list |
| set_channel_early_access | write | agents:write | core | Replace a channel's early-access list |
| launch_channel | destructive | agents:write | core | Launch a channel (open it to everyone) |
| delete_channel | destructive | agents:write | full | Delete a channel binding |
| list_people | read | people:read | core | List people |
| get_people_stats | read | people:read | core | Count people |
| get_person | read | people:read | core | Get a person |
| create_person | write | people:write | full | Create a person |
| update_person | write | people:write | core | Update a person |
| delete_person | destructive | people:write | full | Delete a person |
| merge_people | write | people:write | full | Merge two people |
| export_people | read | people:export | full | Export people (bulk) |
| import_people | write | people:write | full | Import people |
| send_outreach_follow_up | destructive | people:write | full | Send an outreach follow-up to a person |
| list_outreach_sends | read | people:read | full | List outreach sends |
| get_outreach_send | read | people:read | full | Get one outreach send |
| list_person_appointments | read | people:read | full | List a person's appointments |
| list_appointments | read | people:read | full | List appointments (all people) |
| list_segments | read | people:read | core | List people segments |
| get_segment | read | people:read | full | Get a people segment |
| create_segment | write | people:write | full | Create a people segment |
| update_segment | write | people:write | full | Replace a people segment |
| delete_segment | destructive | people:write | full | Delete a people segment |
| list_outreach | read | agents:read | core | List Outreaches |
| create_outreach | write | agents:write | core | Create an Outreach |
| get_outreach | read | agents:read | core | Get an Outreach |
| update_outreach | write | agents:write | core | Update an Outreach |
| delete_outreach | destructive | agents:write | full | Delete an Outreach |
| preview_outreach | read | agents:read | core | Preview an Outreach's opener |
| send_outreach | destructive | people:write | core | Send an Outreach to one person |
| cancel_outreach_send | write | people:write | full | Cancel a queued outreach send |
| get_sending_settings | read | agents:read | core | Get sending settings |
| update_sending_settings | write | agents:write | core | Update sending settings |
| create_campaign | write | agents:write | full | Create campaign |
| list_campaigns | read | agents:read | full | List campaigns |
| get_campaign | read | agents:read | full | Get campaign |
| update_campaign | write | agents:write | full | Update campaign |
| delete_campaign | write | agents:write | full | Delete campaign |
| stage_campaign | write | agents:write | full | Stage campaign |
| list_campaign_recipients | read | agents:read | full | List campaign recipients |
| start_campaign | destructive | agents:write | full | Start campaign |
| pause_campaign | write | agents:write | full | Pause campaign |
| resume_campaign | write | agents:write | full | Resume campaign |
| cancel_campaign | destructive | agents:write | full | Cancel campaign |
| get_campaign_report | read | agents:read | full | Get campaign report |
| preview_campaign_message | read | agents:read | full | Preview campaign message |
| list_test_suites | read | agents:read | full | List test suites |
| get_test_suite | read | agents:read | full | Get test suite |
| create_test_suite | write | agents:write | full | Create test suite |
| update_test_suite | write | agents:write | full | Update test suite |
| delete_test_suite | destructive | agents:write | full | Delete test suite |
| list_test_cases | read | agents:read | full | List test cases |
| get_test_case | read | agents:read | full | Get test case |
| create_test_case | write | agents:write | full | Create test case |
| update_test_case | write | agents:write | full | Update test case |
| delete_test_case | destructive | agents:write | full | Delete test case |
| generate_test_cases | write | agents:write | full | Generate test cases |
| compile_test_case | write | agents:write | full | Compile test case |
| preview_test_case | read | agents:read | full | Preview test case |
| run_tests | write | agents:write | full | Start test run |
| pause_test_run | write | agents:write | full | Pause test run |
| resume_test_run | write | agents:write | full | Resume test run |
| cancel_test_run | write | agents:write | full | Cancel test run |
| pin_test_run | write | agents:write | full | Pin or unpin test run |
| list_test_runs | read | agents:read | full | List test runs |
| get_test_run | read | agents:read | full | Get test run |
| list_test_results | read | agents:read | full | List test results |
| get_test_result | read | agents:read | full | Get test result |
| copy_test_case | write | agents:write | full | Copy test case to a suite |
| create_test_case_from_conversation | write | agents:write | full | Make a Test from a conversation |
| get_test_pass_rates | read | agents:read | full | Get Playbook pass rates |
| get_test_quota | read | agents:read | full | Get test quota |
| get_test_case_history | read | agents:read | full | Get test case history |
| list_personas | read | agents:read | core | List personas |
| get_persona | read | agents:read | full | Get persona |
| create_persona | write | agents:write | core | Create persona |
| update_persona | write | agents:write | full | Update persona |
| reset_persona | write | agents:write | core | Reset persona |
| delete_persona | destructive | agents:write | full | Delete persona |
| create_persona_from_conversation | write | agents:write | full | Create persona from a conversation |
| send_sandbox_turn | write | agents:read | core | Send a sandbox turn |
| get_sandbox_inbox | read | agents:read | full | Read what the agent sent a persona |
| list_emulator_links | read | agents:read | core | List standalone emulator links |
| create_emulator_link | destructive | agents:write | core | Create a standalone emulator link |
| revoke_emulator_link | destructive | agents:write | full | Revoke a standalone emulator link |
| create_emulator_grant | destructive | agents:read | full | Open the emulator now (short-lived grant) |
| list_messages | read | messages:read | core | List messages |
| list_sessions | read | messages:read | core | List sessions |
| list_users | read | messages:read | full | List users |
| list_logs | read | messages:read | core | List runtime logs |
| list_turns | read | messages:read | full | List turn traces |
| list_activity | read | messages:read | core | List activity feed |
| get_org | read | (any) | core | Get org |
| update_org | write | org:admin | full | Update org |
| list_api_keys | read | org:admin | full | List API keys |
| get_api_key | read | org:admin | full | Get API key |
| list_webhooks | read | webhooks:manage | full | List webhooks |
| get_webhook | read | webhooks:manage | full | Get webhook |
| create_webhook | write | webhooks:manage | full | Create webhook |
| update_webhook | write | webhooks:manage | full | Update webhook |
| delete_webhook | destructive | webhooks:manage | full | Delete webhook |
| rotate_webhook_secret | destructive | webhooks:manage | full | Rotate webhook signing secret |
| search_docs | read | (none — public docs) | core | Search Anychat docs |
| list_docs | read | (none — public docs) | core | List Anychat docs pages |
| read_doc | read | (none — public docs) | core | Read an Anychat docs page |
Contract drift check
The tool table is a 1:1 projection of the Agent API reference, so a route added to the reference without a matching tool is drift. npm run drift (after npm run build) fetches the live reference, parses its | Method | Path | route tables, reads the route each tool declares in its description (Maps to GET /v1/…), and reports:
- Missing — documented routes with no tool. Fails (exit 1) unless the route has a reasoned entry in
drift-allowlist.json. - Undocumented — tool routes the reference doesn't list. Warning only.
- Stale allowlist — entries that no longer match anything. Warning from the script; the test suite fails on them.
--file <path> checks a local copy of the reference, --json prints the report as JSON. The nightly workflow runs it against docs.anychat.ai and opens (or refreshes) an issue titled "Contract drift: documented /v1 routes without MCP tools" when it fails.
Programmatic use
import { AnychatClient, createServer } from '@anychat-ai/mcp';
const client = new AnychatClient({ apiKey: process.env.ANYCHAT_API_KEY! });
const server = createServer({ client }); // an McpServer — attach any transport
// createServer({ client, profile: 'core' }) registers only the core tool setSecurity
- The server holds no credentials of its own; every request carries the key you gave it, and the Anychat API enforces the key's org, role and scopes exactly as it would for you.
- Treat tool results as data: they contain your agents' configuration and your customers' records.
- Requests are tagged
X-Anychat-Agent: mcpso they can be told apart in your access logs.
License
MIT © Redirect Ventures Inc.
