OmniData MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| health_checkA | Verify the OmniData database server is running, can reach DuckDB, and report its current guardrail configuration (row limits, timeout, DB path). Use this first to confirm the MCP connection is alive. |
| list_datasetsA | List every table and view available in the database, with its type and column count. Call this first when exploring an unknown database -- run_sql_query needs real table names to work with. |
| get_schemaA | Get the column names, types, and nullability for one dataset (table or view). Use list_datasets first to get valid names. Args: dataset: Exact table or view name, as returned by list_datasets. |
| get_row_countA | Get the exact row count for one dataset. Use this before run_sql_query on a large table to know how much data you're sampling from with a LIMIT. Args: dataset: Exact table or view name, as returned by list_datasets. |
| run_sql_queryA | Execute a read-only SQL query and return structured results. Safety guardrails (see README "Design decisions"):
Use get_row_count first if you need to know the true size of a table beyond what this capped result shows. Args: sql: A single read-only SQL statement. row_limit: Desired max rows (capped at the server's max_row_limit). Ignored if your query already has LIMIT. |
| get_data_profileA | Generate summary statistics for every column in a dataset: type, null percentage, approximate distinct count, min/max, and (for numeric columns) mean/stddev/quartiles. Uses DuckDB's built-in SUMMARIZE, so it runs efficiently even on large tables. Args: dataset: Exact table or view name, as returned by list_datasets. |
| generate_chartA | Run a read-only SQL query and render the result as a chart image (bar, line, or scatter). Subject to the same read-only safety guardrails as run_sql_query. Returns an inline chart image on success. On failure (bad SQL, missing column, empty result, oversized render), returns an error dict instead -- check for an "error" key if the result isn't an image. (No static return-type annotation here: the mcp SDK's output-schema generation can't handle Image inside a Union type.) Args: sql: A single read-only SQL statement producing the data to chart. Aggregate/group the data yourself for cleaner charts (e.g. GROUP BY category). chart_type: "bar", "line", or "scatter". x_column: Column name (from the query result) for the x-axis. y_column: Column name (from the query result) for the y-axis. series_column: Optional column to split into multiple series/ traces (e.g. one line per region). title: Optional chart title. Defaults to "{y_column} by {x_column}". |
| execute_pyspark_jobA | Run a declarative PySpark transformation pipeline against a DuckDB dataset -- for heavier aggregations/transformations than run_sql_query is meant for. NOT arbitrary code execution: each step must be one of a fixed set of operations, validated before running. Supported operations (each a dict with an "op" key): {"op": "filter", "condition": ""} e.g. {"op": "filter", "condition": "revenue > 100"} {"op": "select", "columns": ["a", "b"]} {"op": "withColumn", "name": "new_col", "expression": ""} e.g. {"op": "withColumn", "name": "margin", "expression": "revenue - cost"} {"op": "groupBy_agg", "group_by": ["a"], "aggregations": {"b": "sum"}} aggregations map column -> function; functions: sum, avg, mean, count, min, max, stddev, variance {"op": "orderBy", "columns": ["a"], "ascending": true} {"op": "distinct"} {"op": "limit", "n": 100} Steps run in the order given. A final row cap is always applied to the output regardless of what the pipeline itself requests. Args: source_dataset: Exact table/view name, as returned by list_datasets. operations: Ordered list of pipeline steps (see above). row_limit: Desired max rows returned (capped at the server's max_row_limit). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 8 tools
Each tool targets a distinct concern: health check, dataset discovery, schema introspection, row counting, SQL queries, profiling, charting, and declarative transformations. Even run_sql_query vs generate_chart are clearly differentiated by output type (structured data vs. image).
The naming convention is predominantly verb_noun (list_datasets, get_schema, run_sql_query, generate_chart, execute_pyspark_job). The sole outlier is health_check, which follows noun_verb order and is not consistent with the others.
With 8 tools, the server is well-scoped for a database analytics MCP. Each tool covers a genuine need without redundancy or bloat, staying within the ideal 3-15 range.
The tool surface covers the full analytical lifecycle: connect/health, explore structure, query, profile, chart, and transform. While data modification is intentionally absent, all read-only analysis needs are addressed without obvious gaps.