Resources
The MCP server exposes resources that agents can read on demand for detailed documentation.Available Tools
Pipeline Management
Vector Database Search
Semantic search across any of the pipeline’s supported vector databases. Each tool takes a natural language query and returns the most similar document chunks with scores and metadata.Database Queries
Read-only queries against the pipeline’s backend databases.Metadata Discovery
Explore the structure of PostgreSQL, MongoDB, and vector databases managed by the platform. Use these tools to understand what data is available before writing queries or running searches.AI
Taps
For a document tap,
create_tap requires the target_pipeline to have an unstructuredAttributes source and a vector-store destination (qdrant, pgvector, weaviate, milvus, or chroma). The server rejects mismatched pairings with HTTP 400.
Configuration
Monitoring Active Agents
The Datris UI includes an Agent Monitor tab that shows a live view of every agent currently connected to the MCP server and a streaming log of the tool calls each one is making. Agents are labeled using their MCPclientInfo.name — so Claude Desktop appears as claude-ai, Claude Code as claude-code, Cursor as cursor, and so on — with graceful fallbacks to tenant name, API-key name, or session id for clients that don’t supply one. See Monitoring → Agent Monitor for details.
Setup
Docker (automatic)
The MCP server starts automatically withdocker-compose up in SSE mode on port 3000. No additional setup required.
Local (for Claude Desktop / Claude Code)
The MCP server is published on PyPI. Useuvx to run it directly:
Transport Modes
Configuring Claude
Client-side setup for Claude Desktop and Claude Code — including recommended and alternative transports, and example first prompts — lives on its own page: Configuring Claude.Environment Variables
All database connections, vector search, and embedding are handled by the pipeline server. The MCP server only needs the pipeline URL.
Authentication
The MCP server has no API key of its own. Each connecting agent sends anx-api-key header per session and the MCP server forwards it as-is to the Datris REST API on every tool call. Issue and manage agent keys from Configuration → API-Keys in the UI.
When the Datris platform has USE_API_KEYS=true, set REQUIRE_API_KEY=true on the MCP server too — otherwise the MCP layer accepts unauthenticated connections that then fail with 401 at the REST tier. The pairing is intentional: turn both on, or neither.
Each agent should connect with its own labeled key (e.g. claude-desktop, cursor, prod-agent) so its traffic appears under a distinct identity in the request logs and can be revoked independently. Issue from the UI:
- Configuration → API-Keys → Issue new key
- Label the key for that agent (
claude-desktop,cursor, etc.) - Pick a capability template (
read-only,rag-builder,ops) or build a custom scope - Copy the value once at issue time and paste it into the agent’s MCP client config
read-only agent can’t create_tap even if its system prompt tells it to try. See API Keys for the full per-client pattern.
Example Agent Workflows
The platform’s canonical workflow is delivered to every connected agent through the MCP
instructions field — agents don’t need to memorize it. These examples show the same flow applied to common tasks.Core rules the agent receives on connect: check what exists before creating (list_pipelines, list_taps); keep pipeline configs simple (source + destination only — never pass profile_data output into a pipeline config); after run_tap, read persisted and persistedReason before doing anything else; verify real completion via get_pipeline_status(publisher_token=...), not by the response body; set cron_expression on the tap when the user describes a recurrence — never propose external schedulers or shell snippets; call test_tap before run_tap and before setting a cron on any newly-created or newly-updated script; and only narrate work that actually completed in the current turn — if the tool calls didn’t fire, say so honestly rather than confabulating success; a repeated request (“run it again”) is a new operation requiring a fresh tool call, never a result forecast from the previous run.For long-form tap workflow guidance — params, scheduling, validation, error handling, the Quartz CRON cookbook — agents can re-read the datris://tap-workflow-reference resource on demand at any point in a session.Ingest a CSV file directly
- Check for an existing pipeline —
list_pipelines. If one already fits the data, skip to step 3. - Create a pipeline —
create_pipelinewith the CSV as sample data. Schema is auto-detected. Keep the config simple; only passcodegen_rule/codegen_transformif the user explicitly asks for validation or transformation. - Upload —
upload_datawith the CSV content (base64). - Verify it landed —
get_job_statuswith thepipelineTokenreturned fromupload_data. Poll untilrollup.allDoneistrue, then readrollup.status(success,warning,error). On failure,rollup.jobs[].lastErrorcarries the failing process and message.
Onboard a new external data source via a tap
- Check existing taps —
list_taps. If a tap already covers this source, run or test it directly. - Create credentials — if the source needs an API key, call
create_tap_secretwith the credential fields (they become env vars inside the script). - Create the tap —
create_tapwith an instruction (AI generates the script) or with your own Pythonfetch()function (faster and more reliable). Passsecret_nameto bind the credentials from step 2. For PDFs/Word/HTML into a vector-store pipeline, passtap_type="document". - Test —
test_tap. If it fails, read the error, fix the script, and callcreate_tapagain. Repeat until the test passes. - Run —
run_tap. Read the response’spersistedfield first:persisted: true→ capturepublisherTokenand continue to step 6.persisted: false→ readpersistedReason(no_target_pipeline,test_mode,run_error,no_records,debounced), tell the user exactly why, and stop. (run_tapdoes not return records — calltest_tapif you need to preview what the script produces.)debouncedmeans the same tap was triggered within the last 5 seconds; the earlier run is still executing — do not retry, look it up viaget_tap_logsand pollget_pipeline_statusinstead.
- Verify it landed —
get_pipeline_status(publisher_token=...)and poll untilrollup.allDoneistrue. Thenrollup.statusis the outcome (success,warning,error) androllup.jobs[].lastErrorcarries any failure detail. The tap log only tells you the script ran; the publisher token is how you confirm records actually reached the destination. - Schedule (optional) —
update_tapwith acron_expression. For each scheduled run, pick the corresponding entry fromget_tap_logsto get itspublisherToken, then verify with step 6.
Build and query a RAG knowledge base from external documents
- Create a vector-store pipeline —
create_pipelinewith a Qdrant / Weaviate / Milvus / pgvector / Chroma destination and anunstructuredAttributessource. - Create a document tap —
create_tapwithtap_type="document"and an instruction describing the document source (e.g., “ingest every PDF under legal-contracts/2026/ in S3”). If the source needs credentials, callcreate_tap_secretfirst. - Test and run —
test_tap, thenrun_tap. Readpersisted/persistedReasonexactly as above. - Verify every document landed —
get_pipeline_status(publisher_token=...). Document taps fan out to N jobs (one per file) under one publisher token; poll untilrollup.allDoneistrue.rollup.jobs[]has one entry per file with its ownstatusandlastError. - Inspect the ledger (optional) —
get_tap_ledgershows which files were discovered and processed. On subsequent runs, unchanged files are skipped automatically; passclear_uriorclear_all=trueto force a re-scan. - Search —
search_qdrant(or the matching tool for your destination) to retrieve relevant chunks. - Answer —
ai_answerwith the retrieved chunks as context and the user’s question.
Discover and query existing data
- List databases —
list_postgres_databases. - List schemas —
list_postgres_schemasfor the target database. - List tables —
list_postgres_tables(supports a vector-only filter). - Inspect columns —
list_postgres_columnsto understand structure. - Query —
query_postgreswith a SELECT, orquery_naturalto ask a plain-English question and have the AI generate + run the SQL.
Cross-modal analysis (structured + vector)
- Vector search —
search_pgvector(or another vector tool) for relevant document chunks. - Structured query —
query_postgresorquery_naturalfor related metrics. - Combine — merge the two result sets in the response.
Automated quality monitoring of scheduled taps
- List taps —
list_tapsto find the tap of interest. - Read recent runs —
get_tap_logsreturns the last 50 entries with status, record count, duration, errors, andpublisherTokenfor each run that submitted records. - Verify completion — for any run of interest, call
get_pipeline_status(publisher_token=...)and readrollup.statusto confirm records actually landed in the destination. The tap log tells you the script ran; the publisher token tells you the load finished. - Diagnose failures — on an errored job, read
rollup.jobs[].lastError(processName+description) and either fix the tap (create_tapagain with a corrected script) or retarget the pipeline (update_tap).
