Seamless
Seamless
An AI coding agent rediscovers the same constraint every session, because nothing it learns survives the context window. Run two agents against the same backlog and they pick the same step and build it twice. And the products that promise to fix this keep your project's memory in someone else's database.
Seamless is a local-first memory and coordination substrate for AI coding agents. Works with Claude Code, Codex CLI, and any MCP client. It also works from chats in the Claude desktop app, for long-running work that isn't code: see Seamless in the Claude app.
It gives a fleet of agents a shared, durable memory and a way to divide work
without colliding: memories with a supersession lifecycle, hybrid recall, a
dependency-aware task queue with lease-based claiming, captured plans, and
research trials. Durable knowledge is stored as markdown files on disk; the
seamlessd daemon indexes it, serves it over MCP, and renders a web console,
while the companion seam CLI gives headless agents a direct interface.
Full documentation: thereisnospoon.org/docs/
· Website: thereisnospoon.org (source in
docs/)
Developed and published by Arctop. MIT licensed.
Design principles
Built for a fleet, not a lone agent. Real coordination primitives: a dependency-aware ready-queue, atomic lease-based task claiming, and plans composed of notes and steps, so agents divide labor instead of colliding.
Files are the source of truth. Every memory and note is a markdown file with YAML frontmatter under
~/.seamless-- git-diffable, greppable, hand-editable. SQLite indexes those files and also stores operational state such as sessions, tasks, trials, and events, so back up the whole data directory.Curation proposes, humans dispose. Every gardener pass -- from deduplicating and archiving to flagging dead weight and knowledge gaps -- only proposes; applying is an explicit action. Supersession preserves provenance, so nothing is silently rewritten.
Small, self-contained runtime. A static Go daemon and CLI, no CGO, pure-Go SQLite, no Node, no separate vector engine, no cloud account.
Related MCP server: memmd-mcp
How it compares
The agent-memory space splits into a few recognizable categories. By category, because categories do not go stale:
Seamless | Cloud memory APIs | Built-in agent memory | Knowledge-graph servers | |
Storage format | Markdown files on your disk; SQLite indexes them and stores operational state | Their database, reached by API key | Vendor-managed store inside one product | A graph database, often a separate server |
Runs where | Your machine, localhost only | Their cloud | The vendor's product | Your machine or theirs |
Account required | No | Yes | The vendor's | Usually no |
Multi-agent coordination | Task queue, lease-based claiming, shared plans | None | None -- one agent, one store | Shared reads at best |
Forgetting policy | Supersession with provenance; a gardener proposes, a human disposes | Automatic summarization you do not control | Vendor-defined | Manual |
Runtime | Static Go daemon and CLI | HTTP SDK against their service | None (built in) | Node or Python, plus the database |
For the version with product names and receipts, see the full comparison.
Real transcripts
Four pairs of real, unedited Claude Code sessions -- identical prompt, identical repo, with and without Seamless:
Cold start -- one session continues yesterday's plan from an injected briefing; the other re-derives the work from a
TODOand re-ships a bug the project had already fixed once.Constraint violation -- a security scanner demands
SameSite=Strict, which the team already learned breaks external-link logins. One session ships the regression anyway; one refuses and cites the recorded constraint.Token safety -- told to persist refresh tokens, one agent mirrors the in-memory map into a raw-token SQL column; the other reads a recorded rule first and stores only SHA-256 hashes.
Task collision -- two live agents race for the same plan step. One claim wins, the other bounces with the holder's name and pivots to the next ready step.
What Seamless is not
Not a hosted team knowledge base, not a RAG framework, not a benchmark winner: it is memory and coordination for one owner's fleet of agents, on that owner's machine.
Quick start
curl -fsSL https://thereisnospoon.org/install | shOn Windows, the same install in PowerShell:
irm https://thereisnospoon.org/install.ps1 | iexThat is the whole install. It needs curl and tar and nothing else -- no Go,
no CGO toolchain, no database, no Node. It fetches the checksum-verified release
archive for your platform (macOS, Linux, and Windows; amd64 and arm64), installs
seamlessd and seam into ~/.local/bin, generates the bearer key, installs
hooks, MCP, and skills for the detected Claude Code/Codex local hosts, and runs
the daemon as a per-user service -- launchd on macOS, systemd --user on Linux, an
at-logon Scheduled Task on Windows. It keeps itself up to date: from v0.7.0 it
installs each new release by itself, a day after it is published and at a moment
no agent is using it -- backed up, and rolled back if the new release does not
come up. To update right now, run seamlessd update (--check reports
installed vs latest): your config and ~/.seamless are preserved.
Early days, frequent releases. Seamless is early in its development cycle, and releases with improvements and bug fixes land often. An installer install updates itself from v0.7.0 on; on v0.6.0 or older, run
seamlessd updateonce. See Update & uninstall.
(Why seam? The CLI keeps the short name of Seam v1, the decommissioned
private predecessor Seamless was rebuilt from the ground up to replace.)
Then just start the selected client in a git repo. There is no project to create
and no repo to register: the session-start hook resolves your cwd to its git
root, derives a project from the repo's directory name, and records the mapping
on the spot, so agents inherit project scope without passing it on every call.
Reach for seamlessd map-repo --path ~/code/myrepo --project myrepo only to
override the derived slug.
It is one shell script and piping a stranger's script into a
shell deserves a read first. Prefer the pieces one at a time - Homebrew,
go install, prebuilt archives - or want the override knobs? Every route is
on Install & deploy, and the
Quickstart tailors each step to
your OS and client.
Then: Quickstart · Claude Code setup · Claude app chat setup · Codex local setup · Install & deploy
Documentation
The full docs are at
thereisnospoon.org/docs/ (sources in
docs-src/, generated by cmd/docsgen).
Memory & notes, sessions & briefings, recall, tasks & plans, projects & scope, the gardener | |
Integrating an agent, writing memories that get recalled, coordinating a fleet, troubleshooting | |
Every MCP tool, both CLIs, every config key, the hooks, and the file formats | |
Architecture, contributing, domain invariants |
This README is deliberately short. Anything that can drift from the code -- tool
counts, config keys, CLI flags -- lives in the docs site, where the reference
pages are generated from the code itself and make check fails if they go stale.
Development
make build # ./bin/seamlessd + ./bin/seam
make test # unit tests
make test-race # unit tests under the race detector
make bench # hot-path benchmarks (recall, briefing, matcher, event fan-out)
make lint # golangci-lint
make check # the full gate: build + vet + cross-check + fmt-check +
# docs-check + installer-check + site-check + lint +
# vulncheck + test-race
make doctor # config + database self-checks
make run # serve on 127.0.0.1:8081
make docs # regenerate the docs site (docs-src/ -> docs/docs/, committed)
make docs-serve # regenerate + serve the site at 127.0.0.1:8899/docs/Tests are table-driven with testify/require against fresh or in-memory SQLite.
Use make fmt rather than gofmt -w .: the Make target scopes formatting to
git-tracked files, while a bare gofmt walk also rewrites dot-directories that
Go's ./... pattern excludes.
The docs site's output under docs/docs/ is committed, and make check runs
docs-check, so a change to docs-src/ -- or to the tool surface or config keys
the reference generates from -- must be followed by make docs in the same
change. See SITE.md.
Conventions live in AGENTS.md; read it before writing code.
Available Tools
30 toolscapture_urlA
Fetch a web page (SSRF-guarded: private/loopback addresses are rejected) and save its readable content as a note. Returns the new note's id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | http(s) URL to capture | |
| project | No | project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous. A session bound to a confidential or sealed project can write ONLY into that project. | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already flag a non-read-only, non-idempotent, open-world write, and the description usefully adds the SSRF guard (private/loopback addresses rejected) and the return value (the new note's id). It does not explain what happens on repeated calls or content-extraction failures, but the security constraint is meaningful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero waste, front-loading the fetch action and its security constraint before the return value. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating the return value (the new note's id) and the write semantics. Combined with the fully documented schema, an agent has enough to call it correctly, though failure/retry behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents url, project, and session. The description adds nothing about parameter formats or defaults, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource pair: fetch a web page and save its readable content as a note. This clearly distinguishes it from siblings like notes_create or memory_write, which do not fetch external content. It stops short of naming a sibling explicitly, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but offers no explicit when-to-use versus alternatives (e.g., when to prefer notes_create for pasted content). No exclusions or preconditions are stated beyond the SSRF guard. Usage is only inferable from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
favorite_setAIdempotent
Star or unstar an item. Favorites sort first in the console, are pinned into session briefings (memories), and get a mild recall rank boost. For memories and notes the flag is stored in the file's frontmatter; starring never bumps an item's updated time.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | the item's identifier: memory name, note id (or slug), project slug, plan slug, task id, session id (or name), trial id | |
| kind | Yes | what kind of item to star | |
| project | No | project scope for memory-name/note-slug resolution; defaults to the bound session's project | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| favorite | Yes | true to star, false to unstar |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation (readOnlyHint=false), idempotency, and non-destructiveness. The description adds real context beyond that: the flag lives in frontmatter for memories/notes, and starring never bumps the item's updated time — a side-effect disclosure that matters for an idempotent mutation. It does not cover permissions or how non-file kinds (project, plan, task, session, trial) persist the flag.
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, action front-loaded, each carrying distinct information (what it does, why it matters, how it is stored). No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a mutating tool, the description adequately covers effect, storage mechanism, and a key side effect (updated time unchanged). It leaves open where the flag is stored for non-file kinds and whether any permission or scope rules apply, which is a minor but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter including the enum and the session/project scoping rules is already documented in the schema. The description only touches parameter semantics indirectly by explaining frontmatter storage for the memory and note kinds; 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 pair (star/unstar) and resource (item), and enumerates the effects. No sibling tool performs favoriting, so it is unambiguously distinct from memory_write, notes_update, tasks_update, and the rest of the 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 favoriting achieves (console sort order, session-briefing pinning, recall rank boost), which implies when an agent would want it, but it never states when to use this versus leaving an item unfavorited or naming any alternative approach. Usage is inferred rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gardener_applyADestructiveIdempotent
Resolve a gardener proposal. action=apply carries out the effect (archive -> retire the memory; merge -> supersede the older by the newer; consolidate -> write a unified memory superseding its sources; digest -> save the summary as a note; reproject -> move the memory to another project; rekind -> reclassify the memory's kind in place; split -> create the child/shared projects, link the family, parent the children, retire the source; memory_wanted -> open a task to write the missing memory; tool_error -> open a task to fix the recurring error; merge_plans -> retag a stranded captured plan's notes onto the plan that holds the steps and settle the capture as merged). A proposal whose memory has gone inactive since it was raised is settled as dismissed instead, with the reason under settled. Rejecting has two strengths: action=dismiss discards this proposal and the evidence behind it, so a pattern that keeps recurring is raised again later; action=hide blocks the pattern permanently, so no recurrence re-raises it. Prefer dismiss unless the suggestion is wrong in principle rather than wrong for now. Both are reversible by the owner from the console.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | proposal id (ULID) | |
| action | No | apply (default), dismiss (until it recurs), or hide (forever) | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, which covers the safety profile. The description goes further by itemizing what each apply branch destroys or rewrites (retire, supersede, parent, retag) and by stating both rejection modes are reversible by the owner from the console. It does not describe the response payload or any permission/rate constraints, so it adds real context but not a full behavioral picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the action=apply enumeration are front-loaded and every clause carries distinct information, but the apply enumeration is a single ~150-word parenthetical run-on with semicolon-separated clauses, which makes it harder to scan than a short bulleted list would be. Sized appropriately for the decision complexity; slightly dense in presentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and partially meets it by naming the 'settled' field and the reason recorded there. It covers the important edge cases (inactive memory, reversibility, dismiss vs hide recurrence) but does not describe the full response shape or what a successful apply returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description substantially enriches the action enum beyond the schema's one-line gloss by spelling out the effect of every apply sub-case, the inactive-memory override, and the permanent-vs-temporary distinction for dismiss/hide. It adds nothing for id or session beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb+resource ('Resolve a gardener proposal') and immediately scopes it against the sibling gardener_proposals (which lists rather than resolves) and gardener_split. An agent can tell what this tool does and how it differs from its nearest siblings 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?
The description explicitly guides the apply/dismiss/hide choice, including the decision rule 'Prefer dismiss unless the suggestion is wrong in principle rather than wrong for now,' and contrasts the recurrence behavior of dismiss vs hide. It also documents the fallback path when the underlying memory went inactive, so no branch is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gardener_proposalsARead-onlyIdempotent
List pending gardener proposals (merge/consolidate duplicate memories, archive stale memories, write a monthly session digest, reproject a memory to another project, rekind a memory to a different kind, set up a project split, abandon a never-approved captured plan, fold a stranded captured plan into the composition that carries its steps, write a memory agents keep searching for in vain, or fix an error agents keep hitting). Review, then apply, dismiss or hide each with gardener_apply. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | filter by proposal kind (default: all pending) | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so 'Read-only' is restated structured data and earns no credit. What the description does add is the taxonomy of what a pending proposal can contain, which is genuine behavioral context about the payload, but it says nothing about ordering, volume, pagination, or whether applying is reversible.
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: the verb+resource landing in the first four words, and the read-only/routing sentence closes it. The middle parenthetical is long, but each clause defines a distinct proposal kind rather than padding, so it carries information density without much waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read-only list tool with no output schema, the description covers what is returned conceptually (the set of proposal kinds) and what to do next. It omits return-shape details such as ordering or whether results are paged, which is the only notable gap and a modest one at that.
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 prose parenthetical explains the meaning of nearly every value in the 'kind' enum (merge/consolidate duplicate memories, archive stale memories, reproject, rekind, ship_plan) beyond the schema's bare enum list, adding real semantic value for the main filtering parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List pending gardener proposals') and then enumerates the heterogeneous proposal kinds an agent will actually see (merge, archive, digest, reproject, split, abandon_plan, etc.), so the name's abstract noun 'proposals' is concretized. It also implicitly separates itself from the write-side siblings (gardener_apply, gardener_request, gardener_split).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear workflow: 'Review, then apply, dismiss or hide each with gardener_apply', naming the follow-up tool and the three actions available on each item. It does not state when to prefer gardener_request or gardener_split over this tool, but the review-then-act funnel is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gardener_requestA
The natural-language entry point for REORGANIZING memory. Describe the change in plain language and it returns reviewable pending proposals -- fold duplicates together ("these two memories are duplicates -- keep the newer"), retire stale memories ("archive anything about the old port 8080"), synthesize several into one ("combine the three auth-flow notes"), move a mis-filed memory to another EXISTING project ("the iOS DFU memory belongs in arctop-ios"), or reclassify a memory's kind ("the wordmark memory is a convention, not a constraint"). Use this whenever the user describes how they want their knowledge organized; if the intended change is ambiguous, ask them a clarifying question first. It NEVER mutates memories: it only creates pending proposals -- review with gardener_proposals, resolve with gardener_apply. If the request is to split one project into NEW child projects, it recognizes that and returns guidance (splitSource) pointing you at gardener_split instead. Needs an LLM chat client.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | scope candidate memories: a project slug (its memories + globals), "global" for globals only, or "all" for every project on the machine. Omit to use the session's project. | |
| request | Yes | the reorganization request in plain language | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Crucially discloses it NEVER mutates memories despite readOnlyHint=false, explains the pending-proposal workflow (review then resolve), the splitSource guidance return, and the LLM chat client dependency. This adds substantial context beyond annotations, which only say it is non-destructive but not write-idempotent.
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 rich examples, but the parenthetical examples are dense. Every sentence earns its place, though slightly long.
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 proposal-generating entry point: covers what it does, what it does not do (mutate), how to proceed downstream, ambiguity handling, and the runtime dependency.
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 parameters are fully documented in the schema. The description adds the natural-language framing of 'request' but no format or syntax details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reorganizing memory) plus the primary entry-point role, and enumerates five concrete operations with examples (fold, retire, synthesize, move, reclassify). Clearly differentiated from siblings like memory_write and gardener_split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('use this whenever the user describes how they want their knowledge organized'), when to pause ('if the intended change is ambiguous, ask a clarifying question'), and routes to alternatives (gardener_proposals, gardener_apply, gardener_split with the splitSource return).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gardener_splitA
Plan a project SPLIT: divide one existing project into two or more NEW child projects, keeping cross-platform memories in a shared parent (e.g. split arctop-app into arctop-ios + arctop-android with shared arctop-mobile-apps). Use this when the user wants to break one project into several -- gardener_request points you here (via splitSource) when it detects that intent. It NEVER creates a project or moves a memory: it only creates reviewable pending proposals -- one 'split' setup proposal plus one 'reproject' per memory, all under plan 'split-'. Review with gardener_proposals, then apply each with gardener_apply (or retarget a memory first in the console). Needs an LLM chat client and a known source project slug (see project_list).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | the project slug to split (its own memories are classified into the children/shared parent) | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| instruction | No | optional guidance: which children, what stays shared |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish write/non-destructive/non-idempotent (readOnlyHint=false, destructiveHint=false), and the description adds substantial context beyond them: it only creates reviewable pending proposals, produces one 'split' setup plus one 'reproject' per memory under plan 'split-<source>', never creates a project or moves a memory, and requires an LLM chat client plus a known source slug.
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 example, then the routing/behavior/requirements. Dense but every sentence carries operational content; it could be tightened slightly (the console retarget aside) but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates fully by describing what is produced (pending proposals under a named plan) and the required follow-up review/apply steps, plus prerequisites and the session requirement. An agent has everything needed to invoke and interpret the call.
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 carries the per-parameter burden (baseline 3). The description still adds value by pointing to project_list as the way to obtain the required source slug and by framing what instruction does ('which children, what stays shared') in workflow terms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with concrete scope: 'divide one existing project into two or more NEW child projects, keeping cross-platform memories in a shared parent.' The worked example (arctop-app → arctop-ios + arctop-android) makes the operation unambiguous and distinguishes it from project_create ('NEVER creates a project').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('when the user wants to break one project into several') and how it is reached ('gardener_request points you here via splitSource'). It also names the downstream flow: review with gardener_proposals, then apply with gardener_apply — routing to the correct siblings with conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_appendA
Append markdown to an existing memory's body. The memory keeps its id. To create a new memory, use memory_write.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | markdown to append (aliases: content, text) | |
| name | Yes | memory name | |
| project | No | project slug; defaults to the bound/ambient session's project, then global. Pass project=global to target a global memory. | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, so the agent knows this mutates and repeats accumulate. The description usefully adds that the id is preserved, but omits what happens when the memory does not exist, whether it appends to the end, and the fact that repeated calls duplicate content (relevant given non-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?
Two tight sentences, front-loading the operation and the id-preservation behavior, followed immediately by the alternative. Zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-destructive mutation with no output schema, the description covers the operation, the state outcome (id retained), and the create alternative, while the schema fully documents parameters and annotations cover safety. Only edge-case behavior (missing memory, duplicate appends) is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, body, project resolution, and session scoping in detail. The description adds nothing beyond that, which is the correct baseline when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (append) and resource (an existing memory's body) plus a behavioral fact (the memory keeps its id), which distinguishes it from the create path. An agent can contrast this with memory_write without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the create case to memory_write, so the primary when-to-use boundary is stated. It does not address other adjacent siblings such as memory_edit or notes_append, leaving some selection work to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_deleteADestructiveIdempotent
Delete a memory by name: the markdown file leaves the disk and its index row goes with it, with no provenance and no pointer left behind. Prefer nearly anything else. To replace knowledge that turned out to be wrong, use memory_write with supersedes -- the old memory drops out of every index (briefings, recall) but stays readable, pointing at what replaced it, which is how a later reader learns the thing was reconsidered rather than that it was never believed. To retire something merely stale, leave it for the gardener's archive proposal. Reserve deletion for memories written by mistake: a duplicate, a test, a write into the wrong project.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | memory name | |
| project | No | project slug; defaults to the bound session's project | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them by explaining exactly what destruction means here (file removed plus index row removed, no provenance, nothing left pointing at the old memory) and contrasting it with the soft-removal semantics of supersedes. That is precisely the context an agent needs before an irreversible call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its consequence before any alternatives, and every subsequent sentence carries a distinct routing rule rather than restating the same caution. Length is justified by the irreversible nature of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, three-parameter mutation tool with no output schema, the description supplies the missing pieces: irreversibility, what exactly is destroyed, and the preferred alternatives. Nothing an agent needs to call this safely is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so name, project, and session are already documented in the schema, including the session scoping rules. The description only echoes 'by name' and adds no format, naming, or scoping detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a memory by name') and immediately characterizes the mechanism's effect: the markdown file leaves the disk and its index row goes with it. The phrase 'with no provenance and no pointer left behind' distinguishes it sharply from memory_write with supersedes and from the gardener archive 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?
Explicit when-not guidance ('Prefer nearly anything else') followed by named alternatives with the conditions that select them: memory_write/supersedes for wrong knowledge, gardener archive for stale knowledge, delete only for mistakes like duplicates or tests. This is the strongest form of sibling routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_editADestructiveIdempotent
Edit an existing memory in place with exact search/replace, instead of resending its whole body through memory_write. Each edit's old_string must match the current body exactly and uniquely (or pass replace_all); all edits apply together or none do, so a failed match changes nothing. It is also the only way to change a memory's description or tags on their own: send description/tags_add/tags_remove with no edits and the body is left untouched (memory_write requires a body, so there was no metadata-only path before this), and tags_remove is the only way to clear a tag at all. Returns a unified diff of what landed plus the new content_hash. Use this for corrections that do not change what the item CLAIMS: typos, broken formatting, a stale path or command, a stage's Status flip, metadata. If the MEANING changes -- the conclusion is now different, the advice reversed -- that is a new memory: use memory_write with supersedes, which retires the old one into readable history instead of erasing what it used to say.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | memory name (kebab-case, as memory_read takes it) | |
| edits | No | ordered list of exact search/replace edits, applied in order to the CURRENT body. Each is {old_string, new_string, replace_all?}. old_string must match the body EXACTLY (whitespace and indentation included) and must be unique unless replace_all is true; include surrounding lines to make it unique. All-or-nothing: if any edit fails to match, nothing is written. | |
| project | No | project slug; defaults to the bound/ambient session's project, then global. Pass project=global to target a global memory. | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| tags_add | No | tags to add, leaving the rest in place (a comma-separated string is also accepted) | |
| description | No | replace the one-line description (<=150 chars -- the only text shown in indexes); omit to leave it untouched | |
| expect_hash | No | optional precondition: the content_hash you last read for this item (memory_read/notes_read return it). The write is refused if the stored file has changed since -- another agent or the owner edited it -- so re-read and re-apply your change instead of overwriting theirs. Omit it to write unconditionally. | |
| tags_remove | No | tags to remove, leaving the rest in place; this is how a tag gets cleared (a comma-separated string is also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered; the description does not contradict them. It does add real behavioral context beyond annotations: all-or-nothing atomicity ('all edits apply together or none do'), failed match changes nothing, and the return value (a unified diff plus content_hash). Since annotations carry the safety information, this is supplemental rather than load-bearing, so a 3 fits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and the search/replace mechanism, then routes to memory_write. The volume is high for one tool definition, but nearly every sentence carries routing or constraint information; only the parenthetical about memory_write requiring a body is arguably 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?
No output schema exists, and the description compensates by stating the return value (unified diff plus new content_hash). With 8 parameters, a destructive annotation, and metadata-only behavior all addressed, an agent has everything needed to call the tool and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents old_string/new_string/replace_all/expect_hash. The description does add cross-parameter semantics the schema cannot express: sending description/tags_add/tags_remove with no edits leaves the body untouched, and tags_remove is the only way to clear a tag. That is meaningful value beyond the per-field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Edit an existing memory in place with exact search/replace') and immediately differentiates the tool from memory_write by mechanism and cost ('instead of resending its whole body'). An agent can distinguish it from every 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?
Gives an explicit routing rule: corrections that do not change what the item CLAIMS (typos, formatting, stale paths, status flips, metadata) go here; changes in MEANING go to memory_write with supersedes. It also names a case where this tool is the only option (metadata-only edits, clearing a tag), which is precise when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_readARead-onlyIdempotent
Read a memory by name within the current project (falling back to a global memory of the same name), or directly by id. It reads Seamless memories only -- a name listed in your client's own MEMORY.md (Claude Code's file-based auto-memory) is a local file, not a Seamless memory: open it with your file tools.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | memory id (ULID), as carried by events, recall results, and gardener proposals; bypasses name/project resolution | |
| name | No | memory name; pass exactly one of name or id | |
| project | No | project slug; defaults to the bound session's project | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
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 genuine context beyond them: the name-lookup falls back to a global memory of the same name, and reads are restricted to Seamless memories only. It omits return shape and error behavior on a missing name, so it is 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?
Two sentences, both front-loaded with the primary behavior and the most likely misfire (treating a local MEMORY.md entry as a Seamless memory). No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description covers access modes, scope, and the local-file distinction, which is what an agent needs to call it correctly. It does not describe the returned memory's shape or what happens when neither name nor id resolves, a minor remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (id, name, project, session) are already documented in the schema; the baseline is 3. The description echoes the name-or-id duality but adds no format or scoping detail beyond what the schema states, and never touches project/session.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (memory) with two distinct access modes (by name, with global fallback; or by id). It also draws a sharp boundary against a common confusion, distinguishing Seamless memories from client-side MEMORY.md files, so an agent can tell it apart from recall, memory_append, and file tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear selection context: use a name with project scoping/global fallback, or bypass resolution with an id, and redirects local auto-memory files to file tools. It stops short of explicitly contrasting with the sibling 'recall' tool, which is the most likely alternative for retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_writeADestructiveIdempotent
Create or update a durable memory -- the compact knowledge a future session must not miss (a constraint, gotcha, decision, runbook). Long-form write-ups belong in notes_create; put the one-line lesson here. Writing an existing name updates it in place (its id is stable). On a new name, a semantically similar existing memory is reported as an advisory hint; the write still proceeds. The hint is withheld when the target project's content is fenced from you (see the withheld marker on the response) -- the write lands either way. Pass supersedes to replace a DIFFERENT, now-outdated memory: it is marked invalid and leaves every index (briefing, recall) but stays readable with a pointer here. If superseding fails, the new memory is still written and kept; the error says how to retry.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | markdown body (aliases: content, text) | |
| kind | Yes | memory kind; constraint = what any agent must or must not do regardless of task; convention = a project-local choice or layout fact (naming, branding, where things live or deploy, which files sync together); for kind=stage, open the body with Status: open|in_progress|blocked|done and optionally Gate: human|ai, and flip the status with memory_edit (or a full memory_write) -- append cannot change the header, which is parsed from the top of the body | |
| name | Yes | kebab-case identifier, unique within the project | |
| tags | No | tags, replacing all (a comma-separated string is also accepted); omit to leave an existing memory's tags untouched, and note an empty list reads as absent, not as a clear | |
| project | No | project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous. A session bound to a confidential or sealed project can write ONLY into that project. | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| supersedes | No | name of an existing memory this one replaces; that memory is marked superseded (invalid) and pointed here | |
| description | Yes | one line, <=150 chars -- the only text shown in indexes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is a non-readonly, idempotent, destructive write. The description goes well beyond that: update-in-place with a stable id, an advisory similarity hint on new names, the hint being withheld in fenced projects while the write still lands, supersession marking a memory invalid but keeping it readable, and partial-failure semantics where a failed supersede still leaves the new memory written. This is exactly the failure-mode and side-effect detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb+resource and the notes_create boundary before descending into edge cases. It is dense but each sentence covers a distinct behavior (update-in-place, hint, fencing, supersede, retry); slightly long, but almost 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?
With no output schema and 8 parameters, the description carries the burden and does so: it explains update vs. create, hint behavior, supersession, and recovery from supersede failure. An agent has enough to invoke it correctly and interpret the outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including supersedes and project is already documented in the schema. The description largely restates those same semantics (supersedes, project=global) rather than adding new syntax or format guidance, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create or update a durable memory') and immediately characterizes the artifact ('the compact knowledge a future session must not miss'). It explicitly distinguishes itself from the sibling notes_create, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing ('Long-form write-ups belong in notes_create; put the one-line lesson here') and a concrete condition for the alternative path ('Pass supersedes to replace a DIFFERENT, now-outdated memory'). When-to-use and when-to-use-something-else are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes_appendA
Append a UTC-timestamped line to an existing note's body, by id. Use it when a note is already the right home for what you learned -- a running investigation log, a decision record gaining one more data point -- so the note keeps its id, slug, and place in any plan composition instead of fragmenting into near-duplicates. Appending only ever adds: use notes_update to correct or restructure what is already there, and notes_create when the finding deserves an artifact of its own. Needs the note's id (ULID), which notes_create returns and briefings and plan compositions carry; notes_read resolves one from a slug.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | note id (ULID) | |
| body | Yes | text to append (aliases: content, text) | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=false; the description is consistent and adds the additive-only guarantee ('Appending only ever adds'), which tells the agent nothing existing is lost. It doesn't restate idempotency or explain the mutation's full effect, but it meaningfully supplements the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and mechanism, then routes to alternatives. Three dense sentences all carry information, though the middle sentence's framing is slightly elaborate for the payload being described.
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 purpose, id sourcing, alternatives, and additive semantics for a mutation tool with clear annotations and no output schema. The only minor gap is that it never indicates what a successful append returns, but with annotations covering safety and a full-coverage schema this is a small omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds real meaning: it explains that the id is a ULID sourced from notes_create, briefings, or plan compositions, and that notes_read resolves one from a slug. This is operational guidance the schema does not provide.
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 (append), resource (an existing note's body), the key behavior (UTC-timestamped line) and the addressing key (by id). It explicitly distinguishes itself from notes_update and notes_create, so an agent can separate it from siblings without reading 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 both when-to-use ('when a note is already the right home ... a running investigation log, a decision record') and when-not-to-use ('use notes_update to correct or restructure ... notes_create when the finding deserves an artifact of its own'). Alternatives are named with the selecting condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes_createA
Create a work note -- a research finding, decision record, meeting summary, or any artifact long enough to deserve its own file. Auto-tagged created-by:agent. Notes carry the long form; memory_write carries the compact durable knowledge a future session must not miss, so put the write-up here and the one-line lesson there rather than duplicating either. Pass plan= when the note is a plan's narrative or supporting context, so it joins that plan's composition beside its tasks. Do not use this for what the repo, AGENTS.md/CLAUDE.md, or the current conversation already records, and use notes_append to extend an existing note rather than creating a near-duplicate of it.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | markdown body (aliases: content, text) | |
| plan | No | optional plan slug (plan:<slug> convention): tags this note into that plan's composition so it surfaces on the Plans screen alongside its tasks_add plan=<slug> steps. Use it whenever this note is a plan's narrative or supporting context. | |
| tags | No | tags (a comma-separated string is also accepted) | |
| title | Yes | note title | |
| project | No | project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous. A session bound to a confidential or sealed project can write ONLY into that project. | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| source_url | No | optional source URL | |
| description | No | optional one-line summary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/safe/non-idempotent profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds behavior the annotations do not carry: notes are auto-tagged created-by:agent, and passing plan=<slug> enrolls the note into that plan's composition. It does not describe the return value or whether the created note's identifier is needed for later notes_append calls.
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 first sentence front-loads purpose, followed by sibling routing, plan usage, and exclusions in a logical order with no filler. It is dense and slightly overpacked in a single paragraph, but every sentence carries a distinct instruction.
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 create tool with full schema coverage, no nested objects, and no output schema, the description covers purpose, routing, and the plan-composition side effect adequately. The only gap is what the call returns (e.g., a note handle/ULID a follow-up notes_append would need), which matters for the chained workflow the description itself encourages.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including plan, project, and session is already documented in the schema, which sets the baseline at 3. The description's plan=<slug> guidance largely restates the schema's own plan description ('tags this note into that plan's composition'), adding intent framing but no new syntax or constraints.
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 work note') and then enumerates the kinds of artifacts it produces (research finding, decision record, meeting summary), which lets an agent classify the intended payload immediately. It also explicitly contrasts itself with memory_write and notes_append, so it is distinguishable from siblings without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: put the long-form write-up here, the one-line durable lesson in memory_write, and extend an existing note with notes_append instead of duplicating it. It also adds a clear negative condition ('Do not use this for what the repo, AGENTS.md/CLAUDE.md, or the current conversation already records'), which is rare and valuable in exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes_deleteADestructiveIdempotent
Delete a note by id: the markdown file leaves the disk and its index row goes with it. Permanent, and it leaves no pointer behind, so reserve it for notes that should never have existed -- a duplicate, a write into the wrong project, an agent's own scratch. To fix a note's content use notes_update, and to add to it notes_append; neither loses the artifact. A note tagged into a plan (plan:) is that plan's narrative for whoever inherits it, so read it with notes_read before deciding it is disposable.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | note id (ULID) | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them by stating exactly what is destroyed (file + index row), that no pointer survives, and that the operation is permanent. The plan:<slug> warning about a note being another agent's inherited narrative is behavioral context no annotation conveys.
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 its consequence before any caveats, and each sentence is load-bearing (mechanics, when-to-use, alternatives, plan caveat). It is on the denser side at four sentences, but none are filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool with no output schema, the description supplies the destruction semantics, permanence, sibling routing, and the special-case caution an agent needs before calling. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the id (ULID) and the session parameter are already fully documented in the schema. The description says 'by id' but adds no format, validation, or session-scoping detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource ('Delete a note by id') and immediately specifies the mechanism: the markdown file leaves the disk and the index row goes with it. It explicitly differentiates itself from notes_update and notes_append, so an agent can pick it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('reserve it for notes that should never have existed -- a duplicate, a write into the wrong project, an agent's own scratch') and named alternatives with their conditions (notes_update to fix content, notes_append to add). It adds a further qualifier for plan-tagged notes plus a prerequisite read step, 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.
notes_editADestructiveIdempotent
Edit an existing note in place with exact search/replace, by id, instead of resending its whole body through notes_update. Each edit's old_string must match the current body exactly and uniquely (or pass replace_all); all edits apply together or none do, so a failed match changes nothing. This is the tool for correcting or restructuring part of a long note -- notes_append only ever adds, and notes_update replaces the whole body. Returns a unified diff of what landed plus the new content_hash.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | note id (ULID), as notes_create returns and briefings and plan compositions carry | |
| edits | Yes | ordered list of exact search/replace edits, applied in order to the CURRENT body. Each is {old_string, new_string, replace_all?}. old_string must match the body EXACTLY (whitespace and indentation included) and must be unique unless replace_all is true; include surrounding lines to make it unique. All-or-nothing: if any edit fails to match, nothing is written. | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| expect_hash | No | optional precondition: the content_hash you last read for this item (memory_read/notes_read return it). The write is refused if the stored file has changed since -- another agent or the owner edited it -- so re-read and re-apply your change instead of overwriting theirs. Omit it to write unconditionally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: it discloses all-or-nothing atomicity ('all edits apply together or none do, so a failed match changes nothing'), the exact-and-unique matching requirement, and the return payload ('unified diff of what landed plus the new content_hash'). With readOnlyHint=false and destructiveHint=true already declared, the description still meaningfully extends the safety and behavior picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by the matching constraint, atomicity, sibling differentiation, and return value. No sentence is filler and each clause earns its place, 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?
For a mutation tool with no output schema, the description covers atomicity, preconditions (exact unique match), the return format (diff + content_hash), and how it relates to sibling tools. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so id, edits, old_string, new_string, replace_all, session and expect_hash are all already documented in the schema. The description restates the old_string/replace_all relationship and the all-or-nothing rule, which the schema also covers, so it adds little beyond the structured fields. Baseline 3 is appropriate when the schema carries the load.
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 ('Edit an existing note in place with exact search/replace, by id') and immediately distinguishes itself from notes_update. It also names the mechanism (search/replace) and the sibling it is not, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternatives and their conditions: 'notes_append only ever adds, and notes_update replaces the whole body,' and positions itself as the tool 'for correcting or restructuring part of a long note.' The when-to-use case is unambiguous and no inference is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes_readARead-onlyIdempotent
Read a note by id, or by slug within the current project (falling back to a global note of the same slug). A plan's slug is not a note's: a miss on one names the plan's narrative note.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | note id (ULID); pass exactly one of id or slug | |
| slug | No | note slug, as briefings, plan compositions, and notes_create responses name notes (alias: name) | |
| project | No | project slug for the slug lookup; defaults to the bound session's project | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds real behavior beyond them: the fallback chain from project-scoped slug to a global note of the same slug, and the caveat that a plan's slug is not a note's. Return shape is not described, but for a read it is largely self-evident.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, lookup modes front-loaded, no padding. The trailing sentence about plan slugs is densely compressed and reads ambiguously on first pass, which costs a point against perfect concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with full schema coverage, no output schema, and annotations carrying the safety profile, the description supplies the non-obvious resolution behavior (project-to-global fallback) that an agent needs in order to interpret a miss correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema does not: the ordering semantics of the slug lookup (current project first, then global fallback), which is the parameter behavior most likely to surprise a caller.
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 ('Read a note') and two lookup modes (by id, by slug within project with global fallback). Clear and distinguishable from write-oriented siblings like notes_append or notes_create, though it never names a sibling to contrast against.
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?
Conveys the resolution order (project slug, then global fallback) and warns about the plan-slug vs note-slug mismatch, which is useful context for when a lookup will miss. It does not say when to prefer this tool over recall, memory_read, or project-scoped alternatives, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes_updateADestructiveIdempotent
Update a note's fields by id (title, description, body, project, tags). Omitted fields are untouched; the slug and id stay stable. body replaces the WHOLE body, so pass expect_hash (notes_read returns it) to have the write refused rather than silently overwriting an edit that landed after you read the note -- and use notes_append when you only mean to add to it. Tags come in three flavors: tags replaces the whole set, while tags_add and tags_remove edit it in place; prefer add/remove, since a replace discards whatever another agent tagged in between and tags_remove is the only way to clear a tag at all.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | note id (ULID) | |
| body | No | new body, replacing the whole body (aliases: content, text) | |
| tags | No | tags, replacing all (a comma-separated string is also accepted); an empty list is read as absent and leaves the tags untouched -- to drop a tag use tags_remove | |
| title | No | new title | |
| project | No | new project slug ("" or "global" = global scope) | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| tags_add | No | tags to add, leaving the rest in place; a tag already on the note is not duplicated. Applied after tags. | |
| description | No | new description | |
| expect_hash | No | optional precondition: the content_hash you last read for this item (memory_read/notes_read return it). The write is refused if the stored file has changed since -- another agent or the owner edited it -- so re-read and re-apply your change instead of overwriting theirs. Omit it to write unconditionally. | |
| tags_remove | No | tags to drop, matched exactly; a tag the note does not carry is ignored. Applied last, so it also removes what tags/tags_add just set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the destructive/idempotent profile, and the description adds substantially beyond that: omitted fields are untouched, slug and id stay stable, body replace is whole-body (not a merge), tags replace vs add/remove have different blast radii, and expect_hash can refuse the write rather than overwrite another agent's edit. This is exactly the behavioral context the structured fields do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then layered concurrency and tag semantics in descending priority, using semicolons to keep it as one dense paragraph. It is long, but nearly every clause carries load-bearing behavior; only the repeated tag-flavor explanation borders on redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, it covers mutation scope, concurrency safety, and tag semantics thoroughly. The remaining gap is not addressing notes_edit, so an agent choosing between two very similar updaters is left without disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value by explaining the ORDER of application (add/remove after tags) and the 'prefer add/remove' rule that the schema states more neutrally. It doesn't add much to id/title/project/description beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update a note's fields by id') and enumerates the mutable fields, so the agent knows exactly what is being mutated. It differentiates from notes_append explicitly. However it never distinguishes itself from the near-identically named sibling notes_edit, which is the most likely confusion point.
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 alternative routing: use notes_append when you only mean to add to the body, and prefer tags_add/tags_remove over a full replace. It also states when to supply expect_hash (to avoid clobbering a concurrent edit) and that tags_remove is the only way to clear a tag. These are concrete when-to-use conditions, not inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_createAIdempotent
Register a project up front, with a human-readable name and an optional description. You rarely need this: any durable write naming an unknown project slug (memory_write, notes_create, tasks_add, capture_url, trial_record) already registers that project, and a git repo maps itself to one on its first session. Reach for this only to give a project a proper name and description BEFORE anything is written into it, or to create one you will not write to yet -- an auto-registered project is named after its own slug until someone fixes it. Call project_list first: coining a near-duplicate of an existing slug is the failure mode here. To divide an existing project into children, use gardener_split rather than creating them by hand. The slug defaults to a slugified name; "global" and "all" are reserved, and an existing slug is an error, not an update -- this never renames or edits a project.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | human-readable project name | |
| slug | No | optional explicit slug | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| isolation | No | optional isolation state (open|confidential|sealed); omit for open. open shares normally. confidential means nothing leaves: agents in other projects never read this one, and agents bound to it cannot write outside it. sealed adds the inbound half -- agents here see only this project: no global memories, no family, no cross-project reads. Set it at creation for work that is sensitive from the start; there is no tool to change it afterwards, because tightening detaches family and parent links and is an owner decision, made on an owner surface. Isolation requires a standalone project, so do not create an isolated child of another project. | |
| description | No | optional one-line description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (non-read-only, non-destructive, idempotent, closed-world); the description adds the semantics that matter: existing slug is an error rather than an update, this tool never renames or edits, "global"/"all" are reserved, slug defaults to a slugified name, and isolation can only be set at creation because changing it later detaches family and parent links.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five dense sentences that are front-loaded with purpose and the "you rarely need this" caveat before the caveats and constraints. Slightly long, and a few clauses (auto-registered projects are named after their slug) could be tightened, but nearly every sentence carries routing or constraint 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 5-parameter mutation tool with no output schema and no annotations covering behavior, the description covers when to use it, duplicate-slug failure, reserved slugs, and irreversible isolation. The only gap is that it never hints at what a successful call yields (e.g., the created project/slug), which is minor given the deliberate omission of return-value detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3 baseline applies, but the description still adds value the schema lacks: the slug default rule (slugified name), the reserved slug values, and the error-not-update behavior for existing slugs. Isolation and session semantics largely restate the already-detailed schema text, hence not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Register a project up front") and immediately scopes it against the many siblings that auto-register projects (memory_write, notes_create, tasks_add, capture_url, trial_record). An agent can tell project_create apart from those 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 states when NOT to use the tool ("You rarely need this"), enumerates the alternative paths that already register projects, gives the only two legitimate use cases (naming before writes, creating unused projects), prescribes a prerequisite (call project_list first, citing duplicate slugs as the failure mode), and routes the split case to gardener_split.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_listARead-onlyIdempotent
List every project (slug, name, description, isolation). Use it to learn the exact slug before a deliberate cross-project write or a project_create -- coining a near-duplicate of a slug that already exists is the failure this prevents -- and to see whether work already has a home. You usually do NOT need it to pick a scope: memory, note, and task calls inherit the project from the session binding, and passing project= is for writing outside that on purpose. Each row carries its isolation state (open|confidential|sealed), which is what a cross-project call has to respect: a confidential or sealed project is readable only from a session bound to it, and a sealed one takes no writes from outside either. It returns identity, not contents; to search what is inside a project, use recall.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/idempotent safety profile, and the description adds genuinely new behavioral context: the open|confidential|sealed isolation states, the rule that confidential/sealed projects are readable only from a bound session, and that sealed takes no external writes. It also clarifies it returns identity, not contents.
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 returned fields are front-loaded, and each sentence carries information. The middle sentence is a long, em-dash-heavy clause ('the failure this prevents', 'writing outside that on purpose') that could be tightened, keeping it just short of maximum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what each row contains and what the isolation values mean. Combined with annotations covering the safety profile and a fully documented schema, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one optional parameter and schema description coverage is 100%, so the schema already fully documents the session argument. The description discusses session binding inheritance conceptually but adds no syntax or format detail for the parameter itself, 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?
Opens with a specific verb and resource ('List every project') and enumerates the returned fields (slug, name, description, isolation). It explicitly distinguishes itself from sibling tools: project_create is named as a consumer of this data, and recall is named as the tool for contents rather than identity.
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 (learn the exact slug before a deliberate cross-project write or project_create) and an explicit when-NOT-to-use ('You usually do NOT need it to pick a scope'), explaining that memory/note/task calls inherit the project from the session binding. It also routes to the correct alternative for content search (recall).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallARead-onlyIdempotent
Search durable knowledge (memories, notes) and the work record (tasks, trials, session findings) by meaning and keyword (fused), scoped to the current project plus global items. This is the single search entry point. Work-record hits carry a status (a task's status, a trial's outcome) and match on keyword only. With kind set and no query it lists that memory kind newest-first instead (browse).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | only memories of this frontmatter kind (e.g. convention); implies memories-only, so any scope that excludes memories is rejected; with no query, lists the kind newest-first | |
| limit | No | maximum results (default 10, max 100) | |
| query | No | what you are looking for; required unless kind is set (kind alone lists that kind newest-first) | |
| scope | No | what to search (default all) | |
| project | No | project slug; defaults to the bound session's project | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent, non-destructive read. The description adds real context beyond that: scope is the current project plus global items, work-record hits carry a status and match on keyword only, and kind-without-query flips to a newest-first browse mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose and scope before the special cases. Dense but every clause carries information; the parenthetical asides add slight clutter 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?
With no output schema, the description usefully notes that work-record hits carry a status. Combined with full schema coverage and read-only annotations, an agent has enough to call it correctly, though return shape and ranking behavior are only lightly touched.
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 parameters are already well documented (including the kind/scope interaction and session semantics). The description largely restates the browse behavior and scoping that the schema already covers, 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 (search) and enumerates the resources covered (memories, notes, tasks, trials, session findings) via fused semantic+keyword matching. Explicitly positions itself as 'the single search entry point', which distinguishes it from siblings like memory_read, notes_read, and tasks_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?
Declares itself the single search entry point, implicitly routing the agent away from the read/list siblings, and describes the browse alternative (kind set with no query). It does not explicitly say when to prefer memory_read/notes_read/tasks_list instead, so it falls short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_endAIdempotent
Complete the current session, persisting its findings for future briefings. Uses the bound session unless you pass one.
| Name | Required | Description | Default |
|---|---|---|---|
| mishaps | No | Self-report mishaps this session caused: an action a warning or convention said not to take, live state touched by mistake, a command that hit the wrong target. Pass an array with one short entry per incident; omit when none happened. When a mishap violated a stored memory, name that memory by its exact slug in the entry (e.g. "violated chroma-boot-race by ...") -- the report is then linked to it. Recorded for recurrence review, not blame -- report them even when fully recovered. | |
| session | No | Session to operate on: a name (the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a sess/* name) or a session ULID. Defaults to this connection's session -- bound automatically for Claude Code and Codex agents -- so pass it only to act on another session, or when a call reports the session as ambiguous | |
| findings | Yes | Final findings: what was learned, decided, or left open. Prefer a tight summary (briefings show a short preview), but long findings are stored in full -- they are not rejected. | |
| session_id | No | Session ULID to operate on; takes precedence over session and the bound session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive, idempotent mutation (readOnlyHint=false, destructiveHint=false, idempotentHint=true). The description adds that findings are persisted for future briefings, which is useful context, but says nothing about what happens to the session afterwards or the effect of re-running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the primary action and effect front-loaded and the fallback session behavior second. Nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description conveys the core outcome and the session-resolution default, and the rich schema handles parameter detail. Minor gaps remain around post-completion session state, but nothing critical 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 schema already documents all four parameters in depth, including the session/session_id precedence. The description's 'Uses the bound session unless you pass one' only restates what the schema already states, adding little beyond 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 (complete) and resource (session) plus the effect (persisting findings for future briefings), which sets it apart from the mutating sibling session_update. The distinction from session_update is implied rather than explicit, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence ('Uses the bound session unless you pass one') gives default-behavior context, but there is no explicit when-to-use guidance versus session_update or session_start. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_startAIdempotent
Bind this connection to a work session and return its project briefing. Claude Code and Codex agents running the Seamless hooks are bound to their own session automatically (the 'Seam session' line in the briefing) and do not need this. Call it to bind a client without hooks, to move this connection to another project, or to resume a named session. Later calls inherit the session's project, so they need no project argument.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Absolute working directory. The git repository it is in decides the project, and a repository maps itself to a project on its first session -- no setup step (`seamlessd map-repo` only overrides the derived slug) | |
| host | No | Machine this agent runs on (hostname). Defaults to the X-Seamless-Host header, then to the daemon's own host; pass it only when dialling a daemon on another machine | |
| name | No | Resume the session with this name: a sess/* name from an earlier call, or the cc/... or cx/... on your briefing's 'Seam session' line. A new name starts a separate session under that name; omit it to use your own session, or a fresh one | |
| model | No | Model id powering this agent, exactly as the provider names it (e.g. claude-fable-5, gpt-5.5). Stamped onto memories/notes this session writes; hooks keep it current for Claude Code/Codex sessions, so pass it mainly from other clients | |
| project | No | Project slug to bind. Defaults to the project of the git repository cwd is in, then to your own session's project. If cwd is in a repository too, the two must agree. project=global binds the global scope; an unknown slug creates that project. | |
| repo_root | No | Absolute git repository root enclosing cwd, resolved on YOUR machine. Required when host is not the daemon's: the daemon cannot read your filesystem to find it | |
| repo_origin | No | The repository's origin remote URL, which is how the same repo checked out on two machines is recognized as one project | |
| main_worktree_root | No | Absolute root of the repository's MAIN checkout when repo_root is a linked worktree; defaults to repo_root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (mutation, idempotent, non-destructive), so the burden is lighter. The description adds genuinely non-annotation behavioral context: the call returns a briefing, and 'later calls inherit the session's project, so they need no project argument' — a stateful, connection-scoped side effect an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each front-loading purpose before conditions. The first sentence leads with the core action; the exception and usage clauses follow. No filler sentences, though it is on the longer side for the amount of new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the mention that the call returns 'its project briefing' usefully fills that gap. For an 8-parameter, non-destructive mutation tool with annotations and full schema coverage, the description covers purpose, usage conditions, and stateful behavior — minor gaps only.
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 8 parameters in detail. The description only loosely gestures at parameter meaning ('resume a named session', 'move this connection to another project') and adds no syntax or format not already in 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?
States a specific verb and resource: 'Bind this connection to a work session and return its project briefing.' It also clarifies the automatic-hook case that does not need this call. It stops short of explicitly differentiating from sibling tools like session_update or session_end, but the core action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions ('bind a client without hooks, to move this connection to another project, or to resume a named session') and an explicit when-NOT-needed case ('Claude Code and Codex agents running the Seamless hooks ... do not need this'). Nothing about invocation timing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_updateAIdempotent
Record interim progress on the current session (working findings so far). Uses the bound session unless you pass one.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Session to operate on: a name (the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a sess/* name) or a session ULID. Defaults to this connection's session -- bound automatically for Claude Code and Codex agents -- so pass it only to act on another session, or when a call reports the session as ambiguous | |
| findings | Yes | Working findings / progress note so far | |
| session_id | No | Session ULID to operate on; takes precedence over session and the bound session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a non-destructive, idempotent write, and the description adds the useful behavioral fact that a session is bound by default. It does not disclose the key remaining trait for a write tool: whether passing new findings replaces or appends to previously recorded interim findings, which matters given idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core action is front-loaded and the parameter default is stated immediately after. Nothing here could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter write tool with no output schema, the description covers purpose and session binding adequately and the schema carries the parameter detail. The one real gap is the overwrite-vs-append semantics of repeated updates, which an agent needs in order to call this correctly over a session's lifetime.
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 session, findings, and session_id including the precedence of session_id. The description's 'uses the bound session unless you pass one' restates the schema default rather than adding syntax or edge-case detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Record') and resource ('interim progress on the current session') with a parenthetical clarifying what is stored ('working findings so far'). It is distinguishable from session_start/session_end, but does not say how it differs from other note-recording siblings like memory_write, memory_append, or notes_append.
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 second sentence gives real guidance on the session parameter ('Uses the bound session unless you pass one'), which implies the common case. However, there is no explicit statement of when to use this tool versus memory_write/notes_append or session_start/session_end, so usage is only loosely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_addA
Add a task to the dependency-aware ready queue. depends_on lists task ids that must finish first (done or dropped unblocks); each must exist and must not create a cycle. The task is 'ready' once it has no open/in_progress blocker.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | optional details / acceptance criteria (aliases: content, text) | |
| plan | No | optional plan slug (plan:<slug> convention) that composes this task as a step of a plan. Plan steps are excluded from the default ready-queue and surfaced under the plan filter. | |
| title | Yes | short task title | |
| project | No | project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous. A session bound to a confidential or sealed project can write ONLY into that project. | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless | |
| depends_on | No | task ids this task is blocked by (a comma-separated string is also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readOnly, non-idempotent, non-destructive, so the mutation profile is covered structurally; the description adds real behavioral context beyond that: depends_on ids must exist and must not create a cycle, and 'done or dropped' both unblock dependents. It does not mention duplicate-create behavior, which is the main residual gap given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the dependency contract, then the readiness rule. No filler or restatement of the name.
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 create tool with no output schema and rich per-parameter schema docs, the description covers the essential semantics. The one omission is what the call returns (e.g., the new task id), which matters because depends_on requires ids of existing tasks.
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 then adds meaning the schema lacks, notably that blockers are unblocked by 'done or dropped' states and that a task is ready only with no open/in_progress blocker. This clarifies depends_on semantics beyond the schema's simpler 'task ids this task is blocked by'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a task') plus the distinguishing destination ('dependency-aware ready queue'), which separates it from siblings like tasks_update, tasks_claim and tasks_ready. An agent can identify the tool's role 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?
Usage context is implied by the explanation of depends_on and the definition of 'ready', which tells the agent when a task becomes actionable. However, it never names an alternative or a when-not condition (e.g., use tasks_update to modify an existing task, tasks_claim to take one), so routing guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_claimA
Atomically claim a task for the current session, moving it to in_progress with a lease. A refused claim names its cause: held by another live claim ('task already claimed'), waiting on unfinished dependencies ('task blocked', naming the blockers -- finish those first), or already done/dropped ('task closed'). Re-claiming a task you already hold refreshes (heartbeats) the lease; a task whose lease has expired can be reclaimed. Release it with tasks_release or by closing it (tasks_update done/dropped); session_end releases all of a session's claims.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | task id to claim | |
| session | No | the acting agent's session: the cc/<id> or cx/<id> on your briefing's 'Seam session' line, another session name, or a session ULID. Defaults to this connection's session -- bound automatically for Claude Code and Codex agents -- then a sole active ambient. Pass it when a call reports the agent as ambiguous: the bare call then fails rather than guesses. | |
| session_id | No | the acting agent's session ULID; takes precedence over session and the bound session | |
| lease_seconds | No | lease duration in seconds before the claim lapses and the task becomes reclaimable (default 900) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) by disclosing atomicity, lease lifecycle (refresh on re-claim, expiry makes a task reclaimable), the literal refusal messages, and the release paths. That is exactly the behavioral context an agent needs to act on a failed claim.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and effect, and every sentence carries information. It is somewhat dense with nested parentheticals in the refusal-cause clause, which costs a little readability without wasting words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-side burden and does so: it names the success effect, every failure mode with its literal message, and the release/heartbeat cycles. Nothing an agent needs in order to call this correctly or interpret a refusal 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%, so the baseline is 3; the description adds meaning by explaining how the lease behaves over time (heartbeat on re-claim, lapse then reclaim) and how releasing works, which contextualizes the lease_seconds and session parameters. It stops short of adding format or precedence detail for id/session beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+state transition: 'Atomically claim a task for the current session, moving it to in_progress with a lease.' An agent can distinguish this from tasks_release, tasks_update, and tasks_ready 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?
It enumerates exactly when the call is refused and why ('task already claimed', 'task blocked', 'task closed'), tells the agent what to do about blockers ('finish those first'), and routes to the alternatives: tasks_release or tasks_update done/dropped for release, session_end for bulk release.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_listARead-onlyIdempotent
List a project's tasks, optionally filtered by status, newest first. By default plan-step tasks are excluded; pass plan= to list that plan's steps instead. Pass id= to load a single task by its globally-unique id (a direct lookup that ignores project/status/plan and needs no session scope).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | load exactly one task by its globally-unique id; when set, project/status/plan are ignored and the response's tasks array holds just that task | |
| plan | No | optional plan slug: list that plan's step tasks instead of the default (non-plan) tasks | |
| status | No | optional status filter | |
| project | No | project slug; defaults to the bound session's project | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the bar is lower. The description still adds real behavioral context: the default plan-step exclusion, the newest-first ordering, and the notable fact that an id lookup ignores project/status/plan and needs no session scope — a non-obvious escape hatch an agent could not derive 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?
Three tight sentences, zero filler, and the primary behavior (list tasks, filtered, newest first) is front-loaded before the two alternate modes. Every clause carries information an agent needs to choose the right mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema and five zero-required parameters, the description covers the defaults, both alternate modes, the response shape for the id path, and the session/crediting implication. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters and a baseline of 3 would be defensible. The description adds genuine framing on top: the mode-selection semantics of plan= vs. default vs. id=, and that the id path bypasses session scoping and returns a single-element tasks array.
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 a project's tasks) plus the ordering (newest first) and two alternate modes (plan-step listing, single-task lookup by id). It is immediately clear what the tool returns. It does not, however, name or contrast itself with the adjacent siblings (tasks_ready, tasks_claim), so an agent must infer the boundary between browsing and claiming work.
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 conditional guidance: default excludes plan-step tasks, use plan=<slug> to see a plan's steps instead, use id=<task id> for a direct single-task lookup. What is missing is the 'when not to use this' side — nothing says to prefer tasks_ready for actionable work or tasks_claim to take a task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_readyARead-onlyIdempotent
List the actionable (ready) tasks for a project -- open tasks with no unfinished blocker -- oldest first, plus the blocked tasks with their still-open blockers. By default plan-step tasks are excluded; pass plan= to list that plan's steps instead.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | No | optional plan slug: return that plan's ready/blocked step tasks instead of the default (non-plan) queue | |
| project | No | project slug; defaults to the bound session's project | |
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered. The description adds non-obvious behavior beyond that: results are ordered oldest first, and blocked tasks are included alongside their still-open blockers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary behavior, then the default/override rule. Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description adequately conveys what the return set contains and how it is ordered. It omits anything about result limits or pagination, a minor gap 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 description coverage is 100%, so all three parameters are already documented with defaults and scoping semantics. The description restates the plan parameter's effect but adds no format or syntax detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('List the actionable (ready) tasks for a project') and defines the exact selection criteria (open tasks with no unfinished blocker) plus what else is returned (blocked tasks with their blockers). This distinguishes it from siblings like tasks_list, tasks_claim, and tasks_release.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the default behavior and the escape hatch: plan-step tasks are excluded by default, and passing plan=<slug> switches to that plan's steps. It does not name sibling alternatives such as tasks_list for a fuller view, so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_releaseAIdempotent
Release a task the current session holds, reopening it (status back to open, claim cleared) so another agent can claim it. Only the current holder may release.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | task id to release | |
| session | No | the acting agent's session: the cc/<id> or cx/<id> on your briefing's 'Seam session' line, another session name, or a session ULID. Defaults to this connection's session -- bound automatically for Claude Code and Codex agents -- then a sole active ambient. Pass it when a call reports the agent as ambiguous: the bare call then fails rather than guesses. | |
| session_id | No | the acting agent's session ULID; takes precedence over session and the bound session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation safety profile (readOnly=false, idempotent=true, destructive=false), so the bar is lower. The description still adds real value: the exact post-state (status=open, claim cleared), the authorization requirement (holder only), and the downstream effect that another agent can then claim it. It does not say what happens on a failed release or on session end.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and its effect, then the constraint. No filler and nothing redundant with the name or 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 a mutation tool with no output schema, it covers the essential semantics: what changes, who may call it, and the benefit to other agents. Minor gaps remain around failure/error behavior and whether releasing happens implicitly at session end.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the session/session_id params are thoroughly documented in the schema itself. The description only implies session scoping via 'the current session holds' and adds no syntax or precedence detail beyond the schema, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (release) and resource (task) and spells out the resulting state transition: 'status back to open, claim cleared'. The phrase 'so another agent can claim it' makes the inverse relationship to tasks_claim unambiguous without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The precondition 'Only the current holder may release' tells the agent when this tool is valid, and 'a task the current session holds' scopes the use case. It stops short of naming an alternative (e.g. tasks_update for status changes) or stating when-not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_updateAIdempotent
Update a task: change status (open|in_progress|done|dropped), edit title/body, or add dependencies. Moving to done/dropped closes it and unblocks its dependents. A task another session holds via a live claim is locked to its holder: updating it fails with 'already claimed' until the lease lapses or the holder releases it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | task id | |
| body | No | new body (aliases: content, text) | |
| title | No | new title | |
| status | No | new status | |
| project | No | reassign the task to another project slug (used when a split moves a project's open work to a child) | |
| session | No | the acting agent's session (the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session name); needed only to mutate a task you hold a live claim on when several agents are active | |
| session_id | No | the acting agent's session ULID; takes precedence over session and the bound session | |
| add_depends_on | No | task ids to add as blockers (a comma-separated string is also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotentHint=true, destructiveHint=false), the description adds critical behavioral details: status transitions to done/dropped close the task and unblock dependents, and locked tasks fail with an error. This gives the agent a clear understanding of side effects and constraints.
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 only: the first states the main capabilities, the second covers the critical lock behavior. No fluff, front-loaded, and every sentence adds essential 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 tool with 8 parameters and no output schema, the description covers the primary update types and the locking mechanism. It does not explain the return value or all edge cases (e.g., adding dependencies to a closed task), but the information provided is sufficient for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the status enum values, the comma-separated string acceptance for add_depends_on, and the condition for using the session parameter. It does not elaborate on every parameter (e.g., project, session_id precedence) but provides sufficient context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update a task' and enumerates specific fields (status, title, body, dependencies). It distinguishes from siblings like tasks_add and tasks_claim by focusing on updates and mentioning lock behavior unique 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?
The description explains when to use the tool (to update task fields) and notes that attempting to update a locked task fails. It provides guidance on when the session parameter is needed. However, it does not explicitly mention alternatives (e.g., using tasks_release to unlock) or when not 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.
usage_summaryARead-onlyIdempotent
Report a roll-up of activity: memory/note/session/task counts, retrieval totals with the most-injected memories, pending gardener proposals, and events by kind. Every count is machine-wide and identical for every caller; only the named memory lists (topInjected, topUtility) are fenced, so memories this session may not read under project isolation are dropped from them and those lists can come back shorter than the counts imply. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which already declare readOnly/idempotent/non-destructive), the description discloses genuinely non-obvious behavior: counts are machine-wide and identical for every caller, while only topInjected/topUtility are fenced by project isolation, so those lists can legitimately come back shorter than the counts imply. That is exactly the kind of discrepancy an agent would otherwise misread as a bug.
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 payload contents before the fencing caveat. The middle sentence is dense but every clause (machine-wide, fenced lists, shorter-than-implied) carries distinct meaning; the trailing "Read-only." is the only mild redundancy given readOnlyHint.
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 convey what comes back and it largely does, naming the count groups, the top-injected/topUtility lists, and the events-by-kind breakdown. It stops short of describing the response's shape or ordering, but for a read-only roll-up it is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single session parameter is documented in detail there (formats, defaulting, stateless-connection guidance). The description adds nothing about the parameter, so the baseline of 3 for schema-does-the-work 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 names a specific verb-plus-resource ("Report a roll-up of activity") and then enumerates exactly what is rolled up: memory/note/session/task counts, retrieval totals, pending gardener proposals, and events by kind. That enumeration makes it trivially distinguishable from siblings like recall, tasks_list, or gardener_proposals, which each cover only one slice of this report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the overview/dashboard call you make instead of stitching together recall + tasks_list + gardener_proposals. But there is no explicit 'use this when…' or 'use X instead when you need per-item detail' routing, and no prerequisites are given beyond the session parameter's own schema text.
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.
29 tool updates
v0.7.4- Changed
capture_url1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
favorite_set1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
gardener_apply1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
gardener_proposals1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
gardener_request1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
gardener_split1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
memory_append1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
memory_delete1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
memory_edit1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
memory_read1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
memory_write1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
notes_append1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
notes_create1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
notes_delete1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
notes_edit1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
notes_read1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
notes_update1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
project_create1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
project_list1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
recall1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
session_end1 field changed- changed
Input schema / properties / session / descriptionPrevious value: -"Session name to operate on: the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a sess/* name. Defaults to the bound session; pass it whenever you have not run session_start and several agents are active -- the bare call is then ambiguous and fails rather than guesses"New value: +"Session to operate on: a name (the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a sess/* name) or a session ULID. Defaults to this connection's session -- bound automatically for Claude Code and Codex agents -- so pass it only to act on another session, or when a call reports the session as ambiguous"
- Changed
session_start4 fields changed- changed
Input schema / properties / cwd / descriptionPrevious value: -"Absolute working directory; auto-mapped to a project from the repo root on a repo's first session (no setup step -- `seamlessd map-repo` only overrides the derived slug)"New value: +"Absolute working directory. The git repository it is in decides the project, and a repository maps itself to a project on its first session -- no setup step (`seamlessd map-repo` only overrides the derived slug)" - changed
Input schema / properties / name / descriptionPrevious value: -"Optional stable session name; reusing a name resumes that session"New value: +"Resume the session with this name: a sess/* name from an earlier call, or the cc/... or cx/... on your briefing's 'Seam session' line. A new name starts a separate session under that name; omit it to use your own session, or a fresh one" - added
Input schema / properties / projectAdded value: +{ + "description": "Project slug to bind. Defaults to the project of the git repository cwd is in, then to your own session's project. If cwd is in a repository too, the two must agree. project=global binds the global scope; an unknown slug creates that project.", + "type": "string" +} - removed
Input schema / properties / sourceRemoved value: -{ - "description": "what began this session (default explicit)", - "enum": [ - "startup", - "resume", - "clear", - "compact", - "explicit" - ], - "type": "string" -}
- Changed
session_update1 field changed- changed
Input schema / properties / session / descriptionPrevious value: -"Session name to operate on: the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a sess/* name. Defaults to the bound session; pass it whenever you have not run session_start and several agents are active -- the bare call is then ambiguous and fails rather than guesses"New value: +"Session to operate on: a name (the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a sess/* name) or a session ULID. Defaults to this connection's session -- bound automatically for Claude Code and Codex agents -- so pass it only to act on another session, or when a call reports the session as ambiguous"
- Changed
tasks_add1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
tasks_claim1 field changed- changed
Input schema / properties / session / descriptionPrevious value: -"the acting agent's session: the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session name. Defaults to the connection's bound session, then a sole active ambient. Pass it whenever you have not run session_start and several agents are active -- the bare call is then ambiguous and fails rather than guesses."New value: +"the acting agent's session: the cc/<id> or cx/<id> on your briefing's 'Seam session' line, another session name, or a session ULID. Defaults to this connection's session -- bound automatically for Claude Code and Codex agents -- then a sole active ambient. Pass it when a call reports the agent as ambiguous: the bare call then fails rather than guesses."
- Changed
tasks_list1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
tasks_ready1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
- Changed
tasks_release1 field changed- changed
Input schema / properties / session / descriptionPrevious value: -"the acting agent's session: the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session name. Defaults to the connection's bound session, then a sole active ambient. Pass it whenever you have not run session_start and several agents are active -- the bare call is then ambiguous and fails rather than guesses."New value: +"the acting agent's session: the cc/<id> or cx/<id> on your briefing's 'Seam session' line, another session name, or a session ULID. Defaults to this connection's session -- bound automatically for Claude Code and Codex agents -- then a sole active ambient. Pass it when a call reports the agent as ambiguous: the bare call then fails rather than guesses."
- Changed
usage_summary1 field changed- added
Input schema / properties / sessionAdded value: +{ + "description": "the session to act as: the name session_start returned, the cc/<id> or cx/<id> on your briefing's 'Seam session' line, or a session ULID. It scopes and credits this call. Defaults to this connection's session; pass it on every call when session_start reports the connection as stateless", + "type": "string" +}
2 tool updates
v0.5.1- Changed
recall2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"only memories of this frontmatter kind (e.g. convention); implies memories-only, so scope=notes is rejected; with no query, lists the kind newest-first"New value: +"only memories of this frontmatter kind (e.g. convention); implies memories-only, so any scope that excludes memories is rejected; with no query, lists the kind newest-first" - changed
Input schema / properties / scope / enumPrevious value: -[ - "all", - "memories", - "notes" -]New value: +[ + "all", + "memories", + "notes", + "tasks", + "trials", + "sessions" +]
- Changed
session_start4 fields changed- added
Input schema / properties / hostAdded value: +{ + "description": "Machine this agent runs on (hostname). Defaults to the X-Seamless-Host header, then to the daemon's own host; pass it only when dialling a daemon on another machine", + "type": "string" +} - added
Input schema / properties / main_worktree_rootAdded value: +{ + "description": "Absolute root of the repository's MAIN checkout when repo_root is a linked worktree; defaults to repo_root", + "type": "string" +} - added
Input schema / properties / repo_originAdded value: +{ + "description": "The repository's origin remote URL, which is how the same repo checked out on two machines is recognized as one project", + "type": "string" +} - added
Input schema / properties / repo_rootAdded value: +{ + "description": "Absolute git repository root enclosing cwd, resolved on YOUR machine. Required when host is not the daemon's: the daemon cannot read your filesystem to find it", + "type": "string" +}
13 tool updates
v0.4.11- Changed
capture_url1 field changed- changed
Input schema / properties / project / descriptionPrevious value: -"project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous."New value: +"project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous. A session bound to a confidential or sealed project can write ONLY into that project."
- Changed
gardener_apply2 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"apply (default) or dismiss"New value: +"apply (default), dismiss (until it recurs), or hide (forever)" - changed
Input schema / properties / action / enumPrevious value: -[ - "apply", - "dismiss" -]New value: +[ + "apply", + "dismiss", + "hide" +]
- Changed
gardener_proposals1 field changed- changed
Input schema / properties / kind / enumPrevious value: -[ - "merge", - "archive", - "digest", - "consolidate", - "reproject", - "split", - "abandon_plan", - "memory_wanted", - "tool_error", - "rekind", - "ship_plan" -]New value: +[ + "merge", + "archive", + "digest", + "consolidate", + "reproject", + "split", + "abandon_plan", + "memory_wanted", + "tool_error", + "rekind", + "ship_plan", + "relocate", + "merge_plans" +]
- Removed
lab_open - Added
memory_edit - Changed
memory_write2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"memory kind; constraint = what any agent must or must not do regardless of task; convention = a project-local choice or layout fact (naming, branding, where things live or deploy, which files sync together); for kind=stage, open the body with Status: open|in_progress|blocked|done and optionally Gate: human|ai, and update status by re-writing via memory_write -- append cannot change the header, which is parsed from the top of the body"New value: +"memory kind; constraint = what any agent must or must not do regardless of task; convention = a project-local choice or layout fact (naming, branding, where things live or deploy, which files sync together); for kind=stage, open the body with Status: open|in_progress|blocked|done and optionally Gate: human|ai, and flip the status with memory_edit (or a full memory_write) -- append cannot change the header, which is parsed from the top of the body" - changed
Input schema / properties / project / descriptionPrevious value: -"project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous."New value: +"project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous. A session bound to a confidential or sealed project can write ONLY into that project."
- Changed
notes_create1 field changed- changed
Input schema / properties / project / descriptionPrevious value: -"project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous."New value: +"project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous. A session bound to a confidential or sealed project can write ONLY into that project."
- Added
notes_edit - Changed
notes_update5 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"new body (aliases: content, text)"New value: +"new body, replacing the whole body (aliases: content, text)" - added
Input schema / properties / expect_hashAdded value: +{ + "description": "optional precondition: the content_hash you last read for this item (memory_read/notes_read return it). The write is refused if the stored file has changed since -- another agent or the owner edited it -- so re-read and re-apply your change instead of overwriting theirs. Omit it to write unconditionally.", + "type": "string" +} - changed
Input schema / properties / tags / descriptionPrevious value: -"tags, replacing all (a comma-separated string is also accepted); an empty list is read as absent and leaves the tags untouched"New value: +"tags, replacing all (a comma-separated string is also accepted); an empty list is read as absent and leaves the tags untouched -- to drop a tag use tags_remove" - added
Input schema / properties / tags_addAdded value: +{ + "description": "tags to add, leaving the rest in place; a tag already on the note is not duplicated. Applied after tags.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / tags_removeAdded value: +{ + "description": "tags to drop, matched exactly; a tag the note does not carry is ignored. Applied last, so it also removes what tags/tags_add just set.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
project_create1 field changed- added
Input schema / properties / isolationAdded value: +{ + "description": "optional isolation state (open|confidential|sealed); omit for open. open shares normally. confidential means nothing leaves: agents in other projects never read this one, and agents bound to it cannot write outside it. sealed adds the inbound half -- agents here see only this project: no global memories, no family, no cross-project reads. Set it at creation for work that is sensitive from the start; there is no tool to change it afterwards, because tightening detaches family and parent links and is an owner decision, made on an owner surface. Isolation requires a standalone project, so do not create an isolated child of another project.", + "enum": [ + "open", + "confidential", + "sealed" + ], + "type": "string" +}
- Changed
tasks_add1 field changed- changed
Input schema / properties / project / descriptionPrevious value: -"project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous."New value: +"project slug; defaults to the bound/ambient session's project. An unknown slug CREATES that project -- naming a new one is normal and never an error. Pass project=global ONLY for knowledge that belongs in EVERY project's briefing; it is not a neutral default. With no session and no explicit project the call is rejected as ambiguous. A session bound to a confidential or sealed project can write ONLY into that project."
- Removed
trial_query - Removed
trial_record
2 tool updates
v0.4.9- Changed
recall3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"maximum results (default 10)"New value: +"maximum results (default 10, max 100)" - added
Input schema / properties / limit / maximumAdded value: +100 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer"
- Changed
trial_query3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"max results (default 20)"New value: +"max results (default 20, max 200)" - added
Input schema / properties / limit / maximumAdded value: +200 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer"
4 tool updates
v0.1.3- Changed
memory_read1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"memory name"New value: +"memory name; pass exactly one of name or id"
- Changed
notes_read1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"note id (ULID)"New value: +"note id (ULID); pass exactly one of id or slug"
- Changed
session_start1 field changed- changed
Input schema / properties / source / descriptionPrevious value: -"what began this session (default startup)"New value: +"what began this session (default explicit)"
- Changed
trial_record1 field changed- changed
Input schema / properties / outcome / descriptionPrevious value: -"pass|fail|partial|inconclusive (free-form)"New value: +"suggested values pass|fail|partial|inconclusive; free text accepted"
31 tool updates
v0.1.0- First observed
capture_url - First observed
favorite_set - First observed
gardener_apply - First observed
gardener_proposals - First observed
gardener_request - First observed
gardener_split - First observed
lab_open - First observed
memory_append - First observed
memory_delete - First observed
memory_read - First observed
memory_write - First observed
notes_append - First observed
notes_create - First observed
notes_delete - First observed
notes_read - First observed
notes_update - First observed
project_create - First observed
project_list - First observed
recall - First observed
session_end - First observed
session_start - First observed
session_update - First observed
tasks_add - First observed
tasks_claim - First observed
tasks_list - First observed
tasks_ready - First observed
tasks_release - First observed
tasks_update - First observed
trial_query - First observed
trial_record - First observed
usage_summary
TDQS
Scored across 30 tools
The families (memory_*, notes_*, tasks_*, gardener_*, session_*, project_*) each cover a distinct resource, and descriptions explicitly explain when to use write vs append vs edit and create vs update vs append. The main residual risk is memory_write's in-place update overlapping with memory_edit/memory_append, but the prose carefully steers each case. Overall, tools are largely distinguishable.
Names are uniformly snake_case and grouped under predictable prefixes (memory_, notes_, tasks_, gardener_, session_, project_), giving a clear verb_noun pattern within each family. A few outliers (recall, usage_summary, capture_url, favorite_set) break the pattern but are readable and few. Minor deviations only.
30 tools is on the heavy side for a knowledge/memory server, with fine-grained splits like memory_write/append/edit and notes_create/append/edit/update that could be consolidated. The breadth (memory, notes, tasks, sessions, projects, gardener) partly justifies the count, but it sits in the borderline-heavy range. Each tool does earn a role, so it is not chaotic.
Coverage across memory, notes, tasks, sessions, and gardener is thorough, including lifecycle (create/read/edit/append/delete), retrieval (recall), and metadata (favorite_set, tags). Gaps are minor: no project update/delete/rename and no dedicated note listing, though recall and remaining tools largely compensate. Core workflows have no dead ends.
Maintenance
Related MCP Connectors
Shared memory and mail for your AI agents. Verified with Claude Code; other MCP clients in testing.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Shared memory and actions for Claude, Kiro, OpenAI, Cursor, and other MCP-compatible AI clients.
- LogRackOAuthai.lograck
Shared memory for your AI tools: tasks, notes and context every tool can read and write over MCP.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server that exposes agent-memory-daemon to any MCP-compatible client — Kiro (CLI & IDE), Claude Desktop, Cursor, and others. The daemon does the thinking (consolidation + extraction); this server is a thin filesystem bridge so agents can read, append, and search memory through the Model Context Protocol.452 npm6MIT
- AlicenseBqualityDmaintenanceA shared memory layer for AI agents — one memory.md synced across Claude Desktop, Cursor, Claude Code, OpenAI Codex, and any MCP client.42MIT
- AlicenseAqualityAmaintenanceLocal, searchable project memory for AI coding agents. Markdown source of truth, MCP interface, safe structured updates315Apache 2.0
- AlicenseNot gradedqualityAmaintenanceLocal-first, file-based memory layer for AI agents — one shared Markdown vault across Claude, Codex, Gemini, Cursor and any MCP client. Provides read/write memory tools with an audit trail, per-agent trust levels, and Git sync; no cloud and no lock-in.2MIT