MCP server for collaborative document editing with Yjs CRDT, supporting document content manipulation, pages, comments, versions, exports, suggestions, search, and database operations
Motion MCP has 29 well-named tools with consistent verb_noun patterns (read_*, insert_*, update_*, delete_*, etc.). Descriptions are present and substantive (avg ~150 chars), explaining WHAT each tool does and WHEN to use it. Input schemas are visible with typed parameters and descriptions. However, output schemas are not documented, LLMs cannot predict return structures. Error handling is minimal; no recovery guidance or actionable error messages. Tool composition is strong (read before write, clear chains), but some tools lack parameter constraints (e.g., mode enum is present but not all tools validate inputs). Security is reasonable (no exposed secrets in params), but no permission gates or audit trail declarations visible.
Accept a pending suggestion, applying the proposed edit to the document. All connected editors see the change in real-time.
Add a comment to a specific block in the document. Returns the new comment's ID and metadata.
Add a new record to an inline database block. Returns the new record's ID.
Create a new page in the workspace with an optional title. Returns the new page's ID and metadata.
Delete a block from the document by its stable ID. All connected editors see the removal in real-time.
Delete a record from an inline database block.
Delete the current page (soft delete). The page is marked as deleted but can be recovered. All connected editors are disconnected.
Output schemas not documented. LLMs cannot predict return structures (e.g., what fields does read_document return? What is the structure of read_comments response?). This forces agents to guess and wastes tokens on trial-and-error.
No error handling guidance. Tools lack recovery hints (e.g., 'block_id not found, call read_outline() first to list valid IDs'). Agents cannot self-correct on failures.
Destructive tools (delete_block, delete_page, delete_database_record) lack confirmation or dry-run support. Agents can permanently delete content without review.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Export the current document as HTML. Returns the HTML text.
Export the current document as ProseMirror JSON. Returns the full document structure.
Export the current document as Markdown. Returns the Markdown text.
Insert a rich-text block at a specific position using ProseMirror JSON. The block appears in real-time for all connected editors. Returns the new block's stable ID. Available block types: paragraph, heading, codeBlock, blockquote, bulletList, orderedList, taskList, horizontalRule, htmlEmbed, callout, toggle, inlineDatabase Available marks: bold, italic, underline, strike, code, link, comment, suggestionAdd, suggestionDelete, highlight, textStyle, color Example: {"type":"paragraph","content":[{"type":"text","text":"Hello "},{"type":"text","text":"world","marks":[{"type":"bold"}]}]}
Insert a plain-text block at a specific position. For rich text with marks, use insert_block instead.
Move a block to a new position in the document. All connected editors see the change in real-time.
Read a specific block by its stable ID. Returns ProseMirror JSON with full rich-text structure including marks.
Read all comments on the current document. Returns an array of comments with their ID, author, content, timestamp, and the block they're attached to.
Read all records from an inline database block in the current document. Returns an array of records with their fields and values.
Read the full document content as ProseMirror JSON. Returns all blocks with their stable ID, index, and full rich-text structure including marks (bold, italic, links, etc.). Use this first to understand the document structure before making edits.
Read the document's heading structure as a nested outline. Returns an array of headings with their level (1-3), text content, stable block ID, and index. Useful for understanding document structure and navigating by section before making edits.
List all pages in the workspace with their metadata (ID, title, created/updated timestamps). Useful for understanding the workspace structure before navigating to a specific page.
Read all pending suggestions (edits marked for review) in the current document. Returns an array of suggestions with their ID, type (add/delete/update), affected block, and content.
Read the version history of the current document. Returns an array of snapshots with their timestamp, author, and size. Useful for understanding how the document has evolved.
Reject a pending suggestion, discarding the proposed edit. All connected editors see the change in real-time.
Rename the current page. Returns the updated page metadata.
Mark a comment as resolved. Returns the updated comment metadata.
Restore the document to a previous version by timestamp. All connected editors see the restored content in real-time.
Search for pages in the workspace using full-text search and/or semantic search (if embeddings are available). Returns matching pages with snippets and relevance scores.
Switch to a different document (page) in the workspace. All subsequent document tools will operate on the new document. Returns the document's outline and metadata.
Replace the text content of an existing block, identified by its stable ID. Keeps the block type and position.
Update a record in an inline database block. Returns the updated record.
No permission gates or scope declarations visible. Tools do not declare required permissions (e.g., 'write:document', 'delete:page'). Audit trail and access control are absent.
Pagination not visible for list tools (read_pages, read_comments, read_suggestions, search_pages). No limit, offset, or cursor parameters documented. Large result sets could exhaust context.