KSJ MCP Server
Turn handwritten or digital journal pages into a private, local, AI-searchable knowledge base you can query, connect, synthesize, and export.
Capture pages from photos via local OCR (
upload_capture,bulk_upload) — nothing is rejected; unfilable pages land in Wild Art.Search full-text across all entry types by concept or phrase (
search_captures), with tag/date filters.Browse by tag using prefixes
#,@,!,?,$,→(list_by_tag).Explore connections between captures via tags,
@references, entities, and asserted links (find_connections, plusneighborhood,find_path,rebuild_connections).Get overviews of counts, top tags, open questions, insights, and practice health (
get_stats,journal_health).Find synthesis opportunities and review your breakthrough timeline (
suggest_synthesis,get_breakthroughs).Export as Markdown/JSON, study decks from open questions, or a self-contained HTML view (
export_captures,export_study_deck,export_html), plus JSONL backup/restore.Fix or refile captures (
correct_ocr,promote_capture,identify_capture) and manage multiple journal volumes (set_volume).Analyze dreams and track knowledge mastery progression (
dream_patterns,dream_correlation,knowledge_progress).Run AI companion checks — independent synthesis, review, and dream-bridging dialogues that store approved AI-extracted entries (
surface_connections,audit_knowledge_status,bridge_dream_research,extract_insights, with matching commit tools).Stay local by default — SQLite storage on your machine; cloud OCR only if you explicitly enable it.
Allows exporting open questions from journal entries as a portable CSV study deck for use in Anki flashcard software.
Supports exporting journal captures, insights, and filtered search results as Markdown files.
Provides the capability to export open questions from journal entries into a CSV format compatible with Notion.
Facilitates exporting study decks from captured journal questions as CSV files for import into Quizlet.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@KSJ MCP ServerSearch my journal notes for ideas about spaced repetition"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
KSJ MCP Server
Knowledge Synthesis Journal v2.0 — AI companion
Current release: ksj-mcp v3.9.0 · built on the official Python MCP SDK 2.x
Turn your handwritten journal photos into a searchable, AI-powered knowledge base — privately, on your own machine.
Get the journal: Knowledge Synthesis Journal v2.0 on Amazon
Contents
Related MCP server: recall-mcp
What it does
The KSJ MCP server connects your knowledge — handwritten or digital — to an AI assistant via the Model Context Protocol (MCP) — an open standard for linking AI models to local tools and data.
Physical journal → knowledge base
Photograph a journal page, show it to your AI assistant, and it can:
Search across everything you've ever written
Find connections between ideas (shared tags,
@references)Surface your open questions, key insights, and breakthroughs
Export your knowledge base as Markdown or JSON
How pages get in — two paths:
Assistant vision (recommended). Share the photo in chat, let your assistant read the handwriting, confirm the transcription, and it stores the page with
manual_capture. Modern AI vision is dramatically more accurate on handwriting than traditional OCR — this is the normal workflow.Local OCR (optional).
upload_captureandbulk_uploadrun Tesseract on your machine. Fully offline, but Tesseract struggles badly with cursive handwriting — best for printed or very neat text.
Either way, a bad read is never permanent: correct_ocr replaces a stored
capture's text and re-runs parsing, tags, and connections, while the original
read is preserved. And nothing you upload is ever rejected — a page that can't
be filed normally lands in Wild Art
for review instead.
AI research sessions → structured insights
Spend an hour going deep on a topic with an AI assistant and most of that thinking vanishes when the chat ends. extract_insights fixes that — paste or pipe a session transcript and the server extracts what matters:
Novel hypotheses and seed ideas
Unexpected connections between concepts
Open questions worth pursuing
Decisions made and action items
Each insight is confidence-scored (🟢 Seed / 🔴 Developing / 🟡 Strong) and shown to you for review before anything is written to the database. Approved entries are stored alongside your journal captures with full tag support, so AI-extracted insights surface in searches, connection graphs, and synthesis suggestions alongside your handwritten notes.
AI companions — an independent check on what you already wrote
Three pairs of tools go a step further than search and connections: each runs an independent AI pass against a page you've already written by hand, then walks you through what it found before anything gets stored. Same shape every time — scan → structured dialogue → your approval → a separate AI-Extracted entry. Your original page is never rewritten.
Synthesis.
surface_connectionsre-derives connections across the RC cluster behind a SYN page — blind to what the page itself says — then compares its independent read against yours: what you both found, what it caught that you missed, what you saw that no tag overlap could have surfaced.commit_distillationstores what the comparison revealed once you approve it, linked to the SYN page with adistillsedge.Review.
audit_knowledge_statuschecks a claimed Knowledge Status (Solid / Mastered) against real evidence still sitting in the journal — open questions and uncited insights on that topic.commit_assessmentrecords the outcome with anassessesedge; your REV page's claimed status is never rewritten — a real status change only ever happens on a future hand-written page.Dream Capture.
dream_correlationreports plain co-occurrence between dream entries and your waking entries — deliberately labeled co-occurrence, not correlation, with the window size, match count, and base rate always shown, since a small journal can make anything look meaningful.bridge_dream_researchbuilds on it with a dialogue about what a dream's symbols mean to you, andcommit_observationstores the outcome with anobservesedge — called an observation, not an inference, because that's what a journal this size can actually support.
Every one of these runs after the physical page exists, never before — running the check first would let the AI perform the thinking the physical practice exists to force. None has an override flag for that precondition, and the dialogues themselves are built to ask, not propose: a question makes you think; a suggested answer makes the AI think, in your place.
Local by default. Storage, search, and connections all live in a SQLite database on your machine — nothing is synced or hosted anywhere. When your AI assistant reads a journal photo with vision, that image is handled by your assistant's platform like any other chat attachment; the local Tesseract OCR path keeps everything on-machine. Optional cloud OCR for bulk imports exists but is off unless you explicitly enable it with your own key.
AI platform support
This server uses MCP (Model Context Protocol), an open standard with growing support across AI platforms and developer tools.
Tested:
Claude Desktop (free) — full MCP support, recommended for getting started
Claude Code — terminal and IDE (setup)
Google Antigravity CLI (
agy) — add the same"ksj"block to~/.gemini/config/mcp_config.json(Windows:C:\Users\<you>\.gemini\config\mcp_config.json), then restartagy. Save the file as plain UTF-8 without a byte-order mark: Windows Notepad and PowerShell'sSet-Contentcan add one invisibly, and Antigravity then rejects the whole file and loads no MCP servers at all.
Other MCP-compatible clients should work with the same "ksj" config
block but are untested — check your client's MCP documentation for where its
config lives.
Using ChatGPT, Gemini, or another platform?
Use the export_captures tool to dump your knowledge base as Markdown or JSON, then paste it into your AI assistant of choice. Full native MCP support for additional platforms is on the roadmap as the ecosystem grows.
Protocol compliance: ksj-mcp runs on the official Python MCP SDK 2.x (2.0.0 or later) over the stdio transport. The server is dual-era: it answers the classic initialize handshake (negotiated up to protocol revision 2025-11-25), and a client that opens with the 2026-07-28 per-request envelope gets the modern era, including server/discover. Which era is used is the client's choice. Since v3.7.0 the server answers the handshake before it opens your knowledge base, so startup time no longer grows with the size of your journal. Since v3.9.0 the ksj-mcp command is a small launcher that answers the handshake from a cache written by the previous run (handshake-cache.json in the data directory) while the full server loads, so ksj connects even on a slow or busy machine; the first start after an install or upgrade fills the cache. Set KSJ_FAST_HANDSHAKE=0 to run the server directly. (MCP is versioned by dated spec release, not semantic version — "MCP SDK 2.x" above refers to the SDK package's own version number, not the protocol revision.)
Setup (3 steps)
No OCR software needed — your AI assistant reads the pages. (Want fully offline OCR too? See Optional: offline OCR after setup.)
Step 1 — Install an MCP-compatible AI client
The fastest way to get started is Claude Desktop (free at claude.ai/download).
For other MCP clients, consult their documentation for how to register a local MCP server, then use the config in Step 3.
Step 2 — Install uv and the KSJ server
uv is a fast Python package manager used to install and run the KSJ server.
Install uv:
Platform | Command |
Windows |
|
macOS/Linux |
|
Open a new terminal after installing uv, then verify with uv --version
before continuing.
Install the KSJ server (run once in a terminal):
uv tool install --compile-bytecode --from git+https://github.com/ChavezAILabs/ksj-mcp ksj-mcpThis installs ksj-mcp as a persistent command on your machine. Git must be
installed for this step (Windows: Git for Windows).
--compile-bytecode precompiles the server and its libraries at install
time, so the first launch isn't slowed by compiling them.
Verify with uv tool list — it should list ksj-mcp with a version number.
To update later:
Fully quit your AI client first — on Windows, close Claude Desktop from the system tray too, not just the window. The client keeps the
ksj-mcpprogram open, and the update then fails with "Failed to install entrypoint … being used by another process (os error 32)".Run:
uv tool install --reinstall --compile-bytecode --from git+https://github.com/ChavezAILabs/ksj-mcp ksj-mcp--reinstallmatters: a plainuv tool installsilently does nothing when the version number hasn't changed.Reopen your AI client and ask it to run
get_version.
The first start after an install or update is the slow one: the server loads its libraries from scratch and saves its handshake answers for next time (see Troubleshooting if it times out). Every start after that connects in seconds.
Step 3 — Register the server
Claude Desktop: open Settings → Developer → Edit Config — that opens the right file for you. Or find it directly:
Platform | Path |
Windows |
|
macOS |
|
Edit the file only while Claude Desktop is fully quit (Windows: also quit it from the system tray). Claude Desktop saves its own settings to this same file when it quits, and can overwrite changes you made while it was running.
Claude Desktop launches MCP servers with a limited PATH, so a bare
"ksj-mcp" command often won't resolve even though it works fine in a
terminal — use the full path to the binary uv tool install created in
Step 2 instead:
Platform | Typical binary path |
Windows |
|
macOS/Linux |
|
Add the following block (Windows example shown — swap in your macOS/Linux path if applicable):
{
"mcpServers": {
"ksj": {
"command": "C:\\Users\\<you>\\.local\\bin\\ksj-mcp.exe"
}
}
}If the file already has an mcpServers block, add the "ksj": { … } entry
inside it rather than adding a second block. Save, then start Claude Desktop.
ksj should appear under Settings → Developer with status running,
and in the chat's connectors/tools menu. Ask your assistant to run
get_version to confirm.
Claude Code (terminal or IDE) — one command registers ksj for all your projects:
claude mcp add --scope user ksj -- C:\Users\<you>\.local\bin\ksj-mcp.exe(macOS: use the full path from the table above.) Check it with
claude mcp get ksj; it should say Connected.
Optional: offline OCR (Tesseract)
Only needed if you want upload_capture / bulk_upload to read photos fully
on-machine instead of via your assistant's vision. Fair warning: Tesseract
performs poorly on cursive handwriting — printed or very neat text works best.
Platform | Command |
Windows | Download the installer from UB-Mannheim/tesseract — check "Add to PATH" during install |
macOS |
|
Linux |
|
After installing, restart your AI client so the updated PATH is picked up.
Windows note: If you skip "Add to PATH", the server will still auto-detect Tesseract at the default install location (
C:\Program Files\Tesseract-OCR\).
Optional: cloud OCR for bulk imports
Off by default — nothing leaves your machine unless you turn this on.
Importing a whole folder of handwritten pages with bulk_upload is the one
place local Tesseract really hurts: cursive comes out as noise, page after
page. If you have a large backlog, you can point the server at your own
Azure Document Intelligence resource (~9% word error rate on handwriting
vs ~95% for Tesseract):
{
"mcpServers": {
"ksj": {
"command": "C:\\Users\\<you>\\.local\\bin\\ksj-mcp.exe",
"env": {
"KSJ_OCR_BACKEND": "azure",
"KSJ_AZURE_ENDPOINT": "https://<your-resource>.cognitiveservices.azure.com",
"KSJ_AZURE_KEY": "<your-key>"
}
}
}
}(Use the command path from Step 3 for your platform.)
What this means for your data: each uploaded image is sent to your own
Azure resource (your subscription, your key, Azure's data terms) for text
extraction. Nothing else is sent anywhere, and your knowledge base stays
local either way. Every upload's output states plainly when cloud OCR is
active. Remove KSJ_OCR_BACKEND to return to fully local processing.
For a handful of pages, skip all of this — sharing the photo in chat and letting your assistant read it is free and just as accurate.
Usage
Once connected, talk to your AI assistant naturally.
Capturing pages (recommended flow):
[share a photo of the page in chat] "Read this journal page and add it to my knowledge base"
"Here's RC-007 — transcribe it, show me what you read, then store it"
Capturing via local OCR (optional, needs Tesseract):
"Upload my journal photo from /Users/me/Desktop/RC-001.jpg"
"Process all the photos in my /Desktop/journal-scans folder"
Fixing a bad read:
"Capture #12's text is wrong — here's the corrected transcription: …"
Searching & browsing:
"Search my notes for ideas about spaced repetition"
"Show me everything tagged #machine-learning"
"What are my open questions about calculus?"
"Show me everything connected to RC-015"
Synthesis & review:
"Which topics am I ready to synthesize into a SYN page?"
"Show me my breakthrough timeline"
"How is my understanding of #linear-algebra progressing?"
"Run surface_connections on SYN-004" → independent scan of the RC cluster behind it, then a dialogue comparing what it found against what you wrote
"Audit REV-008 against the evidence" → checks its claimed Knowledge Status against open questions and uncited insights still sitting on that topic
Dream Capture:
"What symbols and themes keep appearing in my dreams?"
"Show me all my dream entries from this month"
"Does #flying show up near any of my waking entries?" → plain co-occurrence counts, always with the window, match count, and base rate shown
"Bridge DC-005 to my research" → checks for cross-domain echo, then asks what the dream's symbols mean to you (never proposes an interpretation)
Export & health:
"Export all captures tagged #ai as Markdown"
"Generate a study deck from my open questions"
"How's my journal practice looking?"
"Give me a browsable view of my whole knowledge base" → writes a self-contained
.htmlfile — timeline (with date-range search and a 25-at-a-time load-more), tag/entity index, per-capture connection lists, and an ego-centric connection graph (click a tag cluster or a capture to see its local neighborhood, click any neighbor to recenter) — you can open in any browser, no server or install required. Both the in-page ← Back button and your browser's Back button step back through the views you visited, and a reload reopens the same view.
Wild Art & loose captures:
[share a photo of a napkin sketch] "Add this napkin sketch as a loose capture"
"What's waiting in Wild Art?" →
list_by_tag(entry_type="WA")
"WA-003 is actually RC-021 — file it" →
promote_capture
"SYN-006 develops the napkin idea in WA-004 — link them"
Available tools
37 tools. All of them were exercised against a real 1,000-capture journal (real-data and bad-input cases) in the 3.7 test pass on 2026-09-25; the fixes it led to shipped in 3.8 and 3.9.
How connections work. Captures are linked four ways: an @RC-012-style
reference written on the page, a named entity they share, a relationship you
asserted by hand (assert_connection), or shared topic tags. Tag links are
kept useful by two rules: tags that name the kind of note ($insight,
?question, !priority) never create links on their own, and each capture
keeps at most its 25 best tag links — links through a rare tag first, then the
strongest, then the nearest in time.
Journal tools
Tool | What it does |
| Report the running ksj-mcp, mcp, pydantic, and Python versions — confirms an install or upgrade actually took effect |
| Store a page your assistant transcribed with vision — the primary capture path. Never rejects: a page it can't file lands in Wild Art. Also takes 3-D isometric pages ( |
| OCR a journal photo locally (Tesseract), parse the template, store it, highlight strongest connection — never rejects (see Wild Art) |
| File a Wild Art entry under its proper type (RC / SYN / REV / DC / ISO). Refuses an occupied page ID instead of overwriting or renumbering; keeps the WA history |
| Replace a stored capture's text with a corrected transcription — re-parses tags and connections, preserves the original |
| Assign or fix a stored capture's template ID (for a Wild Art entry it runs |
| Process a whole folder of photos at once (local OCR) — pages it can't file are kept as Wild Art, not skipped |
| Multiple journals: set which book new captures go into and which books search sees |
| Link a named entity (person, place, work, dream symbol) to a capture |
| Assert that one capture supersedes / refutes / narrows / supports / distills / assesses / observes / develops another ( |
| Re-derive the connection graph from current tags and text, and report the link counts by type (asserted edges are never touched). Seconds, even on a large journal |
| Shortest chain of connections between two captures |
| Everything within N hops of a capture — its local knowledge cluster |
| Health check: orphan captures, un-closed superseded claims, unresolved contradictions, stale open questions, fragmented tags |
| Full knowledge base to a versioned JSONL file (format doc) |
| Restore a JSONL backup — additive, nothing overwritten |
| Self-contained, offline HTML view — timeline with date search and load-more, tag/entity index, per-capture connection lists, and an ego-centric connection graph; in-page and browser Back both step through views; footer records versions, export time, and counts. Opens in any browser |
| Full-text search with optional tag, date, entry type, and Wild Art reason filters |
| Browse captures by tag or prefix — or by entry type / Wild Art reason, e.g. the whole Wild Art queue |
| Show a capture's connections, ranked: asserted relationships, |
| Overview: counts, top tags, open questions, insights, date range, Wild Art split into "needs attention" and loose captures |
| Dump your knowledge base as Markdown or JSON |
| Find RC topic clusters ready to become a SYN entry |
| Independently scan the RC cluster behind a SYN page you've already written, then run a structured comparison dialogue — runs after the page exists, never before; no DB write |
| Store the confirmed outcome of a |
| Export |
| KPI dashboard + coaching: velocity, synthesis ratio, review cadence, open questions |
| All SYN entries chronologically — your complete breakthrough timeline |
| Recurring symbols, emotions, motifs, and themes across DC pages |
| Co-occurrence between DC entries and RC/REV entries sharing a tag, within a day window — descriptive only: always reports the window, match count, and base rate, never claims "correlation" or significance |
| Track Needs Work → Solid → Mastered progression from REV entries |
| Independently check a REV page's claimed status against evidence (open questions, uncited insights), then run a structured dialogue over anything that doesn't line up — runs after the page exists, never before; no DB write |
| Store the confirmed outcome of an |
| Independently check a DC page for cross-domain echo (via |
| Store the confirmed outcome of a |
AI session tools
Tool | What it does |
| Prepare an AI research session for insight extraction — loads knowledge-base context, no DB write |
| Store the reviewed, confirmed insights as AIEX entries after your approval |
Schema tag system
Use these prefixes anywhere on your journal pages — the server extracts them automatically.
RC, SYN, REV pages:
Prefix | Meaning | Example |
| Topic / domain |
|
| Source / reference |
|
| Priority / urgency |
|
| Open question |
|
| Key insight |
|
| Cause / effect |
|
DC (Dream Capture) pages use a dream-specific variant:
Prefix | Meaning | Example |
| Dream theme |
|
| Symbol or character |
|
| Recurring motif |
|
| Sensory detail |
|
Three things the server does with these automatically:
Roles. The same character means different things on DC pages than on RC/SYN/REV (
!is priority on RC, a recurring motif on DC). The server stores the meaning alongside the character, so browsing by tag can distinguish them — ask for "priority items" vs "dream motifs".Entities. An
@value that isn't a template ID (@Veronica,@the-old-house) becomes a named entity — searchable across every capture and every journal volume. Dream symbols and story characters are the same kind of object.Tag bubbles. Anything written inside the printed tag bubbles counts as a tag, with or without the
#.DOG MAN,Dog-Man, andDOG-MANall normalize to the same tag.Connections. Topic tags (
#), entities (@), dream motifs and sensory details link captures.$,?and!on RC/SYN/REV pages mark what kind of note something is, so they're searchable and counted but don't link two captures by themselves.
Page layout. Write field labels the way the page prints them — on their
own line or with the content after a colon (Key Points: …) both work, as do
extra headings of your own (Action Items:, NEXT STEPS). Each section runs
until the next label.
Wild Art: nothing is ever rejected
Any page the server can't file normally is stored as a Wild Art (WA)
entry (WA-001, WA-002, …) instead of being rejected. Its text, tags,
photo, and connections are kept exactly as for any other page, and the reason
is recorded:
Reason | When |
| The page ID is already taken in that volume. The existing page is untouched, and the WA entry records the ID it was read as and which capture holds it |
| No template ID could be read |
| The ID was only read loosely from a low-confidence OCR pass |
| E.g. an explicit template ID that doesn't parse |
| On purpose: anything off-journal, like a napkin sketch, sticky note, whiteboard photo, or the back of a receipt. No volume or page ID needed |
| Filed as Wild Art by hand / anything else |
Review:
list_by_tag(entry_type="WA"), optionally withwa_reason=….get_statsandjournal_healthreport real failures ("needs attention") separately from loose captures ("no action needed").File it:
promote_capture(capture_id, "RC", "RC-021")moves it to its proper type and keepspromoted_fromand the original reason. If the page ID is already taken, nothing changes: you choose a different ID or volume. IDs are never renumbered automatically.Link a scribble: when a journal entry develops a loose capture's idea,
assert_connection(entry, scribble, "develops")links them and keeps the scribble as the source.
3-D isometric pages (not dot-grid) have their own type, ISO
(ISO-001, …). Store them with manual_capture(template_id="ISO-001"),
transcribing the subject line, labels, and notes around the drawing. They
show up under their own type in search, Index, and the Timeline filters.
Multiple journals (volumes)
Finished a journal and started a second one? The new book starts over at RC-001 — that's expected. Each physical journal is a volume, and volume 2 continues volume 1's knowledge base: search spans all volumes and cross-volume connections are normal.
When you start a new book, say so once:
"I'm starting my second journal" → the assistant runs
set_volume(current_volume=2)
Or write the volume on the page itself (e.g. V2 next to the template ID),
or pass volume=2 on a single upload. If an upload collides with an existing
page ID, it's kept as Wild Art (id_conflict) and the assistant asks what it is:
a page from a new journal (promote_capture(…, volume=2)), a misread ID
(promote_capture with the right ID), or a cleaner re-capture of the same page
(re-upload with force=True). Nothing is ever silently overwritten, and a page
is never filed into the wrong volume to get around a conflict.
Troubleshooting
"Tesseract OCR is not installed"
You called upload_capture/bulk_upload, which need the optional local OCR engine. Either install Tesseract (Optional: offline OCR) and restart your AI client — or skip it entirely: share the photo in chat and ask your assistant to read and store the page instead.
"Stored as Wild Art … unrecognized_template" (or UNIDENTIFIED, for pages stored before v3.7)
The template ID couldn't be read from the photo, but the page and its text were stored anyway, so nothing is lost. Tell your assistant the correct ID ("that's RC-007") and it will file it with promote_capture (or identify_capture for a pre-3.7 UNIDENTIFIED page). Sloppy or unpadded IDs (RC-7, RC-OO2, a stray letter after the number) are read automatically with a confirmation note.
OCR got the text wrong
Ask your assistant to fix it with correct_ocr — give it the capture number and the corrected text. The original read is preserved, and tags and connections are rebuilt from the correction.
"Stored as Wild Art … id_conflict — RC-001 already exists"
The page ID is already taken, so the new page was kept as Wild Art and the original is untouched. If it's a cleaner retake of the same page and you want it to replace the original, upload with force=True:
"Upload /path/to/RC-001.jpg with force=True"
If it's a page from a new journal, or its ID was misread, file it with promote_capture instead.
"ksj didn't respond within a minute" / "Couldn't start … Request timed out" The server took too long to start. This is expected once, right after an install or update: the server loads its libraries from scratch and saves its handshake answers for next time. Quit and reopen your AI client once more and it should connect in seconds. If it keeps timing out:
Check how busy the machine is. On a low-power laptop, cloud-sync catch-up (OneDrive, Google Drive), a heavy background job, or right after a reboot can push startup past the client's limit. Let it settle and restart the client.
Some antivirus products scan every Python file on each start. Excluding the uv tools folder from real-time scanning (Windows:
%APPDATA%\uv\tools; macOS:~/.local/share/uv/tools) can cut startup sharply. That's a security setting — your call.Read the server log (below) for the actual error.
Where the logs are (Claude Desktop):
Platform | Log file |
Windows |
|
macOS |
|
"Failed to install entrypoint … being used by another process (os error 32)" Windows, during an install or update: your AI client still has the server open. Fully quit it (including from the system tray) and run the command again. The library part of the update may already have succeeded, so the next start can run the new version anyway, but re-run the command so uv's own record of the install is correct.
"Server transport closed unexpectedly" / server not starting
Run uv tool list in a terminal — it should list ksj-mcp with a version number. If it's missing, re-run the install command from Step 2. If it's installed, the issue is likely the Claude Desktop config — double-check it is valid JSON and that command is the full path to the ksj-mcp binary (see Step 3), not just "ksj-mcp".
Server not appearing in tools panel
Confirm uv tool list shows ksj-mcp installed, verify the config file is valid JSON, and restart Claude Desktop after saving any config changes. Once it's connected, ask your assistant to use the get_version tool — that confirms the server is actually running and reachable, not just installed.
Data location
All your captures are stored locally in ~/.ksj-mcp/:
Platform | Path |
Windows |
|
macOS/Linux |
|
Files:
~/.ksj-mcp/captures.db (SQLite database — all your captures and tags)
~/.ksj-mcp/images/ (copies of uploaded journal photos)
~/.ksj-mcp/handshake-cache.json (saved startup answers; safe to delete — rebuilt on the next start)
~/.ksj-mcp/captures.db.bak-v* (automatic backups made before upgrades — see below)Your data is never sent anywhere and persists across updates. Schema
upgrades run automatically in the background right after the server starts,
and tools wait for them to finish. Before an upgrade changes your stored data,
your database is backed up in the same folder: to captures.db.bak-v3 before
the first 3.0 start, captures.db.bak-v37 before the first 3.7 start, and
captures.db.bak-v38 before the first 3.8 start (which re-reads hand-written
pages with the improved parser and rebuilds the connection graph). Once you've
checked the upgraded journal, old backups can be deleted.
Custom location: Set the KSJ_DATA_DIR environment variable in your config to store data elsewhere:
{
"mcpServers": {
"ksj": {
"command": "C:\\Users\\<you>\\.local\\bin\\ksj-mcp.exe",
"env": {
"KSJ_DATA_DIR": "C:\\Users\\you\\Documents\\ksj-data"
}
}
}
}(Use the command path from Step 3 for your platform.)
License
MIT — free to use, modify, and share.
Created by Chavez AI Labs LLC paul@chavezailabs.com
Get the journal: Knowledge Synthesis Journal v2.0 (Amazon)
Available Tools
37 toolsassert_connectionA
Assert a typed, directional relationship between two captures by hand.
Relations (source → target):
supersedes — source replaces target. Target is closed out (kept in
history, hidden from current-slice search — never deleted).
refutes — source contradicts target.
narrows — source restricts target's claim without overturning it.
supports — source is evidence for target.
distills — source (an AIEX distillation entry) is derived from
target (a SYN page). Normally set automatically by
commit_distillation(); asserting it by hand is for
fixing or adding a link that tool didn't create.
assesses — source (an AIEX assessment entry) audits target (a REV
page)'s claimed knowledge status. Normally set
automatically by commit_assessment().
observes — source (an AIEX observation entry) notes target (a DC
page)'s cross-domain echo or confirmed symbol meaning.
Normally set automatically by commit_observation().
develops — source (a journal entry, e.g. a SYN page) develops the
idea first scribbled in target (typically a loose Wild Art
capture — a napkin sketch or sticky note). The scribble
stays as the source; nothing is closed out.
Automatic contradiction detection is deliberately not offered — it
cannot be done reliably. Supersession is either asserted here by a
human or not recorded. Re-asserting between the same pair replaces the
previous assertion.
Args:
source_id: The newer / asserting capture (numeric ID).
target_id: The capture being superseded / refuted / supported / distilled / assessed / observed / developed.
relation: supersedes | refutes | narrows | supports | distills | assesses | observes | develops
note: Optional one-line reason, stored on the edge.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| relation | Yes | ||
| source_id | Yes | ||
| target_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that supersedes closes the target out (kept in history, hidden from search, never deleted), that re-asserting between the same pair replaces the prior assertion, and that automatic contradiction detection is deliberately absent. It stops short of permissions/auth or concurrency details, but the side-effect profile is unusually well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long, but the length is justified by eight relation types that each require distinct semantics, and the purpose is front-loaded in the first sentence. Minor verbosity in the repeated 'normally set automatically by ...' phrasing, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a domain-complex, annotation-free mutation tool with an output schema, the description supplies the relation taxonomy, directionality, manual-vs-automatic guidance, and side effects. Return values are covered by the output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: the Args block defines all four parameters and gives a full semantic breakdown of every relation enum value beyond the bare string list. An agent knows exactly what source_id and target_id mean relative to the chosen relation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (assert) and resource (a typed, directional relationship between two captures), and immediately clarifies the directionality (source → target). This clearly distinguishes it from siblings like assert_entity, find_connections, or rebuild_connections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It spells out exactly when each relation applies, and crucially notes which relations (distills, assesses, observes) are normally set automatically by commit_distillation/commit_assessment/commit_observation and that manual assertion is for fixing or adding missing links. It also explicitly rules out automatic contradiction detection, telling the agent that a human must assert supersession.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assert_entityA
Manually link a named entity (person, place, work, organization, dream
symbol...) to a capture.
Entities are first-class objects: '@' tags that aren't template IDs
create them automatically (e.g. @Veronica, @the-old-house), and this
tool covers what extraction missed or mis-typed. Entities are global
across volumes — a character in book 1 and book 3 is one entity.
Args:
capture_id: The capture the entity appears in.
name: The entity's name as written (display form).
kind: person | place | work | org | symbol | other
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | other | |
| name | Yes | ||
| capture_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that entities are global across volumes and auto-created by '@' tags, but says nothing about idempotency, what happens if the entity already exists or is already linked, or error behavior for an unknown capture_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first sentence, then adds useful context, then lists args. It is well-sized with little waste; the parenthetical kind examples are the only slightly padded element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return values need not be described. The description covers purpose, usage context, global-scope semantics, and all parameters, leaving only mutation edge cases undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it explains capture_id, name ('display form as written'), and expands kind into an enumeration (person|place|work|org|symbol|other) that the schema itself lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('link') and resource ('named entity ... to a capture') with concrete examples of entity kinds. It differentiates itself from the sibling assert_connection by scope (entity-to-capture rather than connection graphs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly scopes usage — 'covers what extraction missed or mis-typed' — and explains that '@' tags auto-create entities, implying this tool is the manual fallback. There is no explicit statement of when NOT to use it or a named alternative, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audit_knowledge_statusA
Independently check a Review page's claimed Knowledge Status against
evidence in the journal, then prepare a dialogue over anything that
doesn't line up — e.g. a topic marked Mastered that still has open
questions attached to it.
This runs AFTER a REV page exists — never before; there's nothing to
audit until a status has actually been claimed. If no REV page is
found, the tool declines. This tool does NOT write to the database —
it prepares the audit and dialogue instructions for Claude to run in
this conversation. Call `commit_assessment()` after the user reviews
the outcome, to persist it. Never changes the REV page's own claimed
status — that stays physical-authority, exactly like
surface_connections never rewrites a SYN page.
A "Needs Work" claim isn't checked against evidence — it doesn't claim
completeness, so there's nothing to hold it to. Only Solid and
Mastered claims get audited.
Trigger phrases: "Audit REV-008", "Check my knowledge status claims
against the evidence".
Args:
rev_template_id: The REV page's template ID (e.g. "REV-008").
Required — the tool declines if no REV page with
this ID exists.
depth: "brief" | "standard" (default) | "deep" — how many
follow-up questions per flagged topic to plan for.
The user can also say "more on this one" for any
single topic regardless of depth.
Returns the claimed statuses, evidence findings per topic, and audit +
dialogue instructions for Claude to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | standard | |
| rev_template_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: it discloses that the tool does NOT write to the database, instead preparing instructions for Claude, that it declines without a REV page, and that it never mutates the claimed status. These are exactly the behavioral traits an agent needs and cannot infer from schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then sequencing, then args, then returns — a clean structure. It is somewhat long and the surface_connections analogy is illustrative rather than load-bearing, but almost every sentence carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an output schema (so return values needn't be re-explained, though they are summarized), the description covers preconditions, decline behavior, audit scope, and persistence handoff. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no descriptions, no enums), so the description must compensate fully. It does: rev_template_id is documented with format ('REV-008') and requirement semantics ('declines if no REV page with this ID exists'), and depth is spelled out with its enum values, default ('standard'), and the 'more on this one' override.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Independently check a Review page's claimed Knowledge Status against evidence in the journal.' It even defines the scope of what gets audited (Solid/Mastered, not Needs Work), so an agent can distinguish it from siblings like commit_assessment or knowledge_progress.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing ('runs AFTER a REV page exists — never before'), a stated failure mode ('If no REV page is found, the tool declines'), an inclusion/exclusion rule ('Only Solid and Mastered claims get audited'), and the follow-up path ('Call commit_assessment() after the user reviews the outcome'). This is textbook when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_dream_researchA
Independently check a Dream Capture entry for cross-domain echo — RC/REV
entries sharing a theme within a few days of the dream — and prepare a
dialogue over what, if anything, the dream's symbols mean to you.
This runs AFTER a DC page exists — never before; there's nothing to
bridge until a dream has actually been recorded. If no DC page is
found, the tool declines. Reuses dream_correlation()'s co-occurrence
data (chain 1: composed, not reimplemented) for the cross-domain-echo
half, so the same non-negotiable guardrails apply here too: these are
plain co-occurrence counts, never "correlation," always reported with
window_days, match count, and base rate.
This tool does NOT write to the database — it prepares the findings
and dialogue instructions for Claude to run in this conversation. Call
`commit_observation()` after the user reviews the outcome, to persist
it. Never changes the DC page's own dream narrative — that stays
physical-authority, exactly like surface_connections never rewrites a
SYN page. The artifact this tool exists to produce is a *noticing*,
not a conclusion — at journal scale this dialogue cannot support
calling its output an inference — and never a restatement of the
dream (already stored) or an asserted claim about what a symbol means
(that's the user's call, always asked, never proposed).
Trigger phrases: "Bridge DC-005 to my research", "What does this dream
connect to?".
Args:
dc_template_id: The DC page's template ID (e.g. "DC-005").
Required — the tool declines if no DC page with
this ID exists.
window_days: How many days apart counts as "near," for the
cross-domain-echo check (default 3).
depth: "brief" | "standard" (default) | "deep" — how many
follow-up questions per topic to plan for. The
user can also say "more on this one" for any
single topic regardless of depth.
Returns the dream's own content, cross-domain echoes, and dialogue
instructions for Claude to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | standard | |
| window_days | No | ||
| dc_template_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it discloses that it does NOT write to the database, that it reuses dream_correlation()'s co-occurrence data with the same guardrails (window_days, match count, base rate, never 'correlation'), that it never rewrites the DC narrative, and that its output is a 'noticing' not a conclusion or an asserted symbol meaning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and precondition, and nearly every clause carries distinct information. It is long and heavily parenthetical, which adds density and some friction, but the content is not redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an output schema present, the description supplies everything an agent needs: preconditions, guardrails, side-effect profile, persistence follow-up, and a brief return summary. No material gap remains for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for all three params: dc_template_id with an example ('DC-005') and its required/decline behavior, window_days defined as 'how many days apart counts as near' with default 3, and depth enumerated as brief/standard/deep with a default and a 'more on this one' override.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('check a Dream Capture entry for cross-domain echo') plus the concrete scope (RC/REV entries sharing a theme within a few days) and names the actual product of the tool ('prepare a dialogue'). It implicitly distinguishes itself from dream_correlation by noting it reuses that tool's data rather than duplicating it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('runs AFTER a DC page exists — never before'), an explicit failure mode ('if no DC page is found, the tool declines'), explicit follow-up routing ('call commit_observation() after the user reviews the outcome'), and even trigger phrases. When-to-use and when-not are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_uploadA
Process all journal page photos in a folder at once.
Finds every image file (JPG, PNG, TIFF, BMP, WebP) in the folder and runs
the full upload pipeline on each one. Non-image files are skipped silently.
Accept-by-default: no page is skipped. Pages without a readable template
ID, or whose page ID is already taken, are stored as Wild Art (WA)
entries with the reason recorded — review them afterwards with
list_by_tag(entry_type="WA") and promote_capture(). Pass volume=N when
importing a second (or later) journal.
Note: by default this path uses local Tesseract OCR, which performs
poorly on cursive handwriting. For a handful of pages, share photos in
chat and store them via manual_capture instead. For large handwritten
imports, the user can enable cloud OCR with their own key
(KSJ_OCR_BACKEND=azure — see README); it is off by default and every
run states when it is active.
Args:
folder_path: Absolute path to the folder containing journal photos.
force: Set to True to REPLACE existing captures with matching
template IDs (default False — the new page is filed as
WA with reason id_conflict; the existing one is untouched).
Returns a summary table of all processed images.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| volume | No | ||
| folder_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so: accept-by-default (no page skipped), pages with unreadable template IDs or taken IDs become Wild Art entries with a recorded reason, the default OCR backend is local Tesseract with poor cursive performance, and cloud OCR is off by default and announced per run. Mutation semantics of force (replace vs. leave existing untouched) are spelled out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the pipeline behavior, the OCR caveat, and an Args block — a sensible order. The only waste is the force/id_conflict behavior being stated in both the body paragraph and the Args section.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch mutation tool with no annotations, the description covers side effects, fallback behavior, failure recording, OCR defaults, and follow-up remediation via list_by_tag and promote_capture. An output schema exists, so return values need no further explanation beyond the summary-table mention.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and largely does: folder_path is documented as an absolute path, force is given detailed replace-vs-id_conflict semantics, and volume is tied to the 'second or later journal' case. Volume's default of 0 and exact effect are never explained, leaving one small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb + resource + scope: it finds every image in a folder and runs the full upload pipeline on each. It is clearly distinguishable from single-page siblings like upload_capture and manual_capture, and it names the image formats it handles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent explicitly: for a handful of pages use manual_capture instead, and for large handwritten imports enable cloud OCR (with the env var and README pointer). It also states when volume=N should be passed. Both the alternative and the condition that selects it are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commit_aiexA
Write confirmed AIEX insights to the knowledge base.
Takes a JSON string conforming to the AIEX-001 schema and stores each
confirmed insight as a separate AIEX-NNN entry. IDs are assigned
sequentially at write time. All entries are tagged as AI-Extracted.
Call this after the user has reviewed and approved the output from
extract_insights().
Args:
session_json: JSON string with fields: entry_type, date,
source_platform, session_focus, insights (list),
open_questions (list), action_items (list).
Each insight must have: text, confidence_tier, tags,
connections.
Returns a confirmation listing every AIEX ID assigned.
| Name | Required | Description | Default |
|---|---|---|---|
| session_json | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose real traits: sequential ID assignment at write time, one entry per confirmed insight, and a tagging side effect ('All entries are tagged as AI-Extracted'). It omits permissions, validation/error behavior, and whether re-running duplicates entries, leaving some gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by storage behavior, usage condition, and an Args block. It uses more vertical space than needed due to the docstring-style formatting, but every section earns its place without redundant prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, the definition covers purpose, upstream dependency, storage semantics, the full parameter structure, and the return shape. An output schema exists so the description needn't detail return values, and it still notes the confirmation. Remaining gaps (permissions, idempotency) are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does substantially: it enumerates the top-level JSON fields (entry_type, date, source_platform, session_focus, insights, open_questions, action_items) and the nested insight fields (text, confidence_tier, tags, connections). It stops short of formats or allowed values for fields like entry_type and confidence_tier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Write confirmed AIEX insights to the knowledge base', and adds that each insight becomes a separate AIEX-NNN entry. It is clear and concrete, but it does not distinguish itself from the other commit_* siblings (commit_distillation, commit_assessment, commit_observation), so an agent must infer the difference from the AIEX naming.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite and upstream tool: 'Call this after the user has reviewed and approved the output from extract_insights().' This tells the agent when to invoke it relative to a named sibling, but offers no when-not guidance or contrast with the other commit tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commit_assessmentA
Store the confirmed outcome of an audit_knowledge_status() dialogue.
Call this after the dialogue concludes and the user has reviewed the
assessment. Only the assessment — what the audit found and what came
of the dialogue, not a re-listing of every open question — is stored
as the entry's text.
Never changes the audited REV page's own claimed status — that stays
physical-authority, exactly like commit_distillation never rewrites a
SYN page. Stores with source='ai_extract' (excluded from journal_health
KPIs) using the AIEX sequence, and links to the REV page with an
asserted 'assesses' edge.
Args:
assessment_json: JSON string with fields:
rev_template_id (required) — the REV page this assesses.
assessment (required) — 2-5 sentences: what the audit found
and what came of the dialogue. This is the artifact.
reaffirmed, revised — lists of topic strings (both optional,
default empty).
tags — optional list of "#topic"/"@source"/etc strings.
date — optional ISO date; defaults to today.
Returns a confirmation with the assigned AIEX ID and the assesses edge.
| Name | Required | Description | Default |
|---|---|---|---|
| assessment_json | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that it never changes the REV page's claimed status, stores with source='ai_extract' (excluded from journal_health KPIs), uses the AIEX sequence, and links via an asserted 'assesses' edge. It also notes the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the behavioral constraints next, then the argument documentation. Every sentence earns its place, though the description is on the long side for a single-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the description nonetheless summarizes the confirmation. Combined with the rich behavioral and parameter detail, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it fully documents the assessment_json fields including which are required (rev_template_id, assessment), the semantics of each optional field (reaffirmed, revised, tags, date), and defaults. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: storing the confirmed outcome of an audit_knowledge_status() dialogue. It distinguishes itself from siblings by referencing audit_knowledge_status (the upstream) and commit_distillation (a contrasting sibling that never rewrites a SYN page).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the trigger condition: call after the dialogue concludes and the user has reviewed the assessment. It names the related upstream tool, giving strong context. It does not state explicit when-not-to-use conditions, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commit_distillationA
Store the confirmed outcome of a surface_connections() dialogue.
Call this after the Phase 2 dialogue concludes and the user has
reviewed the revised connection map. Only the distillation — what the
comparison revealed, not the connection list or the dialogue
transcript itself — is stored as the entry's text; the four categories
are kept as supporting detail alongside it.
Never creates a SYN template ID — SYN numbers belong to physical
pages. Stores with source='ai_extract' (excluded from journal_health
KPIs, distinguishable in get_breakthroughs()/export_html()) using the
AIEX sequence, and links to the SYN page with an asserted 'distills'
edge (source: the new AIEX entry, target: the SYN page).
Args:
distillation_json: JSON string with fields:
syn_template_id (required) — the SYN page this distills.
distillation (required) — 2-5 sentences: what the comparison
revealed and what it means. This is the artifact.
confirmed, retired, deferred, missed, beyond_scan — lists of
strings, one per connection-map entry (all
optional, default empty).
tags — optional list of "#topic"/"@source"/etc strings.
date — optional ISO date; defaults to today.
Returns a confirmation with the assigned AIEX ID and the distills edge.
| Name | Required | Description | Default |
|---|---|---|---|
| distillation_json | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it discloses that no SYN template ID is created, that the entry is stored with source='ai_extract' (excluded from journal_health KPIs, discoverable in get_breakthroughs()/export_html()), that it uses the AIEX sequence, and that it asserts a 'distills' edge to the SYN page. This is exactly the behavioral context an agent needs before writing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the Args block is well-organized and necessary given the nested JSON payload. It is slightly long and includes a few soft phrases ('This is the artifact'), but nearly every sentence conveys operationally relevant detail rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex write tool with a structured payload, the description covers the source flag, ID sequencing, edge assertion, and return confirmation (AIEX ID and distills edge). With an output schema present, return values need no further unpacking, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (the lone param is an opaque string), so the description must compensate and it fully does, enumerating every JSON field: syn_template_id (required), distillation (required, with sentence guidance), the five optional connection-map lists, tags, and date. This adds far more meaning than the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Store the confirmed outcome of a surface_connections() dialogue') and immediately clarifies scope by excluding what is NOT stored (the connection list, the transcript). An agent can distinguish this from commit_assessment, commit_observation, and commit_aiex from the first two sentences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition: call after the Phase 2 dialogue concludes and the user has reviewed the revised connection map. That ties it clearly to its predecessor surface_connections(). It stops short of naming alternative commit_* siblings or when NOT to use it, keeping it at a strong 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commit_observationA
Store the confirmed outcome of a bridge_dream_research() dialogue.
Named "observation," not "inference": at journal scale (routinely a
handful of DC entries, sometimes one), what this dialogue produces is
a noticing, not a conclusion the data could support calling an
inference. Call this after the dialogue concludes and the user has
reviewed the observation. Only the observation — what the dialogue
revealed, not a restatement of the dream or an asserted symbol
meaning — is stored as the entry's text.
Never changes the bridged DC page's own dream narrative — that stays
physical-authority, exactly like commit_distillation never rewrites a
SYN page. Stores with source='ai_extract' (excluded from journal_health
KPIs) using the AIEX sequence, and links to the DC page with an
asserted 'observes' edge.
Args:
observation_json: JSON string with fields:
dc_template_id (required) — the DC page this observes.
observation (required) — 2-5 sentences: what the dialogue
revealed. This is the artifact.
confirmed_echoes, symbol_notes — lists of strings (both
optional, default empty).
tags — optional list of "#topic"/"@source"/etc strings.
date — optional ISO date; defaults to today.
Returns a confirmation with the assigned AIEX ID and the observes edge.
| Name | Required | Description | Default |
|---|---|---|---|
| observation_json | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses the mutation boundary (never changes the bridged DC page's dream narrative), the storage semantics (source='ai_extract', excluded from journal_health KPIs), the AIEX sequence, and the 'observes' edge creation. It omits risks like duplicate handling or whether prior observations are overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb+resource immediately, but the middle paragraph defending 'observation' vs 'inference' is philosophically padded and could be trimmed. The remainder (behavior, args) is dense and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with zero annotations and an opaque single-param schema, the description supplies everything an agent needs: when to call, what gets written and where, identifiers, edge semantics, and a return summary. An output schema exists but the description's return note is supplementary, not redundant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter is an opaque JSON string, yet the description fully compensates by enumerating every field, marking required vs optional, specifying types (lists of strings), defaults, and the 2-5 sentence constraint on the core 'observation' field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Store the confirmed outcome of a bridge_dream_research() dialogue.' It explicitly distinguishes this from what it is not ('observation,' not 'inference') and differentiates from siblings like commit_distillation, so an agent can route precisely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear timing ('Call this after the dialogue concludes and the user has reviewed the observation') and scope exclusions ('Only the observation — not a restatement of the dream or an asserted symbol meaning'). It also names the related tool bridge_dream_research() whose output it consumes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
correct_ocrA
Replace a stored capture's transcription with corrected text.
Use this when a capture's OCR came out wrong — for example a Tesseract
read of handwriting, or a transcription typo. The original OCR text is
preserved in the database; the corrected text becomes what search, tag
extraction, and connection detection use from now on.
Re-runs template parsing, tag extraction, and connection detection on the
corrected text.
Args:
capture_id: The numeric capture ID (shown as #N in upload output and
search results). Not the template ID.
text: The full corrected transcription of the page, including
field labels and all schema tags.
Returns a summary of the re-parsed capture and rebuilt connections.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| capture_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and delivers: it discloses that original OCR text is preserved (non-destructive), that corrected text becomes the new source for search/tag/connection logic, and that it re-runs parsing, tag extraction, and connection detection. This is rich behavioral context beyond a simple 'update'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then when-to-use, then side effects, then parameter notes. Sentences are tight and each earns its place. Slightly long but justified by the parameter explanations and behavioral details. Could be marginally tighter but no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be detailed further. The description covers non-destructive behavior, downstream effects, re-processing, and both parameters thoroughly. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: 'capture_id' is explained as the numeric capture ID (shown as #N in upload output and search results) and explicitly distinguished from the template ID; 'text' is described as the full corrected transcription including field labels and all schema tags. This adds meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('correct') and resource ('OCR transcription'), and immediately clarifies the scope: replacing stored transcription with corrected text. The verb is precise and distinguishable from siblings like rebuild_connections (which rebuilds rather than corrects). No ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete when-to-use scenario: 'when a capture's OCR came out wrong — for example a Tesseract read of handwriting, or a transcription typo.' This gives clear context. However, it doesn't explicitly state when NOT to use this tool or name alternatives (e.g., manual_capture vs. correction). Still, the scenario is specific enough for confident selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dream_correlationA
Report co-occurrence between Dream Capture entries and RC/REV entries
sharing #tag, within window_days of each other. Descriptive only.
This deliberately never uses the word "correlation" in its own output
(window size is a free parameter, and with a small journal, trying a
few window widths will surface something that looks meaningful — the
same researcher-degrees-of-freedom failure mode your own experimental
methodology is built to defeat). Every result reports window_days, the
match count, and the base rate of #tag in each population, so a
coincidence and a pattern don't read the same on the page.
Args:
tag: The # topic/theme tag to check (e.g. "resilience").
Matched against DC's #theme tags and RC/REV's #topic
tags — same prefix, same normalized value, different
template role.
window_days: How many days apart counts as "near" (default 3).
Symmetric — checks both before and after each dream.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| window_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that output is purely descriptive, that every result includes window_days, match count, and per-population base rates, and it explains the researcher-degrees-of-freedom rationale for not labeling results as 'correlation'. This goes well beyond a bare read/analysis disclosure. It does not state computational complexity, refresh behavior, or permission requirements, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose is front-loaded in the first sentence, which is good, but the parenthetical about researcher degrees of freedom is lengthy and partly editorializing rather than specification. It earns some place by justifying the descriptive-only stance, yet a tighter phrasing could convey the same behavioral guarantee. Args block is well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two parameters, no annotations, a presence of output schema (so return values needn't be explained), and the analytic nature of the tool, the description is largely complete. It covers what is computed, how matching works, the symmetric window, and what each result reports. It omits any mention of performance implications for large journals or how ties/duplicates are handled, keeping it just short of fully exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: it explains that tag is a # topic/theme value matched across DC's #theme and RC/REV's #topic tags (same prefix, normalized value, different template role) and that window_days is a symmetric day-distance threshold with default 3. This adds real semantic meaning absent from the schema. Minor gaps remain: no format examples beyond one, no bounds on window_days.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (report co-occurrence), the two concrete resources it spans (Dream Capture entries and RC/REV entries), and the exact matching dimension (#tag within window_days). It is clearly distinguishable from siblings like dream_patterns or bridge_dream_research, which do different analyses. An agent can tell exactly what this tool computes without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (analyze tag co-occurrence between dreams and research entries), but there is no explicit statement of when to choose this over dream_patterns or bridge_dream_research, nor any exclusion criteria. The 'descriptive only' caveat hints at a usage boundary but does not name an alternative. An agent gets a reasonable sense of context but must infer relative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dream_patternsA
Analyze recurring patterns across all Dream Capture (DC) entries.
Aggregates symbols, emotions, and themes from every DC page to surface what appears most frequently in your dreams — recurring characters, objects, emotional states, and topic clusters. The more DC pages you upload, the more meaningful the patterns become.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool aggregates data across all entries and that output quality depends on input volume, which are useful behavioral traits. However, it doesn't mention performance characteristics, error conditions, or specific output format details, leaving some gaps in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, followed by elaboration in two concise sentences. Every sentence adds value by explaining scope, aggregation details, and data dependency, with zero wasted words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 0 parameters, no annotations, and an output schema exists, the description provides sufficient context for understanding its purpose and usage. It covers what the tool does and how input volume affects results, though it could briefly hint at output structure to fully leverage the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately focuses on the tool's function without redundant parameter info, earning a high baseline score for not introducing unnecessary complexity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('Analyze recurring patterns', 'Aggregates symbols, emotions, and themes') and resources ('all Dream Capture entries', 'DC pages'). It distinguishes itself from siblings by focusing on pattern analysis rather than upload, export, search, or other operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by stating 'The more DC pages you upload, the more meaningful the patterns become,' suggesting it's best used with substantial data. However, it doesn't explicitly state when to use this tool versus alternatives like 'get_stats' or 'find_connections,' nor does it provide exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_backupA
Write the entire knowledge base to a versioned JSONL file (ksj-export-v1)
— a real backup with a matching import path, not a one-way dump.
Contains captures (all fields), tags, entities, and connections. The
format is documented in docs/EXPORT_FORMAT.md in the ksj-mcp repo, so
anything can consume it.
Args:
file_path: Where to write. Default: ksj-export-<date>.jsonl in the
KSJ data directory.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses what is written (all captures fields, tags, entities, connections), the format (versioned JSONL, ksj-export-v1), and the existence of a documented format and an import path, but it doesn't mention overwrite behavior, error handling, or whether writing is atomic.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three well-organized sentences plus an Args block. Front-loaded with the core action and format. It's slightly longer than strictly necessary due to the docs pointer, but every sentence adds useful context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter export tool with an output schema, the description covers the use case, scope, format, import coupling, and parameter default. The output schema handles return value details, so the only remaining gap is operational nuance like overwrite behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter is undocumented in the schema (0% coverage). The description compensates by explaining file_path's purpose and default, which is exactly what an agent needs to invoke correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Write the entire knowledge base to a versioned JSONL file'), names the format (ksj-export-v1), and distinguishes itself from siblings like export_captures and export_html by emphasizing it's a full backup with an import path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says it's 'a real backup with a matching import path, not a one-way dump,' contrasting it with export_html and export_captures but without explicitly naming those siblings or detailing when a user should choose export_backup over them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_capturesA
Export all captures (or a tag-filtered subset) as Markdown or JSON.
Args:
format: "markdown" (default) or "json"
tag_filter: Optional tag value — only include captures with this tag
(e.g. "machine-learning")
Returns the full export as a string (no file is written).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | markdown | |
| tag_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well by disclosing key behaviors: it exports data without writing a file (clarifying output as a string), supports filtering by tag, and specifies default values. However, it misses details like rate limits, authentication needs, or error handling, which would enhance transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, starting with the core purpose, followed by parameter explanations and return details in a structured format. Every sentence adds value without redundancy, making it efficient and easy to understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, no annotations, and the presence of an output schema (which handles return values), the description is complete enough. It covers purpose, parameters, and behavioral aspects like no file writing, leaving no critical gaps for agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant meaning beyond the input schema, which has 0% description coverage. It explains the purpose of 'format' (Markdown or JSON with default) and 'tag_filter' (optional filtering with an example), compensating fully for the schema's lack of details and providing clear parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Export all captures or a tag-filtered subset') and the output formats ('as Markdown or JSON'), distinguishing it from siblings like 'search_captures' or 'list_by_tag' which likely have different functions. It precisely defines what the tool does without being vague or tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for usage by mentioning the tag-filtering option and default format, but it does not explicitly state when to use this tool versus alternatives like 'export_study_deck' or 'search_captures'. It implies usage for exporting data but lacks explicit comparisons or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_htmlB
Write a self-contained HTML view of the knowledge base — a bird's-eye
browser for the whole journal that opens in any web browser, works
offline, and needs no install.
Three tabs, plus connections on every card:
Timeline — every capture chronologically, with live search and
type / Wild Art reason / volume / journal-vs-AI filters
(WA and ISO are always in the type filter); superseded
captures hidden behind a toggle. Each card lists its
typed connections — click one to jump to that capture.
Wild Art cards show their reason, the page ID they were
read as, and a link to the capture they conflict with.
Index — tags grouped by meaning (topics, dream themes, open
questions, insights, motifs, sensory details) plus the
entity register; every entry click-filters the timeline.
Graph — an ego-centric local graph (no rotating globe, no
physics). The landing view groups captures into bubbles
by tag, theme, or entity (size = capture count). Click a
bubble, or "view in graph" on any card, to drill into a
fixed radial layout: the item centered, its direct
connections (or a cluster's members) around it. Click a
neighbor to recenter; "+N more" expands a busy ring.
Navigation: every view change is a browser history step mirrored in the
URL hash, so the in-app "← Back" button AND the browser's Back button
step back through views inside the page (the browser's leaves the page
only from the first view), and reloading reopens the same view.
The footer records the ksj-mcp, mcp, pydantic, and Python versions, the
export time, and capture / entity / connection counts.
All data is inlined in the file: sharing or archiving the file shares a
snapshot of the knowledge base.
Args:
file_path: Where to write. Default (recommended, and required on
Windows): leave empty — writes ksj-view.html in the KSJ
data directory.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It over-delivers on output behavior (tabs, navigation, footer versions, inlined data / snapshot semantics) which is genuinely useful, but it says nothing about permissions needed, whether the file is overwritten, or side effects on existing files. For a write-to-disk tool, that mutation/permission context is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The bulk of the description is a UI feature tour (tabs, controls, graph layout, history behavior) rather than information an agent needs to invoke the tool. It is heavily back-loaded: the only actionable invocation guidance (file_path) sits at the very end. For an agent-selection definition this is bloated and mis-front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation isn't needed, so the heavy UI description is largely redundant for invocation. The description covers the write target and snapshot semantics adequately, but omits the deployment-adjacent essentials: overwrite behavior, error conditions, and why this tool versus the other export siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: the Args section explains file_path is where to write, that the default (empty) writes ksj-view.html into the KSJ data directory, and that empty is recommended and required on Windows. That is meaningful semantics beyond the bare string type, though it doesn't cover format/overwrite behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and artifact: write a self-contained HTML bird's-eye browser of the whole knowledge base. It distinguishes itself from sibling exports (export_backup, export_captures, export_study_deck) by describing an interactive offline viewer. However, it never explicitly names those siblings or states contrast, so it's clear on purpose but not sharply differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied — you'd call this to get a shareable, offline-viewable snapshot — but the description never says when to prefer this over export_backup, export_captures, or export_study_deck. There is no when-not-to-use guidance or alternative routing, so it falls to the minimum-viable tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_study_deckA
Export your open questions as a portable study deck (tab-separated CSV).
Turns every ? question in your journal into a flashcard:
Front — the question (from the ? tag)
Back — connected $ insight captures; falls back to the capture summary
Tags — the # topic tags on that capture
The output is a standard tab-separated CSV compatible with:
- Anki (File → Import → Tab-separated)
- Quizlet (Import → Tab between terms, newline between cards)
- Obsidian, Notion, Google Sheets, or any CSV-aware tool
- Print as a plain study sheet — no app required
Args:
tag_filter: Optional # topic tag to limit the export
(e.g. "machine-learning"). Leave blank for all questions.
Returns a tab-separated text block. No file is written to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses key behavioral traits: it transforms questions into flashcards with specific formatting (front, back, tags), outputs as tab-separated CSV, and explicitly states 'No file is written to disk.' This covers output format and side effects, though it doesn't mention rate limits or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and appropriately sized. It front-loads the core purpose, then details the transformation process, output compatibility, and parameter usage. Every sentence adds value with no redundancy, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, no annotations, and an output schema present, the description is complete. It explains what the tool does, how it processes data, output format, parameter usage, and behavioral constraints. With an output schema handling return values, no additional explanation of outputs is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It adds detailed meaning for the single parameter 'tag_filter': explains it's optional, provides an example ('machine-learning'), and clarifies that leaving it blank exports all questions. This fully documents the parameter beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Export your open questions as a portable study deck (tab-separated CSV).' It specifies the verb 'export' and the resource 'open questions,' and distinguishes it from siblings like 'export_captures' by focusing on study decks with flashcards from journal questions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: for exporting open questions as study decks, compatible with tools like Anki and Quizlet. It doesn't explicitly mention when not to use it or name alternatives, but the focus on flashcards from journal questions implies it's for study purposes rather than general data export.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_insightsA
Prepare an AI research session for insight extraction.
Loads knowledge base context (existing tags, potentially related entries)
and returns it alongside the session text and extraction instructions.
Claude then performs the extraction in its response to the user.
This tool does NOT write to the database. After the user reviews the
extracted insights, call commit_aiex() to store confirmed entries.
Trigger phrases: "Extract insights from this session", "Run AIEX on this
conversation", "Generate insight extraction report".
Args:
session_text: Full or partial transcript of the research session.
source_platform: Platform where session occurred (e.g. "Claude Desktop",
"Claude Mobile"). Leave blank if unknown.
Returns a context block + extraction instructions for Claude to process.
| Name | Required | Description | Default |
|---|---|---|---|
| session_text | Yes | ||
| source_platform | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It clearly states 'This tool does NOT write to the database' and explains the two-step workflow. It also describes what it loads (knowledge base context, existing tags) and what it returns (context block + extraction instructions). However, it doesn't explicitly state whether this is a read-only or side-effect operation in annotation terms, though the text implies read-only preparation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose statement, a workflow explanation, a negative constraint, and trigger phrases. It is slightly verbose with some redundancy (e.g., repeating the extraction flow), but every section serves a purpose and is front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two-phase workflow, no annotations, 0% schema coverage), the description is largely complete: it explains purpose, parameters, behavioral constraints, and the follow-up tool. However, it doesn't describe the output schema details (though output schema exists, so that's acceptable) and could clarify error conditions or rate limits. It is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents both parameters: session_text ('Full or partial transcript of the research session') and source_platform ('Platform where session occurred... Leave blank if unknown'). This adds meaningful guidance beyond the bare schema, though it doesn't specify format constraints or examples for session_text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Prepare an AI research session for insight extraction') and clarifies the two-phase flow: load context, return instructions, then Claude performs extraction. It explicitly names the sibling tool commit_aiex() as the follow-up step, distinguishing this preparation step from the commit step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit trigger phrases ('Extract insights from this session', 'Run AIEX on this conversation'), states when to use commit_aiex() (after user reviews extracted insights), and clarifies that this tool does NOT write to the database. This is comprehensive when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_connectionsA
Show connections for a capture: @-references first (deliberate
assertions, both directions), then tag overlap ranked by IDF-weighted
strength — shared rare tags count for much more than shared common ones.
Args:
capture_id: The numeric ID returned by upload_capture or search_captures.
min_strength: Minimum strength for tag-overlap edges (default 2.0 ≈
two ordinary shared tags or one rare one). References
are always shown. Lower it to see weaker links.
limit: Maximum connections listed (default 20). The total is
always reported.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| capture_id | Yes | ||
| min_strength | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses meaningful behavior: references are listed first and always shown, tag overlap is ranked by IDF-weighted strength, and "the total is always reported" even when limit truncates. It lacks any note on permissions or cost, but for a read-only discovery tool the behavioral picture is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in the first sentence, followed by a clean Args block. Every sentence earns its place – no filler and no redundancy with the structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the ordering/IDF semantics are covered. The remaining gap is the absence of any tie-in to sibling tools, which matters given eleven-plus closely related connection and capture tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully, and it does: capture_id is tied to its origin (upload_capture/search_captures), min_strength is given a concrete calibration ("2.0 ≈ two ordinary shared tags or one rare one"), and limit's interaction with the always-reported total is explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Show connections for a capture") and details two distinct edge types: @-references (both directions) and IDF-weighted tag overlap. This is far more specific than a restatement of the name. It does not explicitly differentiate from siblings like surface_connections or neighborhood, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the argument explanations – e.g. "Lower it to see weaker links" tells the agent when to tune min_strength. However, it never names an alternative tool (surface_connections, neighborhood, find_path) or the condition that would select this tool over them, which a crowded sibling set makes valuable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_pathB
Find the shortest chain of connections between two captures — how one
idea reaches another through references, shared entities, asserted
relations, and strong tag overlap.
Args:
from_id: Starting capture (numeric ID).
to_id: Destination capture (numeric ID).
| Name | Required | Description | Default |
|---|---|---|---|
| to_id | Yes | ||
| from_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does add real behavioral context by enumerating how two captures can be linked (references, shared entities, asserted relations, tag overlap), which is more than the schema conveys. However, it says nothing about read-only nature, cost/latency of a graph search, what happens when no path exists, or path optimality guarantees.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence with the edge-type detail immediately after, and the Args block is minimal. The args section largely restates the schema, but the 'numeric ID' clarification earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required. The description is adequate for a two-parameter read tool, but gaps remain: no sibling differentiation for a crowded graph-query namespace, no no-path/error behavior, and no indication of search direction or scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does document both parameters with meaning: from_id as the starting capture and to_id as the destination, both numeric IDs. Type and directionality are clear, though no constraints (e.g., valid ID range, self-path handling) are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('find the shortest chain of connections between two captures') and even names the edge types traversed (references, shared entities, asserted relations, tag overlap). It does not, however, distinguish itself from close siblings like find_connections, surface_connections, or neighborhood, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no conditions under which this is preferred over alternatives, and no mention of the many graph-related siblings (find_connections, surface_connections, neighborhood). The agent must infer usage purely from the purpose sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_breakthroughsA
Return all Synthesis (SYN) entries in chronological order — your complete breakthrough timeline.
Shows the breakthrough field, patterns identified, $ insight tags, and topic tags for each SYN page. Use this to see how your thinking has evolved and which ideas led to the biggest discoveries.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It describes the tool as a read operation ('Return all Synthesis entries') and specifies the output format and ordering, which is helpful. However, it lacks details on potential limitations like pagination, rate limits, or error conditions, which are important for a tool that might return large datasets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, with the first sentence stating the core functionality clearly. Each subsequent sentence adds meaningful context without redundancy, such as detailing the returned fields and the tool's purpose for tracking thinking evolution. There is no wasted text, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (0 parameters, no annotations, but with an output schema), the description is mostly complete. It explains what the tool does, the data returned, and its use case. Since an output schema exists, it need not detail return values, but it could benefit from mentioning behavioral aspects like performance or data scope. Overall, it covers the essentials well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so the schema fully documents the absence of inputs. The description adds value by explaining that no parameters are needed and implicitly clarifies the scope ('all Synthesis entries'), which compensates for the lack of parameters. It does not need to detail parameters, so a baseline of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('Return all Synthesis entries') and resources ('Synthesis entries'), distinguishing it from siblings like 'search_captures' or 'find_connections' by focusing exclusively on SYN entries. It explicitly mentions what data is returned ('breakthrough field, patterns identified, $ insight tags, and topic tags') and the chronological ordering, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool ('to see how your thinking has evolved and which ideas led to the biggest discoveries'), implying it's for retrospective analysis of breakthroughs. However, it does not explicitly state when not to use it or name alternatives among sibling tools, such as 'search_captures' for filtered results, leaving some guidance gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statsB
Return an overview of your knowledge base: capture counts, top tags,
open questions, key insights, and date range.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. While 'Return an overview' implies a read-only operation, it doesn't specify whether this requires authentication, has rate limits, returns real-time or cached data, or what format the output takes. The description lists content categories but doesn't describe behavioral traits like performance characteristics or access requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and well-structured in a single sentence. It front-loads the core purpose ('Return an overview of your knowledge base') followed by specific components in a clear list format. Every word earns its place with no redundancy or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 0 parameters, 100% schema coverage, and an output schema exists, the description's job is simplified. It adequately describes what the tool returns (an overview with specific components). However, for a reporting tool with no annotations, it could benefit from more behavioral context about data freshness, authentication needs, or output format since the output schema isn't visible in the evaluation context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and the input schema has 100% description coverage (though empty). The description appropriately doesn't discuss parameters since none exist. It focuses on what the tool returns rather than what it accepts, which is correct for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Return an overview of your knowledge base' with specific components listed (capture counts, top tags, open questions, key insights, date range). It uses a specific verb ('Return') and resource ('knowledge base'), but doesn't explicitly differentiate from sibling tools like 'knowledge_progress' or 'journal_health' which might provide related metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With sibling tools like 'knowledge_progress', 'journal_health', and 'get_breakthroughs' that might provide overlapping or complementary metrics, there's no indication of when this overview tool is preferred or what distinguishes it from other reporting tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_versionA
Report the running ksj-mcp version and key dependency versions (mcp, pydantic, python). Use this to confirm an install or upgrade actually took effect.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, and the verb 'Report' plus the enumerated fields make it clear this is a non-mutating informational read with no arguments. It stops short of stating side-effect or permission characteristics explicitly, but for a zero-parameter local version lookup there is little behavioral risk left undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, fully front-loaded with the purpose followed immediately by the motivating use case. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-parameter tool with an output schema and no annotations; the description explains what data is returned and why you would call it, which is everything an agent needs to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline there is nothing for the description to disambiguate. The description instead specifies what is reported (ksj-mcp, mcp, pydantic, python), which is a small useful addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Report the running ksj-mcp version and key dependency versions (mcp, pydantic, python).' No sibling tool covers version reporting, so it is trivially distinguishable from the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case: 'Use this to confirm an install or upgrade actually took effect.' This gives a clear context for invocation. It does not name alternatives or exclusions, but no sibling tool competes for this purpose, so the gap is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
identify_captureA
Assign or fix the template ID of a stored capture.
Use this for pages stored as UNIDENTIFIED (no readable template ID at
upload time) or when the ID was misread. Re-parses the stored text with
the correct template's parser and rebuilds tags and connections.
Args:
capture_id: The numeric capture ID (#N in upload output).
template_id: The correct template ID, e.g. "RC-007" or "DC-003".
volume: Optionally move the capture to this volume (0 = keep).
| Name | Required | Description | Default |
|---|---|---|---|
| volume | No | ||
| capture_id | Yes | ||
| template_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the real side effects of the mutation — re-parsing stored text with the correct template's parser and rebuilding tags and connections. It omits permissions, reversibility, and whether a prior ID is overwritten, but the key behavioral consequence is stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage condition, then side effects, then args. Every sentence adds information and none is redundant padding; the structure maps cleanly to how an agent would read it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described. For a mutation tool with no annotations, the description covers purpose, trigger, side effects, and all parameter semantics — nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully compensate and it does: capture_id is explained as the numeric ID shown as '#N in upload output', template_id is given concrete examples ('RC-007', 'DC-003'), and volume is clarified as optional with '0 = keep'. All three parameters gain meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Assign or fix the template ID of a stored capture.' The scope is narrowed to UNIDENTIFIED pages or misread IDs, which distinguishes it from upload_capture and correct_ocr in substance, though it does not name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition: pages stored as UNIDENTIFIED (no readable template ID at upload time) or where the ID was misread. This is clear when-to-use guidance, but it never states when NOT to use it or which sibling (correct_ocr, promote_capture, set_volume) is the alternative for adjacent cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_backupA
Restore a ksj-export-v1 JSONL backup into the knowledge base.
Additive and non-destructive: captures that collide with an existing
(volume, template ID) are skipped, nothing is overwritten. User-asserted
edges are restored; derived connections are rebuilt over the merged base.
Args:
file_path: Path to a file produced by export_backup.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses collision handling (skip on (volume, template ID) match), the no-overwrite guarantee, and that user-asserted edges are restored while derived connections are rebuilt. It omits auth/permission requirements, size limits, and error/partial-failure behavior, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the purpose and the critical non-destructive guarantee before the finer edge-handling detail. The Args block is minimal and the only parameter is one line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the semantic behavior an import tool needs. Remaining gaps (auth prerequisites, failure/rollback semantics for a partially-applied import) are minor but real for a mutation-class tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does: file_path is documented as a path to a file produced by export_backup, with the expected ksj-export-v1 JSONL format implied, which adds real constraint beyond the bare string type in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Restore) plus the exact resource and format (ksj-export-v1 JSONL backup into the knowledge base), and explicitly ties the input to a named sibling (export_backup). An agent can distinguish this from export_backup/export_html without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the trigger scenario clear (restoring a backup file produced by export_backup) and states the additive, non-destructive contract. It does not spell out when NOT to use it or any alternative import path, so it stops short of explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_healthA
KPI dashboard and coaching recommendations for your journal practice.
Tracks:
- Capture velocity (captures/week over last 4 weeks)
- Insight velocity ($ insights/week)
- Days since last Review entry
- Unanswered open questions and their age
- Synthesis activity (digitized SYN pages — descriptive only)
- Template balance (which template types are unused)
All KPIs count hand-written journal captures only; AI-extracted (AIEX)
entries are excluded so they don't inflate your practice metrics.
Returns a health score and specific, actionable recommendations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does add one genuinely useful behavioral fact — hand-written captures only, AIEX entries excluded so metrics aren't inflated — which an agent could not infer elsewhere. However, it says nothing about whether the call is read-only, whether it's expensive to compute, or whether results are cached/stale, so the safety and cost profile remains undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by a scannable bullet list of tracked metrics and a closing statement of what is returned. Every line carries information; the only mild cost is that the metric list is longer than strictly needed for tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not detail return values, and it wisely restricts itself to a one-line summary of the return. For a zero-parameter read tool, the description plus output schema gives an agent enough to call it correctly; only the lack of any comparison to similar stats tools leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to clarify or compensate for on this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete deliverable — a KPI dashboard plus coaching recommendations over journal practice — and enumerates exactly which metrics it computes (capture velocity, insight velocity, days since Review, unanswered questions, synthesis activity, template balance). That enumeration distinguishes it from generic siblings like get_stats, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The content implies when the tool is useful (periodic practice check-ins, coaching), but there is no explicit when-to-use statement, no exclusions, and no routing against near-neighbors such as get_stats, knowledge_progress, or get_breakthroughs. Usage is left to inference from the KPI list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_progressA
Track Knowledge Status progression across your Review (REV) entries.
Shows how topics move through Needs Work → Solid → Mastered over time,
based on the Knowledge Status field on each REV page.
Args:
topic: Optional # topic tag to filter (e.g. "calculus"). Leave blank
to show all topics across all REV entries.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It describes what the tool does (track progression and show status movement) but lacks details on output format, data freshness, rate limits, authentication needs, or whether it's read-only or has side effects. The mention of 'over time' hints at historical data, but this isn't elaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and appropriately sized, with a clear purpose statement followed by parameter details. Every sentence adds value, though the second sentence could be slightly more concise by combining ideas about status progression.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (which handles return values), one parameter with good description coverage, and no annotations, the description is reasonably complete. It explains the tool's purpose, parameter usage, and context, though it could benefit from more behavioral details like data scope or limitations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant value beyond the input schema, which has 0% description coverage. It explains the 'topic' parameter's purpose (to filter by topic tag), provides an example ('calculus'), clarifies it's optional, and specifies that leaving it blank shows all topics. This fully compensates for the schema's lack of documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Track Knowledge Status progression across your Review (REV) entries' and explains it visualizes how topics move through status levels over time. It specifies the resource (REV entries) and verb (track progression), though it doesn't explicitly differentiate from sibling tools like 'get_stats' which might also provide progress-related data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by mentioning 'REV entries' and 'Knowledge Status field', suggesting it's for tracking learning progress in a review system. However, it doesn't provide explicit guidance on when to use this tool versus alternatives like 'get_stats' or 'journal_health', nor does it mention prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lintA
Knowledge base health check. Catches the ways a knowledge base silently
rots: orphan captures nothing links to, superseded claims not closed
out, unresolved contradictions, open questions going stale, and
fragmented tags from normalization failures.
Run it occasionally — a base that is never linted entrenches errors
instead of correcting them.
Args:
stale_question_days: Age at which an unanswered ? question is
flagged (default 30).
| Name | Required | Description | Default |
|---|---|---|---|
| stale_question_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does convey substantive detail about what is inspected and why it matters. It never states, though, whether the operation is read-only or non-destructive, nor how its findings are surfaced, leaving an agent to infer the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and then the checks, with the parameter note clearly separated. The prose is slightly colorful ('silently rots', 'entrenches errors') but mostly earns its place and stays readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single optional parameter is covered. The main gap is the absence of any read-only/destructive statement and of routing versus the similar audit siblings, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does: it explains stale_question_days as the age at which an unanswered '?' question is flagged, and confirms the default of 30. Meaning is added beyond the bare integer in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (a knowledge base health check / lint) and enumerates exactly the failure modes it detects: orphan captures, superseded claims, unresolved contradictions, stale questions, and tag fragmentation. This is concrete enough to distinguish it from nearby diagnostic siblings like journal_health or audit_knowledge_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives frequency guidance ('run it occasionally') and a rationale (a never-linted base entrenches errors), which implies when to use it. However, it never names an alternative or explains when NOT to run it, despite several plausibly overlapping diagnostic siblings in the list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_by_tagA
Browse all captures that carry a specific tag — no text query required.
Also browses by entry type, which is how to review the Wild Art queue.
Use this to find every note related to a topic, source, question, or insight:
list_by_tag("machine-learning") → all captures with that tag
list_by_tag("machine-learning", prefix="#") → only # topic tags
list_by_tag("RC-012", prefix="@") → captures referencing @RC-012
list_by_tag("deadline", prefix="!") → priority items
list_by_tag("falling", role="motif") → DC recurring motifs only
list_by_tag(entry_type="WA") → every unresolved Wild Art entry
list_by_tag(entry_type="WA", wa_reason="id_conflict") → page-ID conflicts
list_by_tag(entry_type="WA", wa_reason="loose_capture") → napkins, sticky notes…
list_by_tag(entry_type="ISO") → 3-D isometric grid pages
The same prefix character means different things on Dream Capture pages
(# theme, @ symbol, ! motif) than on RC/SYN/REV (# topic, @ reference,
! priority). Use *role* to select by meaning rather than character:
topic, theme, reference, entity, priority, motif, question, insight,
causal, sensory.
Args:
tag: Tag value to look up (without the prefix character).
May be empty when entry_type or wa_reason is given.
prefix: Optional prefix character: # @ ! ? $ * ->
role: Optional semantic role — the precise way to disambiguate
DC vs RC/SYN/REV meanings.
entry_type: Optional type filter: RC, SYN, REV, DC, ISO, WA, AIEX.
wa_reason: Optional Wild Art reason: id_conflict,
unrecognized_template, ocr_low_confidence,
validation_error, loose_capture, manual, other.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| role | No | ||
| prefix | No | ||
| wa_reason | No | ||
| entry_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses that tag may be empty when entry_type/wa_reason is given, that the same prefix character means different things on DC vs RC/SYN/REV pages, and that role is the disambiguator. It does not discuss permissions, ordering, or result limits, but an output schema exists so return format is covered elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose before any examples, and every example line demonstrates a materially different invocation rather than restating the same call. Somewhat long, but each line earns its place as parameter documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Five optional parameters, no required ones, no annotations, and a 0%-coverage schema — yet the description supplies the values, defaults behavior, and interaction rules for all five. With an output schema handling the return shape, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (the schema declares only titles/types, no enums), so the description must compensate and it does: it explains that tag is given without the prefix character, enumerates the prefix characters, enumerates entry_type values (RC, SYN, REV, DC, ISO, WA, AIEX), lists all wa_reason values, and gives the full role vocabulary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: browse captures carrying a specific tag, with no text query. It also clearly carves out the secondary mode (browsing by entry type / Wild Art queue), which separates it from tag-agnostic siblings like search_captures.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'no text query required' framing plus ten worked examples tell the agent exactly which scenario maps to which argument combination, and 'Use this to find every note related to a topic, source, question, or insight' states the intent. It stops short of explicitly naming search_captures as the alternative for text queries, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manual_captureA
Store a journal capture from transcribed text. This is the PRIMARY path
for handwritten pages: the user shares a photo of the page, YOU (the
assistant) read it with vision, confirm the transcription with the user,
then call this tool with the text. Assistant vision is far more accurate
on handwriting than local OCR — prefer this over upload_capture whenever
the user can show you the page.
Transcribe faithfully: keep field labels (First Impressions, Key Points,
Tags, etc.) as written, include every schema tag (#topic @source !priority
?question $insight *sensory), and treat content inside tag bubbles as tags.
Accept-by-default: the capture is always stored. A template ID that
can't be parsed or found, or a page ID already taken in that volume,
files it as a Wild Art (WA) entry with the reason recorded — nothing is
rejected and nothing is overwritten.
3-D isometric grid pages have their own type: pass template_id="ISO-001"
(etc.) — transcribe the subject line, labels, and notes around the drawing.
Args:
text: The transcribed content of the journal page (all fields
you can read — First Impressions, Key Points, Tags, etc.).
template_id: Template ID (e.g. "RC-001", "ISO-002"). If omitted, the
server will try to detect it from the text automatically.
Pass "WA" to file the capture as Wild Art by hand.
force: Set to True to REPLACE an existing capture with the same
template ID in the same volume (default False — the new
capture is filed as WA with reason id_conflict instead).
volume: Which journal/book this page belongs to. 0 = automatic:
a volume written on the page/text wins, otherwise the
stored current_volume setting (default 1).
wa_reason: File as Wild Art on purpose. Use "loose_capture" for
anything off-journal — a napkin sketch, sticky note,
whiteboard photo, back of a receipt (no volume or page ID
needed). Other values: manual, other.
wa_detail: Free-text note for a WA entry, e.g. "napkin", "sticky note".
Returns the same summary as upload_capture, including any connections
detected to existing captures.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| force | No | ||
| volume | No | ||
| wa_detail | No | ||
| wa_reason | No | ||
| template_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: accept-by-default means nothing is rejected and nothing is overwritten, unparseable template/page collisions fall back to a Wild Art entry with a recorded reason, and force=True replaces rather than duplicates. These are non-obvious side effects an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the primary-path routing before the behavioral caveats and the Args block. It is long, but nearly every sentence carries distinct operational information (faithful transcription, tag handling, accept-by-default). Slightly dense rather than bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, and the description still notes the return mirrors upload_capture including detected connections. For a 6-param mutation tool with zero annotation coverage, all behavioral and parameter gaps are filled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it documents all six parameters with defaults and semantics: volume 0 = automatic with volume-wins-over-current_volume precedence, force replacement vs. WA-with-id_conflict default, wa_reason accepted values, and free-text wa_detail. This goes well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Store a journal capture from transcribed text', and immediately positions itself against the sibling upload_capture as the PRIMARY path for handwritten pages. An agent can distinguish this from upload_capture, correct_ocr, and bulk_upload without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: prefer this over upload_capture whenever the user can show you the page, because assistant vision beats local OCR. It also spells out when to pass template_id='ISO-001', when to pass 'WA', and when to hand-file with wa_reason='loose_capture'. When-to-use, when-not, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
neighborhoodA
Everything within N hops of a capture in the connection graph — its
local knowledge cluster.
Args:
capture_id: Center capture (numeric ID).
depth: How many hops out to walk (default 2, max 4).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| capture_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden alone. It discloses one useful behavioral constraint — the depth cap of 4 — but says nothing about whether the call is read-only, how large the result may get, or performance implications of deeper walks. As a read-style graph query with an output schema, this is a modest gap rather than a severe one.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence states the tool's essence, followed by a compact args block. Nothing is padded, and the core definition appears before any parameter detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers purpose and both parameters adequately. The remaining gap is routing guidance relative to sibling graph tools, which is not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: both parameters are explained, and the depth parameter gains the max-4 constraint that does not appear in the schema at all. This is more than the schema alone provides, though it omits what happens at the boundary or how depth interacts with sparse clusters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and operation: the subgraph within N hops of a capture in the connection graph, described as its 'local knowledge cluster'. This is clearly distinguishable from most siblings, though it never explicitly contrasts itself with the related find_connections, surface_connections, or find_path tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus the connection-related siblings, nor any prerequisites or exclusions. The agent must infer from the phrase 'local knowledge cluster' that this is a breadth-oriented traversal rather than a pairwise or path query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_captureA
Move a Wild Art (WA) entry to its proper type after review — RC, SYN,
REV, DC, or ISO (3-D isometric grid page).
The capture keeps its #id, text, image, and asserted links; it is
re-parsed as the target type. Its WA history is preserved on the
promoted entry: promoted_from (the WA-NNN ID), wa_reason, and wa_detail.
If the target page ID is already taken in that volume, NOTHING changes:
the conflict is reported and you choose — a different page ID, a
different volume (a page from a new journal), or force=True. Page IDs are
never renumbered automatically.
Args:
capture_id: The WA entry's numeric ID (#N).
target_type: RC | SYN | REV | DC | ISO.
target_page_id: The page ID to file it under, e.g. "RC-014". Optional
when the page was read with an ID (claimed_page_id)
of the target type — that ID is used.
volume: Journal volume to file it in (0 = the volume the WA
entry already has, else the current writing volume).
force: DANGEROUS. Take the page ID even though another
capture holds it. The current holder is not deleted —
it is moved to Wild Art itself (reason id_conflict,
conflicts_with pointing here) — but every @reference
to that page ID from now on resolves to THIS capture.
Only use it when you are sure the current holder is
the misfiled one.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| volume | No | ||
| capture_id | Yes | ||
| target_type | Yes | ||
| target_page_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does so thoroughly: it says exactly what is preserved (#id, text, image, asserted links), what metadata is carried over (promoted_from, wa_reason, wa_detail), that a page-ID conflict changes NOTHING until the caller decides, that IDs are never auto-renumbered, and the precise side effect of force (holder moved to Wild Art, all @references re-resolve to this capture).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, conflict behavior, and the force warning are front-loaded before the Args block, and every sentence carries operational information. It is long, but the length is justified by the mutation's complexity; some of the WA-history detail could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return formatting need not be described; the description instead covers everything an agent needs to call this safely — conflict handling, ID/volume resolution, and the reference-rewriting consequence of force. Complete for a complex mutation with 0% schema coverage and no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and its Args block defines all five parameters with defaults and exact semantics — capture_id as #N, the target_type enumeration, target_page_id fallback to claimed_page_id, volume's 0 = existing/current-volume rule, and force's danger and side effects. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — moving a Wild Art entry to its proper type after review — and enumerates the valid targets (RC, SYN, REV, DC, ISO). It clearly distinguishes the WA-promotion action from generic capture handling, though it never names a sibling tool it should be preferred over.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Context for use is clear: this happens 'after review' on a WA entry, and it explains when target_page_id may be omitted (when the page was read with a claimed_page_id of the target type). force carries an explicit when-to-use caveat ('Only use it when you are sure the current holder is the misfiled one'), but no alternatives from the sibling set are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rebuild_connectionsA
Re-derive the entire connection graph from current tags and text.
Run this after correcting OCR text, identifying previously-unidentified
pages, or uploading pages out of order — a page that referenced @RC-015
before RC-015 existed gets its edge on rebuild. Idempotent: running it
twice produces the same graph.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a good job: it declares idempotency ('running it twice produces the same graph') and explains the concrete effect on dangling references. It stops short of disclosing cost/scale on large graphs or whether manually asserted connections (see assert_connection) are preserved or overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the trigger conditions, then the idempotency guarantee. The RC-015 example is concrete and earns its place rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. But for a whole-graph rebuild with coexisting mutation tools like assert_connection and manual_capture, the description should say whether manually asserted edges survive the rebuild — an agent cannot safely decide to run this without that answer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. No parameter-level meaning is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Re-derive the entire connection graph from current tags and text.' This clearly distinguishes it from read-oriented siblings like find_connections, surface_connections, and neighborhood, which query the graph rather than rebuild it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger conditions: after correcting OCR, identifying previously-unidentified pages, or uploading pages out of order, and explains why (a dangling reference gains its edge). It does not name when NOT to run it or point to an alternative tool, so it falls just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_capturesA
Search all journal entries by concept, keyword, or phrase — across every
template type (RC, SYN, REV, DC, ISO, WA, AIEX) at once.
This is the primary way to find entries by idea rather than tag. Use it
whenever the user asks to find notes, recall something they wrote, or
explore a topic. Natural language queries work well.
Examples:
"neural networks" → entries mentioning neural networks
"why does attention" → entries with that question or phrase
"spaced repetition" → concept search across all templates
"dream flying" → DC entries with flying imagery
Args:
query: The concept, keyword, or phrase to search for.
tag_filter: Optional tag value to narrow results (e.g. "machine-learning").
date_from: Optional ISO date lower bound (e.g. "2025-09-01").
date_to: Optional ISO date upper bound (e.g. "2025-12-31").
entry_type: Optional type filter: RC, SYN, REV, DC, ISO, WA, AIEX.
wa_reason: Optional Wild Art reason filter (id_conflict,
unrecognized_template, ocr_low_confidence,
validation_error, loose_capture, manual, other).
Note: search matches terms that appear in the journal text. For tag-only
browsing without a text query, use list_by_tag instead.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| date_to | No | ||
| date_from | No | ||
| wa_reason | No | ||
| entry_type | No | ||
| tag_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses a useful behavioral constraint ('search matches terms that appear in the journal text' and natural-language queries work), but says nothing about ranking, pagination, result limits, or performance characteristics of a search operation. Some value added, but significant behavioral gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and generally well-structured, but the four-line query example block is lengthy, and the parameter list is formal (Google-style 'Args:') where the schema already names each field. Some repetition between the intro sentence and the args adds bulk without new guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be explained. The description covers purpose, usage, routing to a sibling, and all six parameters with the enum values. The main remaining gap is behavioral detail on search semantics (ranking, limits) which annotations also don't cover. Strong for a search tool overall, with room for behavioral specifics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: each parameter is explained with purpose and examples, including the wa_reason enum values (id_conflict, unrecognized_template, ocr_low_confidence, etc.) and entry_type codes. This adds substantial meaning beyond the bare schema. It stops short of full coverage (e.g. how tag_filter matches, date format edge cases), so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Search all journal entries by concept, keyword, or phrase.' It further scopes by naming the coverage ('across every template type') and explicitly distinguishes itself from the tag-browsing sibling list_by_tag. An agent can tell exactly what this tool does vs neighbors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('whenever the user asks to find notes, recall something they wrote, or explore a topic') and an explicit alternative with its selecting condition ('For tag-only browsing without a text query, use list_by_tag instead'). This is the strongest form of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_volumeA
Configure journal volumes: which book new captures go into, and which
books are visible to search and browsing.
Volumes model multiple physical journals: volume 2 continues volume 1's
knowledge base (cross-volume connections are normal and expected). Set
current_volume once when starting a new book.
Args:
current_volume: Volume for NEW captures (0 = leave unchanged).
active_volumes: Read scope for search/list/connections tools:
"*" for all volumes, or a comma list like "2,3".
Empty = leave unchanged. journal_health and
knowledge_progress always see all volumes —
longitudinal KPIs over a truncated history would
mislead.
Call with no arguments to just see the current settings.
| Name | Required | Description | Default |
|---|---|---|---|
| active_volumes | No | ||
| current_volume | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it discloses sentinel semantics (0 / empty = leave unchanged, '*' = all), the read-only no-arg invocation, and the important scope exception that journal_health and knowledge_progress always see all volumes. It does not cover persistence, permissions, or reversibility, but the operational traits that matter for correct invocation are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then explains the volume concept, then documents each argument — a logical order with no wasted filler. The conceptual paragraph on multi-journal continuity is arguably longer than strictly necessary but it prevents an agent from mis-modeling volumes as independent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter configuration tool with an output schema already supplied, everything an agent needs is present: purpose, invocation modes, sentinel values, and scope interactions with KPI tools. Nothing material is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: current_volume is defined as the target for NEW captures with 0 meaning unchanged, and active_volumes is defined as the read scope with '*' and comma-list syntax plus empty meaning unchanged. Both parameters get meaning the schema alone cannot supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (configure journal volumes) and states exactly what it governs: which book new captures land in and which books search/browsing can see. No sibling tool touches volume configuration, so it is trivially distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete activation conditions: 'Set current_volume once when starting a new book' and 'Call with no arguments to just see the current settings.' It also scopes the effect of active_volumes against other tools. It stops short of explicitly naming an alternative tool, but none of the siblings performs this function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_synthesisB
Scan your Rapid Capture entries and identify topic clusters ready to be
synthesized into a SYN page.
Args:
min_captures: Minimum number of RC entries on a topic to flag it
(default 3).
| Name | Required | Description | Default |
|---|---|---|---|
| min_captures | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions scanning and identifying clusters but doesn't describe how the tool behaves: e.g., whether it returns a list of topics with metadata, how it handles large datasets, or if it requires specific permissions. For a tool with no annotation coverage, this leaves significant gaps in understanding its operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: the first sentence states the core purpose, and the second provides parameter details. There is no wasted text, and the structure is clear and efficient, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (which likely describes return values), the description doesn't need to explain outputs. However, with no annotations and only one parameter, the description covers the purpose and parameter semantics adequately but lacks behavioral details (e.g., how clusters are identified, performance considerations). It's minimally viable but could be more complete for a clustering tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful context for the single parameter 'min_captures', explaining it as 'Minimum number of RC entries on a topic to flag it' and noting the default value. Since schema description coverage is 0% (the schema only provides title and type), the description compensates well by clarifying the parameter's purpose and default, though it could add more about valid ranges or effects.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Scan your Rapid Capture entries and identify topic clusters ready to be synthesized into a SYN page.' This specifies the verb ('scan', 'identify'), resource ('Rapid Capture entries'), and outcome ('topic clusters ready to be synthesized'). However, it doesn't explicitly differentiate from sibling tools like 'search_captures' or 'find_connections', which might have overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., having Rapid Capture entries), exclusions, or comparisons to sibling tools like 'search_captures' or 'find_connections'. The agent must infer usage context solely from the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surface_connectionsA
Independently scan the Rapid Capture cluster behind a Synthesis page you
have ALREADY written and photographed, then prepare a structured
dialogue comparing what the scan found against what the page found.
This runs AFTER a SYN page exists for the cluster — never before.
Running it before the page is written would let the AI perform the
cognitive act synthesis is meant to force (see
ksj2_documents/SYN_companion_decision_optionB_2026-08-03.md). There is
no override flag for this precondition — if no SYN page is found, the
tool declines and points to suggest_synthesis() instead.
The scan itself never reads the SYN page's own content before producing
its connection map, so the Phase 2 comparison is meaningful rather than
confirmatory. This tool does NOT write to the database — it prepares
the scan data and dialogue instructions for Claude to run in this
conversation. Call `commit_distillation()` after the user approves the
dialogue's outcome, to persist it.
Trigger phrases: "Run surface_connections on SYN-004", "Compare my
synthesis against an independent scan".
Args:
syn_template_id: The SYN page's template ID (e.g. "SYN-004").
Required — the tool declines if no SYN page with
this ID exists.
entry_ids: Optional comma-separated RC template IDs (e.g.
"RC-001,RC-047,RC-083") to scan explicitly.
Required when the SYN page's RC cluster can't be
resolved automatically — no matching tag cluster,
or more than one candidate cluster.
days: Optional — narrow the resolved cluster to RC
entries created in the last N days. 0 = no filter.
depth: "brief" | "standard" (default) | "deep" — how many
follow-up questions per tier to plan for in the
dialogue. The user can also say "more on this one"
for any single connection regardless of depth.
Returns the RC cluster data, gap candidates, and full scan + dialogue
instructions for Claude to execute.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| depth | No | standard | |
| entry_ids | No | ||
| syn_template_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: it discloses the read-only nature ('does NOT write to the database'), the hard precondition with no override, the decline-and-redirect behavior, and the meaningful independence guarantee (the scan never reads the SYN page before producing its map). These are non-obvious behavioral traits an agent could not infer from schema or siblings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and then layers preconditions and params efficiently; most sentences earn their place. It is somewhat long, and the inline reference to an internal markdown filename (ksj2_documents/SYN_companion_decision_optionB_2026-08-03.md) adds little value for an agent choosing the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a gated, multi-step tool with a precondition, params, and a downstream commit step, the description covers everything an agent needs: when it may run, what it returns at a high level, and what must happen after. An output schema exists, so return-value detail is appropriately left out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully, and it does: it defines syn_template_id as required with decline behavior, entry_ids as optional comma-separated RC IDs required only when the cluster can't be auto-resolved, days as a narrowing window with 0 = no filter, and depth's three tiers plus the user's 'more on this one' escape hatch. This adds meaning well beyond the bare typed properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scan/compare) and resource (Rapid Capture cluster behind a Synthesis page), and precisely scopes the operation as 'prepare a structured dialogue comparing what the scan found against what the page found.' It is clearly distinguishable from siblings like suggest_synthesis and commit_distillation, which it names directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('runs AFTER a SYN page exists — never before'), states there is no override flag, and names the fallback (suggest_synthesis()) when the precondition fails. It also supplies concrete trigger phrases and clarifies that commit_distillation() is the required follow-up after user approval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_captureA
Process a journal page photo: run OCR, parse the template, extract schema
tags, store the capture, copy the image to the knowledge base, and detect
connections to existing captures.
Accept-by-default: the page is always stored. If it can't be filed
normally — no readable template ID, an ID too doubtful to trust, or a page
ID that is already taken — it is stored as a Wild Art (WA) entry with the
reason recorded, never rejected and never overwriting anything. Review
WA entries with list_by_tag(entry_type="WA") and move them to their
proper type with promote_capture().
Args:
image_path: Absolute path to the image file (JPG, PNG, TIFF, etc.)
force: Set to True to REPLACE an existing capture with the same
template ID in the same volume (default False — the new
page is filed as WA with reason id_conflict instead).
volume: Which journal/book this page belongs to. 0 = automatic:
a volume written on the page (e.g. "V2 RC-001") wins,
otherwise the stored current_volume setting (default 1).
wa_reason: File the image as Wild Art on purpose. Use "loose_capture"
for anything off-journal — a napkin sketch, sticky note,
whiteboard, back of a receipt (no volume or page ID
needed). Other values: manual, other.
wa_detail: Free-text note for a WA entry, e.g. "napkin", "whiteboard".
Returns a summary of what was found and stored, including the strongest
connection detected.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| volume | No | ||
| wa_detail | No | ||
| wa_reason | No | ||
| image_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does well: it discloses accept-by-default (never rejected), the WA fallback with reasons recorded, and that force replaces an existing capture without overwriting otherwise. It omits permission/auth requirements and any rate or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with purpose then fallback semantics and args. Some prose is slightly verbose, but each section serves a distinct need, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-step mutation tool with no annotations, the description covers the pipeline, fallback behavior, and all parameters thoroughly. Output schema exists so return details need not be explained, and the added note about the strongest connection is a useful touch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it documents all five parameters including image_path formats, the exact meaning of force, the volume=0 automatic resolution rule, and valid wa_reason values. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (process/upload a journal page photo) and enumerates the full pipeline: OCR, template parsing, tag extraction, storage, image copy, and connection detection. This distinguishes it clearly from siblings like manual_capture, bulk_upload, and correct_ocr.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditional usage: use wa_reason='loose_capture' for off-journal items and force=True to replace an existing capture. It also routes WA follow-up to list_by_tag and promote_capture. It stops short of explicitly stating when to pick this tool over manual_capture or bulk_upload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
29 tool updates
v3.9.0- Added
assert_connection - Added
assert_entity - Added
audit_knowledge_status - Added
bridge_dream_research - Changed
bulk_upload1 field changed- added
Input schema / properties / volumeAdded value: +{ + "default": 0, + "title": "Volume", + "type": "integer" +}
- Added
commit_aiex - Added
commit_assessment - Added
commit_distillation - Added
commit_observation - Added
correct_ocr - Added
dream_correlation - Added
export_backup - Added
export_html - Added
extract_insights - Changed
find_connections2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 20, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / min_strengthAdded value: +{ + "default": 2, + "title": "Min Strength", + "type": "number" +}
- Added
find_path - Added
get_version - Added
identify_capture - Added
import_backup - Added
lint - Changed
list_by_tag5 fields changed- added
Input schema / properties / entry_typeAdded value: +{ + "default": "", + "title": "Entry Type", + "type": "string" +} - added
Input schema / properties / roleAdded value: +{ + "default": "", + "title": "Role", + "type": "string" +} - added
Input schema / properties / tag / defaultAdded value: +"" - added
Input schema / properties / wa_reasonAdded value: +{ + "default": "", + "title": "Wa Reason", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "tag" -]
- Added
manual_capture - Added
neighborhood - Added
promote_capture - Added
rebuild_connections - Changed
search_captures2 fields changed- added
Input schema / properties / entry_typeAdded value: +{ + "default": "", + "title": "Entry Type", + "type": "string" +} - added
Input schema / properties / wa_reasonAdded value: +{ + "default": "", + "title": "Wa Reason", + "type": "string" +}
- Added
set_volume - Added
surface_connections - Changed
upload_capture3 fields changed- added
Input schema / properties / volumeAdded value: +{ + "default": 0, + "title": "Volume", + "type": "integer" +} - added
Input schema / properties / wa_detailAdded value: +{ + "default": "", + "title": "Wa Detail", + "type": "string" +} - added
Input schema / properties / wa_reasonAdded value: +{ + "default": "", + "title": "Wa Reason", + "type": "string" +}
13 tool updates
v0.1.0- First observed
bulk_upload - First observed
dream_patterns - First observed
export_captures - First observed
export_study_deck - First observed
find_connections - First observed
get_breakthroughs - First observed
get_stats - First observed
journal_health - First observed
knowledge_progress - First observed
list_by_tag - First observed
search_captures - First observed
suggest_synthesis - First observed
upload_capture
TDQS
Scored across 37 tools
Most tools have distinct purposes, but a few clusters risk confusion: upload_capture/manual_capture/bulk_upload all ingest captures, and find_connections/neighborhood/find_path all explore graph relationships. Descriptions clarify inputs and preconditions, so selection is usually unambiguous, but the overlaps prevent a perfect score.
Tools consistently use snake_case, and most follow a verb_noun pattern (get_stats, search_captures, commit_aiex). Minor deviations include noun phrases (knowledge_progress, journal_health) and adjective_noun forms (manual_capture, bulk_upload), but the scheme remains readable and predictable overall.
At 37 tools, the server is well above the 25-tool threshold where the set becomes unwieldy for agent selection. Many specialized analysis, AI-dialogue prep, and export tools could be consolidated or made optional, so the count is heavy for the apparent journal-knowledge-base scope.
The surface covers capture ingestion, OCR/text correction, type promotion, volume configuration, entity/connection assertion, graph rebuild, search/browse, pathfinding, health metrics, AI extraction/audit/observation, and multiple export/backup paths. No obvious lifecycle dead ends exist for the core journal domain, and non-deletion is explicitly by design.
Maintenance
Related MCP Connectors
- PenlogOAuthapp.penlog
Handwritten iPad journal your AI can read and write tasks back to, over MCP.
Personal knowledge base MCP server with semantic search, auto-categorization, metadata extraction
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceTurns local plain-text notes into searchable long-term memory for AI agents through the MCP protocol.4MIT
- AlicenseAqualityFmaintenanceTurns a local folder of notes and documents into a searchable knowledge base for AI assistants via MCP, enabling semantic search, reading, and adding notes entirely on-device.49MIT
- AlicenseNot gradedqualityCmaintenanceA local MCP server for journaling, organizing, and recalling your work. It captures entries as plain markdown files, indexes them for full-text and structured search, and enables querying via natural language.26 PyPI1MIT
- AlicenseNot gradedqualityDmaintenanceA private, local-first MCP server that gives any AI long-term memory — its own diary. Zero models, zero network, zero subscription; smarter search than Notion, running entirely on your machine.MIT