A local MCP memory server with bi-temporal graph + vector + temporal layers, a query router, and a consolidation engine. Exposes tools for persisting facts, retrieving relevant information, querying a knowledge graph, and managing agent memory.
THOUGHT has 14 well-named tools with detailed descriptions (avg 180 chars, within baseline 194). All tools have input schemas with typed parameters and descriptions. However, output schemas are NOT documented, the rubric requires documented return types for A+ tools (100% baseline). Error handling is minimal; no recovery guidance or categorization. Tool descriptions are strong on WHAT but weak on WHEN/WHY. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Composition is sound (single responsibility, chainable IDs), but missing pagination guidance for list tools and no confirmation pattern for destructive ops.
Drill into a topic by name. ``name`` is matched first against entity-type names (``PERSON``, ``CONCEPT``, ``function``, …) for a type facet; if no type matches, it's resolved as an entity name and the PPR-ranked neighbourhood is returned. Returns ``{"items": [{"id", "name", "type", "score", "via"}]}`` where ``via`` is one of ``type_facet`` / ``ppr`` / ``bfs``.
List entity-type buckets currently in the KB. Returns ``{"topics": [{"type": "...", "count": N, "examples": [...]}]}`` ordered by population descending. Cheap aggregation — single SQL GROUP BY. Use this to discover what *kinds* of facts the memory holds before drilling down with ``browse_topic``.
Run a Cypher query against the KB (read-only subset). Returns ``{"rows": [{col: value, ...}], "columns": [...]}``. Cypher errors are returned as ``{"error": ..., "kind": "syntax|unsupported|other"}``.
Retrieve up to ``limit`` (≤10) hits relevant to ``query``. Internally classifies the query (VIBE / FACT / CHANGE / HYBRID) and dispatches to the appropriate layer(s). Returns hits annotated with their layer of origin, an epistemic confidence class, and source provenance. ``as_of`` can be ISO-8601; ``as_of_kind="valid"`` filters by world-time, ``"learned"`` by transaction-time.
First-time setup for a named agent (vuln-scanner / writer / etc.).
Output schemas not documented. Rubric baseline: 100% of A+ tools have documented return types. Tools like recall, working_context, browse_topic return complex nested objects (hits, neighbours, items) but no schema is visible in source. LLMs cannot plan downstream calls without knowing response structure.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Tools are marked with Risk levels (READ_ONLY, WRITE, DESTRUCTIVE) in comments but not exposed via MCP tool annotations. Agents cannot distinguish safe from destructive operations without parsing descriptions.
Minimal error handling. No recovery guidance (e.g., 'If query fails, try schema() first'). No error categorization (retryable vs user-fixable vs fatal). Cypher errors return {error, kind} but no actionable next steps for the agent.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Persist ``content`` to long-term memory. Extracts entities and relationships, embeds them, links provenance to the raw source, and runs write-time contradiction detection on the configured unique predicates. Idempotent on (content sha256).
Incremental code-scan primitive. Walks ``repo_path``, ingests changed/new files, records a row in ``scan_log`` so the next call picks up where this one left off.
List the last N scan runs (optionally filtered by agent name).
Show entity types and relation types currently in the KB. Use this before composing Cypher queries via ``query`` or ``ask`` so you know what's available. Returns ``{"entity_types": {type: count}, "relation_types": {type: count}}``.
Delete a saved view.
List saved views with their stored Cypher and last-run stats.
Run a saved view; rows are pull-evaluated against the live KB.
Save a Cypher query as a named view (re-evaluates on each call).
Universal *"what does my agent need to know about X right now"* primitive. ``target`` can be ``"function:authenticate"`` / ``"chapter:5"`` / a plain entity name. Returns ``{"anchor", "neighbours", "recent_contradictions", "role_view"}`` token-budgeted to ``budget_tokens``.
view_save, view_list, view_delete descriptions are under 50 chars and lack context. 'Save a Cypher query as a named view' does not explain WHEN to use views vs ad-hoc queries, or what re-evaluation means.
No pagination guidance for list tools. list_topics and browse_topic accept limit but no offset/cursor or total_count in response. Rubric baseline: tools returning lists should accept page/offset and limit, return total count or next_cursor.