Ygdria MCP Server
A local MCP server that connects MCP clients to the Ygdria desktop app's ETAPI so an agent can search, read, create, and edit notes and reorganize the placement tree — gated by a single "allow local tool access" toggle in the desktop app.
Search & discover: keyword search (
search_notes) with optional exact tag and placement subtree filters, exact-tag lookup (search_by_tag), and full tag listing (list_tags).Browse the tree: paginated roots and direct children, single-node metadata, bounded subtrees, name-fragment resolution (
resolve_tree_nodes), and an auto-paginatingget_tree_overviewwith node/depth/byte/request budgets plus continuation tokens.Read notes: single (
get_note, markdown/json/html) or batch up to 50 (get_notes) in metadata, excerpt, or full view with a byte budget that defers remaining IDs; read a unique heading section with its current version (get_section); notes exposed asygdria://note/{noteId}resources.Create notes: title plus optional content, tags, type, and parent placement, with optional idempotency keys safe for 30-day retries.
Edit notes: full-body replace, metadata/title/tag updates, atomic literal oldText/newText edits with a dry-run preview, and appends with a mandatory idempotency key — all protected by optimistic version checks.
Section surgery: replace the body under a unique heading path while preserving its heading and all outside nodes (
replace_section), using the exact text returned byget_section.Tags: add and remove up to 20 tags each while leaving unrelated tags intact.
Organize placements: move a single placement or up to 50 sequentially with per-item results and partial success.
Safety model: execution is gated by the desktop toggle (tools stay registered), loopback-only HTTP(S) origin enforced, no tokens or write flags, redirects refused, writes require versions/idempotency keys, and errors return parseable JSON with actionable next steps.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Ygdria MCP Serversearch my notes for project ideas"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Ygdria MCP Server
本机 MCP ↔ Ygdria ETAPI 适配器。无需令牌,也无需单独开启 MCP 写权限;访问由 Ygdria 桌面应用中的一个开关控制。
使用
在 Ygdria 桌面设置中开启 AI 与外部访问 → 允许本机工具访问。
安装并构建本项目:
npm install
npm run build在 MCP 客户端配置本地 stdio 服务,例如:
{
"mcpServers": {
"ygdria": {
"command": "node",
"args": ["D:\\projects\\Ygdria-MCP\\dist\\index.js"]
}
}
}默认连接 http://127.0.0.1:4318。直接 npm start 可启动 stdio 服务;stdout 只用于 MCP 消息。需要 Node.js 18 或更高版本和正在运行的 Ygdria Desktop。
关闭桌面开关会立即阻止后续调用;重新开启后直接继续调用,无需重启 MCP。首次从旧版本升级仍需重启主服务和 MCP 以加载新实现。
Related MCP server: trilium-mcp
可选配置
通常不需要配置文件。自定义本机端口时,可填写 ygdria-mcp.ini:
[etapi]
url = http://127.0.0.1:4318也可用 YGDRIA_ETAPI_URL 覆盖地址,YGDRIA_CONFIG_FILE 指定配置文件。地址必须是 HTTP(S) loopback origin,不能包含路径、凭据或远程主机。修改地址需重启。
旧 token、allowWrite 以及对应环境变量不再使用,可从配置中删除;不会发送旧令牌。MCP 自动添加 X-Ygdria-External-Access: 1,拒绝跟随 HTTP 重定向。Ygdria 另外校验 socket、Host 和浏览器请求头;桌面私有 API 仍受独立凭据保护。
工具
工具 | 用途 |
| 关键词、标签、目录组合搜索与标签统计。 |
| 分页浏览 placement。 |
| 有界子树和按名称定位。 |
| 自动分页展开;限制节点、深度、条目字节数和请求数,返回截断状态及续读位置。 |
| 单篇或最多 50 篇批量读取;批量支持 metadata、excerpt、full。 |
| 按标题祖先路径读取唯一章节的正文和版本。 |
| 在任务授权范围内创建,支持幂等键。 |
| 上传 Base64 图片,返回附件 URL 和 Markdown;再通过带版本的正文编辑插入。相同图片按内容哈希去重。 |
| 带版本更新元数据或正文。 |
| oldText/newText 字面精确编辑;支持预览。 |
| 追加 Markdown 块或字面代码;必须带幂等键。 |
| 增删指定标签并保留其他标签,超限报错。 |
| 用 get_section 返回的正文和版本替换章节,保留标题和章节外节点。 |
| 单个或最多 50 个顺序批量移动,逐项报告结果。 |
所有工具始终注册,执行权限由桌面开关决定。用户已授权的任务可连续完成必要操作,无需每步重复确认;MCP 客户端自身的确认策略仍由客户端决定。受保护笔记、系统节点保护和正文乐观并发继续有效。
笔记 Resource 为 ygdria://note/{noteId},返回 Markdown 和版本标记。树节点使用 placementId,笔记使用 noteId。
图片导入要求主服务支持 POST /etapi/notes/:id/images(旧版返回 404,需升级并重启主服务)。先创建或读取目标笔记,调用 upload_image 传入文件名和标准 Base64 图片字节(不含 data: 前缀),再将返回的 markdown 通过带当前版本的正文编辑插入。支持 PNG、JPEG、GIF、WebP、SVG,单图最大 20 MiB。上传不修改正文;相同图片按内容哈希去重,未引用的图片遵循主服务附件清理规则。不要把 Base64 图片链接直接写入正文。
目录概览的字节预算约束 items,续读元数据另计。continuation 原样传入下一次调用,并保持 maxDepth/includeArchived 一致;遍历不是快照,结构变化时可能需要重新开始。指定 placement 时返回其后代。深度未展开节点单独列出。
批量读取超过预算返回 remainingNoteIds,单篇过大时改用 excerpt 或 get_note。批量移动允许部分成功,不构成跨请求事务;遇到访问被关闭时停止。
创建建议使用 idempotencyKey,追加必须使用。同一本机数据库和操作目标下,30 天内使用相同键和相同参数可安全重试;不同参数复用键返回 409。带键写入返回 { id, version, updatedAt } 原始回执,正文另行读取。回执由主服务同事务持久保存,关闭/开启开关和重启不会改变其身份;恢复旧数据库备份或超过 30 天后不保证去重。未带键的创建不能盲目重试。
错误返回可解析 JSON,包含状态、业务详情及下一步操作;5xx 隐藏内部详情。403 时先检查桌面开关和本机连接条件。409 重新读取内容后判断,不覆盖新版本;422 修正精确编辑目标,不自动模糊替换。
验证
npm run typecheck
npm testAvailable Tools
21 toolsappend_contentAIdempotent
Append Markdown blocks (or literal code) to the latest note without replacing existing content. Required idempotencyKey makes retries safe for 30 days on the same local Ygdria database. Optionally require expectedVersion.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| noteId | Yes | ||
| idempotencyKey | Yes | ||
| expectedVersion | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety and idempotence, but the description adds meaningful operational context: retries are safe for 30 days on the same local Ygdria database and expectedVersion can be used. It stops short of explaining failure behavior or what happens after the 30-day idempotency window.
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 followed by the important idempotency and version constraints. There is no wasted language.
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 the essential append, retry, and version-check behavior. It could be more complete by mentioning error cases or what the response contains, but the annotations reduce the need for safety disclosure.
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 0% schema description coverage, the description helps by explaining that idempotencyKey is required for retry safety, expectedVersion is optional, and text contains Markdown blocks or literal code. However, noteId is only indirectly implied by 'latest note,' and the semantics of expectedVersion remain vague.
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 ('Append Markdown blocks') plus the key scope constraint ('without replacing existing content'), which clearly distinguishes it from sibling replacement tools like replace_content or replace_section.
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 contrast with replacement behavior gives clear usage context, and the required idempotencyKey signals retry-oriented use. It does not explicitly name alternatives or say when not to use this tool, 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.
create_noteCreate a Ygdria noteB
Create a note within the user-authorized task, including necessary notes for organizing or summarizing. Use a unique idempotencyKey; on an uncertain network result retry only with the same key and identical parameters within 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| type | No | text | |
| title | Yes | ||
| content | No | ||
| idempotencyKey | No | ||
| parentPlacementId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the idempotency contract: a unique key, same-key-same-params retry semantics, and a 30-day window — information an agent could not derive from idempotentHint=false alone. It does not say what is returned or whether missing optional fields default silently, but the idempotency disclosure is substantive added value.
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 operation front-loaded and the retry contract second; nothing is redundant. The clause 'including necessary notes for organizing or summarizing' is filler that could be cut 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?
This is a mutation tool with no output schema, no annotations covering permissions or side effects, and 0% schema coverage on six parameters. The description covers the idempotency story well but leaves the agent guessing about required inputs, field defaults, placement behavior, and what a successful create 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 description coverage is 0% across 6 parameters, yet the description only explains idempotencyKey. It says nothing about title (the sole required field), content, tags, the text/code enum on type, or parentPlacementId — so the agent gets no help on five undocumented parameters.
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+resource ('Create a note') and scopes it to 'the user-authorized task', which distinguishes it from update_note, edit_content, append_content and the search_* siblings. The phrase 'including necessary notes for organizing or summarizing' is slightly muddy but the core operation 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?
The retry condition is spelled out precisely (uncertain network result → retry with the same key and identical parameters within 30 days), which is genuine when-to-use guidance. However, nothing tells the agent when to pick this over append_content, edit_content or update_note, nor what prerequisites (auth, parent placement) must hold.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_contentPrecisely edit Ygdria note contentADestructive
Apply atomic literal oldText/newText edits to a note read earlier with get_note. Each target must match exactly as expected; use dryRun to preview.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | ||
| dryRun | No | ||
| noteId | Yes | ||
| version | No | Legacy alias for expectedVersion | |
| expectedVersion | No | Version from the last read or write response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false; the description adds the semantics behind that — edits are atomic, targets must match exactly, and dryRun exists as a safe preview. It omits failure-mode detail (what happens when a match count differs from expectedMatches or version is stale), which would complete the picture.
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 mechanism front-loaded and the preview option trailing. 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?
For a destructive, non-idempotent mutation with no output schema and 40% schema coverage, the description covers mechanism and preview but not concurrency (expectedVersion), match-ambiguity resolution, or what the caller gets back. Adequate to invoke, not complete enough to invoke confidently.
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 40%; the description covers oldText/newText and clarifies dryRun's purpose beyond its bare default. It says nothing about noteId, expectedVersion/version conflict handling, or expectedMatches, leaving half the parameters reliant on thin 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 and mechanism: 'atomic literal oldText/newText edits' to a note. It implicitly distinguishes itself from whole-content siblings (replace_content, append_content, replace_section) by emphasizing literal find/replace, but never names them, 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?
Gives a prerequisite ('read earlier with get_note') and a preview path ('use dryRun to preview'), which is real guidance. It does not state when to choose this over replace_content or replace_section, nor when dryRun is mandatory before a destructive edit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_noteRead a Ygdria noteBRead-only
Read a note through ETAPI. Read current content before replacing existing text; retain the returned version. A current note resource or prior write response can also supply the version.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | markdown | |
| noteId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds a non-obvious behavioral trait: the response carries a version that must be retained for subsequent writes, and that version may alternatively come from a note resource or a prior write response — useful concurrency context beyond structured data.
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 with zero filler. The final sentence about version sourcing is terse to the point of being slightly cryptic, but nothing is 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 simple two-parameter read with annotations covering the safety profile and no output schema, the description is adequate on the write-after-read workflow. It leaves real gaps on the format options and on what the returned note representation contains, which the agent would have to discover by calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, yet it never mentions the `format` parameter or its markdown/json/html enum and default. The only semantic content it adds ("version") is a return value, not an input, so the parameters remain unexplained.
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 ("Read a note through ETAPI"), so the agent knows this is a single-note fetch. It does not distinguish itself from plural siblings like get_notes or section-scoped reads like get_section, but the core action 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?
"Read current content before replacing existing text" implies the read-before-write pattern relative to replace_content/edit_content, which is genuine usage context. However, no alternative is named explicitly (get_notes, get_section) and no exclusion conditions are given, so the agent must infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_notesARead-only
Read up to 50 notes with per-note results. Choose metadata, excerpt, or full Markdown; a byte budget defers remaining IDs for another call. Protected notes remain inaccessible.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | full | |
| noteIds | Yes | ||
| maxBytes | No | ||
| excerptLength | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read operation, and the description adds useful behavior beyond them: batch size, per-note results, byte-budget deferral of remaining IDs, and protected-note inaccessibility. It could say more about partial results or error behavior, but it meaningfully improves transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler. The core action is front-loaded, followed by the view choice, byte-budget behavior, and protected-note caveat.
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 batch tool with annotations covering safety and no output schema, the description gives enough operational context to call it correctly. The main omission is excerptLength semantics and some return-shape detail, but the overall behavior is adequately covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains the view choices and the maxBytes deferral behavior, and 'up to 50 notes' maps to noteIds limits, but excerptLength is not addressed at all and noteIds/defaults are not explicitly described.
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 ('Read ... notes') and adds batch scope ('up to 50 notes with per-note results'), which distinguishes it from the single-note sibling get_note. It does not explicitly name get_note or search_notes as alternatives, so sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching multiple known note IDs and explains the view and byte-budget options, but it does not explicitly say when to use get_notes instead of get_note or search_notes. The only exclusion is that protected notes remain inaccessible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sectionARead-only
Read a unique heading section body and current version. Pass the returned content unchanged as oldText to replace_section; headingPath lists ancestor titles and the target heading.
| Name | Required | Description | Default |
|---|---|---|---|
| noteId | Yes | ||
| headingPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds meaningful behavior the schema can't convey: the response carries a current version, and the content must be forwarded verbatim to replace_section, implying version-staleness matters. It omits failure behavior for a missing or non-unique heading.
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 padding, and the core purpose is front-loaded before the usage hint and parameter note. Every clause carries information the agent could not get from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming what is returned (body plus current version) and how to chain it into replace_section. For a two-parameter read tool with read-only annotations, this is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the load, and it explains the non-obvious parameter well: headingPath 'lists ancestor titles and the target heading,' which is essential given the schema only says it's a string array. noteId is left to the obvious interpretation, and no format details (e.g., whether titles are case-sensitive or matched exactly) are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read a unique heading section body and current version.' The word 'unique' plus the headingPath note makes clear this resolves one section, which distinguishes it from get_note (whole note) and search_notes. Sibling differentiation is implied through the replace_section reference rather than stated as an explicit contrast.
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 read-then-write workflow: 'Pass the returned content unchanged as oldText to replace_section,' which tells the agent exactly when this tool is the prerequisite for a sibling. It does not state when to prefer get_note or search_notes instead, or what happens if the heading path is ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tree_nodeGet a Ygdria tree nodeCRead-only
Read compact metadata for exactly one placement node.
| Name | Required | Description | Default |
|---|---|---|---|
| placementId | Yes | ||
| includeArchived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true and openWorldHint=false already declare the safety profile, so the description's added value should be error behavior, archived-node handling, or payload shape. It only offers 'compact metadata', with no statement about what is omitted, what happens for an unknown placementId, or how includeArchived changes results.
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 efficient, front-loaded sentence with no filler. It is short because it is under-specified rather than because it is tightly written.
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 should indicate what 'compact metadata' returns and must compensate for the undocumented parameters. It does neither, leaving the includeArchived flag and the return shape entirely opaque.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%: neither placementId nor includeArchived has a description in the schema, and the description never mentions includeArchived or what its default of false means for archived nodes. 'Exactly one placement node' only faintly implies the single ID parameter.
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 (read) and resource (compact metadata for one placement node), and 'exactly one' implicitly distinguishes it from list_tree_children and get_tree_subtree. However, it never names a sibling or clarifies what a 'placement node' is relative to notes/sections handled by get_note or get_section.
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 guidance on when to use this versus list_tree_children, get_tree_subtree, get_tree_overview, or get_note. The agent must infer the choice 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.
get_tree_overviewARead-only
Explore roots or a placement's descendants automatically within node, depth, item-byte, and request budgets. Pass returned continuation to continue; depth-limited nodes are listed separately. Byte budget covers items; continuation is additional bounded navigation data.
| Name | Required | Description | Default |
|---|---|---|---|
| maxBytes | No | ||
| maxDepth | No | ||
| maxNodes | No | ||
| maxRequests | No | ||
| placementId | No | ||
| continuation | No | ||
| includeArchived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint=false; the description adds real behavior: four independent budgets, the fact that the byte budget excludes continuation data, and that truncation surfaces depth-limited nodes separately. It still doesn't say what happens to omitted placementId (implied roots) or how includeArchived interacts with traversal.
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 traversal scope before the mechanics. The jargon ("item-byte", "additional bounded navigation data") is dense but each 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 7-parameter tool with a nested continuation object and no output schema, the description covers budget/pagination semantics but omits the archived-node flag, the roots-vs-placement default, and what a returned item looks like. Adequate but with clear 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 0%, so the description must carry parameter meaning. It maps conceptually onto maxNodes, maxDepth, maxBytes, maxRequests and continuation, but leaves includeArchived and placementId (roots-when-absent) unexplained, and does not clarify the nested continuation payload's fields.
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 action (bounded recursive traversal of roots or a placement's descendants) and the resource (tree nodes). It is clear about scope and budget-limited expansion, but never names or distinguishes itself from siblings like get_tree_subtree, list_tree_children, or list_tree_roots.
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 operational guidance for continuing a traversal ("Pass returned continuation to continue") and notes that depth-limited nodes are listed separately. However, there is no guidance on when to prefer this over the several overlapping subtree/children/roots tools, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tree_subtreeGet a bounded Ygdria subtreeARead-only
Read one placement and its descendants within explicit depth and node limits; use get_tree_overview to explore across roots within a response budget.
| Name | Required | Description | Default |
|---|---|---|---|
| maxDepth | No | ||
| maxNodes | No | ||
| placementId | Yes | ||
| includeArchived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds useful behavioral context by saying the read is bounded by explicit depth and node limits and a response budget, though it does not explain truncation behavior when maxNodes is reached.
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 definition is a single, front-loaded sentence with no wasted wording. It states the core operation, its bounds, and the alternative tool in one compact structure.
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 read-only subtree tool, the description covers the core action, limits, and the main sibling alternative, while annotations cover the safety profile. The remaining gaps, especially includeArchived semantics and truncation/return behavior with no output schema, are minor but still 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?
The description maps 'one placement' to placementId and 'depth and node limits' to maxDepth/maxNodes. But schema description coverage is 0%, and includeArchived is not explained at all, so the description only partially compensates for the missing 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?
The description states a specific verb and resource: read one placement and its descendants. It also sets the scope with explicit depth and node limits and names get_tree_overview as the cross-root alternative, so the agent can distinguish this from the overview tool 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?
It gives a clear condition for this tool, reading a single placement subtree within depth/node limits, and explicitly routes cross-root exploration to get_tree_overview. However, it does not distinguish this tool from closely related siblings such as get_tree_node or list_tree_children.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsList Ygdria tagsBRead-only
List all tags available through Ygdria ETAPI.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and scope are covered. The description adds the useful signal that the result is the complete tag set ('all tags'), but says nothing about ordering, whether tag hierarchy or usage counts are included, or how empty results appear.
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, appropriately sized for a zero-parameter read. The trailing 'through Ygdria ETAPI' is mild jargon that adds little for an agent.
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 parameterless read with annotations covering safety and no output schema, the description supplies enough to call it correctly. Only the shape of returned tag data is left unstated, which is a minor gap at this 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?
The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate. The empty schema is consistent with the description's claim that all tags are returned unconditionally.
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 tags') with the source system named, so an agent knows it enumerates the tag vocabulary rather than retrieving notes. It does not explicitly differentiate itself from the nearby 'search_by_tag' or 'update_tags' siblings, so an agent must infer the distinction.
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 call this versus the alternatives in the sibling set, nor any prerequisites or exclusions. Usage is only implied by the phrase 'list all tags.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tree_childrenList direct Ygdria tree childrenBRead-only
List direct child placement nodes, paginated. Use hasChildren to decide whether further expansion is useful.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| placementId | Yes | ||
| includeArchived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and openWorldHint annotations already communicate that this is a safe, closed read operation. The description adds that results are paginated and hints at using hasChildren for expansion decisions, but it does not explain pagination mechanics, cursor behavior, or archived-item handling.
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 two short sentences with the core operation front-loaded. Every sentence contributes either scope or traversal guidance, 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?
There is no output schema and no parameter description coverage, so the description should carry more context. It mentions hasChildren as if it is returned, but does not document the return shape, pagination fields, or what includeArchived changes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for four undocumented parameters. It only implies pagination via 'paginated' and hierarchy via 'direct child placement nodes,' leaving placementId, limit, cursor, and includeArchived unexplained.
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: 'List direct child placement nodes.' The word 'direct' helps distinguish it from subtree-oriented siblings such as get_tree_subtree, but it does not explicitly name alternatives or state boundaries versus those 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?
The sentence 'Use hasChildren to decide whether further expansion is useful' provides traversal guidance, but it does not say when to choose this tool over list_tree_roots, get_tree_node, or get_tree_subtree. Usage is implied rather than explicitly scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tree_rootsList Ygdria tree rootsARead-only
List only top-level tree nodes, paginated. Use resolve_tree_nodes for direct lookup or get_tree_overview for a budgeted overview.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| includeArchived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds 'paginated', which is genuinely extra behavioral context, but it says nothing about archived-node handling or what a page contains. Creditable but thin beyond 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?
Two sentences, front-loaded with the scope constraint, zero filler. Nothing could be removed without losing routing 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 and no annotation gap, but the undocumented default of excluding archived nodes and the return shape of a page are never addressed. Adequate to invoke safely, not complete enough to predict results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across all three parameters, so the description carries the burden and mentions only pagination in passing. It never explains limit (default 50, max 100), cursor semantics, or what includeArchived=false means — the one param with real behavioral consequence.
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-plus-resource ('List ... top-level tree nodes') with an explicit scope qualifier ('only top-level') that separates it from list_tree_children and get_tree_subtree. The 'tree nodes' resource is slightly abstract given generic naming, but an agent can identify the operation 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 two alternatives (resolve_tree_nodes for direct lookup, get_tree_overview for a budgeted overview) and gives the condition that selects each. The 'only top-level' scope phrase implicitly excludes the child/subtree traversal siblings, leaving nothing important to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_placementMove a Ygdria placementCIdempotent
Move a placement tree node. placementId, not noteId, identifies the item being moved.
| Name | Required | Description | Default |
|---|---|---|---|
| position | Yes | ||
| placementId | Yes | ||
| parentPlacementId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, and openWorld=false, so the safety profile is covered. The description adds no behavioral detail beyond 'move': it does not state whether descendants move with the node, how cycles are prevented, what permissions are required, or what side effects occur.
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 two short sentences, front-loaded with the action and then the key identifier clarification. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tree mutation with no output schema and no schema parameter descriptions, the definition is too thin. An agent still lacks guidance on destination placement semantics, position meaning, subtree behavior, cycle/error handling, and how this differs from the plural move_placements sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for all three required parameters. The description clarifies only that placementId, not noteId, identifies the moved item; it says nothing about parentPlacementId or position, leaving two of three parameters with no semantic explanation beyond their names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Move a placement tree node,' and it disambiguates the item identifier from noteId. It does not explicitly distinguish this tool from the sibling move_placements, nor does it clarify the scope of the tree 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?
There is no explicit guidance on when to use move_placement versus the sibling move_placements, or when not to use it. The only usage hint is the parenthetical 'placementId, not noteId,' which clarifies identity but not situational appropriateness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_placementsA
Move up to 50 placements sequentially. Each move is independent; returns per-item results and partial success, without cross-request atomicity. Stops on authentication or permission errors.
| Name | Required | Description | Default |
|---|---|---|---|
| moves | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantive traits beyond the annotations: sequential execution, per-item results, partial success, no cross-request atomicity, and halting on authentication or permission errors. These are exactly the failure-mode and consistency facts an agent needs before issuing a bulk mutation, and nothing contradicts the annotation 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?
Three short sentences, front-loaded with the operation and size bound, then the concurrency/atomicity contract. No filler, and every clause carries load-bearing 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?
Covers the batch-level contract well enough for a safe call, but with no output schema and zero parameter documentation, the description should at least sketch what a 'per-item result' contains and what the item fields mean. For a mutation accepting a nested structure, that gap is material.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, but it only restates the batch ceiling of 50. The nested item fields — placementId, parentPlacementId, and especially position with its default of 0 — are left entirely unexplained in both places, and position semantics (ordering vs. root-level) are genuinely ambiguous.
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 ... placements') plus the batch bound of 50, so the agent knows this is a bulk relocation operation. It never mentions the sibling move_placement (singular), so the agent must infer the single-vs-batch split on its own.
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?
'Move up to 50 placements sequentially' implies this is the batch path, but the description never names move_placement as the alternative for a single move, nor states any exclusion or prerequisite. Usage is inferable rather than explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_contentReplace Ygdria note contentADestructive
Replace the complete Markdown body using the version from a prior get_note call as If-Match.
| Name | Required | Description | Default |
|---|---|---|---|
| noteId | Yes | ||
| content | Yes | ||
| version | No | Legacy alias for expectedVersion | |
| expectedVersion | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, so the safety profile is covered structurally. The description adds genuinely non-obvious behavior: this is an optimistic-concurrency write keyed on a version from a prior get_note call. It stops short of stating what happens on a version mismatch or that all prior body content is lost beyond the word 'complete'.
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 dense sentence with zero filler, and the destructive 'complete body' scope is front-loaded. The trailing 'as If-Match' leans on HTTP-header jargon that a calling agent may have to decode, a minor structural cost.
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, four-parameter mutation with no output schema, the description covers the one thing an agent cannot guess: content is fully overwritten and gated by a version token. Missing details are secondary but real, such as conflict/mismatch handling and whether metadata or tags survive the replacement.
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 only 25%, with just 'version' documented as a legacy alias for expectedVersion. The description compensates for the weakest spot by explaining that this version value must come from a prior get_note call, which gives expectedVersion real meaning. noteId and content remain undocumented in both places.
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 'Replace' plus a precise resource scope, 'the complete Markdown body', which implicitly separates it from the partial-mutation siblings (edit_content, append_content, replace_section). It does not name those siblings outright, so the differentiation is inferable 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?
'using the version from a prior get_note call as If-Match' establishes a real workflow prerequisite, implying get_note must precede this call. However, there is no explicit when/when-not guidance versus edit_content, append_content, or replace_section, which is the main decision an agent faces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_sectionADestructive
Replace the body under a unique hierarchy of heading titles, preserving its heading and all outside Tiptap nodes. Use get_section first. oldText is the exact returned Markdown section body, including nested subsections. Requires current expectedVersion. Ambiguous paths fail atomically.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| noteId | Yes | ||
| oldText | Yes | ||
| headingPath | Yes | ||
| idempotencyKey | No | ||
| expectedVersion | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description adds real context beyond them: optimistic concurrency via required expectedVersion, atomic failure on ambiguous heading paths, and the exact-preservation guarantee for the heading and surrounding nodes. It does not explain what happens to nested subsections on failure in detail, or the role of idempotencyKey, but the safety-relevant behavior is well disclosed.
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 short sentences, front-loaded with the action and its preservation scope, then the prerequisite, parameter constraint, concurrency requirement, and failure mode. No sentence 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 destructive mutation with no output schema and zero schema description coverage, the description supplies the essential operational context: precondition tool, concurrency token, preservation semantics, and atomic failure. The remaining gap is the undocumented text, noteId, and idempotencyKey parameters, which an agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and only partially does so: it defines oldText (exact Markdown body returned by get_section, including nested subsections), headingPath (hierarchy of heading titles), and expectedVersion (current version for conflict detection). It says nothing about text, noteId, or idempotencyKey, leaving half the parameters undocumented anywhere.
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 ('Replace') and a precisely scoped resource ('the body under a unique hierarchy of heading titles'), and clarifies the preservation boundary (heading and all outside Tiptap nodes). This implicitly separates it from whole-note tools like replace_content, but no sibling is explicitly named, so differentiation is inferred rather than stated.
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 get_section first' gives an explicit prerequisite and the correct workflow ordering. 'Ambiguous paths fail atomically' signals the failure mode. There is no explicit when-not guidance or named alternative for whole-note replacement, keeping it 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.
resolve_tree_nodesResolve Ygdria tree nodes by nameBRead-only
Find candidate placement nodes by a title fragment, then navigate with their placementId values.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| includeArchived | No | ||
| parentPlacementId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds little beyond that, omitting search scope, archived-item handling, result limits, and what the candidate results contain.
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 wasted words. The core search purpose and the placementId follow-up are both stated compactly.
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 four parameters, no output schema, and zero schema descriptions, the definition is too thin. It does not explain how to scope searches, whether archived nodes are included, how many results are returned, or what a placementId is used for.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It only implies that query is a title fragment and mentions placementId as an output value, but it says nothing about limit, includeArchived, or parentPlacementId.
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: find candidate placement nodes by a title fragment. It distinguishes the tool from a direct node lookup by emphasizing candidate search, though it does not explicitly contrast with siblings like get_tree_node or list_tree_children.
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 a workflow: first find candidates by title fragment, then navigate using their placementId values. However, it gives no explicit when-not conditions, alternatives, or prerequisites for choosing this tool over the many sibling tree-search and navigation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_tagSearch Ygdria notes by tagARead-only
Find notes with an exact Ygdria tag, optionally limited to a placement and all its descendants.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | Exact tag to search for | |
| placementId | No | Optional placement root; includes this tree node and all descendants | |
| includeArchived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description usefully pins down exact-match (non-fuzzy) semantics and subtree scoping, but says nothing about archived-note handling, result volume/pagination, or case sensitivity of tag matching.
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 well-formed sentence with the resource and the exactness constraint front-loaded; 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 simple read-only lookup with annotations covering safety and no output schema, the description is close to sufficient. The remaining hole is includeArchived semantics and whether archived notes are silently excluded by default.
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 restates the two documented parameters (exact tag, placement plus all descendants) without adding format or syntax detail. The third parameter, includeArchived, has no schema description and is never mentioned in the description, so its effect on results remains undocumented.
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 ("Find notes with an exact Ygdria tag") and the optional scope. It never names or distinguishes itself from the obvious siblings search_notes and list_tags, so the agent has to infer the difference between exact-tag lookup and general note search.
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 by "exact Ygdria tag" and the optional placement subtree; there is no explicit statement of when to prefer this over search_notes, nor any exclusion such as "use list_tags to discover tag names first." Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_notesSearch Ygdria notesBRead-only
Search Ygdria notes through ETAPI. Optionally limit results to a placement and all its descendants. Results use noteId for follow-up note tools; snippets are plain text.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional exact tag filter combined with the query | |
| query | Yes | Text to search for | |
| placementId | No | Optional placement root; includes this tree node and all descendants | |
| includeArchived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description does add real context not in structured fields — results carry noteId for follow-up note tools and snippets are plain text — but it says nothing about result limits, pagination, or ordering for a search operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no padding; the returned-data note is placed last where it belongs. 'through ETAPI' is an implementation detail that adds little for an agent, keeping it just below top marks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description only partially compensates by explaining noteId and plain-text snippets. For a search tool it leaves out result caps, ordering, and whether empty results vs. errors are returned.
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 75%, close to the baseline threshold, and the schema documents query, tag, and placementId. The description only echoes the placement/descendant semantics already in the schema and says nothing about includeArchived, the one undocumented parameter.
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 ('Search Ygdria notes through ETAPI') and adds scope via the optional placement-subtree restriction. It never distinguishes itself from the sibling search_by_tag or get_notes, which is the main gap for an agent picking among overlapping retrieval 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?
Usage is only implied: the placement sentence tells you an optional scoping mode exists but not when to prefer this tool over search_by_tag (which is presumably tag-only search) or list/get alternatives. No explicit when-not or prerequisite guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_noteUpdate a Ygdria noteA
Update title, body, or tags using the current version from a read, resource, or prior write response. On conflict, this tool reads and returns the latest note; reconsider the edit and never retry the stale version.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | No | ||
| noteId | Yes | ||
| content | No | ||
| codeLanguage | No | ||
| expectedVersion | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, and non-destructive, so the description's job is to add depth. It does exactly that by disclosing optimistic-concurrency semantics: on conflict it returns the latest note and the write does not apply, with an explicit anti-pattern (never retry stale version). It omits whether unset fields are preserved or cleared, which matters given destructiveHint=false.
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, front-loaded with the action and fields, followed by the failure-mode rule. No wasted wording and the most surprising behavior is stated directly rather than 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 six-parameter mutation with no output schema and zero schema descriptions, the description covers the concurrency contract well but leaves gaps an agent would care about: whether passing a subset of fields replaces or merges the existing note, and what codeLanguage does. The versioning story is complete; the field-mutation story is not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it partially does: 'current version from a read, resource, or prior write response' explains expectedVersion's semantics without naming it. It covers title/tags and calls the body 'content' (a naming mismatch), but says nothing about noteId or the unexplained codeLanguage parameter.
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 ('Update title, body, or tags') on a note, which is concrete enough to act on. It does not distinguish itself from overlapping siblings like update_tags, edit_content, or replace_content, which appear to touch the same fields, so an agent must guess which one applies.
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 operational context: use a version obtained from a read, resource, or prior write response, and on conflict re-read and never retry the stale version. This covers when and how to invoke under contention, but there is no guidance on when to prefer this over the sibling tag/content tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tagsB
Add and remove tags on the latest note without replacing unrelated tags. Additions win if a tag appears in both lists.
| Name | Required | Description | Default |
|---|---|---|---|
| noteId | Yes | ||
| addTags | No | ||
| removeTags | No | ||
| idempotencyKey | No | ||
| expectedVersion | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely useful semantics beyond the annotations: unrelated tags are preserved, and additions win on overlap. Annotations already declare destructiveHint=false and idempotentHint=false, yet the description never explains how expectedVersion conflicts are reported or why idempotencyKey matters despite a non-idempotent hint.
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 merge guarantee and ending with the overlap tiebreak. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no descriptions, no output schema and no annotations explaining failure modes, the description should cover the concurrency and idempotency contract. It omits both, leaving an agent unable to call it safely under version conflicts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description must carry semantics and does not. It covers the intent of addTags/removeTags only obliquely and says nothing about noteId, expectedVersion (optimistic concurrency) or idempotencyKey, which are the two parameters an agent is most likely to misuse.
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 and resource (add/remove tags) plus the key scoping property (merge, not replace). It does not name or distinguish itself from the near-neighbor siblings update_note or replace_content, and the phrase "the latest note" is slightly at odds with the required noteId parameter.
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: the caller infers this is the tool for incremental tag changes rather than full-note updates. There is no explicit 'use this instead of update_note' routing, and no precondition guidance around note identity or version state.
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.
21 tool updates
v0.1.0- First observed
append_content - First observed
create_note - First observed
edit_content - First observed
get_note - First observed
get_notes - First observed
get_section - First observed
get_tree_node - First observed
get_tree_overview - First observed
get_tree_subtree - First observed
list_tags - First observed
list_tree_children - First observed
list_tree_roots - First observed
move_placement - First observed
move_placements - First observed
replace_content - First observed
replace_section - First observed
resolve_tree_nodes - First observed
search_by_tag - First observed
search_notes - First observed
update_note - First observed
update_tags
TDQS
Scored across 21 tools
The set has several overlapping clusters: tree exploration is split across list_tree_roots, get_tree_node, list_tree_children, get_tree_subtree, resolve_tree_nodes, and get_tree_overview, and content modification is split across update_note, edit_content, replace_content, append_content, and replace_section. Descriptions do provide guidance on when to use each, but an agent can still hesitate between the budgeted overview tools and the explicit subtree tools.
Tool names consistently use snake_case and a predictable verb_noun or verb_prep_noun pattern, such as search_notes, get_note, create_note, update_tags, replace_section, and move_placement. Singular/plural distinctions like move_placement versus move_placements are also clear and intentional.
With 21 tools, the server is on the heavy side for a note/tree API and has many specialized navigation and editing operations. The count is not extreme, but it is borderline enough that agents must choose among several similarly scoped tree and content tools.
The surface covers note search, reading, creation, updates, content editing, tag updates, and placement moves well. However, there are notable lifecycle gaps: no delete_note or delete_placement tools and no explicit tool for creating or deleting placement tree nodes, which may cause dead ends for full resource management.
Maintenance
Related MCP Connectors
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Official MCP bridge to Exogram—the Personal AI Agent for your work, people, and life.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.1 npm2MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that lets AI agents read and write a self-hosted TriliumNext knowledge base over its ETAPI, enabling note capture, structured table maintenance, and search.5MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP-compatible clients to create, list, search, and delete notes, read all notes as markdown, and use prompts to summarize or clean up notes.MIT
- FlicenseNot gradedqualityAmaintenanceEnables users to create, link, explore, and synthesize atomic notes as a knowledge graph through Claude and other MCP-compatible clients. It supports tagging, search, note types, semantic link types, and Markdown-file storage indexed by SQLite.-