Skip to main content
Glama
jeff-ong
by jeff-ong
README.md

# ๐Ÿ’ญ thought-graph-mcp

If it's hallucinating, make it think. Inspired by a [research paper](https://research.google/blog/thinking-to-recall-how-reasoning-unlocks-parametric-knowledge-in-llms/), this local MCP makes an LLM reason out loud as an explicit, editable **graph of small thinking steps** instead of one opaque answer.

<p align="center">
  <img src="examples/web-crawler-design/web-crawler-design.png" alt="Thought graph for a web crawler system design session" width="800" />
  <br />
  <em>Example: <a href="examples/web-crawler-design/web-crawler-system-design-bote-estimation-b8cf4764.html">web crawler system design with back-of-the-envelope estimation</a></em>
</p>


1. **Injects guidance** that instructs the LLM to break a complex problem into
   multiple smaller reasoning paths (returned by the `begin_thinking` tool).
2. **Saves the thinking process to a Markdown file** (`.md`) โ€” every step, with
   dependencies, branches, confidence, and revisions.
3. **Renders an interactive HTML graph** (`.html`) so you can *see* each step as a
   node and how they connect.
4. Lets you **understand how the LLM reached the answer** by walking the graph
   node-by-node (click any node for its full reasoning).
5. Lets you **pinpoint a specific step and regenerate it** โ€” the `revise_step` tool
   supersedes that node, drops in a fresh revision, and tells the model which
   downstream steps to reconsider.

https://github.com/user-attachments/assets/29162024-35ce-4b98-8be2-9745560fe16a

## Demo

Explore a full **web crawler system design** session

https://github.com/user-attachments/assets/b3341f27-89af-460a-927f-b4f65a39090d


## Get Started

### Claude Desktop

Edit `claude_desktop_config.json`:
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "thought-graph": {
      "command": "npx",
      "args": ["-y", "thought-graph-mcp"],
      "env": {
        "THOUGHT_GRAPH_DIR": "~/thought-graph-sessions"
      }
    }
  }
}
```
Session artifacts default to `~/thought-graph-sessions/`. Override with `THOUGHT_GRAPH_DIR` in the server's `env` block if you want a different folder.

Restart Claude Desktop. Enable the server under the ๐Ÿ”Œ (MCP) menu โ€” the **tools** (`begin_thinking`, `add_thought`, etc.) become available to the model.

### Claude Code

Project-scoped (create `.mcp.json` in your project root):

```json
{
  "mcpServers": {
    "thought-graph": {
      "command": "npx",
      "args": ["-y", "thought-graph-mcp"]
    }
  }
}
```

Or add it from the CLI:

```bash
claude mcp add thought-graph -- npx -y thought-graph-mcp
```

Verify with `claude mcp list`.


## Try it

In the client, ask:

> Use the thought-graph tools to reason about: *should our team migrate from REST to GraphQL?*

The model will call `begin_thinking`, decompose into sub-problems, branch competing
hypotheses, attach evidence, and `finalize_thinking`. Open the generated `.html`:

- **Click a node** โ†’ full reasoning + its dependencies in the side panel.
- **Spot a weak step** (e.g. `n4`) โ†’ tell the assistant
  *"revise step n4 of session <id> โ€” that assumption is wrong because โ€ฆ"*.
  It calls `revise_step`, the node is dimmed as superseded, a revision replaces it,
  and the graph rebuilds.



## Examples

Here are a few examples of using the MCP tool to analyze mission-critical LLM inference.

| Example | Problem | Nodes | Directory |
|---------|---------|------:|-----------|
| Web crawler system design + BOTE | Design a crawler for ~1B pages/month โ€” politeness, dedup, refresh โ€” with back-of-the-envelope sizing for storage, bandwidth, QPS, and fleet size | 18 | [examples/web-crawler-design/](examples/web-crawler-design/) |
| Rate limit service design | Design a distributed rate limiter โ€” high throughput, low latency, flexible per-user/key/endpoint rules, graceful degradation | 21 | [examples/rate-limit-service-design/](examples/rate-limit-service-design/) |
| Autocomplete feature design | Design typeahead suggestions โ€” data source, matching/ranking, frontend UX, latency, accessibility | 14 | [examples/autocomplete-feature-design/](examples/autocomplete-feature-design/) |


---

## How it works

### Prompt

The [guidance](src/prompt.ts) in src/prompt.ts is injected into the context window when the tool `begin_thinking` is called, instructing the model to build the thought graph.

### Node types

Every node in the graph has a **type**. It drives node color in the HTML graph, grouping in the Markdown export, and the shape of the reasoning protocol the model follows.

| Type | Label | What it represents | How it's created |
|------|-------|--------------------|------------------|
| `root` | ๐ŸŽฏ Problem | The original question the session is about | Automatically by `begin_thinking` (node `n1`) |
| `decompose` | ๐Ÿ”ฑ Decompose | A framing step that breaks the problem into axes or sub-questions | `add_thought` |
| `subproblem` | ๐Ÿงฉ Sub-problem | One focused piece of the larger problem to solve | `add_thought` |
| `hypothesis` | ๐Ÿ’ก Hypothesis | A candidate idea or approach โ€” sibling hypotheses are parallel branches | `add_thought` |
| `evidence` | ๐Ÿ“Ž Evidence | A fact, observation, or computation that supports a path | `add_thought` |
| `evaluation` | โš–๏ธ Evaluation | Weighing trade-offs or checking whether a hypothesis holds | `add_thought` |
| `revision` | โ™ป๏ธ Revision | A corrected replacement for an earlier step | Automatically by `revise_step` (original node is kept but dimmed as *superseded*) |
| `conclusion` | โœ… Conclusion | A synthesized partial or final answer for a branch | `add_thought`; the session-level answer is recorded separately via `finalize_thinking` |

**Typical flow:** `root` โ†’ `decompose` โ†’ one or more `subproblem` nodes โ†’ competing `hypothesis` branches on each โ†’ `evidence` / `evaluation` attached to the relevant branch โ†’ `conclusion` nodes that merge paths โ†’ `finalize_thinking` for the overall answer. If a step turns out wrong, `revise_step` inserts a `revision` node and flags downstream dependents for reconsideration.

---

## MCP Size

`npx -y thought-graph-mcp` downloads the npm package and its dependencies into your npm/npx cache, then runs the MCP server as a Node.js process over stdio. You do **not** need to clone this repo or run a bundler.

| What | Approx. size | Role |
|------|-------------:|------|
| **npm package** (`thought-graph-mcp`) | ~280 KB download ยท ~1.2 MB unpacked | Compiled MCP server (`dist/`), Handlebars template, plus pre-copied browser assets in `dist/_vendor/` (~1 MB) and `dist/_graph/` (~22 KB) |
| **npm dependencies** (installed once, cached by npx) | ~45โ€“55 MB on disk | Libraries the **server** uses at runtime (see table below) |
| **Session folder** (grows as you reason) | ~0.7โ€“1 MB per session `.html` | Self-contained graph file (embeds static CSS/JS from the package) plus ~10โ€“20 KB `.json` / `.md` sidecars |

**Total first-time footprint:** roughly **50โ€“60 MB** in npm cache. Each session `.html` is ~0.7โ€“1 MB (mostly the graph runtime block below).

#### What `npx` installs (gzip treemap)

| Treemap region | bundled | share | What it is |
|----------------|---------------:|------:|------------|
| **`graph-runtime.js`** | **209.4 KB** | 71% | Graph HTML stack: cytoscape, html2canvas, dagre, marked, dompurify, `graph.client.js`, โ€ฆ โ€” embedded in each session `.html` |
| **`mcp-server.js`** | **86.4 KB** | 29% | MCP server process: `@modelcontextprotocol/sdk`, `zod`, `handlebars`, transitive server deps |
| **Total** | **295.8 KB** | 100% | Minified production dependency tree (gzip); on disk `node_modules` is larger (~45โ€“55 MB) because packages ship source, types, and unminified files |

<p align="center">
  <a href="docs/bundle-analysis/treemap.html">
    <img src="docs/bundle-analysis/treemap.png" alt="webpack-bundle-analyzer treemap of the full npx install footprint with gzip size table" width="900" />
  </a>
  <br />
  <em>gzip sizes ยท <a href="docs/bundle-analysis/treemap.html">interactive treemap</a> ยท regenerate with <code>npm run analyze:bundle:all</code> (writes <code>docs/bundle-analysis/summary.json</code>)</em>
</p>

#### Session artifacts on disk

After your first `begin_thinking` call, expect this layout:

```
~/thought-graph-sessions/
  assets/                         # static graph runtime (copied once per package version)
    .asset-version
    vendor/                       # cytoscape, dagre, marked, html2canvas, โ€ฆ (~1 MB)
    graph/                        # graph.css, graph.client.js (~22 KB)
  sessions/
    my-problem-abc12345.html      ~0.7โ€“1 MB โ€” embeds assets (Claude in-app browser)
    my-problem-abc12345.json      ~10โ€“20 KB
    my-problem-abc12345.md        ~10 KB
```

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clear, distinct purpose: starting a session, adding steps, revising, finalizing, and retrieving sessions. No overlap or ambiguity.

Naming Consistency5/5

All tools use underscore_case with a verb_noun or verb_gerund pattern (e.g., add_thought, begin_thinking, list_sessions), maintaining consistency throughout.

Tool Count5/5

6 tools is well-scoped for a reasoning graph system, covering core operations without unnecessary bloat.

Completeness4/5

Covers the essential lifecycle: start, add, revise, finalize, and retrieve. Missing explicit deletion of sessions or thoughts, but these are minor gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues