MCP Server
DashX ships a Model Context Protocol (MCP) server, so AI agents like Claude Code, Claude Desktop, Cursor, and Codex can talk to your workspace data in natural language - "show me my WhatsApp chats", "summarize unanswered conversations", "how many open issues are there?"
The agent does the reasoning; DashX exposes your data as a set of permission-scoped tools. Every request runs through the same authorization and policy layer as the rest of the API, so an agent only ever sees what its credentials are allowed to see.
The MCP server is in beta. Tools and behavior may change. Connect it to a non-production environment first.
Endpoint
https://api.dashx.com/mcp
Self-hosted? Use your own host with the /mcp path.
Prerequisites
You authenticate with a DashX Public Key and Private Key - the same API key pair used by the Server-Side SDKs. If you don't have one yet, follow Generate API Keys to create a Service Account and a key pair.
Create a dedicated Service Account (per environment) for your MCP connection, with only the permissions it needs. Revoke its key pair to instantly cut off access.
Quick Setup
- Claude Code
- Claude Desktop
- Cursor
Run this once - it registers the server in your current project:
claude mcp add --transport http dashx https://api.dashx.com/mcp \
--header "X-Public-Key: $DASHX_PUBLIC_KEY" \
--header "X-Private-Key: $DASHX_PRIVATE_KEY"
Confirm it connected:
claude mcp list
# dashx: https://api.dashx.com/mcp (HTTP) - ✓ Connected
Add --scope user to make dashx available in every Claude Code session, not just this project.
Claude Desktop speaks stdio, so it connects through the mcp-remote bridge. Edit your config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"dashx": {
"command": "npx",
"args": [
"-y", "mcp-remote@latest", "https://api.dashx.com/mcp",
"--header", "X-Public-Key: YOUR_PUBLIC_KEY",
"--header", "X-Private-Key: YOUR_PRIVATE_KEY"
]
}
}
}
Restart Claude Desktop after saving.
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"dashx": {
"command": "npx",
"args": [
"-y", "mcp-remote@latest", "https://api.dashx.com/mcp",
"--header", "X-Public-Key: YOUR_PUBLIC_KEY",
"--header", "X-Private-Key: YOUR_PRIVATE_KEY"
]
}
}
}
Authentication
The server reads two headers and resolves them to the owning account, exactly like the GraphQL API:
| Header | Value |
|---|---|
X-Public-Key | Your Service Account's public key |
X-Private-Key | Your Service Account's private key |
To target an environment other than the key's own, also send X-Target-Environment with the environment identifier (e.g. staging).
The private key is a secret. When configured in a client it lives in that client's config file - treat it like a password and revoke the key pair if it leaks.
Available Tools
| Tool | Description |
|---|---|
list_conversations | List conversations across channels (chat, WhatsApp, email, SMS, ...), with rich filters. |
list_messages | List individual messages. Pass { "conversationId": "<uuid>" } to read one conversation's transcript. |
list_issues | List issues / tickets. |
list_groups | List groups (teams / queues issues and conversations are assigned to). |
list_environments | List the workspace's environments (resolve environment names/ids). |
list_issue_statuses | List issue statuses (the label/kind for an issue's status). |
list_issue_types | List issue types (resolve issue type ids to names). |
analyze_records | Fast aggregate counts and trends (ClickHouse) over issues, conversations, accounts, or groups - grouped by columns and/or a time bucket (day/week/month). |
The list_* tools return the actual records (real-time, permission-scoped). analyze_records answers "how many / breakdown / trend" questions over large volumes - use it for counts, not for reading content.
Filtering conversations
list_conversations accepts a filter object. Keys are AND-combined; each takes an operator like { "eq": ... } or { "in": [...] }:
| Filter | Example | Notes |
|---|---|---|
channel | { "eq": "CHAT" } | EMAIL, SMS, PUSH, CHAT, IN_APP |
subChannel | { "eq": "WHATSAPP" } | WHATSAPP, SLACK, TELEGRAM, SIGNAL, IOS, ANDROID, WEB, MICROSOFT_TEAMS, DASHX |
isUnanswered | true | Awaiting an internal/agent reply |
assigneeId | { "eq": "<uuid>" } | or "null" for unassigned |
statusKind | { "eq": "<kind>" } | Latest issue status |
The agent constructs these from your request - you rarely write them by hand.
Example Prompts
Once connected, just talk to it in your client - the agent picks the right tools. A base set to start from:
Conversations & chats
- "Show me my WhatsApp chats from this week."
- "How many unanswered conversations do I have right now?"
- "Read conversation
<id>and summarize what the customer needs." - "What are customers complaining about on WhatsApp lately?"
Issues & tickets
- "List my open issues."
- "Which urgent issues are unassigned?"
- "Show me the issues assigned to the Chat Team group."
- "Summarize the high-priority issues created this week."
Trends & breakdowns (analytics)
- "How many conversations per day this month, by channel?"
- "Break down issues by priority."
- "What's the WhatsApp conversation trend since January?"
- "How many new accounts per month this year, by kind?"
Exploring your workspace
- "What environments and groups do we have?"
- "List our issue types and statuses."
Mix and match - "break down this week's WhatsApp issues by status" will list groups/statuses to resolve names, then aggregate. Be specific about the time range and channel for the sharpest answers.
Security & Scoping
- Results are scoped to the account behind the key pair and its policies - an agent sees only what that account is authorized to access.
- Use a separate Service Account per integration/environment so you can grant least privilege and revoke independently.
- All tool calls are read-only.