{
  "markdown": "# uni-msg-mcp-server\n\nDrive WhatsApp from Claude, Cursor, or any MCP client — using the same API key\nas the REST API. No separate credential, no OAuth.\n\n## Setup\n\nCreate a key in **Dashboard → API Keys**, then point your client at the hosted\nendpoint. Nothing to install, and it stays current without anyone upgrading a\npackage.\n\n```\nhttps://uni-msg.com/mcp        Authorization: Bearer <key>\nhttps://uni-msg.com/mcp/<key>  for clients that cannot send headers\n```\n\n### Claude Code\n```bash\nclaude mcp add --transport http uni-msg https://uni-msg.com/mcp \\\n  --header \"Authorization: Bearer wsa_your_key\"\n```\n\n### Cursor — `~/.cursor/mcp.json`\n```json\n{ \"mcpServers\": { \"uni-msg\": {\n  \"url\": \"https://uni-msg.com/mcp\",\n  \"headers\": { \"Authorization\": \"Bearer wsa_your_key\" }\n} } }\n```\n\n### Gemini CLI — `~/.gemini/settings.json`\n`httpUrl` selects Streamable HTTP; `url` would mean SSE.\n```json\n{ \"mcpServers\": { \"uni-msg\": {\n  \"httpUrl\": \"https://uni-msg.com/mcp\",\n  \"headers\": { \"Authorization\": \"Bearer wsa_your_key\" }\n} } }\n```\n\n### Claude Desktop\nSettings → Connectors → Add custom connector, URL `https://uni-msg.com/mcp`,\nheader `Authorization: Bearer wsa_your_key`.\n\n### ChatGPT\nDeveloper mode (Settings → Apps → Advanced), then add a connector with URL\n`https://uni-msg.com/mcp/wsa_your_key` and **No authentication**. It is the only\nclient that cannot send a header, which is why the key sits in the path — and\nwhy nginx disables access logging on `/mcp`.\n\n## Running it locally\n\nNot required — the hosted endpoint above needs no install. Use this if you would\nrather the API calls left your own machine.\n\n```json\n{ \"mcpServers\": { \"uni-msg\": {\n  \"command\": \"npx\",\n  \"args\": [\"-y\", \"uni-msg-mcp-server\"],\n  \"env\": { \"UNIMSG_API_KEY\": \"wsa_your_key\" }\n} } }\n```\n\nNeeds Node 20+. ChatGPT cannot use this form — it has no way to run a local\nprocess.\n\n## Pairing a number\n\nThree steps, and the tool descriptions walk the assistant through them:\n\n1. `create_device` with a name and the number in international format\n2. `connect_device` returns an 8-character pairing code\n3. On the phone holding that number: WhatsApp → Settings → Linked devices →\n   Link a device → **Link with phone number instead** → type the code\n\nThe code expires in about two minutes. If it lapses use `request_pairing_code`\nrather than reconnecting — it is cheaper and avoids churning the session. Poll\n`get_device_status` until it reports `connected`.\n\n## Notes\n\n**Sends are immediate and cannot be recalled.** The tool descriptions instruct\nthe assistant to confirm the recipient first, but that is guidance, not a\nguarantee — treat this as you would a shell with production access.\n\nOnly a device whose status is `connected` can deliver. `list_devices` first\nsaves a confusing failure later.\n\nReading message history **is** exposed: `list_conversations` finds the `peer`\nvalue, then `read_thread` returns that thread newest-first with paging.\n\nErrors come back as tool results rather than thrown exceptions, so the model can\nread the reason and correct itself. Anything key-shaped in an error is redacted\nbefore it reaches the model. Diagnostics go to stderr — stdout is the JSON-RPC\nstream and a stray byte there corrupts the protocol.",
  "bytes": 3217,
  "sha": "031f5e389c2c6d110add097fbebc4dfddac184a2cd31e8a9807ea49d6aa47d33",
  "repo_slug": "oneorco/onemsg",
  "fonte": "npm",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_uni_msg_whatsapp_932234b7/readme"
}