# @cadencercs/mcp

MCP server for [Cadence](https://cadencercs.com) — agent-native RCS messaging with automatic SMS
fallback, as tools your agent can hold.

Your agent speaks first over RCS. If the recipient can't receive it, the message becomes a branded
SMS and you're told. Replies come back typed, with the tapped chip already resolved against the
options you sent.

## Install

```json
{
  "mcpServers": {
    "cadence": {
      "command": "npx",
      "args": ["-y", "@cadencercs/mcp"],
      "env": { "CADENCE_API_KEY": "sk_sandbox_..." }
    }
  }
}
```

Get a key in one call — no account, no sales call:

```bash
curl -X POST https://api.cadencercs.com/v1/signup \
  -H 'content-type: application/json' -d '{"email":"you@example.com"}'
```

A sandbox key simulates delivery end to end. Nothing reaches a phone, `agentId` and `brandId` are
free strings, and `cadence_simulate_reply` lets you drive both sides of a conversation. Build the
whole loop before anything is billable.

## Tools

**Conversations** — `cadence_open_conversation`, `cadence_send`, `cadence_simulate_reply`,
`cadence_get_conversation`, `cadence_get_messages`, `cadence_close_conversation`

**Consent** — `cadence_check_consent`

**Going live** — `cadence_onboarding_status`, `cadence_list_brands`, `cadence_get_brand`,
`cadence_create_brand`, `cadence_update_brand`, `cadence_check_brand_readiness`,
`cadence_create_agent`, `cadence_preview_go_live`, `cadence_launch_readiness`, `cadence_usage`

Start with `cadence_get_started`.

## The irreversible operations

`sync-google`, `request-verification` and `request-launch` are **off by default**. They create an
agent at Google that can never be deleted, permanently freeze a public profile, and lock a
questionnaire that can't be edited after submission.

Turn them on deliberately:

```json
"env": {
  "CADENCE_API_KEY": "sk_live_...",
  "CADENCE_ALLOW_IRREVERSIBLE": "1"
}
```

Two gates, because they guard different things. The environment variable is a decision by whoever
edits this config — a model can't make it for itself. The `confirm: "irreversible"` argument is a
deliberate act at the moment of doing it, which a retry loop won't produce by accident.

Call them **without** `confirm` first. The refusal names exactly what would be created and what
freezes — the same information as `cadence_preview_go_live`, from the door itself.

## Configuration

| Variable | Required | Default |
|---|---|---|
| `CADENCE_API_KEY` | yes | — |
| `CADENCE_API_URL` | no | `https://api.cadencercs.com` |
| `CADENCE_ALLOW_IRREVERSIBLE` | no | off — see above |

## Reference

- Written for agents: <https://cadencercs.com/llms.txt>
- OpenAPI 3.1 with schemas: <https://cadencercs.com/openapi.json>
- TypeScript SDK: [`@cadencercs/sdk`](https://www.npmjs.com/package/@cadencercs/sdk)

MIT licensed. Cadence is a service of Salus, Inc.
