MCP server for Outline CLI integration, providing tools to interact with Outline documents, collections, and search functionality
Server has 6 tools with complete input schemas and descriptions, but quality is inconsistent. Naming follows verb_noun convention (list_, search_, get_, create_, update_). Descriptions are present but verbose (200-400 chars, above the 10-200 char ideal for LLM parsing). Critical gap: no output schemas documented, LLMs cannot infer what fields to expect from responses. Parameters have types and descriptions, but optional parameters lack clear 'required' markers. Error handling is basic (generic 'Exception' raises). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear read/write semantics. Token-usage warnings in descriptions are helpful but suggest the tool design itself may be inefficient (returning full documents when metadata would suffice).
Create a new document in Outline. WARNING: Returns full document data (high token usage). Consider using get_document_meta after creation for metadata only. Args: title: Document title. content: Document content in Markdown format. collection_id: Optional collection ID to add document to. Returns: Created document data with id, title, and URL. Raises: Exception: If creation fails or collection is invalid.
Create a new subdocument under a parent document. WARNING: Returns full document data (high token usage). Consider using get_document_meta after creation for metadata only. Args: title: Subdocument title. content: Subdocument content in Markdown format. parent_document_id: Parent document ID or search query. collection_id: Optional collection ID (defaults to parent's collection). Returns: Created subdocument data with id, title, and URL. Raises: Exception: If creation fails or parent document is invalid.
Get a document by ID or search query. WARNING: Returns complete document including full text (high token usage). Consider using get_document_meta() + get_document_content() for selective access. If identifier is a document ID, retrieves that document directly. If identifier is a search query, searches and returns the best match. For search queries, returns the single best result or raises error if ambiguous. Args: identifier: Document ID (e.g., 'abcd1234') or search query string. Returns: Complete document data including id, title, text, and metadata. Raises: Exception: If document not found or search returns multiple results.
No output schemas documented. LLMs cannot infer response structure (fields, types, nesting). Forces agents to guess what data is available for downstream tool calls.
Descriptions are 200-400 chars, above the 10-200 char ideal. Verbose warnings about token usage ('WARNING: Returns full documents...') clutter the description and should be addressed via tool design (offer metadata-only variants) or tool annotations instead.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools clearly have different safety profiles (list/search are read-only; create/update are destructive), but LLMs receive no machine-readable signal. Agents cannot reason about retry safety or confirmation requirements.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
List all collections in Outline. Returns: List of collections with id, name, description, and documentCount. Raises: Exception: If API request fails.
Search for documents by query string. WARNING: Returns full documents with text (high token usage). Consider using search_titles() or flex_search() for token efficiency. Args: query: Search query string. limit: Maximum number of results to return (default: 25, max: 100). Returns: List of matching documents with relevance ranking and context. Raises: Exception: If API request fails.
Update an existing document. WARNING: Returns full document data (high token usage). Consider using get_document_meta after update for metadata only. Args: identifier: Document ID or search query to identify the document. title: New title (optional, set to None to keep current). content: New content in Markdown format (optional, set to None to keep current). Returns: Updated document data. Raises: Exception: If document not found or update fails.
Optional parameters (collection_id in create_document, title/content in update_document) lack explicit 'required: false' markers in schema. Ambiguous whether LLM must provide them or can omit them.
Error handling is generic ('Exception: If API request fails'). No guidance on recovery (retry? ask user? fatal?). No actionable error messages with invalid values or constraints. Agents cannot self-correct.