Edit Anytype blocks, layouts, and views from Python or MCP, over its internal gRPC API.
Strong tool definitions with comprehensive descriptions and parameter documentation. All 12 tools have detailed descriptions (100-300+ chars) explaining what they do, when to use them, and common mistakes. Parameters are well-annotated with Annotated/Field providing type info and descriptions. However, output schemas are not formally documented in the code (only described in text), and error handling lacks structured recovery guidance. Tool composition is excellent, each tool has a single responsibility and outputs chain well (search → get_object → edit/add/delete). No security issues detected (no secrets in params). Naming follows verb_noun convention consistently (search, get_object, create_object, add_block, edit_block_text, delete_block, set_details, set_cover, upload_image, set_view_type, set_visible_columns, call_rpc).
Add one or more blocks to an object at a given position and return the new block ids. Blocks are the content tree: text, headings, images, tables, dataviews, etc. Use this to add content to an object. The position is relative to a target block (for example, 'after' the block with id 'xyz'). Returns a dict {'block_ids': ['<id1>', '<id2>', ...]}. Common mistakes: forgetting to call get_object first to find the target block id; trying to add blocks to a Type or Set object (that is restricted).
Call any gRPC ClientCommands method by name with a JSON request body. This is a generic escape hatch for operations the curated tools do not cover. The method name is the gRPC method name (e.g., 'ObjectCreate', 'BlockAdd'). The request is a JSON dict matching the gRPC request message. Returns the gRPC response as a JSON dict. Common mistakes: passing an invalid method name; passing a request that does not match the gRPC message schema; forgetting to set required fields.
Create a new object of a given type and return its new object id as a string. The type is given by its unique key (for example 'ot-page', 'ot-note', 'ot-task'). This unique key is the type's own identifier, which differs from a type object id. You can set initial properties with the 'details' dict (for example {'name': 'My page'}). Returns a dict {'object_id': '<new id>'}. Common mistakes: passing a type object id where a unique key is required; trying to add blocks to a Type or Set object later (that is restricted, edit those via set_details).
Output schemas not formally documented. Tool descriptions state what is returned (e.g., 'Returns a JSON list', 'Returns a dict with objectView'), but no structured schema definitions are visible in the code. LLMs cannot reliably parse unstructured return types.
Error handling lacks structured recovery guidance. The _err() helper returns {'error': 'ExceptionType: message'}, but does not categorize errors as retryable/user-fixable/fatal or suggest next steps. Agents cannot distinguish between transient failures and permanent ones.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Delete one or more blocks from an object. Returns a dict {'deleted': ['<id1>', '<id2>', ...]} with the ids of deleted blocks. Common mistakes: passing a block id that does not exist; trying to delete the root block (the object itself).
Edit the text content of a text block and return the updated block. Use this to change the text, marks (bold, italic, etc.), or both. Returns a dict with the updated block. Common mistakes: passing a block id that is not a text block; trying to edit a block that does not exist.
Open one object by id and return its full view as a dict: its blocks (the content tree) and its details (properties/relations). Use this after 'search' to read an object's contents, to find block ids before editing or deleting blocks, or to read property values. Returns a JSON dict with an 'objectView' holding 'blocks' and 'details'. Common mistake: passing a name where an id is required (use 'search' first to get the id).
Search objects in an Anytype space by full text and return a list of matching objects as dicts. This is the primary way to discover object ids before reading or editing them. It matches the query against object names and snippets. Returns a JSON list; each item has the relation keys you asked for (default: id, name, type, layout, snippet). Common mistakes: passing a type's object id where a unique key is expected (use the 'types' filter with unique keys like 'ot-note'); expecting fuzzy matching on ids (query is full text over name and snippet, and ids are matched only by the 'types' filter).
Set the cover image of an object. The cover can be a color, a gradient, or an image file. Returns a dict with the updated cover. Common mistakes: passing an invalid color or image id; trying to set a cover on an object type that does not support it.
Set one or more properties (details/relations) on an object. Use this to change the object's name, description, cover, type, or any custom property. Returns a dict with the updated details. Common mistakes: passing a property key that does not exist; trying to set a read-only property.
Set the view type of a dataview block (e.g., grid, gallery, list, calendar, board). Returns a dict with the updated view. Common mistakes: passing a view type that is not supported; trying to set a view type on a block that is not a dataview.
Set which columns are visible in a dataview grid view. Returns a dict with the updated view. Common mistakes: passing a column key that does not exist; trying to set visible columns on a view that is not a grid.
Upload an image file to Anytype and return its file hash. Use this before adding an image block or setting a cover. The image is uploaded to the local Anytype storage. Returns a dict {'hash': '<file hash>'}. Common mistakes: passing a non-image file; trying to upload a file that is too large.
call_rpc is a generic escape hatch with minimal guardrails. Its 'method' parameter accepts any gRPC method name as a free-form string (no enum), and 'request' is an untyped object. This invites hallucinated method names and malformed requests. No validation or helpful error messages for invalid gRPC calls.
Parameter descriptions include example values (e.g., 'Example: bafyreih...', 'Example: block-xyz'). LLMs tend to reuse example values literally in real calls, causing failures when the actual ID differs from the example.
Destructive operations (delete_block) lack confirmation or dry-run support. An agent can delete blocks irreversibly without a safety gate. No pattern:confirmation-request implemented.