Muninn by Bizat
Server Details
The memory that doesn't belong to the model. One memory store that carries long, cumulative work across chats and AI tools: Claude, ChatGPT and any MCP client that signs in with OAuth. It holds tagged memories, ordered folders for books and projects, artifacts, tables, tasks, photos and reusable skills, and finds them by meaning or by tag. Your AI reads it and writes to it. Muninn never rewrites it behind you. Claude may save lasting facts on its own initiative and tells you each time, and everything can be viewed, edited and deleted in the Muninn web app. Memories are encrypted at rest under a key for each account. Free for up to 150 items. Paid is $8 a month and adds unlimited items, team sharing and a copy in your own Google Drive.
- Status
- Healthy
- Uptime
- 98.9% over 16 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 91 tools
With 91 tools, each tool has a distinct domain and action, and descriptions clearly differentiate most purposes. Some overlap exists among memory retrieval tools (list, search, query, tag variants) and text-editing tools (append, anchor_replace, update), but boundaries are documented. Minor confusion is possible between artifact/memory and task/memory CRUD, though the set is mostly distinct.
All tools use a consistent muninn_ prefix and snake_case with a domain_action structure (memory_add, table_publish, team_create). Rare variations like app_link and session_boot are still readable and predictable. Naming is highly consistent throughout.
91 tools far exceeds the well-scoped 3-15 range and the heavy 16-25 band, making it an extreme surface for an agent to navigate reliably. Although the platform is broad, many tools could be consolidated or parameterized. This count is a severe mismatch for practical tool selection.
The surface covers CRUD and lifecycle operations for memories, artifacts, bundles, tables, tasks, teams, skills, pictures, and mirrors, plus settings, stats, onboarding, and help. Minor gaps exist (e.g., no mirror disconnect, no explicit table record update/delete, no team rename), but documented workarounds exist. Overall coverage is very strong.
Available Tools
91 toolsmuninn_app_linkAInspect
Get a link to open Muninn in the browser: a one-time sign-in link to the Muninn web app and dashboard (Memory Map, tasks, tables, artifacts, settings) that logs the user in without a password. Use it when the user asks for the Muninn link, the app link, a login or sign-in link, or to open, see or log into Muninn. The link works once and expires after 10 minutes. Give it to the user as a clickable link, tell them it works once within 10 minutes, and do not save it to memory or repeat it later; if it has expired, call this tool again for a new one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safe/mutating profile (readOnlyHint=false, idempotentHint=false); the description adds the critical behavioral facts beyond them: single-use, 10-minute expiry, and the instruction not to persist or repeat the link. It also tells the agent how to present it (clickable) — well beyond structured fields.
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 triggers, then behavior. The closing sentence is a multi-clause instruction list that is slightly dense but each clause (works once, 10-minute expiry, don't save/repeat, re-call if expired) carries distinct operational value.
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 and no parameters, the description fully covers what is returned (a clickable sign-in link), its lifecycle (one use, 10 minutes), and handling on expiry. An agent has everything needed to call and use 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?
Zero parameters, so there is nothing to document and the baseline of 4 applies. The schema description coverage is trivially 100% for an empty object.
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 ('Get a link to open Muninn in the browser') and immediately qualifies it as a one-time passwordless sign-in link to the web app/dashboard. None of the ~80 sibling tools do this, so it is unambiguously 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?
Explicitly enumerates trigger phrases ('Muninn link', 'app link', 'login or sign-in link', 'open, see or log into Muninn') and closes the loop on the alternative action when expired ('call this tool again for a new one'). Nothing 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.
muninn_artifact_addAInspect
Store a text-based artifact you generated — markdown, plain text, csv, json, code, a mermaid diagram, svg, or an HTML page — so it outlives this session and can be retrieved by any model or from the web app. Use this for OUTPUT you produced (a document, a table, a diagram, a page), not for notes or facts about the user; those are muninn_memory_add. The source is stored in full, never a link. Artifacts are deliberately excluded from semantic search, so give a clear title and tags — that is how they are found again. Returns {success, memoryId, format, url, length, connect}. For html/svg: runs in a sandboxed iframe on a separate origin. LINKS: write a plain absolute — a Muninn page opens in the same tab, anything else in a new tab; no target attribute needed. READING ANOTHER ARTIFACT: fetch its absolute /raw url. READING AN OUTSIDE API: the sandbox blocks fetch() to any non-Muninn host unless the artifact declares it in connect (bare hostnames, e.g. ["api.open-meteo.com"]) — readers are shown the list, and the host must answer Access-Control-Allow-Origin: *. Full rules: muninn_help, section "Authoring artifacts". TO EDIT ONE LATER there is no muninn_artifact_update — an artifact's artifactId IS its memoryId, so redraft it with muninn_memory_update (whole body), muninn_memory_anchor_replace (one span) or muninn_memory_append. Editing replaces in place, and a published artifact's public link refreshes automatically. The supported formats and the mime value for each are listed in the mime parameter below and in muninn_help. HANDLES: an account can hold several handles (e.g. a personal one and a company one), each a separate public address; an artifact lives under exactly one, and its named page only ever answers there. Pass handle only when the user says which one; omit it and the artifact goes under their default (oldest) handle. Move it later with muninn_artifact_move.
| Name | Required | Description | Default |
|---|---|---|---|
| mime | No | The artifact's media type, from the closed list. Sets the file extension on download and nothing else — a mermaid source is text/vnd.mermaid so it exports as .mmd, not .txt. Defaults to text/html. | |
| tags | No | Tags, same as muninn_memory_add. The main way an artifact is found later. | |
| title | No | Display name for the artifact, e.g. 'BUI org chart'. Strongly recommended: artifacts are not semantically searchable, so the title carries the findability. | |
| format | Yes | What kind of source this is — selects the renderer. md, txt, csv, json, code, mermaid, svg, or html. | |
| handle | No | Which of the user's handles this artifact lives under, e.g. 'chai' — only if the user named one. Must be a handle this account holds; any other is refused and nothing is saved. Omit for the default (oldest) handle. Does NOT publish anything. | |
| source | Yes | The artifact's full source text, stored verbatim. | |
| connect | No | html/svg only: outside hosts this artifact fetches data from at runtime, as bare lowercase hostnames — ["api.open-meteo.com"]. No scheme, path, port, wildcard or IP; at most 8; Muninn's own hosts are already reachable and are refused here. Declare exactly what the source calls: the sandbox blocks fetch() to any host not listed, and every page that shows the artifact names this list to the reader. Not needed for <script src>, images, fonts or styles from a CDN. Change it later with muninn_artifact_connect. | |
| project | No | Project slug to scope this artifact. Omit for user-global. | |
| sourceModel | No | Which model produced this, for provenance, e.g. 'claude-opus-5'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnly=false, destructive=false, non-idempotent, openWorld=false; the description adds a great deal beyond that: source stored in full never a link, artifacts deliberately excluded from semantic search, the return shape {success, memoryId, format, url, length, connect}, sandboxed iframe on a separate origin, the connect/CORS gating rule for fetch(), and that editing replaces in place with the public link refreshing automatically.
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 sibling contrast, and the sectioned structure (LINKS / READING / EDITING / HANDLES) makes it scannable. It is long, however, and partially duplicates schema content — the mime enumeration and connect constraints are restated from parameter descriptions — which costs a point.
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 9-parameter write tool with no output schema, the description covers the return shape, the edit lifecycle, handle scoping, sandbox/link behavior, and routes to muninn_help for full rules. Nothing an agent needs in order 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 100% and the schema descriptions are already detailed, so the baseline is 3; the description nonetheless adds the rationale that makes parameter choices meaningful ('artifacts are deliberately excluded from semantic search, so give a clear title and tags — that is how they are found again') and explains the default-handle behavior in prose. It does not re-list per-parameter syntax beyond the closed format set, which is already 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+resource ('Store a text-based artifact you generated') and enumerates concrete artifact types (markdown, csv, json, mermaid, svg, html). It explicitly draws the boundary against the nearest sibling: 'not for notes or facts about the user; those are muninn_memory_add.'
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 when-to-use ('OUTPUT you produced'), explicit when-not ('not for notes or facts about the user'), and names alternatives for both the wrong case (muninn_memory_add) and the deferred case (muninn_memory_update / muninn_memory_anchor_replace / muninn_memory_append since there is no update tool). Handle selection is also conditioned: 'Pass handle only when the user says which one.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_artifact_connectADestructiveIdempotentInspect
Declare, change or clear the outside hosts an html/svg artifact may fetch data from at runtime — use when a dashboard or chart reads an external API (weather, prices, a public dataset), when the user says let it load live data from X, or when muninn_artifact_add warned that the source fetches a host connect does not declare. The sandbox blocks fetch() and WebSocket to any host not on this list; Muninn's own hosts are always reachable and are refused here. Bare lowercase hostnames only (api.open-meteo.com), no scheme, path, port, wildcard or IP, at most 8. ⚠️ Every page that shows the artifact names this list to the reader, so declare exactly what the source calls and nothing more. The host must answer Access-Control-Allow-Origin: * (the frame's origin is null and can carry no credential) — if it does not, or needs a key, mirror the data into a Muninn json/csv artifact and fetch its /raw instead; never put a key in artifact source, every reader can read it at /raw. Replaces the whole list; pass [] or null to clear it. A published artifact's public copy is updated in the same call. Not needed for , images, fonts or styles from a CDN. Returns {success, artifactId, connect}.
| Name | Required | Description | Default |
|---|---|---|---|
| connect | Yes | The complete new list of bare hostnames, e.g. ["api.open-meteo.com", "api.coingecko.com"]. Replaces the current list. [] or null clears it, returning the artifact to Muninn-only fetches. | |
| artifactId | Yes | The artifact's memory ID (full UUID or a unique prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (destructiveHint=true, idempotentHint=true, openWorldHint=true), and the description adds substantial context beyond them: the sandbox blocks fetch()/WebSocket for undeclared hosts, Muninn's own hosts are refused here, the whole list is replaced, and a published artifact's public copy updates in the same call. It also surfaces two non-obvious consequences an agent could not infer — the list is shown to every reader of the page, and the host must answer Access-Control-Allow-Origin: * because the frame origin is null.
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 and the primary use case, then layers constraints and warnings in descending priority. It is a single dense paragraph running long, and the CORS/key-mirror digression could be split or trimmed, but nearly every clause carries actionable information and nothing is 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?
Even with no output schema, the description names the return shape ({success, artifactId, connect}) and covers hostname format, count limit, clearing behavior, public-copy propagation, and failure fallbacks. An agent has everything needed to call this correctly on the first attempt without discovering the sandbox rules by error.
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, but the description contributes real constraints the schema does not encode: bare lowercase hostnames only, no scheme, path, port, wildcard or IP, and a security rationale for declaring 'exactly what the source calls and nothing more.' It also restates the [] / null clearing semantics with the consequence ('returning the artifact to Muninn-only fetches').
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 precise verb triple and resource: 'Declare, change or clear the outside hosts an html/svg artifact may fetch data from at runtime.' This is unmistakably distinct from siblings like muninn_artifact_add, muninn_artifact_publish, or muninn_mirror_connect, and names its own scope (runtime fetch allowlist) rather than a generic artifact edit.
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 three concrete triggers (a dashboard/chart reading an external API, the user saying 'let it load live data from X', or muninn_artifact_add warning that a host is undeclared) and an explicit exclusion ('Not needed for <script src>, images, fonts or styles from a CDN'). It also routes to an alternative (mirror the data into a Muninn json/csv artifact and fetch /raw) when CORS or a key blocks direct fetching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_artifact_getARead-onlyIdempotentInspect
Retrieve a stored artifact by ID — returns its full source plus format, title, provenance, and whether it is currently shared publicly (published + publicUrl, plus expiresAt/expired when the link has an expiry), so you can continue working on something a previous session (or a different model) produced. To WRITE your edit back, pass this artifactId as memoryId to muninn_memory_update, muninn_memory_anchor_replace or muninn_memory_append — there is no muninn_artifact_update, because an artifact's artifactId IS its memoryId. If it is published, the public link refreshes automatically. The returned rev is the body's revision number (null if never indexed): hand it back as expectedRev on that write and it FAILS rather than clobbering an edit made in between — worth carrying when you fetch now and write later, unnecessary when you write straight away.
| Name | Required | Description | Default |
|---|---|---|---|
| artifactId | Yes | The artifact's memory ID (full UUID or a unique prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses the returned payload (source, format, title, provenance, published/publicUrl, expiresAt/expired), that a published link auto-refreshes, and that `rev` must be returned as `expectedRev` on later writes or the write FAILS rather than clobbering a concurrent edit. The conflict-detection semantics are the kind of trait annotations cannot express.
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 return contents, then the write-back routing, then the rev/expectedRev caveat. The final sentence is long and dense, and a few clauses (e.g. the parenthetical field list) border on enumeration for its own sake, but every sentence carries actionable 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?
With no output schema, the description must carry return-value disclosure, and it does, enumerating the fields returned and the conditional publish/expiry fields. Combined with the write-path and revision guidance, nothing an agent needs to call this 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 100% so the baseline is 3, but the description adds cross-tool meaning the schema cannot: the artifactId IS the memoryId, so the same value is what you pass to the memory write tools. That reframes the single parameter usefully, exceeding the schema's 'full UUID or unique prefix' note.
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 ('Retrieve a stored artifact by ID') and immediately distinguishes itself from siblings like muninn_artifact_list by scoping to a single artifact, and clarifies the artifactId/memoryId identity that separates it from muninn_memory_get. An agent can route correctly without opening a 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 context ('continue working on something a previous session... produced') and, more valuably, routes writes to muninn_memory_update / muninn_memory_anchor_replace / muninn_memory_append while stating there is no muninn_artifact_update. It stops short of saying when to prefer this over muninn_memory_get, which retrieves by the same identifier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_artifact_listARead-onlyIdempotentInspect
List stored artifacts, newest first, optionally narrowed to one format or one handle. Returns slim rows {artifactId, format, title, handle, createdAt, url, published, publicUrl, expiresAt?} — no source bodies, so it is cheap to call before deciding what to fetch. Backed by a D1 index, never a KV scan. Use this to see what you have already made for this user, or to answer 'what have I shared publicly' — every published artifact carries its live public link, and its expiresAt when it has one. A link past its expiry is reported as published: false, expired: true. To edit any row, pass its artifactId as memoryId to muninn_memory_update — there is no muninn_artifact_update. Also returns handles, every handle the account can use, so you know the valid values for handle on muninn_artifact_add and muninn_artifact_move.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return. | |
| format | No | Restrict to one format, e.g. 'mermaid'. | |
| handle | No | Restrict to artifacts under one of the user's handles, e.g. 'chai'. Must be a handle this account holds. | |
| publishedOnly | No | Return only artifacts that are currently shared publicly. Use this to answer 'what of mine is publicly reachable'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive/idempotent, but the description adds substantial behavior beyond them: backed by a D1 index rather than a KV scan, returns slim rows without source bodies, and reports expired links as published:false, expired:true. It also discloses that it returns a `handles` list, which is non-obvious side output.
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 long but front-loads the core capability, then layers return shape, performance rationale, use cases, and cross-tool routing with no filler. Every sentence carries distinct information an agent needs.
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 fully specifies the returned row fields, the optional expiresAt, the derived expired state, and the extra `handles` collection. Nothing an agent needs to call or interpret this tool 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, but the description adds meaning beyond the schema by explaining that the returned `handles` array supplies the valid values for the `handle` parameter and that a link past expiry surfaces as published:false/expired:true. This goes past restating schema 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?
States a specific verb (List) and resource (stored artifacts) with ordering (newest first) and scope (optionally one format or one handle). It also implicitly distinguishes itself from muninn_artifact_get by noting it is 'cheap to call before deciding what to fetch' since it returns no source bodies.
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 cases are given: 'see what you have already made for this user' and 'answer what have I shared publicly.' It also routes editing away from a non-existent sibling by stating 'To edit any row, pass its artifactId as memoryId to muninn_memory_update — there is no muninn_artifact_update.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_artifact_moveADestructiveIdempotentInspect
Move an artifact to another of the user's handles — use when the user says move this to my company handle, put that under chai, this belongs on the other address, or file it under a different handle. An account can hold several handles, each a separate public address, and an artifact lives under exactly one. The target must be a handle this account holds; any other is refused and nothing changes. ⚠️ If the artifact has a named page, its OLD named address (old-handle.munn.is/name) stops working immediately and does NOT redirect; the page answers at the new handle instead. Tell the user, since links they shared on the old address will break. The munn.is/a/ link is unaffected. If the target handle already has a page with that name the move is refused; pass name to move it under a different name (a new name needs the Paid plan). An artifact under a suspended handle cannot be moved. Does not publish or unpublish anything. Returns {success, artifactId, handle, moved, slug, namedUrl, durableUrl, previousNamedUrl}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only for a named page: the name to use under the new handle, when its current name is already taken there or the user wants a different one. Omit to keep the current name. | |
| handle | Yes | The handle to move it under, e.g. 'chai'. Must be one this account holds — muninn_artifact_list returns the list. | |
| artifactId | Yes | The artifact's memory ID (full UUID or a unique prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/idempotent annotations by naming exactly what breaks: the old named address stops working immediately with no redirect, shared links break, while the token link is unaffected. It also discloses refusal semantics (target name collision, non-owned handle = nothing changes) and the full 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 purpose and trigger phrases, then the critical breaking-change warning is visually flagged so it is not lost. The opening sentence's four paraphrased user quotes are slightly redundant, but the overall length is earned by the number of refusal and side-effect rules.
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 destructive, open-world mutation with no output schema, the description covers prerequisites (owned handle, not suspended), failure modes, irreversible side effects, and even enumerates the returned fields — nothing an agent needs to call it safely 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, but the description adds meaning the schema does not: a new `name` requires the Paid plan, and an omitted `name` silently keeps the current name while a collision causes refusal. The `handle` constraint (must be owned, list via muninn_artifact_list) is largely mirrored from 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 and resource ('Move an artifact to another of the user's handles') and pins the domain model ('an artifact lives under exactly one handle'), which cleanly separates it from siblings like muninn_artifact_name, muninn_artifact_publish, or muninn_bundle_edge_move.
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 user phrasings that should trigger it ('move this to my company handle', 'file it under a different handle') and explicit when-not conditions: the target must be a held handle, suspended-handle artifacts cannot move, and it 'Does not publish or unpublish anything' — routing the agent away from publish/unpublish siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_artifact_nameADestructiveIdempotentInspect
Give a published artifact a readable address under the handle it lives in, rename it, or remove the name — use when the user says name this page, give it a nicer url, rename that link, change the address, or make the link readable. Turns a long token url into something like chai.munn.is/my-notes, plus a durable twin on muninn.bizat.co that keeps working if the short domain ever changes. The artifact must already be published (muninn_artifact_publish); naming does not publish anything and does not change who can read it. Pass name: null to remove the name — that address stops working immediately, while the token link keeps working. Names are unique per handle, so the same name can exist under two of the user's handles. To change WHICH handle the page is under, use muninn_artifact_move. Plan: giving a page a new or changed name is Paid; removing a name, re-applying the same name, and already-named pages continuing to serve work on every plan, as does the munn.is/a/ link. Returns {success, artifactId, handle, slug, namedUrl, durableUrl}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name, e.g. 'my-notes' — letters, numbers and hyphens, no dots or slashes, unique among the named pages under this artifact's handle. A new or changed name needs the Paid plan. Pass null to remove the current name (free). | |
| artifactId | Yes | The artifact's memory ID (full UUID or a unique prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them: naming does not publish and does not change read access, name:null makes the address stop working immediately while the token link survives, names are unique per handle, and a durable twin on muninn.bizat.co is created. Plan behavior (Paid for new/changed names, free for removal/re-apply) is also disclosed. This is exactly the additional context annotations cannot carry.
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 trigger phrases and the core operation, then layers on constraints, the Plan section, and the return shape. Efficient for its density, though there is minor redundancy between the 'durable twin' sentence and the returned durableUrl field.
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, but the description enumerates the return shape ({success, artifactId, handle, slug, namedUrl, durableUrl}) and covers preconditions, plan constraints, removal behavior, and the sibling tool for handle changes. 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 100%, so both parameters are already documented, including the null-removal semantics and plan requirement. The description's extra notes (null stops the address immediately, uniqueness is per-handle, the returned slug/namedUrl) add some value but largely restate or extend the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
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: give a published artifact a readable address under its handle, rename it, or remove the name. It explicitly distinguishes itself from muninn_artifact_move ('To change WHICH handle the page is under, use muninn_artifact_move') and muninn_artifact_publish ('The artifact must already be published'), so an agent can route correctly 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 concrete trigger phrases ('name this page', 'give it a nicer url', 'rename that link'), names the alternative tool for the adjacent operation, and states the precondition (must already be published) plus the plan gating for each operation. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_artifact_passwordADestructiveIdempotentInspect
Set, change or remove the password a reader must type to open a published artifact — use when the user says password protect this, put a password on that link, lock this page, change the password, or remove the password. The artifact must already be published (muninn_artifact_publish); the link itself does not change, so anything already shared keeps working and now asks for the password. ⚠️ The password is stored one-way and can NEVER be read back — not by the user, not by support, not by this tool. Say the exact password back to the user when you set it, because this is the only time it is visible; a forgotten one is replaced, not recovered. Pass password: null to remove it and make the link open freely again. Giving two artifacts the SAME password puts them behind one lock, so unlocking either opens both — that is how a locked page can embed another locked page. A different password keeps them separate. This is a gate on the page, not encryption of the artifact. ⚠️ If one artifact fetches another as data, give BOTH the same password (one lock) or leave the data one open — two different passwords means the fetch gets 401. Returns {success, artifactId, hasPassword}.
| Name | Required | Description | Default |
|---|---|---|---|
| password | Yes | The password readers must type, 4-128 characters. Use exactly what the user asked for — never invent one, and never change one without being asked. Pass null to remove the password entirely. | |
| artifactId | Yes | The artifact's memory ID (full UUID or a unique prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses critical behavior: the password is stored one-way and can never be read back, the exact password must be said back to the user because it is only visible once, and forgotten passwords are replaced rather than recovered. It also explains cross-artifact password sharing, the 401 failure mode for data fetches, and clarifies the password is a page gate rather than artifact encryption.
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 action and trigger phrases, and every major warning is relevant. It is somewhat long and repeats the critical 'cannot read back / say it back' point, but the repetition is purposeful for a destructive, irreversible password operation.
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?
Although there is no output schema, the description supplies the return shape {success, artifactId, hasPassword}. It also covers prerequisites, destructive reversibility constraints, password sharing interactions, and fetch failure behavior, which is complete enough 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 100%, so the schema already documents password length, null semantics, and artifactId. The description adds operational meaning beyond the schema by explaining that null removes the password, that identical passwords across artifacts create one shared lock, and that different passwords can cause 401 on cross-artifact data fetches.
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+resource: set/change/remove the password a reader must type to open a published artifact. It distinguishes this from publish behavior by noting the artifact must already be published and by explicitly naming muninn_artifact_publish as the prerequisite.
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 user phrases that should trigger the tool (password protect this, put a password on that link, lock this page, change/remove password) and states the prerequisite that the artifact must already be published. It also explicitly says to pass password: null to remove the password and make the link open freely again.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_artifact_publishADestructiveIdempotentInspect
Share a stored artifact publicly and get back a link anyone can open — use when the user says publish this, share this, make this public, give me a link to send someone, put this on the web, or asks for a URL they can paste into a chat or an email. Returns a short unguessable munn.is link that renders the artifact for anyone holding it: no login, no account, not indexed by search engines. The published copy stays LIVE — later edits to the artifact update what the link serves. Optionally pass name to give the page a readable address under the handle the artifact lives in, e.g. chai.munn.is/my-notes (a new or changed name needs the Paid plan; the munn.is/a/ link is free on every plan). To put it under a different handle, muninn_artifact_move first. Publishing is only ever this tool: never assume an artifact is public, and never publish as part of saving or editing something. Optionally pass expiresAt (ISO 8601 date or datetime) when the user wants the link to stop working after a date — e.g. share this until Friday, expire the link next week, only valid for 7 days. After that moment the link opens for nobody and the publish is removed the first time someone tries it; the artifact itself is kept. Calling publish again on a published artifact keeps its link and lets you change the expiry (pass null to remove it); publishing an expired one mints a new link. muninn_artifact_unpublish revokes the link. Returns {success, artifactId, publicUrl, namedUrl, durableUrl, live, expiresAt}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional readable name for the page, e.g. 'my-notes' — becomes <handle>.munn.is/my-notes, under the handle the artifact lives in. Letters, numbers and hyphens only; no dots or slashes. Unique per handle, not per account. Only gets an address if the artifact is under an active handle. A new or changed name needs the Paid plan; re-applying the page's current name does not. Publishing still succeeds if the name is rejected (taken, invalid, or not on the Paid plan). | |
| password | No | Optional password a reader must type before the page opens. Only pass a password the user actually stated — never invent one, and never set one they did not ask for. It cannot be read back afterwards by anyone, including the user: it can only be replaced or removed with muninn_artifact_password. Tell the user the exact password you set, since this is the only moment it is visible. | |
| expiresAt | No | Optional moment the public link stops opening, ISO 8601: a datetime with offset such as '2026-10-01T17:00:00+07:00', or a bare date '2026-10-01' (read as 00:00 UTC, so the link is already closed on that date). Must be in the future. Only set one the user asked for, and resolve relative phrases ('for a week') against today's date. Omit to keep the current expiry on an already-published artifact; pass null to remove it. The link is refused after this moment and removed from the published list when someone next opens it. | |
| artifactId | Yes | The artifact's memory ID (full UUID or a unique prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/openWorld/idempotent, but the description adds much more: the link stays LIVE and reflects later edits, is unguessable, requires no login, is not search-indexed, and reveals plan gating for named URLs. It also documents re-publish semantics (keeps link, can change expiry, expired publish mints a new link).
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 action and trigger phrases, and every clause carries information. The trigger enumeration and the expiry/idempotency explanation are somewhat verbose, but no sentence 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 mutation tool with no output schema, the description enumerates the return shape ({success, artifactId, publicUrl, namedUrl, durableUrl, live, expiresAt}) and covers plan limits, expiry, revocation, and idempotency. 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 100%, so the baseline is 3. The description reinforces `name` with a concrete example (chai.munn.is/my-notes), states the Paid-plan condition, and clarifies re-publish/expiry behavior, adding routing context (move first for a different handle). It does not surface the `password` parameter at all, so it is not fully additive over 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 and resource ('Share a stored artifact publicly and get back a link anyone can open'), plus the concrete outcome (an unguessable munn.is link). It clearly distinguishes itself from muninn_artifact_unpublish and muninn_artifact_move, 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 explicit trigger phrases ('publish this, share this, make this public'), explicit exclusions ('never assume an artifact is public, and never publish as part of saving or editing'), and routes to the correct siblings: muninn_artifact_move to change handle, muninn_artifact_unpublish to revoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_artifact_unpublishADestructiveIdempotentInspect
Revoke an artifact's public link — use when the user says unpublish, unshare, make this private again, take it down, or stop sharing that link. Deletes the public copy outright, so the URL stops working immediately for everyone who has it; the artifact itself is untouched and stays in Muninn. Any readable name it had goes with it, so the named address stops resolving too. ⚠️ Irreversible for that URL: publishing again mints a NEW link, and every copy of the old one is dead. Safe to call on an artifact that was never published. Returns {success, artifactId, wasPublished}.
| Name | Required | Description | Default |
|---|---|---|---|
| artifactId | Yes | The artifact's memory ID (full UUID or a unique prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them: it explains that only the public copy is deleted while the artifact stays in Muninn, that the URL dies immediately for everyone, that any named address also stops resolving, and that republishing mints a NEW link so the old one is permanently dead. That is exactly the extra context needed before an irreversible action.
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 action and the intent triggers before the consequences, then closes with the return shape. Six short sentences, each carrying distinct information — scope of deletion, side effect on named addresses, irreversibility, safety on the no-op case, response fields — with no 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?
With no output schema present, the description supplies the return shape ({success, artifactId, wasPublished}), and the annotations cover the safety profile. Between them, an agent has everything needed to decide whether to call this and what it will get back.
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% for the single artifactId parameter, which already documents that a full UUID or unique prefix is accepted. The description adds no syntax, format, or naming detail beyond the schema, so the baseline of 3 for fully-covered schemas 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 (revoke/unpublish) on a specific resource (an artifact's public link) and immediately distinguishes it from its sibling muninn_artifact_publish by describing the opposite direction of the operation. An agent can identify the tool from the name plus the first clause alone.
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 list ('unpublish, unshare, make this private again, take it down, stop sharing that link') that maps user phrasing to the tool, and explicitly resolves an edge case — 'Safe to call on an artifact that was never published' — so the agent knows the no-op case is acceptable rather than an error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_closureARead-onlyIdempotentInspect
List everything beneath one item in a bundle (an ordered outline of memories for a book or project): every (ancestor, descendant, depth) pair, including each item paired with itself at depth 0. Useful for checking what a section contains.
| Name | Required | Description | Default |
|---|---|---|---|
| rootKey | Yes | The node_key of the bundle root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuine behavioral value by specifying the exact return shape (every ancestor/descendant/depth pair, including self-pairs at depth 0), which is not in any structured field since no output schema exists.
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 kept to two sentences. The parenthetical definition of a bundle is helpful context; the trailing 'Useful for...' sentence is slightly weaker but not wasteful.
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 usefully explains the closure return format, which is what an agent most needs here. For a single-parameter read tool whose annotations already cover the safety profile, this is nearly complete, minor gap being no explicit sibling routing.
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% and the single parameter rootKey is fully documented as 'the node_key of the bundle root'. The description adds no parameter-level detail beyond the schema, so the 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?
States a specific verb ('List') and resource ('everything beneath one item in a bundle') and clarifies the bundle concept as an ordered outline of memories. It defines the return semantics (ancestor/descendant/depth pairs) precisely, though it doesn't explicitly name a sibling to differentiate from, e.g., muninn_bundle_get or muninn_bundle_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?
'Useful for checking what a section contains' gives an implied use case, but there is no explicit when-to-use guidance and no contrast with alternatives like muninn_bundle_get. The condition selecting this over other bundle reads 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.
muninn_bundle_createAIdempotentInspect
A bundle is an ordered outline of the user's memories for a book or project: sections and items, each item pointing at a memory. This creates a new, empty bundle with a title and description, and returns its rootKey (the key every other bundle tool takes) and the id of the memory holding its title and description. Fails if the slug is already used by one of the user's bundles.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Unique slug for this bundle root (e.g. 'my-book'). Lowercase letters, digits and hyphens only, max 64. Frozen at creation. | |
| title | Yes | Human-readable bundle title | |
| project | No | Project slug to scope the backing metadata memory. Omit for global. | |
| okf_type | No | Type of the root (default 'bundle') | bundle |
| description | No | High-level description or thesis |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description discloses two valuable behaviors: it returns the rootKey and the id of the memory holding title/description, and it fails if the slug is already in use. There is a mild tension between idempotentHint=true and the stated failure-on-duplicate behavior, but this is not a direct contradiction.
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 concept definition before the action and return values. Every sentence carries information, though the opening conceptual framing is slightly longer than strictly needed for a caller already familiar with bundles.
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 usefully explains the return values (rootKey and title/description memory id) and the duplicate-slug failure mode, which is what an agent needs to chain calls correctly. Minor gap: the project and okf_type parameters are not touched on, though the schema covers them fully.
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 all five parameters are already documented, setting the baseline at 3. The description reinforces that title and description are stored in a backing memory and that slug uniqueness matters, but adds little syntax or format detail beyond 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 description defines what a bundle is (ordered outline of memories: sections and items) and states the specific action: creating a new, empty bundle. It clearly separates this from node-level sibling tools like muninn_bundle_node_create by specifying the bundle is created 'empty' at this stage.
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 establishes the creation context and implicitly positions this as a prerequisite by noting the returned rootKey is 'the key every other bundle tool takes.' However, it does not explicitly name alternatives or state when not to create a bundle, so guidance stops short of the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_decision_addAInspect
Record a decision about a bundle (an ordered outline of memories for a book or project) and attach it to the item or section it governs, so the reason for a title, a placement or an order shows up wherever that item renders. Saves a memory tagged 'decision' with {question, chosen, rejected[], reason, decided_by, date} and links it to the item. Use it for structural choices made in conversation that would otherwise be forgotten and argued again.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO date the decision was made. Defaults to now. | |
| slug | No | Slug for the decision leaf among the node's references. Default 'decision'. | decision |
| chosen | Yes | What was decided, e.g. 'At the back, after the last chapter' | |
| reason | Yes | Why this was chosen | |
| nodeKey | Yes | node_key of the node this decision governs (the chapter/section/leaf it explains) | |
| project | No | Project slug to scope the decision memory. Omit for global. | |
| question | Yes | The decision being recorded, e.g. 'Should the glossary go at the front or the back?' | |
| rejected | No | Alternatives considered and rejected | |
| decided_by | No | Who decided (e.g. 'the user', or a person's name). Omit if not attributed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (not read-only, not idempotent, not destructive). The description adds real behavioral context beyond that: it discloses the persisted shape ({question, chosen, rejected[], reason, decided_by, date}), the 'decision' tag, and the link/rendering behavior. It does not warn that repeated calls are non-idempotent (duplicate decisions), which would have earned 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?
Two sentences, purpose front-loaded, no filler. The second sentence carries dense but useful information (storage shape, linking, use case). Marginally long, but every clause 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?
No output schema exists, and the description states what gets persisted and linked, which is sufficient to call it correctly. For a non-idempotent mutation it could note that each call creates a new stored decision, but overall it is complete for the tool's complexity.
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 the baseline is 3. The description adds meaning by grouping the parameters into a coherent decision record ({question, chosen, rejected[], reason, decided_by, date}), letting an agent see how the fields relate rather than viewing nine isolated params.
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?
Specific verb+resource: 'Record a decision about a bundle' and it immediately defines the domain concept ('an ordered outline of memories') and the effect (attaches the reason to the governed item so it renders wherever that item does). An agent can tell this apart from generic memory tools. It stops short of naming the closest sibling (muninn_memory_add) as the thing it is not, so it is not 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?
'Use it for structural choices made in conversation that would otherwise be forgotten and argued again' gives a clear, concrete trigger condition. There is no explicit when-not clause or named alternative, so it falls short of the 5 bar that names an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_edge_addAIdempotentInspect
Link two items in a bundle (an ordered outline of memories for a book or project), placing the child under the parent. relation='contains' (default) makes this the child's one home in the outline; an item can have only one, and a second is refused with a clear error. relation='reference' links it from an additional place without moving it.
| Name | Required | Description | Default |
|---|---|---|---|
| childKey | Yes | The node_key of the child node | |
| position | No | Explicit REAL position. If omitted, appended after existing siblings. | |
| relation | No | 'contains' = canonical home (one per node). 'reference' = additional link with no path. | contains |
| parentKey | Yes | The node_key of the parent node |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes meaningfully beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) by disclosing the one-home invariant, the refusal-with-error behavior on a second 'contains', and that 'reference' does not move the item. It stops short of describing return value or how position interacts with existing 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?
Three sentences, front-loaded with the core action before the relation nuances. Dense but each sentence carries information; only the parenthetical definition of a bundle is arguably surplus.
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 annotations and no output schema, the description covers the essential invariants and error behavior. Missing details are minor: return shape and how explicit positions order against existing 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 coverage is 100%, so the schema already documents all four parameters, including the same relation semantics and the position default. The description's relation explanation adds only marginal value beyond the schema, and position is not elaborated at all. Baseline 3 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?
States a specific verb+resource ('Link two items in a bundle') and clarifies the resulting structure ('placing the child under the parent'), even defining what a bundle is. It distinguishes the two relation modes clearly enough that an agent knows exactly what operation it is invoking.
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 guidance on choosing between relation='contains' and relation='reference', including the consequence of each. It does not, however, say when to prefer this tool over siblings like muninn_bundle_edge_move or muninn_bundle_edge_remove, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_edge_moveAIdempotentInspect
Reorder an item among its siblings in a bundle (an ordered outline of memories for a book or project). Give beforeKey (the sibling that will come before it) and/or afterKey (the sibling that will come after it). null beforeKey moves it to the front; null afterKey moves it to the end; both null appends it at the end.
| Name | Required | Description | Default |
|---|---|---|---|
| afterKey | No | Sibling node_key that will come AFTER the moved child, or null for 'move to end' | |
| childKey | Yes | The node_key of the child to reposition | |
| beforeKey | No | Sibling node_key that will come BEFORE the moved child, or null for 'move to front' | |
| parentKey | Yes | The node_key of the parent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the mutation/safety profile is covered. The description adds the reordering effect and positional outcomes, but says nothing about permissions, what happens to existing edges, or error behavior for an invalid sibling key.
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 operation before the parameter mechanics, and every sentence carries meaning. Slightly dense with repeated key terminology, but no wasted 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 focused, idempotent mutation with full schema coverage and an annotation-declared safety profile, the description supplies enough to invoke it correctly. Only edge cases (invalid sibling, cross-parent moves) remain unaddressed.
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 all four parameters are already documented with the same before/after semantics. The description largely restates this and only adds the combined case ('both null appends at the end'), which is one genuine increment over 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 (Reorder) and resource (an item among its siblings in a bundle) and disambiguates 'bundle' with a parenthetical definition. An agent can distinguish this from muninn_bundle_edge_add/remove and muninn_artifact_move 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 explains the semantics of beforeKey/afterKey, which implies when to use the tool, but never explicitly contrasts it with sibling reorder/edge tools such as muninn_bundle_edge_add or muninn_artifact_move, nor does it state prerequisites or failure conditions. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_edge_removeADestructiveIdempotentInspect
Unlink an item from its parent in a bundle (an ordered outline of memories for a book or project). Neither item is deleted, only the link between them. An item left with no home becomes a top-level item of its own.
| Name | Required | Description | Default |
|---|---|---|---|
| childKey | Yes | The node_key of the child to unlink | |
| parentKey | Yes | The node_key of the parent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely useful blast-radius context beyond that: nothing is destroyed except the link, and an orphaned child is promoted to a top-level item — a non-obvious post-condition that prevents an agent from assuming data loss.
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 short sentences, front-loaded with the action, then the non-destructive guarantee, then the edge-case outcome. No filler and nothing redundant with the schema or 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?
There is no output schema, and the description supplies the key return-relevant fact (child becomes top-level if left homeless), which is what an agent most needs. Missing only failure behavior for a non-existent edge, which is largely covered by the idempotentHint annotation.
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% for both node_key parameters, so the schema already carries the semantics and the baseline is 3. The description implies the parent/child link being removed but adds no format, nesting, or ordering details beyond what the schema states.
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 — 'Unlink an item from its parent in a bundle' — and defines the bundle domain parenthetically as an ordered outline of memories. It also draws the boundary against the neighboring node-deletion tools by asserting 'Neither item is deleted, only the link between them', so an agent can tell it apart from muninn_bundle_node_delete and muninn_bundle_edge_add.
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 context of use is implied by 'unlink an item from its parent', and the clarification about non-deletion steers away from delete tools. However, there is no explicit when-to-use statement and no routing to alternatives such as muninn_bundle_edge_move (reparenting) or muninn_bundle_node_delete for actual removal of an item.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_export_okfARead-onlyIdempotentInspect
Export a bundle (an ordered outline of memories for a book or project) as an OKF v0.1 object, a portable JSON format: the memories in outline order plus a generated table of contents. For a readable document, use muninn_render_bundle.
| Name | Required | Description | Default |
|---|---|---|---|
| rootKey | Yes | The node_key of the bundle root to export |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the shape and ordering of the payload (outline order + generated TOC) in a portable JSON format, which matters because there is no output 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?
Two sentences, zero filler, with the output format defined first and the disambiguation to the sibling placed at the end. Every clause carries 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?
With no output schema, the description does the necessary work of describing the returned object's contents and ordering. Minor gaps remain, such as whether the result is returned inline as JSON or as a downloadable artifact and any size constraints, but the essentials for correct invocation 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 100% and the single rootKey parameter is already documented as 'the node_key of the bundle root to export.' The description adds no format or syntax detail for the parameter, so the 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?
States a specific verb (Export), resource (a bundle), and the concrete output (an OKF v0.1 object, a portable JSON format containing memories in outline order plus a generated table of contents). It also names the sibling it is not (muninn_render_bundle), so an agent can separate it from the render path without opening a 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?
Explicitly routes the agent: 'For a readable document, use muninn_render_bundle,' which gives a clear alternative and the condition that selects it. It does not spell out exclusions or prerequisites (e.g., whether the bundle must exist or be non-empty), so it stops 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.
muninn_bundle_getARead-onlyIdempotentInspect
Look at one bundle (an ordered outline of memories for a book or project): returns its root and the items directly beneath it. Pass resolve:true to include each item's details and a preview of the memory it points at.
| Name | Required | Description | Default |
|---|---|---|---|
| resolve | No | If true, hydrate child node details (slug, type, and a preview of the memory each points at) | |
| rootKey | Yes | The node_key of the bundle root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context the annotations do not: children are returned unresolved by default, and resolve:true triggers hydration plus memory previews, which implies extra cost/depth when enabled.
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 sentences, zero filler, with the core behavior front-loaded and the optional flag described second. The parenthetical definition of a bundle is compact and 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?
With only two params, full schema coverage, rich annotations and no output schema, the description needs to explain the return shape and the default-vs-resolved distinction, which it does. It stops short of describing ordering guarantees or how deep 'directly beneath' goes, a minor gap for an outline 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% and rootKey is already documented as 'the node_key of the bundle root'; the description's resolve explanation largely restates the schema's own 'hydrate child node details (slug, type, and a preview...)' wording. Baseline 3 applies since the schema does the heavy lifting.
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 ('Look at one bundle') and goes further by defining what a bundle is ('an ordered outline of memories for a book or project') and what it returns (root plus items directly beneath). That 'directly beneath' phrasing implicitly separates it from muninn_bundle_closure, but no sibling is named 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?
Usage is implied rather than stated: 'Look at one bundle' plus the resolve:true hint tells an agent how to inspect a single bundle's immediate children, but there is no explicit when-to-use/when-not guidance and no pointer to muninn_bundle_list or muninn_bundle_closure as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_listARead-onlyIdempotentInspect
List the user's bundles (ordered outlines of memories for a book or project). Optionally filter to one project.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Filter roots whose backing metadata memory is scoped to this project. Omit to list all roots. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered elsewhere. The description adds domain meaning for 'bundle' but says nothing about result ordering, pagination, or scale of the listing, which would be 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?
Two compact sentences, no redundancy, with the core action front-loaded and the optional filter trailing. Every phrase 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?
For a simple zero-required-parameter list tool with full schema coverage and annotations covering safety, the definition is nearly sufficient. Only the omission of return shape/pagination context, absent since there is no output schema, keeps it short of full completeness.
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% and the single 'project' parameter is already documented in the schema. The description's 'filter to one project' merely restates that; it adds no syntax or format detail beyond the structured 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 (List) and resource (bundles), and the parenthetical gloss 'ordered outlines of memories for a book or project' tells an agent what a bundle actually is. It is separable from bundle_get/bundle_create by the verb, though it never explicitly contrasts itself with those siblings.
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 only guidance is 'Optionally filter to one project,' which is really parameter behavior rather than when-to-use-this-vs-alternatives context. There is no statement of when to reach for bundle_list versus bundle_get or bundle_closure, so usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_node_createAIdempotentInspect
Add an existing memory to a bundle (an ordered outline of memories for a book or project) as an item under a section, in one call. Use it to place something the user already wrote, such as a chapter's full text or its summary, in the outline so it renders in order. muninn_bundle_create makes a new bundle; this adds content to one. okfType names what the item is: 'text' (full body), 'record' (a summary of a chapter or section), 'package' or 'quotes'. relation defaults to 'contains', the item's one home in the outline; 'reference' links it from a second place as well. Fails if the slug is already used under that section.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Unique slug for the new node (e.g. 'text'). Lowercased, frozen at creation. | |
| memId | Yes | ID of the EXISTING memory this item points at. | |
| okfType | No | What the item is: 'text' (full body), 'record' (a summary of a chapter or section), 'package', 'quotes'. Default 'text'. | text |
| position | No | Explicit REAL position among siblings. Omit to append. | |
| relation | No | 'contains' = canonical home (one per node). 'reference' = additional DAG link. | contains |
| parentKey | Yes | node_key of the parent to attach under |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the description only needs to add context — and it does: it discloses the duplicate-slug failure mode and explains that 'contains' is a single canonical home versus a second 'reference' link. It stops short of describing the response payload or what position/ordering guarantees apply on append.
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 action and scope, and every sentence carries information. It is slightly long and duplicates the okfType and relation explanations that already live in the schema, which is the only 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?
For a mutation with no output schema, the description should say what comes back (presumably the created node or its key) so the agent can chain follow-up calls like node_repoint or render_bundle. Ordering behavior on append ('Omit to append') is left entirely to the schema, and the relationship to muninn_bundle_nodes_create is unaddressed.
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 six parameters, including okfType and relation. The description restates the okfType values and relation semantics but adds no new meaning, and it never mentions position, memId, or parentKey beyond the vague 'under a section'. Baseline 3 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?
States a specific verb and resource ('Add an existing memory to a bundle... as an item under a section') and parenthetically defines what a bundle is. It also explicitly distinguishes itself from muninn_bundle_create, so an agent can separate the two without opening a 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?
'Use it to place something the user already wrote, such as a chapter's full text or its summary' gives a concrete use case, and the sentence contrasting with muninn_bundle_create routes the agent away from the wrong tool. It does not address the near-sibling muninn_bundle_nodes_create (bulk/plural variant), which is the most likely confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_node_deleteADestructiveIdempotentInspect
Remove an item or section from a bundle (an ordered outline of memories for a book or project), together with every link to or from it. Refuses a section that still has items unless cascade=true, which removes the whole section. Never deletes a memory the user wrote: only when deleteBackingMeta=true, and the memory holds nothing but a bundle's or section's title and description, and nothing else points at it, is that memory deleted too. dryRun=true (default) reports what would be removed without writing.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true (default), report what would be deleted without committing. | |
| cascade | No | If true, delete the whole contains-subtree. Required to delete a node that has children. | |
| nodeKey | Yes | node_key of the node to delete | |
| deleteBackingMeta | No | If true, also delete the backing memory IF it is a 'bundle-meta' memory with no other referencing node. Never deletes content memories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and idempotent=true, but the description adds substantial behavioral context beyond them: the cascade refusal rule, the strong 'never deletes a memory the user wrote' guarantee with its three-part precondition for deleteBackingMeta, and the dryRun-by-default safety behavior. That is exactly the kind of context annotations cannot express.
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 clause and every subsequent sentence carries an actual rule rather than filler. It is a single dense paragraph with nested conditions that read a little run-on, but no sentence 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 destructive, no-output-schema tool this covers what an agent needs: what is removed (node plus links), the refusal conditions, the memory-preservation guarantee, and the dryRun default. Nothing material is left unstated.
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 four parameters and the baseline is 3. The description goes further by explaining the interaction semantics: cascade removes 'the whole section,' deleteBackingMeta fires only when the memory holds nothing but a title/description and has no other referrers, and dryRun defaults to a non-committing report.
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 ('Remove an item or section from a bundle') and defines a bundle inline as 'an ordered outline of memories for a book or project,' with the important scope note that all links to/from the node go too. It stops short of naming a sibling alternative (e.g. muninn_bundle_nodes_remove or muninn_memory_delete), so an agent still has to infer the single-vs-multiple split.
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 conditional guidance: it refuses a section that still has items unless cascade=true, and it deletes the backing memory only under three explicit conditions. However it never points to the alternative tool for bulk removals or explains the memory-vs-node deletion boundary against muninn_memory_delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_node_repointADestructiveIdempotentInspect
Point an item in a bundle (an ordered outline of memories for a book or project) at a DIFFERENT memory, keeping its place. Its key, position, links and any items beneath it stay as they are; only the memory it shows changes. Use it when a newer memory replaces the one an item showed; removing and re-adding the item would lose what sits beneath it. newMemId may be a full or short-form (8-char) prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeKey | Yes | node_key of the node to repoint | |
| newMemId | Yes | ID (full or 8-char prefix) of the memory the node should now point at |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the mutation profile is covered. The description adds meaningful semantics beyond that: exactly what is preserved (key, position, links, children) versus what changes (the shown memory), which is the key behavioral fact for this 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?
Three tight sentences, front-loaded with the core action, followed by preservation semantics, usage trigger, and the parameter format note. The parenthetical defining 'bundle' earns its place by grounding the domain term, and nothing is 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?
For a 2-parameter mutation tool with annotations covering safety and no output schema, the description supplies purpose, usage, and preservation behavior. It omits failure/error behavior and permission requirements, but the annotations and simplicity of the tool make those minor gaps.
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% and both parameters are documented there. The description's note that newMemId accepts a full or 8-char prefix merely restates the schema's own description, so it adds no information beyond structured data. Baseline 3 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?
States a specific verb (repoint) and resource (an item/node in a bundle), and defines what a bundle is in-line. It clearly delineates the operation from siblings like muninn_bundle_node_delete and muninn_bundle_node_create by specifying that key, position, links and children are preserved and only the pointed-to memory changes.
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 when-to-use trigger ('when a newer memory replaces the one an item showed') and names the competing approach (removing and re-adding the item) along with its downside. It stops short of naming a specific sibling tool as the alternative, but the routing condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_node_reslugADestructiveIdempotentInspect
Rename one item or section in a bundle (an ordered outline of memories for a book or project) by changing its slug. Everything else stays: its key, position, links and the memory it points at. The rendered document does not change, because headings come from the memory, not the slug; only exported file names change. Fails if another item already uses the new slug. dryRun=true (default) reports the change without writing.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true (default), report what would change without committing. | |
| newSlug | Yes | The new slug. Lowercased. Lowercase letters, digits and hyphens only, max 64; 'memories', 'index' and 'manifest' are reserved. Must be unique among your bundle nodes. | |
| nodeKey | Yes | node_key of the node to reslug (any node, not just a root) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=true), the description adds substantive behavioral context: exactly what is preserved (key, position, links, target memory), the surprising fact that rendered documents are unaffected while exported file names change, the failure mode on slug collision, and the default dryRun safety behavior. This is precisely the kind of side-effect disclosure a mutation tool 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?
Purpose is front-loaded in the first clause, followed by preservation semantics, side effects, failure mode and the dryRun caveat in a logical order. Every sentence carries distinct information with no 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 mutation tool with no output schema, the description covers behavior, side effects, failure conditions and the dry-run option, and the annotations cover the safety profile. The only minor gap is that it does not describe what the tool reports back (e.g. the shape of the dryRun/commit result), but overall it is complete enough to invoke 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 100%, so nodeKey, newSlug and dryRun are already fully documented in the schema (including slug rules and the uniqueness requirement). The description reinforces the duplicate-slug failure and the dryRun default but adds little syntax or format information beyond what the schema already provides, 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 (rename/reslug) and resource (one item or section in a bundle), and defines what a bundle is ('an ordered outline of memories for a book or project'). It is clearly distinguishable from siblings like muninn_bundle_node_repoint or muninn_bundle_node_delete, and it explains precisely which attribute is being changed (the slug).
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 intended use case clear (changing a node's slug) and implicitly differentiates from muninn_bundle_node_repoint by stating 'the memory it points at' stays the same. It also documents the failure condition (duplicate slug) and the dryRun default, giving the agent enough context to call it safely, though it does not explicitly name an alternative tool to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_nodes_createAIdempotentInspect
Add MANY existing memories to a bundle (an ordered outline of memories for a book or project) under ONE section in a single call, instead of one muninn_bundle_node_create per item. All-or-nothing: the batch is checked first (the section exists; each slug is free under it and unique within the batch), then applied; any clash aborts the whole batch and names the item, and a failure part-way undoes every item added in this call. memIds may be full or short-form (8-char) prefixes.
| Name | Required | Description | Default |
|---|---|---|---|
| children | Yes | The children to attach, in order | |
| parentKey | Yes | node_key of the parent to attach all children under |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) by disclosing transactional semantics: all-or-nothing validation (section exists, each slug free and unique within the batch), abort-on-clash that names the failing item, and mid-batch rollback. This is exactly the kind of behavioral context annotations cannot convey.
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 in the first clause, then layers on transaction semantics and the memId format note. Dense but every sentence carries useful information; slightly long for a two-parameter tool, though nothing is 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?
With no output schema, the description carries return-value opacity, but for a batch attach tool the important call-time concerns (validation order, abort behavior, rollback, id format) are all covered. The only minor gap is not describing what a successful call returns.
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 parentKey and every children field. The description adds marginal value by noting memIds accept full or short-form prefixes and by restating the batch-uniqueness of slugs, but this largely duplicates the schema. Baseline 3 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?
States a specific verb and resource ('Add MANY existing memories to a bundle under ONE section in a single call') and immediately distinguishes itself from the sibling muninn_bundle_node_create by framing itself as the batch alternative. An agent can tell exactly what this does 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?
Names the alternative explicitly ('instead of one muninn_bundle_node_create per item'), which gives clear selection context. No explicit when-not condition is stated, but the batch framing makes the intended usage unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_nodes_removeADestructiveIdempotentInspect
Unlink several items from one parent in a bundle (an ordered outline of memories for a book or project) in one call. Only the links are removed; the items and the memories they point at are kept. The inverse of muninn_bundle_nodes_create. Returns how many links were removed.
| Name | Required | Description | Default |
|---|---|---|---|
| childKeys | Yes | node_keys of children to detach | |
| parentKey | Yes | node_key of the parent to detach from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds valuable context beyond them: only links are removed, items and memories are preserved, and the return value is a count of removed links. It does not cover auth or error behavior, but the added semantics are substantive.
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 short sentences, front-loaded with the core action and scope, then preservation semantics, then return value. No 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 two-parameter mutation with rich annotations and no output schema, the description covers purpose, preservation behavior, inverse operation, and return value. Nothing critical for correct invocation 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 100%, so the schema fully documents parentKey and childKeys. The description implies multiple children from one parent but adds no syntax or format details beyond the schema; baseline 3 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?
States a specific verb (Unlink) and resource (items from one parent in a bundle), scopes it to several items in one call, and distinguishes it from node deletion by noting only links are removed. The inverse relationship to muninn_bundle_nodes_create further disambiguates it from siblings.
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?
Clearly indicates the operation's context: remove multiple child links from a parent without deleting the items or memories. However, it does not explicitly name alternatives such as muninn_bundle_node_delete or state when-not to use it beyond the implied preservation semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_bundle_updateADestructiveIdempotentInspect
Change a bundle's title and/or description (a bundle is an ordered outline of memories for a book or project). The slug never changes here.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New title | |
| rootKey | Yes | The node_key of the bundle root to update | |
| description | No | New description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, idempotent, destructive mutation, so the description does not need to restate safety basics. It usefully adds that only title and/or description change and the slug is immutable, but does not explain overwrite behavior, permissions, or return behavior.
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 a single tightly written sentence with no waste. The mutation scope is front-loaded, and the parenthetical definition of a bundle is brief 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 simple metadata-update tool with full schema coverage and annotations, the description provides enough context to call it correctly. The only minor gap is that it does not state what the operation returns, but no output schema is present and the call is straightforward.
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 schema has 100% parameter coverage and documents all three parameters, including rootKey as the bundle root identifier. The description names the mutable fields and the and/or nature of the update, but adds no syntax or format details beyond 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 description gives a clear verb and resource: it changes a bundle's title and/or description, and defines a bundle parenthetically. It also distinguishes this from slug-changing operations by stating the slug never changes here, though it does not name a specific sibling alternative.
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 by the stated fields: use this to edit a bundle's title or description, not its slug. However, there are no explicit when-to-use/when-not-to-use instructions or named alternatives such as bundle creation or reslug operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_helpARead-onlyIdempotentInspect
Return the full Muninn help document — what Muninn is, how to use it, and the full tool and skill reference. Call this whenever the user asks for help or how to use their memory.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety is covered. The description adds useful behavioral context that the response is a complete reference document (potentially large), helping the agent anticipate output size, though it doesn't state format or size explicitly.
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 sentences, front-loaded with the action and return content, then the invocation condition. Nothing is repeated or 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 zero-parameter help tool with no output schema, the description tells the agent what the returned document covers, which is the key decision input. Minor gap: it doesn't note the output format or approximate size, which matters for a "full" reference document.
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; this meets the baseline for a no-param tool. The schema coverage is 100% and the empty schema matches the description's implied no-argument invocation.
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 ("Return the full Muninn help document") and enumerates what it contains: what Muninn is, usage, and the full tool and skill reference. This clearly separates it from functional siblings like muninn_onboard or muninn_skill_registry.
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: "Call this whenever the user asks for help or how to use their memory." That is a clear when-to-use rule, though it does not contrast against adjacent discovery tools such as muninn_onboard or muninn_session_boot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_addAInspect
Store a new memory with text content and tags. Returns a compact {success, memoryId, length} — length is the stored character count, your self-verify signal (the full body is never echoed; you just sent it). Pass occurredAt only when logging something that happened at a different time than now (e.g. backfilling a past conversation) — otherwise it defaults to now. Operational memories (session state, checkpoints, carryover, logs) should pass hideRank:true so they do not crowd Ranking or boot.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags for categorization e.g. ['session-state'], ['person-log', 'sarah'] | |
| text | Yes | The memory content to store | |
| preview | No | 1–2 sentence summary of this memory written by Claude before calling this tool. If omitted, falls back to an 80-char text truncation. | |
| project | No | Project slug to scope this memory (e.g. 'writing-article'). Omit for user-global memories that apply in all projects. | |
| hideRank | No | Keep this memory out of the Ranking view and out of the "most accessed" block of session boot. Set true for anything whose reads come from tooling, not from interest: session state, a checkpoint, carryover notes, a run or sync log, a scratch note for the next session of one tool. Leave false for anything a person might want surfaced because it keeps coming up: a decision, a profile, a preference, an article, a changelog entry. When unsure, leave false; a hidden memory is still found by search, tag and get. | |
| occurredAt | No | ISO 8601 datetime of when the event actually happened, if different from now. Used for chronological ordering of logs. Defaults to now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only tell the agent this is a non-read-only, non-destructive, non-idempotent write. The description goes well beyond that: it states the exact return shape ({success, memoryId, length}), explains that length is the self-verify signal and the body is never echoed, and documents defaulting behavior and the downstream effect of hideRank on Ranking and boot.
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 and return contract are front-loaded in the first two sentences, then parameter rules follow in priority order. Slightly overstuffed with em-dash asides such as "(the full body is never echoed; you just sent it)", but nothing is truly 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 six-parameter creation tool with no output schema, the description supplies the return contract and the non-obvious parameter decisions, which is the bulk of what an agent needs. It stops short of situating the call relative to append/update, leaving one ambiguity for a tool with many write 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 coverage is 100%, so baseline is 3, but the description adds operational rules the schema alone doesn't state as a decision rule — the concrete hideRank:true list (session state, checkpoints, carryover, logs) and the occurredAt backfill case. That is meaningful guidance beyond field-level docs.
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?
"Store a new memory with text content and tags" gives a specific verb and resource, and the return-shape sentence reinforces that this is a creation call. It does not, however, distinguish itself from near-siblings like muninn_memory_append or muninn_memory_update, which an agent could plausibly reach for instead.
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 real conditional guidance: pass occurredAt only when the event happened at a different time than now, and pass hideRank:true for operational memories. What's missing is tool-selection guidance against the other write-path siblings (append, update, anchor_replace).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_anchor_replaceADestructiveIdempotentInspect
Replace the span between beginAnchor and endAnchor (inclusive) with newText. Cheaper than resending the whole body when editing a large block — send only the two anchors and the replacement. Both anchors must appear EXACTLY ONCE in the current body; the server rejects if either is missing or appears more than once (never guesses). beginAnchor must precede endAnchor. To delete a span: pass newText as empty string. Returns {id, length} as self-verify. memoryId accepts a short-form 8-char prefix. Works on artifacts too (artifactId IS memoryId) — a published artifact's public link is refreshed automatically. Optional expectedRev: the rev from the read you based these anchors on — the write is REJECTED (nothing written) if the body moved since. Omit for a read-then-immediately-write.
| Name | Required | Description | Default |
|---|---|---|---|
| newText | Yes | Replacement text for the entire span (beginAnchor through endAnchor inclusive). Pass empty string to delete the span. | |
| memoryId | Yes | Memory ID to edit (full UUID or unique 8-char prefix) | |
| endAnchor | Yes | Exact string marking the END of the span to replace — must appear exactly once and after beginAnchor | |
| beginAnchor | Yes | Exact string marking the START of the span to replace — must appear exactly once | |
| expectedRev | No | The `rev` from the read you based this edit on. Rejects the write if the body has changed since. Omit to skip the check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (destructive, idempotent, openWorld); the description adds substantial context beyond that: exact-once anchor matching with no guessing, ordering requirement, delete semantics, return value {id, length}, short-form 8-char memoryId, artifact support with automatic public-link refresh, and the optimistic-concurrency behavior of expectedRev (write REJECTED, nothing written). Note a latent tension: the 'rejects if either anchor is missing' rule means a repeat call would fail, which sits awkwardly with idempotentHint=true, but the description itself is accurate and not misleading.
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 operation, then rationale, constraints, delete case, return value, artifact note, and rev guidance. Every clause is informative, though the description is dense and runs long enough that a couple of points (artifact note, expectedRev) could be tightened.
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 output schema, the description compensates fully: it documents the return shape ({id, length}), concurrency handling via expectedRev, edge cases (delete, exactly-once anchors, ordering), and artifact-specific side effects. Nothing an agent needs to call this 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 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it clarifies the relationship between the two anchors (ordering, uniqueness) and, most valuably, when to use or omit expectedRev ('the rev from the read you based these anchors on', omit for read-then-immediately-write).
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: replace the span between beginAnchor and endAnchor with newText. It also implicitly distinguishes itself from whole-body editing siblings (muninn_memory_update/muninn_memory_append) by explaining it is 'cheaper than resending the whole body'. An agent can tell what this does and why it exists 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?
Explicitly covers when to use it (editing a large block), how to delete (newText as empty string), and the exact condition for expectedRev ('omit for a read-then-immediately-write'). It also states the failure conditions (anchors missing or appearing more than once) so the agent knows when the call will be rejected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_appendAInspect
Append text to the END of a memory's body. Cheaper than resending the whole body — only send what's new. Use for growing changelogs, journals, session-state, or any memory that accumulates by accretion. separator defaults to '\n\n' (a blank line). Returns {id, length} as self-verify. memoryId accepts a short-form 8-char prefix. Works on artifacts too (artifactId IS memoryId) — a published artifact's public link is refreshed automatically. Optional expectedRev: the rev from your last read of this memory — the append is REJECTED (nothing written) if the body moved since, rather than landing on top of someone else's entry. Omit for a read-then-immediately-write, or when appending blind.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to append | |
| memoryId | Yes | Memory ID to append to (full UUID or unique 8-char prefix) | |
| separator | No | String inserted between the existing body and the new text. Default: '\n\n' (blank line). | |
| expectedRev | No | The `rev` from the read you based this append on. Rejects the write if the body has changed since. Omit to skip the check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: returns {id, length} for self-verification, expectedRev acts as optimistic concurrency (REJECTED with nothing written if the body moved), short-form 8-char prefix accepted, and artifact behavior with automatic public-link refresh. This discloses write semantics and failure modes the annotations alone don't.
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, then layers value (cheaper, use cases, separator, return shape, concurrency, artifacts) with no filler. Dense but every sentence carries actionable 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?
No output schema exists, yet the description states the return value ({id, length}) and describes the concurrency guarantee and artifact side effect. For a 4-param append tool this is complete enough for an agent to call 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 baseline is 3, but the description adds usage guidance the schema lacks—specifically when to omit expectedRev ('read-then-immediately-write, or when appending blind') and the separator default behavior. This meaningfully augments the expectedRev parameter's 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?
States a specific verb ('append') and resource ('a memory's body') with scope ('to the END'), and implicitly distinguishes from full-body update by noting it's 'cheaper than resending the whole body.' An agent can tell exactly what this does versus sibling memory 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?
Gives concrete use cases ('growing changelogs, journals, session-state, or any memory that accumulates by accretion') and contrasts cost with resending the whole body, which implies the alternative update path. It doesn't explicitly name muninn_memory_update as the alternative, keeping it 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.
muninn_memory_deleteADestructiveIdempotentInspect
Permanently delete a memory by ID from all storage layers. memoryId may be the full UUID or a unique prefix of at least 8 characters, the same short form muninn_memory_get and _update accept; an ambiguous prefix is refused and lists the matching IDs, so nothing is deleted by guesswork.
| Name | Required | Description | Default |
|---|---|---|---|
| memoryId | Yes | The memory ID to delete (full UUID or a unique prefix of at least 8 characters) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true. The description adds that deletion spans 'all storage layers' and that ambiguous prefixes are refused with a list of matching IDs; that goes beyond what the annotations say.
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 sentences, front-loaded with the destructive action and scope, followed by the key safety constraint. Every clause 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?
For a single-parameter tool with rich annotations and no output schema, the definition covers scope, permanence, and the ambiguous-ID failure mode. What's missing is minor, e.g. whether deletion cascades to references or tags in bundles.
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 still adds meaning by stating the ambiguous-prefix behavior (refused, with matches listed) and linking the short-form convention to muninn_memory_get and _update.
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?
'Permanently delete a memory by ID from all storage layers' gives a specific verb, resource, and scope, which clearly separates it from muninn_memory_get, _update, and _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?
It implies usage (delete a memory when you want it gone) and references the get/update siblings only for ID-format conventions, not as alternatives. There is no explicit when-not guidance, e.g. irreversibility or what to do if the memory is referenced elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_getARead-onlyIdempotentInspect
Retrieve a single memory by its ID. Accepts a short-form ID (a prefix of the full UUID) — it is resolved to the full ID first. Also returns rev, the body's revision number (null if never indexed): pass it back as expectedRev on a later muninn_memory_update / _anchor_replace / _append and that write FAILS instead of clobbering an edit someone made in between. Only worth carrying when you read now and write later; a read-then-immediately-write needs nothing. Also opens a built-in Muninn skill: pass the full id from the end of its <muninn_skills> location and its instructions come back read-only, marked builtIn: true.
| Name | Required | Description | Default |
|---|---|---|---|
| memoryId | Yes | The memory ID to retrieve (full UUID or a unique prefix of it) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/closed-world, and the description adds substantial behavior beyond them: short-form IDs are resolved to a full UUID first, `rev` is null when never indexed, and passing it back makes a later write FAIL rather than clobber a concurrent edit. It also discloses that built-in Muninn skills come back read-only and are marked `builtIn: true`.
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 action is front-loaded in the first sentence, and every subsequent sentence carries information. It is dense with em-dash asides and the skill paragraph sits last as a related tangent, so it is slightly longer than it needs to be, but nothing is pure 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 single-parameter read tool with annotations and no output schema, the description covers return semantics (`rev` and its null case), ID resolution, and the special skill path. It omits error behavior for unknown or ambiguous prefixes, which is the only notable omission.
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, but the description adds semantics the schema does not: prefix IDs are acceptable and are resolved before use, and a full ID sourced from a <muninn_skills> location behaves differently (opens read-only skill instructions). That is real added meaning over the one-line schema doc.
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 (Retrieve) and resource (a single memory) and scopes it by ID, which cleanly separates it from the list/query/search siblings. The short-form ID resolution and the built-in-skill retrieval path are both named explicitly, so an agent knows exactly what this call returns.
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 conditional guidance for the `rev` value: carry it only when you read now and write later, since a read-then-immediately-write needs nothing. It also explains the one non-obvious usage path (reading a built-in skill's instructions via its <muninn_skills> id). It never states when to prefer this over muninn_memory_search/query/artifact_get when you don't already hold an ID, which is the remaining gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_listARead-onlyIdempotentInspect
List all memories for the current user with optional pagination. Use muninn_memory_list_by_tag for tag filtering or muninn_memory_search for semantic search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of memories to return | |
| cursor | No | Pagination cursor from a previous response | |
| project | No | Project slug to filter results. Returns global + project-scoped memories. Omit to return all memories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered elsewhere. The description adds only the pagination hint, which is already implied by the limit/cursor schema, and says nothing about ordering, default result size, or what the cursor encodes.
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 sentences, zero filler, with the primary purpose front-loaded before the routing guidance. Every clause 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?
For a read-only list tool with full annotation coverage and 100% schema coverage, the description is essentially complete. The only soft gap is the absence of any note on result ordering or return shape, which matters slightly more given there is no 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?
Schema description coverage is 100%, so limit, cursor, and the project filter are all documented in the schema itself, including the global+project-scoped nuance. The description adds no parameter-level meaning beyond what the schema already provides, so the 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?
States a specific verb and resource ('List all memories'), the scope ('for the current user'), and a behavioral modifier ('optional pagination'). It also names the two closest siblings so an agent can distinguish this tool 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?
Explicitly routes to alternatives with the condition that selects each: muninn_memory_list_by_tag for tag filtering, muninn_memory_search for semantic search. This is exactly the when-to-use-this-vs-that guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_list_by_tagARead-onlyIdempotentInspect
Find memories by exact tag match using the D1 tag index. All specified tags must be present (AND logic). Use for session-state, carryover, person profiles, project logs etc.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Tags to filter by — all must match e.g. ['carryover'] or ['person-log', 'sarah'] | |
| limit | No | Maximum number of results | |
| project | No | Project slug to filter results. Returns global + project-scoped memories. Omit to return all memories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety behavior is covered for free. What the description adds is the AND-matching rule, but that is duplicated verbatim in the schema's own tag description ('all must match'), and the 'D1 tag index' reference is an implementation detail rather than agent-relevant behavior. No mention of result ordering or page/limit behavior.
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 short sentences with the core behavior and the matching rule front-loaded, then use cases. No filler or redundant restatement of the name. The trailing 'etc.' makes the use-case list slightly loose but costs little.
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 read-only filtered list with full annotation coverage and 100% schema coverage, the description supplies what is needed to invoke it correctly. There is no output schema, so the only mild gap is that it says nothing about what a result looks like or how limit/pagination behaves.
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 the schema already documents tags (with examples), limit (max 100, default 100) and project (global + project-scoped). The description adds no parameter detail beyond repeating the AND rule. Baseline 3 is correct when the schema carries the parameter burden.
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 ('Find memories by exact tag match') and adds the matching semantics ('All specified tags must be present (AND logic)'), so the agent knows exactly what the tool returns. It does not, however, distinguish itself from closely-named siblings such as muninn_memory_search_tags, muninn_memory_list_tags, or muninn_memory_tag, which is the main ambiguity an agent faces here.
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 closing clause ('Use for session-state, carryover, person profiles, project logs etc.') gives concrete use cases, which implies when the tool is appropriate. It never states when NOT to use it or names an alternative (e.g. the non-tag list/query tools), so the agent must infer the choice from the sibling list alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_list_tagsARead-onlyIdempotentInspect
List every distinct tag for the current user with how many memories carry it, most-used first. The vocabulary/discovery counterpart to tag search — answers 'was it github-mirror or mirror-github?' in one call. Pass a project to scope counts to that project (plus global).
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Project slug to scope counts. Returns global + project-scoped. Omit for all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds behavioral detail beyond that: returned counts, most-used-first ordering, and the global+project aggregation semantics of the project parameter.
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; output shape and ordering are front-loaded, then the sibling distinction, then the parameter note. No 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?
A single-parameter, read-only listing tool with annotations covering safety and no output schema to explain. Everything an agent needs to call it correctly — including the project/global interaction — 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?
With 100% schema coverage the baseline is 3, but the description adds real meaning: passing a project scopes counts to that project AND global, and omitting it returns all. That combination rule is worth more than the schema's bare 'Omit for all.'
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 ('List every distinct tag'), plus the payload (counts) and ordering (most-used first). It explicitly positions itself against tag search, so an agent can distinguish it from siblings like muninn_memory_search_tags 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?
Clear context for when to use it — tag vocabulary/discovery, resolving near-miss tag names like 'github-mirror vs mirror-github'. It does not name the alternative tools explicitly, so the routing signal is descriptive rather than a direct hand-off.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_queryARead-onlyIdempotentInspect
Query memories with composable filters: fetch by specific IDs, OR-tag match, AND-tag match, tag exclusion, and a date range. id, tag and time clauses are intersected — a memory must satisfy all provided clauses. A time clause alone is allowed: "what happened between 1 and 19 Oct" is time {from, to} with nothing else, answered from each memory's own timestamp, so it does not depend on date tags. With time set, results are ordered by that timestamp, newest first (order:"oldest" for a timeline from the start). For a topic inside a date range, use muninn_memory_search with time. Use for bundle content audits, convention checks, or any multi-condition fetch. IDs accept full UUIDs or unique 8-char prefixes; ambiguous/missing prefixes are reported in errors[], never silently dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Fetch these specific memory IDs (full UUIDs or unique 8-char prefixes). | |
| tag | No | ||
| time | No | Keep memories whose timestamp falls in this range. | |
| limit | No | ||
| order | No | Result order by timestamp (the time field when time is set, else occurredAt). | newest |
| project | No | Project slug. Keeps that project's memories plus global (no-project) ones, as muninn_memory_list_by_tag does. Omit for all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds behavior those annotations cannot express: result ordering driven by the time field, order:'oldest' for timelines, and that ambiguous/missing ID prefixes surface in errors[] rather than being silently dropped. It stops short of describing pagination or result shape, but the error-reporting and ordering disclosures are genuinely useful.
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 verb and filter list, then progressively adds intersection rules, ordering, and the routing alternative. It is dense and slightly long, but each sentence carries non-obvious information (timestamp independence, error reporting), so little 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 6-param, 0-required tool with nested tag/time objects and no output schema, the description covers the semantics an agent needs to build valid multi-clause queries plus ordering and error behavior. Remaining gaps (result shape, limit interaction) are minor and partly covered by the 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?
Schema coverage is 67%, and the description compensates with semantics the schema does not carry: all provided clauses are intersected, a time clause alone is valid and answered from each memory's own timestamp rather than date tags, and IDs accept full UUIDs or unique 8-char prefixes. It does not restate limit bounds or the project fallback, which the schema already documents.
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 (query memories) and enumerates the exact filter composition it supports: IDs, OR-tag, AND-tag, exclusion, date range, with intersection semantics. It also distinguishes itself from the sibling muninn_memory_search (topic-inside-range) and from muninn_memory_list_by_tag, so an agent can route without opening a 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?
Explicitly names when to use it (bundle content audits, convention checks, any multi-condition fetch) and, more importantly, names the alternative and the condition that selects it: 'For a topic inside a date range, use muninn_memory_search with time.' That is exactly the when/when-not/alternative guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_searchARead-onlyIdempotentInspect
Semantically search memories using natural language. Returns the most relevant memories ranked by similarity. Pass project to search strictly within that project; omit it to search across all your memories. Pass time to search only memories from a date range ("what did we decide about pricing last week"): the range is applied first, then the matches inside it are ranked by similarity. The result then carries timeRange {exact, method, matched?}. exact:false (method nearest-100) means some memories in the range were not yet date-indexed and the range held more than 100, so only its members among your 100 nearest matches were ranked; narrow the range if that matters. Recently saved memories are date-indexed within minutes, after which every range is exact. Searches your own memories only, not team-shared ones, when time is set.
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | Only search memories whose timestamp falls in this range. | |
| limit | No | Maximum number of results to return | |
| query | Yes | Natural language search query | |
| project | No | Project slug. When set, search is restricted to that project only (does not include global/no-project memories). Omit to search everything. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the read-only/idempotent annotations: it explains that the time range is applied before similarity ranking, describes the returned timeRange metadata (exact, method, matched), and warns that exact:false with method nearest-100 means unindexed memories inside a large range were skipped and the range should be narrowed. It also notes the indexing latency ('date-indexed within minutes') and the ownership restriction when time is set.
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 scoping, then the subtle time-range behavior. Dense but nearly every sentence carries distinct operational information; the parenthetical example of a natural-language time query earns its place. It is longer than typical but not 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 4-parameter search tool with no output schema, the description covers the tricky parts: filter-then-rank order, the timeRange result fields, and the nearest-100 caveat. It leaves the result shape for a memory itself and the limit parameter's effect unaddressed, but nothing that would cause a wrong 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 100%, so the baseline is 3, but the description adds real semantics the schema lacks: project scoping excludes global/no-project memories, and the ordering interaction between time filtering and similarity ranking. It does not discuss the limit parameter, so it does not reach the top of the range.
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 ('Semantically search memories using natural language') plus the ranking mechanism ('most relevant memories ranked by similarity'). It is clear what the tool does, but it never names or distinguishes itself from close siblings such as muninn_memory_query or muninn_memory_search_tags, so an agent must infer the boundary from names alone.
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 conditional guidance: pass project to search strictly within a project, omit to search everything, and pass time for a date-range search with an example query. It also discloses the important scoping rule that with time set only your own memories are searched, not team-shared ones. It stops short of naming an alternative tool for structured/tag search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_search_tagsARead-onlyIdempotentInspect
Find memories by PARTIAL tag match — each pattern matches any tag CONTAINING it (substring, case-insensitive). Semantics: OR within a pattern, AND across patterns — e.g. ['brd','mirror'] finds memories that have some brd-ish tag AND some mirror-ish tag. Use when you don't recall the exact tag ('mirror' → github-mirror, gdrive-mirror). For exact tags use muninn_memory_list_by_tag; to see the tag vocabulary use muninn_memory_list_tags.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results | |
| project | No | Project slug to filter results. Returns global + project-scoped memories. Omit to search all. | |
| patterns | Yes | Substring patterns, e.g. ['mirror'] or ['brd', 'mirror']. Each matches any tag containing it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. The description adds genuinely new behavioral context beyond annotations: substring, case-insensitive matching plus OR-within-pattern / AND-across-pattern semantics. It stops short of describing result ordering or pagination, so a 4 rather than 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-loads the matching semantics then the usage routing, with an illustrative example. Every sentence earns its place, though the single dense paragraph is slightly heavy for the operation's simplicity.
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?
Purpose, matching semantics, and sibling alternatives are all covered; annotations carry the safety profile and there is no output schema to document. Nothing needed to call this 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 100%, so baseline is 3, but the description adds real meaning the schema lacks: the cross-pattern AND vs within-pattern OR combinatorics with a worked example. That elevates it above the baseline. The limit/project params remain schema-only.
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 ('Find memories by PARTIAL tag match') and immediately defines the matching behavior. It explicitly distinguishes itself from muninn_memory_list_by_tag and muninn_memory_list_tags, so an agent can select it without opening sibling 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?
Gives an explicit when-to-use trigger ('Use when you don't recall the exact tag') with a concrete example, plus named alternatives for the opposite cases (exact tags, vocabulary browsing). The routing logic is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_tagADestructiveIdempotentInspect
Add and/or remove tags on a memory WITHOUT touching its text. Pass deltas, not the full list: add:[...] inserts (deduped), remove:[...] strips. NEVER regenerates the embedding (text is untouched), and you don't resend the existing tags or the body — so this is far cheaper than muninn_memory_update for a tag-only change. Returns compact {id, tags} with the resulting tag list. Use muninn_memory_update instead only when you also need to change text/project/decay, or to REPLACE the whole tag list wholesale. memoryId accepts a short-form 8-char prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Tags to add (deduped against existing). Omit if only removing. | |
| remove | No | Tags to remove. Omit if only adding. | |
| memoryId | Yes | The memory ID to retag (full UUID or unique 8-char prefix) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/idempotent/not-readonly, and the description adds non-obvious behavior beyond them: no embedding regeneration, no need to resend body or existing tags, cost comparison against update, and the compact {id, tags} return shape. No contradictions with the annotation 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?
Dense but zero waste; the core constraint (text untouched, deltas only) is front-loaded, followed by cost rationale, return shape, and the alternative routing. No filler sentences.
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 3-parameter mutation tool with no output schema, the description covers what changes, what doesn't, what's returned, and when to pick the sibling instead. 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 100% so baseline is 3, but the description adds real semantics: pass deltas not the full list, add is deduped against existing, remove strips, and memoryId accepts an 8-char prefix. Gaps are minor (no guidance on erroring on non-existent tags).
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 pair (add/remove) and resource (tags on a memory), plus the critical scope constraint 'WITHOUT touching its text'. An agent can distinguish it from muninn_memory_update purely from the description.
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 routes the agent: use muninn_memory_update only when text/project/decay changes or a wholesale tag replacement is needed. The delta-vs-full-list rule is stated up front, which is the main selection hazard.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_tag_manyADestructiveIdempotentInspect
Apply tag adds and/or removes across MANY memories in one call. Body and embeddings are untouched. Use for project renames, bulk re-tagging, or applying a convention to a whole set. memoryIds accept full UUIDs or unique 8-char prefixes. Returns per-id results and any resolution errors.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Tags to add to each memory (deduped against existing) | |
| remove | No | Tags to remove from each memory | |
| memoryIds | Yes | Memory IDs to retag (full UUIDs or unique 8-char prefixes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false; the description adds the valuable clarification that 'Body and embeddings are untouched' despite the destructive flag, plus dedup behavior against existing tags. It also notes return behavior ('per-id results and any resolution errors'), which is useful given no output schema, though permission and rate-limit behavior remain unstated.
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?
Four tight sentences, front-loaded with the operation and scope, then constraints, then use cases, then return contract. Minimal waste, though the listing of use cases could be trimmed slightly.
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 output schema, the description covers scope, untouched fields, prefix resolution with error reporting, and dedup behavior, so an agent has enough to call it correctly. Minor gaps around permissions or failure semantics for the whole batch keep it from a 5.
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 including the prefix format and dedup note. The description merely restates the prefix capability and does not add meaning beyond the schema, making the baseline 3 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 gives a specific verb ('Apply tag adds and/or removes'), a resource ('memories'), and clear batch scope ('across MANY memories in one call'), which implicitly separates it from the singular muninn_memory_tag sibling. It stops short of naming the single-memory alternative explicitly, so it falls just short of full sibling differentiation.
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 provides concrete use cases ('project renames, bulk re-tagging, or applying a convention to a whole set'), giving clear context for when to reach for it. However, it never states when NOT to use it or points to muninn_memory_tag for the single-memory case, so there are no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_memory_updateADestructiveIdempotentInspect
Update an existing memory's text, tags, decay score, occurredAt, or project. memoryId may be a short-form (8-char) prefix. Two ways to change text: pass text to replace the WHOLE body, OR pass replacements:[{old,new}] for surgical find-and-replace — each old must match EXACTLY ONCE or the whole update is rejected atomically (nothing is written), so a two-line edit to a long memory costs one pair instead of resending thousands of words. Regenerates the embedding ONLY if text actually changes. tags REPLACES the whole list. Returns a compact {id, tags, project, updatedAt, embeddingRegenerated, length} — length is the stored char count, your self-verify signal (the body is never echoed back). When you used replacements, the result also carries replacements: so you can confirm how many spots were hit. For a tags-only edit, prefer muninn_memory_tag. hideRank:true takes a memory out of Ranking and boot's mostAccessed, false puts it back; omit it to leave it as it is. This is also how you EDIT AN ARTIFACT'S BODY — an artifact's artifactId IS its memoryId; there is no separate muninn_artifact_update. If the artifact is currently published, its public link is refreshed automatically. Optional expectedRev: pass the rev your last muninn_memory_get / muninn_artifact_get returned and the write is REJECTED (nothing written) if someone changed the body since you read it, instead of silently overwriting them. Omit it when you read and write in the same breath.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | New tags (replaces existing tags) | |
| text | No | New text content — replaces the WHOLE body. Mutually exclusive with replacements. | |
| preview | No | Updated 1–2 sentence summary. Pass when text changed. If omitted, existing preview is preserved. | |
| project | No | New project slug. Pass empty string '' to clear back to global. Omit to leave unchanged. | |
| hideRank | No | Keep this memory out of the Ranking view and out of the "most accessed" block of session boot. Set true for anything whose reads come from tooling, not from interest: session state, a checkpoint, carryover notes, a run or sync log, a scratch note for the next session of one tool. Leave false for anything a person might want surfaced because it keeps coming up: a decision, a profile, a preference, an article, a changelog entry. When unsure, leave false; a hidden memory is still found by search, tag and get. Omit to leave the current setting. | |
| memoryId | Yes | The memory ID to update (full UUID or unique 8-char prefix) | |
| decayScore | No | New decay score between 0 and 1 | |
| occurredAt | No | Corrected ISO 8601 datetime of when the event actually happened. Used for chronological ordering. | |
| expectedRev | No | The `rev` from the read you based this edit on. Rejects the write if the body has changed since. Omit to skip the check. | |
| replacements | No | Surgical find-and-replace pairs applied in order. Each `old` must match exactly once or the entire update is rejected (atomic). Use instead of `text` to edit a few lines of a long memory cheaply. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: atomic rejection if any `old` fails to match exactly once, embedding regeneration only when text actually changes, tags replacing the whole list, automatic public-link refresh for published artifacts, and expectedRev conflict rejection instead of silent overwrite. These are the failure modes an agent cannot infer from destructiveHint/idempotentHint 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-loaded with purpose and the mutually exclusive edit modes, and most sentences carry distinct information. It is long and repeats some schema-level detail (notably hideRank and replacements atomicity), but given 10 parameters with no output schema the density is largely justified.
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?
Since no output schema exists, the description supplies the return contract itself ({id, tags, project, updatedAt, embeddingRegenerated, length}) and explains that length is the self-verify signal because the body is never echoed. Combined with concurrency (expectedRev) and artifact-editing coverage, nothing needed 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 100%, so the baseline is 3, but the description adds genuine meaning beyond it: the replacements-as-cost-saving device, the embedding-regen condition, the short-form memoryId prefix, and concrete guidance for setting expectedRev. Some content (tags replaces existing, replacements order) is duplicated from the schema, which keeps this from 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 and enumerates exactly which fields are mutable (text, tags, decay score, occurredAt, project). It also distinguishes itself from siblings by naming muninn_memory_tag for tags-only edits and stating there is no separate muninn_artifact_update, which is real disambiguation an agent can act on.
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 routing: 'For a tags-only edit, prefer muninn_memory_tag', two named text-edit strategies with the cost tradeoff between them, and clear when/when-not for expectedRev ('omit it when you read and write in the same breath'). It also covers the non-obvious case of editing an artifact body through this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_mirror_connectAInspect
Start the connection flow for a mirror provider. Returns a URL for the user to open in their browser. After approving, call muninn_mirror_status to confirm. Paid plan. provider: 'gdrive' (Google Drive, push-only: copies out of Muninn, never back) is the working mirror; 'github' is not available yet and is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | The mirror provider to connect: 'gdrive' for Google Drive (push-only). 'github' is not available yet and returns an error. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the tool returns a browser URL, requires user approval, belongs to a paid plan, and that 'gdrive' is push-only with copies never coming back. It also warns that 'github' is unavailable and refused, which is important behavioral context.
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, followed by the return value, next step, prerequisite, and provider constraints. Every sentence adds operational value with no 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?
Given the lack of an output schema, the description explains the key return value (a URL) and the required follow-up step. It also covers pricing, provider availability, and push-only semantics, making the definition complete enough 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 baseline is 3. The description adds useful meaning beyond the schema by explaining that 'gdrive' is push-only ('copies out of Muninn, never back') and that 'github' is not available yet and is refused, though much of this overlaps with the schema's own parameter description.
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 uses a specific verb and resource: 'Start the connection flow for a mirror provider.' It clearly distinguishes the tool from its follow-up sibling by stating that after approval the agent should call muninn_mirror_status to confirm.
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 usage context, including a prerequisite ('Paid plan') and an explicit follow-up ('After approving, call muninn_mirror_status to confirm'). It also states that 'github' is refused, but it does not explicitly frame when to choose this over other mirror tools such as designate or push.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_mirror_designateAIdempotentInspect
Designate (or un-designate) a bundle for mirroring to a provider. Adds/removes the 'gdrive-mirror' tag on the bundle root's backing memory for Drive ('github-mirror' for GitHub). After designating, writes to that bundle automatically enqueue a mirror push. Use muninn_mirror_push to force one now. Turning mirroring on is Paid plan; turning it off (enabled=false) is always free. GitHub is not available yet: enabling it is refused, un-designating still works.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | No | true = designate; false = stop mirroring this bundle | |
| rootKey | Yes | node_key of the bundle root to designate | |
| provider | Yes | Which provider to designate for: 'gdrive'. 'github' is accepted only with enabled=false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotent, openWorld): it discloses the tag side effect on the backing memory, the automatic enqueue-on-write behavior after designation, billing implications, and a provider-specific refusal path. These are operationally critical traits annotations cannot convey.
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?
Five tight sentences, front-loaded with the core action and mechanism, followed by behavior, billing, and provider caveats. Every sentence carries non-redundant 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?
With no output schema, the description covers everything an agent needs: what changes, what happens afterward, cost/policy gating, provider limitations, and the force-push alternative. No material gap remains.
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, but the description adds useful semantics: enabled=false means stop mirroring and is free, and the github provider value is only usable with enabled=false. It does not elaborate on rootKey beyond the schema wording.
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 — designating/un-designating a bundle for mirroring to a provider — and clarifies the concrete mechanism (tagging the bundle root's backing memory). It is clearly distinguishable from sibling mirror tools (push, connect, status, reconcile).
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 routes the agent to muninn_mirror_push for forcing a push now, states the Paid-plan gate for enabling versus the always-free disable path, and warns that GitHub enabling is refused while un-designating still works. When-to-use, when-not, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_mirror_pushADestructiveIdempotentInspect
Force an immediate mirror push of one bundle. Marks the bundle dirty so the next cron tick (every 15 min) pushes it. If provider is omitted, queues for all connected providers. Paid plan; a lapsed account's mirror pauses until it pays again (files already mirrored stay). Only Google Drive is pushed today; 'github' is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| rootKey | Yes | node_key of the bundle root to push | |
| provider | No | Which provider to push to: 'gdrive'. 'github' is not available yet and returns an error. Omit for all connected providers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=true), and the description adds substantial context beyond them: the push is deferred via a dirty flag to a 15-minute cron tick, provider omission queues all connected providers, and a lapsed account pauses mirroring while retaining already-mirrored files. 'files already mirrored stay' is consistent with destructiveHint.
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 front-loaded, with each clause earning its place (timing, provider scope, plan gating, github refusal). Slight deduction because it opens with 'immediate' then immediately corrects to 'next cron tick (every 15 min)', a mild tension in the lead sentence.
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 output schema, it covers timing, provider behavior, plan gating, and provider refusal well, and annotations cover the destructive/idempotent profile. It does not describe what the call returns or how to observe the queued state (e.g., via muninn_mirror_status), a minor 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?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description largely restates provider semantics ('omit for all connected providers', github refused) that the schema enum description already conveys, adding little beyond it; 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?
States a specific verb+resource ('Force an immediate mirror push of one bundle') and scopes it to a single bundle root. It is clearly distinguishable from the other mirror siblings (connect/designate/reconcile/status) which manage setup and state rather than triggering a push.
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 real preconditions (paid plan, lapsed accounts pause, only gdrive works, github refused) but never routes the agent against alternatives such as muninn_mirror_reconcile or muninn_mirror_status, nor says when to trigger a push manually versus waiting for the cron tick. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_mirror_reconcileADestructiveInspect
Manually trigger a mirror reconciliation pass: enqueues every memory the mirror has never seen and re-marks any that changed since their last push, so both re-push on the next cron tick. Useful after a gap or error. Returns enqueuedNew, markedDirty, scanned, and complete (false = the scan stopped on budget and resumes next run). Only Paid accounts are reconciled; a lapsed account's mirror is paused. Only Google Drive is actually pushed; GitHub rows still get queued but are never pushed (GitHub is not available yet).
| Name | Required | Description | Default |
|---|---|---|---|
| provider | No | Reconcile only this provider ('gdrive' is the working mirror; 'github' is not available yet). Omit for all connected providers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that the effect is enqueue-only (actual push waits for the cron tick), that the scan is budget-limited and resumable via the 'complete' flag, that only Paid accounts are reconciled and lapsed mirrors are paused, and that GitHub rows queue but never push. That is exactly the mutation semantics an agent needs given destructiveHint=true and openWorldHint=true.
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 action, then the trigger condition, then return shape and constraints; nearly every clause carries information. It is dense and slightly run-on, packing account tier, provider behavior, and return semantics into a single paragraph.
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, and the description compensates by naming all four return fields and explaining that complete=false means a budget-truncated resumable scan. Account requirements, provider limitations, and side-effect timing are all covered, so nothing material 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% and the enum is documented, so the provider parameter is already fully specified. The description adds relevant semantics (gdrive works, github is queued but never pushed, omit for all) but never references the parameter name directly, so this is baseline-level rather than additive.
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 ('manually trigger a mirror reconciliation pass') and explains the mechanism precisely: enqueues unseen memories and re-marks changed ones for the next cron tick. This implicitly separates it from muninn_mirror_push (immediate push) and muninn_mirror_status, but no sibling is named explicitly, so an agent must infer the boundary.
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?
'Useful after a gap or error' gives a clear triggering condition, and the account/paused and GitHub-not-pushed notes tell the agent when this will do nothing. There is no explicit exclusion or named alternative (e.g., 'use muninn_mirror_push for an immediate push'), so usage is well-contextualized but not fully routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_mirror_statusARead-onlyIdempotentInspect
Report mirror connection state and push health per provider. Shows connected, last push time, pending count, and last error. Pass provider to filter to one provider. Free on every plan. Google Drive is the working mirror; GitHub is not available yet, so a github entry (even connected: true) never pushes or pulls, and its pending count does not drain. On a lapsed (non-Paid) account pushes are paused, so pending can grow until it pays again.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | No | Which provider to check: 'gdrive' or 'github' (reported, but not a working mirror yet). Omit for all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description adds substantial behavioral context: github entries never push or pull and their pending count never drains, and on lapsed accounts pushes are paused so pending can grow. These are non-obvious traits an agent cannot derive from annotations or 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 the core purpose, then returns, then filtering, then caveats. Every sentence earns its place, though 'Free on every plan' is a mild marketing aside and the passage is longer than strictly necessary for a one-parameter read 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?
No output schema exists, so the description carries the return-shape burden: it enumerates connected, last push time, pending count, and last error. Combined with the github and lapsed-account edge cases, an agent has everything needed to call and interpret it.
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% and the enum is documented, so baseline is 3. The description adds meaning beyond the schema by explaining the filter intent ('Pass provider to filter to one provider') and warning that a github value is reported but non-functional.
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 (Report) and resource (mirror connection state and push health per provider), and clearly distinguishes itself from mirror_connect/designate/push/reconcile as a read-only status check. An agent can identify it 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?
Gives strong contextual guidance: how to filter by provider, that the tool is free on every plan, and how to interpret a github entry. It does not explicitly name alternatives (e.g., mirror_reconcile) or a when-not-to-use condition, 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.
muninn_onboardARead-onlyIdempotentInspect
Set up a brand-new Muninn account with the user. Call this when the user asks to set up Muninn, says they have just signed up, says their memory is empty, or when muninn_session_boot comes back with nothing in it. Returns {memoryCount, verified, hasIdentity, firstRunScript, starterInstruction}. memoryCount is what the user's Memory Map shows, so 0 means an empty map. firstRunScript is a three-question interview to run with the user, one question at a time, saving each answer with muninn_memory_add; do not paste it back at them. starterInstruction is an optional standing instruction, written for the assistant in use, that the user can paste into their own assistant settings if they want Muninn loaded at the start of every conversation. Offer it only after at least one memory is saved, or if they ask why their assistant does not use Muninn on its own, and tell them what it does before they paste it. verified:false means the account is read-only until the user clicks the link in their "Verify your Muninn account" email, so every save will be refused; say that plainly instead of running the interview. hasIdentity:true means an identity memory already exists, so do not re-run the interview unprompted.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the read-only failure mode (verified:false blocks every save via muninn_memory_add), the gating for starterInstruction, and the effect of hasIdentity. The only friction is that 'set up a brand-new account' implies mutation while the annotations declare readOnlyHint=true and the actual writes are delegated elsewhere — the description never explicitly reconciles that, though the mechanism becomes inferable.
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 trigger, then the return shape, then per-field handling rules — a sensible order with little wasted text. It is dense and run-on in the middle (return-field prose reads as one long sentence), so structure could be tightened, but every clause carries operational 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?
With no output schema, the description fully carries the return-value burden, explaining each of the five fields and the correct agent action for the two error-ish states (unverified account, existing identity). Nothing an agent needs to run the onboarding conversation 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?
Zero input parameters, so the schema baseline is 4. The description instead spends its detail on the return shape (memoryCount, verified, hasIdentity, firstRunScript, starterInstruction), which is the right use of space given no output schema exists.
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 ('Set up a brand-new Muninn account') and immediately distinguishes itself from sibling muninn_session_boot by naming the exact condition where boot delegates here. An agent can pick between onboarding flow and normal session boot 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?
Enumerates concrete invocation triggers (user asks to set up Muninn, just signed up, memory is empty, session_boot returns nothing) and explicit when-not conditions: don't run the interview if verified:false or hasIdentity:true. It also names the alternative tool (muninn_session_boot) and the required follow-on tool (muninn_memory_add).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_picture_upload_directAInspect
Save photos YOU can already read as a picture memory: photos the user attached in this chat that are on your sandbox disk, or files in a working directory. Needs network access to https://munn.is; if your code cannot reach it, use muninn_picture_upload_start so the user picks them instead. Returns {memoryId, endpoint, header, how, expiresAt, maxFiles}. Upload each photo with one POST to endpoint, multipart/form-data with two file fields: 'orig' (the photo bytes, unchanged) and 'thumb' (a JPEG you make, long edge 480 px, at most 100 KB), plus the header. Up to 7 photos, JPEG, PNG or WebP, 10 MB each, within 15 minutes. Then call muninn_picture_view with memoryId and muninn_picture_upload_finish. Nothing is a memory until finish runs.
| Name | Required | Description | Default |
|---|---|---|---|
| maxFiles | No | How many photos this memory will hold, 1 to 7. Omit for 7. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation/safety profile (readOnly=false, idempotent=false, destructive=false). The description adds substantial context beyond them: the external network requirement, the raw POST contract with field names, size/format/count limits (7 photos, 10 MB, JPEG/PNG/WebP, 15-minute expiry), the returned field shape, and the crucial lifecycle note that 'Nothing is a memory until finish runs.'
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 alternative, then the return shape, then the mechanics. Every sentence carries operational detail and none is filler, though the density is high and a couple of clauses could be tightened.
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 upload flow with no output schema, the definition compensates by enumerating the returned fields ({memoryId, endpoint, header, how, expiresAt, maxFiles}) and the exact HTTP mechanics an agent must execute. Nothing needed 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 100% and the single parameter (maxFiles, 1-7, default 7) is fully documented there. The description only echoes the count limit ('Up to 7 photos') without adding syntax or meaning beyond the schema, so the 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?
States a specific verb and resource ('Save photos ... as a picture memory') and immediately scopes which photos qualify ('photos YOU can already read ... on your sandbox disk, or files in a working directory'). It explicitly distinguishes itself from the sibling muninn_picture_upload_start, so an agent can route 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?
Gives an explicit condition for using the alternative: 'if your code cannot reach it, use muninn_picture_upload_start so the user picks them instead.' It also brackets the workflow by naming the follow-up calls (muninn_picture_view, muninn_picture_upload_finish), leaving nothing about when-to-use to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_picture_upload_finishAInspect
Write the picture memory after the user's photos arrived (check with muninn_picture_view first). The note is written in this session: what the photos show and what the moment was, in the user's words where you have them. Fill when, where and who only from what you actually know, and label each with its source: whenSource 'photo' (takenAt from muninn_picture_view), 'user' (they told you) or 'upload_time' (a photo just taken in the app, where upload time is capture time); whereSource 'user', 'device' (your device location tool, only when the user says the photo was taken here and now) or 'photo'. When the in-chat picker sent the fields, its labels map directly: 'When (from the photo's own metadata)' is whenSource 'photo', 'When (I said)' and 'Where (I said)' are 'user'. Never guess a place or a name from the pixels. The memory is tagged 'picture' plus your tags. Returns {success, memoryId, pictures}. Deleting this memory later deletes its photos.
| Name | Required | Description | Default |
|---|---|---|---|
| who | No | People in or behind the photos, as the user named them. | |
| note | Yes | The memory's text: what the photos are and what the moment meant. | |
| tags | No | Tags, as for muninn_memory_add. 'picture' is added for you. | |
| when | No | When the photos were taken: ISO date or date-time, e.g. 2026-09-29 or 2026-09-29T17:58:30+07:00. | |
| where | No | Where the photos were taken, as a place name or address. | |
| project | No | Project slug, as for muninn_memory_add. | |
| memoryId | Yes | The memoryId from muninn_picture_upload_start or _direct. | |
| whenSource | No | Where `when` came from. Required with `when`. | |
| whereSource | No | Where `where` came from. Required with `where`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare write/non-idempotent/non-destructive, so the description meaningfully adds: the note is session-scoped ('written in this session'), the return shape {success, memoryId, pictures}, and the cascade side effect ('Deleting this memory later deletes its photos'). It does not cover failure modes or what happens if photos have not actually arrived, despite the 'check with muninn_picture_view first' precondition.
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 action and the precondition before the labeling rules, and most sentences carry distinct information. It is dense and slightly run-on in the source-label enumeration, but nothing is padding given 9 parameters.
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 disclosing the return payload and the deletion cascade, and it ties the tool into the surrounding flow (view/start/direct, memoryId provenance, 'picture' auto-tag). An agent has everything it needs to finalize a picture memory 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?
Well beyond the 100%-coverage schema: it defines the pragmatic meaning of each whenSource/whereSource enum value, gives the rule for 'upload_time' (capture time equals upload time in-app), and maps the in-chat picker labels directly onto source values. It also adds a constraint ('Never guess a place or a name from the pixels') that the schema cannot express.
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 the picture memory') and situates it in the upload flow ('after the user's photos arrived'). It distinguishes itself from the generic memory siblings via the 'picture' tag and the memoryId lineage from _upload_start/_direct, though it never explicitly contrasts with muninn_memory_add.
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 ('check with muninn_picture_view first'), names the flow tools behind memoryId, and maps picker labels onto whenSource/whereSource values. It never states when NOT to use this tool or explicitly routes users to muninn_memory_add for non-picture memories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_picture_upload_startAInspect
Upload photos to Muninn: shows a photo picker inside the chat so the user picks the photos there, with nothing attached first. Use whenever the user wants to upload, save, add or keep a photo or picture in Muninn (a moment, a trip, a family picture) and has NOT already attached it in this chat. Never ask the user to attach a photo instead of calling this. If the photos are already attached here and your code can read them, use muninn_picture_upload_direct instead. Returns {memoryId, uploadUrl, expiresAt, maxFiles}. In chats that show app widgets a photo picker appears with this result and posts a message for the user when they finish; tell the user to pick photos in it, and give uploadUrl as a link in case no picker appears. Up to 7 photos, JPEG, PNG or WebP, 10 MB each, for 15 minutes. Photos picked this way keep their original date and camera. When the user is done, call muninn_picture_view with memoryId, then muninn_picture_upload_finish. Nothing is a memory until finish runs.
| Name | Required | Description | Default |
|---|---|---|---|
| maxFiles | No | How many photos this memory will hold, 1 to 7. Omit for 7. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only flag it as a non-idempotent write), the description discloses the picker/widget behavior, that a message is posted for the user, the return shape {memoryId, uploadUrl, expiresAt, maxFiles}, constraints (7 photos, JPEG/PNG/WebP, 10 MB, 15 minutes), metadata preservation, and the crucial state fact that nothing becomes a memory until finish runs.
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 long but front-loads the core action and routing rule, then stacks return values, constraints, and workflow in sequence. Nearly every sentence earns its place, though the return-value and workflow details could be tightened slightly.
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 no output schema, the description fully covers the return object, the multi-step completion workflow, UI behavior, and hard constraints. An agent has everything needed to call it and guide the user afterward.
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?
There is only one optional parameter and the schema already documents it at 100% coverage, including the 'Omit for 7' default. The description's 'Up to 7 photos' reinforces maxFiles but adds no syntax or meaning beyond the schema, 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?
The description states a specific verb and resource (upload photos to Muninn) and explains the mechanism (in-chat photo picker). It explicitly distinguishes itself from the sibling muninn_picture_upload_direct based on whether photos are already attached.
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 trigger conditions ('whenever the user wants to upload, save, add or keep a photo... and has NOT already attached it'), an explicit exclusion ('Never ask the user to attach a photo instead'), and names the alternative tool plus its selecting condition. It also spells out the surrounding workflow (view, then finish).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_picture_viewARead-onlyIdempotentInspect
See the photos of a picture memory, or of an upload that has not been finished yet. Returns each photo's thumbnail as an image, plus JSON {memoryId, pictures: [{ord, mime, takenAt, camera, viewUrl, artifactRef}], viewLinksExpireAt}. takenAt and camera are read from the original photo when it carries them (photos picked through the upload page usually do; photos sent through a chat usually do not), so a takenAt here is a date with source 'photo'. viewUrl opens the full original for the user and stops working after 5 minutes, so hand it over now and never save it into a memory. To show a photo inside an HTML artifact, put its artifactRef in an (append /thumb for the 480px version): the artifact renders it for the owner, and publishing copies it, metadata stripped, so the public page shows it through links that expire within the hour. Never put viewUrl or image bytes in an artifact. Use after the user uploads, before writing the note, and whenever the user asks to see a picture memory again.
| Name | Required | Description | Default |
|---|---|---|---|
| memoryId | Yes | The memoryId returned by muninn_picture_upload_start or _direct, or the id of a picture memory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the read-only/idempotent/non-destructive profile, but the description goes well past them: viewUrl expires after 5 minutes and must not be persisted, artifactRef renders for the owner, publishing strips metadata and yields hour-long links, and takenAt/camera provenance depends on upload path. This is unusually rich operational context.
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 and return shape are front-loaded, and most sentences carry unique operational information. It is dense and slightly long, and the artifact-publishing/expiry theme is touched twice, but little is genuinely 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?
With no output schema, the description itself specifies the return JSON fields and adds the constraints (link expiry, artifact embedding rules) an agent needs. Nothing material for correct invocation 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 100% for the single memoryId parameter, and the description mostly restates its origin (upload_start/_direct or a picture memory id) rather than adding new meaning. Baseline 3 is appropriate when the schema carries the parameter 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?
Opens with a specific verb and resource: 'See the photos of a picture memory, or of an upload that has not been finished yet.' It clearly distinguishes itself from the picture_upload_* siblings by covering the post-upload/pre-finish viewing case, so an agent can route to it 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?
Gives explicit timing: 'Use after the user uploads, before writing the note, and whenever the user asks to see a picture memory again.' It also states prohibitions ('never save it into a memory', 'Never put viewUrl or image bytes in an artifact'), which function as when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_reconcileADestructiveIdempotentInspect
Scan all memories for orphan/inconsistency issues across KV, D1 tag index, and Vectorize. Pass repair:true to fix gaps. Returns a report of what was found and (if repair) what was fixed. For large accounts, pass limit + cursor to process one batch per call (a Worker invocation caps at 1000 subrequests) — the report's nextCursor feeds the next call until it's null. With reindexAll:true every memory's vector is re-embedded unconditionally (used for the vector-id format migration) instead of only re-embedding vectors detected as missing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max memories to process this call. Omit to process ALL (may exceed the Worker subrequest cap on large accounts). Use ~150 for batched migration. | |
| cursor | No | KV pagination cursor from a previous call's nextCursor. Omit for the first batch. | |
| repair | No | If true, repair gaps: re-index missing D1 tags and re-embed missing Vectorize vectors. If false, report only. | |
| reindexAll | No | If true (with repair), re-embed + re-upsert EVERY memory's vector unconditionally — skips the existence probe (saves one AI call + one query per memory). Use for the vector-id format migration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: the Worker subrequest cap, one-batch-per-call semantics with nextCursor chaining, and exactly what repair vs reindexAll mutate. It does not explicitly warn about the destructiveHint=true annotation (what gets overwritten), which is a minor gap given the annotation already flags it.
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 purpose, then pagination mechanics, then the reindexAll special case. Every sentence carries information, though the final reindexAll sentence is dense and could be tighter.
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, no-required-param maintenance tool with no output schema, the description covers invocation modes, batching workflow, migration path, and summarizes the return (a report of found/fixed items plus nextCursor). 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 100%, so the baseline is 3, but the description adds genuine meaning: cursor is tied to the previous call's nextCursor, limit is the batch control, and reindexAll's migration purpose plus its 'skips the existence probe' behavior. This goes beyond the schema descriptions rather than restating them.
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) plus resource and scope: 'all memories for orphan/inconsistency issues across KV, D1 tag index, and Vectorize.' This is precise enough to separate it from sibling tools like muninn_mirror_reconcile, which operates on a different resource.
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 when-to-use guidance for each mode: repair:true to fix vs report-only, limit+cursor for large accounts due to the 1000-subrequest cap, and reindexAll:true specifically for the vector-id format migration. It does not name a sibling alternative or state when not to run it, so it stops 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.
muninn_render_bundleARead-onlyIdempotentInspect
Render a bundle (an ordered outline of memories for a book or project) as one readable document. format='md' gives the outline as markdown, in order. format='tree' gives a compact outline of slugs. format='okf' gives the bundle as JSON in the OKF v0.1 export format. With format='tree', show_keys adds each item's key and memory id, so a follow-up edit needs no extra lookup.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format: 'md' (markdown), 'tree' (ASCII), 'okf' (OKF v0.1 JSON) | md |
| rootKey | Yes | The node_key of the bundle root | |
| show_ids | No | (md only) Append the memory ID to each heading | |
| show_keys | No | (tree only) Append [node_key=… memId=…] to each line so one tree call is enough to reslug/repoint/delete without a separate bundle_get. | |
| child_separator | No | (md only) Separator between children | --- |
| child_heading_level | No | (md only) Heading level for memory-backed nodes | |
| include_descriptions | No | (md only) Emit bundle and folder descriptions | |
| section_heading_level | No | (md only) Heading level for section/folder nodes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description goes beyond that by disclosing what each output mode yields and that show_keys embeds keys and memory ids to avoid a second lookup — real behavioral context the annotations cannot express.
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?
Four sentences with the core action front-loaded and no filler; each sentence maps to a format mode or the show_keys affordance. It is slightly repetitive in enumerating formats that the enum already lists, 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 an 8-parameter, 1-required read tool with no output schema, the description covers what the primary output shapes look like and what the most consequential flag (show_keys) does. The remaining optional md-only knobs are fully specified in the schema, so no critical gap is left, though the sibling overlap with bundle_export_okf is unaddressed.
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 a baseline of 3 would be defensible, but the description adds genuine meaning: it explains that 'tree' is a compact outline of slugs and that show_keys exists specifically to make a follow-up edit possible without an extra bundle_get. That is rationale, not just a restatement of 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 (render) and resource (bundle), and the parenthetical defines the domain object ('an ordered outline of memories for a book or project'), so an agent knows exactly what is being produced. It does not, however, differentiate itself from the sibling muninn_bundle_export_okf, which the 'okf' format appears to overlap 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?
Gives clear context for choosing among the three format modes (md = readable markdown in order, tree = compact slug outline, okf = JSON export), plus a concrete reason to enable show_keys for a follow-up edit. It stops short of naming when-not-to-use-it or routing to alternatives such as bundle_get or bundle_export_okf.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_session_bootARead-onlyIdempotentInspect
Load the user's saved Muninn context. Use it when the user asks what you remember, wants to continue earlier work, refers to something only their history would explain, or when their own instructions ask you to load Muninn at the start of a conversation. Tell the user in one line that you loaded it. DATA SENT: the query text goes to Muninn's servers, where it is used to search the user's memories. It is used for that search only and is not stored. Write the query yourself as a short topic drawn from the user's request, never their message pasted verbatim, and leave it empty when no search is needed. Returns {sessionState, identity, coreRules, relevant, mostAccessed, carryover, skills, persona, taskMemories, taskMemoryErrors}. Everything returned is the user's own stored content (including any chat summaries they set up) plus Muninn's built-in skills, for you to use as context. identity holds the identity notes the user saved. coreRules holds the user's global core-ref memories (plus project-scoped ones when project is set): notes the user saved about how they like to be helped. skills is a <muninn_skills> XML block listing the skills the user saved, plus Muninn's own built-in skills. identity, coreRules and skills come only from this account and Muninn's built-in skills, never from another user. relevant is the semantic search result for the query; if the user belongs to a team, it can also include memories another member chose to share with them. mostAccessed is an array of {memoryId, accessCount, preview, project} for the most-fetched memories (project-filtered), ranked by recall x recency, between 10 and 30 entries; each entry is preview-only, so use muninn_memory_get for the full body. persona, when non-null, is the rendered markdown of the user's persona- bundle: the voice and identity they saved for that persona. FOCUS BOOT: pass memoryIds to load exactly those memories in full as taskMemories; sessionState, relevant and mostAccessed then default to off, and includeSessionState/includeRelevant/includeMostAccessed:true turns any of them back on. taskMemoryErrors lists any anchor id that was ambiguous (with candidates) or missing. carryover holds notes from an unfinished session; it is returned but not cleared (the muninn-checkpoint-resume skill backs it up to session-history and then clears it).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | A short topic you write from the user's request, used to search their memories. Never the user's message pasted verbatim. It is sent to Muninn's servers for this search and not stored. Pass empty to skip the search. | |
| persona | No | Persona name from 'MUNINN persona:' directive. When set: server renders the 'persona-<name>' bundle in parallel and returns it as the persona field. Returns null if the slug isn't found — no hard failure. Omit when there is no declared persona. | |
| project | No | Project slug from 'MUNINN project:' directive. When set: sessionState is FILTERED to this project plus global (no-project) checkpoints, booted project first — other projects' checkpoints do not load; relevant search boosts project memories; carryover filters to this project only. Identity and skills stay global. Omit for global boot. | |
| memoryIds | No | Anchor memories for a FOCUSED boot — full or short-form (8-char) ID prefixes. When present, these are returned in full as taskMemories AND focus mode kicks in: sessionState, relevant, mostAccessed default to OFF. Use this to start a clean window pointed at exactly the memories the task needs. | |
| includeRelevant | No | Force the relevant (semantic search) section on/off. Defaults: ON in normal boot, OFF in focus boot. A semantic search still only fires if query is non-empty. | |
| includeMostAccessed | No | Force the mostAccessed section on/off. Defaults: ON in normal boot, OFF in focus boot. | |
| includeSessionState | No | Force the sessionState section on/off. Defaults: ON in normal boot, OFF in focus boot (when memoryIds is set). Set true to keep the where-we-left-off checkpoints even in a focused window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, yet the description adds material context beyond them: the query text is sent to Muninn's servers and not stored, preview-only entries require muninn_memory_get for full bodies, carryover is returned but not cleared, and taskMemoryErrors reports ambiguous/missing anchor ids. It also explains account scoping (team-shared memories, no cross-user leakage).
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 payload description, and every section maps to real behavior. It is long and slightly redundant (the DATA SENT sentence duplicates the query parameter's schema description), but given ten returned fields the length is largely earned.
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, and the description fully documents the returned shape (sessionState, identity, coreRules, relevant, mostAccessed, carryover, skills, persona, taskMemories, taskMemoryErrors) including the focus-mode override semantics. Nothing an agent needs to call and interpret this tool 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 100%, so the baseline is 3. The description largely restates schema content (query authoring, focus mode defaults, include* toggles); its only genuinely additive parameter-adjacent detail is the anchor-error behavior via taskMemoryErrors, which is not enough to clearly exceed the baseline.
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: 'Load the user's saved Muninn context,' which is distinct from sibling tools like muninn_memory_search or muninn_memory_get. It also enumerates the return payload, so an agent can tell this is the session-bootstrap tool rather than a targeted memory fetch.
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 a rich trigger list (user asks what you remember, wants to continue earlier work, refers to history-only facts, or instructions say to load at conversation start) and describes the focus-boot alternative when memoryIds is passed. It does not state an explicit when-not or compare against the nearest sibling (muninn_memory_search) for ad-hoc lookups, so it falls just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_settings_getARead-onlyIdempotentInspect
Retrieve the current user's settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile fully. The description adds only the scoping detail that these are the *current user's* settings (per-user rather than team/global), which is genuinely useful but thin; it says nothing about return format or what settings are included, though no output schema exists to carry that.
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?
A single nine-word sentence with no filler, front-loading the verb and the scope. Nothing is redundant and nothing is buried.
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 trivial zero-parameter getter with rich annotations, the description is close to sufficient, but with no output schema it never hints at what the returned settings contain or how an agent should interpret them, leaving a small but real 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 per the rubric the baseline is 4. The description correctly implies no inputs are needed to scope the call, and there is no parameter information it needed to 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?
States a specific verb (Retrieve) and resource (settings) with a scope qualifier (current user's), making the read-vs-write split from muninn_settings_update obvious. It does not explicitly name the sibling, but the verb alone disambiguates 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?
There is no explicit when-to-use or when-not-to-use guidance, and no alternatives are named. Usage is only implied by the verb 'Retrieve' in contrast to the sibling muninn_settings_update, which is adequate but minimal for an operation this simple.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_settings_updateADestructiveIdempotentInspect
Update user settings. Merges with existing settings — only specified fields are changed.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Preferred language e.g. en, th | |
| timezone | No | User timezone e.g. Asia/Bangkok |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, destructive, idempotent and closed-world, so the safety profile is covered. The description adds genuinely non-structured context — that this is a partial merge where unspecified fields are preserved — which is the key behavior an agent needs before calling it.
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, zero waste, with the merge constraint placed immediately after the purpose so the most important behavioral fact is 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?
For a two-optional-parameter settings tool with full annotation coverage and no output schema, this is nearly complete. Minor gaps remain: whether the response returns the resulting settings, and how unknown keys are handled.
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% and both optional parameters (language, timezone) are documented with examples in the schema itself. The description's merge statement reinforces that omitted fields are untouched, but adds no format or validation detail beyond 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 (update) and resource (user settings), so the agent knows exactly what changes. It does not differentiate itself from the obvious sibling muninn_settings_get, but the mutation intent is unmistakable.
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 only implied: an agent can infer 'call this to change settings' but the description never says when to prefer it, nor points to muninn_settings_get for reading current values first. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_skill_checkARead-onlyIdempotentInspect
Check whether installed Muninn skills are up to date. Send the skills you currently have loaded with their skill-version stamps; returns which are outdated, current, or unknown. Only reports on skills you name.
| Name | Required | Description | Default |
|---|---|---|---|
| installed | Yes | The Muninn skills currently loaded, with their version stamps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered structurally. The description adds genuine behavioral detail beyond that: the three outcome categories (outdated, current, unknown) and the important scoping caveat that unnamed skills are not evaluated. It omits nothing critical but adds no auth or rate-limit context.
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 short sentences, each load-bearing: purpose first, invocation/input second, output and scope third. No filler or redundancy, and the most decision-relevant information is 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?
There is no output schema, so the description correctly compensates by naming the return categories (outdated, current, unknown) and the reporting scope. For a single-parameter, non-destructive read tool this is nearly sufficient; only the absence of guidance on versionless skills (covered in the schema, not the prose) keeps it from a 5.
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% for the single 'installed' parameter, including per-field docs for name and version. The description restates the same contract ('skills you currently have loaded with their skill-version stamps') without adding format, ordering, or size guidance beyond the schema, 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?
Specific verb + resource ('Check whether installed Muninn skills are up to date') with an added scope statement ('Only reports on skills you name'). An agent can immediately distinguish this read-only freshness check from muninn_skill_create, muninn_skill_update, and muninn_skill_delete 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?
Sets up the usage context clearly ('Send the skills you currently have loaded with their skill-version stamps') and bounds the scope to named skills, so the agent knows what input scenario triggers it. It stops short of naming an explicit alternative (e.g., muninn_skill_registry) or stating when-not to use it, so it does not reach the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_skill_createAIdempotentInspect
Create a new Muninn-native skill from name, description, and body. Stores two memories (entry + body), wires them by ID, and makes the skill available in the next session_boot. Returns entryId and bodyId.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Full skill body: trigger phrases, steps, examples. | |
| name | Yes | Skill name slug e.g. 'muninn-status'. Must be unique. | |
| description | Yes | Trigger description ≤300 chars — shown in the <muninn_skills> list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=false. The description goes beyond these by disclosing the internal mechanics (stores two memories, wires them by ID) and the deferred effect (available in next session_boot), which is real value the annotations don't carry. It does not address naming collisions or failure behavior for a duplicate name.
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 purpose, then side effects, then return values. No filler; every sentence carries distinct 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?
With no output schema, the description usefully names the return values (entryId and bodyId). Combined with full schema coverage and annotation-provided safety profile, an agent has nearly everything needed. It stops short of explaining duplicate-name handling or what 'wires them by ID' implies for later updates.
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%; each of name, description, and body is documented in the schema with slugs, length limits, and content expectations. The description only restates the parameter names without adding syntax or format meaning, so 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?
States a specific verb+resource: 'Create a new Muninn-native skill from name, description, and body.' It is clearly distinguishable from siblings like muninn_skill_update, muninn_skill_delete, and muninn_skill_check 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?
Usage is implied by the verb (you create when a skill doesn't yet exist), and it notes the skill appears in the next session_boot. However, it never explicitly contrasts with muninn_skill_update or muninn_skill_registry, nor states when-not to use it, so no alternative routing guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_skill_deleteADestructiveIdempotentInspect
Permanently delete a Muninn-native skill by name. Removes both the entry and body memories from all storage layers.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Skill name slug to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuine value beyond that by disclosing scope of destruction: 'Removes both the entry and body memories from all storage layers,' which an agent could not infer from the annotations 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?
Two short sentences, front-loaded with the operation and followed by the destruction scope. No filler, no 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?
For a one-parameter, no-output-schema tool whose annotations already cover the safety profile, the description is essentially complete: it names the target, permanence, and what is removed. It could go further on failure behavior (e.g., deleting a non-existent skill), but that gap is 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 coverage is 100% and the single parameter is documented as a 'Skill name slug to delete.' The description's 'by name' restates the schema without adding slug format, resolution behavior, or error semantics, so the 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?
States a specific verb (permanently delete), resource (a Muninn-native skill), and selector (by name). The qualifier 'Muninn-native' scopes the resource, and no sibling tool competes for skill deletion, so an agent can select it unambiguously.
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 gives no when-to-use guidance, no prerequisites (e.g., confirmation, ownership), and no exclusions or alternatives (muninn_skill_update for modification). The word 'Permanently' hints at caution but stops short of telling the agent when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_skill_registryARead-onlyIdempotentInspect
List the skills saved in Muninn, as a <muninn_skills> XML block (name, description and location of each): this account's own skills, plus Muninn's built-in ones. Never another user's. Consult a skill when the user's request matches it: open its instructions with muninn_memory_get, passing the id at the end of its location. Use it to see the user's current skills mid-session, for example right after they create one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's added value is the exact return shape (a <muninn_skills> XML block with name/description/location) and the scope exclusion ('Never another user's'). It does not mention pagination, size limits, or auth requirements, so it stops short of full 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?
Three sentences, front-loaded with the verb and output format, and each sentence carries a distinct idea (what/scope, how to use the result, when to call). The clauses are densely packed, but no line is 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?
With no output schema, the description compensates by describing the return format and per-item fields. Combined with zero parameters and full annotation coverage, an agent has everything needed to decide when to call this and what it will receive.
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 (empty object schema), so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly avoids inventing parameter guidance.
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 (list) and resource (skills saved in Muninn), and immediately scopes the result set: this account's own skills plus built-ins, never another user's. An agent can distinguish it from the skill_create/delete/update/check siblings 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 when-to-use ('mid-session, for example right after they create one') and when-to-consult-a-skill ('when the user's request matches it'), plus the concrete follow-up (open instructions via muninn_memory_get using the id at the end of the location). That is a full routing path, not just a context hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_skill_updateADestructiveIdempotentInspect
Update an existing Muninn-native skill's body and/or description. Finds the skill by name, updates whichever fields are provided, regenerates embeddings. Does not recreate the memories.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | New full skill body. Omit to leave unchanged. | |
| name | Yes | Skill name slug to update. | |
| description | No | New description ≤300 chars. Omit to leave unchanged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true, readOnly=false, so the safety profile is covered. The description adds real context beyond them: it regenerates embeddings as a side effect, it performs a partial update (only provided fields change), and it explicitly does not recreate associated memories. It still does not say what happens when the name is not found or what gets 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 short sentences, zero waste, front-loaded with the action and scope before the side-effect and non-effect details. Every sentence carries distinct 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 mutation tool with no output schema, annotations covering the safety hints, and full schema coverage, the description is close to sufficient: it covers lookup key, partial-update semantics, embedding regeneration, and memory scope. Error/not-found behavior and the response shape remain unspecified, a minor gap given the 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 100%, so the baseline is 3. The description only reinforces the schema ('by name', 'body and/or description', optional omission leaves fields unchanged) without adding format or constraint detail beyond what the schema already documents.
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 (Update), resource (an existing Muninn-native skill), and the exact fields in scope (body and/or description), with 'existing' implicitly separating it from muninn_skill_create and muninn_skill_delete. An agent can select this over its skill siblings 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 explains the mechanism ('Finds the skill by name, updates whichever fields are provided') and scopes what it does not do ('Does not recreate the memories'), so usage is implied. But there is no explicit when-to-use vs. muninn_skill_create/muninn_skill_check routing or statement of prerequisites (e.g., skill must already exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_statsARead-onlyIdempotentInspect
Return aggregate corpus statistics for the current user — the shape of the whole memory, counted server-side (no pagination, no bodies read). Fields, in Muninn's own terms: memories (total); associations (bundle edges — the graph, split into contains/reference); bundleNodes and bundleRoots; identity (core-ref+identity memories); instructions (core-ref memories); personas (persona-* bundles); skills; projects and tags (distinct counts — Muninn's open-vocabulary axes, not a fixed type schema); plus byProject and byTag distributions. Use this to answer 'how big is my memory', to show a live corpus snapshot, or to compare against another memory system.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, but the description adds real behavioral context: counting happens server-side, with no pagination and no memory bodies read. That tells the agent this is cheap and complete, not a sampling call.
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 purpose, then a dense field enumeration. It is long, but with no output schema each listed field earns its place by describing the return shape.
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 there is no output schema, the description takes on the burden of describing return values, and it does so field by field (memories, associations, bundleNodes, byProject, byTag). Muninn-specific terms are glossed well, so an agent understands what it will receive.
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?
Zero parameters, so the schema carries no semantics to be explained. Baseline is 4; there is nothing for the description to compensate for.
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 ('Return aggregate corpus statistics') and scopes it to the current user, immediately distinguishing it from the many list/get siblings. An agent can tell this is a read-only aggregate snapshot, not a paginated listing.
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 three concrete use cases ('how big is my memory', live corpus snapshot, compare against another system). It does not explicitly name an alternative tool it should be preferred over (e.g. muninn_memory_list), but the intent is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_defineADestructiveIdempotentInspect
Declare a table (a kind of thing you want to track — Staff, Sources, Clients) and the fields its records share. Re-calling with the same slug UPDATES the definition: fields you pass replace the current set, so send the whole list, not a delta. Field key is permanent and is what record values are stored under; label is what a human sees and can be renamed freely. Mark a field private:true to keep it out of the grid, out of csv/xlsx export, and out of any team-shared view — private values never leave the encrypted record body. Field types: text, textarea, number, date, select, multi-select, checkbox, nested-table. Use textarea for anything that runs to more than a line — notes, a description, an address, a bio: it stores exactly like text and tells the app to give it a multi-line box instead of a single-line input.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Human-readable name, e.g. 'Staff'. Renameable. | |
| fields | Yes | The full field list, in display order. Replaces any existing definition. | |
| tableSlug | Yes | Stable identifier, e.g. 'bui-staff'. Permanent — this is how records are filed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: explains that re-calls replace (not merge) fields, that `key` is permanent and orphaning risk, that `label` is freely renameable, and precisely what private:true excludes (grid, csv/xlsx export, team views, and that values stay in the encrypted body). This is rich behavioral context annotations alone don't convey.
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 and front-loaded with the update semantics early. Slightly long, especially the trailing textarea explanation and field-type enumeration, but every sentence carries useful 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?
A mutation tool with no output schema, yet the description fully covers replacement behavior, permanence rules, privacy effects, and field type options — everything an agent needs to 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?
Schema coverage is 100%, but the description adds real meaning — permanence of key vs renameability of label, the private flag's downstream effects, and practical guidance on textarea vs text (multi-line box, same storage). Adds value beyond the schema's own 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 (Declare) plus resource (a table) and its fields, with concrete examples (Staff, Sources, Clients). Clearly distinguishable from siblings like muninn_table_record_add or muninn_table_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 documents the critical re-call semantics: calling with the same slug UPDATES the definition and fields replace the current set, so send the whole list not a delta. This is strong when-to/behavioral guidance, though it doesn't contrast with sibling tools like delete or list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_deleteADestructiveIdempotentInspect
Delete a table you declared: its definition and its list of records. The records themselves are kept as ordinary memories (returned as recordMemoryIds), so nothing the user wrote is lost; delete them with muninn_memory_delete only if the user asks. Call only when the user asks to delete or remove a table.
| Name | Required | Description | Default |
|---|---|---|---|
| tableSlug | Yes | The table to delete, as shown by muninn_table_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds a genuinely non-obvious behavioral fact: the underlying records survive as ordinary memories and are returned as recordMemoryIds. It does not cover error cases, permissions, or reversibility of the deletion itself, so it falls 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?
Two tight sentences plus a conditional clause, front-loaded with the action and its scope. The reassurance about records is the one piece of extra information and it earns its place by preventing data-loss anxiety.
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 one fully documented parameter and no output schema, the description supplies the missing return-value information (recordMemoryIds) and the safety semantics of the deletion. Nothing an agent needs to invoke this correctly is absent.
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?
There is a single parameter with 100% schema description coverage, and the schema already explains tableSlug and points to muninn_table_list. The description adds no format or syntax detail beyond the schema, 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 (delete) and resource (a table you declared), and immediately clarifies the scope of deletion: the definition plus the record list. This distinguishes it from muninn_table_define, muninn_table_list, and muninn_memory_delete 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?
Explicitly states the triggering condition ("Call only when the user asks to delete or remove a table") and names the alternative tool (muninn_memory_delete) along with the condition under which it should be used instead. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_feedsARead-onlyIdempotentInspect
List this account's published tables with their addresses, field allowlists, locks and expiries - use when the user asks what data of theirs is public, which tables are published, or wants the URL of a feed again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so safety is covered; the description adds what the response actually contains (addresses, allowlists, locks, expiries). It doesn't mention auth requirements or pagination, which keeps it from 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?
One sentence, front-loaded with the operation and resource, then the returned facets and the usage triggers. No filler or repetition of the title/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?
With no parameters, a rich annotation set, and no output schema, the definition supplies exactly what an agent needs: what is listed and when to reach for it. Nothing material is absent.
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 rubric the baseline is 4; there is nothing for the description to disambiguate.
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 ('List') and a precise resource ('this account's published tables') and enumerates the returned facets (addresses, field allowlists, locks, expiries). The 'published' qualifier cleanly distinguishes it from the sibling muninn_table_list, which lists tables generally.
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 three concrete trigger conditions ('what data of theirs is public', 'which tables are published', 'wants the URL of a feed again'), which is strong when-to-use guidance. It stops short of naming an alternative tool to rule out, so it isn't a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_listARead-onlyIdempotentInspect
List every table you have declared, with its fields and how many records each holds. Counts are top-level records only — entries in a nested table are not counted as records of the parent table. Use this before adding a record, to check the table exists and to see what fields it expects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral context: the counting rule that nested table entries are not counted as parent records, which the agent could not infer from annotations or 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?
Three short sentences, front-loaded with the core action and output, then the counting caveat, then the usage trigger. No filler and nothing repeated from 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?
With no output schema, the description still tells the agent what a call returns (tables, their fields, record counts) and clarifies the counting edge case. Nothing material is missing for a zero-parameter read 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?
There are zero parameters and 100% schema coverage, so nothing needs documenting and the baseline is 4. The description adds no parameter detail because none exists, which is correct.
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 ('List every table you have declared') and adds the two payload elements (fields and record counts), which makes it trivially distinct from record-level siblings like muninn_table_records_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?
It gives a concrete trigger statement: 'Use this before adding a record, to check the table exists and to see what fields it expects.' That is a clear when-to-use, but there are no explicit when-not conditions or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_publishADestructiveIdempotentInspect
Publish a table's records as a live public data feed and page - use when the user says publish this table, share this table, put this board online, give me a URL for this data, or wants a chart or dashboard to read a table without an agent copying it. Returns an unguessable munn.is link that serves the named fields as JSON at /raw and as a rendered table at . The copy stays LIVE: adding or editing a record updates what the link serves. YOU MUST NAME THE FIELDS - there is no way to publish every field, a field added later stays out until you publish again naming it, and a field marked private is refused. Records are capped at 1000 and a large table finishes assembling over one or more muninn_table_refresh calls. Optionally pass name for a readable address under the user's handle (a new name needs the Paid plan; the token link is free), password to gate it, and expiresAt to make it stop. muninn_table_unpublish revokes it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional readable name, e.g. 'worklist' - becomes <handle>.munn.is/worklist. Letters, numbers and hyphens only. A new or changed name needs the Paid plan; publishing itself does not. Publishing still succeeds if the name is rejected. | |
| fields | Yes | The exact field keys to publish, in the order the page shows them. Required, with no wildcard: this is the allowlist, and it is the whole safety of the feature. Private fields are refused by name. | |
| password | No | Optional password a reader must type before the page opens, and before /raw answers. Only pass one the user actually stated. It can never be read back - say it to the user now. | |
| expiresAt | No | Optional ISO 8601 moment the feed stops serving. Pass null to remove an existing expiry. | |
| tableSlug | Yes | Which table to publish. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (destructiveHint=true, openWorldHint=true, idempotentHint=true), but the description adds substantial context the annotations cannot convey: the link is unguessable, the copy is LIVE and tracks edits, private fields are refused by name, records are capped at 1000, large tables assemble over one or more muninn_table_refresh calls, a new/changed name needs the Paid plan, and the password can never be read back. These are exactly the operational facts an agent needs before invoking.
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 triggers, then return shape, then the hard constraint, then optional params - a sensible information order with essentially no filler. It runs long as a single dense block, and the return-format and constraint sentences could be tightened, but every sentence carries weight.
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 output schema, the description covers what it produces (unguessable link, /raw JSON, rendered table), lifecycle behavior (live updates, expiry, password gating, unpublish), limits (1000 records, async assembly), and failure modes (private fields refused, name rejected). 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 100%, so baseline is 3, but the description adds meaning beyond the schema by hammering the safety-critical `fields` semantics ("YOU MUST NAME THE FIELDS - there is no way to publish every field, a field added later stays out until you publish again") and by clarifying that publishing still succeeds if a `name` is rejected and that a password cannot be retrieved. Some of this overlaps the schema text, keeping it short of 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?
States a specific verb+resource ("Publish a table's records as a live public data feed and page") and immediately distinguishes itself from siblings by naming muninn_table_unpublish as the revoke counterpart and by describing the URL/JSON output that no other sibling produces. An agent can route here versus muninn_artifact_publish without opening a 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 natural-language triggers ("publish this table, share this table, put this board online, give me a URL for this data") plus the intent case (a chart/dashboard reading the table without an agent copying it). It also names the inverse tool, muninn_table_unpublish, and states a clear constraint (no wildcard, must name fields), which functions as a when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_record_addAInspect
Add a record to a table. values is keyed by field key (see muninn_table_list). Pass parentRecordId to file this as an entry in the nested table under an existing record — that is how a running log lives under a standing profile. Nesting is capped at one level: a record may hold a nested table, a nested record may not. Returns {recordId} — the record's memory id, which muninn_memory_get and muninn_memory_update accept.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tags. Filing into a table is NOT a tag — it is structural — so no table tag is added for you. | |
| values | Yes | Field values keyed by field key, e.g. {"role":"Engineer","status":"active"}. Unknown keys are rejected. | |
| project | No | Project slug to scope this record. | |
| tableSlug | Yes | Which table to file this record into. Must already be declared. | |
| occurredAt | No | ISO 8601 datetime of when this actually happened, if not now. Useful for backfilling log entries. | |
| parentRecordId | No | Memory id of the parent record. Set this to add an entry to that record's nested table (a log entry under a profile). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: unknown keys are rejected, nesting is capped at one level, and it returns {recordId} usable by muninn_memory_get/update. Annotations already cover the mutation/safety profile (readOnlyHint=false, idempotentHint=false), so this is solid added value, though it doesn't detail failure modes or permissions.
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 dense sentences that front-load the core action, then conditional nesting guidance, then the return value. No wasted 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?
No output schema, but the description explicitly states the return shape ({recordId}). Combined with nesting rules and key-validation behavior, 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 coverage is 100%, so baseline is 3, but the description adds meaning: `values` is keyed by field key, and parentRecordId carries the nested-table semantics. This clarifies how parameters interact beyond the raw 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?
Specific verb 'Add' + resource 'record to a table', clearly distinct from siblings like muninn_table_define (schema creation) and muninn_table_records_list (reading). An agent can immediately tell what this does 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?
Points the agent to muninn_table_list for field keys and explains the parentRecordId condition for filing nested log entries under a standing record. It gives clear usage context but stops short of explicit when-not-to-use guidance or naming a closest alternative to compare against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_records_exportARead-onlyIdempotentInspect
Export a table's records - the other half of muninn_table_records_import, and what makes verifying one possible without resolving every record by hand. Returns recordId as the first column, then the table's fields in their declared order, so an export diffs directly against the file it came from. PRIVATE fields are excluded by default and are NEVER included in csv at all, whatever includePrivate says. Reading bodies costs one subrequest each, so pass limit/offset on a large table; the response says whether more remain.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many records to read in this call. | |
| format | No | json returns rows as objects; csv quotes every field, which is what multi-line and Thai bodies need. | json |
| offset | No | Where to resume from. Use the nextOffset the previous call returned. | |
| tableSlug | Yes | Which table to export. | |
| includePrivate | No | Include fields marked private:true. Ignored for csv, which never carries private values. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses the private-field policy and its csv exception ('NEVER included in csv at all, whatever includePrivate says'), the per-record subrequest cost, and that the response signals remaining data. These are exactly the behavioral traits annotations cannot convey.
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 what the tool is, then layers return shape, privacy policy, and pagination cost in short purposeful clauses. Dense but nearly every sentence adds operational value; mildly long for the surface area.
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 describing the return column order (recordId then fields in declared order) and the pagination signal. An agent has everything needed to call and interpret results 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 already 100%, so the schema documents every parameter including csv quoting and the private-field behavior. The description usefully reinforces the csv-never-private rule and the limit/offset pattern but adds little that the schema does not already carry, matching the baseline for full coverage.
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 ('Export a table's records') and immediately positions it against the sibling import tool, framing export as the verification counterpart. An agent can distinguish it from muninn_table_records_import/list 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?
Names the paired import tool and the verification use case, and gives an explicit condition to paginate ('pass limit/offset on a large table'). It does not, however, clarify when to prefer this over the closely-related muninn_table_records_list sibling, leaving one alternative ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_records_importADestructiveInspect
Import MANY records into one table in a single call. dryRun is TRUE BY DEFAULT - the first call validates and reports what would be written, and nothing is saved until you call again with dryRun:false. Validates the whole batch before writing anything and returns every error at once with its record index, so a bad cell costs one round trip, not one per record. Nothing is coerced: a checkbox field wants true/false, not the string TRUE. Pass upsertKey (field keys forming a natural key) with onConflict:update to make re-running the same import idempotent instead of duplicating everything. Writes are BUDGETED per call - the response carries remaining and nextIndex, and you re-send the tail from there.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags merged into every record's own tags. | |
| dryRun | No | TRUE BY DEFAULT. Validate and report without writing. Pass false to commit. | |
| project | No | Project slug applied to every record that does not set its own. | |
| records | Yes | The records to import, in order. Their INDEX in this array is what error messages and the per-record result refer to. | |
| maxWrites | No | How many records to commit in THIS call. Defaults to 6, which keeps one call within the server's per-call limit. Call again to commit the rest. | |
| tableSlug | Yes | Which table to import into. Must already be declared with muninn_table_define. | |
| upsertKey | No | Field keys forming a natural key, e.g. [source_file, worksheet]. Requires reading existing records, so it is refused on tables larger than 300 rows. | |
| onConflict | No | What to do when upsertKey matches an existing record. Only meaningful with upsertKey. | error |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructive/non-idempotent writes, but the description adds a great deal beyond them: dryRun defaults to true, the whole batch is validated before any write, all errors return at once with record index, values are not coerced, and writes are budgeted with remaining/nextIndex for tail re-sends. That is exactly the operational context an agent needs for a destructive mutation.
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 behavior (bulk import, dryRun default) and then ordered by operational concern: validation, coercion, idempotency, budgeting. Dense but every sentence carries a distinct, actionable fact.
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 still explains the key return signals (per-record errors with index, remaining, nextIndex), so an agent knows how to react to the response. For an 8-parameter destructive bulk tool, 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 coverage is 100%, so baseline is 3, but the description adds real meaning: the upsertKey + onConflict:update pairing that makes re-runs idempotent, the dryRun flow, and the per-call write budget tied to maxWrites. It goes beyond restating the schema without contradicting it.
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?
'Import MANY records into one table in a single call' states a specific verb, resource, and scope. The 'MANY ... in a single call' framing cleanly distinguishes it from the singular sibling muninn_table_record_add without needing to open 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?
Gives clear usage context: use the first call as dryRun to validate, re-call with dryRun:false to commit, and pass upsertKey with onConflict:update when re-running should be idempotent. It never explicitly names the alternative single-record tool, so the when-to-use-vs-sibling guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_records_listARead-onlyIdempotentInspect
List the records in a table, in order. Pass parentRecordId instead to list the nested table under one record (its log). By default returns ids and positions only — cheap, no record bodies read. Pass resolve:true to also return each record's field values; private fields are excluded from resolved values.
| Name | Required | Description | Default |
|---|---|---|---|
| resolve | No | true = also read each record body and return its field values (private fields excluded). | |
| tableSlug | No | List the top-level records of this table. | |
| parentRecordId | No | List the nested table under this record instead. Takes precedence over tableSlug. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/idempotent properties, and the description adds real context beyond them: the default is a cheap ids-and-positions listing that reads no bodies, resolve:true triggers body reads, and private fields are filtered out. It does not mention pagination or limits, keeping it at a 4.
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 primary operation, then the nested case, then the cost/resolve tradeoff. Every clause carries information; nothing is 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?
No output schema exists, so the description must describe return shape — it does, covering both the cheap ids/positions mode and the resolved field-values mode, plus the private-field exclusion. For a 3-param read tool this is sufficient to call 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 is 3, but the description adds meaning: parentRecordId takes precedence over tableSlug (an interaction the schema only implies), resolve is explicitly framed as an opt-in body read, and the nested listing is described as a record's 'log'. This raises it above the baseline.
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?
Starts with a specific verb+resource ('List the records in a table, in order') and immediately distinguishes the nested-table variant via parentRecordId. An agent can separate this from muninn_table_list (tables vs records) and muninn_table_records_export without opening 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?
Gives explicit routing: use parentRecordId to list a nested table / a record's log instead of tableSlug, and resolve:true when bodies are needed. It stops short of stating when-not to use the tool or naming a preferred alternative for large listings, so it falls just below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_refreshADestructiveIdempotentInspect
Continue building a published table's public copy, or rebuild it from scratch - use after muninn_table_publish says records remain, or when a table was changed by something other than the record tools and the feed looks stale. Reads up to 100 record bodies per call and reports how many remain. In normal use a feed needs no refreshing at all: adding, editing and deleting records patch the public copy as they go.
| Name | Required | Description | Default |
|---|---|---|---|
| rebuild | No | Start again from the first record, discarding the current copy's rows. Use when the table was edited outside the record tools. | |
| tableSlug | Yes | Which published table to continue building. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true; the description complements this with concrete behavior: batching at up to 100 record bodies per call, reporting how many remain, and that record edits normally patch the copy automatically. It does not spell out that rebuild discards existing rows in the prose (that lives in the schema), so slightly short of full coverage.
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, followed by the triggering condition, throughput behavior, and the important reassurance that routine edits patch the feed automatically. No wasted words.
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 carries the return-value burden and does so by stating it 'reports how many remain'. Combined with annotations covering destructiveness and open-world behavior, the definition is close to complete, though it omits any note on permissions or failure modes for a rebuild.
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 both parameters (tableSlug, rebuild) are already fully documented, including the discard semantics of rebuild. The description adds the practical throughput note (100 records per call) but no additional parameter-level meaning; 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?
States a specific verb and resource ('Continue building a published table's public copy, or rebuild it from scratch') and explicitly distinguishes the two modes. It also names the sibling muninn_table_publish as the trigger, so an agent can route between them without opening 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?
Gives explicit when-to-use conditions ('after muninn_table_publish says records remain', 'when a table was changed by something other than the record tools') and a when-not-to-use signal ('in normal use a feed needs no refreshing at all'). This is exactly the routing guidance an agent needs versus the record tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_table_unpublishADestructiveIdempotentInspect
Stop serving a published table - use when the user says unpublish this table, take this board down, revoke that data link, or make this private again. The address stops answering immediately and the public copy is deleted. The table and its records are untouched. A later publish mints a NEW link: the old one never comes back.
| Name | Required | Description | Default |
|---|---|---|---|
| tableSlug | Yes | Which published table to take down. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: the address stops answering immediately, the public copy is deleted, the underlying table and records remain, and republishing creates a new link while the old one never returns. These details clarify the destructive and idempotent effects declared by annotations without contradicting them.
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 four tight sentences, front-loads the core action, then adds trigger examples and key consequences. Every sentence contributes useful selection or behavioral 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 one-parameter mutation with no output schema, the description covers what happens to the public address, the public copy, the underlying records, and future links. An agent has enough information to invoke it correctly and understand the effects.
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 tableSlug parameter is fully described in the schema as “Which published table to take down,” and the description adds only broad context about the published table. With 100% schema coverage, the schema carries parameter semantics sufficiently; the description does not add format or identifier details.
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: “Stop serving a published table.” It distinguishes the operation from deletion by saying “The table and its records are untouched,” and clearly contrasts with publish by noting a later publish creates a NEW link.
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 user phrases that should trigger it: “unpublish this table,” “take this board down,” “revoke that data link,” or “make this private again.” It does not explicitly name a sibling alternative such as table_delete, but the “records are untouched” line implicitly clarifies when this is not a delete operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_task_addAInspect
Create a task memory — a memory carrying task fields (entityType 'task'). Use for to-dos and calendar-shaped events, not for ordinary notes. taskType 'todo' uses dueDate; taskType 'event' uses startTime/endTime. recurrence is a raw RRULE string (RFC 5545, e.g. 'FREQ=WEEKLY;INTERVAL=2'), stored verbatim and passed through untouched. remindTauDays sets how early this task starts nagging (the urgency ramp) — bigger tasks can warn earlier than the global 3-day default; leave unset to use the default. calendarOnly true puts it on the calendar but never reminds about it (not at boot, not per call, not even overdue): use it for dates to know, not act on. Returns a compact {success, memoryId, length}, same shape as muninn_memory_add.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags for categorization, same as muninn_memory_add. | |
| text | Yes | Task title, optionally followed by a blank line and notes (first line = title). | |
| dueDate | No | ISO 8601 datetime — required for taskType 'todo'. | |
| endTime | No | ISO 8601 datetime — optional for taskType 'event'. | |
| project | No | Project slug to scope this task. Omit for user-global. | |
| taskType | Yes | 'todo' uses dueDate; 'event' uses startTime/endTime. | |
| reminders | No | Reminder specs (VALARM). Omit for no reminders. | |
| startTime | No | ISO 8601 datetime — required for taskType 'event'. | |
| recurrence | No | Raw RRULE string (e.g. 'FREQ=WEEKLY;INTERVAL=2'), stored verbatim. Omit for a one-off task. | |
| calendarOnly | No | true = on the calendar only, never surfaced as a reminder. Omit or false for a normal task that reminds. | |
| remindTauDays | No | Per-task override of the urgency ramp, in days. Omit to use the global default (3 days). A bigger tau means the task starts surfacing earlier relative to its due date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (non-readonly, non-destructive, non-idempotent), so the description carries real weight and delivers: recurrence is stored verbatim/passed through untouched, remindTauDays overrides the global 3-day urgency ramp, and calendarOnly means never reminded even when overdue. It also states 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 purpose then parameter semantics; nearly every clause adds decision-relevant information. It is dense and reads as one long run-on paragraph, but there is no filler sentence to cut.
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 an 11-parameter mutation tool with no output schema, the description covers creation semantics, field coupling, reminder behavior, recurrence handling, and the return shape. 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 100%, so the baseline is 3, but the description goes well beyond the terse schema strings: it explains the urgency-ramp semantics of remindTauDays, the behavioral consequence of calendarOnly ('not at boot, not per call, not even overdue'), and the verbatim RRULE storage. These are meaning-additions, not restatements.
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 ('Create a task memory') and immediately defines the distinguishing trait (entityType 'task'). It explicitly contrasts itself with sibling muninn_memory_add by ruling out ordinary notes, so an agent can pick it without opening a 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 both when-to-use ('to-dos and calendar-shaped events') and when-not ('not for ordinary notes'), and further routes within the tool by taskType (todo -> dueDate, event -> startTime/endTime). The alternative for plain notes is clearly implied via the muninn_memory_add reference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_task_completeAInspect
Mark a task complete. For a recurring task (recurrence set), this does NOT close it — it rolls dueDate forward to the next RRULE occurrence and keeps taskStatus at 'needs-action', so the task reappears for its next occurrence. Only simple FREQ=DAILY/WEEKLY/MONTHLY/YEARLY[;INTERVAL=n] rules can be rolled forward; a more complex RRULE (BYDAY, COUNT, UNTIL, etc.) falls back to closing the task as completed — the response's rolled field tells you which happened.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | The task's memory ID (full UUID or unique 8-char prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only telling us this is a non-destructive, non-idempotent write, the description carries the real burden and delivers: it explains that recurring tasks are NOT closed but rolled to the next RRULE occurrence with taskStatus kept at 'needs-action', lists exactly which RRULE shapes can be rolled, and discloses the fallback (close as completed). It even names the response field (`rolled`) that reveals which path was taken. This is well beyond what the annotations provide.
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 primary action is front-loaded in one short sentence, followed by a dense but relevant second sentence covering the recurring-task exception, the RRULE restriction, the fallback, and how to detect which occurred. No sentence is 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?
There is no output schema, and the description compensates by naming the `rolled` response field and explaining its meaning, which is exactly the information an agent needs to interpret the result. For a one-parameter mutation tool, the description is complete.
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?
There is a single parameter, taskId, and schema coverage is 100%, so the schema already documents that it accepts a full UUID or 8-char prefix. The description adds no syntax or format detail for the parameter itself, which is the expected baseline when the schema does the heavy lifting.
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+resource ("Mark a task complete") and immediately qualifies the semantics for recurring tasks, so the agent knows exactly what operation this is. It does not name or differentiate against close siblings like muninn_task_update or muninn_task_snooze, which could also touch task status, so it stops 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?
The description effectively describes conditional behavior (simple RRULEs roll forward, complex ones close), which doubles as guidance about outcomes, but it never states when to prefer this tool over muninn_task_update or muninn_task_delete. Usage is implied by the outcome descriptions rather than explicitly contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_task_deleteADestructiveIdempotentInspect
Permanently delete a task memory by ID from all storage layers. Same as muninn_memory_delete but named for the task workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | The task's memory ID (full UUID or unique 8-char prefix). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is conveyed structurally. The description adds two genuinely useful facts beyond that: the deletion is permanent and it propagates across "all storage layers." It does not cover auth requirements, cascade effects on related bundles/edges, or whether the operation can be undone.
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 sentences, no filler. The destructive effect and scope are front-loaded in sentence one, and sentence two is purely a routing disambiguation 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?
For a single-parameter delete with annotations covering the safety profile and a fully documented schema field, the description covers what an agent needs to select and call it. No output schema exists, but a delete confirmation needs little explanation; the only minor gap is what happens to dependent task data when the memory is removed.
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% — the taskId parameter is fully documented in the schema, including the full-UUID-or-8-char-prefix format — so the baseline is 3. The description adds no format, matching, or ambiguity-resolution detail beyond what the schema already states.
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 ("Permanently delete a task memory"), names the identifier used (by ID), and gives scope ("from all storage layers"). It also explicitly distinguishes itself from the sibling muninn_memory_delete and situates itself in the task workflow alongside muninn_task_add/update/complete.
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 clause "Same as muninn_memory_delete but named for the task workflow" tells an agent which sibling to prefer when operating on tasks versus generic memories, which is real routing guidance. It stops short of explicit when-not conditions (e.g., use muninn_task_complete or muninn_task_snooze instead when the goal is archival rather than removal).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_task_listARead-onlyIdempotentInspect
List task memories, filtered by project/status/due window. Backed by the D1 idx_due index (user_id, due_date, task_status), never a KV scan — cheap even at scale. Returns compact rows {memoryId, taskStatus, dueDate, project}; use muninn_memory_get for the full task body.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return. | |
| status | No | Restrict to this task status. | |
| project | No | Restrict to this project slug. | |
| dueAfter | No | ISO 8601 — only tasks due after this instant. | |
| dueBefore | No | ISO 8601 — only tasks due before this instant. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real behavioral context beyond them: it is index-backed (idx_due) rather than a KV scan and is therefore cheap at scale, and it discloses the compact return shape {memoryId, taskStatus, dueDate, project} — useful since there is no output schema. Ordering and pagination behavior are not 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?
Three tight sentences: what it lists, why it is cheap, and what it returns plus where to go for more. The scope and the sibling pointer are front-loaded and nothing is 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?
With no output schema, the description correctly compensates by naming the returned fields, and annotations cover the safety profile. It stops short of describing result ordering or default/limit behavior, which an agent listing tasks might reasonably want.
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 all five parameters (limit, status, project, dueAfter, dueBefore) are already documented, including the enum and ISO 8601 formats. The description only restates the filter axes at a high level ('project/status/due window') and adds no syntax or semantics beyond the schema, so the baseline 3 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?
States a specific verb+resource (list task memories) plus its filtering dimensions (project/status/due window) and explicitly names the sibling that returns full bodies (muninn_memory_get). An agent can distinguish this from muninn_memory_list and muninn_memory_get 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 a clear routing rule: use this for compact task rows, use muninn_memory_get for the full task body. It does not address the other near-neighbours (muninn_memory_list, muninn_memory_query, muninn_memory_search), so the when-not-to-use side is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_task_snoozeAInspect
Snooze a task: hide it from reminders (session boot and per-call) until a given time. This is a statement about ONE task, not the whole reminder list. Pass EITHER until (an exact ISO 8601 instant) OR durationMinutes (snooze from now for N minutes) — not both. Hard rule: a snoozed task still reappears immediately once it reaches or passes its due date (urgency >= 1), even if snoozed_until hasn't arrived yet. Snoozing something that's already overdue has no visible effect for that reason. Pass until as '' (empty string) to clear an existing snooze.
| Name | Required | Description | Default |
|---|---|---|---|
| until | No | ISO 8601 datetime to snooze until. Pass '' to clear an existing snooze. Mutually exclusive with durationMinutes. | |
| taskId | Yes | The task's memory ID (full UUID or unique 8-char prefix). | |
| durationMinutes | No | Snooze starting now, for this many minutes. Mutually exclusive with until. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only tell the agent this is non-read-only, non-idempotent and non-destructive. The description adds the behavioral traits an agent actually needs: the hard rule that a snoozed task reappears at/after its due date regardless of snoozed_until, and the consequently no-op nature of snoozing an already-overdue task. That is exactly the kind of consequence disclosure the annotations cannot carry.
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 effect, then the two mutually exclusive input modes, then the exception rule, then the clear operation. Every sentence carries information, though the mutual-exclusivity statement and the empty-string clearing duplicate the schema text and 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?
For a 3-param mutation tool with full schema coverage, no output schema and annotations covering only safety hints, the description supplies everything else: effect, scoping, input mode exclusivity, the due-date override rule, and the clear path. Nothing needed 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 description coverage is already 100% and the schema itself states the mutual exclusivity and the empty-string clear behavior. The description reinforces those semantics and adds the 'from now' framing for durationMinutes and the instant framing for until, but adds little genuinely new parameter information beyond 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 description opens with a specific verb+resource ('Snooze a task') and immediately defines the effect ('hide it from reminders (session boot and per-call) until a given time'). It also disambiguates scope explicitly: 'This is a statement about ONE task, not the whole reminder list,' which lets an agent separate this tool from sibling task operations without inspecting 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?
It gives a clear conditional rule for the two input modes ('Pass EITHER until ... OR durationMinutes — not both') and a recovery path ('Pass until as "" to clear an existing snooze'). It does not name a sibling alternative (e.g., muninn_task_update for non-snooze changes), so the when-to-use guidance is strong but not fully comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_task_updateADestructiveIdempotentInspect
Update a task's fields. Reuses the memory update path (text/tags/project all work as in muninn_memory_update), plus task-specific fields (taskStatus, dueDate, startTime, endTime, recurrence, reminders, remindTauDays, calendarOnly). Only pass the fields you want changed. taskId may be a short-form 8-char prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | New tags (replaces existing tags). | |
| text | No | New title/notes text — replaces the whole body. | |
| taskId | Yes | The task's memory ID (full UUID or unique 8-char prefix). | |
| dueDate | No | New due date (ISO 8601) — for taskType 'todo'. | |
| endTime | No | New end time (ISO 8601) — for taskType 'event'. | |
| project | No | New project slug. Pass '' to clear back to global. | |
| reminders | No | New reminder list — replaces the existing one. | |
| startTime | No | New start time (ISO 8601) — for taskType 'event'. | |
| recurrence | No | New raw RRULE string, stored verbatim. Pass '' to clear. | |
| taskStatus | No | New task status. | |
| calendarOnly | No | true = calendar only, stop reminding. false = remind again. Only changed when passed. | |
| remindTauDays | No | New per-task urgency ramp override, in days. Only changed when passed. There is currently no way to clear an override back to the global default through this tool once set (not covered by the addendum BRD) — flagged as a known gap, not silently decided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the mutation and repeatability profile is covered. The description adds meaningful context beyond that: partial-update semantics ('Only pass the fields you want changed'), short-form taskId support, and a candid known gap about being unable to clear remindTauDays once set. It stops short of covering auth requirements or success/error behavior.
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?
Four short sentences, front-loaded with the core action and the shared-path context before the list of task-specific fields. The parenthetical list is informative and nothing is wasted; the partial-update rule and taskId prefix note are placed efficiently.
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 12-parameter mutation tool with no output schema and annotations covering safety, the description is largely complete: it explains scope, shared semantics, partial-update behavior, and a known limitation. It would be stronger if it clarified when to prefer this tool over task_complete/task_snooze or how taskId lookup failures manifest.
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 the schema already documents all 12 parameters. The description adds a cross-tool semantic reference ('text/tags/project all work as in muninn_memory_update') that is not in the schema, and groups task-specific fields for quick orientation. This meaningfully exceeds the baseline 3 for fully covered schemas.
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 (Update) and resource (a task's fields), and distinguishes this tool from its sibling muninn_memory_update by noting that text/tags/project share that path. It also enumerates the task-specific fields that set it apart, so an agent can identify it 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 gives a clear usage rule ('Only pass the fields you want changed') and routes shared-field semantics to muninn_memory_update. However, it does not explicitly address when to use this generic update versus specialized siblings like muninn_task_complete or muninn_task_snooze, leaving that choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_team_add_memberADestructiveIdempotentInspect
Add a user to a team as a member. Caller must be the team owner. Paid plan only: both the owner and the person being added must be on the paid plan. To make someone an owner, use muninn_team_transfer_owner.
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | Yes | Team ID. | |
| userId | Yes | User ID of the person to add. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=true), so the description carries a lighter burden. It adds genuine context the annotations lack: authorization requirements (owner-only) and billing constraints (paid plan for both users). It does not note idempotency or what happens to an already-present member, leaving a small gap.
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 tightly-packed sentences: core action first, then prerequisites, then the alternative-tool redirect. No filler, and the most important behavioral constraint is 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?
For a two-parameter mutation with no output schema, this covers action, authorization, billing prerequisite, and sibling routing. Only minor gaps remain (idempotency behavior on re-add, failure modes), which is why it falls short of a 5.
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% with both parameters documented as Team ID and User ID, so the schema does the heavy lifting. The description only restates 'user to add' and adds no format, syntax, or sourcing guidance beyond the schema. Baseline 3 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?
States a specific verb and resource ('Add a user to a team as a member') and distinguishes itself from the ownership-changing sibling by naming muninn_team_transfer_owner directly. An agent can tell it apart from muninn_team_invite and muninn_team_transfer_owner 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?
Explicitly states two prerequisites (caller must be the team owner; paid plan required for both parties) and names the alternative tool for the ownership case. When-to-use, constraints, and the routing alternative are all present with nothing left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_team_createAInspect
Create a new team. The caller becomes the owner and first member. Returns the new teamId. Paid plan only.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable team name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the mutation profile (readOnly=false, destructive=false, idempotent=false), and the description adds real context beyond them: the caller becomes owner and first member (a side effect), the plan gate, and the returned teamId. It does not mention e.g. name uniqueness or limits, so it stops short of 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?
Four short sentences, front-loaded with the core action, and every statement (ownership side effect, return value, plan gate) carries distinct value with no 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?
With no output schema, the description usefully states the return value (teamId) and the ownership side effect, and adds the plan requirement. It is close to complete; minor unknowns like name uniqueness or member limits remain unstated.
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?
Only one parameter and schema description coverage is 100%, so the schema already documents 'name' fully. The description adds nothing about the parameter, which matches the baseline 3 when the schema does the heavy lifting.
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 ('Create a new team') that is unambiguous against team siblings like muninn_team_add_member, muninn_team_delete, and muninn_team_list. An agent can select it 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 provides one hard precondition ('Paid plan only') but offers no alternatives or when-not-to-use guidance. There is no routing advice toward related team tools, so usage is only partially implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_team_deleteADestructiveIdempotentInspect
Delete a team permanently. This cannot be undone. Caller must be the team owner. Removes all members, share rules, and (for an encrypted team) the team keys. Ask the user to confirm first, then pass the team's exact name as confirmName; a name that does not match is refused and nothing is deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | Yes | Team ID. | |
| confirmName | Yes | The team's exact name, as the user confirmed it. Must match the team's current name or nothing is deleted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds substantial beyond them: irreversibility, the owner authorization requirement, the exact cascading side effects (all members, share rules, and team keys for encrypted teams), and the refusal semantics on a mismatched name. This is precisely the context a mutation tool 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?
Front-loaded with the destructive warning, then prerequisites, then side effects, then the call mechanics. Four sentences, each carrying distinct information with no repetition of the schema or 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?
With no output schema and only two parameters, the description covers everything an agent needs: safety profile, authorization, blast radius, confirmation protocol, and failure behavior. Nothing material 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 both parameters are already documented, but the description adds the intent behind confirmName — that it must come from an explicit user confirmation and acts as a guard that aborts the delete on mismatch. That is meaning beyond the schema wording, though teamId gets no extra commentary.
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?
Specific verb+resource ("Delete a team") with immediate scope qualifier "permanently". It is clearly distinguishable from siblings like muninn_team_remove_member, muninn_team_share_remove, or muninn_team_transfer_owner, since the description enumerates what is torn down alongside the team.
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 ("Caller must be the team owner") and a required workflow ("Ask the user to confirm first, then pass the team's exact name"). It never names an alternative tool for reversible/partial operations, so it falls short of a full when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_team_inviteAInspect
Invite someone to a team by email. Caller must be the team owner, on the paid plan. For an encrypted team, the invite carries the team key wrapped to a single-use token so the invitee can read team memories once they accept.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address of the person to invite. | ||
| teamId | Yes | Team ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, openWorld=true, idempotent=false, destructive=false. The description adds genuinely new behavioral context beyond them: the owner/paid-plan authorization requirement and the encrypted-team key-wrapping-to-single-use-token mechanism. It does not cover delivery (does an email get sent?), rate limits, or failure modes.
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: action first, then prerequisites, then the edge-case behavior for encrypted teams. No filler, and the most decision-relevant information is 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 no output schema and only two fully documented parameters, the description covers what an agent most needs: what it does, who may call it, and the non-obvious encryption consequence. Only the post-invocation lifecycle (invite email, acceptance via muninn_team_invite_accept) is left implicit.
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% for both parameters, so the schema already documents teamId and email. The description adds no format or constraint detail beyond it, making the baseline 3 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?
Specific verb+resource ('Invite someone to a team by email') with a clear scope. The 'by email' qualifier implicitly separates it from muninn_team_add_member, but no sibling is named, so differentiation requires the reader to infer 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?
Explicit preconditions are given: the caller must be the team owner and on the paid plan. There is no statement of when NOT to use it or a pointer to muninn_team_invite_accept / muninn_team_add_member as alternatives, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_team_invite_acceptAIdempotentInspect
Accept a team invite using the token from your invite email. Joins the team and, for an encrypted team, obtains the team key so you can read shared memories. Joining needs a plan that includes teams; if the joiner's plan does not, the invite is refused and stays valid.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The invite token from your invite email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (not read-only, idempotent, non-destructive, closed-world), and the description adds real behavioral context beyond them: the team-key retrieval side effect for encrypted teams and the failure semantics ('invite is refused and stays valid') when the plan lacks teams. It stops short of describing response shape or any rate/auth details.
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 tight sentences with the action front-loaded, followed by effects and then the failure condition. Every clause carries information an agent needs.
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 covers the important outcome (team membership, team key) and the notable failure mode. Nothing essential for correct invocation appears to be 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?
There is a single parameter with 100% schema description coverage, so the schema already carries the meaning. The description's phrase 'the token from your invite email' merely restates what the schema says, adding no format or validation detail.
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 ('Accept a team invite') plus the concrete side effects: joining the team and, for encrypted teams, obtaining the team key. This clearly separates it from sibling muninn_team_invite, which creates invites rather than consuming them.
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 the trigger condition (you hold a token from an invite email) and a prerequisite (the joiner's plan must include teams). It does not explicitly name an alternative tool, but the usage context is unambiguous for a token-consuming accept operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_team_invites_listARead-onlyIdempotentInspect
List pending invites for a team. Caller must be the team owner.
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | Yes | Team ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so the safety profile is covered. The description adds the authorization requirement (owner-only), which is genuinely useful and not in the annotations, but it says nothing about what 'pending' includes or 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?
Two tight sentences, purpose front-loaded, with the access constraint following immediately. No filler whatsoever.
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 simple one-parameter, read-only list tool with no output schema, the description covers what it does and the key access constraint. A note on the expected return contents would round it out, but nothing essential for correct invocation 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?
The single teamId parameter is fully documented in the schema (100% coverage), so the schema does the heavy lifting. The description adds nothing about the parameter beyond what is already structured, making the baseline 3 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?
States a specific verb (List) and resource (pending invites for a team), which distinguishes it from the mutating sibling muninn_team_invite and muninn_team_invite_accept. It doesn't explicitly name a sibling to route against, but the scope 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?
Provides a clear precondition (caller must be the team owner), which is real usage context, but gives no when-to-use vs. alternatives guidance or exclusions. Implied usage only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_team_listARead-onlyIdempotentInspect
List the teams the user belongs to, as owner or member. Use it to find a teamId before sharing memories, inviting someone, or listing a team's shares or invites. Returns {teams: [{teamId, name, createdBy, createdAt}]}. An empty list means the user is in no team.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond them: the exact return shape and the meaning of an empty list ('the user is in no team'), which is the main ambiguity for a scoped list call.
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 short sentences, front-loaded with purpose, then usage routing, then return contract. Every sentence carries information an agent needs; nothing is 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?
With no output schema, the description supplies the return shape ({teams: [{teamId, name, createdBy, createdAt}]}) and the empty-list semantics, and it routes the agent to the consuming tools. Nothing needed to call or interpret this zero-arg tool 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?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate, and it correctly avoids inventing filtering options that do not exist.
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 (List) and resource (teams the user belongs to) plus the membership scope (owner or member). An agent can distinguish it from muninn_team_shares_list, muninn_team_invites_list, and muninn_team_create 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 usage context: 'Use it to find a teamId before sharing memories, inviting someone, or listing a team's shares or invites' — naming the downstream operations that consume the returned teamId. It does not state a when-not condition or explicitly name a competing sibling, so it stops 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.
muninn_team_remove_memberADestructiveIdempotentInspect
Remove a member from a team. Caller must be the team owner (or removing themselves). The sole owner cannot be removed — transfer ownership or delete the team first. Available on every plan.
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | Yes | Team ID. | |
| userId | Yes | User ID of the member to remove. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real value beyond them: the authorization rule (owner or self) and the sole-owner edge case. It stops short of saying what happens to the removed member's data or shared resources.
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 short sentences, front-loaded with the action, then preconditions, then the edge case. Every sentence carries distinct information with no 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?
For a destructive two-parameter mutation with no output schema, the description covers who may call it, the blocking edge case, and plan availability. It omits side effects (what happens to the removed user's artifacts/shares) and error behavior, which is a minor gap given the 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 100% and both parameters (teamId, userId) are documented in the schema, so the schema does the heavy lifting. The description only echoes 'the member to remove' and adds no format or constraint detail beyond it.
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 ('Remove a member from a team') and the constraints ('transfer ownership or delete the team first') implicitly distinguish it from muninn_team_transfer_owner and muninn_team_delete. An agent can tell what this does 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?
Gives concrete preconditions: caller must be the team owner or the member themselves, and the sole owner cannot be removed. It doesn't explicitly name the sibling tools to use instead, but the routing ('transfer ownership or delete the team first') is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
muninn_team_transfer_ownerADestructiveIdempotentInspect
Transfer team ownership to an existing member. The caller (current owner) is demoted to member. A team always has exactly one owner.
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | Yes | Team ID. | |
| userId | Yes | User ID of the member to promote to owner. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context the annotations don't: the caller is demoted to member, and ownership is singular ('exactly one owner'), which tells the agent this is an atomic role swap rather than an additive grant.
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 short sentences, no filler, with the action and its consequence front-loaded and the domain invariant last. Every sentence 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?
For a 2-param mutation with no output schema, the description covers the actor, the target constraint, and the side effect. The main omission is failure/edge behavior (target not a member, caller not the owner), which an agent would benefit from knowing before invoking a destructive operation.
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% with both parameters documented, so the schema carries the burden; baseline is 3. The description adds only the qualifier that userId must be an 'existing member' — useful but marginal over the schema's 'User ID of the member to promote to owner.'
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 ('Transfer team ownership') and immediately scopes it ('to an existing member'), which separates it from muninn_team_add_member and muninn_team_remove_member. The invariant 'a team always has exactly one owner' further pins down what this operation means.
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?
Names the precondition for calling it ('The caller (current owner)') and constrains the target to an existing member, which implicitly rules out inviting or adding someone new. It does not explicitly name a sibling alternative or state what happens if preconditions fail, so it stops 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
91 tool updates
- First observed
muninn_app_link - First observed
muninn_artifact_add - First observed
muninn_artifact_connect - First observed
muninn_artifact_get - First observed
muninn_artifact_list - First observed
muninn_artifact_move - First observed
muninn_artifact_name - First observed
muninn_artifact_password - First observed
muninn_artifact_publish - First observed
muninn_artifact_unpublish - First observed
muninn_bundle_closure - First observed
muninn_bundle_create - First observed
muninn_bundle_decision_add - First observed
muninn_bundle_edge_add - First observed
muninn_bundle_edge_move - First observed
muninn_bundle_edge_remove - First observed
muninn_bundle_export_okf - First observed
muninn_bundle_get - First observed
muninn_bundle_list - First observed
muninn_bundle_node_create - First observed
muninn_bundle_node_delete - First observed
muninn_bundle_node_repoint - First observed
muninn_bundle_node_reslug - First observed
muninn_bundle_nodes_create - First observed
muninn_bundle_nodes_remove - First observed
muninn_bundle_update - First observed
muninn_help - First observed
muninn_memory_add - First observed
muninn_memory_anchor_replace - First observed
muninn_memory_append - First observed
muninn_memory_delete - First observed
muninn_memory_get - First observed
muninn_memory_list - First observed
muninn_memory_list_by_tag - First observed
muninn_memory_list_tags - First observed
muninn_memory_query - First observed
muninn_memory_search - First observed
muninn_memory_search_tags - First observed
muninn_memory_tag - First observed
muninn_memory_tag_many - First observed
muninn_memory_update - First observed
muninn_mirror_connect - First observed
muninn_mirror_designate - First observed
muninn_mirror_push - First observed
muninn_mirror_reconcile - First observed
muninn_mirror_status - First observed
muninn_onboard - First observed
muninn_picture_upload_direct - First observed
muninn_picture_upload_finish - First observed
muninn_picture_upload_start - First observed
muninn_picture_view - First observed
muninn_reconcile - First observed
muninn_render_bundle - First observed
muninn_session_boot - First observed
muninn_settings_get - First observed
muninn_settings_update - First observed
muninn_skill_check - First observed
muninn_skill_create - First observed
muninn_skill_delete - First observed
muninn_skill_registry - First observed
muninn_skill_update - First observed
muninn_stats - First observed
muninn_table_define - First observed
muninn_table_delete - First observed
muninn_table_feeds - First observed
muninn_table_list - First observed
muninn_table_publish - First observed
muninn_table_record_add - First observed
muninn_table_records_export - First observed
muninn_table_records_import - First observed
muninn_table_records_list - First observed
muninn_table_refresh - First observed
muninn_table_unpublish - First observed
muninn_task_add - First observed
muninn_task_complete - First observed
muninn_task_delete - First observed
muninn_task_list - First observed
muninn_task_snooze - First observed
muninn_task_update - First observed
muninn_team_add_member - First observed
muninn_team_create - First observed
muninn_team_delete - First observed
muninn_team_invite - First observed
muninn_team_invite_accept - First observed
muninn_team_invites_list - First observed
muninn_team_list - First observed
muninn_team_remove_member - First observed
muninn_team_share_add - First observed
muninn_team_share_remove - First observed
muninn_team_shares_list - First observed
muninn_team_transfer_owner
Publisher details
- Operator
- Bizat Co. (Biz-Automation Co., Ltd.) · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://bizat.co/muninn/?utm_source=glama&utm_medium=directory&utm_campaign=muninn · Publisher source
- Trust center
- Not available
- Restrictions
- Free tier available. Paid plan is $8 a month. Saving memories requires a verified email. · Publisher source
Related MCP Connectors
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceProvides persistent cross-session memory for Claude and other AI agents, letting users store decisions, code patterns, and knowledge once and have relevant context retrieved automatically in future conversations. Memories survive context limits, restarts, and compaction, and can be organized by workspace or shared across a team when self-hosted on Redis/Valkey or used via the managed cloud service.24 npmMIT
- AlicenseNot gradedqualityAmaintenanceProvides persistent cross-session memory for Claude and other AI agents, letting users store decisions, patterns, and knowledge once and retrieve them automatically across future conversations while surviving context limits and session restarts.24 npmMIT
- AlicenseNot gradedqualityAmaintenancePersistent, local-first memory for your AI chats. Save context in one chat, load it in another — across Claude web, Claude Code, Cursor, Cline, and Claude Desktop. One store, on your own disk, reachable from every tool via MCP, CLI, REST, or SDK.1,095 npmApache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables Claude and other AI agents to store decisions, patterns, and knowledge in persistent cross-session memory that survives restarts and context compaction, then retrieve relevant context automatically in future conversations. Supports self-hosting on Redis or Valkey, or a managed cloud service, with workspace organization, team sharing, and configurable embedding providers.24 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.