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 |
Capabilities
Features and capabilities supported by this server
| 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).
|
| 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. |
| spawnA | Launch a NEW claude session in parallel — your primary parallelism primitive. REACH FOR THIS WHEN:
DEFAULT TO SPAWNING when work decomposes. Sequential is the slow path — every minute the parent thinks step-by-step is a minute the children aren't doing anything. The only reason NOT to spawn is tight back-and-forth coupling (you need each step's result before the next). Mechanics:
Returns: task_id, pid (0 for visible), child_cid, parent_cid. |
| 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__= 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: /tmp/thread-keeper-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_recentB | Scan recent dialog_messages and enqueue heuristic candidates. H1 user_want → verbatim (normative phrasing) H2 long_insight → distill (assistant ≥500ch + ## headers + conclusion marker) H3 example_regularity→ concept (bullets≥3 OR example-marker≥2 + abstract frame) H4 paraphrase_repeat → note (≥3 msgs cosine ≥0.80 within same session) |
| 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 |
| 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 Claude Code transcripts. Auto-runs on session start; call manually for backfill or after 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_pickupB | Release a claim. Only the claimant 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_reviewB | List active claims filtered by confidence floor and optional domain. Retired/superseded claims are omitted.
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 and non-active states. Returns at most 12 lines. 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. 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_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 |
| curator_reviewA | Fire one curator pass.
|
| curator_review_statusA | Show curator configuration + last 5 passes + latest REPORT path. Sanity-check for whether the daemon is alive, advancing the cursor, and producing REPORTs the user can read. |
| 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 |
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
- 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