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:
{
  "mcpServers": {
    "erdo": {
      "url": "https://api.erdo.ai/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

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:
ParameterTypeDescription
limitnumberOptional. Max results (default 20).

erdo_search_datasets

Search datasets by name or description. Parameters:
ParameterTypeDescription
querystringSearch text
limitnumberOptional. Max results (default 20).

erdo_get_dataset_schema

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

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:
ParameterTypeDescription
dataset_slugsstring[]Optional. Specific dataset IDs or slugs. Empty returns all.
limitnumberOptional. Max datasets to return (default 10).

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:
ParameterTypeDescription
dataset_slugstringDataset UUID or slug
limitnumberOptional. Max rows to return.

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:
ParameterTypeDescription
dataset_slugstringDataset UUID or slug to query
querystringSQL query to execute
limitnumberOptional. Max rows to return (default 100).

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:
ParameterTypeDescription
questionstringNatural language question, e.g. “show top 10 customers by revenue”
dataset_slugstringDataset UUID or slug to query
Returns: The generated SQL query and the results.

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:
ParameterTypeDescription
questionstringThe data question to answer
dataset_slugsstring[]Optional. Dataset slugs to scope the question to.
timezonestringOptional. User timezone (e.g. America/New_York).
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:
ParameterTypeDescription
chart_typestringChart type: bar, line, pie, histogram, or scatter
chart_titlestringTitle for the chart
x_axisobjectX-axis configuration (label, key, format, value_type)
y_axesobject[]Y-axis configurations
seriesobject[]Data series, each with dataset_slug, key, sql_query, resource_key
data_reductionobjectData reduction strategy (none, sample, aggregate, bin)
stackedbooleanWhether to stack bars (for bar charts)
sortobject[]Sort conditions

erdo_render_table

Render a data table. The table fetches data directly from the dataset. Parameters:
ParameterTypeDescription
table_titlestringTitle for the table
dataset_slugstringDataset slug
columnsobject[]Column definitions (column_name, key, format, value_type)
sql_querystring | nullOptional SQL query to filter/transform data
resource_keystring | nullRequired for file datasets (CSV/Excel)

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:
ParameterTypeDescription
namestringName for the dataset
descriptionstringOptional. Description.
instructionsstringOptional. Instructions for AI agents analyzing this dataset.
Returns: The created dataset with id, slug, name, type, and status.

erdo_delete_dataset

Delete a dataset and all its data. This is permanent. Parameters:
ParameterTypeDescription
dataset_slugstringDataset UUID or slug to delete

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:
ParameterTypeDescription
dataset_slugstringDataset slug to write to
rowsobject[]Array of row objects (column name → value)
key_columnstringOptional. Column for upsert (update on conflict).
Returns: { rows_affected: number }

erdo_delete_rows

Delete rows from a dataset. Not supported for file datasets (CSV). Parameters:
ParameterTypeDescription
dataset_slugstringDataset slug to delete from
key_columnstringOptional. Column to match keys against.
keysstring[]Optional. Key values to delete. If empty, deletes all rows.
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:
ParameterTypeDescription
dataset_slugstringDataset UUID or slug
operationsobject[]Schema operations to apply atomically
Operation object:
FieldTypeDescription
typestringadd_column, remove_column, rename_column, or alter_column_type
columnstringTarget column name
new_namestringNew name (for rename_column only)
column_typestringType hint: text, integer, float, date, boolean (for add_column and alter_column_type)
Returns: { columns_added, columns_removed, columns_renamed, columns_retyped, current_columns }

Thread & Conversation Tools

erdo_list_threads

List conversation threads with name, creation date, and visibility. Parameters:
ParameterTypeDescription
limitnumberOptional. Max results (default 20).

erdo_get_thread_messages

Get all messages from a conversation thread including content and metadata. Parameters:
ParameterTypeDescription
thread_idstringThread UUID

erdo_create_thread

Create a new conversation thread, optionally with datasets attached. Parameters:
ParameterTypeDescription
namestringOptional. Thread name.
dataset_idsstring[]Optional. Dataset UUIDs to attach.

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:
ParameterTypeDescription
thread_idstringThread UUID
messagestringThe message to send
agent_keystringOptional. Agent to use (default: erdo.data-question-answerer). Use erdo.data-analyst for deeper analysis.
timezonestringOptional. User timezone (e.g. America/New_York).
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:
ParameterTypeDescription
titlestringShort title for the record
contentstringThe main content or instructions
descriptionstringBrief description of what this record does
typestringsnippet (knowledge) or skill (reusable instructions). Defaults to snippet.
categorystringOptional. Category (e.g. “Data Analysis”, “SQL”).
tagsstring[]Optional. Tags for organization.
dataset_idsstring[]Optional. Associated dataset UUIDs.

erdo_search_knowledge

Search Knowledge records and skills by semantic similarity. Parameters:
ParameterTypeDescription
querystringSearch text
limitnumberOptional. Max results (default 10, hard cap 100).

erdo_list_knowledge

List Knowledge records and skills with optional filtering. Parameters:
ParameterTypeDescription
typestringOptional. Filter by snippet or skill.
categorystringOptional. Filter by category.
limitnumberOptional. Max results (default 20, hard cap 100).
offsetnumberOptional. Pagination offset.

erdo_delete_knowledge

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

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:
ParameterTypeDescription
kv_slugstringSlug of the KV store
keystringItem key to read
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:
ParameterTypeDescription
kv_slugstringSlug of the KV store to write to
keystringItem key to set
valueanyValue to store — string, number, boolean, object, or array

erdo_create_kv_store

Create a named KV store — a shared key/value store for config and values referenced across pages and knowledge. Parameters:
ParameterTypeDescription
slugstringSlug for the new KV store (lowercase letters, digits, hyphens)

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:
ParameterTypeDescription
kv_slugstringSlug of the KV store to delete from
keystringItem key to delete

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:
ParameterTypeDescription
typestringOptional. Filter by: insight, chart, metric, alert, table, suggestion.
limitnumberOptional. Max results (default 20).
offsetnumberOptional. Pagination offset.

erdo_get_artifact

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

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:
ParameterTypeDescription
urlstringhttp(s) URL to capture.
instructionsstringOptional. Steps to perform before the shot (e.g. sign in). Triggers an async capture.
full_pagebooleanOptional. Capture the whole scrollable page (default true); set false for just the viewport.
widthnumberOptional. Viewport width in px (default 1440). Use ~390 for a phone.
heightnumberOptional. Viewport height in px (default 900).
color_schemestringOptional. light/dark — emulates the OS theme for public pages that follow system theme. Ignored for signed-in captures (use local_storage).
device_scale_factornumberOptional. Pixel density 1–3 (default 2).
local_storageobjectOptional. localStorage entries set before the page loads, then reloaded. The reliable way to theme a signed-in capture — pass {"theme": "dark"} to render the app in dark mode.
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:
ParameterTypeDescription
job_idstringThe job_id returned by an instructed erdo_screenshot call.
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:
ParameterTypeDescription
image_base64stringStandard base64-encoded image bytes.
media_typestringimage/png, image/jpeg, image/webp, or image/gif.
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:
ParameterTypeDescription
agent_keystringOptional. Filter by agent, e.g. erdo.artifact-builder (mutually exclusive with thread_id).
thread_idstringOptional. Filter to one thread (mutually exclusive with agent_key).
limitnumberOptional. Max runs (default 50).
offsetnumberOptional. Pagination offset.

erdo_get_agent_run

Get one agent run: status, agent, output, and trace metadata. Parameters:
ParameterTypeDescription
run_idstringAgent run id (from erdo_list_agent_runs).

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:
ParameterTypeDescription
titlestringPage title shown in Erdo.
htmlstringHTML content — full document or fragment. With react-tailwind, include a root element and put React code in js.
cssstringOptional stylesheet.
jsstringOptional JavaScript/JSX.
runtimestringOptional. react-tailwind (default) or none.
dataset_slugsstring[]Optional. Datasets the page reads via window.erdo.queryDataset — granted read access on each.
writable_dataset_slugsstring[]Optional. Datasets the page may append to via window.erdo.insertRows — granted write access on each (you must hold edit).
kv_slugsstring[]Optional. Named KV stores (collections) the page reads via erdo.kv.get/list — granted read access on each.
writable_kv_slugsstring[]Optional. Named KV stores the page may write via erdo.kv.set/delete — granted edit access on each.
publicbooleanOptional. Make the page publicly viewable at its share URL immediately (default: private).
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:
ParameterTypeDescription
page_idstringPage ID from erdo_deploy_page or erdo_list_artifacts.
titlestringOptional. New title.
htmlstringOptional. New HTML.
cssstringOptional. New stylesheet.
jsstringOptional. New JavaScript/JSX.
dataset_slugsstring[]Optional. Replacement read-dataset list.
writable_dataset_slugsstring[]Optional. Replacement writable-dataset list ([] clears it).
kv_slugsstring[]Optional. Replacement read KV-store list.
writable_kv_slugsstring[]Optional. Replacement writable KV-store list.
publicbooleanOptional. true shares publicly, false reverts to private.

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:
ParameterTypeDescription
limitnumberOptional. Max results (default 20).
offsetnumberOptional. Pagination offset.

erdo_create_heartbeat

Create a recurring automation that analyzes your data on a schedule. Parameters:
ParameterTypeDescription
namestringName for the automation
instructionsstringInstructions for the agent to follow on each run
interval_minutesnumberHow often to run (minimum 5 minutes)
descriptionstringOptional. What this automation does.
timezonestringOptional. Timezone for scheduling (default UTC).
active_window_startstringOptional. Only run after this time (24h format, e.g. 09:00).
active_window_endstringOptional. Only run before this time (e.g. 18:00).
active_daysnumber[]Optional. Days of week to run (0=Sun..6=Sat). Omit for every day.
dataset_idsstring[]Optional. Dataset UUIDs to analyze.
effortstringOptional. Agent effort: low, medium, or high.

erdo_run_heartbeat

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

erdo_list_heartbeat_executions

List recent executions of a heartbeat with status, timing, and associated thread. Parameters:
ParameterTypeDescription
heartbeat_idstringHeartbeat UUID
limitnumberOptional. Max results (default 10).

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

MCP ToolREST EndpointMethod
erdo_list_datasets/v1/datasetsGET
erdo_search_datasets/v1/datasets-searchGET
erdo_get_dataset_schema/v1/datasets/:id/schemaGET
erdo_gather_dataset_context/v1/dataset-contextGET
erdo_fetch_dataset_contents/v1/datasets/:slug/fetchPOST
erdo_run_query/v1/datasets/:slug/queryPOST
erdo_query_data/v1/datasets/:slug/query-nlPOST
erdo_ask_data_question/v1/askPOST
erdo_render_chart/v1/render/chartPOST
erdo_render_table/v1/render/tablePOST
erdo_screenshot/v1/screenshotPOST
erdo_screenshot_result/v1/screenshot/resultPOST
erdo_upload_image/v1/images/uploadPOST
erdo_create_dataset/v1/datasets-createPOST
erdo_delete_dataset/v1/datasets/:slugDELETE
erdo_write_rows/v1/datasets/:slug/rowsPOST
erdo_delete_rows/v1/datasets/:slug/rowsDELETE
erdo_update_dataset_schema/v1/datasets/:slug/schemaPOST

Thread & Conversation Endpoints

MCP ToolREST EndpointMethod
erdo_list_threads/v1/threadsGET
erdo_get_thread_messages/v1/threads/:id/messagesGET
erdo_create_thread/v1/threads-createPOST
erdo_send_message/v1/threads/:id/sendPOST

Knowledge Endpoints

MCP ToolREST EndpointMethod
erdo_create_knowledge/v1/knowledgePOST
erdo_search_knowledge/v1/knowledge-searchGET
erdo_list_knowledge/v1/knowledgeGET
erdo_delete_knowledge/v1/knowledge/:idDELETE

KV (Collection) Endpoints

MCP ToolREST EndpointMethod
erdo_list_kv_stores/v1/kvGET
erdo_create_kv_store/v1/kvPOST
erdo_get_kv_item/v1/kv/:slug/items/:keyGET
erdo_set_kv_item/v1/kv/:slug/items/:keyPUT
erdo_delete_kv_item/v1/kv/:slug/items/:keyDELETE

Artifact Endpoints

MCP ToolREST EndpointMethod
erdo_list_artifacts/v1/artifactsGET
erdo_get_artifact/v1/artifacts/:idGET

Page Deploy Endpoints

MCP ToolREST EndpointMethod
erdo_deploy_page/v1/pagesPOST
erdo_update_page/v1/pages/:idPUT
erdo_validate_page/v1/pages/validatePOST

Automation Endpoints

MCP ToolREST EndpointMethod
erdo_list_heartbeats/v1/heartbeatsGET
erdo_create_heartbeat/v1/heartbeatsPOST
erdo_run_heartbeat/v1/heartbeats/:id/runPOST
erdo_list_heartbeat_executions/v1/heartbeats/:id/executionsGET

Agent Run Endpoints

MCP ToolREST EndpointMethod
erdo_list_agent_runs/v1/runsGET
erdo_get_agent_run/v1/runs/:runIDGET
Evals, Workstreams, and Experiments have their own REST endpoints — see Evals, Workstreams, and Experiments.

Examples

# List datasets
curl https://api.erdo.ai/v1/datasets?limit=5 \
  -H "Authorization: Bearer YOUR_API_KEY"

# Ask a data question
curl -X POST https://api.erdo.ai/v1/ask \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"question": "What were total sales last quarter?"}'

# Create a knowledge record
curl -X POST https://api.erdo.ai/v1/knowledge \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Revenue analysis", "content": "Always compare to YoY when analyzing revenue", "description": "Revenue analysis best practice", "type": "skill"}'

# Set a shared KV value (the canonical number everything references)
curl -X PUT https://api.erdo.ai/v1/kv/pricing/items/monthly \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"value": "$29"}'

# Read it back
curl https://api.erdo.ai/v1/kv/pricing/items/monthly \
  -H "Authorization: Bearer YOUR_API_KEY"

# Write rows to a dataset
curl -X POST https://api.erdo.ai/v1/datasets/my-org.metrics/rows \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"rows": [{"date": "2025-03-17", "revenue": 42300, "orders": 156}], "key_column": "date"}'

# Delete rows from a dataset
curl -X DELETE https://api.erdo.ai/v1/datasets/my-org.metrics/rows \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key_column": "date", "keys": ["2025-03-17"]}'

# Create a heartbeat automation
curl -X POST https://api.erdo.ai/v1/heartbeats \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Daily revenue check", "instructions": "Check revenue for anomalies", "interval_minutes": 60}'

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():
const token = await erdo.createToken({
  datasetIds: ['dataset-uuid-1', 'dataset-uuid-2'],
  threadIds: ['thread-uuid-1'],
});

// Pass this token to your end-user's MCP client
const transport = new StreamableHTTPClientTransport(
  new URL('https://api.erdo.ai/mcp'),
  {
    requestInit: {
      headers: { 'Authorization': `Bearer ${token}` },
    },
  },
);

How scoping works

Tool categoryScoped token behavior
Data tools (list, search, query, render, write, delete)Only datasets included in the token scope. Write/delete requires edit permission.
Thread tools (list, read, create, send)Only threads in the token scope + threads they create. New threads are private to the user.
Knowledge tools (create, search, list, delete)Users create personal Knowledge records (not org-wide). Search/list returns their own records + public ones. Delete only works on their own records.
KV tools (list, get, set, create)Only KV stores the token holds access to. set/create require an EDIT grant.
Artifact tools (list, get)Only artifacts from their organization
Automation tools (create, run, list)Users create personal heartbeats (not visible to org). List/run only shows their own heartbeats.
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