Skip to main content

MCP Server

Erdo exposes a Model Context Protocol (MCP) server that lets AI assistants and applications query your datasets, ask data questions, manage conversations, and automate analysis — all using your existing Erdo permissions. Use it to:
  • Connect AI assistants like Claude Desktop, Cursor, or Windsurf to your data
  • Build AI-powered apps that query and visualize your data using any MCP client library
  • Integrate with any LLM via Vercel AI SDK, LangChain, or direct MCP client connections
  • Automate recurring analysis with heartbeat automations
  • Manage knowledge with memories and skills that persist across conversations

Quick Start

1. Get an API Key

Click your profile in the bottom-left corner of Erdo and go to API Keys. Create a new key and copy the token.

2. Connect to the MCP Server

The MCP endpoint is https://api.erdo.ai/mcp using Streamable HTTP transport. Any MCP-compatible client can connect. The organization is inferred from your API key automatically.
Add to your claude_desktop_config.json:
To target a different organization that the API-key user belongs to, add X-Organization-ID: <org-slug>. To keep work inside one project, also add X-Project-ID: <project-uuid>. The project must belong to the selected organization. Both headers are optional; omit X-Project-ID for the default All projects context.

3. Start Using It

Once connected, the MCP client can discover and call Erdo tools. In AI assistants, try asking:
  • “List my datasets in Erdo”
  • “What columns does the sales dataset have?”
  • “How many orders were placed last month?” (uses the Data Question Answerer agent)
  • “Run a SQL query on my customers dataset to find the top 10 by revenue”
  • “Create a heartbeat that checks for anomalies in my revenue data every hour”

Available Tools

Erdo exposes MCP tools across data, threads, knowledge, KV stores (the shared key/value store, a.k.a. collections), artifacts, pages, agent runs, and automations. Three Platform-API surfaces have their own dedicated pages, each with the full MCP tool, REST, and CLI reference: Evals, Workstreams, and Experiments.

Data Tools

erdo_list_datasets

List all datasets in your organization with name, type, description, and status. Parameters:

erdo_search_datasets

Search datasets by name or description. Parameters:

erdo_get_dataset_schema

Get detailed schema for a dataset including column names, types, statistics, and sample data. Parameters:

erdo_gather_dataset_context

Get detailed context for multiple datasets at once — schemas, column types, statistics, descriptions, and sample data. Useful for understanding your data landscape before asking questions. Parameters:

erdo_fetch_dataset_contents

Fetch raw contents of a dataset. Returns rows and columns directly without requiring a SQL query. Useful for exploring small datasets or getting a quick preview. Parameters:

erdo_run_query

Run a raw SQL query directly against a dataset and return rows and columns. Use this when you already know the exact SQL you want to run. The SQL dialect depends on the dataset’s storage backend (PostgreSQL, ClickHouse, or DuckDB for file-based datasets). Parameters:

erdo_query_data

Query a dataset using natural language. Describe what data you want and Erdo will generate and execute the SQL query for you. Parameters: Returns: the generated sql, the result values as columns + rows (the same tabular shape erdo_fetch_dataset_contents returns), row_count — how many rows the query matched, which can exceed the rows returned since those are capped at 1000 — and output, the result rendered to read. applied_filters names any of the dataset’s saved filters the read ran under, so a count is never reported as the whole truth when it excludes something.

erdo_ask_data_question

Ask a natural language question about your data. This invokes Erdo’s Data Question Answerer agent, which analyzes datasets, writes and executes code, and returns a text answer. To visualize results, use erdo_render_chart or erdo_render_table.
This tool can take 30 seconds to 2 minutes for complex questions, as it runs a full AI analysis pipeline.
Parameters: Returns: A thread ID (for follow-up in the Erdo UI) and the agent’s text answer.

erdo_render_chart

Render a data visualization chart. Supports bar, line, pie, histogram, and scatter chart types. The chart fetches data directly from the dataset — no embedded data needed. Parameters:

erdo_render_table

Render a data table. The table fetches data directly from the dataset. Parameters:

erdo_create_dataset

Create a new empty dataset. After creation, use erdo_write_rows to add data. The dataset uses your organization’s default storage backend. Parameters: Returns: The created dataset with id, slug, name, type, and status.

erdo_upload_dataset_file

Upload a file (CSV, TSV, Excel, JSON, JSONL, PDF, DOCX, TXT, Markdown, …) and create a dataset from it in one call. The schema is extracted before the tool returns, so the dataset is immediately queryable. Prefer this over erdo_create_dataset + erdo_write_rows when the data already exists as a file. Parameters: Returns: { dataset_id, slug, name, ready }ready is false when the file stored but its schema could not be extracted (not yet queryable).

erdo_delete_dataset

Delete a dataset and all its data. This is permanent. Parameters:

erdo_write_rows

Write or upsert rows to a dataset. For database-backed datasets (Postgres, ClickHouse), set key_column to upsert — matching rows are updated, new rows are inserted. For file datasets (CSV), rows are always appended. Parameters: Returns: { rows_affected: number, rows_inserted: number, rows_updated: number } — a keyed write is an upsert, so the split says how many rows it created and how many it replaced. Without a key_column the write appends and all of it is inserted.

erdo_delete_rows

Delete rows from a dataset. Works for both file (CSV) and database-backed datasets. Parameters: Returns: { rows_affected: number }

erdo_update_dataset_schema

Update a dataset’s schema: add, remove, rename columns, or change column types. Operations are applied atomically — if any fails, none are applied. Supported for CSV file datasets only. After changes, analysis is automatically refreshed. Parameters: Operation object: Returns: { columns_added, columns_removed, columns_renamed, columns_retyped, current_columns }

Integration Tools

Connect third-party apps and data sources without leaving your AI assistant. What decides the flow is whether the caller already holds the credential: databases, API keys, and service accounts connect in one call, and so do SaaS apps whose auth type is keys. OAuth apps are the exception — the provider mints their credentials during the authorization, so they return a connect_url for the user to open in a browser and erdo_check_integration_connection completes the loop. See Connecting integrations for the flows end to end.

erdo_list_integrations

List the integrations connected in your organization with app identifier, name, status, and auth type.

erdo_search_integration_apps

Search apps that can be connected — native integrations (databases, warehouses, APIs) plus thousands of SaaS apps. Parameters: Returns: each app’s identifier (pass it to erdo_connect_integration), name, auth_types, and source (native or pipedream).

erdo_connect_integration

Connect an app. With credentials, a native credential-based app is created, verified against the provider, and activated in this one call; a SaaS keys app has its credentials stored and is active immediately, though nothing calls the vendor, so they are not validated until the first action run. Without credentials, OAuth apps return a connect_url for the user to authorize in a browser. Parameters: Returns: { app, integration_id, status, connect_url?, next_step }status is active when connected immediately, pending when browser authorization is needed.

erdo_check_integration_connection

Check whether an app is connected. For browser-authorized apps this also completes any connection the user finished since erdo_connect_integration was called — poll it after the user opens the connect_url. An app that has never been connected answers connected: false with an empty integrations list; that is an ordinary answer, not an error. Parameters:

erdo_discover_integration_tables

Discover what a connected database integration exposes. Without schema_name, lists the selectable schemas (all SQL databases and warehouses); with it, lists that schema’s tables with columns — supported for SQL databases (Postgres, MySQL, and compatible); warehouses (BigQuery, Snowflake, ClickHouse) list schemas but not per-table columns here. Use before erdo_create_integration_dataset. Parameters:

erdo_create_integration_dataset

Create a dataset backed by any connected integration that exposes queryable data. Database and warehouse integrations may query live; sync-capable API integrations automatically materialize their provider resources through Erdo’s data platform. Integrations that expose selectable scopes require a schemas selection (some allow only one); integrations with neither a direct query path nor dataset sync are rejected. Resource/column discovery runs in the background and the schema appears after discovery or the first sync. Parameters: Returns: { dataset_id, slug, name, status }

erdo_configure_integration_dataset

Update an existing integration dataset using provider-declared segments rather than provider-specific campaign, account, or schema endpoints. Optionally enables the canonical data-platform sync; no snapshot dataset is created. Parameters: Returns: { dataset_id, status, sync_enabled, segments }

Thread & Conversation Tools

erdo_list_threads

List conversation threads with name, creation date, and visibility. Parameters:

erdo_get_thread_messages

Get all messages from a conversation thread including content and metadata. Content items preserve ui_content_type and created_by_invocation_id so MCP clients can render the same tool activity and generated UI as Erdo. Parameters:

erdo_create_thread

Create a new conversation thread, optionally with datasets attached. Parameters:

erdo_send_message

Send a message to a thread and get an AI-generated response. The message is processed by an AI agent that can analyze data, write SQL, generate charts, and more.
This tool can take 30 seconds to 2 minutes depending on the question complexity.
Parameters: Returns: The thread ID, message ID, status, and the agent’s answer.

Knowledge Tools

Knowledge records store durable context (snippet) or reusable instructions (skill) that Erdo’s agents read in future conversations. Use these to teach the workforce your definitions, rules, and procedures.

erdo_create_knowledge

Create a new Knowledge record or skill. Parameters:

erdo_search_knowledge

Search Knowledge records and skills by semantic similarity. Parameters:

erdo_list_knowledge

List Knowledge records and skills with optional filtering. Parameters:

erdo_delete_knowledge

Delete a Knowledge object by ID (soft delete — can be recovered). Parameters:

erdo_set_knowledge_visibility

Set a Knowledge object’s visibility: workspace keeps it organization-internal (the default), public opts it into anonymous external surfaces such as the website voice widget — a draft is approved in the same step and goes live immediately. Only make non-sensitive, customer-facing facts public. Parameters:

KV (Collection) Tools

KV stores are Erdo’s shared key/value store — named, org-level stores (also called collections) holding config and values (pricing, targets, brand tokens) that stay consistent everywhere. The same stores are read by pages (erdo.kv, aliased erdo.collections), referenced from Knowledge bodies as {{slug.key}}, and reachable from the agent runtime — one store, one source of truth. Values are any JSON type. Pages also get a private, lazily-provisioned KV store of their own; these tools operate on named stores shared across pages and knowledge.

erdo_list_kv_stores

List the organization’s named KV stores with their slug and item count. Parameters: none.

erdo_get_kv_item

Read one value from a named KV store by key. Use for shared config/metrics that should be consistent everywhere rather than hardcoding values. Parameters: Returns: { key, value, found }.

erdo_set_kv_item

Write one value (any JSON type) to a named KV store by key — the canonical value everything references. Requires write (EDIT) access on the store. Reference it from Knowledge prose as {{kv_slug.key}} so it stays current everywhere. Parameters:

erdo_create_kv_store

Create a named KV store — a shared key/value store for config and values referenced across pages and knowledge. Parameters:

erdo_delete_kv_item

Delete one value from a named KV store by key. Requires write (EDIT) access on the store. Deleting a key that doesn’t exist is a no-op. Parameters:

Artifact Tools

Artifacts are AI-generated outputs from agent runs and automations — insights, charts, metrics, alerts, and suggestions.

erdo_list_artifacts

List artifacts with optional type filtering. Parameters:

erdo_get_artifact

Get full details of a specific artifact including its content, metadata, and severity. Parameters:

Media Tools

erdo_screenshot

Capture a screenshot of a web page and get back a signed, time-limited download URL for the PNG, plus its dimensions. Use this when you need the image file. By default it renders a public URL (a marketing site, a published Erdo page at https://pages.erdo.ai/p/{id}, a competitor page). Pass instructions to capture a page that requires logging in first — the capture runs asynchronously (returns a job_id with status: "processing"); poll erdo_screenshot_result with that job_id until it’s done. Parameters: Returns signed_url, bucket_key, media_type, width, height, and expires_at (or job_id + status for an instructed capture — fetch the result with erdo_screenshot_result).

erdo_screenshot_result

Poll an instructed (async) capture started by erdo_screenshot. Pass the job_id it returned. Parameters: Returns the same shape as erdo_screenshot once status is done (signed_url, bucket_key, media_type, dimensions, expires_at); processing means try again shortly, error includes an error message.

erdo_upload_image

Upload an image so it can be attached to a data question via erdo_ask_data_question. Pass the raw bytes as standard base64. Accepts PNG, JPEG, WEBP, or GIF, up to 5 MB. Parameters: Returns { bucket_key, media_type, width, height } — pass bucket_key in the images array of erdo_ask_data_question.

Agent Run Tools

Agent runs are the record of what agents have done — the runs behind erdo_ask_data_question, erdo_send_message, and automations.

erdo_list_agent_runs

List agent runs, filterable by agent or thread or status. Parameters:

erdo_get_agent_run

Get one agent run: status, agent, output, and trace metadata. Parameters:

Approval Tools

Approval requests are actions an agent paused on, awaiting a human decision. See Approvals.

erdo_list_approvals

List approval requests, filterable by status. Parameters:

erdo_decide_approval

Approve or reject a pending approval request so the paused agent run can continue (or be rejected). Parameters:

Decision Tools

The decision record: what your organization committed to, whether the change actually happened, and what the evidence said afterwards. See Decisions.

erdo_list_decisions

Search the decision record. Filters compose with AND, and an unrecognised value in a closed vocabulary is refused rather than ignored. Parameters:

erdo_get_decision

Read one decision in full: the commitment and its rationale, who decided it and under what authority, every exact action with how it ended, every declared effect with the evidence that settled it, and supersession in both directions. Parameters:

erdo_decision_scorecard

Raw aggregates with their denominators, stratified by decision class and evidence kind. No eligibility verdict, and no single pooled “worked rate” — deterministic confirmation, experimental results and observational movement are counted and labelled separately. Parameters:

Page Deploy Tools

Deploy HTML pages/apps to Erdo from any coding agent. Pages run in the Erdo page runtime: window.erdo gives them governed access to the datasets you grant, and the default react-tailwind runtime provides React 18, Tailwind, and the Erdo UI components (DatasetChart, DatasetTable, …). A deploy with validation errors still saves and reports them — fix with erdo_update_page and iterate until clean.

erdo_deploy_page

Deploy a new page and get back its URL plus structured validation results. Pages are private by default. Parameters: Returns: { id, title, url, public_url?, public, thread_id, validation }. url is the authenticated editor view; public_url is the visitor-facing share link (present while public). Use the returned URLs verbatim — hosts differ per environment.
dataset_slugs / kv_slugs grant read; writable_dataset_slugs / writable_kv_slugs grant write. erdo.insertRows and writes to a named KV store only work when the matching writable grant was declared at deploy — otherwise they return a permission error. The page’s own private KV store and submitEvent (pipelines) need no write grant. See Build Apps.

erdo_update_page

Update a deployed page. Provided fields are merged — send only js to fix a script without resending html/css. Returns fresh validation results. Parameters:

erdo_validate_page

Dry-run validation without deploying anything: HTML structure, JS/JSX syntax and runtime smoke checks, window.erdo usage, and dataset-slug references. Real data queries are additionally probed on actual deploy/update. Parameters: same content fields as erdo_deploy_page (html, css, js, runtime, dataset_slugs).

Automation Tools

Heartbeats are recurring agents that analyze your data on a schedule and generate insights, alerts, and reports.

erdo_list_heartbeats

List heartbeat automations with their schedule, state, and latest execution status. Parameters:

erdo_create_heartbeat

Create a recurring automation that analyzes your data on a schedule. Parameters:

erdo_run_heartbeat

Manually trigger a heartbeat to run immediately, outside its normal schedule. Parameters:

erdo_set_heartbeat_state

Enable or disable a heartbeat automation. Set it to disabled to pause a misbehaving automation so it stops running, or active to resume it. Parameters:

erdo_list_heartbeat_executions

List recent executions of a heartbeat with status, timing, and associated thread. Parameters:

REST API

All MCP tools are also available as REST endpoints for direct HTTP integration. Use these when you don’t need the full MCP protocol (e.g. from LangChain, Vercel AI SDK, or custom scripts). Base URL: https://api.erdo.ai Authentication: Pass Authorization: Bearer YOUR_API_KEY header. The organization is inferred from your API key.

Endpoint Reference

Data Endpoints

Integration Endpoints

Thread & Conversation Endpoints

erdo_send_message accepts optional context for application state that should guide this turn without being stored as the visible user message. Use message for the operator’s exact words and context for the current page, selection, or other structured facts. The thread list includes the creator’s identity and the creation source; unnamed threads are titled from their first user message. Sent messages retain the authenticated user’s authorship in the transcript. Message reads include that user’s canonical ID, name, and email when the user is still in the organization.

Knowledge Endpoints

KV (Collection) Endpoints

Artifact Endpoints

Page Deploy Endpoints

Automation Endpoints

Agent Run Endpoints

Approval Endpoints

Decision Endpoints

Manager Account Endpoints

Operate many client orgs from one credential — see Manager accounts. Manager-key creation is REST/CLI/Platform only. It is intentionally not exposed as an MCP tool because the raw non-expiring credential must remain on a human-driven surface. Evals, Workstreams, and Experiments have their own REST endpoints — see Evals, Workstreams, and Experiments.

Examples

Scoped Tokens & External Users

When building your own app on top of Erdo, you’ll want your end-users to interact with Erdo without giving them full access to your organization. Scoped tokens solve this — they restrict access to specific datasets and threads that you choose. All tools work with scoped tokens. Each tool automatically scopes results to the resources the token has access to. Create scoped tokens via the TypeScript SDK using createToken():

How scoping works

Scoped tokens are designed for your customers’ end-users. For your own team members, use organization API keys which have full access to all tools and org-wide visibility.

Building Apps with Erdo MCP

Beyond AI assistants, you can integrate Erdo’s MCP server into your own applications:
  • Vercel AI SDK — Connect any LLM to Erdo tools with rich chart and table rendering in React
  • REST API (above) — Direct HTTP integration without MCP
  • Any MCP client — Use the Custom App tab above to connect from TypeScript, Python, Go, or any language with an MCP client library