# CodaPhone

> Business texting for AI agents: send texts, read threads, manage contacts and run campaigns.

- name: app.codaphone/mcp
- version: 1.0.0
- connection class: R1 (autonomous)
- trust: 82/100 flags: no-repository
- quality: 79/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/app.codaphone%2Fmcp
- tools: https://api.protogrid.dev/v1/servers/app.codaphone%2Fmcp/tools

**An agent can connect on its own if it already holds `CODAPHONE_TOKEN`.** Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "codaphone": {
      "type": "http",
      "url": "https://mcp.codaphone.app",
      "headers": {
        "Authorization": "Bearer ${CODAPHONE_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${CODAPHONE_TOKEN}`.

## Trust

- hygiene: 80
- liveness: 99
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-99% +updated-18d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 79/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 71 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: search_numbers (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); provision_number (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); send_message (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 1,995 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 14, about 1,995 tokens to load them all
- tool set hash: 2c04be85624e5291de6f78d462d25e52
- badge: [![protogrid quality](https://protogrid.dev/badge/app.codaphone/mcp.svg)](https://protogrid.dev/servers/app.codaphone/mcp)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://mcp.codaphone.app (streamable-http, auth api_key ${CODAPHONE_TOKEN}, reachable true, uptime30d 0.98571426)

## Packages

_none_

## Tools (14)

- `add_contacts`: Add a contact to the account. Provide the phone number (msisdn) and optionally a name, a list_id to file it under, and an opt_in_source note. Adds one contact per call. Requires the 'contacts' scope.
- `create_campaign`: Create a new bulk-messaging campaign with a name and an optional base message. After creating, use run_campaign to generate variations, set the audience, schedule, and launch it. Requires the 'campaigns' scope.
- `get_account`: Get the current CodaPhone account: its name and mode (live/test), the active number (if any), the current plan and its monthly/daily send caps, usage so far, and remaining automation credits. Requires the 'read' scope.
- `get_campaign`: Get one campaign by id, including its base message, audience, schedule, pacing, and send/failed/skipped counts. Requires the 'read' scope.
- `get_message_status`: Get one message by id, including its delivery status, direction, body, segment count, and timestamp. Requires the 'read' scope.
- `get_thread`: Get one conversation thread by id together with its messages. Requires the 'read' scope.
- `list_campaigns`: List the account's bulk-messaging campaigns with their status and progress counts, plus the remaining automation credit balance. Requires the 'read' scope.
- `list_contacts`: List the account's contacts with opt-in status and timezone. Optionally filter by a search term or a list id, choose a sort, and paginate with limit/offset. Requires the 'read' scope.
- `list_threads`: List the account's conversation threads (the inbox), most recent first, with unread counts and last-message previews. Supports limit/offset pagination. Requires the 'read' scope.
- `mark_thread_read`: Mark a conversation thread as read (clears its unread count) and return the account's new total inbox unread count. Requires the 'read' scope.
- `provision_number`: Provision (set up) a phone number for the account from a candidate returned by search_numbers. Provide the exact msisdn in +1XXXXXXXXXX form and the number kind; optional label and business registration details may be included. An account can hold one active number. Requires the 'numbers' scope.
- `run_campaign`: Advance a campaign through its lifecycle. Provide the campaign_id and an action:
  - generate: create message variations (optional base_message, count)
  - variations: save edited variations (variations: [{body, active}])
  - audience: set the recipient list (list_id)
  - schedule: set send time/pacing (schedule_at, pace_seconds, daily_ceiling)
  - launch: start sending (or start at the scheduled time)
  - pause / resume / cancel: control a running campaign
Sends honor opt-outs, sending hours, credits, and plan caps automatically. Requires the 'campaigns' scope.
- `search_numbers`: Search available phone numbers to provision. Optionally filter by country, number kind (local or tollfree), and a 3-digit area code. Returns candidate numbers with a formatted display, city/region, and monthly price. Does not buy anything. Requires the 'numbers' scope.
- `send_message`: Send an SMS from the account's number. Provide the message 'body', and either 'to' (a recipient phone number, with optional 'name' to save the contact) or an existing 'thread_id' to reply within a conversation. Opted-out contacts are blocked and free-send/plan limits apply automatically. Requires the 'send' scope.
