MCP server for a personal knowledge management system that captures, links, and clusters notes using semantic similarity and LLM-powered entity extraction.
ContemPlace demonstrates strong tool design with clear, domain-specific naming (search_notes, capture_note, list_clusters) and comprehensive descriptions (avg 250+ chars). All 8 tools have explicit schemas with typed parameters and descriptions. Strengths: excellent parameter documentation (query limits, thresholds, resolution controls), thoughtful output guidance (e.g., 'prefer raw_input when quoting'), and clear side-effect declarations (capture_note, remove_note). Weaknesses: output schemas are not formally documented in the code (only described in prose); error handling lacks recovery guidance (e.g., what to do if gardening fails); no input validation rules visible for string length constraints; remove_note lacks confirmation/dry-run pattern despite being destructive.
Capture an idea fragment. Required parameter: raw_input (the user's verbatim words). The server embeds, finds related notes, and structures the fragment (title, body, tags, links). Do not pre-structure, summarize, or clean up the input. Voice dictation errors are expected and corrected server-side. Side effect: creates a persistent fragment.
Fetch a single note by UUID with full metadata, body, raw_input, and links. The body is the capture agent's structured interpretation; raw_input is the user's exact words and the source of truth — prefer raw_input when quoting what the user said. The corrections field lists voice-dictation fixes applied (e.g., "cattle stitch → kettle stitch").
Get all notes linked to a given note, in both directions. Link types: contradicts (challenges), related (builds on, supports, parallels), is-similar-to (auto-detected by gardener). The direction field shows whether the queried note is source (outbound) or target (inbound). created_by distinguishes capture-time links from gardener-detected ones.
List thematic clusters detected by the gardener. Clusters group notes by semantic similarity — call with no parameters to see the landscape of accumulated thinking. Results are ordered by gravity (size × recency) — high-gravity clusters are where recent attention is concentrated. Try comparing resolutions (e.g., default 1.0 then 1.5) to see which clusters split, revealing internal conceptual structure. The response includes available_resolutions so you know which values to request. Each cluster includes a sample of note titles (default 5) and hub_notes — the 1–2 notes with the most intra-cluster links, which act as conceptual anchors. Start depth dives with get_related on a hub note.
Output schemas not formally documented. Descriptions explain what fields are returned (e.g., 'similarity links created, clusters computed') but no JSON Schema definitions visible in code. LLMs cannot reliably parse unstructured prose responses.
remove_note is destructive but lacks confirmation/dry-run pattern. Description warns 'Always confirm with the user before calling' but tool itself has no confirm_before_execute mechanism. Agents may delete notes without explicit user consent.
Error handling lacks recovery guidance. No visible error responses that tell LLMs what to do next (e.g., 'Gardening failed. Retry in 5 minutes or check server logs'). Errors appear to return raw messages without classification (retryable vs fatal).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
List the most recently created notes, newest first. Returns summary fields including body text. Use get_note for the full record including raw_input and links.
Remove a note from the active knowledge graph. What happens depends on the note's age: within the grace window (default 11 minutes), the note is permanently deleted — no recovery possible, because you're still in the capture session correcting in real time. Beyond the grace window, the note is soft-archived — hidden from all tools but recoverable via direct DB access. Returns { deleted: true } for permanent deletion or { archived: true, id: "..." } for soft archive. Always confirm with the user before calling.
Search notes by meaning. Returns ranked results with body text included — no need to call get_note just to read content. Scores: above 0.50 is a strong match, 0.35–0.50 is moderate.
Refresh the knowledge graph now. The gardener is the background process that discovers connections between notes — it finds similarity links between fragments, groups them into thematic clusters, and extracts named entities (people, places, tools, projects). Normally runs nightly at 2am UTC. Call this after a burst of captures so you can immediately explore updated links (via get_related) and clusters (via list_clusters) instead of waiting overnight. Takes ~30 seconds. Returns the full run summary: similarity links created, clusters computed, entities extracted, duration. Has a 5-minute cooldown between triggers.
Input validation rules not enforced in visible code. Descriptions mention constraints (query max 1000 chars, limit max 20/50, threshold 0.0 - 1.0) but no validation logic shown. LLMs may pass invalid values; server response unclear.
trigger_gardening has empty required array but no parameters documented. Description mentions 5-minute cooldown but no way for LLM to know when it's safe to retry. Missing cooldown state in response.