Skip to content
Docs overview

MCP reference

The tools the Cassis MCP server exposes to analytics agents. Three tools today. Users type in natural language; the MCP client picks the right tool and calls it under the hood. To connect a client, see Connect MCP clients.

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

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

Returns a status response:

status: "ok" server: "cassis"
list_projects

Lists the Cassis projects in the authenticated user's organization. The client calls this to discover which project to query. No user input.

Returns each project's ID, name, and whether a data source is connected:

projects: id: 019d6555-12bd-757c-bae9-fc826018ad76 name: "Formula 1" has_data_source: true
ask_question

Ask a natural-language question about a project's data, or continue a chat. Cassis grounds the question against the ontology, plans the answer, and generates the SQL. When the plan has a genuine fork (an assumption you could resolve differently), it surfaces the plan first and waits for explicit confirmation before executing.

What comes back depends on the project's mode. Connected to the warehouse, Cassis runs the SQL and returns the answer, the SQL, and results. In generate-SQL-only mode, it returns the grounded SQL without running it; pair it with the cassis-snowflake-mcp workflow to execute against Snowflake.

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 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 public.results r JOIN public.races ra ON r.race_id = ra.race_id JOIN public.drivers 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: public.results, public.races, public.drivers
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 public.results and public.sprint_results, grouped by season. Assumptions: · Sprint points included in the total · Points rolled up across all drivers per season Objects: public.races, public.results, public.sprint_results

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.
Authentication
OAuth 2.1 for interactive clients, or a long-lived API key (a Bearer token, prefix sk-k6-) for non-interactive agents and scripts. Create keys under Organization → API keys. See Connect MCP clients.
Credential expiry
Expired or revoked credentials return HTTP 401. For OAuth, the client re-runs the flow automatically. An expired or revoked API key has to be replaced.
Unreachable project
Querying a project the authenticated user doesn't have access to returns an error.
Model overloaded
When Claude is briefly overloaded or rate-limited, the tool returns a plain-language message ("Claude is temporarily overloaded. Please try again in a moment.") instead of a raw error. Retry in a moment.

Want to try Cassis?

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

Stay tuned