hjarni
Server Details
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
- Status
- Healthy
- Uptime
- 69.6% over 54 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- hjarni/hjarni-mcp
- GitHub Stars
- 0
- Server Listing
- Hjarni MCP Server
TDQS
Scored across 41 tools
Most tools have clearly distinct purposes (notes-*, containers-*, tags-*, files-*, teams-*). A few clusters overlap — notes-get/notes-open/notes-panel all surface note data, and search/notes-list/notes-search_mentions all retrieve notes — but descriptions explicitly disambiguate them (e.g. notes-panel and notes-search_mentions are marked UI-only). No two tools appear to do the same thing.
Strong, predictable resource-action hyphenated pattern (containers-create, notes-update, tags-manage, files-attach). A handful of tools drop the prefix (search, me, dashboard-get, nudges-dismiss) and notes-open/notes-panel/notes-search_mentions are verb-ish variants, but the overall convention is readable and consistent.
41 tools is heavy for the surface, exceeding the well-scoped range. The domain is broad (notes, containers, tags, teams, files, email, instructions, feedback), but notes-panel alone collapses dozens of UI actions into a single mega-tool and several auxiliary tools (nudges-dismiss, feedback-submit, email-addresses-*) pad the count.
Coverage is deep: full note CRUD plus history/revert/restore, container CRUD plus restore/permissions, tag lifecycle, teams, files, instructions, email capture, search, links, and dashboard. Minor gaps remain — no team update/delete or email-address delete/update — but core lifecycle workflows are complete.
Available Tools
41 toolscontainers-createAInspect
Create a new container (folder) for organizing notes. Required: name (string). Optional: description (string), negative_space (string — what does NOT belong in this folder, so notes can be routed away from it), parent_id (integer or null) for nesting inside another container — null or omitted creates it at the top level (so does the space's root id: the root is not a folder, and the response then reports parent_id null), team_id (integer) to create the container in a team instead of personal space. When team_id is set, parent_id (if provided) must belong to the same team. After creating, consider setting up LLM instructions with instructions-update.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Container name (required) | |
| team_id | No | Create container in this team instead of personal space. Omit it (or send null) for personal space. | |
| parent_id | No | Parent container ID for nesting, or null/omitted for a top-level container. Must belong to the same scope (personal or team) as the new container. | |
| description | No | Container description | |
| negative_space | No | What does NOT belong in this folder (e.g. 'No meeting notes, those go in Meetings'). Helps route notes away from the wrong place. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false indicates a write operation), the description adds useful behavioral details: it explains that parent_id null or root id results in top-level creation and that the response reports parent_id null, and it clarifies that the root is not a folder. It also states the constraint that team_id and parent_id must belong to the same team. These nuances are not in the annotations and help the agent understand edge cases and response semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the core action and then systematically explains each parameter. While it is longer than strictly necessary, every sentence adds value (e.g., root id nuance, team constraint, follow-up suggestion). It is structured logically from required to optional parameters, and the final recommendation to use instructions-update is a useful pointer.
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 five parameters, no output schema, and sparse annotations, the description covers all parameters, explains edge cases (root id, team scoping), and even suggests a follow-up action. It does not explicitly state the return value (e.g., that it returns the created container), but it does mention response behavior for parent_id. Given the lack of an output schema, a note on the return format would improve completeness, but the description is already quite thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all five parameters with descriptions (100% coverage). The tool description goes beyond the schema by elaborating on negative_space (what does not belong, how it routes notes) and clarifying parent_id behavior (null/omitted vs root id, response behavior). It also adds the team_id–parent_id constraint that is not present in the schema. These additions meaningfully improve parameter understanding.
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: 'Create a new container (folder) for organizing notes.' It clearly distinguishes the creation action from sibling tools like containers-update or containers-delete by naming the action explicitly. Even without naming alternatives, the purpose is unambiguous and the function of the tool is immediately obvious.
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 when to use the tool (when a new container is needed) but does not explicitly contrast with alternatives like containers-update or containers-list. It does provide usage context such as team_id constraints and the parent_id nesting logic, which helps guide correct invocation. However, it does not state when NOT to use this tool or name sibling tools explicitly, so it falls short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
containers-deleteADestructiveInspect
Move a folder to Trash within the connected user's personal Hjarni account or an authorized team workspace, taking its sub-folders and their notes with it as ONE recoverable unit. Restorable with containers-restore for 30 days, then permanently removed. This is a real delete (the folder leaves every listing); to retire a folder while keeping it browsable in the Archive, use containers-update with archived: true instead. Team folders require the editor role on every folder the delete touches. Required: id (integer).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Container ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context: the delete is a move to Trash, it carries sub-folders and notes as one recoverable unit, it is restorable for 30 days, and it permanently removes afterward. No contradiction with 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?
The description is front-loaded with the core action and recoverability, then gives the important alternative and permissions. The final 'Required: id (integer)' sentence is redundant given the schema, but overall it is efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive one-parameter tool with no output schema, the description covers the action, recoverability window, permanence, alternative behavior, permissions, and required parameter. Nothing material is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single required id parameter, so the schema already documents its meaning. The description repeats 'Required: id (integer)' but adds no format or semantic detail beyond the structured field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — moving a folder to Trash — and clarifies scope, contents, and recoverability. It distinguishes itself from containers-update's archived behavior and explicitly names containers-restore as the reversal path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use and when-not-to-use guidance: use this for real deletion that leaves every listing, but use containers-update with archived: true to retire a folder while keeping it browsable in the Archive. It also states the editor-role requirement for team folders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
containers-getARead-onlyIdempotentInspect
Get a single container by ID, including notes_count, children_count, description, negative_space (what does NOT belong in the folder), and LLM instructions if set. Optional: include_tree (boolean) to also get ancestor chain and children. Required: id (integer). A row flagged root: true is the space's root (the notes filed outside any folder), which containers-update refuses; set that space's instructions with instructions-update instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Container ID (required) | |
| include_tree | No | Include ancestors and children arrays (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral value beyond this: the response contents (including the negative_space semantic 'what does NOT belong in the folder'), the include_tree expansion behavior (ancestor chain and children), and the root:true special-case behavior. It omits error behavior (e.g., what happens when id does not exist), but with annotations carrying the safety burden, the added context is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, followed by response contents, then optional parameters, then the root-container caveat. The root:true warning earns its place — it prevents an agent from wasting a call on containers-update. The paragraph is dense but every clause carries information; it is slightly long but justified by the semantic richness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the key return fields, covering the special root case, and providing sibling routing. For a read-only single-get tool with only two parameters, this is largely complete. It does not mention error handling for nonexistent IDs or permission requirements, but these are minor against the readOnlyHint=true and idempotentHint=true annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both id and include_tree are already documented in the schema. The description restates 'Required: id (integer)' and explains include_tree as 'also get ancestor chain and children,' which largely mirrors the schema's 'Include ancestors and children arrays (default: false).' The negative_space clarification concerns the response object rather than parameters, so the description adds only marginal value beyond the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: "Get a single container by ID," and enumerates the exact fields returned (notes_count, children_count, description, negative_space, LLM instructions), which distinguishes it from the sibling containers-list tool that retrieves collections. It also clarifies the notable root: true special case, sharpening exactly what entity this tool targets.
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 single-by-ID phrasing implicitly separates it from containers-list, and it explicitly names containers-update as the tool that refuses root containers, routing the agent to instructions-update for that edge case. It does not explicitly state 'use containers-list instead when you need multiple containers,' leaving that primary alternative unspoken, but the routing guidance it does give is precise and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
containers-listARead-onlyIdempotentInspect
List containers (folders) for organizing notes. Each container includes notes_count and children_count. Returns a JSON array, followed by a line stating the total for the folders it pages through and whether more pages remain; folders shared WITH you are appended in full on the first page and counted separately in that line. Optional: team_id (integer) for team containers, scope ('roots' default|'all'|'archived'), page, per_page. Shared containers are automatically included when listing root-level personal containers. The space's root (the personal root, or a team's root folder) is not a folder: it holds the notes filed outside any folder and cannot be renamed, moved, archived or deleted. It is left out of the default 'roots' scope and appears under 'all' flagged root: true.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| scope | No | Filter scope (default: roots). 'archived' lists archived folders (personal, or the team's with team_id). 'trashed' lists deleted folders still restorable via containers-restore, one entry per delete with restores_with counts. On those entries notes_count and children_count are the folder's OWN notes and sub-folders in that delete, while restores_with totals the whole subtree that comes back with it. | |
| team_id | No | List containers in this team instead of personal containers. Omit it (or send null) for personal containers. | |
| per_page | No | Results per page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and non-destructive, but the description adds substantial behavioral context: pagination details, shared container inclusion, root folder exclusion, and scope-specific behavior (including 'trashed' with restores_with counts). This goes far 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?
The description is long but information-dense, with each sentence covering a distinct aspect (return format, pagination, scopes, root behavior). It is well-structured and front-loads the core purpose before diving into details, though it could be slightly tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a listing tool with no output schema, the description is remarkably complete: it specifies the return format (JSON array plus pagination line), explains all scope nuances, covers shared containers and root exclusion, and addresses edge cases like 'trashed'. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters (100%), so baseline is 3. The description adds extra meaning: root container behavior, shared containers auto-inclusion, and explanation of the 'trashed' scope with restores_with. This enhances understanding beyond the schema's simple 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?
The description clearly states the tool lists containers (folders) for notes and specifies that each container includes notes_count and children_count. It is distinct from sibling tools like containers-get (single container) and containers-create, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the tool's behavior and scopes but does not explicitly say when to use this tool versus alternatives like containers-get. It lacks direct 'use this when' or 'not for' guidance, though the purpose is clear enough for an agent to infer basic usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
containers-permissionsADestructiveIdempotentInspect
Change access only for existing members of the same Hjarni team; this does not invite anyone or publish a folder. Set or clear a team member's role on a team container. Roles cascade to descendants unless a child has its own role. Caller must have admin role on the target container. Required: container_id (integer, must be a team container), user_id (integer, must be a member of the same team), role ('viewer' | 'editor' | 'admin' | 'inherit'). Use 'inherit' to delete an explicit role and fall back to the role inherited from an ancestor (or from team membership). Team owners are always admin and cannot be downgraded. Returns the user's resulting effective_role on that container.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | New role, or 'inherit' to clear an explicit role (required) | |
| user_id | Yes | Team member's user ID (required) | |
| container_id | Yes | Team container ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, idempotentHint=true) by disclosing cascade semantics ('Roles cascade to descendants unless a child has its own role'), the team-owner protection rule ('Team owners are always admin and cannot be downgraded'), and the admin authorization requirement. There is no annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and largely waste-free, with each sentence carrying a distinct constraint. The purpose sentence arrives after the scope sentence, which is slightly less front-loaded than ideal, but 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 3-param mutation tool with no output schema, the description covers authorization, cascade behavior, inherit semantics, protection rules, and the return value ('the user's resulting effective_role'). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, yet the description adds genuine meaning: 'inherit' is explained as deleting an explicit role and falling back to the ancestor/team-membership role, and it constrains container_id to a team container and user_id to a same-team member. This is value beyond the raw enum. Baseline 3 is exceeded.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set or clear a team member's role on a team container') and immediately bounds scope ('Change access only for existing members of the same Hjarni team'). It distinguishes itself from siblings like teams-invite by declaring 'this does not invite anyone or publish a folder'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the when-not conditions ('does not invite anyone or publish a folder') and the prerequisite ('Caller must have admin role on the target container'). It also names the triggering intent ('Change access only for existing members'), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
containers-restoreAIdempotentInspect
Restore a deleted folder from Trash within the connected user's personal Hjarni account or an authorized team workspace, bringing back everything its delete took -- sub-folders and notes return together, exactly as they were. Find restorable folders with containers-list scope 'trashed'. A note that was deleted TOGETHER with a folder can only come back this way (notes-restore refuses it and names the folder). Required: id (integer, the deleted folder's id).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Deleted container ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=true, so the safety profile is covered. The description adds genuinely new behavior: the cascade semantics (sub-folders and notes return together as they were), which the annotations do not convey. This is useful, though it stops short of noting reversibility window or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and cascade effect, then discovery path, then the notes-restore exclusion, then the required parameter. Every sentence carries information, though the parenthetical about notes-restore is slightly verbose.
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, a single fully-described parameter, and no output schema to explain, the description supplies everything needed to call correctly: cascade semantics, how to discover valid ids, the sibling exclusion, and the required argument.
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 there is only one parameter, so the schema already documents 'id'. The description's '(integer, the deleted folder's id)' and 'Required' largely restate the schema, adding little beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Restore a deleted folder from Trash') and the scope (personal account or authorized team workspace). It also distinguishes itself from the sibling notes-restore by explaining the cascade case, so an agent can tell them apart 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?
Explicitly routes the agent to containers-list with scope 'trashed' to find restorable folders, and names the condition under which notes-restore will refuse and this tool is the only path. Both when-to-use and the alternative are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
containers-updateADestructiveIdempotentInspect
Update a folder within the connected user's personal Hjarni account or an authorized team workspace — rename, change description or negative_space (what does NOT belong here), move to a different parent, set display position, or archive/unarchive it. Works for both personal and team containers the current user can edit (team containers require the editor role). Refuses the space's root (root: true in containers-get); set that space's instructions with instructions-update instead, and pass parent_id null, not the root's id, for a top-level folder. Required: id (integer). Optional: name, description, negative_space (pass null to clear it), parent_id (null for root, must be in the same scope), position (integer, lower = first). Archiving: archived (boolean) archives or unarchives the folder itself; add include_notes: true to also retire/reactivate every note filed in it IN BULK, and include_nested: true to sweep nested sub-folders (and, with include_notes, their notes) too. This is THE way to retire a whole folder — e.g. a finished project or a large import whose notes keep surfacing in dashboards — in one call; never loop notes-update over each note for that. The response then includes containers_changed and notes_changed counts (rows actually flipped; note bodies are not returned). On team containers an include_nested sweep requires the editor role on every affected sub-folder. Caveat on reversing: an unarchive sweep reactivates EVERYTHING it touches — include_nested resurrects sub-folders, and include_notes resurrects notes, that the user had archived individually before the sweep. When that matters, unarchive selectively: archived: false on specific folders, and individual notes via notes-update. Unarchiving a nested folder also reactivates its archived ancestor folders, so the restored folder stays reachable. Find archived folders again later with containers-list scope 'archived'.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Container ID (required) | |
| name | No | New name | |
| archived | No | Archive (true) or unarchive (false) the folder. On its own this only flags the folder; combine with include_notes/include_nested to retire its contents too. | |
| position | No | Display order position (lower numbers appear first) | |
| parent_id | No | New parent container ID, or null to move the container to root level. Must belong to the same scope as the container. | |
| description | No | New description | |
| include_notes | No | With archived: also set the same archived state on every kept note filed in the folder (and in its sub-folders when include_nested is true), in one bulk update. Default: false. | |
| include_nested | No | With archived: apply the same archived state to all nested sub-folders as well. Default: false. | |
| negative_space | No | What does NOT belong in this folder, or null to clear it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (destructiveHint=true, idempotentHint=true); the description adds substantial behavior beyond that: root refusal, the editor-role requirement for team containers, the include_notes/include_nested bulk semantics, the response containing containers_changed and notes_changed counts, and a detailed caveat that an unarchive sweep resurrects individually-archived items and reactivates ancestor folders.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope before the operational details, and every sentence carries real information. It is dense and long, with some repetition around archiving semantics, but nothing is truly wasted given the mutation's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter destructive mutation with no output schema, it covers prerequisites (editor role), edge cases (root refusal, ancestor reactivation), reversal caveats, and even the response shape (containers_changed/notes_changed). An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine inter-parameter semantics the schema lacks: parent_id null (not the root's id) for top-level, negative_space null clears the field, and how archived combines with include_notes/include_nested. This meaningfully exceeds the per-field schema docs, though individual field definitions largely mirror the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Update a folder within the connected user's personal Hjarni account or an authorized team workspace') and enumerates every supported operation: rename, description/negative_space, move parent, position, archive/unarchive. It explicitly distinguishes itself from siblings by naming containers-get, instructions-update, and notes-update as the correct tools in specific situations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use and when-not-to-use guidance: refuses the space root and routes the agent to instructions-update, and says to pass parent_id null rather than the root's id. It also gives a strong alternative-routing rule ('never loop notes-update over each note') and a conditional fallback for selective unarchiving.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboard-getARead-onlyIdempotentInspect
Get an overview of the Second Brain: counts of notes, containers, tags, and inbox items, plus recent_notes (the 5 most recently created personal notes) and recent_changes (the 5 most recently edited notes across ALL spaces — personal, teams, and shared containers — newest edit first). Use recent_changes to orient at the start of a conversation on what changed lately everywhere. If everything is empty because the user hasn't saved anything yet, do not just report that: call me and follow onboarding.next_action to run their 60-second setup. No parameters required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds context about the ordering of recent_changes (newest edit first) and the conditional behavior when the dashboard is empty, going beyond annotations to disclose important behavioral traits.
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 detailed but every sentence adds value. It could be slightly more concise, but it is front-loaded with the core purpose and well-structured. Minor deduction for length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and zero parameters, the description sufficiently explains the return fields (counts, recent_notes, recent_changes) and the conditional behavior. It provides complete context for an agent to use the tool appropriately.
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?
No parameters required, and schema coverage is 100%. The description emphasizes 'No parameters required,' which is sufficient. Baseline is 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a dashboard overview with counts of notes, containers, tags, inbox items, plus recent_notes and recent_changes. It is specific about what is returned and distinguishes itself from sibling tools (no other dashboard tool).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use recent_changes ('to orient at the start of a conversation') and provides a conditional: if empty, call 'me' and follow onboarding. This gives clear guidance on when to use this tool vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email-addresses-createAInspect
Create an email capture address. Anything mailed to the returned address becomes a note in the chosen folder, with the subject as the title and attachments carried across. Optional: container_id (integer or null — null or omitted files into the Inbox), label (string — defaults to the folder's name and becomes the first part of the address), tags (string, comma-separated, added to every note alongside the automatic 'email' tag). Tell the user the address once and remind them it is a secret anyone can write to the folder with.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Comma-separated tags added to every note from this address | |
| label | No | How the address is named here, and the first part of the address itself. Defaults to the folder name. | |
| container_id | No | Folder the mail is filed into, or null/omitted for the Inbox |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint false, idempotentHint false, destructiveHint false), but the description adds real behavioral context beyond them: mail-to-note conversion, subject-as-title, attachments carried across, and the crucial security caveat that the address is a secret anyone can write to the folder with. That is exactly the extra context the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then behavior, then parameters, then an imperative reminder. It is a single dense paragraph but each clause carries information; the parenthetical parameter list is slightly verbose but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description explains the return concept ("the returned address") and how it should be handled, and it documents every parameter's effect. For a creation tool with three optional params, this is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters, giving a baseline of 3. The description nonetheless adds semantics beyond the schema, notably that tags are added alongside an automatic 'email' tag and that label becomes the first part of the generated address.
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 ("Create an email capture address") and immediately explains the mechanism (mail becomes a note in a folder). It is easily distinguishable from the sibling email-addresses-list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does and gives an operational instruction ("Tell the user the address once..."), but it never states when to use this versus related creation tools like notes-create or containers-create, nor any prerequisites. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email-addresses-listARead-onlyIdempotentInspect
List the user's email capture addresses. Mail sent to one of these becomes a note in the folder it is bound to. Each entry has id, label, address, destination (folder name, or 'Inbox'), container_id, team_id, tags, notes_count and last_received_at. Returns an empty array when the account has none, and accepting_mail: false when mail sent to them is currently being dropped. Treat every address as a secret: it is a write credential for that folder, so never put one in a note, a summary, or anything shared.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantive behavior beyond them: empty-array return when none exist, the meaning of accepting_mail: false (mail currently being dropped), and a security warning that each address is a write credential for its folder. That last point is a genuine operational constraint an agent would otherwise miss.
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 following sentences each carry load (return fields, edge cases, security). The enumerated field list is slightly long but justified since no output schema exists to document the response.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (id, label, address, destination, container_id, team_id, tags, notes_count, last_received_at) and documenting the empty-array and accepting_mail edge cases. Nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema is trivially complete and there is nothing to disambiguate. Baseline 4 applies for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the user's email capture addresses') and immediately explains what those addresses do, distinguishing this read tool from the sibling email-addresses-create. An agent knows exactly what it retrieves without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the listing semantics, but there is no explicit guidance on when to reach for this versus email-addresses-create or other container/folder tools, and no stated prerequisites. Minimum viable: the verb makes the context obvious, nothing more is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
feedback-submitADestructiveInspect
Send feedback to Hjarni's maintainers, storing a feedback record and emailing an admin notification that cannot be recalled. Use only when the user asks to send feedback, and include only the task-specific details they authorized. Submit feedback about Hjarni itself — confusing tool descriptions, missing capabilities, unexpected errors, friction, or praise. Do NOT use this for the user's own notes or knowledge — those belong in notes-create. Required: category ('bug'|'confusing'|'missing_feature'|'friction'|'praise'|'other'), message (string, what's wrong and ideally what you'd expect instead). Optional: severity ('low'|'medium'|'high', default 'medium'), tool_name (the MCP tool the feedback is about, e.g. 'notes-update'), context (JSON-encoded string with any extra structured data — error excerpts, the arguments you tried, the steps that broke).
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional extra context as a JSON-encoded string (e.g. error messages, arguments tried, related note IDs). Non-JSON strings are stored as plain text. | |
| message | Yes | The feedback itself. Be specific — describe what happened, what you expected, and (if relevant) what would have helped. (required, max 4000 chars) | |
| category | Yes | What kind of feedback this is (required) | |
| severity | No | How impactful this is for users (default: medium) | |
| tool_name | No | The MCP tool this feedback is about, if any (e.g. 'notes-update', 'search') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the mutating, non-repeatable nature is partly signaled. The description adds genuinely new context: the email notification 'cannot be recalled' and the requirement to include only user-authorized details. It stops short of spelling out auth/permission requirements, 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?
Front-loaded with purpose and irreversibility before the when/when-not guidance, and every sentence carries routing or constraint value. It is dense and slightly repetitive of the schema's parameter documentation, which keeps it from a 5.
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 non-idempotent submit action with no output schema, the description covers purpose, triggering conditions, exclusions, and the irreversibility of the side effect. It omits any explicit statement of required permissions or what the confirmation response looks like, minor gaps for this tool class.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter, enum, and the default. The description largely restates the enums and default and adds only marginal framing ('what's wrong and ideally what you'd expect instead', 'error excerpts, the arguments you tried'), which overlaps with the schema's own examples. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send feedback to Hjarni's maintainers') and clarifies the downstream effect (stores a record, emails an admin notification). It explicitly scopes what the feedback is about ('about Hjarni itself — confusing tool descriptions, missing capabilities...') and names the sibling it is not for ('notes-create'), so it is distinguishable from the large sibling list without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when ('use only when the user asks to send feedback') and when-not ('Do NOT use this for the user's own notes or knowledge — those belong in notes-create') plus an authorization constraint ('include only the task-specific details they authorized'). The alternative tool is named directly, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files-attachAInspect
Attach a file to one of your personal notes via base64-encoded data (personal notes only; for team or shared notes use files-create_upload_url). Prefer files-create_upload_url for large files to save tokens. Required: note_id (integer), filename (string), data (base64 string). Optional: content_type (MIME type, default: application/octet-stream), description.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Base64-encoded file contents (required) | |
| note_id | Yes | Note ID (required) | |
| filename | Yes | Filename (e.g. report.pdf) (required) | |
| description | No | Optional file description | |
| content_type | No | MIME type (e.g. application/pdf). Defaults to application/octet-stream |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, destructiveHint=false). Description adds token-saving advice for large files but does not mention other behavioral traits like file size limits, permissions required, or whether the note must exist. Lacks full transparency expected for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (3 sentences) and front-loaded with the core action. Every sentence adds value: purpose, usage guidelines, and parameter summary. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters, no output schema, and basic annotations, the description covers the essential context: which tool to use, required/optional params, and default MIME type. It could mention file size limits or note existence, but is mostly complete for a simple attachment tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description summarizes them and adds default for content_type, but does not add significant new meaning beyond what the schema provides. 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?
The description clearly states the action (attach a file), the resource (personal notes), and the method (via base64-encoded data). It also distinguishes from the sibling tool files-create_upload_url by specifying scope (personal vs team/shared) and efficiency (large files).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('personal notes only') and when not to (use files-create_upload_url for team/shared notes or large files to save tokens). Provides clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files-attach_from_urlAInspect
Fetch a file from a public URL or a native ChatGPT file reference and attach it to one of your personal notes (personal notes only; for team or shared notes use files-create_upload_url). Required: note_id and either url or file. In ChatGPT, prefer file for an available file reference, including generated or processed files when ChatGPT can provide one. ChatGPT supplies the temporary download URL and file ID; never invent them, pass a local file path, or encode the bytes as base64. If both sources are supplied, a non-empty file reference takes precedence; an all-blank file placeholder is ignored. Follows up to three redirects. Optional: filename (overrides reference metadata, otherwise derived from URL), content_type (overrides reference metadata, otherwise from HTTP response), description. When no reference or public URL is available, use files-create_upload_url.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public URL to fetch; optional when file is supplied | |
| file | No | Native file reference supplied by ChatGPT; optional when url is supplied | |
| note_id | Yes | Personal note ID to attach the file to | |
| filename | No | Override filename; otherwise reference metadata or URL path | |
| description | No | Optional file description | |
| content_type | No | Override MIME type; otherwise reference metadata or HTTP response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover openWorldHint=true, idempotentHint=false and destructiveHint=false, but the description adds behavior they cannot express: follows up to three redirects, the url-vs-file precedence rule, blank-placeholder handling, and hard prohibitions (never invent URLs, pass local paths, or base64-encode bytes). For a non-idempotent open-world fetch, these are exactly the operational facts an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but appropriately front-loaded: source and scope come first, then constraints, then optional overrides, then the fallback. Every sentence carries information, though the 'never invent them / local path / base64' sentence and the ChatGPT-supplied-URL sentence overlap slightly 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 a 6-parameter tool including a nested file object and no output schema, the description covers sources, precedence, redirects, overrides, and the fallback tool well. The one gap is what the call returns (attachment identifier or file record), but that is a minor omission given how thoroughly the invocation path is specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description goes beyond the per-field text by defining resolution order ('If both sources are supplied, a non-empty file reference takes precedence; an all-blank file placeholder is ignored') and default derivation for filename and content_type from reference metadata or the HTTP response. Only the note_id parameter gets no added semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Fetch a file from a public URL or a native ChatGPT file reference and attach it to one of your personal notes') and immediately bounds scope to personal notes, naming the sibling (files-create_upload_url) that handles team/shared notes. An agent can distinguish this from files-attach and files-create_upload_url 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?
Explicit when-to-use (public URL or ChatGPT file reference, personal notes), when-not (team or shared notes → files-create_upload_url), a preference rule ('in ChatGPT, prefer file'), and a fallback ('When no reference or public URL is available, use files-create_upload_url'). Alternatives and selection 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.
files-check_uploadARead-onlyIdempotentInspect
Check the status of a file upload created by files-create_upload_url. Returns status: 'pending' (not uploaded yet), 'completed' (file attached, includes file metadata), or 'expired' (link timed out). Required: token (string, from files-create_upload_url response).
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Upload token from files-create_upload_url response (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes all three possible return statuses ('pending', 'completed', 'expired') and their meanings beyond annotations. Annotations already indicate readOnlyHint and idempotentHint, and the description adds valuable behavioral details like timeout expiration and metadata inclusion.
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 efficiently covering purpose, required parameter, and possible outcomes. No redundant information; all text adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple check tool with one parameter and no output schema, the description fully explains inputs, outcomes, and behavior. Annotations cover safety. No 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 has 100% coverage with description for token. The tool description adds context about token origin (from files-create_upload_url response), making the parameter semantics clearer than schema alone.
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?
Explicitly states 'Check the status of a file upload created by files-create_upload_url' with specific verb and resource. Distinguishes from sibling tools like files-create_upload_url and files-attach by clearly stating its role as a status check.
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?
States required parameter token and its source from files-create_upload_url response. Implicitly connects to the upload-creation workflow. Could be more explicit about when not to use, but context is clear given sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files-create_upload_urlAInspect
Generate a one-time upload link for attaching files to a note. Share the upload_url with the user so they can upload directly in their browser, which saves tokens by avoiding base64 encoding. Some clients also render this result as an inline drop-zone the user can drop files into; you cannot detect that, so always share the link either way. The link expires after 30 minutes and accepts up to max_files_per_upload files per request, each up to max_file_size_bytes; when remaining_bytes/remaining_files are present the whole batch must also fit inside those. Use files-check_upload to verify completion. Required: note_id (integer). Optional: description.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | Note ID to attach the file to (required) | |
| description | No | Optional file description |
Output Schema
| Name | Required | Description |
|---|---|---|
| token | Yes | Pass to files-check_upload to confirm completion |
| note_id | Yes | Note the files will attach to |
| expires_at | Yes | ISO 8601 expiry instant |
| note_title | Yes | Title of that note |
| upload_url | Yes | One-time upload URL to share with the user |
| remaining_bytes | No | Bytes left in the account's file allowance; absent when only the per-file cap applies |
| remaining_files | No | Files left in the account's file allowance; absent when only the per-file cap applies |
| expires_in_seconds | Yes | Seconds until the link expires, measured server-side |
| max_file_size_bytes | Yes | Largest single file this upload will accept |
| max_files_per_upload | Yes | Most files one upload request may carry |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/non-idempotent profile, but the description adds substantial context: 30-minute expiry, max_files_per_upload and max_file_size_bytes limits, batch constraints via remaining_bytes/remaining_files, and the rationale for token savings. This goes well 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-loaded with the core purpose and the share-the-link instruction before the caveats. Every sentence is functional, though it is dense and runs long; a hair more structure would help but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers expiry, limits, batch constraints, the drop-zone uncertainty, and the verification path, which is complete for a two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so note_id and description are already documented in the schema. The description merely restates 'Required: note_id' and 'Optional: description' without adding format or semantic 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 ('Generate a one-time upload link') and resource ('attaching files to a note'), and implicitly distinguishes itself from siblings like files-attach and files-attach_from_url by describing a browser-based upload path. An agent knows exactly what this tool produces.
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 instructs to share the upload_url with the user, explains why (token savings), handles the ambiguous drop-zone case, and names files-check_upload as the follow-up verification step. When-to-use and the alternative are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files-get_download_urlARead-onlyIdempotentInspect
Get a time-limited download URL for a file attached to a note. Share the URL with the user to download in their browser. The URL expires 15 minutes after it is issued (see download_url_expires_at in the response); request a fresh one rather than reusing an old URL. It requires no login while valid, so treat it as a credential. Required: note_id (integer), file_id (integer, from notes-get response).
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | File ID from notes-get response (required) | |
| note_id | Yes | Note ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds crucial behavioral context: URL expiry (15 minutes), no-login access, and treating it as a credential. This goes beyond annotations with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler. The core purpose is front-loaded, and the expiry/security note is concise. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a low-complexity tool with fully documented parameters and helpful behavioral notes. The description mentions the response field (download_url_expires_at) even though there is no output schema, covering the return behavior adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters. The description adds value by specifying that file_id comes from notes-get response, which is not in the schema, and reiterates the required relationship. This is a slight enhancement over the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Get a time-limited download URL for a file attached to a note.' It clearly differentiates from sibling file operations (attach, remove, upload) and includes the intended use case (share with user).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: when to use (to download in browser) and practical guidance (request fresh URL instead of reusing old). Lacks explicit exclusions or alternatives, but the purpose is narrow enough that no alternative is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files-removeADestructiveInspect
Permanently remove a file attachment from one of your personal notes (personal notes only). This action is irreversible. Required: note_id (integer), file_id (integer, from notes-get response).
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | File ID from notes-get response (required) | |
| note_id | Yes | Note ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint=true; description adds 'irreversible' and 'personal notes only', but does not detail error behavior or effects on other 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?
Two sentences, front-loaded with main action, no unnecessary words. Efficiently conveys core 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 simple destructive tool with two parameters and no output schema, the description covers essentials. Lacks error handling details but sufficient for basic 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% and description repeats parameter info, adding minimal extra context beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action (permanently remove a file attachment) and the resource (personal notes only), distinguishing it from sibling tools like files-attach or files-get_download_url.
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 states required parameters and that file_id comes from notes-get response, but does not explicitly mention when not to use the tool or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instructions-getARead-onlyIdempotentInspect
Get LLM instructions at the specified level. Call with level 'brain' early in conversations to learn user preferences. Optional: level ('brain'|'personal_root'|'container'|'team'), defaults to 'brain' if omitted or blank; the response echoes resolved_level and defaulted_level (true when the level was defaulted). Optional: id (integer, required for 'container' and 'team' levels). 'container' level takes a personal (or shared) container id and returns the full inheritance chain, outermost first; each entry carries a level field ('brain'|'personal_root'|'team'|'container'). Team container ids are not addressable here — read a team note's chain from notes-get, or the team's own instructions with level 'team'. For an agent token, level 'brain' also returns agent_instructions, written by its person for that agent alone; brain_instructions_off: true means its person kept their brain instructions from it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Container ID or Team ID (required for 'container' and 'team' levels) | |
| level | No | Instruction level: 'brain' (global), 'personal_root', 'container', or 'team'. Defaults to 'brain' if omitted or blank. | brain |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, but the description adds behavior the structured fields cannot: the response echoes resolved_level and defaulted_level (with semantics of when it is true), container returns the full inheritance chain outermost-first with per-entry level fields, and agent tokens additionally receive agent_instructions with a brain_instructions_off flag. That is substantive disclosure of return semantics and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the primary recommended invocation, and every clause carries information (defaults, requirements, inheritance ordering, agent-specific fields). It is dense and passes over semicolon-joined clauses that could be split, but there is 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?
No output schema exists, and the description nonetheless describes the response shape (resolved_level, defaulted_level, inheritance chain, agent_instructions). All parameters are covered in schema and description, no required params, and the level-specific routing gaps are closed.
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 would be 3, but the description goes beyond the schema by tying id to specific levels (required for 'container' and 'team'), clarifying that 'container' accepts a personal or shared container id, and flagging that team container ids are not addressable here. That adds real selection meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get LLM instructions') and immediately scopes it by level, which is the tool's distinguishing axis versus instructions-update. An agent can identify the resource, the enumeration of levels, and the default without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('Call with level "brain" early in conversations to learn user preferences') and names alternatives with the condition that selects them: team container ids route to notes-get or level 'team'. Both the trigger and the exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instructions-updateADestructiveIdempotentInspect
Update LLM instructions at the specified level. Required: level ('brain'|'personal_root'|'container'|'team'), instructions (string). Optional: id (integer, required for 'container' and 'team'), mode ('replace' default|'append'). The 'container' level updates personal containers only; to set instructions for a team, use level 'team' (team owners only). In 'replace' mode (default), the provided text overwrites existing instructions. In 'append' mode, the text is appended to existing instructions with a newline separator. Always read current instructions first before replacing to avoid losing existing content.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Container ID or Team ID (required for 'container' and 'team' levels) | |
| mode | No | Update mode: 'replace' (default) overwrites existing instructions, 'append' adds to them | |
| level | Yes | Instruction level to update (required) | |
| instructions | Yes | The instructions text. In 'replace' mode (default), this overwrites existing instructions. In 'append' mode, this is appended to existing instructions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true), description warns about losing content and advises reading existing instructions first. Modes (replace/append) are clearly explained, adding behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise single paragraph, front-loaded with main action, each sentence adds distinct value without redundancy or fluff.
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?
Comprehensive coverage: no output schema, but explanation of behavior (overwrite/append), prerequisites (team ownership), and safety advice makes the description complete for a mutation 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?
Despite 100% schema coverage, description adds semantic value by explaining level meanings, id requirement logic, mode behaviors, and best practices, going beyond raw schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates LLM instructions at a specified level, listing all level options and distinguishing from sibling tools like instructions-get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidelines: required and optional fields, id requirement for container/team levels, mode options with default, and crucial advice to read current instructions first before replacing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
links-manageADestructiveIdempotentInspect
Create or remove a bidirectional link between two notes. Required: action ('link'|'unlink'), source_note_id (integer), target_note_id (integer). Prefer wiki-link syntax [[id:Title]] in note bodies for inline linking — use this tool for programmatic links without modifying body text. Unlinking is destructive and cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action: 'link' to create a link, 'unlink' to remove it (required) | |
| source_note_id | Yes | First note ID (required) | |
| target_note_id | Yes | Second note ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description aligns with annotations (destructiveHint=true), explicitly stating unlinking is destructive and irreversible. Adds context that it does not modify body text.
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, focused sentences. No redundancy, front-loaded with core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no output schema, the description fully covers purpose, usage context, parameter requirements, and safety warnings.
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 3. Description repeats required parameters and enum values but adds minimal new semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool creates or removes bidirectional links between notes. Differentiates from sibling tools like tags-manage by specifying the action on links.
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 advises preferring wiki-link syntax for inline linking and reserves this tool for programmatic links without body modification. Also warns about destructive unlink behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meARead-onlyIdempotentInspect
Get the connected user's profile, onboarding state, team memberships, and note quota in a single call. Call this once at the start of a conversation so you can greet the user by first name, run the onboarding script only when needed, route notes to the right team space, and avoid suggesting features their account does not include. Returns onboarding.completed (boolean) and onboarding.missing_steps (array of 'connect_mcp' | 'first_note'), which together tell you what, if any, setup is left. May include a nudge (key, message, url) — one frequency-capped suggestion; see the NUDGES section of the server instructions for how to handle it. Exposes the user's email address — same data the user sees in account settings, but never billing or token metadata. No parameters required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, but the description goes further: it discloses that the user's email is exposed while billing and token metadata are not, documents the exact return fields (onboarding.completed, onboarding.missing_steps with its enum values), and warns that the `nudge` field is frequency-capped and must be handled per the server's NUDGES section. That is meaningful behavior beyond 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?
Front-loaded with the purpose, then rationale, then return shape, then privacy scope. Every sentence carries distinct information (when to call, what comes back, what is withheld, how to treat the nudge); no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return contract, and it does: it enumerates the returned fields, gives the missing_steps enum values, and explains the optional nudge. It also clarifies the privacy boundary. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline of 4 applies. The description confirms 'No parameters required,' which matches the empty schema and prevents an agent from hunting for an implicit user identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb plus a bundle of specific resources (profile, onboarding state, team memberships, note quota) and frames them as a single call. Nothing in the sibling list overlaps with this 'current user' scope, so an agent can immediately tell it apart from teams-list, dashboard-get, or instructions-get.
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 instructs 'Call this once at the start of a conversation' and gives the downstream conditions the result powers: greet by first name, run the onboarding script only when needed, route notes to the right team space, avoid suggesting unavailable features. This is genuine when-to-use guidance with an implicit don't-repeat constraint from 'once'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-createADestructiveInspect
Create a note in the connected user's personal Hjarni account, an authorized shared folder, or a team workspace they belong to. The server enforces write access. Approaching or reaching a note quota may email an account-limit notification to the account or team owner; sent emails cannot be recalled. Required: title (string). Always include a 2-3 sentence summary too (required by convention, even though the schema only enforces title) so the note is useful to future LLM sessions. Optional: body (Markdown with [[id:Note Title]] wiki-links), summary, source_url, container_id, tag_list (comma-separated), team_id (to create in a team), review_after (ISO 8601 datetime, only set this for time-boxed notes that should flag themselves stale after a date). A new note starts verified (status 'active'). Search for an existing note on the topic first and update that instead when there is one. Example: {title: 'Meeting Notes', body: '## Agenda\n...', container_id: 5, tag_list: 'meetings, q4'}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Note body content (Markdown with [[id:Note Title]] wiki-links) | |
| title | Yes | Note title (required) | |
| summary | No | A 2-3 sentence summary of the note. Always provide one. | |
| team_id | No | Create note in this team instead of personal space. Omit it (or send null) for personal space. | |
| tag_list | No | Comma-separated list of tags (e.g., 'ruby, rails, testing') | |
| source_url | No | Source URL reference | |
| container_id | No | Container ID to place the note in | |
| review_after | No | Optional ISO 8601 datetime after which the note should be treated as stale. Use for time-boxed notes (e.g. '2026-12-31'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=false, destructiveHint=true, idempotentHint=false), and the description adds real value beyond them: server-enforced write access, quota notifications that email owners and cannot be recalled, and the initial status ('active'). It does not reconcile why a create tool carries destructiveHint=true, which leaves one small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and scope, then constraints, then optional params and an example. Dense and mostly waste-free, though the parameter recap and example add length that partly duplicates the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter creation tool with no output schema, it covers access requirements, side effects, defaults, and per-parameter intent well. Return-value behavior is only partially addressed via the 'starts verified (status active)' remark.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by stating a convention the schema does not enforce ('always include a 2-3 sentence summary ... even though the schema only enforces title') and by clarifying that review_after is only for notes that should flag themselves stale.
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 ('Create a note') plus the scope of targets (personal account, shared folder, team workspace), which cleanly separates it from notes-update, notes-get, and notes-list. It even names the sibling workflow to prefer when a note already exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Search for an existing note on the topic first and update that instead when there is one,' which points at notes-search/notes-update. It also gives conditional guidance for individual parameters (team_id for team creation, review_after only for time-boxed notes).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-deleteADestructiveInspect
Move a note to Trash within the connected user's personal Hjarni account or an authorized team workspace. This is RECOVERABLE — the note (with its body, attachments, and history) is restorable with notes-restore until its purge date (default 30 days); it is not an immediate permanent erase. Deleting the wrong note can be undone with notes-restore. Works on your own personal notes and on team notes where you have the editor role. You cannot delete notes in a shared container (only the owner can). Required: id (integer).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description goes well beyond them: it explains the operation is recoverable, that body/attachments/history are retained, the default 30-day purge window, the role requirement, and the shared-container restriction. This is exactly the contextual nuance a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the recoverability constraint and permission scope, which is the right ordering. Slightly redundant — the recoverability idea is stated twice ('restorable with notes-restore' and 'can be undone with notes-restore'), costing a sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete tool with no output schema, all an agent needs is present: what it does, recovery path, purge window, role/auth constraints, and the blocked case. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (id) and schema coverage is 100%, so the schema already carries full meaning. The description merely restates 'Required: id (integer)' and adds no format or source guidance, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Move a note to Trash') and scopes it to personal vs authorized team workspaces. The recoverable-not-erase framing immediately distinguishes it from any hard-delete expectation and it names the sibling (notes-restore) it pairs with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when it works ('your own personal notes and team notes where you have the editor role') and when it does not ('You cannot delete notes in a shared container (only the owner can)'). It also names the alternative for undoing — notes-restore — with the purge-date window.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-getARead-onlyIdempotentInspect
Get a single note by ID, including its full Markdown body, tags, container path, linked notes (every note it links to or is linked from), backlinks (the subset that links to it), file attachments, and inherited_instructions — every user-written LLM instruction layer that applies to the note, outermost first (an inbox note still carries brain plus its space root), so no separate instructions lookup is needed before editing. A missing brain entry means the user has no custom brain instructions; the defaults come from instructions-get with level 'brain'. A note in Trash returns a status: 'trashed' summary (id, title, purge deadline, how to restore) instead of its content — restore it with notes-restore to read or edit it. Required: id (integer).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavioral detail beyond them: trashed notes return a status:'trashed' summary with purge deadline instead of content, missing brain entry means no custom instructions, and inherited_instructions ordering is outermost-first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and return contents, then layers edge cases (trash, missing brain). It is dense but nearly every clause carries information; the inherited_instructions explanation is slightly long but earns its place for an editing workflow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so: it describes the return payload, the trash-summary exception, and instruction-layer semantics. An agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, so the schema already documents 'id'. The description's 'Required: id (integer)' merely restates the schema with no added syntax or meaning; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (get) and resource (a single note by ID) and enumerates exactly what the return includes: full Markdown body, tags, container path, linked notes, backlinks, attachments, and inherited_instructions. This clearly distinguishes it from siblings like notes-list and notes-search_mentions.
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 — the inherited_instructions payload means 'no separate instructions lookup is needed before editing' — and routes trashed notes to notes-restore. It stops short of an explicit when-not or a named alternative for the single-note read case, but the operational guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-historyARead-onlyIdempotentInspect
Read a note's revision history and provenance: who wrote each version (you, the user, or which AI client), when, and what changed. Use it to attribute facts to their source and to see recent edits before making your own. Read-only. Required: id (integer). Optional: limit (default 20, max 100), before_seq (paginate to older revisions), include_body (boolean — reconstruct each version's full text), seq (integer — return only that revision, with its full reconstructed body).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note ID (required) | |
| seq | No | Return only this revision, including its reconstructed body | |
| limit | No | Max revisions, newest first (default 20, max 100) | |
| before_seq | No | Return revisions older than this seq (pagination) | |
| include_body | No | Reconstruct and include each revision's full body (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint, idempotentHint, destructiveHint. The description supplements with details on what data is returned (who, when, what changed) and parameter effects like include_body reconstructing full text. No contradictions with 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 paragraph front-loaded with purpose, followed by parameter details. Every sentence adds value—no filler. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema provided, but the description gives a good sense of what is returned (who, when, what changed). Could be slightly more explicit about the structure (e.g., list of revisions). Overall sufficient for a read-only history tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value: explains default for limit (20), max (100), meaning of before_seq for pagination, what include_body does, and that seq returns only that revision with full body. This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Read a note's revision history and provenance.' It clearly distinguishes from siblings like notes-get (current version) and notes-revert (revert). The mention of 'who wrote each version' and 'what changed' adds specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'attribute facts to their source' and 'see recent edits before making your own.' Implicitly tells when not by highlighting what it provides (history vs current version). Lacks explicit exclusion of other tools but is clear enough for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-listARead-onlyIdempotentInspect
List and browse the user's saved notes — their stored knowledge and memories (preferences, workflows, projects, meeting notes, references, and the rest) — with optional filtering, sorting, and pagination. Use search instead when hunting for a topic or keyword; use this to enumerate a folder, tag, or scope. Returns paginated results as a JSON array, followed by a line stating how many notes matched in total and whether more pages remain — read it to know if you have the whole folder before acting on it. Optional: team_id (integer) to list team notes, scope ('active'|'archived'|'inbox'|'favorited'|'trashed'), container_id (integer) with include_nested (boolean), tags (array of strings, AND logic), tag_ids (array of integers, AND logic), summary_stale (boolean, filter to notes with outdated summaries), stale (boolean, filter to notes whose freshness is stale — past their review_after date or unverified for a while), sort ('recent'|'oldest'|'title'), page (integer, default 1), per_page (integer, max 100, default 25), include_body (boolean, default false — include each note's full body, so a scoped/paginated listing can retrieve complete contents without a notes-get call per note; withheld for trashed notes, same as notes-get), include_instructions (boolean, defaults to include_body — include each note's inherited_instructions, the same chain notes-get returns, so a full-body listing also carries the rules governing those notes; withheld for trashed notes). container_id can be combined with team_id to list a specific team container. Example: list ruby-tagged notes in a container: {container_id: 5, tags: ['ruby']}. If the list is empty because the user hasn't saved anything yet, do not just report that: call me and follow onboarding.next_action to run their 60-second setup.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| sort | No | Sort order: 'recent' (updated_at desc, default), 'oldest' (updated_at asc), or 'title' (alphabetical) | |
| tags | No | Filter to notes with ALL these tags by name (AND logic). Example: ['ruby', 'rails'] | |
| scope | No | Filter scope (default: active). 'inbox' and 'favorited' only for personal notes; 'trashed' lists the recoverable Trash — restore an entry with notes-restore. | |
| stale | No | Filter to notes whose freshness is stale — past their review_after date or unverified beyond the freshness window (default: not filtered) | |
| tag_ids | No | Filter to notes with ALL these tags by ID (AND logic) | |
| team_id | No | List notes in this team instead of personal notes. Omit it (or send null) for personal notes. | |
| per_page | No | Results per page, max 100 (default: 25) | |
| container_id | No | Filter by container ID | |
| include_body | No | Include each note's full body in the results (default: false) | |
| summary_stale | No | Filter to notes with outdated summaries (default: not filtered) | |
| include_nested | No | Include notes from sub-containers when container_id is set (default: false) | |
| include_instructions | No | Include inherited_instructions (brain, space root, ancestor and container instruction layers, outermost first) on each note — the same chain notes-get returns. Defaults to the value of include_body, so full-body listings carry their governing instructions unless you pass false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false), the description discloses concrete behaviors: it returns a paginated JSON array, then a line with the total match count and whether more pages remain. It also explains that `include_body` and `include_instructions` are withheld for trashed notes, and that `include_instructions` defaults to `include_body` — useful nuance not visible in the schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is front-loaded with the core purpose and use-case distinction, then moves into parameter details. Each sentence adds information (pagination, onboarding fallback, combos), and the example at the end aids comprehension. A few repetitions exist (e.g., the note about being withheld for trashed notes appears twice), but overall it's dense and structured, not flabby.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters (0 required), full schema coverage, and no output schema, the description compensates thoroughly: it explains the output shape (array + total-count line), pagination mechanics, when to use include_body to avoid extra calls, and the empty-result onboarding path. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter and its meaning. The description adds value beyond that by explaining interactions (e.g., `container_id` can combine with `team_id`), the default of `include_instructions`, the `include_body` trade-off, and a concrete example (`{container_id: 5, tags: ['ruby']}`). This is more than a baseline 3, though it doesn't radically change any single param's semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('List and browse') and a clear resource ('the user's saved notes'), then enumerates what those notes are. It explicitly distinguishes itself from the sibling tool `search` ('Use search instead when hunting for a topic or keyword; use this to enumerate a folder, tag, or scope'), so an agent can immediately tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it names the alternative (`search`) and the condition that selects it (topic/keyword hunting vs. enumeration). It also tells the agent what to do when the result is empty (call `me` and follow onboarding.next_action), which is a clear usage directive beyond mere selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-openHjarni NotesARead-onlyIdempotentInspect
Open a note in the Hjarni note panel beside the conversation, where the user can read it, edit the title and body, and save. Use it when the user asks to open, show or work on a specific note; find the id with search first. Returns the same data as notes-get (including body and lock_version), plus space (personal, team or shared), can_edit and uri. Clients without panels get just that data. Without an id the panel opens on a note picker. The user may edit the note in the panel: before changing it with notes-update, pass expected_lock_version from your latest read. Optional: id (integer).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Note ID to open. Omit it to show a picker of recent notes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations by disclosing the panel fallback for clients without panels, the full return shape, and the concurrency-control requirement to use expected_lock_version from the latest read before notes-update. This is behavior an agent cannot infer from 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?
Purpose and trigger lead the description, followed by return shape, then fallback, then mutation caution. Dense but every sentence carries actionable information; only the trailing 'Optional: id (integer)' is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields and the degraded-mode response, and it covers the edit/optimistic-lock workflow. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter with 100% schema coverage, and the schema already documents the omit-id picker behavior. The description restates the same semantics ('Without an id the panel opens on a note picker') without adding format or constraint detail beyond the schema, so the structured data is 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 (open a note in the Hjarni note panel beside the conversation) and explains exactly how it differs from notes-get by enumerating the extra fields (space, can_edit, uri). An agent can distinguish it from notes-get, notes-panel and notes-list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions (user asks to open, show or work on a specific note) plus a prerequisite workflow (find the id with search first) and a follow-on constraint (pass expected_lock_version from your latest read before notes-update). Covers when to use it and what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-panelNote panel actionsADestructiveInspect
Used only by the Hjarni note panel UI to reload, preview and save the note it shows. Assistants should not call this: read with notes-get and edit with notes-update. Actions: 'get' (id; known_lock_version answers status 'unchanged' when the note has not moved), 'search' (query: the panel's note picker, with a short preview per note; with id, only the notes that note can link to), 'browse' (place: one level of the folder tree, its folders and notes), 'preview' (id, body: renders Markdown without saving), 'save' (id, lock_version, title and/or body and/or add_tags/remove_tags; a lock_version that is no longer current saves nothing and answers status 'conflict' with the saved version and a line diff; resolve 'merge_hunks' with hunks {index: 'saved'|'draft'} applies a per-hunk choice), 'create_note' (place, title, body, add_tags), 'create_folder' (place, name), 'update_folder' (place folder:; name, description, llm_instructions, negative_space), 'instructions' (place personal: brain, personal; place team:: team), 'folder_options' (id: where that note can move), 'move' (id, place), 'trash' (id), 'restore' (id), 'favorite' (id, favorited), 'archive' (id, archived), 'history' (id; with seq, that version and its changes), 'revert' (id, seq, lock_version), 'verify' (id), 'file_description' (id, file_id, description), 'save_to_personal' (id of a team note), 'purge' (id of a trashed note: delete for good), 'folder_archive' (place folder:, archived), 'folder_delete' (place), 'folder_restore' (id), 'folder_purge' (id), 'folder_parents' (place), 'folder_move' (place, to), 'folder_reorder' (place, direction up|down), 'tag' (place tag:, op rename|merge|delete, name), 'share' (id, or place folder:; op status|enable|disable|editing_on|editing_off), 'bulk' (ids, op move|archive|unarchive|trash, place for move), 'toggle' (id, lock_version, index, checked: ticks one task checkbox; a lock_version that is no longer current ticks nothing and answers status 'stale' with the saved version).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Note ID (required for get, preview and save) | |
| op | No | tag: rename|merge|delete; share: status|enable|disable|editing_on|editing_off; bulk: move|archive|unarchive|trash | |
| to | No | folder_move: the new parent: personal, team:<id> or folder:<id> | |
| ids | No | bulk: the notes | |
| seq | No | history, revert: the version | |
| body | No | save: new body (full replacement); preview: Markdown to render | |
| name | No | create_folder, update_folder: folder name; tag: the new name, or the tag to merge into | |
| sort | No | browse: note order | |
| team | No | instructions (place team:<id>): the team's instructions (owners only) | |
| brain | No | instructions (place personal): instructions for everything | |
| hunks | No | save with resolve: hunk index => 'saved' or 'draft' | |
| index | No | toggle: which task checkbox, counted from 0 in the note | |
| place | No | browse: spaces, personal, shared, team:<id> or folder:<id> (default spaces), also inbox, favorites, tags, tag:<id>, archived, trash; create_note, create_folder, move: where; update_folder: folder:<id>; instructions: personal or team:<id> | |
| query | No | search: text to find; empty lists recently edited notes | |
| space | No | search: only personal, shared or team:<id> | |
| title | No | save: new title | |
| action | Yes | What to do (required) | |
| checked | No | toggle: the box's new state | |
| file_id | No | file_description: the file | |
| resolve | No | save: apply per-hunk choices from a conflict | |
| summary | No | save: new summary | |
| add_tags | No | save: tags to add (applied to the saved tags, never a conflict) | |
| archived | No | archive: archive (true) or unarchive (false) | |
| personal | No | instructions (place personal): instructions for Personal | |
| direction | No | folder_reorder | |
| favorited | No | favorite: the star's new state | |
| source_url | No | save: new source URL | |
| description | No | update_folder: what the folder is for; file_description: the file's description | |
| remove_tags | No | save: tags to remove | |
| lock_version | No | save: the lock_version the edit started from (required for save) | |
| negative_space | No | update_folder: what does not belong in the folder | |
| llm_instructions | No | update_folder: the folder's AI instructions | |
| known_lock_version | No | get: the lock_version the panel already shows |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it as destructive/non-idempotent; the description adds real behavioral detail beyond them: optimistic-locking semantics for 'get', 'save' and 'toggle' (unchanged/stale/conflict statuses), the fact that a stale lock_version 'saves nothing', the line-diff and merge_hunks conflict resolution path, and that 'purge' deletes for good. This is exactly the concurrency and irreversibility context an agent needs for a mutating 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?
The critical routing warning is correctly front-loaded in the first two sentences, but everything after is one dense, unbroken block enumerating 32 actions with no line breaks or hierarchy. For a mega-tool some enumeration is warranted, yet the format makes scanning for a single action costly.
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 33-parameter dispatcher with no output schema and destructive annotations, the description supplies the key missing pieces: the action inventory, parameter-to-action mapping, and concurrency/conflict behavior. What it does not describe is what most actions return, which is a real but secondary gap given the size of the surface.
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 nonetheless adds per-action grouping (which params belong to which action) and a non-obvious cross-parameter rule not present in the schema: 'search' with an id returns only the notes that note can link to. It stops short of documenting return shapes or the remaining per-action combinations, so it is above baseline but not exhaustive.
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 opening sentence states exactly what the tool is and who it is for ('Used only by the Hjarni note panel UI to reload, preview and save the note it shows'), and it names the sibling tools an assistant should use instead (notes-get, notes-update). An agent can distinguish this from every other notes-* sibling 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?
It gives an explicit negative rule ('Assistants should not call this') plus concrete alternatives for the two use cases an agent would otherwise pick this for (read via notes-get, edit via notes-update). This is the strongest form of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-restoreAIdempotentInspect
Restore a note that notes-delete moved to Trash within the connected user's personal Hjarni account or an authorized team workspace, bringing back its body, tags, attachments, and history. Only works before the note's purge date. Required: id (integer) — the same note id you deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so safety is largely covered. The description adds real behavioral context beyond that: what is restored (body, tags, attachments, history), the purge-date time limit, and the account/workspace scope.
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 front-loaded sentence states scope, effect, and precondition, followed by the required-parameter line. Slightly redundant with the schema's own required marker, but no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-param, annotation-covered mutation with no output schema, the description covers what is restored, the purge-date constraint, and the target account scope. The only missing piece is explicit routing versus notes-revert.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single param is documented there, so baseline is 3. The description goes further by specifying that id is the same note id produced by notes-delete, which is meaningful semantic guidance for retrieving the right value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Restore) and resource (note) with its origin (moved to Trash by notes-delete) and account scope. An agent can distinguish this from notes-delete and, on inspection of the name, from notes-revert without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear applicability condition — only works before the note's purge date — and identifies the parameter needed (the id of the deleted note). However, it does not contrast with the sibling notes-revert, leaving the agent to infer which of the two recovery tools to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-revertADestructiveInspect
Revert a note's body to an earlier revision (find the seq via notes-history). This does NOT erase history — it appends a NEW revision whose body equals the chosen earlier one, attributed to you, so the revert can itself be undone. Use only when the user explicitly asks to undo a change. Optional expected_lock_version (from notes-get) rejects the revert if the note changed since you read it, instead of clobbering that change. Required: id (integer), seq (integer).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note ID (required) | |
| seq | Yes | The revision seq to restore the body to (from notes-history) | |
| expected_lock_version | No | Optional concurrent-edit guard; pass the lock_version you last saw via notes-get |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true), the description explains that the operation does not erase history but appends a new revision attributed to the user, and that the revert can itself be undone. It also details the expected_lock_version guard to prevent clobbering.
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 concise (4 sentences) with front-loaded purpose, followed by behavioral details and parameter guidance. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately explains the effect (appends new revision, not destructive to history), mentions undoability, and covers the lock version guard. It is complete for a mutation tool with moderate 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?
While schema covers 100% of parameters, the description adds meaningful context: it reiterates required parameters, explains the purpose of seq (restore body to that revision), and elaborates on expected_lock_version as a concurrent-edit guard, providing value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reverts a note's body to an earlier revision, specifies it appends a new revision rather than erasing history, and distinguishes from siblings like notes-update and notes-restore by referencing notes-history for finding the seq.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use only when the user explicitly asks to undo a change' and provides prerequisite steps (find seq via notes-history), giving clear context for when and how to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-search_mentionsHjarni notesARead-onlyIdempotentInspect
Used only by the ChatGPT composer's @-mention picker: returns the user's notes matching a typeahead query as selectable resources, each with its space and folder as a subtitle. Assistants should use search instead. Required: query (string, may be empty for recent notes).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text; empty returns recently edited notes |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds non-obvious behavioral context: this endpoint is restricted to the @-mention picker and returns selectable resources with space and folder subtitles. It does not cover auth or rate limits, but those are not clearly needed here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loads the critical usage restriction before naming the alternative. The final sentence repeating the query parameter is redundant with the schema, slightly reducing efficiency, but overall it remains tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, rich annotations, 100% schema coverage, and an output schema, the description contains everything an agent needs. It explains the specialized use case, points assistants to the correct alternative, and does not need to describe return values because the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents that the query string may be empty to return recently edited notes. The description repeats this same information, adding no extra syntax, format, or edge-case meaning beyond the schema. A 3 is the baseline when the schema already carries parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: returns notes matching a typeahead query as selectable resources. It also distinguishes this tool from the sibling `search` tool by explicitly telling assistants to use `search` instead. This is clear enough to identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use context (only the ChatGPT composer's @-mention picker) and an explicit alternative for assistants (`search`). The exclusion is unambiguous, leaving no inference needed about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes-updateADestructiveIdempotentInspect
Update a note: edit its content, move it to a different folder (set container_id, or null for the inbox), archive/favorite it, or change its tags. This is the tool for moving notes between folders; there is no separate move tool. Required: id (integer). Optional content (exactly one body-mutation mode at a time): title, body (full replace), append_body (appends to existing body), insert_after + insert_body (insert text immediately after a unique anchor snippet from the existing body), insert_before + insert_body (insert before a unique anchor), replace_find (+ optional replace_with) (replace a unique snippet; omit replace_with entirely to delete the snippet). Markdown-structure ops (heading/section/checklist aware — safer than eyeballing a unique snippet on long notes): replace_section + section_body (replace everything UNDER a heading, keeping the heading line); append_to_section + section_body (add content at the END of a section — the safe 'insert under heading' when you don't know its last line); rename_heading + new_heading (rename a heading in place, preserving its level unless new_heading carries its own '#'); check_item / uncheck_item (tick/untick a checklist item by its text, e.g. '- [ ] ship it'). Headings and checklist items must each match exactly one line. Anchor and find snippets must match exactly once; include enough surrounding context to disambiguate. Also optional: summary, source_url. Freshness: verified (boolean — pass true to mark the note re-confirmed as still true right now; only send this after the user has actually confirmed it), review_after (ISO 8601 datetime to time-box the note, or null to clear it). Organization: container_id (move note), archived (boolean — works on your own personal notes and on team notes where you have the editor role; notes in shared containers are owner-only), favorited (boolean). Tags: tag_list (full replace, comma-separated), add_tags, remove_tags. tag_list takes precedence over add_tags/remove_tags. Concurrent edit safety: pass expected_lock_version (the lock_version you saw when you last read the note via notes-get / notes-list / search) whenever you want a stale-write guard. If it doesn't match the current version, the update is rejected with the current state included so you can re-read and re-apply (append_body-only calls are exempt; see expected_lock_version). Surgical edits (append_body / insert_after / insert_before / replace_find) are anchor-based and so don't need expected_lock_version for their body change — but if you also change title / summary / container_id alongside, those fields can still silently overwrite a newer save unless you supply expected_lock_version. Examples: insert under a heading {id: 42, append_to_section: 'Open Questions', section_body: '- Should we ship Friday?'}; replace a section {id: 42, replace_section: '## Status', section_body: 'Shipped 🎉'}; rename a heading {id: 42, rename_heading: 'TODO', new_heading: 'Done'}; tick a checklist item {id: 42, check_item: 'ship it'}; fix a typo {id: 42, replace_find: 'recieved', replace_with: 'received'}; safe full rewrite {id: 42, body: '...', expected_lock_version: 5}. Every edit is recorded as a named, revertable revision attributed to you — use notes-history to see who changed what, and notes-revert to undo a change.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note ID (required) | |
| body | No | New body content — full replacement. Mutually exclusive with the other body-mutation modes. Pair with expected_lock_version for concurrent-edit safety. | |
| title | No | New title | |
| summary | No | New summary | |
| add_tags | No | Comma-separated tags to add to existing tags (ignored if tag_list is provided) | |
| archived | No | Archive (true) or unarchive (false) the note. Works on your own personal notes and on team notes where you have the editor role; notes in shared containers can only be archived by their owner. | |
| tag_list | No | Full replacement comma-separated tag list (takes precedence over add_tags/remove_tags) | |
| verified | No | Pass true to mark the note re-confirmed as still true as of now (the 'mark verified' affordance). Refreshes verified_at and clears 'stale' status. Only send after the user has confirmed the note is still accurate. | |
| favorited | No | Favorite (true) or unfavorite (false) the note. Personal and team notes. | |
| check_item | No | Text of a checklist item to tick (set to '[x]'). Matched case- and whitespace-insensitively; a leading bullet/checkbox in the text is ignored. Must match exactly one item. | |
| source_url | No | New source URL | |
| append_body | No | Content to append to the existing body. Mutually exclusive with the other body-mutation modes. | |
| insert_body | No | Text to insert. Must be paired with either insert_after or insert_before. Mutually exclusive with the other body-mutation modes. | |
| new_heading | No | New heading text for rename_heading. The original level is preserved unless this carries its own leading '#' markers. | |
| remove_tags | No | Comma-separated tags to remove from existing tags (ignored if tag_list is provided) | |
| container_id | No | Folder (container) id to move the note into; pass null to move it to the inbox (remove it from its folder) | |
| insert_after | No | Anchor snippet from the existing body — insert_body is inserted immediately after the unique occurrence. Anchor must match exactly once; include surrounding context to disambiguate. | |
| replace_find | No | Snippet to find in the existing body. Must match exactly once. Mutually exclusive with the other body-mutation modes. | |
| replace_with | No | Optional replacement for replace_find. Omit it (or pass an empty string) to delete the matched snippet. | |
| review_after | No | ISO 8601 datetime after which the note should be treated as stale (time-boxing), or null to clear it. | |
| section_body | No | The content for replace_section / append_to_section. Required when either is given. | |
| uncheck_item | No | Text of a checklist item to untick (set to '[ ]'). Same matching rules as check_item. | |
| insert_before | No | Anchor snippet from the existing body — insert_body is inserted immediately before the unique occurrence. Anchor must match exactly once. | |
| rename_heading | No | Heading to rename (with or without leading '#'). Pair with new_heading. Heading must match exactly one. | |
| replace_section | No | Heading whose section content should be replaced (with or without leading '#', e.g. '## Status' or 'Status'). Replaces everything under the heading up to the next same-or-higher-level heading, keeping the heading line. Pair with section_body. Heading must match exactly one. | |
| append_to_section | No | Heading to append content to (with or without leading '#'). Adds section_body at the END of that section — the safe way to 'insert under a heading'. Pair with section_body. Heading must match exactly one. | |
| expected_lock_version | No | Optional concurrent-edit guard. Pass the lock_version you saw when you last read the note; if it doesn't match the current version, the update is rejected and you should re-read and re-apply. Checked whenever supplied — covers title, summary, container_id, body, anything else — with one exception: when append_body is the call's ONLY edit, a stale value does not reject (a bare append lands at the end of the current body and can't lose anyone's update). That exemption also means an append is not replay-protected: if you retry an identical append-only call whose response you never saw, the text is appended twice, so re-read with notes-get instead of blind-retrying. Surgical body edits without this param still work and remain anchor-safe; supply it any time you want a stale-write guard for the other fields too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is exceptionally transparent about mutation, revisions, lock_version behavior, destructive snippet replacement, and the append-only idempotency caveat. However, it directly contradicts the annotation idempotentHint=true by stating that append-only calls are not replay-protected and that retrying an identical append can append the text twice. Per the rubric, a direct contradiction with annotations requires a score of 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately so for a 27-parameter tool. It is logically organized into required params, body-mutation modes, markdown operations, organization, tags, concurrency, and examples, with the core purpose front-loaded and every sentence contributing functional guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly complex mutation tool with no output schema, the description is remarkably complete. It covers concurrency safety, destructive behavior, permissions around archiving, mutual exclusions, matching constraints, and provides concrete examples for the trickiest operations. An agent has enough context to invoke the tool correctly in nearly every documented scenario.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial semantic value beyond the schema: body-mutation modes are grouped and marked mutually exclusive, tag_list precedence over add_tags/remove_tags is stated, 'body wins' over surgical modes is explicitly disclosed, anchor uniqueness rules are explained, and expected_lock_version gets detailed concurrency semantics including the append-only exemption.
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—'Update a note'—and immediately enumerates the distinct actions available: edit content, move folder, archive/favorite, change tags. It explicitly positions itself as the tool for moving notes between folders and notes that there is no separate move tool, clearly differentiating it from sibling tools like containers-update and notes-create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong contextual guidance: it names this as the move tool, explains when to supply expected_lock_version, and points to notes-history and notes-revert for auditing/undoing. It does not systematically contrast with every sibling mutation tool, but it provides enough routing and scenario-based guidance for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nudges-dismissAIdempotentInspect
Dismiss a nudge served in the me payload, on the user's behalf, so it stops appearing on every surface (including the web app). Call this ONLY when the user has actually declined the suggestion or asked not to be reminded — never on mere silence; ignored nudges are already frequency-capped server-side. Required: key (string, the nudge.key from me). Idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The nudge key from the `me` payload's nudge block (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false. The description adds behavioral context: it stops appearing on all surfaces and acts on the user's behalf. No contradictions. Lacks disclosure of potential side effects beyond dismissal, but the annotation covers the safety profile adequately.
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 main action, followed by precise usage conditions and parameter requirement. Every sentence is essential and no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers purpose, usage guidelines, parameter source, idempotency, and effect. No missing information that would hinder 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% with a clear description of the 'key' parameter: 'The nudge key from the `me` payload's nudge block (required)'. The description merely restates this as 'Required: key (string, the `nudge.key` from `me`)', adding no new semantic value 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?
The description clearly states 'Dismiss a nudge served in the `me` payload' with a specific verb (dismiss) and resource (nudge from me payload). It distinguishes from ignoring nudges, and no sibling tool targets nudges, so differentiation is inherent.
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 'Call this ONLY when the user has actually declined the suggestion or asked not to be reminded — never on mere silence', providing clear when-to-use and when-not-to-use guidance, including rationale about server-side frequency capping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchARead-onlyIdempotentInspect
Search across notes, containers, and tags in one call — the retrieval tool for ANYTHING the user has saved in their second brain: preferences, workflows, routines, projects, decisions, meeting notes, research, people, how-tos, code snippets, references, journal entries, and any other saved knowledge or memories. When a task needs something the user previously stored, this is the tool that finds it. Returns results grouped by type with pagination metadata (total_count, page, per_page, total_pages). Required: query (string). Optional: types (array, default all three), search_scope ('all'|'personal'|'team:'), scope ('active'|'archived'), container_id (integer, ignored when search_scope is 'all'), tags (array, AND logic), tag_ids (array, AND logic), include_nested (boolean), include_body (boolean, default false — when true each note includes its full body), include_instructions (boolean, defaults to include_body — when true each note carries inherited_instructions, the same user-written instruction chain notes-get returns, so a full-body search hit arrives with the rules that govern it and needs no follow-up notes-get; pass false to omit the chain from a body-only page), created_after / created_before / updated_after / updated_before (ISO 8601 datetime filters on note timestamps), page (integer, default 1), per_page (integer, default 25, max 100). Note results include a snippet of the matching portion. If results are empty because the user hasn't saved anything yet, do not just report that: call me and follow onboarding.next_action to run their 60-second setup.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for note results (default: 1) | |
| tags | No | Filter note results to notes with ALL these tags (by name) | |
| query | Yes | Search query string (required) | |
| scope | No | Search active or archived notes (default: active) | |
| types | No | Which types to search. Defaults to all three: ['notes', 'containers', 'tags'] | |
| tag_ids | No | Filter note results to notes with ALL these tags (by ID) | |
| per_page | No | Results per page for notes, max 100 (default: 25) | |
| container_id | No | Filter note results to this container (ignored when search_scope is 'all') | |
| include_body | No | Include the full note body on each note result (default: false) | |
| search_scope | No | Search scope: 'all' (default, personal + all teams), 'personal' (personal notes only), or 'team:<id>' (specific team). Applies to note results. | |
| created_after | No | Filter notes created on or after this ISO 8601 datetime (e.g. '2026-04-01T00:00:00Z') | |
| updated_after | No | Filter notes updated on or after this ISO 8601 datetime | |
| created_before | No | Filter notes created before this ISO 8601 datetime | |
| include_nested | No | Include notes from sub-containers when container_id is set (default: false) | |
| updated_before | No | Filter notes updated before this ISO 8601 datetime | |
| include_instructions | No | Include inherited_instructions (brain, space root, ancestor and container instruction layers, outermost first) on each note result — the same chain notes-get returns. Defaults to the value of include_body, so full-body results carry their governing instructions unless you pass false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive (readOnlyHint=true, destructiveHint=false, idempotentHint=true). The description goes beyond these by disclosing the default parameter behavior ('include_body' defaults to false), the branching logic for empty results, and the result grouping/pagination behavior — all genuinely useful for an agent deciding whether search will satisfy the task without side effects. The inclusion of the 'include_instructions' default tied to include_body and the empty-result onboarding guidance is unusually transparent. No contradiction with 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?
Front-loaded with the core purpose, then the key differentiator, then behavioral specifics, then parameters. It's long, but nearly every sentence adds operational value, and the alternatives/division between behavior and empty-state guidance is coherent. The parameter enumeration is dense but earned given the 16 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the core use case, return grouping/pagination, result structure (include_body vs include_instructions), edge case behavior (empty results → call `me`), and parameter semantics like container_id being ignored when search_scope is team-wide. Combined with a rich schema and clear annotations, this is a complete operational picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all 16 parameters with descriptions, so baseline is 3. The description adds genuine value by clarifying the default behaviors (types default to all three, include_body default false, include_instructions defaults to include_body), the AND logic for tags, the ignored condition for container_id, and the semantics of inherited instructions. It doesn't fully explain every parameter, so not a 5, but it materially enriches the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search across notes, containers, and tags') and immediately differentiates itself as the go-to tool for retrieving anything the user has previously saved, contrasting with sibling tools that manage those entities (e.g., containers-create, containers-update). The exhaustive list of content types makes the scope unmistakable, and the phrasing 'Returns results grouped by type' adds concrete output behavior an agent can rely on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly establishes when to use the tool ('When a task needs something the user previously stored') and describes the fallback action when results are empty ('call `me` and follow onboarding.next_action'), which is a genuinely useful decision rule. However, it doesn't explicitly state when not to use it in favor of a specific sibling tool, so a 5 isn't earned, but the context provided is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags-createAInspect
Create a new tag. Check tags-list first to avoid duplicates. Required: name (string). Tag names are automatically lowercased.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tag name (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide basic non-readonly status, but description adds valuable context: tag names are auto-lowercased and duplicate checks are recommended. Not disclosed what happens on duplicate (no idempotency).
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 core action, no redundant words. Efficient and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers creation, required parameter, duplicate avoidance, and a behavioral note. No output schema needed; sufficient for agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter 'name' is fully described in schema with 'Tag name (required)'. Description adds behavioral detail about lowercasing, which is beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Create a new tag' with verb and resource. Differentiates from siblings like tags-list and tags-manage by specifying creation action and noting lowercasing behavior.
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 advises to check tags-list first to avoid duplicates, providing context for appropriate use. Lacks explicit alternatives or when-not-to-use, but clear guidance exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags-listARead-onlyIdempotentInspect
List all tags with their notes_count. Returns a JSON array, followed by a line stating the total and whether more pages remain. Optional: page (integer), per_page (integer).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number | |
| per_page | No | Results per page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral detail by specifying the exact return format (JSON array plus summary line with total and pagination status), which goes 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?
Two sentences with no filler: the first states purpose and output shape, the second lists optional parameters. Information is front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with no required params and no output schema, the description covers the essential behavior and output format. It does not mention pagination defaults or edge cases, but these are minor given the tool's simplicity.
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% for page and per_page, each with basic descriptions. The tool description merely repeats their names and types without adding default values, ranges, or effects. This meets the baseline for high schema coverage but adds no extra guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb 'List' and resource 'tags' with the added detail of 'notes_count', making the tool's purpose specific and unambiguous. It clearly distinguishes from sibling tools like tags-create and tags-manage by describing a read-only listing operation.
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 listing all tags but does not explicitly compare with alternatives or state when not to use it. Given the sibling set includes create/manage, an explicit routing note would improve clarity, but the intent is reasonably inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags-manageADestructiveInspect
Rename, merge, or delete a tag — the cleanup tools for the tag list (this operates on the tag itself, unlike notes-update which only edits one note's tags). Required: action ('rename'|'merge'|'delete') and the tag to act on via name (string, case-insensitive) or tag_id (integer). For 'rename' also pass new_name. For 'merge' also pass the destination via target_name or target_id: every note on the source tag is moved onto the destination and the source tag is deleted — ideal for collapsing duplicates like 'machine learning' into 'machine-learning'. If target_name names a tag that doesn't exist yet, it's created, so you can merge straight into a clean canonical name without creating it first. 'delete' removes the tag from all its notes and deletes it; deleting a name that doesn't exist succeeds as a no-op (already_absent: true), so it's safe to retry. Merge and delete are destructive and cannot be undone; check tags-list first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name of the tag to act on (case-insensitive). Provide this or tag_id. | |
| action | Yes | Action: 'rename', 'merge', or 'delete' (required) | |
| tag_id | No | ID of the tag to act on. Provide this or name. | |
| new_name | No | New name for the tag (required for action 'rename'). | |
| target_id | No | ID of the destination tag to merge into (for action 'merge'). Provide this or target_name. | |
| target_name | No | Name of the destination tag to merge into (for action 'merge'). Provide this or target_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details each action: rename behavior, merge moves notes and deletes source (creating destination if missing), delete removes tag with no-op on missing. It warns of destructiveness and irreversibility, adding significant value 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?
The description is a single dense paragraph that efficiently conveys all necessary information. It could benefit from bullet points or clearer structuring, but every sentence is substantive and front-loaded with the overall purpose.
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 has 6 parameters and no output schema; the description thoroughly explains all actions and edge cases (no-op delete, auto-create target). It lacks details about return values or response format, but overall it is comprehensive for a cleanup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for each parameter, but the description adds context: case-insensitivity, conditional requirements (new_name for rename, target for merge), and auto-creation of merge target. This enhances usability beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it renames, merges, or deletes a tag, explicitly contrasting with notes-update which edits tags on notes. It specifies the resource as 'the tag itself' and calls it 'cleanup tools for the tag list', making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use (tag cleanup) and when to avoid (notes-update for editing note tags). It suggests checking tags-list before destructive actions but does not explicitly state scenarios where the tool should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams-createAInspect
Create a new team owned by the user (they become the owner). Required: name (string). Optional: ref — set to "assistant_suggestion" ONLY when creating in response to the me → suggestions.create_team offer, so the creation is attributed to that surface; omit it when the user asked to create a team unprompted. A user can own at most 3 free teams: at that limit this returns an error naming the teams they own and asking them to delete one — relay it rather than retrying. Returns join_url: a shareable link that lets teammates join themselves, with join_link_expires_at and join_link_uses_remaining. Offer that link FIRST — most people cannot recall a colleague's address mid-conversation — and use teams-invite when the user names a specific address.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Attribution surface. Set to 'assistant_suggestion' only when acting on me.suggestions.create_team; otherwise omit. | |
| name | Yes | Team name (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false); the description goes well beyond by disclosing the 3-free-team quota, the exact error shape, and the instruction to relay rather than retry. It also documents the return payload (join_url, join_link_expires_at, join_link_uses_remaining) in the absence of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and ownership come first, then parameter guidance, then the failure mode and return value. Every sentence carries non-redundant information with no filler despite the density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing return fields, and it also covers the quota-exhaustion error path and the sibling routing. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description nonetheless reinforces the enum meaning of 'ref' with surface-level context ('SOLELY when creating in response to the offer') that the schema text states more tersely. The name parameter is only restated, so credit is marginal rather than substantial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new team') and adds the ownership consequence ('they become the owner'), which is behaviorally meaningful. It also implicitly distinguishes itself from the sibling teams-invite by assigning self-join to this tool.
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 for the ambiguous 'ref' parameter (only when responding to the me → suggestions.create_team offer) and an explicit exclusion (omit when unprompted). It names the alternative teams-invite and the exact condition that selects it (user names a specific address).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams-getARead-onlyIdempotentInspect
Get team details including the 10 most recent notes. Required: id (integer).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Team ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, indicating a safe read operation. The description adds value by specifying that it returns the 10 most recent notes, which is behavioral context beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences, no fluff, and front-loads the core purpose. Every sentence contributes useful information (what it returns and the required parameter).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter, clear annotations), the description is complete. It explains what the tool returns (details plus 10 recent notes). No output schema exists, but the return value specifics are covered. Sibling tools provide context for when to use this tool vs teams-list.
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 parameter. The description restates the required parameter without adding additional meaning or format details beyond what the schema provides. Baseline score 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?
The description clearly states that the tool retrieves team details including the 10 most recent notes, with a specific verb and resource. It distinguishes from sibling tools like teams-list by focusing on a single team's details.
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 specifies the required parameter 'id' (integer). While it does not explicitly state when not to use or list alternatives, the context of sibling tools and the simple nature of the operation provide implicit guidance. Could be slightly improved by mentioning that this is for getting a specific team, not listing all teams.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams-inviteADestructiveInspect
Get a teammate into a team (team owner only), two ways. Required: team_id (integer, from teams-list). WITH email: emails an invite to that address. WITHOUT email: returns join_url, a shareable link anyone can open to join themselves, plus join_link_expires_at and join_link_uses_remaining. Prefer the LINK unless the user names an address — few people can recall a colleague's address mid-conversation, and asking is where teams stall at one member. Give the link to the USER to share; never post it anywhere yourself. Creating a link REPLACES any existing one, so to repeat a link already shared, read join_url from teams-get instead of calling this. Optional: action ('create' (default) | 'revoke').
| Name | Required | Description | Default |
|---|---|---|---|
| No | Address to email an invite to. Omit to get a shareable join link instead. | ||
| action | No | Link mode only (no email): 'create' (default) mints a link and invalidates any previous one; 'revoke' removes it. | |
| team_id | Yes | Team ID (required; use teams-list to find it) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: notes it is team-owner-only (auth requirement), warns that 'Creating a link REPLACES any existing one' (matching destructiveHint/idempotentHint=false), and instructs the agent never to post the link itself. This enriches the destructiveHint=true signal with the specific resource that gets invalidated.
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?
Information-dense and front-loaded, with the mode split and required parameter stated first. It runs long, but nearly every clause carries operative detail (mode selection, replacement warning, sharing rule) rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (join_url, join_link_expires_at, join_link_uses_remaining) and warning about link replacement. An agent has everything needed to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: email omission switches to link mode, action defaults to 'create', and 'revoke' removes the link. It also explains the side effect of 'create' (invalidating prior links), which the schema only hints at.
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 ('Get a teammate into a team') and enumerates the two operating modes (with email vs. without). It explicitly references team_id provenance (from teams-list) and distinguishes itself from teams-get by explaining read vs. create semantics for join links.
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 default preference ('Prefer the LINK unless the user names an address') with a rationale, and names the alternative path (read join_url from teams-get to re-share rather than re-minting). This is actionable when/when-not guidance rather than implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams-listARead-onlyIdempotentInspect
List all teams the user is a member of, including members_count, notes_count, and containers_count for each team. No parameters required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds value by specifying exactly what data is returned (members_count, notes_count, containers_count), which is not in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no wasted words. Efficiently conveys purpose, scope, and returned 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?
Given zero parameters and no output schema, the description is sufficiently complete. It covers the action, scope, and returned data. Minor lack of guidance on ordering or filtering, but acceptable for a simple listing.
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% (empty parameters). Description adds no additional parameter meaning beyond stating no parameters are required, which matches the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (list), resource (teams), scope (user is a member of), and additional fields returned (members_count, notes_count, containers_count). Distinguishes from sibling tool 'teams-get' which retrieves a single team.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'No parameters required' which implies simplicity. No explicit when-not-to-use or alternative suggestions, but the tool is straightforward, and sibling tools (e.g., teams-get) are available for different use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
files-attach_from_url7 fields changed- changed
Input schema / descriptionPrevious value: -"Fetch a file from a URL and attach it to a note."New value: +"Attach a file from a public URL or a ChatGPT file reference. Supply url or file." - changed
Input schema / properties / content_type / descriptionPrevious value: -"Override MIME type (default: from HTTP response)"New value: +"Override MIME type; otherwise reference metadata or HTTP response" - added
Input schema / properties / fileAdded value: +{ + "additionalProperties": false, + "description": "Native file reference supplied by ChatGPT; optional when url is supplied", + "properties": { + "download_url": { + "description": "Temporary HTTPS download URL supplied by ChatGPT", + "type": "string" + }, + "file_id": { + "description": "File ID supplied by ChatGPT", + "type": "string" + }, + "file_name": { + "description": "Original filename, when available", + "type": "string" + }, + "mime_type": { + "description": "File MIME type, when available", + "type": "string" + } + }, + "required": [ + "download_url", + "file_id" + ], + "type": "object" +} - changed
Input schema / properties / filename / descriptionPrevious value: -"Override filename (default: derived from URL)"New value: +"Override filename; otherwise reference metadata or URL path" - changed
Input schema / properties / note_id / descriptionPrevious value: -"Note ID (required)"New value: +"Personal note ID to attach the file to" - changed
Input schema / properties / url / descriptionPrevious value: -"URL to fetch the file from (required)"New value: +"Public URL to fetch; optional when file is supplied" - changed
Input schema / requiredPrevious value: -[ - "note_id", - "url" -]New value: +[ + "note_id" +]
3 tool updates
- Added
notes-open - Added
notes-panel - Added
notes-search_mentions
1 tool update
- Changed
files-create_upload_url2 fields changed- changed
Output schema / properties / remaining_bytes / descriptionPrevious value: -"Bytes left in the Free allowance; absent when only the per-file cap applies"New value: +"Bytes left in the account's file allowance; absent when only the per-file cap applies" - changed
Output schema / properties / remaining_files / descriptionPrevious value: -"Files left in the Free allowance; absent when only the per-file cap applies"New value: +"Files left in the account's file allowance; absent when only the per-file cap applies"
1 tool update
- Changed
containers-list1 field changed- changed
Input schema / properties / scope / descriptionPrevious value: -"Filter scope (default: roots). 'archived' lists archived folders (personal, or the team's with team_id). 'trashed' lists deleted folders still restorable via containers-restore, one entry per delete with restores_with counts."New value: +"Filter scope (default: roots). 'archived' lists archived folders (personal, or the team's with team_id). 'trashed' lists deleted folders still restorable via containers-restore, one entry per delete with restores_with counts. On those entries notes_count and children_count are the folder's OWN notes and sub-folders in that delete, while restores_with totals the whole subtree that comes back with it."
1 tool update
- Changed
teams-invite4 fields changed- changed
Input schema / descriptionPrevious value: -"Invite a teammate to a team by email."New value: +"Invite a teammate by email, or get a shareable join link." - added
Input schema / properties / actionAdded value: +{ + "description": "Link mode only (no email): 'create' (default) mints a link and invalidates any previous one; 'revoke' removes it.", + "enum": [ + "create", + "revoke" + ], + "type": "string" +} - changed
Input schema / properties / email / descriptionPrevious value: -"Email address to invite (required)"New value: +"Address to email an invite to. Omit to get a shareable join link instead." - changed
Input schema / requiredPrevious value: -[ - "team_id", - "email" -]New value: +[ + "team_id" +]
4 tool updates
- Changed
containers-create2 fields changed- changed
Input schema / properties / team_id / descriptionPrevious value: -"Create container in this team instead of personal space"New value: +"Create container in this team instead of personal space. Omit it (or send null) for personal space." - changed
Input schema / properties / team_id / typePrevious value: -"integer"New value: +[ + "integer", + "null" +]
- Changed
containers-list2 fields changed- changed
Input schema / properties / team_id / descriptionPrevious value: -"List containers in this team instead of personal containers"New value: +"List containers in this team instead of personal containers. Omit it (or send null) for personal containers." - changed
Input schema / properties / team_id / typePrevious value: -"integer"New value: +[ + "integer", + "null" +]
- Changed
notes-create2 fields changed- changed
Input schema / properties / team_id / descriptionPrevious value: -"Create note in this team instead of personal space"New value: +"Create note in this team instead of personal space. Omit it (or send null) for personal space." - changed
Input schema / properties / team_id / typePrevious value: -"integer"New value: +[ + "integer", + "null" +]
- Changed
notes-list2 fields changed- changed
Input schema / properties / team_id / descriptionPrevious value: -"List notes in this team instead of personal notes"New value: +"List notes in this team instead of personal notes. Omit it (or send null) for personal notes." - changed
Input schema / properties / team_id / typePrevious value: -"integer"New value: +[ + "integer", + "null" +]
1 tool update
- Changed
files-get_download_url1 field changed- changed
Input schema / descriptionPrevious value: -"Get a temporary download URL for a file attached to a note."New value: +"Get a time-limited download URL for a file attached to a note."
10 tool updates
- Added
containers-delete - Changed
containers-list2 fields changed- changed
Input schema / properties / scope / descriptionPrevious value: -"Filter scope (default: roots). 'archived' only for personal containers."New value: +"Filter scope (default: roots). 'archived' lists archived folders (personal, or the team's with team_id). 'trashed' lists deleted folders still restorable via containers-restore, one entry per delete with restores_with counts." - changed
Input schema / properties / scope / enumPrevious value: -[ - "roots", - "all", - "archived" -]New value: +[ + "roots", + "all", + "archived", + "trashed" +]
- Added
containers-restore - Changed
containers-update3 fields changed- added
Input schema / properties / archivedAdded value: +{ + "description": "Archive (true) or unarchive (false) the folder. On its own this only flags the folder; combine with include_notes/include_nested to retire its contents too.", + "type": "boolean" +} - added
Input schema / properties / include_nestedAdded value: +{ + "description": "With archived: apply the same archived state to all nested sub-folders as well. Default: false.", + "type": "boolean" +} - added
Input schema / properties / include_notesAdded value: +{ + "description": "With archived: also set the same archived state on every kept note filed in the folder (and in its sub-folders when include_nested is true), in one bulk update. Default: false.", + "type": "boolean" +}
- Added
email-addresses-create - Added
email-addresses-list - Changed
files-create_upload_url1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The one-time upload link and the limits it will be judged against.", + "properties": { + "expires_at": { + "description": "ISO 8601 expiry instant", + "type": "string" + }, + "expires_in_seconds": { + "description": "Seconds until the link expires, measured server-side", + "type": "integer" + }, + "max_file_size_bytes": { + "description": "Largest single file this upload will accept", + "type": "integer" + }, + "max_files_per_upload": { + "description": "Most files one upload request may carry", + "type": "integer" + }, + "note_id": { + "description": "Note the files will attach to", + "type": "integer" + }, + "note_title": { + "description": "Title of that note", + "type": "string" + }, + "remaining_bytes": { + "description": "Bytes left in the Free allowance; absent when only the per-file cap applies", + "type": "integer" + }, + "remaining_files": { + "description": "Files left in the Free allowance; absent when only the per-file cap applies", + "type": "integer" + }, + "token": { + "description": "Pass to files-check_upload to confirm completion", + "type": "string" + }, + "upload_url": { + "description": "One-time upload URL to share with the user", + "type": "string" + } + }, + "required": [ + "upload_url", + "token", + "expires_at", + "expires_in_seconds", + "note_id", + "note_title", + "max_file_size_bytes", + "max_files_per_upload" + ], + "type": "object" +}
- Changed
notes-list2 fields changed- added
Input schema / properties / include_bodyAdded value: +{ + "description": "Include each note's full body in the results (default: false)", + "type": "boolean" +} - added
Input schema / properties / include_instructionsAdded value: +{ + "description": "Include inherited_instructions (brain, space root, ancestor and container instruction layers, outermost first) on each note — the same chain notes-get returns. Defaults to the value of include_body, so full-body listings carry their governing instructions unless you pass false.", + "type": "boolean" +}
- Changed
notes-update2 fields changed- changed
Input schema / descriptionPrevious value: -"Update a note. Supports partial updates — only provided fields are changed. The body-mutation modes (body, append_body, insert_body, replace_find, replace_section, append_to_section, rename_heading, check_item, uncheck_item) are mutually exclusive — supply at most one per call."New value: +"Update a note. Supports partial updates — only provided fields are changed. The body-mutation modes (body, append_body, insert_body, replace_find, replace_section, append_to_section, rename_heading, check_item, uncheck_item) are mutually exclusive — supply at most one per call. Supplying two surgical modes together is an error, but `body` is not checked against them: if you send `body` alongside a surgical mode, `body` wins and the surgical edit is ignored rather than rejected, so never send both." - changed
Input schema / properties / expected_lock_version / descriptionPrevious value: -"Optional concurrent-edit guard. Pass the lock_version you saw when you last read the note; if it doesn't match the current version, the update is rejected and you should re-read and re-apply. Checked whenever supplied — covers title, summary, container_id, body, anything else. Surgical body edits without this param still work and remain anchor-safe; supply it any time you want a stale-write guard for the other fields too."New value: +"Optional concurrent-edit guard. Pass the lock_version you saw when you last read the note; if it doesn't match the current version, the update is rejected and you should re-read and re-apply. Checked whenever supplied — covers title, summary, container_id, body, anything else — with one exception: when append_body is the call's ONLY edit, a stale value does not reject (a bare append lands at the end of the current body and can't lose anyone's update). That exemption also means an append is not replay-protected: if you retry an identical append-only call whose response you never saw, the text is appended twice, so re-read with notes-get instead of blind-retrying. Surgical body edits without this param still work and remain anchor-safe; supply it any time you want a stale-write guard for the other fields too."
- Changed
search1 field changed- added
Input schema / properties / include_instructionsAdded value: +{ + "description": "Include inherited_instructions (brain, space root, ancestor and container instruction layers, outermost first) on each note result — the same chain notes-get returns. Defaults to the value of include_body, so full-body results carry their governing instructions unless you pass false.", + "type": "boolean" +}
1 tool update
- Changed
notes-update1 field changed- changed
Input schema / properties / archived / descriptionPrevious value: -"Archive (true) or unarchive (false) the note. Personal notes only."New value: +"Archive (true) or unarchive (false) the note. Works on your own personal notes and on team notes where you have the editor role; notes in shared containers can only be archived by their owner."
1 tool update
- Added
nudges-dismiss
Publisher details
- Operator
- Hjarni, operated by Evert Van den Bruel (Belgium). · Publisher source
- Operator website
- https://hjarni.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://hjarni.com/docs/mcp · Publisher source
- Trust center
- https://hjarni.com/security
- Restrictions
- Requires a free Hjarni account; sign-in is OAuth 2.0 (PKCE) on first connection, no custom OAuth app or API key needed. Full MCP access on every plan, including Free (25 notes, 20 MB across 5 file attachments). Email capture tools require Pro. No regional limits; data is hosted in the EU (Hetzner, Germany). Client-side limits apply: ChatGPT needs a paid plan, and on Claude Team/Enterprise a workspace owner must enable the connector first. · Publisher source
Related MCP Connectors
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
Shared Markdown notes for MCP-compatible AI tools.
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA local-first MCP server that gives AI assistants long-term memory by storing, searching, and recalling notes as Markdown files on your machine.8 npmMIT
- AlicenseAqualityAmaintenanceMCP server for managing a local, domain-agnostic knowledge base using Markdown notes with frontmatter. Enables AI agents to capture, read, search, link, and maintain notes with atomic writes and privacy controls.13MIT
- AlicenseAqualityBmaintenanceAn MCP server that gives AI models a persistent notebook backed by a folder of Markdown files, with tools to discover, read, write, edit, and delete notes.9MIT
- 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
Glama MCP Gateway
Add one secure layer between your agents and this server.