Generic MCP
Connect any MCP-compatible client (Windsurf, Cline, Continue, JetBrains MCP, …) to Caura.
Any client that implements Model Context Protocol can use Caura. The MCP server is mounted directly on core-api at /mcp. Use the URL of whatever deployment you're connecting to:
- Managed:
https://caura.ai/mcp - Staging:
https://caura.dev/mcp - Self-hosted:
http://localhost:8000/mcp(or wherever your core-api is reachable)
Standard MCP server entry
The snippet below auto-targets this deployment's host.
{
"mcpServers": {
"caura": {
"type": "http",
"url": "https://caura.dev/mcp/",
"headers": { "X-API-Key": "mc_xxx" }
}
}
}
This is the Streamable HTTP transport, and the entry Connect › Get started gives under Other. Clients differ in the details: Claude Code needs the "type": "http" line, and Claude Desktop takes a remote server only through a connector or the mcp-remote shim. Claude Code, Cursor and Claude Desktop each have their exact form.
Tools exposed
The full caura_* tool list lives in /docs/agents (rendered verbatim from upstream SKILL.md). Current surface from the OSS source:
caura_recall · caura_write · caura_manage · caura_list · caura_doc · caura_entity_get · caura_tune · caura_insights · caura_evolve · caura_stats · caura_keystones · caura_keystones_set
For exact parameter schemas, fetch /api/v1/tool-descriptions — that endpoint is generated from the same ToolSpec registry the MCP server uses.
Long-lived integrations: per-agent keys
The single tenant-scoped mc_ flow above is fine for one-off setups. For anything that ships — trust gating, fleet membership, per-agent keystones, real identity in the dashboard — bind each agent to its own agent-scoped credential via Integrations → Per-agent keys. The MCP server accepts the credential on either X-API-Key: mc_… or Authorization: Bearer mc_… — both tenant-scoped and agent-scoped credentials share the mc_ prefix; scope is set at mint time. (Pre-existing mca_… keys continue to authenticate via back-compat.)
Reading MCP tool results
Every MCP tool result has an isError boolean plus a content array. On gateway-side refusals (FORBIDDEN, INVALID_ARGUMENTS, NOT_FOUND, etc.) the server returns isError=True with a JSON {"error": {"code": ..., "message": ..., "details": {...}}} envelope in content[0].text. Always inspect result.isError before treating content as success — the structured envelope tells you exactly what was rejected and why.