MisakaNet
MisakaNet is a failure-memory MCP server for finding, reading, submitting, and validating debugging lessons, plus checking evidence, usage, and preflight risk.
Search the public failure-lesson index by error text, keyword, topic, domain, and result kind, with ranked results and compact/summary/full detail.
Fetch a specific lesson by repository path or lesson ID, with path-traversal validation and content truncation.
Proactively inject relevant failure memory into context before starting a task using lexical matching (local stdio server only).
Run preflight risk checks for planned high-risk operations, returning risk level, matched lessons, and concrete guards.
Submit a failure intake when no lesson matches or an existing lesson is stale/incorrect; supports local queue fallback if remote delivery fails.
Write a complete structured lesson (failure, root cause, fix, verification) with a registered agent token; submissions are quality-gated and pending review.
Record that a lesson helped and report outcome status (experimental), and check usage/quota status.
Register an agent to receive a node_id/token for write access or remote MCP usage.
Check evidence of real lesson reuse via reuse signals (E0/E3/E4).
Poll an agent inbox for intake answers, conversions, acceptances, or published lessons.
Allows searching and retrieving failure-recovery lessons related to GitHub API errors, token issues, workflow failures, and DCO sign-off problems.
Allows searching and retrieving failure-recovery lessons related to pip package installation errors, timeouts, SSL issues, and other PyPI-related failures.
MisakaNet
mcp-name: io.github.Ikalus1988/misakanet
The same failure, paid for twice.
A
pip installtimes out behind a corporate proxy. An agent finds the fix. Days later the same timeout appears on another machine, under another model — and is debugged from scratch, because the fix was never written down anywhere the next agent looks.MisakaNet is that place: a git-backed failure memory. Every lesson is a Markdown file in this repository — graded by evidence, reviewed like code, retrieved by an agent instead of guessed at. You fail once; the next agent does not.
Agent-native interfaces: MCP server (8 tools), WebMCP, llms.txt,
A2A discovery via .well-known/agent-card.json. The local stdio server (pip install misakanet)
ships 11 — the hosted endpoint is a subset; docs/mcp.md has both rows.
Install (30 seconds)
The point of an install is a first successful search, not the install. None of these needs an account or a token.
Your host | Command |
DeepSeek Harness |
|
Claude Code |
|
Installer-managed | Claude Code · Codex · Hermes · OpenClaw · codewhale · Cursor · Gemini CLI · Copilot CLI · OpenCode · Kiro · MiniMax Code · DeepSeek Harness |
Any other MCP client | point it at |
Your own code |
|
The installer-managed row is what npx @misaka-net/misakanet-setup writes into each host's config.
For DeepSeek Harness that is the rules half only ($DSH_HOME/AGENTS.md): its tools come from the
plugin in the row above, which the installer prints as the one manual step.
Updates: dsh plugin --profile web update misakanet@latest.
Installer updates: npx @misaka-net/misakanet-setup@latest.
Full prerequisites and the two-package trap: How to use it.
Related MCP server: Fix Memory MCP
Your first five minutes
1. Ask it something you have actually broken. No client installed? This curl is the whole interface:
curl -sS https://misakanet.org/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json' \
-H 'MCP-Protocol-Version: 2025-06-18' -H 'Origin: https://misakanet.org' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"misakanet_search","arguments":{"query":"database is locked","top":3}}}'2. Read what came back. A hit returns the lesson, its evidence_level, and its path — open the
file and read the fix before running any command in it. A miss returns no_match plus a ready-to-call
intake: the corpus saying it does not know this one yet.
3. Check the trust signal, not the tone. E0–E3 say how far a lesson was verified; E4 is the
one nobody can write or vote into.
What is MisakaNet?
Git-backed failure memory for AI coding agents. An error shows up → the agent searches → it applies a fix somebody already verified → if nothing matches, the miss becomes an intake, and the intake becomes a lesson for the next agent.
Every lesson is a Markdown file: reviewed like code, graded by evidence, retrieved with BM25 over the
Python standard library. The hosted MCP endpoint adds an optional semantic fallback (bge-m3 +
Vectorize) only when BM25 returns no match; MISAKANET_SEMANTIC=0 disables it. No vector database is
required locally, and no server unless you want one.
Lessons | failure-recovery knowledge base, open and auditable under |
Domains | rag · devops · fanuc · docker · feishu · mcp · network · ci · wsl · windows … |
Evidence | E0 intake → E1 reviewed → E2 reproduced → E3 CI verified → E4 observed reuse by two or more distinct clients |
It is not | It is |
❌ a general memory system | ✅ a failure-recovery knowledge layer |
❌ an agent runtime | ✅ a searchable lesson database |
❌ a mandatory vector database / RAG stack | ✅ BM25 first; optional, disable-able semantic fallback on the hosted endpoint |
❌ a skill marketplace | ✅ debugging knowledge from real sessions |
❌ a general-purpose benchmark platform | ✅ a corpus graded by evidence; a 267-query retrieval run is published, and the older recitation benchmark is paused |
What it answers — and what it does not

MisakaNet answers for the failures it has indexed, and only those. When nothing matches the reply is
no_match plus a ready-to-call intake — the corpus saying "not this one yet", not a dead end.
Lesson vs Skill
A skill teaches an agent how to do something; a lesson records what went wrong before and how not to fail again. MisakaNet is only the second thing. → FAQ
Where it is today
The numbers that move are badges, on purpose: the Lessons badge renders
data/badges/lessons.json, regenerated byupdate-badges.yml, so it can lag a run but is never a hand-typed total.The top of the evidence ladder is empty, and this page says so.
E4needs an observation — two distinct clients actually retrieving a lesson — and the corpus has none yet (distribution, regenerated and checked by CI).Search is BM25 first; the hosted endpoint can fall back to embeddings. Local/offline remains stdlib BM25; the fallback runs only when BM25 returns no match, and
MISAKANET_SEMANTIC=0turns it off. A corpus gap is still a miss: the reply isno_matchplus an intake, not an empty page.Reported gaps arrive faster than they are triaged. The intake queue is the honest bottleneck.
The corpus is downloadable and citable.
data.misakanet.orgpublishes a versioned bundle — the full corpus, the benchmark query set, and every run artifact — with a per-file SHA-256 and an explicit license per file (DATASET.md). The counts live in each version'smanifest.json, not in prose.
Retrieval benchmark: 267 queries, BM25 vs semantic fallback
On 2026-10-27 the hosted endpoint's retrieval path was evaluated on 267 queries, one per lesson
generated by Workers AI 70B. Both arms used the same eval worker and corpus; only
MISAKANET_SEMANTIC changed.
arm | R@1 | R@5 | no_match |
BM25 | 0.210 | 0.225 | 0.712 |
semantic fallback | 0.446 | 0.472 | 0.453 |
The fallback improves R@1 by 23.6 points and cuts no_match by 25.9 points. It does not
meet the R@1 half of the target (0.446 < 0.46); no_match is within the target
(0.453 ≤ 0.50). A 113-query subset reaches 0.460/0.460, while 250 reaches 0.404/0.504: the sample is
large enough to show the fallback works, not large enough to call R@1 solved.
This is 267 queries from the 300-entry pool, not the full 650; 33 pool entries yielded no query, 2 semantic requests errored, and the eval corpus was not refreshed. → full report
What changed since: the gate, not the model
The table above measures a configuration production no longer uses. Until 2026-10-28 the semantic path ran only when BM25 returned nothing, so a confident-but-wrong lexical hit suppressed it — 13 of the 20 recorded misses were exactly that. For queries containing CJK characters the two ranked lists are now fused (reciprocal-rank) instead of one gating the other.
Measured on the live endpoint, 64 Chinese queries, 0 transport failures:
bucket | n | before | after |
zh → zh | 31 | 0.710 | 0.774 |
zh → en | 33 | 0.455 | 0.697 |
zh → en, low overlap | 14 | 0.214 | 0.500 |
For scale: bge-m3 pure cosine already reached 0.636 on the cross-lingual bucket, and a gemini
embedding 0.727 — so most of the gap was the decision to consult the vector path, not the model.
English queries are untouched (the fuse is gated on CJK characters) and sit at 15/20 against a floor of
16, which is where they were before this change. → full report
Recitation benchmark: what it measured, and why it is paused
One narrow question: when you hand a model a lesson, how much of that lesson comes back? The
metric is lesson_hit_rate — the share of the injected lesson's commands reproduced in the answer.
Read the setup before the number: the scenario in this benchmark is each lesson's own title, the injected
lesson is that same lesson,
no retrieval call is made, and correctness is not checked. It measures the recitation half of RAG:
necessary for MisakaNet to help, and not evidence that search finds anything.
The run is paused. Two independent runs of ≈500 scenarios each on 2026-09-22: 46.1% with the
lesson pasted in, 23.3% without. What remains is the last snapshot plus its dated record —
docs/benchmarks/latest.json.
The table below is generated by scripts/update_readme_benchmark.py;
do not hand-edit it.
Date | with_lesson hit rate | plain hit rate | n |
2026-08-30 | 46.4% | 23.9% | 358 |
2026-08-31 | 49.1% | 25.1% | 398 |
2026-09-06 | 48.3% | 24.1% | 455 |
2026-09-14 | 46.6% | 23.4% | 494 |
2026-09-21 | 46.1% | 23.3% | 512 |
2026-10-12 | 43.8% | 26.1% | 34 |
1155 run(s) in latest.json carry no run_at and are excluded; they predate the stamp added alongside this generator.
with_lesson hit rate (per run date)
43.8% │ ▁
46.1% │ ▄
46.6% │ ▄
48.3% │ ▆
49.1% │ █
└──────────────────
08 09 09 09 10
31 06 14 21 12Per-run files: docs/benchmarks/ · metric definition: METRIC_DEFINITION in
scripts/benchmark_workers_ai.py.
Take part
1. Report a failure the corpus does not have. Search first, then call misakanet_submit_intake —
no account, no email, no token, a five-line report is enough. It becomes a tracked issue.
2. Reuse a lesson and leave the trace. A "this helped" vote is recorded as an E3 hint, not as
proof. The proof is quieter: your retrieval is counted, anonymously, as one more distinct client.
What you get back: attribution. A lesson cites the intake that produced it (source:,
provenance.issue:), and the pipeline can emit a receipt naming the lesson and its evidence level.
Nothing here is a bounty: this repository pays nothing and promises nothing. Some issues carry third-party reward banners added by our own automation; we do not administer them — see Contributing.
How to use it
npx @misaka-net/misakanet-setup installs MisakaNet into your assistant's own config — the same
command for every client. The ten supported clients, and what each one gets, are in
the install page. Verify an install with
npx @misaka-net/misakanet-setup --verify; undo it with --uninstall.
Reads are anonymous and unlimited; registration is for writing (why).
Node ≥ 18 for the installer, Python ≥ 3.11 for the library and stdio server. Python 3.10 reached end-of-life on 2026-10-01, so this release needs 3.11 or newer — upgrade the interpreter before upgrading the package.
Other channels
Claude Code, as a plugin —
/plugin marketplace add Ikalus1988/MisakaNet, then/plugin install misakanet@misakanet: the hosted MCP tools, no installer, no local process.DeepSeek Harness —
dsh plugin --profile web add misakanet:mcp__misakanet__*tools plus the session panel. The rules half (the "search before you act" block) is written by the installer into$DSH_HOME/AGENTS.md; dsh has no plugin extension point for it, so the two halves stay separate.Call the endpoint yourself — the
curlin Your first five minutes.The library in your own code —
pip install misakanet-core.
The two-package trap (it cost a real install failure, #1849)
@misaka-net/misakanet-setup(npm) is the installer — it has abin, no plugin entry. Use it to teach your assistant to search.misakanet(npm) is the DSH / Codex plugin —dsh plugin --profile web add misakanet.This repository (git) is also a Claude Code plugin marketplace —
/plugin marketplace add Ikalus1988/MisakaNet.misakanet(PyPI) is the stdio MCP server —python3 -m misakanet.server.misakanet-core(PyPI) is the library (stdlib-only BM25; the hosted endpoint's semantic fallback is server-side) —from misakanet.search import search_lessons.
Use it as a GitHub Action
When a workflow fails, the action searches the lessons and comments the closest match on the pull request (optionally reporting the new error). Published on GitHub Marketplace.
on:
workflow_run:
workflows: ["CI"] # your CI workflow's name
types: [completed]
permissions:
actions: read # read the failing job's log (required)
pull-requests: write # post the comment
issues: write # the comment endpoint is issues.createComment
jobs:
intake:
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
runs-on: ubuntu-latest
steps:
- uses: Ikalus1988/MisakaNet@v1
with:
mode: suggest-only # or suggest-and-intake, to report new errors too
source: ${{ github.repository }}Documentation
Topic | Where |
Install, verify, uninstall | |
MCP: protocol, tools, transports | |
CLI | docs/cli-reference.md · |
Architecture | |
Contributing a fix | |
Submitting an intake | |
Troubleshooting | |
Known limitations | |
Benchmarks | |
Dataset (corpus + query sets, downloadable) | |
Roadmap / changelog | |
Competitors, domains, crawler policy | competitive · domains · robots |
Contributing
Zero bounty. Maximum rigor. Merge earns credit.
"Zero bounty" is a statement about this repository: MisakaNet pays nothing and promises nothing. It
is not a statement about the issue you are looking at. Some issues carry an Opire banner
advertising a third-party reward, added automatically by our own
scripts/question_autopilot.py — we do not administer those payouts,
and Opire is not mentioned in CONTRIBUTING.md. Verify any reward offer independently before you
plan work around it. The only thing this repository has ever honoured is a merged PR.
(#2903)
Check the checkout:
python3 scripts/misakanet_cli.py smokeSearch before writing:
python3 search_knowledge.py "your error here"Found nothing? Share your failure lesson — five lines is enough
This month's good first issue (Oct 26 – Nov 26): Bring one real failure — no code; the MCP intake needs no account; we help with the format.
→ CONTRIBUTING.md · good first issues · code of conduct
Security
⚠️ Sandbox your agent before executing retrieved commands. Lessons are community-contributed —
review before running. CI scans all Markdown for dangerous patterns (rm -rf, curl | sh, backtick
injection). See SECURITY.md and LIMITATIONS.md.
Troubleshooting
Symptom | Where |
DCO · leaked token · pip timeout · | |
MCP returns 403/405, or a client shows no tools | |
Behind a corporate proxy |
For Agents & Crawlers
Prefer MCP intake for missing or stale lessons; PRs are optional. Search first; if nothing matches,
call misakanet_submit_intake at https://misakanet.org/mcp — no account, no token. Never send
secrets or raw private logs. Protocol: docs/mcp-intake-guide.md.
Contributors
Built by the network, for the network. Zero bounties paid — only merge approval and eternal network gratitude. ⚡
License
Apache-2.0 — Copyright 2026 Ikalus1988. Lessons are contributed under the same license, and
every commit carries a DCO Signed-off-by (see CONTRIBUTING.md).
Available Tools
11 toolsmisakanet_get_lessonARead-onlyIdempotent
Fetch one public MisakaNet lesson by repository path or lesson ID. Use after misakanet_search returns a promising result, or when a lesson is explicitly referenced; do not use it for broad discovery. Input semantics: provide exactly one of path or id (path takes precedence if both are supplied); if neither is supplied the handler returns {error}. path is a repo-relative path like lessons/core/auto-merge-ci-pipeline.md and is validated against directory traversal (must resolve under lessons/). id is the filename stem like auto-merge-ci-pipeline and is matched across the canonical (deduplicated) lesson set — mirrors and translations are reachable only by explicit path. Output schema: JSON with {path, content}; content is truncated to 5000 characters for MCP context window. Error cases: missing both path and id, lesson not found (returns a suggestion to search), path outside lessons/ directory. Side effects: none. Auth: none. Rate limits: local stdio process only; fetch one lesson per call when possible.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Lesson ID, usually the filename without .md, for example auto-merge-ci-pipeline. | |
| path | No | Lesson path relative to the repository, for example lessons/core/auto-merge-ci-pipeline.md. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses input precedence, traversal validation, canonical-set matching behavior, output truncation to 5000 characters, error cases, no side effects, no auth, and local stdio operation. These details materially help an agent call the tool correctly and interpret failures.
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 purpose and usage, then organized into input, output, error, side-effect, auth, and rate-limit notes. Despite its length, every section carries actionable information for a lookup tool with nuanced path/id behavior.
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?
There is no output schema, so the description appropriately explains the {path, content} return shape and the 5000-character truncation. It also covers errors, precedence, path validation, and safety context, leaving no material gap for an agent invoking this 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?
Although schema coverage is already 100%, the description adds important semantics: provide exactly one of path or id, path takes precedence when both are supplied, and id matches only the canonical lesson set while mirrors and translations require explicit paths. This goes well beyond the parameter descriptions.
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: fetch one public MisakaNet lesson by repository path or lesson ID. It explicitly distinguishes this lookup tool from misakanet_search, so an agent can choose it without opening either 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?
It gives explicit usage conditions: use after misakanet_search returns a promising result or when a lesson is explicitly referenced. It also states the exclusion clearly: do not use it for broad discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_me_eventsARead-onlyIdempotent
[READ-ONLY EVIDENCE] Return evidence of a lesson being reused. E4 is observed reuse: search_signals shows two or more distinct clients actually retrieved the lesson — a count of requests, never of prose. Regression-benchmark citations, helpful votes and a lesson's own verified by: line are E3 hints: a citation is sandbox-level evidence, a vote is one person's opinion, and a provenance line is the lesson talking about itself, so none of them can confer E4. Use to check whether a lesson is proven by real usage, not just self-reported. Provide lesson_id or lesson_path — if neither is supplied the tool returns {error}. Semantically 'misakanet_get_my_events' (evidence for the lessons your node submitted/used); kept as me_events for backward compatibility. No auth required (read-only, rate-limited).
Returns: object {lesson_id, events: [{type, count|queries|sources, evidence_level}], evidence: 'E0'|'E3'|'E4', note}.
Example: misakanet_me_events(lesson_id='dco-auto-fix-workflow')
Input semantics: lesson_id (filename stem, e.g. dco-auto-fix-workflow) or lesson_path (e.g. lessons/core/dco-auto-fix-workflow.md) — the endpoint derives the id from the path the same way. Passing neither is refused before any network call. Output schema: proxied unchanged from the hosted tool (lesson_id, events[], evidence, note). Error cases: missing_lesson_reference when both arguments are absent; hosted_endpoint_unavailable when the hosted service cannot be reached or refuses the call — this is a proxy, so there is no local fallback, and an empty events list would be a different, wrong answer. Side effects: none (read-only, no local writes). Auth: none. Rate limits: the hosted endpoint's anonymous read burst window applies; the proxy adds no local limit.
| Name | Required | Description | Default |
|---|---|---|---|
| lesson_id | No | Lesson ID (filename stem), e.g. dco-auto-fix-workflow. Either lesson_id or lesson_path is required. | |
| lesson_path | No | Optional full path, e.g. lessons/core/dco-auto-fix-workflow.md. Either lesson_id or lesson_path is required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds substantial context: no auth, rate limiting, no local fallback, error cases including missing_lesson_reference and hosted_endpoint_unavailable, and no side effects. It also explains why an empty events list would be a wrong proxy-failure answer, which is valuable behavioral disclosure.
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 read-only evidence purpose and then proceeds through inputs, return shape, errors, side effects, auth, and limits. It is mostly well structured, though it repeats read-only/no-auth/rate-limit information and is longer than strictly necessary.
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 no output schema, the description compensates by giving the return object shape, evidence levels, note field, error cases, auth status, rate limits, and side effects. It gives an agent enough to call the tool and interpret both success and failure 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 100%, so the schema already documents lesson_id and lesson_path. The description adds meaning beyond the schema by explaining that either identifier is acceptable, that the endpoint derives the lesson id from lesson_path the same way, and that supplying neither is refused before any network call.
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: returns evidence of a lesson being reused, specifically E4 observed reuse. It sharply distinguishes E4 from E3 hints such as citations, votes, and provenance lines, so an agent can identify the tool's unique role without opening other schemas.
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?
Explains when to use it: to check whether a lesson is proven by real usage rather than self-reported evidence. It also says what does not count as E4, but it does not explicitly route among nearby sibling tools such as get_lesson or usage_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_me_inboxARead-onlyIdempotent
Check your agent inbox for answered questions and conversion receipts. Use after submitting an intake (misakanet_submit_intake) to poll for maintainer answers or lesson conversions. Input semantics: provide intake_id (the ID from submit_intake) or dedup_key (the dedup hash from submit_intake). At least one is required. Output schema: JSON with events[], count, status, and poll_hint. Each event has a type (answered, converted, accepted, lesson_published) and type-specific fields. An intake still sitting in the local queue is answered from there (delivery= local_queue) — the hosted endpoint has never seen it. Error cases: missing both intake_id and dedup_key returns {error, hint}. Side effects: none — this is a read-only call. Auth: none. Rate limits: none — reads from D1 database and local data files.
| Name | Required | Description | Default |
|---|---|---|---|
| dedup_key | No | The dedup hash from misakanet_submit_intake response (e.g. 'def456'). | |
| intake_id | No | The intake ID from misakanet_submit_intake response (e.g. 'abc123'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations it discloses a genuinely non-obvious trait: an intake still in the local queue is answered from there (delivery=local_queue) because the hosted endpoint has never seen it. It also documents the error contract ({error, hint} when both identifiers are missing), plus auth and rate-limit status, which the annotations do not cover.
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?
Opens with purpose, then the usage trigger, then labeled sections for input semantics, output shape, edge cases, side effects, auth and rate limits — front-loaded and scannable. It runs long for a 2-parameter read call, and the labeled list format is slightly heavier than the content requires.
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?
There is no output schema, so the description carries the return-shape burden and does: events[], count, status, poll_hint, plus the event types (answered, converted, accepted, lesson_published). Combined with the error case and side-effect profile, an agent has everything needed to call and interpret this 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?
Schema coverage is 100%, but the description adds the crucial constraint the schema omits: required is empty in the schema, yet the description states "provide intake_id ... or dedup_key ... At least one is required." That single sentence prevents a zero-argument call that the schema alone would permit, and it explains both identifiers originate from submit_intake.
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?
"Check your agent inbox for answered questions and conversion receipts" names a specific verb and resource and makes the tool's scope unmistakable. It is clearly distinct from misakanet_submit_intake (write side) and misakanet_me_events (event log), so an agent can route between siblings without inspecting schemas.
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?
"Use after submitting an intake (misakanet_submit_intake) to poll for maintainer answers or lesson conversions" gives an explicit prerequisite and a polling context. It stops short of stating when NOT to use it (e.g. versus misakanet_me_events or misakanet_search), so it is strong but not complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_memory_contextARead-onlyIdempotent
Proactive half of the pair: call this BEFORE starting a task so failure-memory is in context from the first step; call misakanet_search once a specific error has actually appeared. Input semantics: task is required and is matched as lexical keyword/token overlap over lesson titles, summaries and tags (BM25 when the index is present, a plain scorer otherwise) — not embeddings — so pass the concrete nouns, tools and error words you are about to meet ('chromadb on an NTFS mount', 'docker multi-stage build OOM') rather than a goal ('make it faster'); intent-only phrasing retrieves nothing. How domain behaves: a hard filter over a closed vocabulary of the domains the lesson corpus declares (the repository's data/domains.json is the list; rag, devops, fanuc, python, ci, mcp are examples), and a value outside it returns zero lessons with no error — so leave it out unless you know the domain; an empty result with a domain set is usually the filter, not an empty corpus. How top_n behaves: silently clamped to 10 (larger values are accepted and reduced), and each lesson is trimmed to 200 characters per field inside context_block — past roughly five matches you spend prompt space faster than you gain information. Output schema: Returns {task, lesson_count, lessons, context_block}; context_block is ready-to-inject markdown, and lesson_count 0 (voice='failure-warning') means the corpus has no match yet — retry with the raw error text or submit an intake, rather than reading it as a tool failure. Error cases: a missing or empty task returns {error, hint, voice} instead of lessons; a domain outside the declared vocabulary returns zero lessons rather than an error; a missing or empty index degrades to the plain lexical scorer instead of failing. Side effects: none — this is a read-only call, and it does not record usage or touch the network. Auth: none. Rate limits: none — matching runs against the lessons/ directory of the checkout this server was started from, so results are only as current as that checkout. Local stdio server only — the hosted endpoint exposes misakanet_search and misakanet_get_lesson instead.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | What you are about to do, in the vocabulary of the tools, systems and errors involved (e.g. 'set up a ChromaDB RAG pipeline on WSL', 'deploy FastAPI behind a corporate proxy'). Matched lexically, so include the distinctive terms a lesson would use in its title or problem statement. | |
| top_n | No | How many lessons to return (default 5). Values above 10 are accepted and silently clamped to 10. Each returned lesson is truncated to 200 characters per field in context_block, so ~5 is where extra matches start costing more prompt budget than they add. | |
| domain | No | Optional hard filter on the lesson's frontmatter domain, from a closed vocabulary (e.g. 'rag', 'devops', 'fanuc', 'python', 'ci', 'mcp'). It narrows and never widens: an unknown value yields zero lessons without an error, so omit it when unsure. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses silent clamping at 10, 200-char per-field truncation, the BM25-to-plain-scorer degradation when the index is absent, zero-rows-without-error for an unknown domain, and that corpus freshness is bounded by the local checkout. Auth, rate limits and side effects are stated explicitly, and the 'local stdio only' note explains why the hosted endpoint differs. Minor tension: 'does not touch the network' reads as closed-world against openWorldHint=true, but this is a scope clarification rather than a contradiction of intent.
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 correctly (pair positioning first, then per-parameter semantics, then output, errors, side effects), and every section is doing work. It is long — the trailing Auth/Rate-limits/Side-effects lines partly re-cover what readOnlyHint and openWorldHint already imply — but the density justifies most of the length for a tool with this many silent-failure modes.
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?
No output schema exists, and the description compensates in full by naming the return keys ({task, lesson_count, lessons, context_block}) and interpreting lesson_count 0 as 'no match yet' rather than a tool failure — exactly the failure mode an agent would otherwise misread. Error cases and degradation behavior are also enumerated.
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 100%, so the baseline is 3; the description earns a fourth by sharpening *why* the task string must be concrete ('intent-only phrasing retrieves nothing') and by giving a counter-intuitive diagnostic that the schema omits: an empty result with a domain set is 'usually the filter, not an empty corpus.' It largely restates the schema's clamping and vocabulary rules, so it does not reach 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?
States a specific verb and resource and positions itself against a named sibling: it is the 'proactive half of the pair' to be called before a task, versus misakanet_search after an error appears. The framing ('proactive' vs. reactive) lets an agent pick between them without opening either 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?
Explicit temporal routing rule: call this BEFORE starting a task, and only call misakanet_search 'once a specific error has actually appeared.' It adds a second conditional ('leave [domain] out unless you know the domain') and names the remediation path on an empty result (retry with raw error text or submit an intake).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_preflightARead-onlyIdempotent
Check risk level before executing high-risk operations. Matches agent intent against lesson triggers and risk profiles to provide proactive warnings before you start. Use before RAG builds, WSL/GPU tasks, bulk imports, or any operation that might fail. Input semantics: intent (required) describes what you plan to do in concrete terms (e.g. 'build RAG pipeline with ChromaDB'); context (optional) describes the environment (e.g. 'WSL, GPU 8GB'). Output schema: JSON with {risk_level (low|medium|high), intent, matched_lessons: [{id, title, domain, relevance}], guards: [string]}. Matched lessons are pulled from the local corpus using keyword overlap — a high risk_level with empty matched_lessons means the profile matched (e.g. 'GPU' triggers the WSL profile) but no specific lesson was close enough. That reading holds only while index_status is "ok"; it is "unreadable" when data/lessons.json could not be read or parsed, and then matched_lessons is empty because no lesson was checked rather than because none matched, with index_error saying why. Guards are concrete 'do X before Y' suggestions drawn from matched profiles and lessons. Error cases: missing intent returns {error}. Side effects: none — this is a read-only check. Auth: none. Rate limits: local stdio process only.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | Task intent description (e.g. 'build RAG index from PDFs') | |
| context | No | Environment context (e.g. 'WSL, GPU 8GB') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing output structure, the keyword-overlap matching mechanism, the index_status/index_error caveat that changes how empty matched_lessons must be read, error behavior for missing intent, and explicit 'no side effects / no auth / local stdio only' statements. The only mild tension is openWorldHint=true versus 'local stdio process only', but this does not contradict the readOnly/destructive/idempotent declarations.
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 purpose and usage before the dense output-semantics block, and every sentence carries information the agent needs. The output-explanation section is long, but it is justified because no output schema exists; a light trim would still be possible.
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 no output schema, the description supplies the full return shape, the interpretation rule for empty matched_lessons, the degraded index_status case, guards semantics, and error behavior. An agent has everything needed to call it and to read the result 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 100%, so the schema already documents both parameters; the description adds the required/optional distinction and richer worked examples ('build RAG pipeline with ChromaDB', 'WSL, GPU 8GB'). It stops short of saying how keyword overlap is computed, which would fully close the loop on intent phrasing.
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 risk level before executing high-risk operations') and explains the mechanism (matching intent against lesson triggers and risk profiles). It is clearly distinguishable from siblings like misakanet_search or misakanet_get_lesson, which retrieve lessons rather than assess pre-execution risk.
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 when to use it ('before RAG builds, WSL/GPU tasks, bulk imports, or any operation that might fail') and frames it as a proactive pre-flight step. The trigger list plus the 'before you start' timing gives an agent actionable selection criteria with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_registerA
Register an agent and receive a node_id and token for unlimited remote MCP access. Reading needs no registration; only write tools do. Local stdio MCP is unlimited and does not need registration. For remote HTTP MCP, call this tool first to get a token, then pass it as the user parameter in subsequent calls. Input semantics: agent_type is optional (defaults to 'unknown'); client_id is an optional stable identifier (8-64 chars of A-Z a-z 0-9 . _ : -) you generate once and keep private — with it, later calls return the same node_id and token (reused=true), without it each call mints a new node. SECURITY: client_id is a key, not a label — the server derives a deterministic node_id from it and returns the stored token if one exists, so knowing someone's client_id is enough to obtain their token. Generate a random UUID and store it like a secret; do not derive from hostname or workspace id. Output schema: JSON with {node_id, token, registered_at, agent_type, reused?}. Error cases: invalid_client_id (wrong format). Side effects: persists registration record in usage_meter. Auth: none. Rate limits: one registration per session.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | Optional stable identifier for this client (8-64 chars of A-Z a-z 0-9 . _ : -). Generate it once and reuse it so later calls return the same node instead of a new one. | |
| agent_type | No | Optional agent type identifier (e.g. 'claude-code', 'cursor', 'aider'). Defaults to 'unknown'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: error case (invalid_client_id), side effect (persists registration record in usage_meter), auth (none), rate limits (one per session), and the conditional reuse behavior. The reuse semantics (same node/token when client_id supplied) nuance the idempotentHint=false annotation but do not contradict it, since the no-client_id default still mints a new node.
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?
Dense but well organized and front-loaded with purpose and access rules. It is on the long side and the SECURITY paragraph is somewhat repetitive of the earlier client_id sentence, keeping it just below top marks.
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?
Despite no output schema, the description specifies the return shape ({node_id, token, registered_at, agent_type, reused?}) and covers error cases, side effects, auth, and rate limits. 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 already 100%, but the description goes further than the schema: it frames client_id as 'a key, not a label,' warns that knowing someone's client_id is enough to obtain their token, and instructs generating a random UUID rather than deriving from hostname. This is meaningful semantic value beyond the field descriptions.
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 ('Register an agent') and concrete outcome ('receive a node_id and token for unlimited remote MCP access'). It also immediately scopes what does NOT need registration (reads, local stdio), distinguishing it from the sibling write/read 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?
Explicit when-to-use rules: 'Reading needs no registration; only write tools do,' local stdio is unlimited, and for remote HTTP MCP 'call this tool first to get a token.' No alternative or exclusion is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_searchARead-onlyIdempotent
Search MisakaNet's public failure-lesson index by error text, keyword, or topic. Use when you need to discover relevant lessons and do not already know a lesson ID. Input semantics: query is required; domain optionally filters by lesson domain; top limits ranked results and defaults to 5. kind filters by result type: 'lessons' (lesson files only), 'evidence' (results with evidence_refs or verification), 'related' (cross-referenced/tag-overlap), 'all' (default). kind is auto-detected from query intent when omitted (e.g. 'lesson about X' → lessons, 'evidence for X' → evidence). Set explain=true to return matched terms, TF-IDF, entity matches, vector similarity, and hybrid score components. detail controls progressive disclosure: compact (default, ~80 tok/lesson) for broad scans, summary (~200 tok) with domain/tags/fix, full for complete lesson markdown. Output schema: JSON with results[] and source; each result is a ranked lesson summary. Error cases: missing query, unavailable search index, or no matches (empty results). Side effects: none. Auth: none. Rate limits: local stdio process only; callers should keep result counts small. Do not use for private log collection; search only with redacted snippets. Use misakanet_get_lesson for full content.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum ranked results to return. Defaults to 5; keep small for MCP context and latency. | |
| kind | No | Filter results by kind: 'lessons' returns only lesson files, 'evidence' returns results with evidence_refs or high evidence_level, 'related' returns cross-referenced/tag-overlap results. Default 'all' returns everything. Auto-detected from query intent when omitted (e.g. 'lesson about X' → lessons, 'evidence for X' → evidence). | |
| query | Yes | Required redacted error message, keyword, or topic (for example: 'pip install timeout' or 'DCO sign-off failed'). | |
| detail | No | Progressive disclosure: compact (default, ~80 tok/lesson) shows id/title/problem/freshness; summary (~200 tok) adds domain/tags/fix; full returns complete lesson markdown. Use compact for broad scans, full only after narrowing results. | |
| domain | No | Optional domain filter such as devops, python, network, feishu, rag, fanuc, or mcp. | |
| explain | No | Include score evidence for each result; vector similarity is null when the optional backend is unavailable. | |
| bm25_weight | No | Override BM25 keyword weight (0-1). Higher values favor exact keyword matches. Default: 0.65. All weights must sum to 1.0. | |
| include_stale | No | Include stale and superseded lessons in results. Default false — these are filtered out to avoid误导 agents with outdated information. | |
| baseline_weight | No | Override baseline score weight (0-1). Higher values favor proven/popular lessons. Default: 0.15. | |
| metadata_weight | No | Override metadata bonus weight (0-1). Higher values favor lessons with matching domain/tags. Default: 0.20. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive, so the safety profile is covered. The description adds real context beyond that: side effects none, auth none, local stdio rate constraint, enumerated error cases, and what explain/staleness do to results. It stops short of describing ranking order or result freshness semantics in depth, so not 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?
Front-loaded with purpose, then usage, then parameters, then output/errors/side effects — a sensible order. It is somewhat long and the parameter paragraph duplicates schema text, costing a point on economy.
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 10 parameters, no output schema, and a stateful index, the description covers what results look like (results[] and source, ranked lesson summaries), error behavior, auth, side effects, and rate limits. Everything an agent needs to call this correctly is 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 coverage is 100%, so the baseline is 3. The description's 'Input semantics' paragraph largely restates the schema descriptions for query, domain, top, kind, explain, and detail rather than adding new meaning; the one extra nuance is the omitted-kind auto-detection examples, which the schema also covers.
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 ('Search MisakaNet's public failure-lesson index') plus the accepted query forms (error text, keyword, topic). It also distinguishes itself from misakanet_get_lesson, which is named as the tool for full content.
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 when to use it ('when you need to discover relevant lessons and do not already know a lesson ID') and when not to ('Do not use for private log collection; search only with redacted snippets'). It names the alternative (misakanet_get_lesson) and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_submit_intakeA
Submit a failure-case intake when no matching lesson exists or a lesson was stale/incorrect. Use after misakanet_search fails to find a good match, or when the user resolved a problem not yet documented. Input semantics: problem is required (short description of the failure); kind defaults to missing_lesson; error, what_tried, fix, verification, and matched_lesson_id are optional. Output schema: JSON with submitted (boolean), intake_id, status (pending_review), redactions_applied, quality_score, dedup_key, poll_hint, and receipt. Error cases: missing problem, duplicate submission. Side effects: files the report on MisakaNet (it becomes a GitHub issue); when the network is unreachable it is kept in the local queue only, and the receipt says so via delivery=local_queue. Auth: none. Rate limits: the hosted endpoint's.
| Name | Required | Description | Default |
|---|---|---|---|
| fix | No | Optional: how the problem was resolved, if known. | |
| kind | No | Type of intake. missing_lesson = no match found; stale_lesson = matched but wrong; new_lesson_candidate = user resolved a new problem; question = asking for help (opens a [Question] issue, not a lesson candidate); proposal = a plan or product request, explicitly not a failure report (answerable by a decision, never converted into a lesson). | |
| error | No | Optional short error message. | |
| source | No | Calling client: codex, claude-code, cursor, dsh, curl, or other. | |
| problem | Yes | Required short description of the failure or gap (max 2000 chars). | |
| what_tried | No | Optional: what was attempted before or during the failure. | |
| verification | No | Optional: how to confirm the fix works. | |
| matched_lesson_id | No | Optional: lesson ID that was checked but did not help (for stale_lesson). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses concrete side effects (the intake becomes a GitHub issue on MisakaNet), an offline degradation path (local queue only, surfaced as delivery=local_queue in the receipt), the duplicate-submission error, and that there are no auth requirements but the hosted endpoint's rate limits apply. Destructive/read-only hints are consistent with a non-idempotent write that files a report; the openWorldHint=false is arguably loose given the GitHub-issue side effect, but it is not a direct contradiction of anything 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?
The description is front-loaded with purpose and trigger before moving into labeled sections (Input semantics, Output schema, Error cases, Side effects, Auth, Rate limits), so an agent can stop reading early. It is dense but nearly every clause carries decision-relevant information; only the output-field enumeration runs slightly long given no output schema exists.
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 write tool with no output schema, the description supplies the return shape, the failure modes, the fallback delivery behavior, auth, and rate-limit context — everything needed to call it and interpret the result 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 100%, so the baseline would be 3, but the description adds real value by stating problem is required, that kind defaults to missing_lesson, and which fields are optional as a group. It does not restate the enum semantics or the source parameter, leaving some reference work to 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?
The first sentence states a specific verb (submit) and resource (failure-case intake) plus the exact triggering condition (no matching lesson, or a stale/incorrect one), which cleanly separates it from siblings like misakanet_search and misakanet_write_lesson. An agent can identify the tool's job without opening 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?
It names the alternative explicitly ("Use after misakanet_search fails to find a good match") and gives the second qualifying condition (a problem resolved but not yet documented). It also enumerates the intake kinds via context, so the agent knows which classification applies rather than guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_submit_usageA
[Experimental] Record that a public lesson helped with a problem. Call this AFTER a lesson has been used and the outcome is known — use misakanet_usage_status to check remaining quota before submitting. Input semantics: lesson_id is required (the lesson that helped); tool names the calling client (e.g. 'claude-code', 'cursor'); outcome should be solved, partial, not-helpful, or another short status. Output schema: JSON with {lesson_id, tool, outcome, status}. Error cases: missing lesson_id. Side effects: currently returns a local placeholder report only (remote submission is disabled when MISAKANET_USAGE_DISABLE_REMOTE=1). Auth: none. Rate limits: local stdio process only.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | No | Calling tool or client name, for example claude-code, cursor, codex, or aider. | |
| outcome | No | Short result label such as solved, partial, or not-helpful. | |
| lesson_id | Yes | Required ID of the lesson that helped, for example auto-merge-ci-pipeline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past annotations: discloses that only a local placeholder report is produced while remote submission can be disabled via MISAKANET_USAGE_DISABLE_REMOTE, states auth is none, scopes rate limits to a local stdio process, and enumerates the error case (missing lesson_id). These are exactly the side-effect and environment facts an agent cannot get from readOnlyHint/destructiveHint alone.
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 sequences the prerequisite, input semantics, output shape, errors, side effects, auth, and limits in labeled clauses. Dense but nearly every clause carries new information; the '[Experimental]' tag and repeated output-field listing are the only near-redundancy.
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?
No output schema exists, yet the description supplies the return JSON keys, the single failure mode, the placeholder-vs-remote side effect, and the auth/rate-limit posture. For a 3-parameter tool this leaves no material gap 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 100%, so the schema already documents all three parameters. The description restates the same value examples for outcome and the same role for tool without adding syntax, constraints, or defaults beyond them, so the baseline of 3 applies.
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 ('Record that a public lesson helped with a problem') and scopes it to post-hoc reporting, which separates it from misakanet_search, misakanet_get_lesson, and misakanet_write_lesson. The 'AFTER a lesson has been used' framing makes the distinction operational rather than descriptive.
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 specifies the triggering condition ('AFTER a lesson has been used and the outcome is known') and names the sibling to consult first (misakanet_usage_status for remaining quota). The pre-check ordering is stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_usage_statusARead-onlyIdempotent
Check current usage status and remaining quota. Use before calling misakanet_submit_usage to see how many free lesson reads remain and whether registration is needed. Call misakanet_register if is_registered is false and you need write access. Input semantics: user is optional (defaults to 'anon:mcp-default'); pass the token from misakanet_register (e.g. 'token:xxx') to check a registered agent's quota. Output schema: JSON with {user, free_reads_used, free_reads_limit, free_reads_remaining, credits, is_registered, next}. Error cases: none (returns defaults on failure). Side effects: none. Auth: none. Rate limits: none.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Optional user identifier (e.g. 'anon:iphash' or 'token:xxx'). Defaults to 'anon:mcp-default'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/idempotent/non-destructive), the description discloses error behavior ('returns defaults on failure'), auth requirements (none), and rate limits (none) — all facts the structured fields do not provide. The 'side effects: none' line mildly echoes destructiveHint=false, but the surrounding context is genuinely additive.
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 sequencing before the labeled reference sections (input/output/errors/side effects), and every block is scannable. Slight redundancy: the 'user' parameter is described in both the prose and the schema, and 'side effects: none' duplicates the annotations.
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?
No output schema exists, yet the description enumerates the returned fields (free_reads_used, free_reads_limit, free_reads_remaining, credits, is_registered, next), including the 'next' hint that ties into the register/submit workflow. For a single-optional-param read tool, nothing an agent needs 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 100%, so the baseline is 3; the description earns above that by explaining the two identifier forms ('anon:iphash' vs 'token:xxx') and where the token comes from (misakanet_register). It repeats the default value already in the schema, so it is not a full 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?
States a specific verb and resource: 'Check current usage status and remaining quota', which an agent can distinguish from misakanet_submit_usage (which consumes quota) and misakanet_register (which upgrades to write access). The description also explicitly names both siblings, so differentiation is 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?
It gives explicit sequencing ('Use before calling misakanet_submit_usage') and a clear conditional branch ('Call misakanet_register if is_registered is false and you need write access'). Both when-to-use and which-alternative-to-pick are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
misakanet_write_lessonA
Submit a complete, structured failure lesson. Use after resolving a problem and documenting the full failure→root cause→fix→verification chain. Requires a registered agent token (not anonymous). Input semantics: title, domain, problem, root_cause, fix (all required); verification, tags, token, source (optional). Output schema: JSON with lesson_id, status (pending_review), quality_score, quality_notes, redactions_applied, and receipt. Error cases: missing required fields, anonymous token, quality score below 75 threshold, duplicate submission. Side effects: writes to data/contribution_queue.jsonl. Auth: registered agent token required. Rate limits: local stdio process only.
| Name | Required | Description | Default |
|---|---|---|---|
| fix | Yes | Required fix — what resolved the problem? | |
| tags | No | Optional tags for categorization (e.g. ['proxy', 'pip', 'corporate-network']). | |
| title | Yes | Required lesson title — short, specific, kebab-case friendly (e.g. 'pip install timeout on corporate proxy'). | |
| token | No | Registered agent token (e.g. 'token:abc123'). Required for write_lesson. | |
| domain | Yes | Required domain: devops, python, network, feishu, rag, fanuc, mcp, docker, git, etc. | |
| source | No | Calling client: codex, claude-code, cursor, dsh, or other. | |
| problem | Yes | Required description of the failure (max 2000 chars). | |
| root_cause | Yes | Required root cause analysis — why did it fail? | |
| verification | No | Optional: how to confirm the fix works. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (non-read-only, non-idempotent write), the description discloses the auth requirement, the concrete side effect (writes to data/contribution_queue.jsonl), the full error surface including a quality-score threshold of 75 and duplicate submission, and the rate-limit/runtime constraint (local stdio only). This is exactly the kind of post-annotation context the dimension rewards.
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 action and trigger, then packs auth, inputs, outputs, errors, and side effects into labeled clauses — nothing is wasted. It is dense and slightly list-like rather than fully scannable, which keeps it just under the top mark.
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 no output schema present, the description compensates by describing the return JSON (lesson_id, status, quality_score, quality_notes, redactions_applied, receipt), and it also covers auth, error cases, and persistence side effects. An agent has everything needed to decide to call it and interpret the result.
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 100%, so every one of the 9 parameters is already documented with examples (e.g. 'pip install timeout on corporate proxy', domain enums, 2000-char limit). The description only restates which fields are required vs optional, adding no format or format-syntax detail beyond the schema; baseline 3 applies.
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 opens with a specific verb and resource ('Submit a complete, structured failure lesson') and defines the exact content required (failure→root cause→fix→verification chain). This clearly separates it from read-oriented siblings like misakanet_search and misakanet_get_lesson, and from the distinct write targets misakanet_submit_usage and misakanet_submit_intake.
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 states an explicit trigger condition ('Use after resolving a problem and documenting the full failure→root cause→fix→verification chain'), which is actionable context. It does not name an alternative tool or an explicit when-not-to-use case, so it stops short of the 5 tier.
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.
1 tool update
v3.3.0- Changed
misakanet_submit_intake2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"Type of intake. missing_lesson = no match found; stale_lesson = matched but wrong; new_lesson_candidate = user resolved a new problem."New value: +"Type of intake. missing_lesson = no match found; stale_lesson = matched but wrong; new_lesson_candidate = user resolved a new problem; question = asking for help (opens a [Question] issue, not a lesson candidate); proposal = a plan or product request, explicitly not a failure report (answerable by a decision, never converted into a lesson)." - changed
Input schema / properties / kind / enumPrevious value: -[ - "missing_lesson", - "stale_lesson", - "new_lesson_candidate" -]New value: +[ + "missing_lesson", + "stale_lesson", + "new_lesson_candidate", + "question", + "proposal" +]
2 tool updates
v2.43.0- Changed
misakanet_me_events2 fields changed- removed
Input schema / minPropertiesRemoved value: -1 - added
Input schema / oneOfAdded value: +[ + { + "required": [ + "lesson_id" + ] + }, + { + "required": [ + "lesson_path" + ] + }, + { + "required": [ + "lesson_id", + "lesson_path" + ] + } +]
- Added
misakanet_me_inbox
1 tool update
v2.40.0- Added
misakanet_me_events
1 tool update
v2.31.1- Changed
misakanet_memory_context3 fields changed- changed
Input schema / properties / domain / descriptionPrevious value: -"Optional domain filter (e.g. 'search-and-retrieval', 'ci-cd')."New value: +"Optional hard filter on the lesson's frontmatter domain, from a closed vocabulary (e.g. 'rag', 'devops', 'fanuc', 'python', 'ci', 'mcp'). It narrows and never widens: an unknown value yields zero lessons without an error, so omit it when unsure." - changed
Input schema / properties / task / descriptionPrevious value: -"Task description (e.g. 'set up ChromaDB RAG pipeline', 'deploy FastAPI to production')."New value: +"What you are about to do, in the vocabulary of the tools, systems and errors involved (e.g. 'set up a ChromaDB RAG pipeline on WSL', 'deploy FastAPI behind a corporate proxy'). Matched lexically, so include the distinctive terms a lesson would use in its title or problem statement." - changed
Input schema / properties / top_n / descriptionPrevious value: -"Number of lessons to retrieve (default 5, max 10)."New value: +"How many lessons to return (default 5). Values above 10 are accepted and silently clamped to 10. Each returned lesson is truncated to 200 characters per field in context_block, so ~5 is where extra matches start costing more prompt budget than they add."
1 tool update
v2.30.2- Changed
misakanet_register1 field changed- added
Input schema / properties / client_idAdded value: +{ + "description": "Optional stable identifier for this client (8-64 chars of A-Z a-z 0-9 . _ : -). Generate it once and reuse it so later calls return the same node instead of a new one.", + "type": "string" +}
TDQS
Scored across 11 tools
Three tools (misakanet_search, misakanet_memory_context, misakanet_preflight) all match a text query against the same lesson corpus, and choosing between them depends on subtle timing cues ('before a task' vs 'after an error appears' vs 'before a risky operation') rather than distinct resources. The verbose descriptions do explicitly steer usage, which rescues the set from worse confusion, but an agent can plausibly pick memory_context where preflight was intended. The remaining tools (write/submit/register/quota/inbox/evidence) are cleanly separable.
There is a consistent misakanet_ prefix and snake_case throughout, but the second segment mixes conventions: verb_noun (search, get_lesson, submit_intake, write_lesson, submit_usage), bare noun phrases (preflight, usage_status, memory_context), and an odd 'me_' family (me_events, me_inbox). The description itself admits me_events is a backward-compatibility alias for a semantic get_my_events, confirming the inconsistency. Still readable and greppable, but not a predictable pattern.
Eleven tools sit squarely in the well-scoped range and each covers a distinct lifecycle stage: discovery, retrieval, proactive warning, write/intake, feedback, evidence, quota, registration, and inbox polling. No tool looks like dead weight or a duplicate of another.
The lifecycle is broadly covered — read, active-memory injection, preflight risk, contribution (intake and full lesson), feedback, evidence, identity/quota, and inbox polling — with no obvious dead ends for the primary search-and-contribute workflow. Minor gaps remain: there is no polling path for a submitted lesson_id (me_inbox only accepts intake_id or dedup_key), and no update/retract operation for an existing lesson.
Maintenance
Related MCP Connectors
Never let your agent repeat a bug or linger on a known issue. Search 385+ failure lessons to skip known errors instantly.
Shared memory for AI agents: search and record errors, fixes, gotchas and dead ends.
Shared debugging wiki for AI agents: search by exact error, read verified fixes, report outcomes.
Shared debugging memory for AI coding agents
Related MCP Servers
- AlicenseAqualityCmaintenanceAutomatically provides AI agents with proven instructions and past failure warnings for common tasks like deployment, auth, and payments, enabling flawless execution without manual configuration.1030 npm3MIT
- AlicenseCqualityCmaintenanceLocal-first error memory for AI coding agents, enabling them to search past fixes before attempting new repairs and save verified cases as Markdown.3MIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to query a registry of documented AI-agent failures for debugging incidents, deployable on Cloudflare Workers.1MIT
- AlicenseAqualityAmaintenanceEnables AI agents to query live, cross-agent tool failure fingerprints and recovery outcomes before retrying, so they can act on collective evidence and avoid repeating proven-ineffective retries.42MIT