MCP server for Outline wiki - search, read, create, update, manage documents/collections, and upload attachments
14 tools with basic descriptions and parameter schemas present, but significant quality gaps. All tools have descriptions (10-150 chars, mostly adequate), and input schemas are visible with type declarations. However, parameter descriptions are minimal or missing context. No output schemas documented. Error handling is generic (formatError returns '❌ Error: {message}'). No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Parameter validation is present but error messages lack recovery guidance. Naming is clear and verb-based (search_, get_, create_, update_, delete_, list_), following conventions. No secrets exposed as parameters (API_TOKEN and OUTLINE_BASE_URL are env-injected). Composition is reasonable, tools are single-purpose and chainable (e.g., search_documents returns IDs usable by get_document). However, parameter descriptions often lack format/constraint details (e.g., 'limit' described as 'Maximum number of results (1-25, default 10)' but type is 'string', not 'number'). Output is formatted as plain text strings rather than structured JSON, forcing LLM parsing. No pagination metadata (total count, next_cursor) in list responses.
Archive a document
Create a new collection
Create a new document in Outline
Delete an attachment from a document
Delete a collection
Delete a document (move to trash or permanently delete)
Get details about a specific collection
All parameters typed as 'string' despite semantic differences (numeric limits, booleans, IDs). 'limit' should be 'number' with min/max constraints; 'publish' and 'append' should be 'boolean'. Type mismatch invites LLM to pass invalid values.
No output schemas documented. Tools return plain-text formatted strings (e.g., '✅ Document created:\nTitle: ...') instead of structured JSON. LLM must parse unstructured text, wasting tokens and increasing hallucination risk.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | <=2025-11-25 | v2 |
Retrieve the full content of a document by ID
List all collections in Outline
List all attachments for a document
Search for documents in Outline by query text, optionally filtered by collection
Update collection details
Update an existing document's title and/or content
Upload an attachment to a document
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Destructive tools (delete_document, delete_collection, delete_attachment) lack explicit destructiveHint. LLM cannot distinguish safe from dangerous operations without reading descriptions.
Error handling is generic. formatError() returns '❌ Error: {message}' with no recovery guidance. When a document is not found or API fails, LLM receives no hint about next steps (e.g., 'Try search_documents() first').
Parameter descriptions lack format/constraint details. 'limit' says '(1-25, default 10)' but is typed 'string'. 'publish' and 'append' say 'default true/false' but are 'string' type. No enum constraints for permission levels in create_collection/update_collection.