Datris
PYPI · DATRIS-MCP-SERVER · 2 COMPONENTS
The data control plane for AI agents — acquire, validate, land, and query data over MCP.
Available components
Last scanned (11 hours ago)
Scores higher than 87% of PyPI servers
Category Data and Analytics
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 36 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency48
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 1 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 27553 tokens (~306/item across 90 items; 88 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_catalog" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 90 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 4 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 1.55.0 → 1.56.0 functional
- 1 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 31 Oct 26 0
- Package version: 1.54.2 → 1.55.0 functional
- 30 Oct 26 0
- Malware scan: unverified → pass ▲ security
- Package version: 1.54.1 → 1.54.2 functional
- 29 Oct 26 0
- Malware scan: unverified → pass ▲ security
- Package version: 1.53.0 → 1.54.1 functional
- Package version: 1.53.0 → 1.54.0 functional
- 26 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- 25 Oct 26 +15
- Malware scan: unverified → pass ▲ security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed pypi/datris-mcp-server@1.56.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 36 packages
| Packages resolved | 36 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
list_postgres_columns ~75
List all columns and their data types for a specific PostgreSQL table. Use this to understand table structure before writing a query_postgres SQL query.
| Name | Type | Req | Description |
|---|---|---|---|
| database | string | – | Database name (default: datris) |
| schema | string | – | Schema name (default: public) |
| table | string | yes | Table name |
No output schema declared.
No examples provided.
list_postgres_databases ~42
List all PostgreSQL databases available in the Datris platform. Use this as the first step when exploring what data has been ingested into PostgreSQL destinations.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_postgres_schemas ~65
List all schemas in a PostgreSQL database. Schemas organize tables within a database (e.g., 'public', 'analytics'). Use after list_postgres_databases to drill into a specific database.
| Name | Type | Req | Description |
|---|---|---|---|
| database | string | – | Database name (default: datris) |
No output schema declared.
No examples provided.
list_postgres_tables ~103
List all tables in a PostgreSQL schema. Set vector_only=true to show only pgvector embedding tables, or false (default) to show regular data tables. Use after list_postgres_schemas.
| Name | Type | Req | Description |
|---|---|---|---|
| database | string | – | Database name (default: datris) |
| schema | string | – | Schema name (default: public) |
| vector_only | boolean | – | If true, only return tables with an embedding column (pgvector tables). Default: false |
No output schema declared.
No examples provided.
list_qdrant_collections ~36
List all collections in the Qdrant vector database. Use this to discover available collections before running search_qdrant.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_script_versions ~183
List the version HISTORY of the script the pipeline runs for its AI data-quality rule or AI transformation (`kind`), newest first. Each entry has `version`, `createdAt`, `createdBy`, `changeNote`, `origin` (save, regenerate, run, restore-version, restore, repository), `model`, `commitSha` (repository-backed scripts), `fingerprintMatchesCurrent` (written for the pipeline's current instruction and source schema) and `isLive` (the script runs now use). Every change to the script is kept; the pipeline's definition version does not change when its script does. Read-only. See also `get_script_version`, `diff_script_versions`, `restore_script_version`.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | yes | Which script: the AI data-quality rule or the AI transformation |
| name | string | yes | Name of the pipeline |
No output schema declared.
No examples provided.
list_tap_secrets ~92
List the names of tap secrets that already exist (secrets tagged _type=tap — both agent-created and human-owned ones surfaced via the UI's Tap Secrets section). ALWAYS call this before create_tap_secret: if a suitable secret already exists, prefer reusing it by passing its name as secret_name to create_tap. Only ask the user to provide credentials when no existing secret covers the need.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_tap_versions ~199
List the change HISTORY of a tap's definition, newest first. Each entry has `version`, `createdAt`, `createdBy`, and `changeNote`. The platform snapshots a tap's config + script every time it is created or updated. Read-only. IMPORTANT: an EMPTY result does NOT mean the tap has no version — it means the tap has not been edited since versioning was enabled, so no change snapshots exist yet. The tap's CURRENT version number is the `version` field on the tap itself (from `list_taps` or `get_tap`), which is at least 1 for every tap. Use this tool for 'what changed and when'; use `list_taps`/`get_tap` for 'what version is it on now'. See also `get_tap_version`, `diff_tap_versions`, `restore_tap_version`.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the tap |
No output schema declared.
No examples provided.
list_taps ~73
List all taps with their status, target pipeline, schedule, and last run info. CALL THIS FIRST (alongside list_pipelines) on any data-related user request — the user's existing taps often reveal what's already being pulled and where, which short-circuits the entire 'should I suggest an external API?' conversation.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_weaviate_classes ~35
List all classes in the Weaviate vector database. Use this to discover available classes before running search_weaviate.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
profile_data ~222
Send data and use AI to generate a comprehensive data profile: summary statistics per column, data quality issues detected, and suggested validation rules. Use the suggested aiRule when building a pipeline's dataQuality section. The server may withhold row values from the model (DATRIS_AI_SAMPLE_VALUES=false): the profile is then built from column statistics or structure only, sampleValues are empty, and the result carries valuesWithheld: true. If the AI model declines the request (a provider safety decline), the result carries aiDeclined: true and holds the server's column statistics only, with empty qualityIssues and recommendations: read that as no AI review, not as a clean file.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | Base64-encoded file content |
| delimiter | string | – | CSV delimiter (default: comma) |
| filename | string | yes | Filename (e.g., sample.csv) |
| header | boolean | – | Whether CSV has a header row (default: true) |
| sample_size | integer | – | Number of rows to sample for profiling (default: 200) |
No output schema declared.
No examples provided.
query_databricks ~322
Run a read-only query against the Databricks workspace a pipeline loads into. Pass the pipeline name; the server resolves the workspace, credentials, SQL warehouse, and catalog from the pipeline's config — same connection the loader uses, credentials never leave the server. Only works for pipelines whose destination is Databricks (database with useDatabricks=true). Allowed statements: SELECT (WITH/CTE), SHOW, and DESCRIBE — LIMIT is auto-appended to SELECTs. Omit `sql` to preview the pipeline's destination table (the 'did my load land?' check). Metadata discovery uses the same tool — there are no separate list_databricks_* tools: `SHOW CATALOGS`, `SHOW SCHEMAS IN <catalog>`, `SHOW TABLES IN <catalog>.<schema>`, `DESCRIBE TABLE <catalog>.<schema>.<table>`, or query <catalog>.information_schema.columns. Queries run on the customer's SQL warehouse (which costs them compute) — keep them targeted and let the default LIMIT stand unless the user asks for more. If the warehouse is stopped, the first query auto-starts it and may take longer.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum rows to return (default: 100). Pass -1 for unlimited. |
| pipeline | string | yes | Pipeline name (from list_pipelines). Must have a Databricks destination. |
| sql | string | – | Read-only statement: SELECT/WITH, SHOW, or DESCRIBE. Omit to preview the pipeline's destination table. |
No output schema declared.
No examples provided.
query_mongodb ~116
Query a MongoDB collection with optional filter and projection. Use list_mongodb_databases and list_mongodb_collections first to discover available data. Returns matching documents as JSON.
| Name | Type | Req | Description |
|---|---|---|---|
| collection | string | yes | MongoDB collection name |
| filter | object | – | MongoDB query filter (default: {}) |
| limit | integer | – | Maximum documents to return (default: 20). Pass -1 for unlimited — no cap, returns every matching document. |
| projection | object | – | Fields to include/exclude (default: all fields) |
No output schema declared.
No examples provided.
query_natural ~136
Ask a question in natural language about data in a PostgreSQL table. The AI generates a SQL query from the question and table schema, executes it, and returns the results. Use this instead of writing SQL manually.
| Name | Type | Req | Description |
|---|---|---|---|
| database | string | – | Database name (default: datris) |
| limit | integer | – | Maximum rows to return (default: 100). Pass -1 for unlimited — no cap, returns every matching row. |
| question | string | yes | Natural language question about the data |
| schema | string | – | PostgreSQL schema (default: public) |
| table | string | yes | PostgreSQL table name to query |
No output schema declared.
No examples provided.
query_objectstore ~237
Read rows from a pipeline's objectStore destination (Parquet files, ORC files, or an Iceberg table in MinIO or AWS S3). Pass the pipeline name; the server resolves the bucket, prefix, format, and credentials from the pipeline config — same code path the writer uses, so MinIO and S3 destinations both work. Returns up to `limit` rows as JSON objects keyed by column name, plus the resolved s3a:// path and format for transparency. For an Iceberg table the response also carries snapshotId (a decimal string, not a number) and snapshotTimestamp (ISO-8601) of the snapshot read; both are null for other formats. Returns 0 rows (not an error) when the pipeline has no successful runs yet. This is the right tool when list_pipelines shows objectStore as the destination — query_postgres / query_mongodb / search_* will not work against objectStore data.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum rows to return (default: 100, hard cap: 10000). |
| pipeline | string | yes | Pipeline name (from list_pipelines). |
No output schema declared.
No examples provided.
query_postgres ~236
Execute a read-only SQL SELECT query against PostgreSQL. Use the metadata discovery tools (list_postgres_databases, list_postgres_schemas, list_postgres_tables, list_postgres_columns) first to explore available data before constructing queries. Only SELECT is allowed; LIMIT is auto-appended if missing. Queries are cancelled if they run too long, so avoid full-table scans. For approximate row counts — "how many rows / records does table X have", overviews, or summarizing several tables — do NOT run exact `SELECT COUNT(*)` (it scans the whole table and can take many seconds on a large one). Instead read the planner estimate, which is effectively instant regardless of table size: `SELECT reltuples::bigint AS estimate FROM pg_class WHERE relname = '<table>'`. Use exact `COUNT(*)` only when the user explicitly needs an exact count of a known-small or filtered result.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum rows to return (default: 100). Pass -1 for unlimited — no cap, returns every matching row. |
| sql | string | yes | SQL SELECT query to execute |
No output schema declared.
No examples provided.
query_snowflake ~301
Run a read-only query against the Snowflake account a pipeline loads into. Pass the pipeline name; the server resolves the account, credentials, warehouse, and role from the pipeline's config — same connection the loader uses, credentials never leave the server. Only works for pipelines whose destination is Snowflake (database with useSnowflake=true). Allowed statements: SELECT (WITH/CTE), SHOW, and DESCRIBE — LIMIT is auto-appended to SELECTs. Omit `sql` to preview the pipeline's destination table (the 'did my load land?' check). Metadata discovery uses the same tool — there are no separate list_snowflake_* tools: `SHOW DATABASES`, `SHOW SCHEMAS IN DATABASE <db>`, `SHOW TABLES IN SCHEMA <db>.<schema>`, `DESCRIBE TABLE <db>.<schema>.<table>`, or query <db>.information_schema.columns. Queries run on the customer's configured warehouse (which costs them compute) — keep them targeted and let the default LIMIT stand unless the user asks for more.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum rows to return (default: 100). Pass -1 for unlimited. |
| pipeline | string | yes | Pipeline name (from list_pipelines). Must have a Snowflake destination. |
| sql | string | – | Read-only statement: SELECT/WITH, SHOW, or DESCRIBE. Omit to preview the pipeline's destination table. |
No output schema declared.
No examples provided.
rename_catalog ~336
Rename a catalog: every tap and pipeline labelled with `catalog` is relabelled to `new_name` in one server-side operation, and the empty-catalog placeholder moves with it. Call this ONLY when the user has explicitly asked to rename that catalog — never to emulate a rename by calling set_catalog on each item. `new_name` must not already exist: a rename never merges catalogs and is refused if the target exists. To combine two catalogs, move their items with set_catalog. Uncataloged cannot be renamed, and `new_name` must use letters, digits, '_' and '-' only. Items that could not be moved come back under `failed` (the rest still move); report them to the user. API keys whose capabilities are scoped to the old catalog name are listed under `affectedKeys` — they keep the old scope and no longer match the renamed items, so tell the user an administrator may need to update those keys. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| catalog | string | yes | Current catalog name. |
| new_name | string | yes | New catalog name (letters, digits, '_' and '-'). |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
No output schema declared.
No examples provided.
restore_catalog ~499
Restore a catalog archive produced by export_catalog as catalog `catalog` (the same or a new name). Call this ONLY when the user has explicitly asked to restore and named the archive to use. A restore never merges: it is refused (with the clashing names) when the catalog already exists or any archived tap or pipeline name exists anywhere on this install. mode=overwrite replaces only items already in `catalog` and needs `confirm` equal to the catalog name. It never writes secrets: missing ones come back under `missingSecrets` for the user to create. Restored taps are left disabled; tell the user to test and enable them. Items that could not be restored come back under `failed`; report them. Archived AI scripts are restored as-is unless `regenerate_scripts` is set; `scriptsImported`, `scriptsRegenerated` and `scriptsKept` (a live script left in place; both with the reason) say which were which. The response carries `sourceEnvironment` (where the archive was exported) and `targetEnvironment` (this install), plus a warning when they differ; tell the user. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| archive_base64 | string | yes | The archive as base64 (the `archiveBase64` value export_catalog returned). |
| catalog | string | yes | Catalog name to restore into (letters, digits, '_' and '-'). |
| confirm | string | – | Required for mode=overwrite: the catalog name, repeated. |
| mode | string | – | new (default): the catalog and every archived name must not exist yet. overwrite: replace items already in this catalog; needs confirm. |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| regenerate_scripts | boolean | – | Optional, default false. true regenerates each pipeline's AI scripts on this install instead of restoring the archived ones. |
| restore_state | boolean | – | Optional, default true. false skips each tap's incremental state (for a copy that should start from scratch). |
No output schema declared.
No examples provided.
restore_pipeline_version ~230
Roll a pipeline back (or forward) to a prior definition version. APPEND-ONLY and SIDE-EFFECTING: reads snapshot `version` and writes it as a NEW latest version, preserving full history. 'Rolling forward' is the same call with a higher version number. Only call this when the operator has explicitly asked to restore/roll back this specific pipeline to a specific version. Report the new version and stop. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the pipeline |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| version | integer | yes | Version to restore (becomes a new latest version) |
No output schema declared.
No examples provided.
restore_script_version ~313
Make an earlier version of a pipeline's AI data-quality rule or AI transformation script the one the pipeline runs. APPEND-ONLY and SIDE-EFFECTING: the restore writes the chosen text back as a NEW latest version (no model call); the pipeline's definition version does not change. If that text is already the live script, nothing is written and the response carries `noop: true`. Refused when the pipeline's instruction or source schema no longer matches the version (HTTP 422 with the reason; nothing is changed), and refused with HTTP 409 when a repository-backed script file was edited since its recorded commit. Only call this when the operator has explicitly asked to restore this specific script version. Report the new version and stop. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | yes | Which script: the AI data-quality rule or the AI transformation |
| name | string | yes | Name of the pipeline |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| version | integer | yes | Script version to restore (becomes a new latest version) |
No output schema declared.
No examples provided.
restore_tap_version ~273
Roll a tap back (or forward) to a prior definition version. This is APPEND-ONLY and SIDE-EFFECTING: it reads snapshot `version` and writes it as a NEW latest version (config + that version's script), preserving the full history — nothing is overwritten or lost. 'Rolling forward' is the same call with a higher version number. Only call this when the operator has explicitly asked to restore/roll back this specific tap to a specific version. It does NOT run the tap — after restoring, report the new version and stop; do not chain into `run_tap` unless separately and explicitly asked. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the tap |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| version | integer | yes | Version to restore (becomes a new latest version) |
No output schema declared.
No examples provided.
run_doctor ~211
Run the platform's operational self-check and return a report: Vault token expiry, AI slot secrets complete, embedding model actually loaded, disk usage, the payload staging area (writable, room for one run, no orphaned run directories), component version skew, and (opt-in) whether each AI model answers. Each non-ok check carries a remediation command for the operator; nothing is changed. Do NOT call run_doctor as part of the normal workflow — it is slow. Only use it for diagnostics when something fails or the user asks about the deployment's health. Host-level checks (Docker volumes, container env drift) need `datris doctor` on the machine running Docker and are not included here.
| Name | Type | Req | Description |
|---|---|---|---|
| include_ai_probes | boolean | – | Also send a minimal request through each configured AI slot to confirm the key and model work (spends a few tokens). Default false. |
| mode | string | – | `full` (default) or `quick` (only the cheap startup-safe subset). |
No output schema declared.
No examples provided.
run_tap ~1,544
Manually trigger a tap. Executes the script; when a target pipeline is configured, hands records to the pipeline async. The response carries `recordCount`, `publisherToken`, `pipelineTokens`, `persisted`, `persistedReason`, and the script's `logs` — but NOT the records themselves. If you need to preview what the script produces, call `test_tap` instead. BEFORE the first run of a newly-created or newly-updated tap, you MUST have called `test_tap` and seen it succeed. See the VALIDATION RULE in the server instructions. Skipping the test on a fresh script pushes potentially-broken data into the destination — and `run_tap` doesn't return records, so you won't see the breakage from the response. PER-RUN PARAMS — pass a `params` object to drive this run with caller-supplied values (date range, id list, page cursor, etc.). Each key/value becomes an env var the script reads via `os.environ.get('DATRIS_TAP_PARAM_<key>')`. Keys must match `[A-Za-z_][A-Za-z0-9_]*` so they map cleanly onto env var names. Values are stringified; nested objects/arrays are JSON-encoded (script can `json.loads()` them back). Use this for anything that varies per-call — date windows, id lists, page cursors, batch sizes. Do NOT rewrite the tap secret to pass per-run params: secrets are for credentials (API keys, DB passwords); rewriting them on every call clobbers concurrent runs, pollutes audit history, and wastes Vault writes. If the tap script doesn't yet read a particular param, update the script by calling `create_tap` again with the same `name` and a revised `script` (create_tap upserts and replaces the existing script). That's the right shape for parameterized runs. REQUIRED next steps based on the response: • `persisted: true` → load is still running. Call `get_pipeline_status(publisher_token=response.publisherToken)` and poll until `rollup.allDone` is true. Then read `rollup.status` (`success`/`warning`/`error`) and `rollup.jobs[].lastError`. Do not report completion or query the desti…
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the tap to run |
| params | object | – | Optional per-run parameters injected into the script as DATRIS_TAP_PARAM_<key> env vars. Use for values that vary per call (date ranges, id lists, page cursors, batch sizes) — NOT for credentials (th… |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
No output schema declared.
No examples provided.
search_chroma ~100
Semantic search across a Chroma vector database collection. Takes a natural language query, generates an embedding, and returns the most similar document chunks with similarity scores. For RAG: pass the returned text to ai_answer with the user's question.
| Name | Type | Req | Description |
|---|---|---|---|
| collection | string | – | Chroma collection name (default: documents) |
| query | string | yes | Natural language search query |
| top_k | integer | – | Number of results to return (default: 5) |
No output schema declared.
No examples provided.
search_milvus ~101
Semantic search across a Milvus vector database collection. Takes a natural language query, generates an embedding, and returns the most similar document chunks with similarity scores. For RAG: pass the returned text to ai_answer with the user's question.
| Name | Type | Req | Description |
|---|---|---|---|
| collection | string | – | Milvus collection name (default: documents) |
| query | string | yes | Natural language search query |
| top_k | integer | – | Number of results to return (default: 5) |
No output schema declared.
No examples provided.
search_pgvector ~127
Semantic search across a PostgreSQL pgvector table using cosine distance. Takes a natural language query, generates an embedding, and returns the most similar document chunks with similarity scores. Use list_postgres_tables with vector_only=true to discover available pgvector tables. For RAG: pass the returned text to ai_answer.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | Natural language search query |
| schema | string | – | PostgreSQL schema (default: public) |
| table | string | – | Table name (default: documents) |
| top_k | integer | – | Number of results to return (default: 5) |
No output schema declared.
No examples provided.
search_qdrant ~103
Semantic search across a Qdrant vector database collection. Takes a natural language query, generates an embedding, and returns the most similar document chunks with similarity scores. For RAG: pass the returned text to ai_answer with the user's question.
| Name | Type | Req | Description |
|---|---|---|---|
| collection | string | – | Qdrant collection name (default: documents) |
| query | string | yes | Natural language search query |
| top_k | integer | – | Number of results to return (default: 5) |
No output schema declared.
No examples provided.
search_weaviate ~104
Semantic search across a Weaviate vector database class. Takes a natural language query, generates an embedding, and returns the most similar document chunks with similarity scores. For RAG: pass the returned text to ai_answer with the user's question.
| Name | Type | Req | Description |
|---|---|---|---|
| class_name | string | – | Weaviate class name (default: Documents) |
| query | string | yes | Natural language search query |
| top_k | integer | – | Number of results to return (default: 5) |
No output schema declared.
No examples provided.
set_catalog ~298
Set or clear the catalog grouping label on an existing pipeline or tap. ONLY call this when the user has explicitly asked to organize work under a named catalog. Do NOT call it proactively — catalogs are a user-chosen organizational convention; assigning one for them puts the pipeline/tap into a taxonomy they didn't ask for. Pass exactly one of `pipeline` or `tap` to identify the target. Pass `catalog` to set the label, or omit it (or pass an empty string) to clear it. Survives subsequent re-ingests — `datris ingest` no longer rewrites an existing pipeline's config. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| catalog | string | – | Catalog label. Omit or pass an empty string to clear the label. |
| pipeline | string | – | Pipeline name to update. Mutually exclusive with `tap`. |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| tap | string | – | Tap name to update. Mutually exclusive with `pipeline`. |
No output schema declared.
No examples provided.
set_tap_state ~324
Overwrite or reset a tap's incremental-sync state. Pass `state` (a JSON object) to set the bookmark the next run receives via DATRIS_TAP_STATE — e.g. rewind a cursor so a window is re-fetched. Pass `reset: true` to delete the state entirely: the next run sees no DATRIS_TAP_STATE and does a full first-run fetch. The state shape is defined by the tap's own script (read its code via get_tap to see what keys it expects). Only use this on explicit request or to recover a broken cursor — normal runs manage state themselves, committing it only after a successful run. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the tap |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| reset | boolean | – | If true, delete the stored state entirely (next run = full first-run fetch). Ignores `state`. |
| state | object | – | The state object the next run should receive. Must match the keys the tap's script reads from DATRIS_TAP_STATE. |
No output schema declared.
No examples provided.
suggest_field_protection ~311
Suggest per-field protection (hmac, mask with an optional preserve, redact, drop, or none, each with a one-line reason) for a pipeline's source fields, computed by the configured CodeGen model from field NAMES and TYPES ONLY: no row value is sent to the model. Stateless: nothing is saved or changed. Pass `pipeline` (an existing pipeline name; its stored source schema is used) or `fields` (an array of {name, type}, e.g. the schema you are about to create). A field that already carries `protect` shows it as `current` next to the suggestion. Show the suggestions to the user and ask which to accept before passing any of them as the `protect` map to `create_pipeline`; never apply them on your own. With `preset` (delimited sources only) the server's rule-based preset classifier is used instead of the model: each field gets an identifier class, a method and a reason, and the result lists the fields it did not recognise and review notes; show all of it, including the review notes, to the user.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | array | – | Fields to classify (use this OR pipeline): [{"name": ..., "type": ...}] |
| pipeline | string | – | Existing pipeline name (use this OR fields) |
| preset | string | – | Optional preset to classify against instead of the model (delimited/CSV sources only). The result can be enforced on create_pipeline with protect_preset. |
No output schema declared.
No examples provided.
test_tap ~561
Test-run a tap without pushing data to the pipeline. Executes the tap's script and returns results, record count, and any errors. Use this to validate a script before running it for real. By default a test pulls the first 20 records and returns; `recordCount` from a test is the preview size, not what `run_tap` will produce. If the error reports exit code -9 (or 137, or "killed") with no traceback, the script ran out of memory because fetch() built its whole result in memory: rewrite fetch() to yield records one at a time (read the source in chunks / pages) instead of returning a list, then test again. For a large columnar or tabular source, `yield` each batch (a pyarrow `RecordBatch`, a pandas `DataFrame`, or a list of dicts) instead of each row — the platform serialises a batch natively, several times faster — and read only the columns the pipeline needs (`columns=[...]`). Yielding one row at a time remains correct for small or API-paged sources. A test is bounded by `TAP_SCRIPT_TIMEOUT_SECONDS` (default 300 s), which is deliberately shorter than the ceiling a real run gets — a test that times out on a large source does not mean `run_tap` will. A run that timed out returns the script's logs, its `[wrapper] streamed N records` progress lines and a partial record count. Read them first: a script that reached the source and was still streaming records when the timeout hit is healthy and too long, not wrong — do not rewrite it; tell the user how far it got and offer a smaller window via `params` or the operator's timeout setting. After two consecutive failed tests, stop and report the exact error text to the user instead of iterating further; never probe the runner environment or read the wrapper to diagnose. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pa…
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max records to pull for the preview (default 20). 0 = no cap: streams the whole source — only when the user explicitly asks for a full test. |
| name | string | yes | Name of the tap to test |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
No output schema declared.
No examples provided.
update_secret ~236
Update an AI provider secret in the Datris platform. Use this to configure your AI API keys so Datris can use AI features (data profiling, schema generation, AI transformations, RAG). Only AI-related secrets can be updated: anthropic, openai, azure, grok, ollama, embedding. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | object | yes | Key-value fields to set. Typical fields: endpoint (API URL), model (model name), apiKey (API key) |
| name | string | yes | Secret name: anthropic, openai, azure, grok, ollama, or embedding |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
No output schema declared.
No examples provided.
update_tap ~749
Update an existing tap's CONFIG without regenerating the script. Change the enabled state, CRON schedule, target pipeline, or description. USE THIS to set or adjust a tap's schedule (`cron_expression`) whenever the user describes a recurrence (nightly, daily, every morning, market open, etc.). The platform's scheduler runs the tap on the cadence you set — no external cron, Airflow DAG, or shell loop is needed (or wanted). See the SCHEDULING RULE in the server instructions. VALIDATION RULE: if you're enabling a `cron_expression` on a tap whose script has NEVER been validated, call `test_tap` FIRST and confirm it succeeds. The cadence-change path is safe for taps that have already run successfully; it is not safe to set a cron on a never-tested script. The platform enforces this: setting `cron_expression` on an untested script returns HTTP 409 with the remedy — save the tap without the cron, call `test_tap` until it succeeds, then call `update_tap` again with the cron. Cadence-only changes on a tap whose current script has passed `test_tap` are accepted. To change the SCRIPT itself, call `create_tap` again with the same `name` and the new `script` or `instruction` — create_tap upserts by name and replaces the existing script. There is no separate script-only update tool. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| cron_expression | string | – | Quartz CRON expression for recurring runs: 6 fields — seconds minutes hours day-of-month month day-of-week, plus an optional year (e.g., '0 0 * * * ?' for hourly, '0 30 5 ? * MON-FRI' for weekdays 5:… |
| depends_on | array | – | Names of other taps in the same catalog whose destination tables this tap reads. Replaces the declared list; pass an empty list to declare that it has none (overrides the platform's inference from th… |
| description | string | – | New plain-English description |
| enabled | boolean | – | Enable or disable the tap |
| endpoint_url | string | – | For HTTP taps only: new endpoint URL Datris POSTs the run context to. Rejected on Python taps. |
| name | string | yes | Name of the tap to update |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| source | string | – | Declared source identity for lineage/provenance (provider name or host). Pass an empty string to clear it and fall back to derivation. |
| target_pipeline | string | – | New target pipeline name |
No output schema declared.
No examples provided.
upload_config ~199
Upload a configuration file to the Datris platform. Supports 'validation-schema' (JSON Schema files used in pipeline dataQuality schema validation). Send the file content as base64. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | Base64-encoded file content |
| filename | string | yes | Filename (e.g., schema.json, transform.js) |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| type | string | yes | Config file type: 'validation-schema' for JSON Schema |
No output schema declared.
No examples provided.
upload_data ~323
Upload data to a registered pipeline for processing. Send the ENTIRE file content as a single base64-encoded string in ONE call — do not pre-split or chunk the content client-side. Vector destinations (pgvector, qdrant, weaviate, milvus, chroma) apply recursive chunking server-side using the pipeline's configured chunkSize/chunkOverlap; for those, one upload_data call yields many embedded chunks automatically. The pipeline's rules are applied: schema validation, data quality checks, transformations, then routing to the configured destination. A Live Read (`scratch`) pipeline validates or transforms the file and hands the rows back (status rollup `resultPreview`, then get_pipeline_result) instead of landing them. Returns a pipelineToken for tracking job status via get_job_status. If this Datris instance's agent policy requires a person to approve this action, the call does NOT perform it: it returns status `pending_approval` with an `approvalId`. Tell the user it is waiting for approval in Datris, then poll `get_approval` with that id (pause with `wait_seconds` between polls) — do not re-issue the action.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | Base64-encoded file content |
| filename | string | yes | Filename (e.g., data.csv, report.json, orders.xml) |
| pipeline | string | yes | Pipeline name to process the data with |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
No output schema declared.
No examples provided.
wait_seconds ~262
Sleep for a fixed number of seconds, then return. Use this to pace polling against long-running platform work (most often `get_pipeline_status` after `run_tap`, or `get_job_status` after `upload_data`) so you do not burn tool calls hammering an endpoint that is still in progress. ALWAYS poll once BEFORE the first wait — many runs finish in 1–5 seconds. Then use exponential backoff between polls: 5s, 10s, 20s, 30s, 60s, 60s, ... (cap at 60s normally, 120s only if the run is genuinely glacial). Reset to a short wait (5–15s) on the next cycle whenever a poll shows new jobs flipped to a terminal state — that means you're close to done. If 80%+ of jobs are terminal, wait ~15s; if only 1–2 jobs remain, wait ~10s. Hard upper bound is 120 seconds per call — for longer waits, call this tool in a loop interleaved with a status check.
| Name | Type | Req | Description |
|---|---|---|---|
| seconds | integer | yes | How long to sleep, in seconds. Range: 1–120. Values outside this range are clamped. |
No output schema declared.
No examples provided.
How do I install the Datris MCP server?
Datris runs locally as a PyPI package, launched with uvx datris-mcp-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · datris-mcp-server
claude mcp add datris-datris -- uvx datris-mcp-server
What is the Datris MCP server?
Datris is an MCP server listed in the public MCP registry as io.github.datris/datris. The data control plane for AI agents, acquire, validate, land, and query data over MCP. This page covers its PyPI package (datris-mcp-server).
Is the Datris MCP server safe to use?
Datris scores 84 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Datris MCP server expose?
Datris exposes 88 tools: list_pipelines, get_pipeline, create_pipeline, set_catalog, rename_catalog, and 83 more. Their descriptions and schemas cost roughly 23,689 tokens of context every time the server is loaded.
Is the Datris MCP server still maintained?
Datris is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Datris MCP server under?
Datris declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.