Zetaris MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Zetaris MCP Serverlist the tables in the montgomery database and describe the census table"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Zetaris for Cursor
Connect Cursor's agent to your Zetaris instance, so it gets data through Zetaris instead of going around it.
After clicking, replace the sign-in values in Cursor's MCP settings with your own. The button runs the server with uv (uvx).
What you get
zetaris_mcp.py: a small MCP server (Python standard library only). It gives the agent five tools:list_databases: see what data Zetaris already has.list_tables: see the tables in one database, plus any ready-made views you describe.describe_table: see a table's columns.run_query: run read-only SQL (SELECT,WITH,SHOW,DESCRIBE,EXPLAIN).register_source: add a new source (CREATE LIGHTNING ...) or cache a table (CACHE TABLE).
.cursor/rules/zetaris.mdc: a project rule Cursor reads before every task. It tells the agent to get data through Zetaris, register a missing source instead of downloading it, join sources inside one Zetaris query, and show the SQL behind every figure.examples/montgomery/: the rule and view list used for Montgomery, Alabama (City of Montgomery, US Census, CDC and Ookla data), as an example of describing your own ready-made views.
Related MCP server: mcp-odbc
Set up by hand (no uv needed)
Copy
zetaris_mcp.pyand the.cursor/folder into your project.Create
.env.localnext to them (it is in.gitignore):ZETARIS_BASE_URL=http://localhost:3000 ZETARIS_ORG_ID=1 ZETARIS_USERNAME=you@example.com ZETARIS_PASSWORD=...Or set
ZETARIS_API_KEYinstead of the username and password.Open the project in Cursor. In Settings → MCP, turn on
zetaris. With the Cursor CLI:cursor-agent mcp enable zetaris.Ask a question in plain English. The agent finds the data in Zetaris, writes the SQL and shows it with the answer.
Each tool call is written as one JSON line to zetaris-mcp.log, so you can see exactly what the agent ran in Zetaris.
Settings
Variable | Default | Meaning |
|
| Your Zetaris UI address |
| none | Numeric organisation ID |
| none | How to sign in |
| none | File to read these from (the bundled |
|
| Seconds each call may take before the agent is told to make the query lighter |
| none | Spark status address (for example |
|
| Longest wait, in seconds, before a query that ran past the time limit is assumed finished |
| none | JSON file describing ready-made views, shown by |
|
| Most rows returned per query |
| none | Where tool calls are logged |
Safety
run_queryrefuses anything that is not read-only.register_sourceonly acceptsCREATE LIGHTNINGandCACHE TABLE. Neither tool can drop or change existing data.Each call has a time limit, so the agent gets a clear answer instead of hanging.
With
ZETARIS_SPARK_UIset, a query that ran past the limit blocks new queries until Spark shows it has finished. An agent cannot pile retries onto a busy engine and slow down other users of the same Zetaris.
Licence
MIT
Available Tools
5 toolsdescribe_tableB
Show the columns and types of a Zetaris table, given as DATABASE.table.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Show' implies a read-only operation, but it does not state error behavior, permission requirements, or what happens if the table does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no wasted words. The action and required input format are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description adequately states what is returned: columns and types. Minor gaps around error behavior and edge cases remain, but the core context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameter description, but the description adds useful meaning by specifying the required format as DATABASE.table. It still does not clarify whether the database prefix is always required or how quoting/case should be handled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it shows the columns and types of a Zetaris table. It is clear what the tool does, but it does not explicitly differentiate itself from siblings like list_tables or list_databases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives no guidance on when to use this tool versus alternatives such as list_tables or run_query. The intended use must be inferred from the purpose statement alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_databasesA
List the databases registered in Zetaris. Start here to see what data is already available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It implies a safe, non-destructive read and frames the tool as a starting point, but says nothing about ordering, pagination, permissions, or what the response contains. Adequate for a zero-parameter read, but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste; the purpose is front-loaded and the 'start here' guidance follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param discovery tool with no output schema, the description covers what it returns conceptually (the list of registered databases) and where it fits in a workflow. Only minor gaps like result ordering or scale remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify beyond what the empty schema already communicates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the databases registered in Zetaris'), which is clearly distinct from the sibling list_tables and describe_table. It doesn't explicitly name those siblings, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Start here to see what data is already available' gives a clear entry-point context, telling the agent this is a discovery-first call. It doesn't name alternatives or exclusions (e.g., when to skip straight to list_tables), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesC
List the tables in one Zetaris database.
| Name | Required | Description | Default |
|---|---|---|---|
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it says nothing beyond the bare action. It does not disclose whether views/system tables are included, whether pagination or limits apply, what the result shape is, or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient, though its terseness comes at the cost of the missing detail captured elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter, no nested objects, no output schema), so a short description is defensible. Still, for a discovery tool with zero annotation and zero schema-description coverage, the definition leaves open whether the caller needs a prior list_databases call and what the listing contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required 'database' parameter. The description only implies the value is a Zetaris database identifier, giving no format, naming convention, or case-sensitivity guidance to compensate for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (tables) scoped to one Zetaris database, which distinguishes it from list_databases (databases) and describe_table (columns of one table). It does not explicitly name those siblings as alternatives, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus list_databases or describe_table, and no prerequisite such as needing a database name from list_databases first. Usage is only inferable from the scope phrase 'in one Zetaris database'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_sourceB
Register a new data source in Zetaris with a CREATE LIGHTNING ... statement (REST, FILESTORE or DATABASE), or cache a table with CACHE TABLE.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not say whether this is a mutation with persistent side effects, what permissions are needed, whether registration is idempotent, or what happens on syntax errors — meaningful gaps for a write operation with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action first and the supported statement forms immediately after. No filler, though the trailing '...' is slightly vague.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and an undocumented sole parameter, the description is thin: it does not describe the return value, success/failure signals, or side effects of registering a source or caching a table.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'sql' parameter, so the description must compensate. It does add value by specifying the accepted statement forms (CREATE LIGHTNING with REST/FILESTORE/DATABASE, or CACHE TABLE), but gives no syntax example, required clauses, or handling of the optional-looking ellipsis.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Register') and resource ('a new data source in Zetaris'), and clarifies two supported modes: CREATE LIGHTNING (REST/FILESTORE/DATABASE) or CACHE TABLE. This is clearly distinguishable from read-oriented siblings like list_tables and describe_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (when you want to register a source or cache a table) by naming the DDL forms, but gives no explicit when-not guidance or differentiation from run_query, which could plausibly also execute SQL. The selection logic against the sibling is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_queryA
Run a read-only SQL query in Zetaris (SELECT, WITH, SHOW, DESCRIBE, EXPLAIN). Zetaris SQL is Spark SQL; tables are DATABASE.table and one query can join tables from different sources. Returns up to 200 rows, the time taken and the exact SQL run.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it declares read-only semantics, a hard 200-row cap, and that the response includes elapsed time and the exact SQL executed. It omits failure modes, timeouts, and whether the 200-row cap is silent truncation, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the operation first, then dialect/table-name rules, then return shape. Every sentence carries information an agent needs to construct a valid call, with no restatement of the tool name or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating the return payload (up to 200 rows, timing, exact SQL). Combined with the dialect and cross-source join notes, an agent has everything needed to call this correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'sql' param has no schema description, so the description must compensate, and it does: it constrains the accepted statement types (SELECT, WITH, SHOW, DESCRIBE, EXPLAIN), names the dialect (Spark SQL), and specifies DATABASE.table qualification. What's missing is any guidance on parameterization or quoting of literals.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run a read-only SQL query in Zetaris') and immediately scopes it with the allowed statement kinds. That verb-plus-statement-list framing separates it from discovery siblings like list_tables and describe_table without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this tool applies: read-only statements only, Spark SQL dialect, and cross-source joins are permitted. It never explicitly routes the agent away to list_databases/describe_table for schema discovery, so the alternatives are left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.2.0- First observed
describe_table - First observed
list_databases - First observed
list_tables - First observed
register_source - First observed
run_query
TDQS
Scored across 5 tools
The tools mostly target distinct operations: listing databases, listing tables, describing a table, querying, and registering a source. There is some overlap between describe_table and run_query because run_query also accepts DESCRIBE, but the descriptions make the intended use cases reasonably clear.
All tool names use a consistent snake_case verb_noun pattern: list_databases, list_tables, describe_table, run_query, register_source. The convention is predictable and easy to infer.
Five tools is well-scoped for a Zetaris data exploration and query server. Each tool covers a distinct step in the discovery-to-query workflow, with no obviously redundant tools.
The server covers the core lifecycle of discovering databases, inspecting tables, querying data, and registering sources. Minor gaps remain around removing or updating registered sources and inspecting source metadata, but agents can handle most core workflows.
Maintenance
Related MCP Connectors
Text-to-SQL MCP server: read-only queries on PostgreSQL, MySQL and SQL Server with your real schema
An MCP server for search and retrieval over a local LanceDB database
Remote data science agents for Snowflake, Databricks & BigQuery in Claude/Cursor via MCP
Hosted SQL Server MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA read-only MCP server for MS SQL Server, written in Python. Lets AI agents query your database safely — no writes, no stored procedures, no shell access.1-
- AlicenseNot gradedqualityDmaintenanceA Python MCP server that connects to any ODBC data source and exposes schema discovery + query tools. Read-only by default, write access available per-connection.2MIT
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server that lets coding AI agents inspect Oracle Database schema through live metadata.ISC
- FlicenseNot gradedqualityCmaintenanceMinimal MCP server for read-only access to ClickHouse, enabling AI agents to explore schemas and execute SELECT queries safely.-