Docs overview

The Cassis MCP server

A hosted MCP server that lets AI agents ask business questions against your data, grounded in the ontology. Works with any MCP client: Claude Code, Claude Desktop, Cursor, or a custom agent. Your data team curates the ontology in the web app, users and agents query through the MCP, and both see the same definitions, context, and answers.

Access is limited to selected design partners today. Leave your email at getcassis.com to be notified when it opens up.

Connecting

  1. In your MCP client, open the settings and add a new MCP server.
  2. Paste https://app.getcassis.com/mcp/ as the server URL.
  3. The client opens a browser window for OAuth. Sign in with your Cassis credentials. Done.

The token is stored by the client and refreshed automatically. Expired tokens return 401 and the client re-runs OAuth without user action.

Transport
Streamable HTTP. No stdio mode.
Endpoint
https://app.getcassis.com/mcp/
Auth
OAuth 2.1
Access
Active Cassis account. Design partners only today.

Where to paste the URL

Claude Desktop
Settings → Connectors → Add custom connector.
Claude Code
claude mcp add --transport http cassis https://app.getcassis.com/mcp/, or /mcp inside the CLI.
Cursor
Settings → MCP → Add new MCP server.

Tools

Three tools today. Users type in natural language; the MCP client picks the right tool and calls it under the hood.

Cassis - Test connection

Health check. The client calls this to verify the MCP server is reachable and the token is valid. No user input.

Returns a pong response:

"pong"
Cassis - List projects

Lists the Cassis projects the authenticated user can access. The client calls this to discover which project to query. No user input.

Returns project names and IDs:

projects: id: 019d6555-12bd-757c-bae9-fc826018ad76 name: "Formula 1"
Cassis - Ask

Ask a natural-language question about a project's data, or continue a chat. Cassis translates the question into SQL using the ontology, runs it, and returns the answer plus the SQL and results. For complex or expensive questions, Cassis surfaces a plan first and waits for explicit confirmation before executing.

Parameters

Passed by the client, not typed by the user.

project_id
UUID · required   The Cassis project to query.
question
string · optional   Natural-language question. For follow-ups, can reference earlier messages (now group by circuit). Ignored when execute_pending_plan=true. Defaults to empty string.
chat_id
string · optional   Passed by the client on follow-ups, plan refinement, or plan execution. Omitted to start a new chat.
execute_pending_plan
boolean · optional   Set true to execute the plan surfaced on the previous turn (when status="needs_execution"). Requires chat_id and the user's explicit approval. Defaults to false.

Response shape

chat_id
Always set. The client stores it to continue the chat.
status
"answered", "needs_execution", or "error".
answer
The assistant's text response. Always present.
sql, results, objects_used
Populated when status="answered". Result rows are capped at 100.
plan
Populated when status="needs_execution". The client shows it to the user and waits for approval.
error
Populated when status="error".

Examples

Below is what Cassis returns to the client. Each MCP client (Claude Desktop, Claude Code, Cursor, a custom agent) renders the response in its own chat UI. The user never sees the raw payload.

Example 1: simple question

The user types:

Who won the most races in 2023?

Cassis returns:

status: "answered" answer: "Max Verstappen won 19 out of 22 races in 2023, far ahead of Pérez (2) and Sainz (1)." sql: SELECT d.full_name, COUNT(*) FROM result r JOIN race ra ON r.race_id = ra.race_id JOIN driver d ON r.driver_id = d.driver_id WHERE ra.year = 2023 AND r.position = 1 GROUP BY d.full_name ORDER BY 2 DESC results: 3 rows objects_used: Race Result, Race, Driver
Example 2: plan, then execution
Complex or expensive questions surface a plan first. The client shows the plan to the user, gets explicit approval, then re-calls the tool with execute_pending_plan=true.

The user types:

Compare total points scored by all drivers in 2022 vs 2023, including sprint results.

Cassis returns a plan:

status: "needs_execution" plan: UNION query combining the result and sprint_result tables, grouped by season. Assumptions: · Sprint points included in the total · Points rolled up across all drivers per season Objects: Race, Race Result, Sprint Result

The user approves. The client re-calls the tool with execute_pending_plan=true. Cassis executes and returns:

status: "answered" answer: "In 2023 drivers scored 2,458 points combined, up from 2,350 in 2022. Sprint points are included in both totals." results: 2 rows
Example 3: follow-up in the same chat
The client keeps the chat_id from the previous turn, so users can ask follow-ups naturally.

The user types:

Now break it down by constructor for 2023.

Cassis picks up the conversation and returns:

status: "answered" answer: "Grouped by constructor in 2023: Red Bull Racing 860, Mercedes 409, Ferrari 406, McLaren 302, ..."

Limits and errors

Question timeout
5 minutes. Questions that take longer return an error and close the chat turn.
Result rows
Up to 100 rows returned inline. For larger result sets, narrow the question or ask for aggregates.
Token expiry
Expired tokens return HTTP 401. The client re-runs OAuth automatically; no action needed from the user.
Unreachable project
Querying a project the authenticated user doesn't have access to returns an error.

Want to try Cassis?

Access is limited to selected design partners today. Leave your email to be notified when it opens up.

Stay tuned