MCP server for managing handoffs, tasks, notes, artifacts, and entity extraction with semantic search and knowledge graph capabilities
Strong tool naming and descriptions with clear WHEN/DO NOT CALL guidance. All 6 tools have detailed descriptions (194 - 350 chars, well above 10-char minimum). Input schemas present with types and descriptions. However, output schemas are documented only in prose, not as formal JSON Schema. Parameters lack some constraints (e.g., provider enum not enforced in schema, limit ranges not specified). Error handling mentions specific codes (NO_PROVIDER) but lacks recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels (WRITE vs READ_ONLY). Composition is sound, tools chain well (browse_entities → entity_relations). Security: no secrets in params, but no audit trail or permission gate visible.
Browse the entity graph — list entity nodes with their mention counts and relation counts. CALL THIS WHEN: - The user asks "what entities are in the graph", "show me all technologies", or "list entities related to X" - You want to discover entity IDs before calling entity_relations DO NOT CALL WHEN: - You already know the entity ID and want its relations — use entity_relations directly Parameters: - entity_type: filter by type ('concept', 'technology', 'person', 'organization', etc.) - search: substring match on entity name (case-insensitive) - limit: max results (default 20, max 100) Returns: list of entities with id, name, type, mention_count, relation_count.
Compare two extraction runs to see how much overlap and divergence there is between providers or extraction passes. CALL THIS WHEN: - You just completed two extraction runs with different providers (e.g., ollama vs api) and want to evaluate quality - The user asks "how does run X compare to run Y" or "which provider found more relationships" Returns: - Triple counts for each run - Overlapping triples (same subject canonical name + predicate + object canonical name) - Triples unique to run A and unique to run B - Average confidence per run - Entity type distribution per run - Top 10 highest-confidence triples from each run
Retrieve the relation graph for an entity — what it connects to and how. CALL THIS WHEN: - The user asks "what is X connected to", "show me the relations for Y", or "what depends on Z" - You are traversing the entity graph to answer questions about dependencies or relationships Parameters: - entity_id: UUID of the entity (get from browse_entities if unknown) - hops: traversal depth 1–3 (default 1). Use 2+ for transitive relationships. - relation_type: filter to only relations of this type (e.g., 'blocked_by', 'implemented_with') Returns: source entity info, list of relations with connected entity names and types, and hop depth for multi-hop results.
Output schemas documented in prose only, not as formal JSON Schema. LLMs cannot parse unstructured descriptions to infer response structure for downstream chaining.
Provider parameter accepts free-form string ('ollama', 'api', 'mcp-sampling') but schema does not enforce enum constraint. LLMs may hallucinate invalid provider names.
Numeric parameters (limit, hops) lack min/max constraints in schema. LLMs could pass absurd values (limit=-1, hops=999) that break queries.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Trigger entity extraction on a single content item (handoff or note) and persist the resulting knowledge graph triples. CALL THIS WHEN: - The user asks to "extract entities from this handoff/note" or "update the entity graph for X" - You want to populate the entity graph for a specific item before querying it with entity_relations or browse_entities DO NOT CALL WHEN: - You want to process many items at once — use run_extraction instead - You want to browse already-extracted entities — use browse_entities or entity_relations Parameters: - content_type: 'handoff' or 'note' (required) - content_id: UUID of a note, or filename of a handoff. If omitted, uses the most recent handoff. - provider: 'ollama', 'api', or 'mcp-sampling'. If omitted, uses the active provider from config. Returns: triple_count, entity_count, provider_used, run_id, duration_ms. Returns error with code NO_PROVIDER if no extraction provider is configured or available.
List recent entity extraction runs with status, provider, triple counts, and timestamps. Use this to find run IDs for compare_extractions, to check the status of a recent batch, or to review extraction history.
Batch-extract entities from multiple content items under a single extraction run. Used to populate or refresh the entity graph at scale. CALL THIS WHEN: - The user asks to "re-extract everything", "run entity extraction on all notes", or similar batch requests - You want to set up two runs with different providers so you can compare them with compare_extractions DO NOT CALL WHEN: - Only one specific item needs extracting — use extract_entities instead - You just want to see what's already in the graph — use browse_entities Parameters: - provider: which extraction provider to use ('ollama', 'api', 'mcp-sampling') - scope: 'handoffs', 'notes', or 'all' (default: 'all') - limit: max items to process (default: unlimited) Returns: run_id, status, triple_count, content_count, provider_used, duration_ms. Suggest following up with compare_extractions if this is the second run of a provider comparison.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels marked in source (WRITE vs READ_ONLY). Agents cannot infer safety properties.
Error handling mentions NO_PROVIDER code but lacks recovery guidance. Description should suggest 'Configure a provider in config or pass provider parameter explicitly.'