@sendmsg/mcp-client
v0.1.2
Published
stdio ↔ HTTP bridge for the Sendmsg.io MCP server. Use this from Claude Desktop, Cursor, Windsurf, or any other MCP client that only speaks stdio.
Maintainers
Readme
@sendmsg/mcp-client
stdio ↔ HTTPS bridge for sendmsg.io's Model Context
Protocol server. Use this from Claude Desktop, Cursor, Windsurf, or any
other MCP client that only speaks stdio while our server speaks Streamable
HTTP at https://mcp.sendmsg.io/mcp.
Install
One-time global install (gives you the sendmsg-mcp command on your
PATH). Requires Node.js 18+.
npm install -g @sendmsg/mcp-client
sendmsg-mcp --versionRe-run npm install -g @sendmsg/mcp-client later to upgrade.
Why not
npx? It works on most setups but on some Node + shell combinations the temporarynpx-installed.bin/directory is not visible to the spawned subprocess, producingsh: sendmsg-mcp: command not found. The global install always works, and the resultingsendmsg-mcpcommand lives at a stable path that every MCP client can invoke.
Setup
- Mint a Personal Access Token at https://console.sendmsg.io/mcp/personal-access-tokens.
- Drop the snippet below into your MCP client config:
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"sendmsg": {
"command": "sendmsg-mcp",
"env": {
"SENDMSG_MCP_TOKEN": "pat_xxxxxxxx"
}
}
}
}Cursor
~/.cursor/mcp.json:
{
"mcpServers": {
"sendmsg": {
"command": "sendmsg-mcp",
"env": {
"SENDMSG_MCP_TOKEN": "pat_xxxxxxxx"
}
}
}
}Windsurf
~/.windsurf/mcp_config.json — same shape as the Cursor config above.
Environment
| Variable | Required | Default | Notes |
|---|---|---|---|
| SENDMSG_MCP_TOKEN | yes | — | Personal Access Token from the console |
| SENDMSG_MCP_URL | no | https://mcp.sendmsg.io/mcp | Override only for self-hosted / staging |
What it does
- Reads newline-delimited JSON-RPC frames from
stdin. - POSTs each frame to
SENDMSG_MCP_URLwithAuthorization: Bearer <PAT>. - Forwards the response (whether
application/jsonortext/event-stream) back tostdoutas newline-delimited JSON. - Tracks the
mcp-session-idheader so subsequent requests join the same server-side session (FastMCP'sStreamableHTTPSessionManagerneeds this). - Surfaces
401/403with an actionable hint instead of just exiting.
Stderr is reserved for log messages; stdout is reserved for JSON-RPC frames so the upstream client can parse them.
Permissions
Your token inherits whatever your console account can do — exactly. A
read_only user gets read scopes; a domain_admin is limited to their
allowed_domains; a super_admin can do everything. Bottom line: the
bridge cannot escalate; the MCP server enforces every check per call.
Troubleshooting
| Symptom | Cause / fix |
|---|---|
| 401 Unauthorized on first call | PAT invalid / revoked. Re-mint at https://console.sendmsg.io/account/mcp/tokens |
| 403 Forbidden on send | Your account is in read_only mode or the recipient's domain is outside your allowed_domains |
| network error talking to https://mcp.sendmsg.io/mcp | Check that the host is reachable: curl -i https://mcp.sendmsg.io/health |
| Client hangs on first request | Some clients only flush one frame per stdin chunk — try restarting the MCP client |
License
MIT
