| title | MCP Server |
|---|
Expose uteke memories as tools to AI coding agents β Claude Code, Claude Desktop, Cursor, Copilot, and any MCP-compatible client.
No daemon needed β uteke-mcp communicates over stdin/stdout:
Requires uteke-serve running. Uses Streamable HTTP transport:
{
"mcpServers": {
"uteke": {
"url": "http://127.0.0.1:8767/mcp"
}
}
}Create or edit .mcp.json in your project root, or ~/.claude/settings.json for global access:
// Stdio (recommended)
{
"mcpServers": {
"uteke": {
"command": "uteke-mcp"
}
}
}// HTTP (requires uteke-serve)
{
"mcpServers": {
"uteke": {
"url": "http://127.0.0.1:8767/mcp"
}
}
}Create or edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"uteke": {
"command": "uteke-mcp"
}
}
}Create or edit .cursor/mcp.json in your project root:
{
"mcpServers": {
"uteke": {
"command": "uteke-mcp"
}
}
}Register uteke as an MCP server with the Hermes native client:
# Stdio transport
hermes mcp add uteke --command uteke-mcp
# HTTP transport (requires uteke-serve running)
hermes mcp add uteke --url http://127.0.0.1:8767/mcpThe MCP server exposes uteke as tools β the agent decides when to call uteke_recall, uteke_remember, etc. This means:
- β On-demand: The agent calls memory tools only when needed (e.g., "recall project context before coding")
- β Agent-controlled: The agent decides what to store and when to query
- β No auto recall: Memories are NOT automatically injected every turn
- β No auto extract: Facts are NOT automatically extracted from conversations
If you need automatic recall (memories injected every LLM call without the agent asking), use Mode C (shell hook) instead:
uteke init --agent hermes # Installs pre_llm_call hook| Need | Use This | How |
|---|---|---|
| On-demand memory, coding agents | MCP (this page) | uteke-mcp or POST /mcp |
| Automatic recall every turn | Mode C (shell hook) | uteke init --agent hermes |
| Automatic recall + auto extract | β Deprecated (removed 2026-06-29) | |
| Multi-agent shared rooms | MCP + Mode C combo | Mode C for auto recall, MCP for room operations |
Tip: MCP and Mode C work great together. Use Mode C for automatic recall on every LLM call, and MCP for explicit tool-based operations like
uteke_doc_create,uteke_graph, oruteke_room_recall.
Both transports expose the same 29 tools (MCP protocol version 2025-06-18):
| Tool | Description |
|---|---|
uteke_remember |
Store a memory (supports type, room, author, tags) |
uteke_recall |
Semantic search (supports tags filter, min_score) |
uteke_search |
Text search with optional tag filter |
uteke_list |
List memories (supports pagination via offset) |
uteke_forget |
Delete a memory |
uteke_stats |
Memory store statistics |
uteke_context |
AI-optimized context output for prompts |
uteke_dream |
One-command maintenance pipeline (lint β backlinks β dedup β orphans) |
uteke_doc_create |
Create a document (wiki/knowledge base entry) |
uteke_doc_get |
Retrieve a document by ID |
uteke_doc_list |
List all documents |
uteke_doc_search |
Search documents |
uteke_doc_delete |
Delete a document |
uteke_doc_update |
Partial document update with chunk rebuild (#589) |
uteke_doc_move |
Move document to new parent (#438) |
uteke_graph |
Get nodes + edges JSON for visualization |
uteke_graph_add_edge |
Create a typed edge between two memories (#542) |
uteke_graph_remove_edge |
Remove an edge between two memories (#542) |
uteke_room_recall |
Semantic recall within a room |
uteke_room_memories |
List memories in a room (#569) |
uteke_room_create |
Create a room |
uteke_room_delete |
Delete a room |
uteke_room_stats |
Room statistics |
uteke_room_summary |
Room topic summary (tag clustering, no LLM) |
uteke_room_document |
Generate structured document from room |
uteke_tags_list |
List all tags with counts (#566) |
uteke_tags_rename |
Rename a tag across all memories (#566) |
uteke_tags_delete |
Delete a tag from all memories (#566) |
uteke_pin |
Pin a memory (prevent decay) (#566) |
uteke_unpin |
Unpin a memory (#566) |
| Stdio | HTTP | |
|---|---|---|
| Binary | uteke-mcp |
uteke-serve |
| Daemon needed | No | Yes |
| Remote access | No | Yes |
| Protocol | JSON-RPC over stdin/stdout | Streamable HTTP (POST /mcp) |
| Best for | Local agents, single machine | Shared/team, remote access |
Tip: HTTP transport is recommended when
uteke-serveis already running β it avoids subprocess overhead and works across machines. Stdio transport is simpler for local, single-agent setups where no daemon is desired.
When uteke-serve runs on a VPS or remote server, your local MCP client connects over HTTP:
# On the server β start uteke-serve with auth enabled
UTEKE_AUTH_TOKEN=your-secret uteke-serve --host 0.0.0.0 --port 8767Note: In production, use environment variables for tokens β never commit secrets to config files. Some clients support env var substitution (e.g.,
$UTEKE_AUTH_TOKEN).
// Claude Code β .mcp.json
{
"mcpServers": {
"uteke": {
"url": "https://uteke.yourdomain.com/mcp",
"headers": {
"Authorization": "Bearer your-secret"
}
}
}
}// Claude Desktop
{
"mcpServers": {
"uteke": {
"url": "https://uteke.yourdomain.com/mcp",
"headers": {
"Authorization": "Bearer your-secret"
}
}
}
}// Cursor
{
"mcpServers": {
"uteke": {
"url": "https://uteke.yourdomain.com/mcp",
"headers": {
"Authorization": "Bearer your-secret"
}
}
}
}docker run -d --name uteke \
-p 8767:8767 \
-e UTEKE_AUTH_TOKEN=your-secret \
-v uteke-data:/data \
ghcr.io/codecoradev/uteke:latestPoint your MCP client at http://YOUR_VPS_IP:8767/mcp (or use a domain with TLS β see below).
For HTTPS with a domain, use a reverse proxy (Caddy, Nginx, or Cloudflare Tunnel) in front of uteke-serve:
# uteke-serve still on localhost β the proxy handles TLS
UTEKE_AUTH_TOKEN=your-secret uteke-serve --host 127.0.0.1 --port 8767See TLS & Reverse Proxy for full setup guides (Caddy, Nginx, Cloudflare Tunnel).
| Setting | Value | Why |
|---|---|---|
--host |
127.0.0.1 (local) or 0.0.0.0 (remote) |
Bind to localhost unless you need remote access |
UTEKE_AUTH_TOKEN |
Set a strong token | Required for remote access β without it, anyone can read/write your memories |
| TLS | Use reverse proxy + HTTPS | Encrypts traffic in transit β strongly recommended for remote setups |
| Firewall | Allow only port 8767/tcp | Restrict access at the network level |
The MCP server uses the default namespace by default. Each agent can use its own isolated namespace by passing a namespace argument to any tool call. Memories in one namespace are never visible to another.
This is the MCP equivalent of the CLI's --namespace flag β see Multi-Agent Isolation for details.
The MCP server implements strict JSON-RPC 2.0 compliance (v0.6.7):
- Tagged union responses: The
resultfield uses a tagged union ({"type": "result", "content": [...]}) per the MCP spec, not a bare array. - No notification response: JSON-RPC notifications (requests without
id) receive no response body, as required by the spec. This fixes Claude Code connectivity issues where unexpected responses on notifications caused handshake failures. - Claude Code compatible: Tested and verified with Claude Code, Claude Desktop, Cursor, and Hermes MCP client.
For automatic recall (memories injected every LLM call without the agent asking), use the --memory-provider flag with uteke init:
# pi (pi.dev)
uteke init --agent pi --memory-provider
# Claude Code
uteke init --agent claude --memory-provider
# Cursor
uteke init --agent cursor --memory-providerThis installs uteke as the agent's default memory provider β relevant memories are recalled and injected automatically every turn. No MCP server needed; talks to the uteke binary directly.
Note: The
--memory-providerflag is only deprecated for Hermes (removed 2026-06-29). For pi, Claude Code, and Cursor, it is the recommended integration mode.
When running uteke in Docker, both transports are available:
- HTTP: Start the container normally β the MCP endpoint is at
http://localhost:8767/mcpvia port mapping. - Stdio: Use
--entrypoint uteke-mcpto run the MCP binary directly inside the container.
See Docker guide β MCP for full Docker-specific configuration and examples.
| Problem | Solution |
|---|---|
uteke-mcp: command not found |
Run install.sh or cargo install -p uteke-mcp to install the binary |
Permission denied |
chmod +x $(which uteke-mcp) or ensure the binary is on your PATH |
Connection refused (HTTP) |
Ensure uteke-serve is running: uteke-serve |
| Client can't see tools | Verify the MCP config JSON is valid and the client has been restarted |
| Slow first query | The embedding model (~188MB) downloads on first use β subsequent calls are ~30ms |
See also: Architecture β MCP Transport