Four of the six tools spend money, so "which agent may call what" is a real question rather than a theoretical one — and this answers it in configuration, per client, alongside a rate limit. The signing scheme is conventional HMAC over a canonical string with a nonce, but the allowlist is what makes it safe to give a read-only agent a key. There is an open mode; using it removes all of the above at once.
An adapter that sits in front of an existing phone API and exposes its routes as MCP tools, one-to-one, without changing the API itself. What distinguishes it is the auth layer: by default every MCP request must be signed, with a per-client secret, replay protection and a per-client list of which tools that client may call.
- `phone.purchase.start` and `phone.purchase.complete` for acquiring a number
- `phone.renew.start` and `phone.renew.complete` for extending one
- `phone.numbers.list` for the numbers you hold
- `phone.messages.list` for the messages received on a given number
- Per-client tool allowlists, so one agent can list messages while another can also spend money
- Per-client rate limits, set as `rateLimitPerMinute`
- Replay protection with one-time nonces, and timestamp skew bounded by `HMAC_ALLOWED_SKEW_MS`
- An open mode for when you do not want any of that
The phone API it fronts — this is an adapter for your own deployment, not a hosted service. Configure it with a `.env` the server loads at startup: `MCP_AUTH_MODE` set to `hmac` or `open`, and in hmac mode `MCP_CLIENTS_JSON` naming each client with a secret, an allowed-tool list and a rate limit. Signed requests carry `X-Client-Id`, `X-Timestamp`, `X-Nonce`, `X-Body-SHA256` and `X-Signature`. Run `npm install` and `npm run dev`, or `npm run build` and `npm run start` for production; PM2 and Nginx templates are included. Package `phone-mcp-server`, version 1.0.0. Redis is recommended for nonce storage.
