Developer Docs

MCP Server

Connect Claude, Cursor, or any MCP client to Chat33. Post, pull analytics, and build DM flows with natural language.

https://chat33.io/api/mcp/mcp
MCP spec

What it is

Chat33 runs a remote Model Context Protocol server (Streamable HTTP transport) at https://chat33.io/api/mcp/mcp. Every tool is a thin wrapper around the same v1 REST API that powers the n8n node and your own integrations, so anything an MCP client can do, it does with your real connected accounts, posts, and flows. No separate credentials or sandbox: it authenticates with the same sk_live_... API key from Settings → API Keys.

1. Connect from Claude Code

Create an API key in Settings → API Keys (default scopes cover everything: accounts:read, posts:read, posts:write, media:write, flows:read, flows:write), then register the server:

bash
claude mcp add --transport http chat33 https://chat33.io/api/mcp/mcp --header "x-api-key: sk_live_..."

Run claude mcp list to confirm it connected, then just ask, and Claude Code will call the right tools.

2. Connect from claude.ai (or another client)

  1. Go to Settings → Connectors → Add custom connector.
  2. URL: https://chat33.io/api/mcp/mcp
  3. Add a custom header x-api-key with your Chat33 API key.

Note: claude.ai custom connectors are evolving quickly, so use this with clients that support custom headers on remote MCP connections. Cursor, Windsurf, and other MCP-compatible tools work the same way: point them at the URL above with an x-api-key (or Authorization: Bearer sk_live_...) header.

3. Tools

ToolDescription
list_accountsList connected social accounts (channels), optionally filtered by platform
create_postCreate and queue (or schedule) a post across one or more connected accounts
validate_postDry run a post: checks media & platform compatibility without publishing
list_postsList posts, filterable by status, platform, or channel; paginated
get_postGet a single post by ID, including its live status and engagement stats
delete_postCancel a queued or scheduled post before it publishes
get_post_logsGet delivery/publish log entries for a post, for debugging failures
upload_mediaIngest a media file from a public https URL, returns a hosted URL to post with
create_upload_urlGet a presigned URL to PUT a local file to, for files with no public URL, or over 4.5MB
get_analyticsAggregate engagement analytics (views, likes, comments, shares) across published posts
list_flowsList all DM-automation flows, newest-updated first, with triggers and status
get_flowGet a single flow by ID, including its full node/edge graph and synced triggers
create_flowCreate a DM-automation flow (trigger + action node graph) in DRAFT status
set_flow_statusChange a flow's status: ACTIVE, PAUSED, ARCHIVED, or DRAFT

Flow authoring is guided in-tool: create_flow's description carries the full node/edge schema (18 node types, trigger types, worked examples), so a client can compose a valid flow from a plain-English request without a separate schema lookup. New flows are created DRAFT, call set_flow_status with ACTIVE to turn them on.

Auth & scopes

Requests authenticate with the same header the REST API and n8n node use: x-api-key: sk_live_... (an Authorization: Bearer sk_live_... header also works). Each tool call is authorized against the key's scopes, same as the equivalent REST endpoint: posts:write for create_post, flows:write for create_flow/set_flow_status, and so on.

Example prompts

"Post this video to my TikTok as private"

"Share this article on LinkedIn, connections only"

"How did my last 10 TikTok posts perform?"

"Create a flow that DMs everyone who comments SKILL on my latest reel"

Troubleshooting

401 Unauthorized: the API key is missing, invalid, or wasn't sent as a header at all. Re-check the connector config or the --header flag.

403 Insufficient scope: the key is missing a scope the tool needs. Flow tools in particular need flows:read/flows:write: keys created before flows shipped won't have them, so create a new key, or add the scopes to the existing one in Settings → API Keys.

Tool call fails with a platform error: run validate_post first; it surfaces missing media, unsupported formats, and channel mismatches without publishing anything.