Datris
PYPI · DATRIS-MCP-SERVER · 2 COMPONENTS · SCANNED SEP 20
The data control plane for AI agents — acquire, validate, land, and query data over MCP.
Available components
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 native-build step with no shell scripting around it. View diagnostics → Pass
- 0 of 32 dependencies flagged as unhealthy. View diagnostics → Pass
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 Usability77
- 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 20572 tokens (~267/item across 77 items; 75 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 Management60
- Stability observed for 18 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
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 7 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_pipeline" 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 77 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
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
{
"mcpServers": {
"datris-datris": {
"command": "uvx",
"args": [
"datris-mcp-server"
]
}
}
} {
"servers": {
"datris-datris": {
"command": "uvx",
"args": [
"datris-mcp-server"
]
}
}
} codex mcp add datris-datris -- uvx datris-mcp-server
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"datris-datris": {
"type": "local",
"command": [
"uvx",
"datris-mcp-server"
],
"enabled": true
}
}
} openclaw mcp add datris-datris --command uvx --arg datris-mcp-server
mcp_servers:
datris-datris:
command: "uvx"
args: ["datris-mcp-server"] {
"McpServers": {
"datris-datris": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"datris-mcp-server"
]
}
}
} assistant mcp add datris-datris -t stdio -c uvx -a datris-mcp-server
{
"mcpServers": {
"datris-datris": {
"command": "uvx",
"args": [
"datris-mcp-server"
]
}
}
} 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.
- 19 Sept 26 +16
- Malware scan: unverified → pass ▲ security
- 18 Sept 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 1.32.0 → 1.33.1 functional
- Package version: 1.32.0 → 1.33.0 functional
- 17 Sept 26 0
- Tool safety: pass → unverified ▼ security
- Stability: 0.47 → unverified ▼ security
- Schema quality: 100 → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Package version: 1.30.1 → 1.32.0 functional
- 16 Sept 26 +1
- Package version: 1.30.0 → 1.30.1 functional
- 14 Sept 26 +1
- Package version: 1.29.0 → 1.30.0 functional
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 10 Sept 26 −14
- Malware scan: pass → unverified ▼ security
- Package version: 1.28.1 → 1.29.0 functional
- Package version: 1.28.1 → 1.28.2 functional
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 20 Sept 2026 · Analysed pypi/datris-mcp-server@1.33.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
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 32 packages
| Packages resolved | 32 |
|---|---|
| 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 →
ai_answer ~143
Ask the Datris AI to answer a question based on provided context. Ideal for RAG workflows: first retrieve relevant chunks using a search tool (search_qdrant, search_pgvector, etc.), then pass the retrieved text as context along with the user's question to get a synthesized answer.
| Name | Type | Req | Description |
|---|---|---|---|
| context | string | yes | Context text to base the answer on (e.g., retrieved document chunks) |
| query | string | yes | The question to answer |
| sources | array | – | Optional provenance handles for the context (e.g. find_data results or _datris_* fields from search hits). Echoed back unchanged on the response so the answer and its provenance travel together. |
No output schema declared.
No examples provided.
apply_dest_types ~292
Apply destination column types to an all-string pipeline. REQUIRES explicit user approval first. Landed data is migrated before the config changes (postgres retypes in place; snowflake/databricks validate then swap the table) — the migration locks or replaces the table, so do NOT apply while a run is in flight. Any landed value that will not cast fails the whole apply with the column named and NOTHING changed — then either re-apply with that field set back to string, or fix the data. `fields` must list EVERY destination column (same names as get_dest_types returned) with its intended type; keep a column as-is by passing type string. 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 | array | yes | Every destination column with its intended type. Types: string, boolean, int, bigint, float, double, date, timestamp. |
| pipeline | string | yes | Pipeline name |
| 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.
check_service_health ~79
Check which backend services are up, down, or not configured. Returns the health status of PostgreSQL, MongoDB, MinIO, ActiveMQ, Kafka, and any configured vector databases (Qdrant, Weaviate, Milvus, Chroma, pgvector). Call this before attempting search or query operations to know which services are available.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
create_pipeline ~2,320
Create a pipeline. FOUR destination categories: STRUCTURED (postgres, mongodb, snowflake, databricks) — send a TINY sample (via content_text) and the schema is auto-detected; snowflake additionally REQUIRES credentialsSecret (a Platform secret with account/user/privateKey or password — discover via list_platform_secrets), warehouse, and database; databricks additionally REQUIRES credentialsSecret (a Platform secret with host plus clientId/clientSecret or token), warehouse (the SQL warehouse ID), and database (the Unity Catalog name). OBJECTSTORE (objectstore — writes Parquet files, ORC files, or an Iceberg table to MinIO or AWS S3) — same shape as structured (CSV-only, sample required for schema detection), plus objectStore-specific knobs (bucket, prefix, fileFormat, partitionBy, writeMode; keyFields for iceberg+merge; provider+credentialsSecret for S3). VECTOR (pgvector, qdrant, weaviate, milvus, chroma) — no schema; pass ONLY pipeline + destination (and optionally filename for the file-extension hint), no sample at all. SCRATCH (scratch) — same sample-required shape as structured, nothing is landed; the run's rows come back on the status rollup (`resultPreview`) and via get_pipeline_result; results expire — use it when the user wants an answer now, a validation result, or a transformed view with no reason to keep the rows (see the KEEP-OR-SCRATCH RULE). SAMPLE-SIZE RULE: the sample exists ONLY for schema detection — send the header row plus 3-5 representative rows, NEVER a full dataset. Composing hundreds of rows here wastes minutes of generation time; the real data arrives later via the tap or upload_data. Prefer content_text (plain text) over content (base64) — the server encodes it for you. 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 `w…
| Name | Type | Req | Description |
|---|---|---|---|
| authoritative | boolean | – | OMIT BY DEFAULT. Pass false only when the user says this pipeline lands a derived copy (a rollup, a replica, an index built from another dataset) rather than the system of record. A pipeline's single… |
| bucket | string | – | Object-store bucket name. Only applies to destination=objectstore. For MinIO this is optional (default: {environment}-data). For S3 (provider=s3) this is REQUIRED — there is no global default S3 buck… |
| catalog | string | – | OMIT BY DEFAULT. Catalogs are a user-chosen organizational convention — do NOT set a catalog unless the user has explicitly asked to group this pipeline under a named catalog. Assigning one for them… |
| codegen_rule | string | – | Optional data quality validation rule as a plain-English instruction. Only add when the user explicitly requests validation. Datris will generate a Python validation script from this instruction and… |
| codegen_transform | string | – | Optional transformation instruction as a plain-English description. Only add when the user explicitly requests transformation. Datris will generate a Python script from this instruction and run it lo… |
| content | string | – | Base64-encoded sample data. Prefer content_text instead — it's the same thing without you having to base64-encode. Only use this form when you already have base64 in hand (e.g. relaying an attachment… |
| content_text | string | – | Plain-text sample data (the server base64-encodes it for you) — the preferred way to pass the sample for structured destinations (postgres, mongodb, snowflake, databricks) and objectstore. Header row… |
| credentialsSecret | string | – | Name of an existing PLATFORM secret holding destination credentials. For objectstore + provider=s3: fields accessKey, secretKey, region (optionally sessionToken); REQUIRED unless Datris runs in AWS w… |
| database | string | – | Destination database name (default: datris). Ignored for objectstore. REQUIRED for snowflake — there is no default Snowflake database; ask the user which one to load. REQUIRED for databricks — it nam… |
| deleteBeforeWrite | boolean | – | When true, delete existing objects under the prefix before writing. Only applies to destination=objectstore. Default: false. Distinct from writeMode=overwrite (which is Spark-level). |
| delimiter | string | – | CSV delimiter (default: comma) |
| destination | string | – | Destination type (default: postgres for CSV, mongodb for JSON/XML). Use 'scratch' when nothing should be landed and the rows should come back to the caller (status rollup resultPreview + get_pipeline… |
| endpoint | string | – | S3 endpoint URL override. Only applies to destination=objectstore + provider=s3. Must use https://. Leave unset for the AWS regional default. Ignored for provider=minio. |
| fileFormat | string | – | Object-store storage format. Only applies to destination=objectstore. 'parquet' and 'orc' write loose columnar files under the prefix; 'iceberg' writes a table at the prefix (snapshots, schema evolut… |
| filename | string | – | Filename (e.g., data.csv, report.json, orders.xml). REQUIRED for structured destinations and objectstore. Optional for vector destinations — only used as a fileExtension hint (defaults to txt). |
| header | boolean | – | Whether CSV has a header row (default: true) |
| keyFields | array | – | Optional natural-key columns used to dedupe / upsert rows on every run. Applies to postgres, mongodb, snowflake, and databricks destinations, and to objectstore when fileFormat=iceberg and writeMode=… |
| partitionBy | array | – | Optional partition columns for objectstore writes. Spark creates a directory structure based on the distinct values of these columns. Field names must be in the destination schema. Example: ['dt', 'r… |
| pipeline | string | yes | Pipeline name |
| prefix | string | – | Object-store key prefix under the bucket (e.g. 'sales/daily'). REQUIRED for destination=objectstore. |
| provider | string | – | Object-store provider. Only applies to destination=objectstore. Default 'minio' (the platform's built-in store). Set to 's3' to write to AWS S3 — that requires bucket AND credentialsSecret. |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| role | string | – | Optional Snowflake role to assume (e.g. DATRIS_LOADER). Only applies to destination=snowflake; omit to use the service user's default role. |
| schema | string | – | Destination schema. Applies to destination=snowflake (default: PUBLIC) and destination=databricks (default: default). Simple identifiers resolve case-insensitively; names with hyphens/spaces are quot… |
| table | string | – | Destination table or collection name (default: pipeline name). Ignored for objectstore (the destination is bucket+prefix, not a table). |
| truncate | boolean | – | Optional. When true, the destination table/collection is truncated before each run, so only the latest run's data is kept. Only applies to postgres, mongodb, snowflake, and databricks destinations (o… |
| warehouse | string | – | Compute that runs the load. For destination=snowflake: the virtual warehouse NAME (e.g. DATRIS_WH). For destination=databricks: the SQL warehouse ID from the warehouse's Connection details — the trai… |
| writeMode | string | – | Object-store write mode. Only applies to destination=objectstore. Default: append. 'merge' is only valid with fileFormat=iceberg and requires keyFields — rows whose key matches an existing row replac… |
No output schema declared.
No examples provided.
create_tap ~1,459
Create a tap — a fetcher that pulls data from an external source and pushes it into a pipeline. Two kinds: a Python script the platform executes (default — provide a plain-English `instruction` to have AI generate the script, or supply your own `script` directly), or `kind: "http"` — a user-hosted HTTP endpoint (any language) that Datris POSTs the run context to on each run and which responds with the tap envelope; pass `endpoint_url` and see the tap-http-contract doc. HTTP taps run no code on the platform; AI script generation and the DATRIS_PLATFORM_* platform-data callback do NOT apply to them, so keep any tap whose fetch logic reads platform data as a Python tap. If the user wants the tap to feed a pipeline, pass `target_pipeline` now. Without it, `run_tap` will fetch but not persist (response will show `persisted: false, persistedReason: "no_target_pipeline"`) — you'd then need to call update_tap to wire a pipeline. For a fetch-only tap (the user wants the rows back, not landed), target a pipeline whose destination is scratch — see the KEEP-OR-SCRATCH RULE in the server instructions. If the user mentioned ANY recurrence (nightly, daily, hourly, every morning, market open, etc.), pass `cron_expression` NOW — the platform's scheduler will run the tap on that cadence automatically. This is the canonical way to make a tap recurring; do NOT respond with shell commands or external schedulers for the user to run themselves. See the SCHEDULING RULE in the server instructions. AFTER creating, call `test_tap` to validate the script BEFORE any `run_tap` or before relying on a scheduled cron run — see the VALIDATION RULE. Setting a cron on a never-tested script is a guaranteed-bad nightly run waiting to happen. The platform enforces this: passing `cron_expression` for a script (or endpoint) that has not passed `test_tap` returns HTTP 409 with the remedy — create the tap without `cron_expression`, call `test_tap` until it succeeds, then `update_tap` with the cron. Replacin…
| Name | Type | Req | Description |
|---|---|---|---|
| cron_expression | string | – | Quartz CRON expression for recurring runs (e.g., '0 0 * * * ?' for hourly, '0 30 5 ? * MON-FRI' for weekdays 5:30am). SET THIS whenever the user describes a recurrence — nightly, daily, hourly, marke… |
| endpoint_url | string | – | For kind 'http' only: absolute http(s) URL Datris POSTs {tap, params, state, testLimit} to on each run. The endpoint responds with the tap envelope {type, data, state?, logs?}. If the tap's secret ha… |
| instruction | string | – | Plain-English instruction for AI script generation. Describe the source and the data to fetch, in one or two sentences. If provided, AI generates the Python script. |
| kind | string | – | Tap implementation kind. 'python' (default): a script the platform executes. 'http': a user-hosted endpoint speaking the tap HTTP contract — requires `endpoint_url`; `instruction`, `script`, and `pac… |
| name | string | yes | Unique tap name. |
| packages | array | – | Extra pip packages the script imports that aren't pre-installed. Required when `script` imports non-stdlib modules beyond the pre-installed set (requests, beautifulsoup4, pandas, lxml, feedparser, bo… |
| reason | string | – | Optional one-line reason for this change, recorded in the platform's audit log and shown to anyone asked to approve it. |
| script | string | – | Raw Python source code with a fetch() function. Use this to provide your own script instead of AI generation. |
| secret_name | string | – | Vault secret name containing API keys/credentials the script needs for the EXTERNAL source. Never for the platform's own databases — scripts reach platform data credential-free via the auto-injected… |
| source | string | – | Where the data really comes from, as a short provider name or host, for lineage and provenance. Optional: when omitted it is derived from the endpoint host or the host the script references most. Nev… |
| tap_type | string | – | Tap type. 'structured' (default) returns rows of records. 'document' returns a list of {uri, filename, content (base64)} dicts; the platform stages each document and uses a ledger to skip files it ha… |
| target_pipeline | string | – | Name of the pipeline to push fetched data into |
No output schema declared.
No examples provided.
create_tap_secret ~388
Create or update a secret for a tap to use. The secret's fields are injected as environment variables into the tap's Python script at runtime. Use this before create_tap when the tap needs credentials (API key, DB password, etc.). FIRST call list_tap_secrets to check whether a suitable secret already exists — if so, reuse it instead of creating a duplicate. By default, fails if a secret with this name already exists — pass overwrite=true to replace it (ask the user first). Agents can only overwrite secrets that were also created by an agent (tagged _type=tap); secrets owned by a human user must be updated via the UI. 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. Each key becomes an env var name in the tap script; e.g., {"apiKey": "sk_..."} is read as os.environ['apiKey']. |
| name | string | yes | Secret name. Must not use reserved AI-slot names (anthropic, openai, azure, grok, ollama, embedding, ai-primary, codegen). Convention: lowercase, hyphenated, e.g. 'stripe-api-key'. |
| overwrite | boolean | – | If true, replace an existing secret with the same name. Default false (fails on collision). Only tap-typed secrets can be overwritten by an agent. |
| 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.
delete_pipeline ~296
Delete a pipeline. This is DESTRUCTIVE: by default it removes BOTH the pipeline configuration AND all data already written to the destination (MongoDB collection rows, Postgres table rows, vector-store entries). It also wipes document-tap ledgers and staged files for any tap that targets this pipeline, so a recreate gets a clean re-ingest. The platform deliberately does NOT support deleting just the config and orphaning the data — that creates ghost state. If you want to keep the config but wipe the destination data ("reset"), pass keep_config=true; the config survives, the data does not. ALWAYS confirm with the user before calling this 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 |
|---|---|---|---|
| keep_config | boolean | – | If true, delete only the destination data but keep the pipeline config (useful for a clean reset). Default false (full delete of both config and data). |
| pipeline | string | yes | Pipeline name to delete |
| 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.
delete_tap ~138
Delete a tap and its stored script. 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 to delete |
| 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.
delete_tap_secret ~185
Delete a tap secret. Only secrets created by an agent (tagged _type=tap) can be deleted via this tool; secrets owned by a human user must be removed from the Secrets tab. Use this to clean up after a tap is no longer needed. 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 secret to delete. |
| 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.
diff_pipeline_versions ~82
Compare two versions of a pipeline's definition. Returns a server-computed field-by-field config diff. Read-only. `version` is the newer/selected snapshot; `against` is the baseline.
| Name | Type | Req | Description |
|---|---|---|---|
| against | integer | yes | Baseline version to compare against |
| name | string | yes | Name of the pipeline |
| version | integer | yes | Selected version |
No output schema declared.
No examples provided.
diff_tap_versions ~95
Compare two versions of a tap's definition. Returns a server-computed field-by-field config diff and a line-level diff of the script. Read-only. `version` is the newer/selected snapshot; `against` is the baseline to compare it to.
| Name | Type | Req | Description |
|---|---|---|---|
| against | integer | yes | Baseline version to compare against |
| name | string | yes | Name of the tap |
| version | integer | yes | Selected version |
No output schema declared.
No examples provided.
find_data ~187
Find datasets by meaning: ranks the pipelines your key can read against a natural-language query over their names, descriptions, tags, catalogs, destination field names, and source hosts. Each hit returns where the data lives, how fresh it is, provenance handles (latest run id, config version, script sha), lineage, and a `howToQuery` hint naming the existing query/search tool with pre-filled arguments. Discovery only — nothing is executed for you: make the query call yourself, then pass its provenance handles to ai_answer as `sources` so the answer carries them.
| Name | Type | Req | Description |
|---|---|---|---|
| ai | boolean | – | Rerank the top candidates with the platform's primary AI model (default: false — ranking is deterministic). |
| limit | integer | – | Maximum results to return (default: 5, max: 25). |
| query | string | yes | Natural-language description of the data you need. |
No output schema declared.
No examples provided.
get_agent_policy ~128
Read this Datris instance's agent policy: for each action (e.g. tap:delete, pipeline:update:dest-types) whether an agent may do it on its own (auto), must wait for a person to approve it (approve), or is refused (deny). Call this before a delete, schema migration, or other consequential change to know whether it will run immediately or queue for approval, and tell the user accordingly. Returns {enabled, policy:{actions, overrides, limits}, actions:[all policy-able action keys], pendingCount}. When enabled is false, every action is auto.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_approval ~143
Poll one queued approval by the `approvalId` a mutating tool returned with status pending_approval. Returns its current state: pending (still waiting for a person), executed (approved and performed — `resultStatus` / `resultBody` carry the outcome of the original call), failed (approved but the replay failed), rejected, or expired. Poll with `wait_seconds` between calls, backing off to 30-60s; a decision can take minutes or hours, so after a few polls tell the user you will check back and stop polling unless they ask you to wait.
| Name | Type | Req | Description |
|---|---|---|---|
| approval_id | string | yes | The approvalId returned with pending_approval. |
No output schema declared.
No examples provided.
get_dest_types ~152
Propose real column types for a pipeline whose destination columns are all stored as text (the default for agent-created pipelines). Stateless: samples up to 1000 rows that already landed in the destination, infers types deterministically, and returns per-column evidence — a few sample values, plus (for columns kept as string by a dirty value) the offending value and the type it blocked. Only for postgres, snowflake, and databricks destinations; `eligible: false` with a `reason` of destination-not-supported, already-typed, or no-landed-rows (run the pipeline once first) otherwise. Nothing is stored or changed by this call.
| Name | Type | Req | Description |
|---|---|---|---|
| pipeline | string | yes | Pipeline name |
No output schema declared.
No examples provided.
get_incident ~78
Read one recovery-agent incident by id — its trigger, classification, proposal, step-by-step narrative, approvals it is waiting on, and outcome. When the operator asks about a failure the platform is already working, explain THIS record instead of re-diagnosing from scratch.
| Name | Type | Req | Description |
|---|---|---|---|
| incident_id | string | yes | The incident id (inc_…). |
No output schema declared.
No examples provided.
get_job_status ~307
Get job status for an upload_data submission. Pass `pipeline_token` (returned from upload_data) for the recommended path. Pass `pipeline_name` instead for a paginated summary of recent jobs for that pipeline. When queried by `pipeline_token`, the response is `{rollup: {allDone, status, jobs: [...]}, events: [...]}` — poll every few seconds until `rollup.allDone` is true, then read `rollup.status` (`success` | `warning` | `error`) for the outcome. Per-job detail is in `rollup.jobs[]` with `pipelineToken`, `pipeline`, `filename`, `status`, `startedAt`, `lastEventAt`, `elapsed`, and `lastError` (populated on failure with `processName` and `description`). `events[]` is the raw begin/info/end audit trail; the rollup is the source of truth for completion. When queried by `pipeline_name`, the response is a paginated array of summary rows; the most recent job is index 0 and its `status` field is `success` | `processing` | `error`. Do NOT proceed to query/search until the job is in a terminal state.
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | Page number for paginated results (default: 1) |
| pipeline_name | string | – | Pipeline name to get a paginated summary of recent jobs |
| pipeline_token | string | – | Pipeline token returned from upload_data |
No output schema declared.
No examples provided.
get_lineage ~309
Traverse the lineage graph from one node: everything upstream (what feeds it) and/or downstream (what depends on it) of a source, tap, pipeline, dataset, or catalog, with the edges between them, freshness for the pipeline involved, and optionally the most recent recorded runs (what each run read and wrote, per destination). Datasets a pipeline used to land into under an earlier configuration are marked `historical`. Use it for impact analysis before changing or deleting something — 'what is downstream of this tap?' — or to see which datasets a pipeline actually wrote. Node names: a tap or pipeline name; a dataset's `kind:coordinates` id as returned by find_data or list_pipelines lineage; a source host; a catalog name.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | boolean | – | For pipeline and dataset nodes, include column-level lineage: which destination columns pass through from which source fields (exact), which the platform adds (system), and any cached AI-inferred map… |
| depth | integer | – | Maximum hops from the node (default: unbounded). |
| direction | string | – | Which way to traverse (default: both). |
| name | string | yes | The node's name (the part after `type:` in a lineage id). |
| node_type | string | yes | The kind of node to start from. |
| runs | integer | – | Include this many most-recent recorded runs for the node (default: 0, max: 50). |
No output schema declared.
No examples provided.
get_pipeline ~45
Get a specific pipeline configuration by name. Returns the full JSON config including source, dataQuality, transformation, preprocessor, and destination sections.
| Name | Type | Req | Description |
|---|---|---|---|
| pipeline | string | yes | Pipeline name |
No output schema declared.
No examples provided.
get_pipeline_result ~401
Read the rows a scratch pipeline produced. Only pipelines whose destination is scratch have a result — anything else is a 404 (an error body of `Not Found` / `status: 404` — rather than the endpoint's own `Only scratch pipelines have a result` message — for a pipeline you know is scratch means the server predates scratch results: report the version mismatch and stop, do not retry). The first rows are already on the `get_pipeline_status` rollup as `resultPreview`, so call this ONLY when the rollup's `resultTruncated` is true and you need the rest. Paging with `offset`/`limit` never re-runs the source — it reads the stored result. `limit` is clamped server-side, so the next offset is always `offset + returnedCount`, never `offset + limit`. Results expire after the retention window, so read them promptly; a 410 means the result is gone and the pipeline must be run again. Pass `publisher_token` (from run_tap) or `pipeline_token` (a single ingestion job); exactly one of the two must be supplied. Response shape: `{records: [...], rowCount, returnedCount, offset, truncated, resultUri, resultExpiresAt}` — `rowCount` is the whole result, `returnedCount` this page.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Requested rows for this page. The server clamps it to its inline cap; read returnedCount for what actually came back. |
| offset | integer | – | Row offset to start from (default 0). Use the previous page's offset + returnedCount (not + limit — limit is clamped server-side). |
| pipeline_token | string | – | UUID of a single ingestion job (from upload_data or rollup.jobs[].pipelineToken). |
| publisher_token | string | – | UUID returned from run_tap. Reads the result of the scratch pipeline job that run submitted. |
No output schema declared.
No examples provided.
get_pipeline_status ~270
Read pipeline ingestion status. Use this after `run_tap` to watch a tap-submitted load progress. Pass `publisher_token` to see every job the tap run submitted (the recommended option — works for both structured and document taps). Pass `pipeline_token` for a single ingestion job. Exactly one of the two must be supplied. Response shape: `{rollup: {allDone, status, jobs: [...]}, events: [...]}`. Poll every few seconds until `rollup.allDone` is true, then read `rollup.status` (`success` | `warning` | `error`) for the outcome. Per-job detail is in `rollup.jobs[]` — each entry has `pipelineToken`, `pipeline`, `filename`, `status`, `startedAt`, `lastEventAt`, `elapsed`, and `lastError` (populated on failure with `processName` and `description`). `events[]` is the raw begin/info/end audit trail if you need it; the rollup is the source of truth for completion.
| Name | Type | Req | Description |
|---|---|---|---|
| pipeline_token | string | – | UUID for a single ingestion job. Returns status rows for that one job. |
| publisher_token | string | – | UUID returned from run_tap response. Returns status rows for ALL jobs this tap run submitted. |
No output schema declared.
No examples provided.
get_pipeline_version ~70
View one historical snapshot of a pipeline's definition: the full config as it was at that version. Read-only; does not change the live pipeline. Get version numbers from `list_pipeline_versions`.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the pipeline |
| version | integer | yes | Version number to view |
No output schema declared.
No examples provided.
get_platform_secret_fields ~111
Return the FIELD NAMES (keys only — never values) of an existing platform secret. Use this after list_platform_secrets to verify a candidate secret has the keys a destination config requires (e.g. an S3 credentialsSecret must contain accessKey, secretKey, region). Secret values are intentionally NOT returned. If the named secret is tap-tagged, this tool refuses — use get_tap_secret_fields for those.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Platform secret name (from list_platform_secrets). |
No output schema declared.
No examples provided.
get_provenance ~166
Resolve a stamped `_datris_run_id` value back to its origin: the pipeline run, the tap run that fed it, the script commit, the pipeline config version, and the declared source. Use it when rows or search results carry `_datris_*` provenance fields (pipelines with provenance stamping enabled). Returns one document walking the whole chain.
| Name | Type | Req | Description |
|---|---|---|---|
| config_version | integer | – | The `_datris_config_version` value from the data, if present. |
| pipeline | string | – | Pipeline name, if known (speeds resolution). |
| run_id | string | yes | The `_datris_run_id` value from the data (the pipeline run token). |
| tap_run | string | – | The `_datris_tap_run` value from the data, if present. |
No output schema declared.
No examples provided.
get_tap ~148
Get a tap's static definition: configuration, schedule, target pipeline, and the generated Python script content. This is config-only — it returns the SAME data on every call and tells you NOTHING about run state. Do NOT call this to check whether a run is finished or to poll for completion — repeatedly calling get_tap after run_tap is a bug, the response will never change to reflect ingestion progress. For run status: call `get_pipeline_status(publisher_token=...)` (token comes from the run_tap response or from a get_tap_logs entry). For run history: call `get_tap_logs`.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the tap to retrieve |
No output schema declared.
No examples provided.
get_tap_ledger ~176
For a document tap: return the ledger of discovered documents (URI, filename, status, hashes, first/last seen timestamps). The ledger is what tells the platform which documents have already been processed so re-runs skip unchanged files. Pass 'clear_uri' to delete one entry (forces that document to be re-processed on the next run) or 'clear_all=true' to wipe the entire ledger (forces a full re-scan).
| Name | Type | Req | Description |
|---|---|---|---|
| clear_all | boolean | – | Optional. If true, deletes the entire ledger for this tap, forcing every document to be re-processed on the next run. |
| clear_uri | string | – | Optional. If set, deletes the ledger entry for this URI so the document is re-processed on the next run. |
| name | string | yes | Name of the document tap |
No output schema declared.
No examples provided.
get_tap_logs ~216
Get the run history for a tap. Returns the last 50 run log entries sorted by most recent first, including status, record count, duration, errors, logs, and `publisherToken` for each run that submitted records to a pipeline. Works for both manual runs (triggered by `run_tap`) and scheduled runs (triggered by the platform's cron scheduler) — they share the same log. Use this to verify whether a scheduled run fired, whether any recent run's script succeeded, and to recover the `publisherToken` for any run if you didn't keep the original `run_tap` response in context. To verify the actual destination ingestion outcome — not just that the script ran — pick the relevant entry and call `get_pipeline_status(publisher_token=entry.publisherToken)`. The tap log only records what the script did; the publisher token is how you trace a run through to whether the data actually landed in the destination.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the tap to get logs for |
No output schema declared.
No examples provided.
get_tap_secret_fields ~91
Return the FIELD NAMES (keys only — never values) of an existing tap secret. Use this after list_tap_secrets to verify a candidate secret has the keys your tap script will need (e.g. API_KEY, USER_AGENT). Secret values are intentionally NOT returned and are never visible to the agent.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Tap secret name (from list_tap_secrets). |
No output schema declared.
No examples provided.
get_tap_state ~125
Get a tap's incremental-sync state — the bookmark/cursor its script saved after the last successful run (injected into the next run as the DATRIS_TAP_STATE env var). Returns `{tap, state, updatedAt, updatedBy}`; `state` is null when the tap has never committed state (non-incremental tap, or no successful run yet). Use this to see where an incremental tap will resume from, or to debug why a scheduled tap is re-fetching or skipping a window.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the tap |
No output schema declared.
No examples provided.
get_tap_version ~77
View one historical snapshot of a tap's definition: the full config and the pinned Python script as they were at that version. Read-only; does not change the live tap. Get version numbers from `list_tap_versions`.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the tap |
| version | integer | yes | Version number to view |
No output schema declared.
No examples provided.
get_version ~15
Get the Datris server version.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
kill_job ~155
Kill a running pipeline job by its pipeline token. The job thread will be interrupted and the job marked as cancelled. 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 |
|---|---|---|---|
| pipeline_token | string | yes | Pipeline token of the running job to kill |
| 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.
list_chroma_collections ~33
List all collections in the Chroma vector database. Use this to discover available collections before running search_chroma.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_incidents ~176
List the platform's recovery-agent incidents, newest first. An incident is opened by the platform itself when a scheduled tap finally fails, a pipeline job errors, a tap goes stale, or a pipeline's volume swings; the recovery agent diagnoses it and — within the agent policy's recovery mode — repairs and verifies it. Each entry carries kind, resource, state (open | diagnosing | proposed | awaiting_approval | executing | verifying | resolved | failed | abandoned), classification, and a step-by-step narrative. Use state=open for what is being worked right now. Returns {enabled:false, incidents:[]} when the recovery agent is off.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum incidents to return (default 50). |
| state | string | – | Filter: open (any active state) or a specific state name. Omit for all. |
No output schema declared.
No examples provided.
list_milvus_collections ~35
List all collections in the Milvus vector database. Use this to discover available collections before running search_milvus.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_mongodb_collections ~61
List MongoDB collections. If database is specified, lists collections in that database. If omitted, lists all collections across all databases in 'db.collection' format.
| Name | Type | Req | Description |
|---|---|---|---|
| database | string | – | Database name (optional; omit to list from all databases) |
No output schema declared.
No examples provided.
list_mongodb_databases ~42
List all MongoDB databases available in the Datris platform. Use this as the first step when exploring what data has been ingested into MongoDB destinations.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_pending_approvals ~120
List the actions this agent queued for human approval under the agent policy, newest first. Each entry has id, action, resource, state (pending | approved | rejected | expired | executed | failed), createdAt, expiresAt and — once decided — decidedBy and the result. Use `state` to filter (default: all).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum entries to return (default 100). |
| state | string | – | Filter by state: pending, approved, rejected, expired, executed, failed. Omit for all. |
No output schema declared.
No examples provided.
list_pgvector_collections ~39
List all pgvector tables (tables with an embedding column) in PostgreSQL. Use this to discover available collections before running search_pgvector.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_pipeline_versions ~180
List the change HISTORY of a pipeline's definition, newest first. Each entry has `version`, `createdAt`, `createdBy`, and `changeNote`. The platform snapshots a pipeline's full config every time it is created or updated. Read-only. IMPORTANT: an EMPTY result does NOT mean the pipeline has no version — it means it has not been edited since versioning was enabled. The CURRENT version number is the `version` field on the pipeline itself (from `list_pipelines` or `get_pipeline`), at least 1 for every pipeline. Use this tool for 'what changed and when'; use `list_pipelines`/`get_pipeline` for 'what version is it on now'. See also `get_pipeline_version`, `diff_pipeline_versions`, `restore_pipeline_version`.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the pipeline |
No output schema declared.
No examples provided.
list_pipelines ~89
List all registered pipeline configurations. Each pipeline defines a complete data processing flow: source format and schema, AI-powered data quality and transformations, and destination (database, message queue, or vector store). CALL THIS FIRST on any data-related user request — before suggesting external sources, before asking scope questions. The user almost always cares more about what's already in their Datris environment than about a generic options menu.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_platform_secrets ~149
List the names of PLATFORM secrets (all secrets NOT tagged _type=tap — the Platform tab in the UI's Secrets section). These are human-owned credentials for destinations and infrastructure (e.g. S3 destination credentials, Postgres connection, MongoDB connection, embedding/vector-store endpoints). The agent can READ these (to look up their names and field shape via get_platform_secret_fields and reference them in pipeline configs) but cannot create, update, or delete them — those operations are the user's responsibility via the Secrets tab. Use this whenever a pipeline's destination needs a credentialsSecret reference (e.g. objectStore with provider=s3) and you need to discover which secrets the user already has.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
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_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.
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 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 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 75 tools: list_pipelines, get_pipeline, create_pipeline, set_catalog, delete_pipeline, and 70 more. Their descriptions and schemas cost roughly 16,708 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 20 September 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.