Skip to main content
Glama
README.md
# @contextq/mcp

MCP server for ContextQ -- exposes the ContextQ knowledge-management API (89 tools: save, search, ingest, goal graphs, agent sessions, relays, and more) as Model Context Protocol tools. A curated ~24-tool default set loads at connection to keep the token cost of `tools/list` low; the rest load on demand or via `CONTEXT_MCP_TOOL_PROFILE=full` -- see below.

```bash
npx -y @contextq/mcp
```

## Client configuration

Two environment variables are required in every client:

| Variable | Description |
|---|---|
| `CONTEXT_API_URL` | Base URL of your ContextQ server (e.g. `https://ctx.example.com`) |
| `CONTEXT_API_KEY` | API key sent as `Authorization: Bearer` on every request |

Optional:

| Variable | Description |
|---|---|
| `CONTEXT_MCP_TOOL_PROFILE` | `default` (default if unset) loads a curated ~24-tool set at connection, well under most hosts' comfortable tool-list budget; `full` loads all ~89 tools from the start. On `default`, the rest stay reachable via the `ctx_tool_groups` (list) / `ctx_load_tool_group` (load) tools without reconnecting -- see `docs/mcp-tools.md` "Discoverability under ToolSearch deferral" |

**Setup paths**: Claude Code and Claude Desktop have automated setup via the `contextq init` CLI command. Cursor, Windsurf, and Cline require manual config file editing — see `docs/mcp-setup.md` for the full reference.

### Claude Desktop

Add to `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "contextq": {
      "command": "npx",
      "args": ["-y", "@contextq/mcp"],
      "env": {
        "CONTEXT_API_KEY": "sk_live_YOUR_API_KEY",
        "CONTEXT_API_URL": "https://ctx.example.com"
      }
    }
  }
}
```

### Claude Code

```bash
claude mcp add contextq \
  -e CONTEXT_API_KEY=sk_live_YOUR_API_KEY \
  -e CONTEXT_API_URL=https://ctx.example.com \
  -- npx -y @contextq/mcp
```

### Cursor

Add to your Cursor MCP config (`.cursor/mcp.json` or Settings > MCP):

```json
{
  "mcpServers": {
    "contextq": {
      "command": "npx",
      "args": ["-y", "@contextq/mcp"],
      "env": {
        "CONTEXT_API_KEY": "sk_live_YOUR_API_KEY",
        "CONTEXT_API_URL": "https://ctx.example.com"
      }
    }
  }
}
```

### Windsurf

**STATUS (2026-06-02)**: Windsurf was rebranded as Devin Desktop and Cascade was end-of-lifed (2026-07-01). If you have an existing Windsurf install, the configuration below still applies, but new installations should use Devin Desktop instead. Devin Desktop uses the same MCP config format under `.devin/mcp.json`.

Add to your Windsurf MCP config (`.windsurf/mcp.json`):

```json
{
  "mcpServers": {
    "contextq": {
      "command": "npx",
      "args": ["-y", "@contextq/mcp"],
      "env": {
        "CONTEXT_API_KEY": "sk_live_YOUR_API_KEY",
        "CONTEXT_API_URL": "https://ctx.example.com"
      }
    }
  }
}
```

## What data is sent and tenant isolation

- **Only the requests your agent makes are sent.** The MCP server is a stateless proxy -- it forwards each tool call to the ContextQ API via `CONTEXT_API_URL` and returns the response. No telemetry, no background sync, no usage tracking beyond what your ContextQ server logs.
- **Tenant-scoped API keys.** Every ContextQ API key is bound to a single tenant. All `/api/*` endpoints enforce tenant isolation -- an API key can only access the tenant it was issued for. Cross-tenant data leaks are impossible at the API layer.
- **Per-request auth.** Your `CONTEXT_API_KEY` is sent as an `Authorization: Bearer` header on every call. It never appears in tool names, argument schemas, or responses returned to the LLM.

## Client timeout configuration

A handful of ContextQ tools run LLM calls, kNN scans, or bulk DB operations server-side and can legitimately take longer than a typical MCP client's default request timeout. If your client aborts before the server responds, you will see a timeout error that looks like a broken tool — it usually isn't. Configure a longer per-server timeout for this MCP server rather than assuming the tool is hung.

**Slow-class tools** (recommend a longer timeout, e.g. 120000-180000 ms depending on workspace size):

| Tool | Why it's slow |
|---|---|
| `ctx_dream` | Clusters a workspace's contexts via vector similarity, then runs one LLM synthesis call per cluster. |
| `ctx_evolve` | Runs LLM judging over up to 20 nearest-neighbor contexts to decide links/archival. |
| `ctx_ingest` | Fetches/parses a source and runs LLM claim extraction + kNN diffing. Large or URL-sourced ingests already return `{ jobId, statusUrl }` and expect polling via `ctx_ingest_status` — but small inline ingests still run synchronously and can take several seconds. |
| `ctx_regenerate_mocs` | Re-clusters all of a tenant's contexts and runs one LLM synthesis call per cluster (admin scope). |
| `ctx_memory_review_run` | Samples older contexts and asks the LLM to verdict each one (superadmin scope). |
| `ctx_bulk_update` | Applies a lifecycle/archive patch to up to 200 context ids in one call — bounded, but still slower than a single-row update. |
| `ctx_audit_cleanup_run` | Deletes up to 5000 `activity_logs` rows in one pass (superadmin scope). |
| `ctx_snapshot_create` / `ctx_fork_world` / `ctx_diff_world` | Clone or diff a workspace's full memory state (contexts, links, goal graph) — cost scales with workspace size. |

Everything else (`ctx_search`, `ctx_get`, `ctx_save`, `ctx_list`, `agent_*`, `goal_*`, `relay_*`, etc.) is ordinary CRUD/search and should complete well within a default client timeout.

These numbers are starting points, not guarantees — actual latency depends on your ContextQ server's hardware, workspace size, and configured LLM/embedding provider. Measure against your own deployment before tuning tighter.

### `.mcp.json` per-server `request_timeout_ms`

Most MCP clients that support `.mcp.json` (including Claude Code) accept a per-server `request_timeout_ms` to override the client's default request timeout for every tool call on that server:

```json
{
  "mcpServers": {
    "contextq": {
      "command": "npx",
      "args": ["-y", "@contextq/mcp"],
      "env": {
        "CONTEXT_API_KEY": "sk_live_YOUR_API_KEY",
        "CONTEXT_API_URL": "https://ctx.example.com"
      },
      "request_timeout_ms": 120000
    }
  }
}
```

`request_timeout_ms` applies per server, not per tool — if you regularly call slow-class tools, size it for the slowest one you expect to hit, not the average. Claude Code 2.1.206 fixed a bug where this field was silently ignored (a 60s default was applied regardless); confirm your Claude Code version is at least 2.1.206 if the setting doesn't seem to take effect.

### Claude Code idle timeout

Independently of `request_timeout_ms`, Claude Code (2.1.187+) also enforces `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` — an idle-abort timeout (default around 5 minutes) that fires if an MCP tool call produces no activity for that long. Set it in your shell environment (not `.mcp.json`) when calling slow-class tools against a large workspace:

```bash
export CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT=300000   # milliseconds; raise if ctx_dream/ctx_ingest still time out
```

Treat both settings as recommendations, not guarantees, of how long any given call will take.

## API version compatibility

The 99-tool surface exposed by this MCP server is a direct projection of the ContextQ API (24 loaded by default, the rest via `CONTEXT_MCP_TOOL_PROFILE=full` or on-demand -- see "Client configuration" above). The tool count and signatures drift with the server. Pin compatible versions:

| MCP package | ContextQ server API |
|---|---|
| `@contextq/mcp@2.x` | ContextQ v2.x (99 tools) |

When upgrading your ContextQ server, check the [changelog](https://contextq.dev/changelog/) and bump the MCP package to the matching major version. A version mismatch may surface unknown tools or break call signatures.

## License

MIT

TDQS

A3.9/5.0

Scored across 24 tools

Disambiguation4/5

Most tools have clearly distinct purposes (ctx_save vs ctx_search vs ctx_get vs ctx_list), and the context CRUD tools are well separated. However, there is a notable cluster of session/keyboard-overlapping tools: agent_checkpoint and agent_resume both expose session state, agent_task_upsert and goal_add both handle tasks, and agent_task_tick and goal_advance both flip task status. The descriptions do clarify the session-scoped vs board-level distinction, but a less attentive agent could still misselect.

Naming Consistency4/5

The set uses a consistent snake_case convention throughout (ctx_save, agent_boot, goal_add). There is a minor inconsistency in grouping prefixes: context tools use ctx_, agent tools use agent_, and goal tools use goal_ without the agent_ prefix, but all follow a verb_noun or verb_noun_qualifier pattern. The only deviation is a few compound names like agent_task_upsert and ctx_load_tool_group that are slightly more verbose, which is acceptable.

Tool Count3/5

24 tools is at the upper end of the reasonable range and borderline heavy for the core purpose of context/memory management. The set is further expanded by meta-tools (ctx_tool_groups, ctx_load_tool_group) that hint at even more tools behind a loading mechanism, making the actual surface feel bloated. A leaner consolidation of session and goal tools could improve usability.

Completeness5/5

The surface provides comprehensive coverage for its domain: full CRUD on context entries (save/search/list/get/update/delete), statistics, health checks, memory extraction, agent session lifecycle (start/end/boot/resume/checkpoint/handoff), task management, and goal graph operations. There are no obvious gaps for the stated purpose, and the tool-group mechanism offers a path to additional features without cluttering the default set.