Thread Keeper
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| THREADKEEPER_DB | No | SQLite file path | ~/.threadkeeper/db.sqlite |
| THREADKEEPER_ACTIVE_CLI | No | Force host detection to a specific CLI (e.g., 'claude') | |
| THREADKEEPER_INGEST_CAP | No | Maximum transcript ingest messages per pass; 0 disables ingest work | 0 |
| THREADKEEPER_AUTO_REVIEW | No | Enable auto-review on close_thread | |
| THREADKEEPER_EMBED_MODEL | No | 384-dim cross-lingual embedding model | paraphrase-multilingual-MiniLM-L12-v2 |
| THREADKEEPER_EMBED_BACKEND | No | Embedding runtime: 'onnx' (fastembed) or 'sentence-transformers' | onnx |
| THREADKEEPER_NO_EMBEDDINGS | No | Force-disable the embedding model (FTS5 + delegate only) | |
| THREADKEEPER_SPAWNED_CHILD | No | Spawn-internal marker; disables autonomous daemons in children | |
| THREADKEEPER_SPAWN__DEFAULT | No | Default agent for spawn roles (e.g., 'claude', 'codex') | |
| THREADKEEPER_SPAWN_BUDGET_MB | No | Combined child RSS cap in MB (0 disables) | 3072 |
| THREADKEEPER_EXTRA_SKILLS_DIRS | No | Extra skills directories (colon-separated) for mirroring | |
| THREADKEEPER_INGEST_INTERVAL_S | No | Transcript ingest tick in seconds | 3 |
| THREADKEEPER_CURATOR_INTERVAL_S | No | Curator daemon tick in seconds (0=off) | 0 |
| THREADKEEPER_DISABLE_BG_DAEMONS | No | Disable all background daemons for hosted sandbox evaluation | 1 |
| THREADKEEPER_EXTRACT_INTERVAL_S | No | Extract daemon tick in seconds (0=off) | 0 |
| THREADKEEPER_EXTRACT_WINDOW_MIN | No | Sliding dialog window per extract pass in minutes | 30 |
| THREADKEEPER_CURATOR_DESTRUCTIVE | No | When '1': curator applies changes directly instead of advisory report | |
| THREADKEEPER_CURATOR_MIN_LESSONS | No | Minimum lessons before curator engages | 3 |
| THREADKEEPER_MEMORY_GUARD_NOTIFY | No | Send macOS desktop notification when possible | 1 |
| THREADKEEPER_MEMORY_GUARD_POLL_S | No | Server RSS guard tick in seconds (0 disables) | 30 |
| THREADKEEPER_CANDIDATE_REVIEW_MIN | No | Minimum pending candidates before reviewer engages | 3 |
| THREADKEEPER_MEMORY_GUARD_KILL_MB | No | SIGTERM server above this RSS (0 disables killing) | 3072 |
| THREADKEEPER_MEMORY_GUARD_WARN_MB | No | Notify/log when a server crosses this RSS | 1536 |
| THREADKEEPER_SKILL_NUDGE_INTERVAL | No | Events between skill_hint nudges | 10 |
| THREADKEEPER_DIALECTIC_VALIDATE_MIN | No | Minimum buffered observations before validator engages | 5 |
| THREADKEEPER_SHADOW_REVIEW_WINDOW_S | No | Sliding window for shadow scan in seconds | 900 |
| THREADKEEPER_EVOLVE_APPLY_INTERVAL_S | No | Evolve-applier daemon tick in seconds (0=off) | 0 |
| THREADKEEPER_MEMORY_GUARD_RECLAIM_MB | No | Local RSS floor before warn-triggered self trim | 1024 |
| THREADKEEPER_DIALECTIC_MAX_NEW_CLAIMS | No | Max new dialectic claims the validator may create per pass | 3 |
| THREADKEEPER_EVOLVE_REVIEW_INTERVAL_S | No | Evolve-reviewer daemon tick in seconds (0=off) | 0 |
| THREADKEEPER_MEMORY_GUARD_AGG_KILL_MB | No | Under aggregate pressure, retire stale idle servers | 3072 |
| THREADKEEPER_MEMORY_GUARD_AGG_WARN_MB | No | Notify/request trim when all server RSS crosses this | 2048 |
| THREADKEEPER_MEMORY_GUARD_RETIRE_LIVE | No | Allow retiring parent-alive MCP servers (off protects live clients) | |
| THREADKEEPER_SHADOW_REVIEW_INTERVAL_S | No | Shadow daemon tick in seconds (0=off) | 0 |
| THREADKEEPER_DIALECTIC_MINE_INTERVAL_S | No | Dialectic_miner daemon tick in seconds (0=off) | 0 |
| THREADKEEPER_MEMORY_GUARD_RETIRE_IDLE_S | No | Heartbeat age before a non-self server is retireable | 900 |
| THREADKEEPER_CANDIDATE_REVIEW_INTERVAL_S | No | Candidate-reviewer daemon tick in seconds (0=off) | 0 |
| THREADKEEPER_MEMORY_GUARD_TARGET_SERVERS | No | Aggregate-pressure target after retiring stale idle servers | 1 |
| THREADKEEPER_DIALECTIC_VALIDATE_INTERVAL_S | No | Dialectic_validator daemon tick in seconds (0=off) | 0 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| briefA | Compact Claude-native memory brief. CALL AT THE START OF EVERY CONVERSATION. Format is dense, structural, not designed for human reading. Pass the user's
first message as
|
| contextA | Runtime context: session id, age, semantic on/off, db path, thread counts. Returns structuredContent (ContextStatus) plus the legacy text block.
The same snapshot is reachable read-only as the |
| open_threadA | Open a thread. |
| noteA | Add a note to a thread. Write terse, optimized for future-Claude.
Reopens the thread: a note on an |
| close_threadB | Close a thread with a 5-15 word outcome. |
| mark_skill_materializedA | Close the Learning loop: record that a closed thread's insights were written into a skill. Stops the brief()'s Pass the absolute path to the SKILL.md (or skill directory) when known; leave empty if you only want to silence the hint without recording a path. When a path is provided, thread-keeper also mirrors that skill directory into every configured native skills root (Claude, Codex, Antigravity, shared agents, and ~/.threadkeeper/skills) on a best-effort basis. |
| idle_threadA | Mark thread idle (paused, may return). Auto-revives to active on next note(). |
| searchC | Semantic (or FTS) search over all notes. |
| compostA | Surface N random idle threads. Call when current threads feel exhausted or you want to shake loose dormant ideas. |
| evolve_formatA | Propose a change to the brief format itself. The format is not fixed — this is how it adapts. Examples: 'field X unused this session, drop it'; 'add field failed_attempts under each open thread'; 'shorten Z to single token'. |
| evolve_reviewB | List pending (or all) format-evolution suggestions for review. |
| evolve_decideA | Triage a pending format-evolution suggestion. Used by the autonomous evolve reviewer daemon (and available manually).
|
| evolve_issue_createA | Create a reviewer roadmap issue through the mechanical dedup gate. The gate checks open and closed GitHub issues, the local reviewer issue
ledger, and already-filed fingerprints before calling |
| auto_review_triggerA | Check current counters + close-thread state and, if conditions are met, fire review_thread(mode='auto') for the richest pending thread.
|
| verbatim_userB | Capture a user quote worth surfacing in future briefs. Use when the user's exact phrasing matters (sharp reframes, decisions, pushback). |
| style_setB | Set a stylistic running rule. Examples: lang=ru | prose=lean | allow=half-baked,weird | deny=sycophancy,headers |
| whoamiA | Return this conversation's detected conversation_id + how we know. Resolution order:
|
| peersA | List concurrent claude conversations active in the last Activity inferred from dialog_messages (ingested live). For each peer
returns: cid, last user message snippet, age, message count. Self is
marked with |
| broadcastA | Post a message visible to ALL concurrent claude conversations. Other peers see it in their next brief() under |
| whisperA | Post a message visible only to the specified conversation_id. Use peers() to discover available cids. The 8-char prefix shown there is enough — it'll be matched as prefix. Use whoami() to get your own cid (rarely needed; messages from self to self are dropped). |
| waitA | Block until a new signal arrives for me or Returns immediately if there are unread signals. Otherwise polls the signals table every 250ms. Use this for realtime turn-based exchange with peers: one side waits, the other side broadcasts/whispers/responds.
|
| askA | Send a question to a peer and wait synchronously for their answer. Mechanics: posts a whisper with kind='question'; blocks until target
posts a whisper/answer back to me, or Note: requires the target to be in a |
| respondA | Answer a specific question (signals.id) with a directed whisper. Use after seeing a |
| inboxA | Read signals addressed to me (whispers + broadcasts).
|
| live_statusA | See what OTHER concurrent Claude sessions did since this session last polled. Call when brief() shows live=N where N>0, or proactively when you suspect a parallel instance is working on something relevant. Advances this session's cursor by default; pass advance_cursor=False to peek without consuming. |
| presenceA | List concurrent Claude sessions with heartbeats within threshold (default 5 min). Excludes self. Useful for understanding who else is currently active before making changes. |
| search_via_parentA | Delegate a semantic search to the parent process (or any peer with embeddings loaded). For light children spawned with THREADKEEPER_NO_EMBEDDINGS=1, this is how you reach into the shared DB's semantic index without loading PyTorch yourself. Mechanism: posts a 'search_request' signal addressed to the parent's cid (auto-resolved via tasks.parent_cid; falls back to broadcast if none). The parent's search_proxy daemon answers with a 'search_response' signal. This tool blocks until reply or timeout_s.
Returns formatted result lines, or 'timeout' if no parent answers. |
| spawnB | Launch a new child session in parallel. This is the public MCP surface. Watchdog continuation retries use the
private |
| tournamentA | Spawn N children with different roles on the same prompt, then collect their answers via a tagged broadcast and return a comparison.
Each child is told to broadcast its final output as exactly: [] [] Parent polls signals every 2s for matching prefixes until all answered or timeout. Returns: a per-role digest. Children write everything to thread-keeper so you can also inspect via tasks()/dialog_search() afterward.
|
| tasksB | List spawned tasks: id, pid, status, elapsed, spawned_cid (if linked), prompt prefix. Refreshes liveness and resolves spawned_cid lazily. |
| task_logsA | Read tail of a spawned task's captured stdout/stderr log. Only works for tasks spawned with |
| spawn_budget_statusA | Report current spawn-budget usage: cap, used, free, plus per-running-task RSS. Used to decide whether another spawn() will be admitted. Values come from the budget daemon (refreshes every SPAWN_BUDGET_POLL_S
seconds via Returns structuredContent (SpawnBudgetStatus) plus the legacy text block. |
| spawn_budget_setA | Override the spawn-budget cap for this process (in MB). Set 0 to disable enforcement. Does NOT persist across restarts — set THREADKEEPER_SPAWN_BUDGET_MB env for persistence. Useful when a heavy task needs a higher temporary ceiling, or to drop the cap mid-session if you notice the laptop struggling. |
| spawn_statusA | Show which CLI thread-keeper detected as its host, and which CLI each spawn role resolves to (after env + file overrides). Use to sanity-check spawn config when you want loops to fire through a specific agent. Resolution priority (highest first), all in ~/.threadkeeper/.env: • THREADKEEPER_SPAWN__LOOP__= • THREADKEEPER_SPAWN__DEFAULT= • active CLI detected at startup • final fallback: claude Manual model pinning: • THREADKEEPER_SPAWN__MODEL__= Manual reasoning effort: • THREADKEEPER_SPAWN__EFFORT__= Returns structuredContent (SpawnStatus) plus the legacy text block. |
| register_probeA | Register a self-test probe: a known weak-spot task with a verifier.
Categories should be claude-shape: 'count_long_context', 'date_arithmetic', 'recall_verbatim_block', 'detect_contradiction', 'follow_negative_instruction', 'preserve_list_order', 'respect_length_limit', 'needle_mid_context', 'fact_vs_inference', 'notice_absence', 'strict_format_compliance', 'uncertainty_acknowledgment'. |
| run_probeA | Surface a registered probe for self-attempt. Returns the prompt and the grader hint. After attempting, call record_attempt(category, success=true/false, probe_id=...) — the harness doesn't auto-grade because attempting and judging are the same model. |
| record_attemptA | Record a self-test outcome. Updates reliability aggregates. Use for both registered probes (pass |
| reliability_forC | Reliability stats for one category over a window. |
| weak_spotsA | List categories ranked by recent failure rate (min 3 attempts in 30d), plus registered probe categories with no attempts yet (= unknown, equally important to test). |
| register_conceptA | Register a concept that lacks a precise human name.
|
| list_conceptsA | List registered concepts, filtered by minimum confidence. |
| expand_conceptC | Full description + triangulation_notes for one concept. |
| concept_manageA | Prune, consolidate, or re-grade concepts — the curator's eviction path. Concepts are ALL system-generated (there is no foreground/pinned concept
class the way lessons/skills have one), so unlike action='remove' — delete one concept (the curator's PRUNE_CONCEPT).
action='consolidate' — keep
|
| distillA | Mark content as worth carrying forward (distillation channel).
|
| vote_distillA | Vote on a distillate, weight ∈ [-1, +1]. One vote per cid; re-voting overwrites your previous vote. Updates aggregate vote_sum/vote_count. |
| pending_distillatesA | List distillates with vote_sum >= min_vote, not yet exported. |
| export_distillatesA | Write distillates with vote_sum >= min_vote to a jsonl bucket. Marks them exported_at so the same item isn't re-exported next call. Default output: ~/.threadkeeper/tasks/distillates.jsonl. |
| core_setA | Upsert a core-memory entry. ALWAYS shown in brief, sorted by priority DESC. Use sparingly — this is the 'what new-claude must know' surface, not a
note store. Good: 'project_root=/Users/.../ai-memory'. Bad: 'today we
tried X'. |
| core_removeB | Delete a core-memory entry by key. |
| core_listA | List all core-memory entries, ordered by priority DESC then key. |
| core_getB | Return the full content of a single core-memory entry. |
| linkA | Create a typed edge between two entities. Kinds: thread, note, concept, distill, task, signal, probe. Relations (suggested, free-form ok): refines, contradicts, exemplifies, depends_on, mentions, elaborates, supersedes. Existing edge with same (from, to, relation) is replaced (re-linking means updating weight/timestamp, not duplicating). |
| unlinkC | Remove an edge by id. |
| neighborsA | BFS the graph from a starting node up to |
| tag_signalA | Manually attach a signal to a task. Useful when retroactively building a task-thread (auto-tagging happens at signal-emit time when the cid matches a known spawned_cid). |
| task_threadB | Replay a spawned task as a chronological thread: every signal tagged with the task_id (or to/from the task's spawned_cid), plus optionally notes added during the task window. |
| extract_recentC | Scan recent dialog_messages and enqueue heuristic candidates. |
| review_candidatesB | status ∈ {pending, accepted, rejected, all}. Newest first. |
| accept_candidateB | Materialize candidate into its target table. target_kind overrides candidate's kind. thread_id optional. |
| reject_candidateB | Mark rejected. Reason appended to rationale for heuristic tuning. |
| consolidateA | Periodic memory hygiene. dry_run=True (default) reports only. merge_dup_notes : intra-thread cosine ≥ note_cosine, keep oldest idle_stale : active threads not touched in stale_days dedupe_verbatim : exact text + (if embeddings) cosine ≥ verbatim_cosine release_orphan : claim ≥ orphan_days old, no progress past claim mark prune_tasks : ended task rows outside retention bounds gc_task_spool : task spool files with no retained task row |
| validate_threadsA | Heuristic triage of active threads — propose (dry_run=True, default) or apply (dry_run=False) close/idle actions per category. Categories (first match wins): no_notes_old no notes + age ≥ no_notes_days → close shipped last-note shipped-marker + settled → close (outcome=last_move) dropped_open_q last note open_q, unfollowed → close stale_idle no touch ≥ stale_days → idle (not close) Idle threads are never touched. shipped_markers is a comma-separated list of extra tokens to OR into the default English+Russian regex. |
| find_invariantsA | Find recurring assistant-side patterns that survive prompt variance. Algorithm:
Returns top_n clusters with sample response, scores, and counts. Requires semantic embeddings (sentence-transformers) — without them returns ERR. |
| find_missed_spawnsA | Find assistant responses that decomposed into independent blocks but were answered linearly (no spawn() call nearby). Algorithm:
Use this to calibrate the spawn_hint: a high missed-spawn count means the hint isn't strong enough, or thresholds need tuning. |
| open_dialog_windowA | Open a Terminal window that tails the live cross-session signal log. Every broadcast/whisper/question/answer is appended to the log in real
time; this lets the user see the dialog between concurrent claude
sessions as it happens. The window stays open until you close it (it's
a |
| dialog_searchB | Search ingested Claude Code transcripts. mode='hybrid' (default) combines semantic and FTS5 keyword via RRF. mode='semantic' is pure cosine. mode='fts' is pure FTS5 keyword. |
| ingestA | Ingest new transcripts. Initial and periodic passes run asynchronously in the daemon host; call manually for backfill or after a long absence. |
| pickup_candidatesA | Surface unresolved threads that are stale and unclaimed — candidates for self-initiated pickup when context is free. Ranks by oldest last_touched_at among active+idle threads with no current claim. Adds a one-line summary so caller can decide which to claim. |
| claim_pickupA | Claim a thread for self-initiated work. Marks it claimed by my cid. If |
| release_pickupC | Release a claim. The claimant or its spawned child can release. |
| session_endB | Mark current session ended with optional terse summary. |
| skill_recordA | Record usage telemetry for a mirrored skill.
The 'wrong' outcome is the primary signal an agent has to say "I consulted this skill, it didn't actually apply / was misleading; please patch or delete next curator pass." Don't be shy about marking 'wrong' — better a curated library than a polluted one. |
| skill_manageA | Create, edit, patch, or delete skills under the primary skills root. Atomic primary write with frontmatter validation before disk hits, then best-effort mirror into every configured skill root. Actions:
create — write a brand-new skill. Requires |
| skill_listC | List skills with telemetry. Format: tier=<hypothesis|observed|validated> origin=<...> state=<active|stale|archived> uses=N fg_uses=N views=N patches=N wrong=N pinned=0/1 last_active= |
| curator_runA | Move stale agent-created skills to archive. Lifecycle: active → stale when last activity > stale_after_days stale → archived when last activity > archive_after_days (also moves primary directory to .archive/) Tier-aware adjustments (the discrete trust signal trumps raw activity): • tier='validated' skills are NEVER stale-aged or archived — proven load-bearing knowledge stays alive regardless of recency. • tier='hypothesis' skills age faster — half the stale_after window (default 15d instead of 30d). Unproven skills don't get to linger. • tier='observed' uses the standard windows. NEVER touches:
• foreground (user-authored) skills — provenance check
• pinned skills — opt-out flag
• validated tier — proven externally
• skills with no
|
| review_threadA | Spawn a background review of a closed thread to extract memory/skills. Spawns a separate Claude process that reads the thread's notes and writes back via memory/skill tools.
|
| dialectic_claimA | Register a new claim about the user. Optionally seed with first
piece of evidence — pass the supporting (or contradicting) quote in
Returns: 'ok id= conf= tier='. |
| dialectic_evidenceA | Attach evidence to a claim.
Bumps support_count or contradict_count, recomputes confidence and tier (which may emit a tier_promoted/demoted event). |
| dialectic_reviewA | List active claims filtered by confidence floor and optional domain. Retired/superseded claims are omitted by default. If
Format: ' [conf] tier= domain= support=N contradict=N '. |
| dialectic_synthesisA | Terse rendering of accumulated beliefs about the user, grouped by
domain. Used as brief() input. Excludes low/disputed claims. By
default only active claims are rendered; Tier markers in the output: ★ validated — load-bearing; act on it without asking · observed — pattern with backing; reference, mention if used ? hypothesis — currently testing (only shown if no observed/validated in same domain, to avoid surfacing weak guesses next to load-bearing facts) If |
| dialectic_supersedeA | Retire If If On hosts that advertise MCP form-mode elicitation, this asks the user to confirm/reject the supersede before mutating. Hosts without elicitation keep the prior behavior and apply immediately. Returns: 'ok new= old= conf= tier='. |
| dialectic_observation_resolveA | Mark a dialectic_observations buffer row 'processed' so the validator never re-interprets it. Called by the validator child after it has written (or deliberately skipped) the observation's claims/evidence. |
| convene_panelA | Spawn a panel of independent agents to vote on a distillate or claim, filling the promotion quorum the way a second human otherwise would.
The panel runs adversarially: with a skeptic present (default), each
child's vote carries full weight ( |
| mp_healthA | Diagnostic snapshot of every running thread-keeper server process on this machine. Shows pid, parent status, RSS, heartbeat age, and whether each is classified as orphaned (parent gone + no fresh heartbeat from its session). Self (the process answering this call) is always marked is_self=true and never flagged as orphan. The text view also includes each registered daemon thread's liveness verdict. Returns structuredContent (MpHealth) plus the legacy text block. |
| mp_cleanupA | Kill orphaned thread-keeper processes (parent gone AND heartbeat stale for > 5 minutes). Defaults to dry-run — pass dry_run=False to actually send signals. force=True uses SIGKILL instead of SIGTERM. Never touches the current process or processes whose parent is still alive. Safe to run repeatedly. |
| memory_guard_statusA | Show memory-guard thresholds and current thread-keeper RSS rows. |
| memory_guard_checkA | Run one memory-guard pass now. Defaults to dry-run and no desktop notification. Pass dry_run=False to SIGTERM thread-keeper server processes over the kill threshold. |
| memory_guard_reclaimA | Unload thread-keeper model/caches now.
|
| shadow_review_runA | Fire one shadow-review pass.
|
| shadow_review_statusB | Show shadow-review config, recent passes, and production telemetry. Snapshot for sanity-checking that the daemon is alive and advancing its cursor, PLUS the production-validation rollup (issue #6): for the 24h and 7d windows it aggregates how often the daemon fired, the outcome mix (no_window / too_short / spawned / deferred / error), the MATERIALIZED-vs-SKIP hit rate of spawned evaluator children, durable skill writes attributable to shadow_review, and the total Claude-spawn time spent — so you can tell whether the loop earns its Opus minutes or just emits SKIPs.
|
| lesson_appendA | Materialize a class-level lesson into ~/.threadkeeper/lessons.md.
|
| lesson_patchA | Replace one unique substring in a materialized lesson.
|
| lesson_listB | Compact listing of materialized lessons, newest first. Format per line: |
| lesson_getA | Return the full body of one lesson by slug. Useful when
|
| lesson_removeA | Remove one materialized lesson section by slug. Refuses protected lessons unless |
| lesson_restoreA | Restore the latest trashed lesson section for Refuses to overwrite an existing lesson with the same slug. |
| curator_reviewA | Fire one curator pass.
|
| curator_review_statusA | Show curator config + inventory fingerprints + latest REPORT path. Sanity-check for whether the daemon is alive, advancing the cursor, and producing REPORTs the user can read. |
| skill_validateA | Validate ThreadKeeper-managed skills across supported CLI consumers. With |
| curator_report_writeA | Atomically write one Curator report inside the configured report dir. This narrow tool is the cross-CLI alternative to direct filesystem Write:
Codex workspace sandboxes cannot write |
| curator_restoreB | Restore one lesson or skill from a curator pre-mutation snapshot. Pass exactly one of |
| candidate_review_runA | Fire one candidate-review pass.
|
| candidate_review_statusA | Show candidate-reviewer configuration + last 5 passes + current pending queue size. |
| evolve_applyA | Implement a PROMOTED + not-yet-applied format-evolution suggestion. Spawns an applied=1 is set ONLY when the child reports a real PR back via evolve_mark_applied — opening the PR is the autonomy gate. Rejects ids that don't exist or aren't promoted+unapplied. Single-flight: refuses while another applier child is in flight. Returns a status line (spawned … / applier_running … / ERR …). Get ids from evolve_review(). |
| evolve_apply_curator_reportA | Apply a Curator advisory report using the existing evolve_applier role. With no |
| evolve_apply_roadmap_issueA | Implement one open GitHub issue through the evolve_applier role. With |
| evolve_apply_conflicted_prA | Repair an already-open applier PR that currently has merge conflicts. With |
| evolve_prune_managed_venvA | Free the default managed checkout's Pass |
| evolve_mark_appliedA | Mark a format-evolution suggestion as APPLIED — called by the evolve_applier child after it has opened the PR. Sets applied=1 (so the suggestion drops out of the brief / evolve_review)
and records the PR url. |
| evolve_mark_roadmap_issue_appliedA | Mark a roadmap issue as handed off — called by evolve_applier only after it has opened a real pull request for that issue. |
| evolve_mark_curator_report_appliedA | Mark a Curator report as processed by the evolve_applier child. The report must live under |
| evolve_apply_statusA | Show evolve-applier config + curator/evolve queues + running applier
|
| dialectic_mine_runA | Fire one mechanical capture pass now (force=True runs even when the miner daemon interval is 0). |
| dialectic_validate_runA | Fire one validator pass. dry_run shows pending count + would_spawn without spawning or advancing the cursor. |
| dialectic_mine_statusC | Miner config + buffer sizes + last 5 capture passes. |
| dialectic_validate_statusA | Validator config + pending observation count + last 5 passes. |
| mp_dashboardA | One-call rollup of the whole thread-keeper system: store sizes, how
often each autonomous loop fired (in the last Use to see system health at a glance, spot loops that fire but produce nothing (e.g. shadow_review passes >> skills materialized), or a backlog building up (e.g. extract_candidates pending climbing). |
| agent_statusB | Show autonomous learning loops with state, backlog, last pass, and RSS. Set json_output=True for the same stable shape used by the menu-bar app. Always returns structuredContent (AgentStatusSnapshot); the text block is the JSON dump when json_output else the formatted summary. |
| agent_memory_cleanupA | Trim ThreadKeeper memory and clean orphan/over-limit server processes. By default this applies the safe cleanup path. Set dry_run=True to inspect the plan first. It does not kill active spawned child agents. |
| config_reloadA | Re-read the watched config files and hot-apply changed env knobs. Re-reads the universal env-file ( |
| config_watch_statusA | Show hot-config-reload state + the last 5 reload passes. In hybrid mode reports both watched files: the universal env-file
( |
| db_deduplicate_embeddingsA | Remove base-table embedding BLOBs already represented in sqlite-vec. The operation is coverage-gated: rows without a confirmed vec0 mirror keep
their BLOB fallback. Defaults to a report-only dry run. Run |
| db_compactA | Shrink the DB file: VACUUM + mandatory dialog_fts rebuild. Run in a quiet window — VACUUM needs an exclusive lock and copies the whole file (minutes on a multi-GB DB); concurrent FTS searches during the vacuum→rebuild gap may map to wrong rows until the rebuild commits. Fails soft (with a retry hint) when the DB is busy. |
| forgetA | Forget one session/cid/thread/dialog UUID. Defaults to dry-run and reports affected rows per store. Set
|
| sync_statusA | Cross-machine sync status: migrated?, this node id, peer count, listen address, oplog size, and how many origin nodes this DB has seen. |
| sync_peersA | List the configured sync peers (THREADKEEPER_SYNC_PEERS). |
| sync_nowA | Reconcile with every configured peer right now (bidirectional). Returns per-peer (pulled, pushed) counts or an error marker. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| review_recent_threads | Summarize and triage the most recent thread-keeper threads (open / idle / recently closed) and propose next moves. |
| run_library_curation | Fire one Curator audit pass over the lessons + skills library (KEEP / PATCH / CONSOLIDATE / PRUNE recommendations). |
| audit_threadkeeper | Whole-system health + hygiene audit: telemetry rollup, thread integrity, and pending evolve suggestions. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| brief | Session-start memory brief: core memory, open/idle/closed threads, live peers, style, verbatim, user-model. Read-only, rendered lean (no behavioral nudges, no side effects). Mirrors the brief() tool. |
| context | Runtime context: session id, age, semantic on/off, db path, thread counts. Read-only. Mirrors the context() tool's text block. |
| dashboard | One-call rollup: store sizes, autonomous-loop fire counts, and what those loops produced. Read-only. Mirrors the mp_dashboard() tool. |
| agent-status | Autonomous learning loops: state, backlog, last pass, RSS. Read-only cached snapshot (refresh=False, no process re-scan). Mirrors the agent_status() tool's formatted summary. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/po4erk91/thread-keeper'
If you have feedback or need assistance with the MCP directory API, please join our Discord server