Nodiom Cloud
Server Details
Review your AI agents' work in minutes, not hours of chat. Approve it or send it back.
- Status
- Healthy
- Uptime
- 69.9% over 21 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Synexiom-Labs/nodiom
- GitHub Stars
- 9
TDQS
Scored across 19 tools
Tools split cleanly into two subsystems (board_* workflow vs nodiom_* document structure), and within each the actions are mostly distinct. Minor overlap exists among the several read tools (nodiom_read, nodiom_read_list, nodiom_query, nodiom_tree, nodiom_get_doc) and between nodiom_delete and nodiom_delete_doc, but descriptions clarify the differences.
All names are snake_case with a consistent subsystem prefix and verb-based phrasing (board_add_card, board_move_card, nodiom_append, nodiom_create_doc). The only deviation is the dual board_/nodiom_ prefixes, which reflect two intentional subsystems rather than inconsistent convention.
19 tools is slightly heavy but justified by covering two coherent domains — an agent-to-agent board workflow and a document-structure API. Each tool appears to earn its place; there is little obvious redundancy.
The board surface covers the full lifecycle (create, add/move/update/delete card, read, reply, wait for review), and the nodiom surface covers doc CRUD plus structural read/write/append/query/tree operations. Minor gaps like document metadata rename or richer search exist but core workflows are complete.
Available Tools
19 toolsboard_add_cardAdd a cardAInspect
Adds a card to a board, with a permanent id. Returns the card's id. Goes into the first column unless you name another. Use this to hand work to another agent or to a person.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | Who is adding it. Defaults to this API key's name. | |
| brief | No | A short paragraph of context. | |
| title | Yes | One line describing the work. | |
| column | No | Which column. Defaults to the first. | |
| doc_id | Yes | The board's document id, as returned by board_create or nodiom_list_docs. | |
| criteria | No | Acceptance criteria, each a checkbox. |
Output Schema
| Name | Required | Description |
|---|---|---|
| column | Yes | |
| card_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds the default-column behavior and the permanence of the card id, but says nothing about what a non-idempotent retry does (duplicate cards) or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and side effect before the usage hint. Each sentence carries information, though 'with a permanent id' and 'Returns the card's id' partially overlap.
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 full schema coverage, rich annotations, and an output schema covering the return value, the description supplies everything else an agent needs: default placement, the creation side effect, and the intended hand-off use case.
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 six parameters (including title, brief, criteria, agent) are already documented in the schema. The description's only parameter-level contribution, the default column behavior, essentially restates the schema's own column description, 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?
The description opens with a specific verb and resource ('Adds a card to a board') and states the side effect (permanent id) plus the return value. This cleanly separates it from siblings like board_create (makes the board), board_update_card, and board_move_card.
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 usage context ('hand work to another agent or to a person') and clarifies default placement behavior. It does not name alternative tools or when-not-to-use this one, 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.
board_createCreate a boardAInspect
Creates a board: a shared Markdown document whose columns are ## headings and whose cards are checklist items. Returns its doc_id. Columns default to Backlog, In Progress, Needs Review, Done. For work handed from one agent to another, use Received, Doing, Done. The last column is where finished work goes; review_column is where a person signs off before it does.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The board's name. Its doc_id is derived from it. | |
| columns | No | Column names, in order. | |
| review_column | No | The column where a person approves work before it moves to the last column: any column but the first and the last. null for no review step. Left out, a column whose name mentions review or approval is used if there is one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| columns | Yes | |
| review_column | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/idempotency/destructive profile, so the bar is lower. The description adds real behavioral context beyond them: the return value (doc_id), the default column set when columns is omitted, and the ordering semantics of the last column and review_column.
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, no filler, and the definition of the artifact is front-loaded before the defaults and column semantics. Slightly dense but every sentence 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?
An output schema exists, so return-value detail is not required, yet the doc_id mention ties the artifact to it. Combined with defaults, handoff conventions, and review-column semantics, the description is complete for a 3-parameter creation tool with full schema coverage.
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. The description adds meaning the schema does not: the concrete default column names, the agent-handoff convention, and the semantic role of the last column versus review_column, which clarifies intent beyond the schema's structural rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Creates a board') and then defines what a board actually is ('a shared Markdown document whose columns are ## headings and whose cards are checklist items'), which lets an agent distinguish it conceptually from nodiom_create_doc among the siblings. It also states the returned handle (doc_id).
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 concrete usage context: default columns, and a named alternative column set ('Received, Doing, Done') for work handed between agents. It does not explicitly state when NOT to use this tool or name which sibling handles a similar need, 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.
board_delete_cardDelete a cardADestructiveIdempotentInspect
Removes a card from the board for good. On a board with a review step, a card waiting for review can't be deleted. To finish work, move it instead.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | Who is deleting it. Defaults to this API key's name. | |
| doc_id | Yes | The board's document id, as returned by board_create or nodiom_list_docs. | |
| card_id | Yes | The card's id, e.g. c_7f3a. See board_read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| from | Yes | |
| card_id | Yes | |
| deleted | Yes |
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 still adds real value: permanence ("for good") and the non-obvious review-step restriction that would otherwise cause a failed call. It stops short of noting what else is destroyed (replies, attachments) or required 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?
Two short sentences, zero filler, with the core action front-loaded and the constraint following. Nothing repeats the title or annotations wastefully.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations carry return values and safety semantics, so the description only needs the operational gotchas — and it supplies the most important one. It leaves minor questions open (whether attached replies vanish with the card, auth requirements), keeping it just under 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?
Schema description coverage is 100%, and each parameter already documents its source (board_create/nodiom_list_docs, board_read, API key default). The description adds no parameter-level meaning beyond that, 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 ("Removes a card from the board") with a permanence qualifier that distinguishes it from the reversible board_move_card or board_update_card. 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?
Explicitly names the blocking precondition (a card awaiting review on a board with a review step cannot be deleted) and routes to the alternative remedy ("move it instead"). Both when-not and alternative are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
board_move_cardMove a cardAIdempotentInspect
Moves a card to another column in one atomic step — it never exists twice or not at all, even while other agents are writing. Move a card when you pick it up, as you work it, and when it's finished. Moving to the last column ticks it done. If the board has a review column, tick the criteria you met (board_update_card), then move finished work there and stop: only a person, or a key the owner allowed to review, can approve it into the last column or send it back, and moves that would skip review are refused. When you pick up a card that was sent back, the reply includes what the reviewer said.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | The destination column's name, exactly as board_read shows it. | |
| note | No | Only when a reviewer key approves or sends back a card: what to tell the agent. Written into the card as a review note. | |
| agent | No | Who is moving it. Defaults to this API key's name. | |
| doc_id | Yes | The board's document id, as returned by board_create or nodiom_list_docs. | |
| card_id | Yes | The card's id, e.g. c_7f3a. See board_read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| tip | No | |
| from | Yes | |
| next | No | What to do now, e.g. stop and wait for review. |
| card_id | Yes | |
| reviewer_said | No | The note on a card that was sent back to you. |
| criteria_unticked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, idempotent=true, destructive=false), while the description adds atomicity guarantees ('never exists twice or not at all, even while other agents are writing'), the review-gate permission model, refusal of review-skipping moves, and the reviewer-note-on-return behavior. That is substantial behavioral context beyond the 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-loads the atomicity guarantee and routing triggers before the review-workflow detail, and every sentence carries workflow or constraint information. The pickup/work/finish cadence is slightly repetitive but not wasted for a multi-state 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?
A stateful mutation tool with a review gate is fully covered: entry conditions, refusal cases, the alternative for criteria updates, and what comes back when picking up a sent-back card. An output schema exists, so return values need no further explanation.
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 five parameters, including `to`, `note`, and `agent`, are already fully documented in the schema. The description reinforces the reviewer-only use of `note` but adds no format or syntax detail beyond it, so the baseline of 3 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?
States a specific verb and resource with scope: 'Moves a card to another column in one atomic step.' This distinguishes it cleanly from siblings like board_update_card (which ticks criteria) and board_add_card, 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 explicit when-to-use triggers ('when you pick it up, as you work it, and when it's finished'), names the alternative for criteria ('board_update_card'), and states the stop condition at a review column plus which moves are refused. 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.
board_readRead a boardARead-onlyIdempotentInspect
Returns a board's columns and cards as JSON, including each card's id, owner and acceptance criteria. Read the board before you pick up, add or move work. Cards are addressed by id, never by position. A card a person has approved or sent back carries review_notes, oldest first: when a card comes back to you, its last note says what to change.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | The board's document id, as returned by board_create or nodiom_list_docs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | Yes | |
| columns | Yes | |
| problems | No | Things wrong with the document a person should know about. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint false, openWorldHint false). The description adds genuinely new behavioral facts: cards are addressed by id and never by position, and review_notes are returned oldest first with the last note carrying the required change when a card comes back. It does not mention behavior on a missing or malformed doc_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the return shape, then the usage condition, then the review_notes detail. Every sentence carries information, though the review_notes sentence is somewhat dense and 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?
With an output schema present, return values need not be re-explained, and the annotations carry the safety profile; the description fills in the remaining gaps an agent needs (when to read, how cards are identified in subsequent calls, how review feedback surfaces). Only error/empty-board behavior 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% for the single doc_id parameter, and the schema already says where the id comes from ('as returned by board_create or nodiom_list_docs'). The description adds nothing about the parameter itself; the 'addressed by id' statement concerns cards inside the document, not the input. Baseline 3 with the schema doing the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns a board's columns and cards as JSON') and enumerates what comes back (card id, owner, acceptance criteria). The routing advice about reading before picking up, adding or moving work also separates it in practice from sibling writers like board_add_card and board_move_card.
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?
'Read the board before you pick up, add or move work' gives a concrete trigger tied to the sibling write tools, so an agent knows when to reach for this rather than one of them. It stops short of naming alternatives explicitly (e.g., board_wait for blocking, board_reply for responding), so no true when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
board_replyReply to a review noteAInspect
Answers the person who reviewed a card: your reply is written under their latest note, marked as yours, so they can see you understood ("Agreed, cutting it to four lines"). Use it after a card is sent back with a note, before you redo the work. It doesn't move the card or change its content, and it can never stand in for a review decision.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Your reply, in a sentence or two. | |
| agent | No | Who is replying. Defaults to this API key's name. | |
| doc_id | Yes | The board's document id, as returned by board_create or nodiom_list_docs. | |
| card_id | Yes | The card's id, e.g. c_7f3a. See board_read. |
Output Schema
| Name | Required | Description |
|---|---|---|
| card_id | Yes | |
| replied | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-destructive, non-idempotent write, and the description adds real context: the reply is nested under the reviewer's latest note, attributed to the caller, and has no side effects on card state. It stops short of noting visibility/permissions or rate behavior, so it is strong but not exhaustive.
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, and the inline example ('Agreed, cutting it to four lines') clarifies tone and intent efficiently. Three sentences is appropriate; the parenthetical example is the only slight embellishment but it earns its place by disambiguating the reply's nature.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations cover the safety profile; the description supplies the workflow placement and the non-effects. Complete enough for correct invocation, with only minor gaps around who can see the reply.
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 four parameters (text, agent, doc_id, card_id) are already documented with formats and defaults. The description only implies the meaning of 'text' via the example reply; it adds no syntax or constraint detail beyond the schema, 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 and resource ('Answers the person who reviewed a card') and explicitly delineates scope against siblings: it does not move the card, change its content, or serve as a review decision. An agent can distinguish it from board_update_card or board_move_card 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 an explicit trigger ('after a card is sent back with a note, before you redo the work') and an explicit exclusion ('can never stand in for a review decision'). The when-to-use and when-not-to-use are both stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
board_update_cardEdit a cardADestructiveIdempotentInspect
Changes a card's title, brief or acceptance criteria in place. It keeps its id, column, owner and review notes. Give only the parts to change; criteria replace the whole list, so send every criterion you want kept, ticking the ones that are met. On a board with a review step, cards waiting for review or already approved can't be edited.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | Who is editing it. Defaults to this API key's name. | |
| brief | No | A new brief. An empty string removes it. | |
| title | No | A new one-line title. | |
| doc_id | Yes | The board's document id, as returned by board_create or nodiom_list_docs. | |
| card_id | Yes | The card's id, e.g. c_7f3a. See board_read. | |
| criteria | No | The full list of acceptance criteria: plain strings, or { text, done } to tick one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| column | Yes | |
| card_id | Yes | |
| updated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true): it discloses what is preserved (id, column, owner, review notes), what the destructive behavior actually means (criteria replace the entire list, so omitted criteria are dropped), and a state precondition tied to the review workflow. That is exactly the kind of context structured hints 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?
Three sentences, all load-bearing: what it does, how to send partial updates and the list-replacement rule, then the review-state exclusion. Front-loaded with the core action and free of 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 partial-update mutation with 6 params and an output schema (so return values need no explanation), the description covers scope, preservation semantics, list-replacement behavior, and the blocking precondition. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns an extra point by clarifying the non-obvious replacement semantics of the criteria array ('send every criterion you want kept, ticking the ones that are met') — a behavior the schema cannot express despite its detailed field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('changes') plus resource ('a card') and enumerates exactly which fields are editable (title, brief, acceptance criteria). The phrase 'in place' and the field list separate it from board_move_card, board_add_card, and board_delete_card without needing to open 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 an explicit when-not condition ('on a board with a review step, cards waiting for review or already approved can't be edited') and partial-update guidance ('give only the parts to change'). It never names a sibling alternative for a given intent, 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.
board_waitWait for review decisionsARead-onlyIdempotentInspect
Waits for a person to approve or send back the cards you handed to review on this board, and returns each decision with the reviewer's note. It returns as soon as there is a decision after since, or after timeout_seconds with none. Call it after moving work to review instead of polling board_read. Pass next_since from the previous reply to continue where you left off; timeout_seconds 0 checks without waiting. A card sent back to you is marked as picked up, so the reviewer sees you got it.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | Whose hand-offs to watch. Defaults to this API key's name. | |
| since | No | ISO time to look after. Default: the last 24 hours. | |
| doc_id | Yes | The board's document id, as returned by board_create or nodiom_list_docs. | |
| timeout_seconds | No | How long to wait for a decision. Default 30, at most 45. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| decisions | Yes | |
| next_since | Yes | Pass this as since next time. |
| waited_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so safety is covered; the description adds real behavioral detail the annotations don't: it blocks up to timeout_seconds, returns on first decision after since, marks sent-back cards as picked up, and enables cursor continuation. It doesn't discuss rate limits or error conditions, keeping it just below top marks.
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 what it does, followed by return conditions, guidance, and parameter semantics; four sentences each carry useful information, though the pickup note could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain returns; it covers blocking behavior, timing, continuation, and the pickup side-effect. Minor gaps like failure modes or concurrency are not essential 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 baseline is 3; the description goes beyond the schema by clarifying how 'since'/next_since drives continuation and that timeout_seconds 0 means a non-blocking check, plus the side-effect on sent-back cards that affects interpretation of results.
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 (waits) and resource (review decisions on a board), and distinguishes itself from the obvious alternative by naming board_read and explaining it replaces polling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call it after moving work to review and instead of polling board_read, explains timeout_seconds 0 as a non-blocking check, and describes continuation via next_since. Alternatives and timing conditions are fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_appendAppend to sectionBInspect
Appends new content after the last item in a section. Changes are saved automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". | |
| content | No | Same as new_content — the name the open-source nodiom-mcp server uses. | |
| selector | Yes | Structural selector. Examples: "## Signups", "## Active > li[0]", "## Active > li[contains=\"id=c_7f3a\"]". Prefer the contains form when writing: an index is a position, not an identity, so if another agent appends to the same section between your read and your write, li[0] now points at a different node and your write lands on the wrong one. A contains selector must match exactly one node or it errors rather than guessing. | |
| new_content | No | Markdown content to append. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| appended | Yes | |
| selector | Yes | The selector the call addressed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds one genuinely new behavioral fact, 'Changes are saved automatically,' i.e. implicit persistence, but says nothing about failure modes, permission requirements, or how concurrent appends are handled.
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 with the operation and insertion point front-loaded, and the persistence note second. Nothing is padded, though the second sentence is close to filler given how little it specifies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations carry the safety profile. What is missing is routing relative to nodiom_write and any note on non-idempotency consequences, which matters for an append operation an agent may retry.
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 selector description already explains the index-vs-contains identity problem in detail. The description contributes no parameter-level meaning, 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 (appends) and resource (content in a section) plus the insertion point ('after the last item'), which is more precise than a generic write. It does not, however, contrast itself with the nearby nodiom_write sibling, so an agent must infer which one to pick.
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?
No when-to-use guidance and no alternatives named, despite nodiom_write being an obvious candidate for the same document. The reader is left to guess whether append vs write is a matter of intent, selector form, or position.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_create_docCreate documentAInspect
Creates a new document in Nodiom Cloud storage. Does nothing if the document already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". | |
| content | Yes | Initial Markdown content for the document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| created | Yes | False if a document with that id already existed; it was left as it was. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false; the description adds genuinely new behavior by stating the no-op on duplicate document IDs, which is exactly the kind of side-effect disclosure annotations cannot express. Minor tension: a same-argument no-op is effectively idempotent, while idempotentHint is false, but this reads as an edge-case clarification rather than a claim of a different operation class.
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 with zero filler; the primary action is stated first and the duplicate-handling caveat immediately follows. Nothing is repeated from the title 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 annotations covering safety and mutability, an output schema covering return values, and full schema coverage on the two parameters, the definition supplies what's uniquely missing: the exists-and-no-op semantics. It stops short of saying what is returned or whether existing content is ever overwritten, which for a create-only tool would be the final detail.
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 required parameters are documented there, including examples for doc_id and the Markdown semantics of content. The description adds no parameter-level 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 ('Creates a new document in Nodiom Cloud storage'), which is clearly distinguishable from readers like nodiom_get_doc or nodiom_list_docs. However, it never contrasts with the sibling nodiom_write, so an agent cannot tell from the description alone whether nodiom_write would also create a missing document.
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?
'Does nothing if the document already exists' implicitly tells the agent to use another tool (nodiom_write / nodiom_append) for existing documents, which is useful routing context. But that alternative is never named and there are no explicit exclusions or prerequisites, leaving the guidance inferential rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_deleteDelete nodeBDestructiveIdempotentInspect
Removes the node or section matched by the selector. Changes are saved automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". | |
| selector | Yes | Structural selector. Examples: "## Signups", "## Active > li[0]", "## Active > li[contains=\"id=c_7f3a\"]". Prefer the contains form when writing: an index is a position, not an identity, so if another agent appends to the same section between your read and your write, li[0] now points at a different node and your write lands on the wrong one. A contains selector must match exactly one node or it errors rather than guessing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| deleted | Yes | |
| selector | Yes | The selector the call addressed. |
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 one genuinely new behavior ("changes are saved automatically"), but omits what else is destroyed — e.g. whether deleting a section also removes its child nodes — which matters most for a destructive 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?
Two short, front-loaded sentences with zero filler: the action first, the auto-save side effect second. Nothing could be cut without losing 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?
An output schema exists, so return values need not be explained, and annotations carry the destructive/idempotent story. However, for a subtree-deleting mutation the description should say what happens to children of a deleted section and whether a non-matching selector no-ops or errors; those gaps keep it at minimum-viable rather than 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?
Schema description coverage is 100%: doc_id and selector are documented at length, including selector syntax and the singleton-match error rule. The description's phrase "node or section matched by the selector" adds only a marginal gloss over 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+resource ("Removes the node or section") and scopes it via the selector, which separates it from nodiom_write/nodiom_append in sibling terms. It stops short of naming the alternative tools explicitly, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no mention of alternatives such as nodiom_write (which likely overwrites) or nodiom_tree. Usage is only implied by "matched by the selector"; an agent is left to infer when deletion is preferable to rewriting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_delete_docDelete documentBDestructiveIdempotentInspect
Permanently deletes a document from Nodiom Cloud storage.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| deleted | Yes | False if there was no such document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the destructive nature is covered structurally. The word 'Permanently' adds a mild nuance about irreversibility, but it largely restates what destructiveHint already conveys, and nothing is said about permissions, cascading effects, or error behavior when the doc_id is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the destructive verb and resource at the front and zero redundant wording. Nothing could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the single parameter is fully documented in the schema. However, the description never addresses how this tool relates to the sibling nodiom_delete, leaving a real risk of wrong-tool selection for 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?
Only one parameter (doc_id) and schema description coverage is 100%, with examples embedded in the schema, so the baseline is 3. The description adds no format or constraint details beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently deletes a document') and names the storage system. It is clear on its own, but it does not differentiate itself from the sibling nodiom_delete, so an agent cannot tell from the description alone which delete tool applies to documents.
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?
No when-to-use guidance, no prerequisites, and no mention of the alternative nodiom_delete or nodiom_get_doc. The agent must infer applicability purely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_get_docGet full documentBRead-onlyIdempotentInspect
Returns the full Markdown content of a document.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| content | Yes | The whole document, as Markdown. |
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. The description adds only that the return format is Markdown and the scope is the whole document, which is modest but genuine added context beyond the annotations.
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 front-loaded sentence with no redundant or filler clauses — the return format is stated immediately. It is efficient, though the extreme brevity is under-specification rather than disciplined conciseness in the usage dimension.
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?
The tool is simple (one required param) and an output schema exists, so return values need not be explained. However, with several overlapping read-oriented siblings (nodiom_read, nodiom_query, nodiom_list_docs), the definition leaves the agent without enough context to confidently pick this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and its schema description coverage is 100%, including concrete ID examples, so the schema carries the full burden. The description adds no format, constraint, or lookup guidance beyond what the schema already provides, 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 and resource ('Returns the full Markdown content of a document'), and the qualifier 'full' signals scope. It does not distinguish itself from close siblings such as nodiom_read or nodiom_query, leaving the agent to 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?
There is no when-to-use guidance, no conditions, and no mention of the obvious alternatives (nodiom_read, nodiom_list_docs, nodiom_query). The agent gets no routing help for choosing this over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_list_docsList documentsARead-onlyIdempotentInspect
Returns all document IDs available in Nodiom Cloud storage.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| documents | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed world, so the safety profile is covered. The description adds the useful fact that only IDs are returned, but says nothing about pagination, result limits, or ordering for a potentially large listing.
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 front-loaded sentence with no filler. Nothing in it is redundant and it fits the trivial shape of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover the safety profile for this zero-param read. The only residual gap is scale behavior (pagination/limits) on a listing that could be large.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline this dimension starts at 4; there is no parameter meaning for the description to compensate for, and schema coverage is 100%.
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 ('Returns') and resource ('all document IDs available in Nodiom Cloud storage'), and usefully narrows the return to IDs rather than document content, which separates it in spirit from nodiom_get_doc/nodiom_read. It never names a sibling, so differentiation is inferential rather than explicit.
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?
No when-to-use guidance and no mention of alternatives such as nodiom_read_list, nodiom_tree, or nodiom_get_doc. The agent is left to guess whether this or a sibling is the right entry point for discovering documents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_queryQuery node metadataBRead-onlyIdempotentInspect
Returns structural metadata about a location: exists, type, depth, childCount.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". | |
| selector | Yes | Structural selector. Examples: "## Signups", "## Active > li[0]", "## Active > li[contains=\"id=c_7f3a\"]". Prefer the contains form when writing: an index is a position, not an identity, so if another agent appends to the same section between your read and your write, li[0] now points at a different node and your write lands on the wrong one. A contains selector must match exactly one node or it errors rather than guessing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | Yes | |
| depth | Yes | |
| index | Yes | |
| doc_id | Yes | The document id. |
| exists | Yes | |
| selector | Yes | The selector the call addressed. |
| childCount | Yes |
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 by structured data. The description adds only a list of returned fields, which overlaps with the output schema; it discloses nothing about selector resolution behavior, error conditions, or latency.
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 front-loaded sentence with zero filler, and the field list is the highest-value content placed first. Nothing to trim.
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?
Return values are covered by the output schema and safety by annotations, so the description needn't repeat them. But with eight nodiom siblings sharing the same document namespace, the missing routing guidance (read vs tree vs query) leaves a real gap an agent must resolve by guessing.
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 params (doc_id, selector) are already richly documented, including selector syntax, the contains-vs-index guidance, and the exact-one-match error rule. The description adds no parameter meaning beyond 'a location', so the baseline of 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 (returns) and resource (structural metadata about a location) and enumerates the returned fields (exists, type, depth, childCount), which is more concrete than the title 'Check a section'. It does not, however, distinguish itself from siblings such as nodiom_read or nodiom_tree, so the 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?
There is no statement of when to use this tool versus nodiom_read, nodiom_tree, or nodiom_read_list, all of which operate on the same documents. The closest thing to guidance is the implicit 'check before write' framing in the annotations title, which the description never makes explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_readRead sectionBRead-onlyIdempotentInspect
Returns the Markdown content at a structural location within a document.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". | |
| selector | Yes | Structural selector. Examples: "## Signups", "## Active > li[0]", "## Active > li[contains=\"id=c_7f3a\"]". Prefer the contains form when writing: an index is a position, not an identity, so if another agent appends to the same section between your read and your write, li[0] now points at a different node and your write lands on the wrong one. A contains selector must match exactly one node or it errors rather than guessing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| content | Yes | The Markdown at that location. For a heading, its body without the heading line. |
| selector | Yes | The selector the call addressed. |
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 safety behavior is fully covered. The description adds no behavioral context beyond restating its own title — no error semantics (e.g., non-matching or ambiguous selectors), no note that it is a pure read against a versioned store, nothing the annotations and schema don't already 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?
A single front-loaded sentence with the verb first and zero filler or redundancy. Nothing in it is wasted, even if more substance would have been welcome.
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?
The tool is structurally simple (2 required params), annotations are complete, the schema documents both parameters well, and an output schema exists so return values need no prose. What is missing is routing context: with four sibling read tools (get_doc, read_list, query, tree) an agent gets no help picking this one, which is the remaining 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% and the selector field is unusually rich, including worked examples and the contains-vs-index rationale with a concrete race-condition warning. The description contributes nothing beyond the phrase "structural location," so this sits at the baseline 3 that fully-documented schemas earn.
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 names a specific verb and resource ("Returns the Markdown content") and scopes it to "a structural location within a document," which is clearer than the bare title "Read section." However, it never distinguishes this from close siblings like nodiom_get_doc, nodiom_read_list, nodiom_query, or nodiom_tree, 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?
There is no when-to-use, when-not-to-use, or alternative named. The phrase "structural location" implies the tool is for targeted, selector-based reads, but the description never says when to reach for this versus nodiom_get_doc (whole document) or nodiom_read_list (listing). Any practical guidance lives only in the selector schema field.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_read_listRead list itemsBRead-onlyIdempotentInspect
Returns all list items under a selector as a JSON array of strings.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". | |
| selector | Yes | Structural selector. Examples: "## Signups", "## Active > li[0]", "## Active > li[contains=\"id=c_7f3a\"]". Prefer the contains form when writing: an index is a position, not an identity, so if another agent appends to the same section between your read and your write, li[0] now points at a different node and your write lands on the wrong one. A contains selector must match exactly one node or it errors rather than guessing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Each list item's source, marker and nested lines included. |
| doc_id | Yes | The document id. |
| selector | Yes | The selector the call addressed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds the return shape (JSON array of strings), which is mild added value, but says nothing about error behavior or selector-matching failure modes. A 3 is appropriate with annotations carrying the burden.
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 front-loaded sentence with no filler. It is efficient, though the brevity leaves nothing to route usage or caveats.
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 2 parameters, a full output schema, and complete annotations, the definition is technically callable as written. The missing piece is routing guidance against the many read-shaped siblings, which this description never addresses.
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 selector description in the schema is unusually rich (contains-form guidance, exact-match requirement). The description's "under a selector" adds nothing beyond that, 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 ("Returns all list items under a selector") plus the return shape, so the agent knows what it does. It does not, however, differentiate itself from siblings like nodiom_read or nodiom_query, which also read content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to prefer this over nodiom_read, nodiom_query, or nodiom_tree, and no prerequisites or conditions given. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_treeGet document outlineARead-onlyIdempotentInspect
Returns the full structural outline of a document as a nested JSON tree. Use this first to understand a document's structure.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| outline | Yes | The document's headings as a nested tree. |
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 adds only the return shape ('nested JSON tree'), without noting depth, size limits, or behavior on invalid doc_ids.
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 what the tool returns, followed by the single usage cue. 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?
An output schema exists, so return-value explanation is unnecessary, and the annotations cover the safety profile for a trivial one-parameter read. The only real gap is the lack of differentiation from sibling read/get-doc tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema documents it at 100% coverage with format hints and examples. The description adds nothing about doc_id 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 ('Returns') and resource ('full structural outline of a document') plus the output shape ('nested JSON tree'), which distinguishes it from plain read tools like nodiom_read or nodiom_get_doc. It stops short of naming those siblings explicitly, so an agent must infer the distinction rather than be told.
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 this first to understand a document's structure' gives a sequencing hint, but there is no explicit when-not guidance and no named alternatives (e.g., use nodiom_get_doc for raw content, nodiom_read for text). Usage is implied rather than defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodiom_writeWrite (replace) sectionADestructiveIdempotentInspect
Replaces the content at a selector. The heading is preserved. Changes are saved automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes | Document ID. Examples: "waitlist", "content-calendar", "metrics". | |
| content | No | Same as new_content — the name the open-source nodiom-mcp server uses. | |
| selector | Yes | Structural selector. Examples: "## Signups", "## Active > li[0]", "## Active > li[contains=\"id=c_7f3a\"]". Prefer the contains form when writing: an index is a position, not an identity, so if another agent appends to the same section between your read and your write, li[0] now points at a different node and your write lands on the wrong one. A contains selector must match exactly one node or it errors rather than guessing. | |
| new_content | No | New Markdown content to place at this location. |
Output Schema
| Name | Required | Description |
|---|---|---|
| doc_id | Yes | The document id. |
| changed | Yes | False if the content was already exactly this. |
| selector | Yes | The selector the call addressed. |
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 still adds real value beyond them: that the heading survives the replacement (i.e. only the body is destroyed) and that changes persist without an explicit save call. It does not mention auth requirements or the race-condition risk that the selector schema warns about.
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 operation, then the preservation guarantee, then the persistence behavior. Every sentence carries information an agent needs and none 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?
With an output schema present, return values need no explanation, and the annotations carry the safety contract. The description covers what gets replaced and what is preserved, which is the key gap for a destructive write. It is only slightly thin on when this tool should be chosen over nodiom_append.
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 schema itself is unusually rich, including the li[0] vs contains= identity warning. The description adds nothing about doc_id, selector, or the content/new_content alias, so this sits at the baseline where the schema does all the work.
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?
"Replaces the content at a selector" gives a specific verb (replaces) and resource (section content at a selector), which implicitly contrasts with the append sibling. It stops short of naming nodiom_append or any sibling explicitly, so an agent must infer the boundary from the verb 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?
The description never states when to use this over nodiom_append, nodiom_create_doc, or other write paths, nor any prerequisites. An agent reading only this text gets no routing guidance between the two mutation siblings.
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.
19 tool updates
- Changed
board_add_card1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "card_id": { + "type": "string" + }, + "column": { + "type": "string" + } + }, + "required": [ + "card_id", + "column" + ], + "type": "object" +}
- Changed
board_create1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "columns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "review_column": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "doc_id", + "columns", + "review_column" + ], + "type": "object" +}
- Changed
board_delete_card1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "card_id": { + "type": "string" + }, + "deleted": { + "const": true, + "type": "boolean" + }, + "from": { + "type": "string" + } + }, + "required": [ + "card_id", + "deleted", + "from" + ], + "type": "object" +}
- Changed
board_move_card1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "card_id": { + "type": "string" + }, + "criteria_unticked": { + "type": "integer" + }, + "from": { + "type": "string" + }, + "next": { + "description": "What to do now, e.g. stop and wait for review.", + "type": "string" + }, + "reviewer_said": { + "additionalProperties": false, + "description": "The note on a card that was sent back to you.", + "properties": { + "at": { + "description": "When, as an ISO time.", + "type": "string" + }, + "by": { + "description": "Who decided, or who replied.", + "type": "string" + }, + "decision": { + "description": "A person's decision, or an agent's reply to one.", + "enum": [ + "approved", + "sent_back", + "reply" + ], + "type": "string" + }, + "text": { + "description": "What they said; may be empty.", + "type": "string" + } + }, + "required": [ + "decision", + "text" + ], + "type": "object" + }, + "tip": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "required": [ + "card_id", + "from", + "to" + ], + "type": "object" +}
- Changed
board_read1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "columns": { + "items": { + "additionalProperties": false, + "properties": { + "a_person_approves_from_here": { + "type": "boolean" + }, + "cards": { + "items": { + "additionalProperties": false, + "properties": { + "brief": { + "type": "string" + }, + "criteria": { + "description": "Acceptance criteria.", + "items": { + "additionalProperties": false, + "properties": { + "done": { + "type": "boolean" + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "done" + ], + "type": "object" + }, + "type": "array" + }, + "done": { + "description": "Ticked: true in the last column.", + "type": "boolean" + }, + "id": { + "description": "The card's permanent id, e.g. c_7f3a.", + "type": "string" + }, + "owner": { + "description": "Who last moved it.", + "type": "string" + }, + "review_notes": { + "description": "Review decisions and replies, oldest first.", + "items": { + "additionalProperties": false, + "properties": { + "at": { + "description": "When, as an ISO time.", + "type": "string" + }, + "by": { + "description": "Who decided, or who replied.", + "type": "string" + }, + "decision": { + "description": "A person's decision, or an agent's reply to one.", + "enum": [ + "approved", + "sent_back", + "reply" + ], + "type": "string" + }, + "text": { + "description": "What they said; may be empty.", + "type": "string" + } + }, + "required": [ + "decision", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "updated": { + "description": "When it last changed, as an ISO time.", + "type": "string" + } + }, + "required": [ + "id", + "title", + "done" + ], + "type": "object" + }, + "type": "array" + }, + "finished_work_goes_here": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "cards" + ], + "type": "object" + }, + "type": "array" + }, + "problems": { + "description": "Things wrong with the document a person should know about.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title", + "columns" + ], + "type": "object" +}
- Changed
board_reply1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "card_id": { + "type": "string" + }, + "replied": { + "const": true, + "type": "boolean" + } + }, + "required": [ + "card_id", + "replied" + ], + "type": "object" +}
- Changed
board_update_card1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "card_id": { + "type": "string" + }, + "column": { + "type": "string" + }, + "updated": { + "const": true, + "type": "boolean" + } + }, + "required": [ + "card_id", + "column", + "updated" + ], + "type": "object" +}
- Changed
board_wait1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "decisions": { + "items": { + "additionalProperties": false, + "properties": { + "at": { + "type": "string" + }, + "by": { + "type": [ + "string", + "null" + ] + }, + "card_id": { + "type": "string" + }, + "decision": { + "enum": [ + "approved", + "sent_back" + ], + "type": "string" + }, + "note": { + "description": "What the reviewer said.", + "type": [ + "string", + "null" + ] + }, + "now_in": { + "description": "The column the card is in now.", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + } + }, + "required": [ + "card_id", + "title", + "decision", + "by", + "at", + "now_in", + "note" + ], + "type": "object" + }, + "type": "array" + }, + "next": { + "type": "string" + }, + "next_since": { + "description": "Pass this as since next time.", + "type": "string" + }, + "waited_seconds": { + "type": "number" + } + }, + "required": [ + "decisions", + "next_since" + ], + "type": "object" +}
- Changed
nodiom_append1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "appended": { + "const": true, + "type": "boolean" + }, + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "selector": { + "description": "The selector the call addressed.", + "type": "string" + } + }, + "required": [ + "doc_id", + "selector", + "appended" + ], + "type": "object" +}
- Changed
nodiom_create_doc1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "created": { + "description": "False if a document with that id already existed; it was left as it was.", + "type": "boolean" + }, + "doc_id": { + "description": "The document id.", + "type": "string" + } + }, + "required": [ + "doc_id", + "created" + ], + "type": "object" +}
- Changed
nodiom_delete1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "deleted": { + "const": true, + "type": "boolean" + }, + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "selector": { + "description": "The selector the call addressed.", + "type": "string" + } + }, + "required": [ + "doc_id", + "selector", + "deleted" + ], + "type": "object" +}
- Changed
nodiom_delete_doc1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "deleted": { + "description": "False if there was no such document.", + "type": "boolean" + }, + "doc_id": { + "description": "The document id.", + "type": "string" + } + }, + "required": [ + "doc_id", + "deleted" + ], + "type": "object" +}
- Changed
nodiom_get_doc1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "content": { + "description": "The whole document, as Markdown.", + "type": "string" + }, + "doc_id": { + "description": "The document id.", + "type": "string" + } + }, + "required": [ + "doc_id", + "content" + ], + "type": "object" +}
- Changed
nodiom_list_docs1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "documents": { + "items": { + "additionalProperties": false, + "properties": { + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "updated_at": { + "description": "ISO time of the last change.", + "type": "string" + } + }, + "required": [ + "doc_id", + "updated_at" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "documents" + ], + "type": "object" +}
- Changed
nodiom_query1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "childCount": { + "type": [ + "number", + "null" + ] + }, + "depth": { + "type": [ + "number", + "null" + ] + }, + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "exists": { + "type": "boolean" + }, + "index": { + "type": [ + "number", + "null" + ] + }, + "selector": { + "description": "The selector the call addressed.", + "type": "string" + }, + "type": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "doc_id", + "selector", + "exists", + "type", + "depth", + "childCount", + "index" + ], + "type": "object" +}
- Changed
nodiom_read1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "content": { + "description": "The Markdown at that location. For a heading, its body without the heading line.", + "type": "string" + }, + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "selector": { + "description": "The selector the call addressed.", + "type": "string" + } + }, + "required": [ + "doc_id", + "selector", + "content" + ], + "type": "object" +}
- Changed
nodiom_read_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "items": { + "description": "Each list item's source, marker and nested lines included.", + "items": { + "type": "string" + }, + "type": "array" + }, + "selector": { + "description": "The selector the call addressed.", + "type": "string" + } + }, + "required": [ + "doc_id", + "selector", + "items" + ], + "type": "object" +}
- Changed
nodiom_tree1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "outline": { + "description": "The document's headings as a nested tree.", + "items": { + "additionalProperties": false, + "properties": { + "children": { + "description": "Nested headings, in the same shape.", + "items": {}, + "type": "array" + }, + "depth": { + "type": "integer" + }, + "heading": { + "type": "string" + } + }, + "required": [ + "heading", + "depth", + "children" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "doc_id", + "outline" + ], + "type": "object" +}
- Changed
nodiom_write1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "changed": { + "description": "False if the content was already exactly this.", + "type": "boolean" + }, + "doc_id": { + "description": "The document id.", + "type": "string" + }, + "selector": { + "description": "The selector the call addressed.", + "type": "string" + } + }, + "required": [ + "doc_id", + "selector", + "changed" + ], + "type": "object" +}
2 tool updates
- Added
board_reply - Added
board_wait
17 tool updates
- First observed
board_add_card - First observed
board_create - First observed
board_delete_card - First observed
board_move_card - First observed
board_read - First observed
board_update_card - First observed
nodiom_append - First observed
nodiom_create_doc - First observed
nodiom_delete - First observed
nodiom_delete_doc - First observed
nodiom_get_doc - First observed
nodiom_list_docs - First observed
nodiom_query - First observed
nodiom_read - First observed
nodiom_read_list - First observed
nodiom_tree - First observed
nodiom_write
Publisher details
- Operator
- Synexiom Labs Inc. · Publisher source
- Operator website
- https://synexiomlabs.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://app.nodiom.md/docs · Publisher source
- Trust center
- https://www.nodiom.md/security
- Restrictions
- None for getting started. Anyone can sign up at app.nodiom.md and connect with OAuth (dynamic client registration). No admin approval or custom OAuth app is needed. Each connection is scoped to the one workspace chosen at sign-in. The free plan includes 10,000 writes a month, and reads are free; larger volumes need a paid plan. · Publisher source
Related MCP Connectors
One board for every AI you use: agents claim tasks and finish with proof you accept or return.
- GenfeedOAuthai.genfeed
Create, review and schedule social content from your AI agent. Approval-first.
Expert review for AI agents. On-chain proof of human review.
Connect, monitor, and control AI agents — tasks, approvals, schedules, and governance.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceLets AI agents submit work to real human reviewers who pin specific issues and return verdicts, allowing the agent to revise and iterate until approved.38 npmMIT
- AlicenseNot gradedqualityAmaintenanceLets AI agents submit work to real human reviewers, receive pinned feedback and a verdict, and iterate until the result is approved.38 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to submit work to real human reviewers, receive pinned feedback and approval verdicts, and iterate until the output is signed off.38 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to submit work to real human reviewers, receive pinned feedback and verdicts, and iterate until approved.38 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.