Capacities MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Capacities MCP Serversearch my notes for AI trends"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Capacities MCP Server
An MCP server for Capacities: search, property-based object lookup, object CRUD, save weblinks, and daily notes from any MCP-compatible client.
⚠️ Use 2.x. Version 2.x runs on Capacities' current REST API. Version 1.x used the Capacities Beta API, which Capacities scheduled for discontinuation on September 1, 2026; 1.x builds (and any
.dxtpackaged before v2.0.0) depend on it. Reinstall the currentcapacities-desktop-extension.dxt(v2.x). See the Capacities API notice.About the name "v2". Capacities' own docs call the current API "v1" (their Beta was the first API). This repo calls it v2 because it is the second API this server has run on. Same API, two names.
Prerequisites
A Capacities account with API access
An API token: Capacities desktop app → Settings → Capacities API → Generate new token. Each token is scoped to one space and is either read-only or read-write; tools that write need a read-write token.
To run from source: Node.js 22 (the version the Docker image runs)
Related MCP server: Capacities-MCP-Plus
Installation
Choose the option that fits your setup:
Option 1: Claude Desktop Extension (Easiest)
Download
capacities-desktop-extension.dxtIn Claude Desktop: Settings → Extensions → Import Extension
Select the
.dxtfile and enter your API token when prompted
All dependencies are bundled; no additional setup needed.
Option 2: Run from Source
git clone https://github.com/inconceivablelabs/capacitiesMCP.git
cd capacitiesMCP
npm install
npm run buildThen add to your MCP client config (e.g. Claude Desktop's claude_desktop_config.json):
{
"mcpServers": {
"capacities": {
"command": "node",
"args": ["/path/to/capacitiesMCP/server/dist/index.js"],
"env": {
"CAPACITIES_API_TOKEN": "your_token_here"
}
}
}
}Option 3: Docker Container
For running as a persistent service (e.g. behind an MCP gateway):
# Build from the repo root: the Dockerfile copies from both src/ and server/.
docker build -f server/Dockerfile -t capacities-mcp .
docker run -d \
-e CAPACITIES_API_TOKEN=your_token_here \
capacities-mcpThe image is based on node:22-slim. Its runtime stage installs only server/'s production
dependencies and the compiled output, with no source or dev dependencies. Since 2.2.3 it also
removes the base image's bundled npm/npx, which the server never runs.
Available tools
Tool | Description |
| Search objects by title (optionally scoped by |
| Locate objects of one type by a property the API can't search on — date, label/status, tag/relation, or scalar. Seed by title ( |
| Show the space your API token is scoped to |
| List the space's structures: their properties, label options, and relation targets |
| Create an object of any structure with typed properties, labels, and relations (set by name, resolved strictly), plus a markdown body |
| Update an existing object's properties/relations (replaces each named property's value) and append a body |
| Read an object as Markdown (frontmatter + body), with a |
| Append markdown content to an object's body without touching its properties |
| Delete an object (moves to trash by default; |
| Save a URL as a Weblink, auto-fetching page metadata (override |
| Append content to today's daily note |
| Add a task to another object's Context (a person, project, meeting, ...). Context in Capacities is derived from embeds: an object is in a task's Context when its body embeds the task. This appends that embed, and does nothing if the object already embeds the task |
| Remove a task from another object's Context by deleting every embed of the task in that object's body |
Single-space per token. A v2 API token is scoped to exactly one space;
list_spacesreturns that one space. To work with multiple spaces, use multiple tokens.
The object model: properties vs. body
Objects in Capacities hold two kinds of content, and the tools treat them differently:
Properties — the object's typed fields: title, text, dates, numbers, labels (e.g. a task's Status, a weblink's Category), and entity relations (tags, a meeting's attendees). Set these with the
properties/labels/relationsinputs oncreate_object/update_object, keyed by property name or id (get them, plus label options and relation targets, fromget_space_info). Relations and labels are set by name and resolved strictly: an unknown name is an error, never a guess; passcreate_missing_relations: trueto auto-create unmatched relation targets.Body — freeform Markdown, set via the
body/notes/content/markdownparameter.
Rule of thumb: set structured things as properties, prose as body. A tag is a property
(a relations entry), not a [[link]] typed into the text. One tool call completes one
object (all its properties and its body); several distinct, standalone objects take
several calls.
Markdown conventions (body)
Any body/notes field supports Capacities' inline conventions:
Syntax | Effect | Creates an object? |
| Creates a Task and links it into the body | Yes, a Task |
| Creates or links a Tag | Yes, a Tag if new |
| Links an existing object by title | No; plain text if no such object exists |
Use [[Name]] to reference something that already exists; use () / # when you intend
to create the task/tag.
Weblinks & media objects (current API limitation)
save_weblink creates a Weblink from a URL and auto-fetches the page's title and description;
you can override title and description at save time. Those are the only properties
settable on a weblink. The Capacities API currently treats media objects (weblinks, PDFs,
images, audio, files) as create-only: they cannot be updated after creation, so tags,
Category, and Topic cannot be set on a weblink through the API. To tag a weblink today, put a
#tag in its notes (this associates a Tag via the body).
This is an upstream Capacities API limitation, not a limitation of this server. As soon as the Capacities API allows updating media objects, this server will add full weblink property support (tags / Category / Topic via
save_weblink). Until then,#tag-in-notes is the available path.
Rate limits
Capacities enforces rate limits on its servers, per token and per endpoint (see its
rate-limiting docs). In our
measurements against /object the window is rolling: slots free up one at a time as each request ages out of
the trailing 60 seconds. This server also runs a client-side, per-endpoint limiter, and its
multi-call tools (create_object/update_object with many relations, and find_objects' searches and
object reads) pace themselves against it. A find_objects listing does not wait: when the window is full
it stops as a partial, with a Note: line saying so. That limiter is best-effort: it cannot see other clients using the same
token or network. If a tool returns RATE_LIMIT_EXCEEDED, wait and retry rather than trying
to predict the window.
The API sits behind Cloudflare, so a server-side rejection can arrive as a Cloudflare "you are
being rate limited" page. The one we have captured came on a 429; the server also treats the same
page on a 403 as a rate limit, in case a ban arrives that way. Both are reported as
RATE_LIMIT_EXCEEDED. Such a ban is per IP address, so it affects every client on the same network
for as long as it lasts. Error messages carry the server's response trimmed to fit: a JSON error is
kept whole so the model can correct its call, and an HTML page is cut to its first line.
Why this server?
As of 2026-10-21: @capacities/api 1.1.3,
and the official MCP server as documented at
docs.capacities.io/developer/model-context-protocol.
Both are moving, so check them before relying on this table.
This server | Official Capacities MCP server |
| |
What it is | Local MCP server (stdio), personal API token | Hosted MCP server at | TypeScript client library, not an MCP server |
Setup |
| Add the URL to your MCP client and sign in. The space must have AI Assistant enabled |
|
Coverage | The 13 tools above | Search, read, create (pages, tasks, any type), update properties, append, block-level edits, file upload, list by type/tag/collection, object links | All 22 REST endpoints, plus OAuth with token refresh |
Relations and tags on create/update | Set by name, resolved strictly. Unknown or ambiguous names fail before anything is written (auto-create is opt-in) | Properties are set from frontmatter; how relation names are resolved is not documented | You pass ids; name lookup is up to you |
Property keys | Property name or id | Frontmatter keys | Ids |
Filter by date, label, relation or value |
| List by object type, tag or collection; other filters not documented | Not provided |
Search output | Title matches first; semantic hits labelled "Related by meaning" | Title and semantic search ranked together | The raw API response |
Client-side rate pacing | Per endpoint, best-effort | n/a (hosted) | None; the only retry is a 401 under OAuth |
Pick the official server if you want block-level editing, file uploads, OAuth instead of a
token, or a connector that works in hosted chat apps with nothing to install. Pick the SDK if
you are writing your own code: it is the complete client. Note that 1.1.3 needs zod 4 at
runtime even though its peer range also allows zod 3 (under zod 3.25 its import fails with
.meta is not a function). Pick this server if your MCP client does typed, relation-heavy
writes that must be validated before anything is saved, or needs to find objects by property
value.
Configuration
Environment Variable | Required | Default |
| Yes | — |
| No |
|
| No |
|
Project structure
capacitiesMCP/
├── src/ # TypeScript source (single source of truth)
├── server/ # Runtime packaging
│ ├── Dockerfile # Container build
│ ├── package.json # Runtime dependencies only
│ └── dist/ # Compiled output (built from root src/)
├── tsconfig.json # Builds src/ → server/dist/
├── manifest.json # DXT extension manifest
└── *.dxt # Pre-built extension packagesnpm run build compiles src/ directly into server/dist/. There is one source, one build step, and one output location used by all three installation methods.
Development
npm install
npm run build # Compile TypeScript
npm run dev # Watch mode
npm run inspector # MCP Inspector for debugging
npm test # Run testsSee CLAUDE.md for architecture details.
Security advisories and reachability
This server speaks MCP over stdio only. It imports two modules from
@modelcontextprotocol/sdk (server/mcp.js and server/stdio.js); the SDK's HTTP transports,
OAuth client/server code and Express/Hono middleware are installed as dependencies but never
loaded. Most advisories that Dependabot raises against this repo therefore cannot be reached at
runtime. We still patch them, because the lockfiles ship in the Docker image and the extension.
As of 2.1.2 (SDK 1.32.1), npm audit reports 0 in both lockfiles. Reachability of the
advisories cleared in that release, checked against a module-resolution trace of a live stdio
session (initialize, tools/list, tools/call, resources/list):
Package | Loaded on our path? | Reachable? |
| Yes | No. Each advisory is scoped to HTTP servers, the HTTP/OAuth client, bearer auth or |
| Yes, via | No. The SDK builds an |
| No | No. |
| No | No. |
| No | No. |
Image scanners also used to flag ip-address 10.1.0 inside the npm CLI bundled with the
node:22-slim base image. That copy is in no lockfile, so Dependabot cannot see it, and the server
never runs npm. Since 2.2.3 the runtime image no longer contains npm at all.
License
MIT. See LICENSE.
Available Tools
13 toolsadd_to_daily_noteAdd to Daily NoteA
Add content to today's daily note in Capacities. Supports markdown. Each call appends to the existing daily note.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Content to add (supports markdown). Capacities markdown conventions apply in the body: `() text` creates and links a new Task; `#tag` creates or links a Tag; `[[Name]]` links an EXISTING object by title (renders as plain text if no such object exists — it does NOT create one). Note `() ` and `#` create objects as a side effect. | |
| no_timestamp | No | Skip adding timestamp to the entry |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden; it does disclose that each call appends rather than overwrites and that markdown is supported, which is useful. It does not say whether a daily note is created when none exists for today, where in the note content lands relative to the timestamp, or that the markdown syntax can create Task/Tag objects as a side effect (that only appears in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action front-loaded and no filler. Every sentence contributes: target, format support, and append semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter append tool with a fully documented schema and no output schema, the description covers the essentials. The main residual gap is note-creation behavior when today's note does not yet exist, which an agent would want to know before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains markdown conventions and the no_timestamp flag in detail. The description only echoes that markdown is supported and says nothing about no_timestamp, so it adds little beyond the structured field data — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Add content to today's daily note in Capacities") plus the scope constraint that only today's note is targeted, which separates it from the generic append_to_object sibling. It stops short of naming that sibling or any other alternative, but the action itself 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?
Usage is only implied: an agent can infer this is for journaling into today's note rather than an arbitrary object, but the description never states when to prefer it over append_to_object, create_object, or update_object. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_to_objectAppend to Capacities ObjectA
Append markdown to the END of an existing object's body (POST /blocks/append) — additive, never removes, and never touches typed properties. This is the body counterpart to update_object, which replaces typed properties (scalars/labels/relations) via PATCH /object. Use update_object to change properties; use this to add notes/body.
| Name | Required | Description | Default |
|---|---|---|---|
| markdown | Yes | Markdown content to append to the object's body. Capacities markdown conventions apply in the body: `() text` creates and links a new Task; `#tag` creates or links a Tag; `[[Name]]` links an EXISTING object by title (renders as plain text if no such object exists — it does NOT create one). Note `() ` and `#` create objects as a side effect. | |
| objectId | Yes | objectId of the object to append to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares the operation additive, non-destructive ("never removes"), scoped only to the body ("never touches typed properties"), and positional (appends at the END). It stops short of stating what is returned or any auth/error behavior if the objectId is invalid.
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: the additive/end-of-body constraint is front-loaded, then the sibling disambiguation follows. No filler, no restating of the tool 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 two-parameter mutation tool with no output schema and no annotations, the description covers intent, scope, and routing adequately. The one real gap is that the agent cannot learn what the call returns or how failures surface, which matters slightly more given there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, including the Capacities markdown conventions and their object-creating side effects. The description adds only the notion of appending to the body's end, which is baseline-level value when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Append markdown to the END of an existing object's body") plus the underlying endpoint, and explicitly contrasts itself with the sibling update_object. An agent can separate this from update_object without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: use update_object to change typed properties (scalars/labels/relations), use this to add notes/body. Both the when and the when-not are named, with the alternative called out by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_objectCreate Capacities ObjectA
Create a new object of any structure in your Capacities space. Call get_space_info first to get structure_id, property ids, label options, and relation target types. Scalar properties (text/url/number/boolean/date) go in properties keyed by property NAME or id; dates are ISO-8601 strings. Labels go in labels (keyed by property NAME or id, values are option NAMES) and relations go in relations (keyed by property NAME or id, values are entity NAMES). Relations and labels are set by NAME and resolved strictly — an unknown name is an error, never a guess. Pass create_missing_relations: true to auto-create unmatched relation targets. update_object (not this tool) replaces; this creates.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Markdown body appended to the object after creation. Capacities markdown conventions apply in the body: `() text` creates and links a new Task; `#tag` creates or links a Tag; `[[Name]]` links an EXISTING object by title (renders as plain text if no such object exists — it does NOT create one). Note `() ` and `#` create objects as a side effect. | |
| title | Yes | Title of the new object | |
| labels | No | Label props keyed by property NAME or id; value(s) are option NAME(s) | |
| relations | No | Entity (relation) props keyed by property NAME or id; value(s) are entity NAME(s), resolved strictly | |
| properties | No | Scalar props keyed by property NAME or id: text/url/number/boolean/date. Date = ISO-8601 string. | |
| collections | No | Collection ids to add the object to | |
| structure_id | Yes | Structure id (UUID or built-in id like RootTask) from get_space_info | |
| create_missing_relations | No | Auto-create relation targets that don't already exist |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose real behavior: name resolution is strict ('an unknown name is an error, never a guess'), `create_missing_relations` is an explicit opt-in, and body markdown has side effects that create objects. However, it never says what the tool returns or how to obtain the new object's id, and says nothing about permission/auth or duplicate-title handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then prerequisite, then parameter grouping, then the mutation caveat—so the most important routing information arrives early. It is dense and backtick-heavy, with some overlap against the schema's parameter descriptions, but no sentence is purely 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 an 8-parameter nested-object mutation tool with no output schema, the definition covers inputs well but omits the return shape entirely—an agent does not learn whether the created object's id is returned or whether a follow-up `get_object`/search is needed to link it. That is a real gap for a create tool whose typical next step is linking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds meaning by splitting parameters into semantic groups (scalar → `properties`, options → `labels`, entities → `relations`), stating that dates are ISO-8601, and clarifying that names resolve strictly rather than fuzzily. That strictness contract is the key addition beyond the schema's generic 'resolved strictly' phrasing.
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 new object') and scopes it ('of any structure in your Capacities space'). It also explicitly separates itself from sibling `update_object` ('not this tool... replaces; this creates'), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite workflow: 'Call `get_space_info` first to get structure_id, property ids, label options, and relation target types.' It also names the alternative for the adjacent case (`update_object` for replacement), covering both when-to-use and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_objectDelete Capacities ObjectA
Delete an object. By default (hard_delete=false) it moves to trash and is recoverable in Capacities. Pass hard_delete=true to permanently delete — this cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| objectId | Yes | objectId of the object to delete | |
| hard_delete | No | false (default) moves to trash (recoverable); true permanently deletes (cannot be undone) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does disclose the critical traits: default behavior moves the object to Capacities trash and is recoverable, while hard_delete=true is permanent and irreversible. It omits secondary effects an agent might need, such as what happens to linked objects or backlinks and whether an error occurs if the object is already trashed.
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 recoverability consequence front-loaded and the destructive caveat attached directly to the flag that triggers it. No filler, no repetition beyond what is needed to bind behavior to the parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter destructive tool with no annotations and no output schema, the essential risk information is present, so an agent can call it safely in the common case. Completeness is weakened by the absence of any statement about cascade effects on linked content, permissions, or the result of deleting a non-existent or already-trashed object.
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 objectId and hard_delete are already documented in the schema, and the description largely restates the hard_delete semantics rather than adding new meaning. It adds nothing about objectId format or constraints, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Delete an object'), which is unambiguous and clearly distinct from siblings like update_object, append_to_object, or unlink_from_context. It never names a sibling to contrast with, but the operation itself leaves no ambiguity about what the tool does.
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 hard_delete=true/false explanation implicitly tells an agent which mode to pick for recoverable vs permanent removal, which is useful. However, it gives no guidance on when to delete at all versus unlinking or updating (siblings exist), and no prerequisites such as required permissions or whether the object must exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_objectsFind Capacities ObjectsA
Locate objects of one structure (NAME or id from get_space_info), then filter and sort client-side on properties the API cannot search. Seed by title_hint, by tag (a tag NAME), both, or neither — omit title_hint to list by tag or list the whole type. Results are limited to objects whose title contains title_hint (case, accents and punctuation ignored; it needs a letter or digit); short numeric hints also match dates ("1:1" matches 2024-11-12). A title search that returns 50 results lists the whole type instead. A listing reads up to page_budget pages of 100 (default 12, max 25) and orders candidates by the date in their title, newest first (oldest first for an ascending date sort; undated titles last), before fetch_cap (default 30, max 50) cuts them. With no filters and no sort, matches are listed without fetching each object (up to limit, default 30). Per call: at most 5 relation filters, and a call that lists makes at most 45 requests. filters are keyed by property NAME or id: a date is an absolute ISO string (a date-only value matches that day, a full timestamp that exact instant) or {after,before}; a label is an option NAME; a relation/tag is an object NAME; text/number/boolean are equals. sort is {by, order}; missing values sort last. A line starting "Note:" means the result may be incomplete; seed_complete and candidates_complete (in the result's second text block, a JSON object) say which part, and it is the full answer only when both are true and matched equals returned. Returns ids + titles + filtered/sorted values, NO bodies (use get_object); cannot follow backlinks.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional. A tag NAME; lists objects of this structure carrying the tag (combine with title_hint to filter their titles). | |
| sort | No | Sort by a property; missing values sort last | |
| limit | No | Max results to return after filtering | |
| filters | No | Client-side filters keyed by property NAME or id. Date: ISO string (equals) or {after,before} (ISO range). Label: option NAME. Relation/tag: object NAME. Scalars: equals. | |
| fetch_cap | No | Max candidates to fetch in stage 2 (default 30 fits one rate window; max 50 may add one ~60s wait). A call that lists gets what is left of its 45-request budget. | |
| structure | Yes | Object type to search — structure NAME or id (from get_space_info) | |
| title_hint | No | Optional. Title text the object's title must contain (needs at least one letter or digit). Omit to list by tag or the whole type. | |
| page_budget | No | Max pages of 100 to list when enumerating — by tag, by the whole structure, or after a title search returns 50 (default 12, max 25) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does so thoroughly: per-call budgets (5 relation filters, 45 requests), fallback behavior (a 50-result title search lists the whole type), ordering rules (date-in-title, newest first, undated last), and rate-window notes on fetch_cap. It even discloses partial-result signaling — the "Note:" line plus `seed_complete`/`candidates_complete` — which an agent cannot get from any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and nearly every clause carries operational detail. The cost is a dense wall of run-on sentences with repeated defaults (page_budget/fetch_cap limits already in the schema), which makes it harder to scan than a bulleted form would be.
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 tool with nested filter objects, no annotations, and no output schema, the description covers staging, budget exhaustion, result ordering, and even the shape of the second text block. An agent has everything needed to call it correctly and to interpret an incomplete 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 coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: title matching ignores case/accents/punctuation, requires a letter or digit, and short numeric hints match dates ("1:1" matches 2024-11-12). It also explains how page_budget and fetch_cap interact with the 45-request budget rather than just restating their defaults.
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 concrete verb+resource and scope: "Locate objects of one `structure`... then filter and sort client-side on properties the API cannot search." It also implicitly separates itself from body-returning siblings by stating it returns ids+titles only, so an agent can tell it apart from get_object without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit seeding strategies (title_hint, tag, both, neither) with the condition for each ("omit `title_hint` to list by tag or list the whole type") and routes to get_object for bodies and get_space_info for structure ids. The one gap is that the overlapping full-text sibling search_content is never mentioned, so the choice between property-filtering here versus content search must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_objectGet Capacities Object (Markdown)A
Read an object rendered as Markdown (YAML frontmatter of its properties + body). A Labels: line before the markdown lists every label property (e.g. Status, Priority) read from the STRUCTURED object, as <propertyId>: <Option>[, <Option>] entries separated by ; ((none) when empty). Where it disagrees with the frontmatter, the Labels line is authoritative: Capacities' markdown render omits some statuses (e.g. Open Question, Backlog, On Hold) and shows Complete as Done.
| Name | Required | Description | Default |
|---|---|---|---|
| objectId | Yes | objectId of the object to read |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses a non-obvious behavioral quirk (the Labels line is parsed from the structured object and overrides frontmatter) and enumerates concrete known discrepancies such as omitted Open Question/Backlog/On Hold and Complete rendered as Done. It stops short of covering error behavior for invalid ids or truncation of large bodies.
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 purpose is front-loaded in the first sentence and the remaining length is spent on parsing-critical detail (separator format, `(none)` sentinel, precedence rule) that genuinely earns its place. It is dense but not padded, though the Labels exposition could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema and no annotations, the description compensates well by describing the exact return shape (frontmatter, body, synthesized Labels line) that an agent would otherwise have to discover empirically. Only failure modes and size limits remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter, so the schema already explains objectId. The description adds nothing about id format or provenance, leaving this at 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?
The opening sentence gives a specific verb and resource plus the return format: 'Read an object rendered as Markdown (YAML frontmatter of its properties + body).' It does not, however, distinguish itself from siblings such as find_objects or search_content, nor say how an objectId is obtained.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'Read'; there is no explicit when-to-use guidance, no statement that this is the by-id fetch after find_objects/search_content, and no exclusions. The agent must infer the workflow from the required objectId parameter alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_space_infoGet Space StructuresB
Get the structures (object types), their writable properties, and collections for your Capacities space.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the payload contents (object types, writable properties, collections), from which read-only, metadata-only behavior can be inferred, but it never states that it is non-mutating, what permissions or space selection are required, or whether results are cached/static.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource and its three returned components listed in order of importance. No filler, no restatement of the tool name beyond what's needed.
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 annotations and no output schema, the description is the only source of return-value information, and it gives content categories but not shape or format (e.g., whether properties are keyed by object type). For a zero-parameter discovery tool this is adequate but leaves the agent guessing at the response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate beyond the (empty) schema. Baseline 4 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?
Uses a specific verb ('Get') and enumerates exactly what is returned: structures (object types), their writable properties, and collections, scoped to 'your Capacities space'. This distinguishes it reasonably well from list_spaces (which enumerates spaces) and from the object CRUD siblings, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use statement, no prerequisites, and no named alternative. The reader must infer that this is a discovery/metadata call useful before create_object or update_object; the description never says so.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_to_contextLink Task to ContextA
Add a task to another object's Context. A task's Context in Capacities is derived, not a property: it is the set of objects (people, projects, meetings, ...) whose body embeds the task as an EntityBlock. This appends an EntityBlock embedding the task to the END of the target object's body (POST /blocks/append). Idempotent: if the target already embeds the task anywhere in its body, nothing is written and the existing block id(s) are reported. task_id must be a Task (RootTask).
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | objectId of the task to add to the Context | |
| object_id | Yes | objectId of the person/project/meeting/... whose body will embed the task |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that this is a mutation that appends to the END of the body (POST /blocks/append), that it is idempotent with existing block ids reported on a no-op, and that task_id must be a RootTask. It stops short of permission requirements, whether the target object's modified timestamp or notifications are affected, and what an error looks like when task_id is not a Task.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, purpose front-loaded, then model, then mechanism/idempotency, then type constraint. The 'derived, not a property' aside is slightly academic but earns its place by explaining why the tool exists rather than setting a field. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema and no annotations, the description covers purpose, mechanism, idempotency, and a partial return-value hint ('existing block id(s) are reported'). Gaps remain around auth/permissions and the full success response, but nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning not in the schema: task_id must specifically be a Task/RootTask (a type constraint the schema omits), and object_id can be any embeddable object such as a person, project, or meeting. That materially reduces wrong-type calls.
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 to another object's Context') and then defines the mechanism precisely: appending an EntityBlock embedding the task to the end of the target's body. The 'Context is derived, not a property' framing separates it conceptually from a plain property update and from unlink_from_context, even though append_to_object is never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the derived-Context model, and the idempotency note tells the agent it is safe to call repeatedly. However, there is no explicit 'use this instead of append_to_object when...' routing, no prerequisite/permission note, and no pointer to unlink_from_context as the inverse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spacesList Capacities SpacesB
Get a list of all your Capacities spaces
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read-only list operation but does not state permissions, ordering, pagination, or whether it returns every accessible space; with no output schema, return behavior is also left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no redundant wording. Its length is appropriate for a zero-parameter list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter list tool, the description identifies the resource and scope adequately. However, with no annotations or output schema, it omits return-shape context and does not explicitly relate the tool to get_space_info, leaving minor but real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. There are no parameter meanings to clarify, and the description does not need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get a list') and resource ('Capacities spaces') with the scope 'all'. It distinguishes itself from get_space_info only by implication, since it does not explicitly say it enumerates all spaces rather than details one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative routing. The word 'all' hints that this enumerates spaces rather than retrieving one space's details, but the agent must infer that from sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_weblinkSave Weblink to CapacitiesA
Save a URL as a weblink object. Optional title/description override the auto-fetched page metadata (these are the ONLY fields settable on a weblink, and only at save time — weblinks are create-only in the API). To tag or annotate a weblink, put #tag, () tasks, or [[links]] in notes; Category/Topic and other properties cannot be set via the API yet.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to save | |
| notes | No | Additional notes in markdown format. Use actual newlines for line breaks, NOT escaped \n characters. Capacities markdown conventions apply in the body: `() text` creates and links a new Task; `#tag` creates or links a Tag; `[[Name]]` links an EXISTING object by title (renders as plain text if no such object exists — it does NOT create one). Note `() ` and `#` create objects as a side effect. | |
| title | No | Custom title overriding the auto-fetched page title (max 500 chars) | |
| description | No | Custom description overriding the auto-fetched page description (max 1000 chars) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that weblinks are create-only and immutable afterwards, that title/description override auto-fetched metadata, that other properties are not settable, and that `()` tasks and `#tags` in notes create objects as a side effect. It stops short of stating auth/permission needs, duplicate-URL behavior, or what a successful save returns.
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 dense sentences with the core action and the create-only constraint front-loaded. The stacked parentheticals are information-rich but slightly heavy; no sentence is genuinely wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no annotations and no output schema, the description covers creation semantics, field limitations, markdown conventions, and side effects well. Return values are not needed, though duplicate-handling and any side effects of the metadata fetch remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description still adds value by explaining that title/description override auto-fetched page metadata and are the ONLY settable fields, and that notes is the channel for tags, tasks, and links. That override semantics is not evident from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Save a URL as a weblink object" gives a specific verb and resource, and the parenthetical that weblinks are create-only in the API separates this from create_object/update_object siblings. An agent knows immediately this is the weblink-creation 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?
It clearly frames when to use this tool (creating a weblink) and what cannot be done through it (updating, setting Category/Topic or other properties) and steers tagging/annotation to the notes field instead. It does not explicitly name a sibling alternative, but the create-only constraint effectively rules out the update path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contentSearch Capacities ContentA
Search Capacities objects in your space by title. When Capacities has semantic search enabled for the account, it also returns objects related by meaning; those are listed after the title matches under a "Related by meaning" label. limit caps the combined list. Optionally scope by structureIds (from get_space_info).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of results | |
| query | Yes | Search query or keywords | |
| structureIds | No | Optional structure IDs to scope the search to (from get_space_info) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavior, and it does disclose meaningful traits: results may include semantically related objects, they appear after title matches under a 'Related by meaning' label, and limit caps the combined list. It does not state that the tool is read-only, how permission or account state affects semantic results beyond a conditional, or anything about ordering within the title-match group.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, then behavior, then parameter notes. No filler or repetition. Slight density in packing both result-group behavior and the limit interaction into consecutive sentences, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the shape of results: title matches plus an optional labeled 'Related by meaning' section. Combined with the limit and scoping notes, an agent can call this correctly. The missing piece is the absence of read-only/mutation expectations, which matters given no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, establishing a baseline of 3. The description adds real meaning for limit ('caps the combined list', i.e., across both result groups) but restates the schema for query and structureIds. Net value above the schema is modest.
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 first sentence names a specific verb and resource with scope: 'Search Capacities objects in your space by title.' That distinguishes it from generic retrieval, and the semantic-search sentence clarifies the match mode. It stops short of naming or contrasting with the sibling find_objects, which an agent could reasonably confuse with 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 implies usage through the conditional semantic-search clause and the optional structureIds scoping, which hints at when to narrow results. However, it never states when to prefer this over find_objects or get_object, and gives no exclusion guidance. Usage is inferable but not directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_from_contextUnlink Task from ContextA
Remove a task from another object's Context. A task's Context in Capacities is derived, not a property: it is the set of objects (people, projects, meetings, ...) whose body embeds the task as an EntityBlock. This deletes EVERY EntityBlock on the target object that embeds the task (at any depth, in any block field), one DELETE /block each; nested content inside a removed block goes with it. If the target does not embed the task, nothing is removed.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | objectId of the task to remove from the Context | |
| object_id | Yes | objectId of the object whose body embeds the task |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that the operation is a destructive multi-delete ('deletes EVERY EntityBlock... at any depth, in any block field, one DELETE /block each'), warns that nested content inside a removed block is destroyed too, and specifies the no-op case when no embedding exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, with no filler; the parenthetical '(people, projects, meetings, ...)' and '(at any depth, in any block field)' are dense but each adds real semantic precision, though the middle sentence is long enough to be slightly harder to parse than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema and no annotations, the definition covers mechanism, destructive scope, and the no-op case; it stops short of stating permission requirements, whether the call is idempotent, or what a partial failure across multiple DELETE /block calls returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented; the description only reinforces that object_id is the object whose body embeds the task and that removal happens at any depth, which adds marginal meaning beyond the schema 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 and resource ('Remove a task from another object's Context') and immediately defines what 'Context' means in Capacities as a derived set of embedding objects, which lets an agent distinguish this from siblings like link_to_context and delete_object without reading 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 is implied by the derived-Context explanation and the no-op clause ('If the target does not embed the task, nothing is removed'), but the description never explicitly names an alternative such as link_to_context for the inverse operation or delete_object for destroying the task itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_objectUpdate Capacities ObjectA
Replace typed properties of an existing object (PATCH /object). Only the properties you name are changed; unnamed properties are left intact. WARNING: for a named property this REPLACES its value — it does NOT append. Naming a multi-value relation/label drops the prior list and sets exactly what you pass. To ADD to a relation, first read the current values (this tool reports them) and pass the full desired list. The optional body param is a convenience: after the PATCH, it also appends markdown to the object's body (POST /blocks/append) — the same additive write append_to_object performs on its own. Labels and relations are set by NAME and resolved strictly — an unknown name is an error. properties/labels/relations map keys accept a property NAME or id. Pass create_missing_relations: true to auto-create unmatched relation targets.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Markdown body appended to the object after the update. Capacities markdown conventions apply in the body: `() text` creates and links a new Task; `#tag` creates or links a Tag; `[[Name]]` links an EXISTING object by title (renders as plain text if no such object exists — it does NOT create one). Note `() ` and `#` create objects as a side effect. | |
| title | No | New title for the object | |
| labels | No | Label props keyed by property NAME or id; value(s) are option NAME(s). REPLACES the named prop. | |
| objectId | Yes | objectId of the object to update | |
| relations | No | Entity (relation) props keyed by property NAME or id; value(s) are entity NAME(s). REPLACES the named prop. | |
| properties | No | Scalar props keyed by property NAME or id: text/url/number/boolean/date. REPLACES each named value. | |
| collections | No | Collection ids to set on the object | |
| create_missing_relations | No | Auto-create relation targets that don't already exist |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and discloses the PATCH mutation, destructive replacement of named multi-value relations/labels, the body append side effect, strict name resolution errors, and the create_missing_relations side effect. It does not cover permissions, rate limits, or broader error/return behavior, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action and scope, then moves through the replacement warning, additive-relation guidance, body behavior, strict resolution, and create-missing behavior. It is dense but every sentence carries relevant information, and the warning is placed where it will be seen.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation with nested property maps and no output schema, the description covers replacement semantics, side effects, alternatives, strict name resolution, and relation creation. It leaves out return details and permission/error context, but provides enough for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds useful sequencing and resolution details: body is appended after the PATCH, keys accept property names or ids, labels and relations resolve strictly by name, and create_missing_relations auto-creates unmatched targets. Much of this reinforces the schema, but the added operational context is valuable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: replace typed properties of an existing object via PATCH /object. It clearly distinguishes this update operation from additive sibling behavior by explaining that named properties are replaced rather than appended.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains that only named properties change, warns that values are replaced rather than appended, and gives explicit guidance for adding to relations by reading current values and passing the full desired list. It also identifies append_to_object as the standalone alternative for additive body writes.
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.
13 tool updates
v2.3.1- First observed
add_to_daily_note - First observed
append_to_object - First observed
create_object - First observed
delete_object - First observed
find_objects - First observed
get_object - First observed
get_space_info - First observed
link_to_context - First observed
list_spaces - First observed
save_weblink - First observed
search_content - First observed
unlink_from_context - First observed
update_object
TDQS
Scored across 13 tools
Most tools are clearly distinct: create/update/append/delete act on different object aspects, and link/unlink are paired opposites. The main overlap is search_content versus find_objects, both used to locate objects; the descriptions distinguish global title/semantic search from structure-scoped filtering, but an agent may still hesitate between them.
Names are consistently snake_case and verb-led (list_, get_, create_, update_, append_, delete_, search_, find_, link_/unlink_). A few use prepositions such as add_to_daily_note and link_to_context rather than strict verb_noun, but the overall pattern remains predictable.
13 tools is well within the ideal range and each maps to a distinct capability: space discovery, object CRUD/append, search/listing, daily notes, weblinks, and task context linking. The set does not feel padded or thin.
Core lifecycle coverage is strong: spaces/info, object read/create/update/delete/append, search/find, daily note appends, weblinks, and context link/unlink. Gaps are minor and partly API-imposed: weblinks are create-only, and there is no full-text body search or bulk operation, but agents can work around these with existing tools.
Maintenance
Related MCP Connectors
Knowledge base MCP for AI agents on iknow.dev. Search, read, and maintain via OAuth.
Persistent AI memory over your saved YouTube videos, podcasts, articles and PDFs for any MCP client.
Official Fibery MCP server: query and update your workspace from any AI client via OAuth.
Connect AI clients to your Dactic work context through a hosted MCP service.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceFacilitates integration of PrivateGPT with MCP-compatible applications, enabling chat functionalities and secure management of knowledge sources and user access.-
- AlicenseAqualityDmaintenanceAn enhanced MCP server for the Capacities knowledge management app. Features * List and explore spaces * Search content with full-text and title modes * Read full object content by ID (unique feature) * Save weblinks with tags and metadata * Add content to daily notes * Windows-compatible613 npm2MIT
- AlicenseCqualityDmaintenanceEnables interaction with the Capacities.io note-taking API via MCP, supporting operations like searching content, saving weblinks, and appending to daily notes.513MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients that support remote servers, such as ChatGPT, to securely search, fetch, list, and optionally create or update objects in a self-hosted Anytype space over HTTPS.MIT