MCP server
Connect Claude, ChatGPT, Cursor or any MCP client to Diced. Find audiences, preview them and Reveal leads from a chat.
The Diced MCP server lets an AI assistant search topics, build audiences, preview them and Reveal leads for you. It speaks streamable HTTP at:
https://api.diced.si/mcpThere are two ways to connect:
- OAuth (Claude.ai, ChatGPT): paste the URL, sign in to Diced, pick a workspace. No key.
- API key (Claude Code, Cursor, Windsurf and most other clients): send
Authorization: Bearer dcd_live_.... Create a key under Developers → API keys.
The assistant spends chips only through reveal_leads, enrich_person and watch_audience
with auto-reveal, and each one needs a max_chips or cap budget. The server tells the model to
never spend chips you didn't approve.
Claude Code
claude mcp add --transport http diced https://api.diced.si/mcp \
--header "Authorization: Bearer dcd_live_your_key"Run claude mcp list to check that diced is connected, then ask for what you need, like "Find
homeowners in Texas shopping for solar panels."
Claude.ai
- Open Settings → Connectors and choose Add custom connector.
- Paste
https://api.diced.si/mcp. - Sign in to Diced and pick the workspace to connect. You don't need a key.
Cursor
Add this to .cursor/mcp.json in your project, or ~/.cursor/mcp.json for every project:
{
"mcpServers": {
"diced": {
"url": "https://api.diced.si/mcp",
"headers": { "Authorization": "Bearer dcd_live_your_key" }
}
}
}Then open Settings → MCP in Cursor and check that diced is on.
ChatGPT
- Open Settings → Connectors (Apps & Connectors) and choose to add a custom connector. On some plans this sits under Advanced → Developer mode.
- Paste
https://api.diced.si/mcpand pick OAuth for authentication. - Sign in to Diced and pick the workspace to connect. You don't need a key.
Other clients
Any client that supports streamable HTTP works. With a key:
{
"type": "streamable-http",
"url": "https://api.diced.si/mcp",
"headers": { "Authorization": "Bearer dcd_live_your_key" }
}Clients that sign in with OAuth only need the URL. The server is stateless: send every
JSON-RPC message as a POST (there is no GET stream and no session to end).
Tools
| Tool | Spends chips | What it does |
|---|---|---|
search_topics | No | Find intent topic ids (tp_...) for a phrase, for b2c or b2b |
describe_audience | No | Plain English to filters, a summary and matched topics. Nothing is built |
build_audience | No | Start a build from filters or a prompt. Returns the id and building |
get_audience | No | Status, count and a free, masked preview page |
reveal_leads | Yes, 1 per new lead | Reveal count leads or exact lead_ids. Requires max_chips |
list_leads | No | Search leads you already revealed |
enrich_person | Yes, 1 on a match | Look up by email, phone, IP, address or MD5. Requires max_chips (1 or more) |
watch_audience | With auto-reveal | Save and re-run every day, week or month. Auto-reveal needs a cap |
get_balance | No | Plan, chip balance and expiry dates |
Input schemas are the same as the REST API, and every tool lists an output schema and
annotations (readOnlyHint, destructiveHint, idempotentHint). Results come back as JSON text
plus structuredContent.
reveal_leads and enrich_person take an optional idempotency_key argument (MCP has no
headers per call). Reuse it when retrying and nothing is charged twice, exactly like the API's
Idempotency-Key.
The intended flow, which the server's instructions describe to the model: describe_audience,
then build_audience, poll get_audience until ready, then reveal_leads with a budget you
agreed to.
Errors
Tool failures, including bad arguments and rate limits, come back as tool results with
isError: true and the same body as the API:
{ "error": { "code": "max_chips_exceeded", "message": "...", "docs_url": "https://docs.diced.si/api/errors#max_chips_exceeded", "request_id": "req_..." } }See Errors for every code. Authentication failures are HTTP 401 (or 403) with
a WWW-Authenticate header that points OAuth clients at the sign-in flow.
Limits
Each MCP request counts against the 120 per minute of the API key it uses, shared with the REST API. A connected OAuth app has its own 120 per minute. See Rate limits.
OAuth details
For client authors. Diced runs its own OAuth 2.1 authorization server:
| Protected resource metadata | https://api.diced.si/.well-known/oauth-protected-resource (also /mcp suffixed) |
| Authorization server metadata | https://api.diced.si/.well-known/oauth-authorization-server |
| Dynamic client registration | POST https://api.diced.si/oauth/register |
| Authorization endpoint | https://app.diced.si/oauth/authorize |
| Token endpoint | POST https://api.diced.si/oauth/token |
| Scope | diced |
| PKCE | Required, S256 only |
| Grants | authorization_code, refresh_token |
| Tokens | Access tokens last 1 hour. Refresh tokens last 30 days and rotate on every use |
The person approving the connection picks the workspace on the consent screen. The connector then acts as that person in that workspace. See and disconnect connected apps in the app under Developers → MCP.