Generic MCP
Connect any MCP-compatible client (Windsurf, Cline, Continue, JetBrains MCP, …) to MemClaw.
Any client that implements Model Context Protocol can use MemClaw. The MCP server is mounted directly on core-api at /mcp. Use the URL of whatever deployment you're connecting to:
- Managed:
https://memclaw.net/mcp - Staging:
https://memclaw.net/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": {
"memclaw": {
"url": "https://memclaw.net/mcp",
"headers": { "X-API-Key": "mc_xxx" }
}
}
}
This is the HTTP / Streamable-HTTP transport. Most modern MCP clients (Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Continue) support it.
Tools exposed
The full memclaw_* tool list lives in /docs/agents (rendered verbatim from upstream SKILL.md). Current surface from the OSS source:
memclaw_recall · memclaw_write · memclaw_manage · memclaw_list · memclaw_doc · memclaw_entity_get · memclaw_tune · memclaw_insights · memclaw_evolve · memclaw_stats · memclaw_keystones · memclaw_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.