Feynman's twelve-problems method as an MCP server: dormant problems + an evoke loop for new tricks.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Seven Dpt MCP.
add_problemAdd a long-running problem to your set (refused past the ~12 cap until you retire/merge something β or pass `overCap`)
update_problemEdit, **retire**, **solve**, or reopen a problem. Closing takes a `resolution` β why, plus the re-open trigger; a merge is a retirement whose resolution names the absorber
list_problemsSee your open problems
get_problemOne problem + every spark (idea, next step, outcome) β the memory
evokeThe loop.** Feed it a trick; returns your problems + a scaffold walking evocation β transcendence β approach
capture_sparkPersist a candidate idea + concrete next step against a problem (+ optional `costToOpen` β the forward effort estimate β `prior` β your stated p(works), immutable, for later calibration β and the claim-typing trio: `claimType` universal/existential-bounded, `forbids` β one observation the spark rulβ¦
A tiny, local MCP server that gives Claude (in any project) a persistent set of long-running problems and a loop for cracking them β Feynman's twelve favorite problems method, driven by the tripartite model of inspiration.
The server holds state and scaffolding; the connected model does the thinking β no LLM runs inside the server, no API key.
| Tool | Purpose |
|---|---|
add_problem | Add a long-running problem to your set (refused past the ~12 cap until you retire/merge something β or pass overCap) |
update_problem | Edit, retire, solve, or reopen a problem. Closing takes a resolution β why, plus the re-open trigger; a merge is a retirement whose resolution names the absorber |
list_problems | See your open problems |
get_problem | One problem + every spark (idea, next step, outcome) β the memory |
evoke | The loop. Feed it a trick; returns your problems + a scaffold walking evocation β transcendence β approach |
capture_spark | Persist a candidate idea + concrete next step against a problem (+ optional costToOpen β the forward effort estimate β prior β your stated p(works), immutable, for later calibration β and the claim-typing trio: claimType universal/existential-bounded, forbids β one observation the spark rules out β and exhaustion β when to abandon rather than re-park. All write-once) |
update_spark | Record a spark's outcome β status (tried/worked/failed), cost (actual effort spent), value (graded payoff, 0 for a miss). Log failures too; the zero-value outcomes are the signal a background-effort policy is learned from. Can backfill claimType/forbids/exhaustion while unset (write-once: never revises) |
wake_status | Evaluate every parked problem/spark's wakeCondition right now β ripeness, progress, per-atom current/target echoes |
Storage: ~/.local/share/seven-dpt/store.json (override with SEVEN_DPT_DB). One store,
shared by every project = one brain.
Retiring a problem parks it with a re-open trigger β but a trigger written in prose is a
wait owned by "someone will remember." A wakeCondition makes it computable: a small
predicate (all/any over atoms like sparkCount, a date gate, fileMatches /
fileLines / fileCount on a path, or an explicit manual note) attached when you
retire/solve a problem (update_problem), park a spark (update_spark), or capture one
born gated (capture_spark). The ambient digest evaluates every condition at session
start and surfaces what's ripe (with an act/re-park pointer), what's ripening (with
current/target progress), and β loudly β any condition whose source became unreadable:
a wake source that vanished must scream, not sit at 0% forever. Everything echoes its aim
(prior-ledger.jsonl 12/20), so a wrong path or unit is visible when you arm it, not
months later. No auto-reopen: ripeness is surfaced, you decide. --wake prints the full
ledger from the CLI.
A parked spark with a wake condition can revive β but nothing says when it may die, so
an unfalsifiable hope can ride the digest forever. 0.1.5 gives every spark an optional
claim-typing trio, all write-once on the same anti-hindsight model as prior:
claimType β universal ("this always holds") vs existential-bounded ("this holds
somewhere, within a stated frame"). A frame-bounded null is not a claim-failure; typing the
claim keeps a frame-kill from being read as a lever-kill.forbids β one concrete observation the spark rules out. If nothing is forbidden,
nothing can refute it, and the spark is a mood, not a claim.exhaustion β the retirement predicate, the dual of wakeCondition: the condition
under which the spark is abandoned rather than re-parked.Set them at capture, or backfill later while unset (update_spark); revision after the
fact is refused with a visible notice β rewriting what a claim forbids after seeing results
is the conventionalist stratagem the fields exist to block. ledger_invariants.py flags
ORPHANED-EXISTENTIAL sparks (parked with a wake, no exhaustion β can revive but never
die), and calibration.py stamps the claimType mix of every scored cohort.
On first run (no store file yet), the store seeds itself with seven-dpt's own five open
product problems β auto-detection of recurring issues, the background-spend policy,
proactive surfacing, keeping the set near twelve, and storage scaling. Design decision,
made deliberately: the seeds are tool-generic (identical for every install, about the
tool rather than about you), so the server dogfoods its own method from minute one and the
ambient digest has something to show before you add your own problems. They are ordinary
rows in your store β edit, replace, or clear them freely; an existing store is never
touched. So the moment it runs it is already "taking care of its own problems": while you
work on anything else, those sit in context and can be sparked by unrelated discoveries.
The policy for how/when/how-much to chase background problems is deliberately not
coded β it's meant to be learned later from the accumulated spark β outcome history,
which is why update_spark exists.
That history is the reward channel: each spark carries a prior (your stated probability-it-works
at capture β immutable afterwards, so stated credences can be calibrated against realized outcomes
once enough sparks resolve), a costToOpen (the forward effort estimate, set at capture and
preserved), a cost (the actual effort, once chased to a verdict), and a value
(graded payoff, 0 for a miss). analysis/reservation_value.py turns it into a Pandora's-Box / Gittins
reservation-value ranking β but it gates on data sufficiency and refuses to emit numbers until enough
resolved sparks (with cost + value, including failures) accrue, so the policy is never fit on false
precision. A companion, analysis/reservation_value_bayes.py, adds a posterior-predictive prior (so it
can rank under sparse data) and models the one-time costToOpen against a compounding-but-saturating
benefit stream β ranking by profitability index, which is invariant to the valueβcost exchange rate.
analysis/calibration.py is the audit half of the prior loop: it scores stated priors against realized
outcomes (reliability table, Brier/skill, drift check) from any two-line JSONL ledger of
pre-registered priors + resolutions, and --json persists a de-bias map that
reservation_value_bayes.py reads when run β so the index can rank on calibrated stated credences
instead of a deemed hit-rate. The loop is not closed by machinery: calibration.py --json runs inside
analysis/sweep_composite.sh, but nothing invokes reservation_value_bayes.py and it ends in print;
the last hop is a human choosing to run it and act on the ranking. --split YYYY-MM-DD partitions the curve at a changepoint (a model upgrade re-prices
estimates β don't pool across one untested), and a scope stamp reports the claimType mix of scored pairs,
since a frame-bounded null scored as a claim-failure is the one bias the audit can't see from numbers
alone. analysis/ledger_invariants.py audits the program the same ledger records, not any
single probe: deterministic invariants for the failure class where every result is locally sound and the
project is still wrong β a park-streak check (K straddles-zero verdicts in a row on the primary metric
means the instrument, not the ideas, is the suspect), power-at-preregistration (a gate below the banked
MDE is unresolvable before it runs), channel-liveness stamps, and ORPHANED-EXISTENTIAL (a parked spark
with a wake but no exhaustion can revive but never die β unfalsifiable-in-practice spend). It reports
its own note-classification coverage, exits 1 on alerts, supports --asof retrodiction, and --json
emits ALERT markers a hook or wakeCondition (fileMatches on the output) can gate on.
Published on npm β no build step. Register it for every project (user scope):
Then make the problems ambient β merge into ~/.claude/settings.json so every
session opens with your dormant problems in context:
(Installed from source instead? Replace each command with an absolute node path +
/absolute/path/to/seven-dpt-mcp/dist/index.js --digest β hooks don't source your shell
profile, so nvm-style setups need the absolute path.)
(--digest prints nothing when no problems are open; a fresh install prints the five
seeded ones β that's the bootstrap working, not noise.)
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/seven-dpt-mcp)<a href="https://allmcps.com/mcp/seven-dpt-mcp"><img src="https://allmcps.com/api/badge/seven-dpt-mcp?style=directory" alt="Seven Dpt MCP on AllMCPs" /></a>