threadline-core
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| THREADLINE_DATA_DIR | No | Directory for the SQLite database and data files. | ~/.threadline |
| THREADLINE_API_TOKEN | No | Bearer token for REST API authentication. If set, all REST endpoints require Authorization: Bearer <token>. |
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 |
|---|---|
| start_sessionA | Call at the BEGINNING of every work session on a project. Returns a Returnsdict with keys: |
| end_sessionB | Call at the END of a work session to close it cleanly. Records a Returnsdict with keys: |
| log_agent_eventA | Report a work event to Threadline — call this as you work. Parse and ingest a single WHEN TO CALL
EVENT SHAPE (compact example)Returnsdict with keys: |
| get_project_stateA | Return the raw governed state for a project. Returns durable lifecycle records only — no synthesis, no compiled memory, no LLM output, no ranking. Includes: objective, open loops, active decisions, known traps, confirmed gaps and caveats, evidence IDs, recent session metadata. Returnsdict — the full RaisesLookupError if the project does not exist (surfaced as an error dict). |
| get_open_loopsA | Return open loops for a project, oldest first. Open loops are deferred threads — things noticed but not finished. Oldest-first because the longest-waiting item is most likely blocking. Filters (all optional, combinable):
Returnslist of dicts with keys: |
| mark_open_loop_resolvedA | Mark an open loop resolved — GATED: requires admissible evidence. Evidence refs must be Returnsdict with keys: |
| assign_open_loopA | Claim an open loop for an owner — FIRST CLAIM WINS. The foreman and every agent must claim a loop BEFORE touching files. A loop is claimable while owner is unset; the first claim wins. Re-claiming by the same owner is a no-op. Claiming someone else's loop raises an error and returns the current owner in the message. Returnsdict with keys: |
| get_decisionsA | Return the LIVE decisions for a project, newest first. Live = status in (active, accepted, validated). Decisions marked
incorrect/reverted are returned by Returnslist of dicts with keys: |
| get_decisionA | Return one decision + its outcome detail, or an error dict if not found. Returnsdict with keys: |
| mark_decision_outcomeA | Record the real-world OUTCOME of a past decision.
HARD RULE: marking Returnsdict with keys: |
| get_known_trapsA | Return decisions proven wrong on this project + the corrected rule. Read these BEFORE acting so you do not repeat a known mistake. Newest first; each carries the corrected_rule (the lesson), severity, and evidence_refs. Returnslist of dicts with keys: |
| propose_findingA | Propose a gap or caveat finding. PROPOSING IS FREE — a proposed finding is never surfaced in the trusted context bundle. It is a candidate until confirmed with evidence.
Fingerprint dedup: re-proposing an active finding returns the existing id (no duplicate write). Returnsdict with keys: |
| confirm_findingA | Confirm a proposed finding so it enters the trusted bundle. GATED: requires Returnsdict with keys: |
| resolve_findingB | Mark a finding resolved (its resolution_condition was met). GATED exactly like Returnsdict with keys: |
| dismiss_findingC | Dismiss a finding as invalid/irrelevant. GATED exactly like Returnsdict with keys: |
| get_evidenceA | Resolve evidence refs ( Returns bounded snippets only — never full transcript bodies. Bad refs
are reported in Returnsdict with keys: |
| search_memoryA | Full-text search across all stored memory. Searches events, decisions, open loops, daily notes, and compiled context fragments. Results are ranked by BM25 relevance. Parametersquery: Natural-language search string. project_key: When provided, restricts results to that project. limit: Maximum results to return (clamped to 50 server-side). Returnslist of dicts with keys: |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 17 tools
Each tool targets a distinct resource and action: sessions, events, memory, loops, decisions, traps, findings, and evidence. Even the finding lifecycle tools (propose/confirm/resolve/dismiss) are clearly differentiated by their gating rules and effects.
All tool names follow a consistent verb_noun snake_case pattern (e.g., start_session, get_open_loops, mark_decision_outcome). Minor deviations like 'get_known_traps' are still readable and fit the pattern.
17 tools is slightly above the typical 3-15 range, but each tool earns its place given the broad domain (sessions, events, memory, state, loops, decisions, traps, findings, evidence). The count feels justified rather than bloated.
The set covers the full lifecycle for the core entities: sessions are started/ended, events are logged, loops can be listed/claimed/resolved, decisions can be queried and outcomes marked, findings progress from proposal to confirmation/resolution/dismissal, and evidence is retrievable. Minor gaps exist (no explicit create/delete for projects, no list_sessions), but agents can work around them.