redthread demonstrates solid tool design with clear, domain-specific naming (context_bootstrap, handoff_publish, memory_write) and comprehensive descriptions (avg 180 chars, well above 34-char baseline). All 17 tools have descriptions and input schemas with typed parameters. However, output schemas are not explicitly documented in the source, and error handling lacks recovery guidance. Tools follow single-responsibility principle well (e.g., separate summary_get/summary_update, handoff_get/handoff_publish). Parameter descriptions are generally strong but some lack format/constraint details. No security issues detected (no credentials in params). Composition is excellent, tools chain naturally (e.g., context_bootstrap → handoff_get → memory_read).
Create or update the agents.md file in this project's store, documenting how to use this memory from an agent. Idempotent — safe to call every session.
Resolve an inline artifact to a verified local path. run_id defaults to this store's newest active run.
Register a small local file as a content-addressed artifact pointer. run_id defaults to this store's newest active run.
START HERE. One call that orients you in this project: its phase pipeline, recent runs and their status, published handoffs, and the full index of long-term memory with a description per entry. Call this at the start of every session — including inside a subagent, which does not inherit the main agent's instructions — before reading anything else or making changes. The `_next` field says what to do with what it returns. Also verifies that the store this server was pointed at is really this workspace's store, and reports it as `store.binding`: `ok`, `unverified` (nothing ties the store to this workspace), or `mismatch` (this repo's .redthread.yaml names a different store). Anything but `ok` comes with a `warning` field — read it and stop before writing, rather than filing this project's work under another project. Pass `workspace` — the absolute path of the project directory you are working in — whenever you know it. One MCP registration is commonly shared by every project a client has open, and `workspace` is what selects that project's own store; it sticks for the rest of the session, so later calls need not repeat it.
Output schemas not documented in source. Tools return complex nested objects (e.g., context_bootstrap returns project, store, runs, handoffs, memory, _next) but no explicit schema definitions visible. LLMs cannot plan downstream calls without knowing response structure.
Error handling lacks recovery guidance. No visible error responses that tell LLMs what to do next (e.g., 'no active run, call run_start' is good, but most tools lack this). Errors should categorize as retryable/user-fixable/fatal.
Parameter descriptions lack format/constraint details. E.g., 'phase' is described as 'Phase name from the project pipeline' but no enum of valid phases provided. 'type' in context_log lists options (metric|decision|...) but not as a formal enum constraint.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Append an immutable context entry; returns the new entry_id and the run it landed in. type is one of metric|decision|code_change|artifact_ref|error|milestone|note. Log decisions as you make them rather than reconstructing them later. run_id defaults to this store's newest active run.
Read raw context entries for a run, optionally filtered by phase/type. Prefer handoff_get or summary_get when you just need another phase's conclusions — this is the unabridged log. run_id defaults to this store's newest active run.
Read another phase's published handoff — the curated summary, never the raw log. run_id defaults to this store's newest active run.
Publish this phase's curated handoff for the next phase to consume. Do this when a phase finishes — it's what the next phase reads instead of replaying the raw log. run_id defaults to this store's newest active run.
List all long-term memory entries, optionally filtered by namespace. Returns namespace, key, and description for each.
Read a long-term memory entry by namespace and key.
Full-text search across all long-term memory entries. Returns matching entries with namespace, key, and description.
Write a long-term memory entry and commit it to git. Entries are keyed by namespace and key; description is required and becomes the entry's headline in memory_list and memory_search. Commits and pushes in the background — the call returns without waiting on the network.
List every run_id in this store, oldest first.
Start a new run and return its record, including the new run_id. It becomes this store's active run, so run_id can be omitted from subsequent calls.
Create the store this server points at, if it doesn't exist yet. If a .redthread.yaml marker points here and another machine already populated the store, attaches to it instead of erroring. In discovery mode (the server started with no --store) the workspace must already declare a store with a .redthread.yaml marker, which `redthread init` writes.
Read a phase's rolling markdown summary. run_id defaults to this store's newest active run.
Replace the rolling markdown summary for a phase — the short version a later phase or session reads first. run_id defaults to this store's newest active run.
agents_md_bootstrap has vague description ('Create or update the agents.md file') and no input parameters documented. Unclear what this tool does or when to call it.
No pagination parameters visible for list/search tools (run_list, memory_list, memory_search). Large result sets could exhaust context window. Should accept limit/offset and return total count.