
DeepThonk
io.github.linxulePublished by GitHub account linxulev0.3.1Updated Oct 24, 2026
Provider-neutral OpenDeepThink reasoning server: generate, judge, rank, mutate.
Overview
Provider-neutral "deep think" reasoning server that generates, judges, ranks and mutates candidate answers through an OpenDeepThink loop.
- What you can do
- Plan and run reasoning jobs: estimate calls and rounds, start background runs, poll status, fetch the winner, cancel or resume
- Rank and mutate supplied candidates with pairwise judging and Bradley-Terry scoring
- Inspect run artifacts: config, candidates, comparisons, scores, usage, traces, populations and prompts as MCP resources
- Manage saved named profile bundles: list, show, save and delete
- Export run summaries or full traces as JSON or markdown
- When to use it
- Useful for hard, verifiable work such as coding, planning or synthesis where breadth plus judging can beat one expensive single shot. Skip it for highly subjective tasks where judge noise dominates.
- Requirements
- Local Node.js 22.13 or newer, run via npx or a global npm install. A provider API key in the host process environment (DEEPSEEK_API_KEY, OPENROUTER_API_KEY or DEEPTHONK_API_KEY for a custom OpenAI-compatible endpoint), or MCP sampling from a capable host, or the offline fake provider. Optional DEEPTHONK_CONFIG and DEEPTHONK_PROFILES_DIR paths. Network access for paid providers.
Installation
In SourceWeft
- Open DeepThonk in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
DeepThonk
thonk harder, not richer.
DeepThonk implements the OpenDeepThink algorithm (Zhou et al., 2026, arXiv:2605.15177) as a budget-friendly, provider-neutral "deep think / pro mode" wrapper, with first-class DeepSeek support. See Acknowledgments.
DeepThonk runs a population of candidate answers through pairwise judging, Bradley-Terry ranking, critique-guided mutation, elite preservation, and a final dense ranking pass. The CLI and MCP server both call the same TypeScript core engine.
Designed for agents. Every algorithm dimension — population shape (n, k, t, m), regularization (lambda), per-phase temperatures, prompt style, and per-phase prompt templates — is reachable inline through MCP arguments and CLI flags. CLI can load prompt files with --prompts or inline JSON with --prompts-json; MCP accepts inline structured prompt args. Every intermediate artifact (config, candidates, populations, comparisons, scores, per-call usage, status) is exposed as an MCP resource so an agent can inspect any step. See Customization for the full agent-composable surface.
Use it for hard, verifiable reasoning, coding, planning, and synthesis where breadth plus judgment can beat one expensive single shot. Avoid it for highly subjective tasks where judge noise dominates.
Quickstart
Requires Node ≥ 22.13.
Run without installing:
Or install globally:
The paper profile plans 285 model calls and 8 sequential rounds. Confirm budget and provider pricing before pointing it at paid models. The short alias dt is installed alongside deepthonk. Develop from source: see Development.
DeepThonk is an independent TypeScript reimplementation and practical integration layer; the published algorithm is the load-bearing part. Cost guarantees rely on provider pricing being present in config. Trace-v2 resume can reuse validated per-item receipts after a crash, while older traces replay an incomplete phase wholesale. The MCP HTTP transport remains loopback-only. The included acceptance smoke uses the deterministic fake provider and a toy task — it is not a CF-73 / HLE reproduction; see
docs/and Acknowledgments for the canonical paper and Python reference.
Setup
Create a reusable local config:
By default this writes ~/.config/deepthonk/config.yaml. deepthonk run loads that file automatically when --config is not supplied. If you pass --api-key, setup stores it in ~/.config/deepthonk/env; otherwise it uses the named environment variable from your shell.
DeepSeek
DeepSeek is implemented as an OpenAI-compatible profile using https://api.deepseek.com/v1. DeepThonk ships default USD pricing for deepseek-v4-flash and deepseek-v4-pro from the official DeepSeek pricing page, including cache-hit/cache-miss input rates. Model names and prices are still editable config because both can change.
Before paid runs, inspect cost shape and resolved config:
Start with --profile quick and consider --max-concurrency, --max-calls, --max-input-tokens, --max-output-tokens, --max-usd, and --request-timeout-ms before larger paid profiles. max_calls is reserved before dispatch and counts logical model invocations, including failed calls and invalid-JSON retries; provider-internal HTTP retries are reported separately. Token/USD totals are known only after responses and can overshoot by at most the active concurrency window. Plans keep nominal calls separate from finalizer and retry headroom in worst_case_calls.
OpenAI-Compatible Providers
The driver calls POST {base_url}/chat/completions and requests JSON mode for comparisons when supported. If a provider returns 400 or 422 with a body that mentions response_format or json, the driver retries without JSON mode, coordinates that capability probe across concurrent calls, and remembers the result for the process. Set supports_json_mode: false in YAML to disable JSON mode up front.
Provider names are flexible. For a custom OpenAI-compatible endpoint, use any provider label with --base-url, --api-key-env, and role-specific model flags. For OpenRouter:
For mixed-provider runs, use YAML config and override individual roles under providers, especially judge.
Optional finalizer_model / --finalizer-model can post-process the ranked winner. Leave it unset when you want the raw ranked answer as the final artifact.
MCP
The MCP server exposes the same engine the CLI runs. Once wired into an MCP host, the host can plan budgets, kick off background runs, poll status, fetch winners, and stream structured trace artifacts — all through MCP tools, resources, and prompts.
DeepThonk is listed on the MCP Registry as io.github.linxule/deepthonk (since v0.2.1). Hosts that install by registry name resolve it to npx deepthonk serve-mcp automatically. For hosts that don't, the explicit configs below do the same thing by hand.
Provider API keys come from the host process's environment, not from DeepThonk's config alone. Each host handles env passthrough slightly differently — see the concrete patterns below. No key is required to start the server: with a sampling-capable host you can run provider: "sampling", and the fake provider needs no network at all.
MCP Sampling is supported as provider: "sampling" when the connected host advertises the MCP sampling capability. Blocking run, rank, and mutate work over stdio and stateful Streamable HTTP. HTTP background start rejects Sampling because nested Sampling must remain attached to the initiating request; stdio background runs and direct-provider HTTP background runs remain available. Sampling is not available from standalone CLI runs.
Claude Code
Use -s user for cross-project scope or -s project to commit registration into .claude/. Verify with claude mcp list. See claude mcp --help for the authoritative flag set.
Claude Desktop
Config path: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS), %APPDATA%\Claude\claude_desktop_config.json (Windows), ~/.config/Claude/claude_desktop_config.json (Linux). Add:
Restart Claude Desktop after editing.
Cursor
Project-scoped: .cursor/mcp.json in the workspace. User-global: ~/.cursor/mcp.json. Same JSON shape as Claude Desktop:
Other MCP hosts (stdio)
Any host that speaks MCP stdio launches:
with the relevant provider env vars set on the process. If you'd rather install globally, npm install -g deepthonk then use command: "deepthonk" directly. Refer to the host's MCP registration docs for the configuration shape.
Streamable HTTP
For local web hosts, or when stdio isn't available:
The server binds 127.0.0.1:3333 only and exposes stateful POST, GET, and DELETE at http://127.0.0.1:3333/mcp. Sessions use cryptographic IDs, expire after 30 idle minutes when no request is active, and are capped at 64. DNS rebinding protection is on (CVE-2025-66414): requests with Host headers outside 127.0.0.1:3333 / localhost:3333 are rejected. The wrapper also rejects non-JSON POSTs, non-loopback Origin headers, and Sec-Fetch-Site: cross-site before reading the body. It has no bearer auth. Do not expose this port through a reverse proxy without re-evaluating that trust boundary.
Tools
All tools accept inline provider/model fields, or config_path pointing at a DeepThonk YAML config.
Resources
deepthonk://runs— JSON index of all runs inruns/.deepthonk://runs/{run_id}/summary— run summary (JSON).deepthonk://runs/{run_id}/config— redacted run config (JSON).deepthonk://runs/{run_id}/{candidates|comparisons|scores|usage|trace}— per-phase and per-call NDJSON.deepthonk://runs/{run_id}/population/{generation}— population snapshot for a generation (JSON).deepthonk://runs/{run_id}/{winner|final}— text artifacts.deepthonk://runs/{run_id}/status— run state (JSON).deepthonk://runs/{run_id}/prompts/{sha256}— verified content-addressed rendered prompt (JSON).deepthonk://runs/{run_id}/trace-v2— bounded phase index; follow its manifest, commit, checkpoint-index, and checkpoint URIs to inspect every receipt.deepthonk://jobs/{job_id}/{status|result|config|candidates|comparisons|scores|usage|trace|final|winner}?run_dir=...— job-scoped lookup; therun_dirquery param is required.deepthonk://jobs/{job_id}/population/{generation}?run_dir=...— job-scoped population snapshots before or after completion.- Job results also include
prompt_templateandtrace_v2_templatefor the job-scoped equivalents. deepthonk://runs/{run_id}/{resource}/page/{cursor}and job equivalents — opaque bounded pages. Whole reads are limited to 1 MiB; pages contain at most 1,000 records and 1 MiB.
Prompts
Four templates mirror the core loop: deepthonk/generate, deepthonk/compare, deepthonk/mutate, deepthonk/finalize. Hosts can render them directly to drive the algorithm by hand without invoking the tool surface.
Limits
deepthonk.resume reports trace state by default. With continue: true, it validates phase order, artifacts, run/provider/model identity, scores, usage, deterministic pair schedules, trace-v2 receipts, and phase commits. Valid incomplete-phase receipts are reused without another provider call. MCP Sampling model hints are preferences and token usage may be unavailable. Its shared adaptive limiter starts at 4; direct providers start at 8.
Customization
Every algorithm dimension is reachable through MCP arguments and CLI flags:
- Population shape:
n,k,t,m— override profile defaults inline. - Algorithm constants:
lambda,sample_temperature,mutate_temperature,judge_temperature. - Prompt style:
generalorpaper-programming. - Per-phase prompt templates: override
generate,compare,mutate, orfinalizewith custom system/user templates and variable substitution ({task},{rubric},{candidate},{candidateA},{candidateB},{critique}). CLI supports--prompts <yaml>and--prompts-json <json>; MCP supports inlineprompts. Unknown variables throw a fail-fast error at run-start. - Concurrency: per-phase caps for
generate,judge,mutate. - Provider backpressure:
provider_max_concurrencysets the recovery ceiling for the shared adaptive provider-route limiter. - Per-call output bounds: independent generation, mutation, judge, and finalizer token caps.
- Final ranking schedule: seeded
all-pairsork-regular, with an explicit logical call cap. - Critique bound: deterministic deduplication and a configurable aggregate-character cap before mutation.
Example agent call (MCP), no YAML file required:
CLI accepts the same surface. Use --prompts <yaml> for reusable prompt files or --prompts-json <json> for one-off inline overrides. MCP and CLI both merge over any --config/config_path YAML defaults.
Save reusable bundles as named profiles at ~/.config/deepthonk/profiles/<name>.yaml and load them with --profile-name <name> (CLI) or profile_name: "<name>" (MCP). A named profile is a standalone bundle that replaces the main config file for that run; CLI flags and MCP inline arguments still override fields inside it. See examples/profiles/legal-drafting.yaml for the shape. The Customization guide covers listing, showing, saving, and deleting named profiles from both CLI and MCP.
See the Customization guide for the complete variable contract, the compare-phase JSON safety rule, the named-profile schema, and three worked examples. Per-role provider routing (providers.judge.provider = openrouter) and per-model pricing remain YAML-only — they're nested structured config, not inline ergonomics.
Trace Files
A successful run writes:
status.json is written when the run is launched through MCP deepthonk.start (so async clients can poll). cancel.json is written only when cancellation is requested. A run.lock file is held for the duration of the run.
Trace rows are batch-appended through a single writer and flushed before lifecycle boundaries. Per-item output and usage receipts are written atomically before a phase commit. If a run is killed mid-tournament, trace-v2 resume validates and reuses completed receipts, re-materializes their JSONL rows, and calls the provider only for missing or invalid work.
usage.jsonl carries one row per provider call (generator, judge, mutator, finalizer) with phase/role/provider/model/token/USD/latency/retry. It contains no prompt content. jq over usage.jsonl is the simplest way to break a run's cost down by role.
Prompts and raw model outputs are off by default. When prompt capture is enabled, candidate/comparison rows carry a promptRef and identical rendered prompts share one content-addressed blob under artifacts/prompts/; the full prompt is not repeated in every JSONL row or receipt. API keys are never written. Candidate answers, critiques, scores, and final artifacts are trace data and are stored/exported by design, so do not use a shared run directory for sensitive tasks unless that is acceptable.
Development
This repository is source-only. Generated run traces, paper notes, build output, coverage, logs, and node_modules are intentionally ignored.
Release publishing is tag-triggered through npm Trusted Publishing. See docs/release.md before bumping versions or pushing a v* tag.
Known limits for this release:
- Trace-v1 resume replays an interrupted phase wholesale; per-item reuse requires a trace-v2 run created by DeepThonk v0.2.
- HTTP Sampling is blocking-only. Use stdio or a direct provider for background
deepthonk.startwork. maxUsdrequires known model pricing; add explicit prices in YAML for custom providers and model IDs. Optional fieldslongContextThresholdTokens,inputUsdPerMillionLong, andoutputUsdPerMillionLongenable tiered pricing for models with a long-context surcharge (e.g., Gemini at 200K input tokens). Cache hit/miss rates remain flat.
Acknowledgments
DeepThonk is an independent TypeScript reimplementation of the OpenDeepThink algorithm. It is not a fork; no source code from the reference implementation is vendored. Credit for the algorithm, the benchmark methodology, and the empirical results belongs to the paper authors.
- Paper: Shang Zhou, Wenhao Chai, Kaiyuan Liu, Huanzhi Mao, Qiuyang Mang, Jingbo Shang. OpenDeepThink: Parallel Reasoning via Bradley–Terry Aggregation. arXiv:2605.15177, 2026. https://arxiv.org/abs/2605.15177
- Reference Python implementation: https://github.com/ZhouShang0817/open-deep-think (MIT). This is the authors' code release and the canonical implementation for reproducing paper results (CF-73, HLE).
DeepThonk's contribution is an integration layer: a provider-neutral TypeScript core, an MCP server, a CLI, structured trace artifacts, and budget enforcement. The algorithm itself is theirs.
Source: README.md at commit 8713841
Tools
0Version history
1- v0.3.1LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts