API & MCP
MCP server
eli.ai doesn't just consume MCP servers (Tools, MCP & HITL) — it is one. Any MCP client — Claude, an IDE agent, another platform — connects to your workspace over streamable HTTP and gets the knowledge graph and the governed data layer as native tools, under the same RLS scoping and provenance as everything else.
Endpoint & auth
The server lives at POST /api/mcp (streamable-HTTP transport). Authentication is the same workspace or user API key as /api/v1:
The transport resolves exactly one workspace before constructing the server; every tool call executes under that workspace's row-level security. User keys with more than one possible workspace send X-Workspace-Id. There is no workspace field in a model-supplied tool input. See Authentication for creating keys and scopes.
Stateless streamable HTTP
Tool catalog
All eight tools are read-only. The fine-grained tools suit agents that orchestrate their own reasoning; eli_query suits clients that want eli.ai to do the whole job and hand back a cited result. Every kb_data_lookup and eli_query data access writes the same append-only data_calls provenance row as any internal call, attributed to the API key.
Resource catalog
Connect from Claude
Claude Code:
Or in an MCP client config file (Claude Desktop, IDEs, and most other clients accept this shape):
Once connected, ask naturally: "Using the eli tools, what do we know about Acme Corp — and what is their current churn risk?" The client will chain kb_entity_lookup → kb_data_discover → kb_data_lookup, or just call eli_query.
Guarantees
- Workspace isolation— the key picks the workspace; FORCE-RLS makes other tenants' rows nonexistent, not forbidden.
- Source ACL enforcement — connector principals are mapped to the caller and enforced before document chunks or document-derived graph context reach a tool result.
- Read-only surface — no tool exposed over MCP writes to the KB or to external systems; data-layer access is single-statement SELECT/WITH through governed components.
- Provenance & attribution — external data access is recorded per call with the exact SQL, params, timing, and status; keyed usage is attributed to its API key exactly like
/api/v1traffic, and the same rate-limit posture applies (Errors & rate limits). - Secrets stay home — connector credentials never appear in tool results; clients see component slugs and descriptions, never connection configs.
Plain HTTP instead?