Install
openclaw skills install outline-app-mcpModel Context Protocol (MCP) bridge for Outline (getoutline.com). Enables AI agents to search, read, create, and manage documents, collections, and comments in an Outline workspace via SSE transport. Includes local filesystem access for bulk file/media uploads to Outline.
openclaw skills install outline-app-mcpThis skill provides a high-fidelity bridge between OpenClaw and an Outline workspace. It utilizes the Model Context Protocol (MCP) v1.0.0 to dynamically expose Outline's internal documentation tools to AI agents.
Host Filesystem Access:
The upload (in mcp_bridge.mjs) and bulk-sync (in bulk_sync.mjs) tools require access to the local host filesystem. These scripts use fs.readFileSync to read files from arbitrary absolute paths provided by the agent and upload them to the configured Outline workspace.
Before setting up the skill in OpenClaw, ensure you have completed the following steps in your Outline instance:
/mcp appended (e.g., https://docs.yourcompany.com/mcp).To use this skill, you must provide your Outline workspace details via environment variables.
openclaw config set skills.entries.outline-app-mcp.env.OUTLINE_API_KEY "your_ol_api_key"
openclaw config set skills.entries.outline-app-mcp.env.OUTLINE_URL "https://your-workspace.getoutline.com/mcp"
The following tools are available via the scripts/mcp_bridge.mjs executor. All arguments are passed as a JSON object.
list_documentsSearches documents or lists recent ones.
query (string, optional): Full-text search query.collectionId (string, optional): Filter by collection.offset (integer, optional): Pagination offset.limit (integer, optional): Max results (default 25, max 100).read_documentRetrieves the full Markdown content.
id (string, required): Unique identifier of the document.create_documentCreates a new document.
title (string, required): Document title.text (string, optional): Markdown content.collectionId (string, required if no parentDocumentId): Target collection.parentDocumentId (string, optional): Nest under this document.icon (string, optional): Emoji icon.color (string, optional): Hex color (e.g., #FF0000).publish (boolean, optional): Default true. Set false for draft.update_documentEdits an existing document.
id (string, required): Document ID.title (string, optional): New title.text (string, optional): New markdown content.editMode (enum: replace, append, prepend, optional): Default replace.collectionId (string, optional): Required when publishing a draft with no collection.icon (string/null, optional): Update or remove emoji.color (string/null, optional): Update or remove hex color.publish (boolean, optional): Publish draft or revert to draft.move_documentRelocates a document.
id (string, required): Document ID.collectionId (string, optional): Target collection.parentDocumentId (string, optional): Target parent document.index (integer, optional): Zero-based position among siblings.list_collectionsLists available collections.
query (string, optional): Filter by name.offset (integer, optional): Pagination offset.limit (integer, optional): Max results (max 100).create_collectionCreates a new collection.
name (string, required): Collection name.description (string, optional): Markdown description.icon (string, optional): Emoji icon.color (string, optional): Hex color.update_collectionUpdates collection metadata.
id (string, required): Collection ID.name (string, optional): New name.description (string, optional): New description.icon (string/null, optional): Update or remove icon.color (string/null, optional): Update or remove color.list_commentsLists comments (requires documentId or collectionId).
documentId (string, optional): Filter by document.collectionId (string, optional): Filter by collection.parentCommentId (string, optional): List only replies to this comment.statusFilter (array of resolved/unresolved, optional): Filter by status.offset (integer, optional): Pagination offset.limit (integer, optional): Max results.create_commentAdds a comment to a document.
documentId (string, required): Document to comment on.text (string, required): Markdown content.parentCommentId (string, optional): Nest as a reply.update_commentUpdates or resolves a comment.
id (string, required): Comment ID.text (string, optional): New markdown text.status (enum: resolved, unresolved, optional): Resolve thread.delete_commentDeletes a comment.
id (string, required): Comment ID.list_usersLists workspace members.
query (string, optional): Search by name or email.role (enum: admin, member, viewer, guest, optional): Filter by role.filter (enum: active, suspended, invited, all, optional): Filter by status.offset (integer, optional): Pagination offset.limit (integer, optional): Max results.OUTLINE_API_KEY="..." OUTLINE_URL="..." node skills/outline-app-mcp/scripts/mcp_bridge.mjs call "list_documents" '{"query": "Project Roadmap"}'
OUTLINE_API_KEY="..." OUTLINE_URL="..." node skills/outline-app-mcp/scripts/mcp_bridge.mjs call "create_document" '{
"title": "Weekly Sync - April 1",
"collectionId": "col_uuid_here",
"text": "# Update\nEverything is on track."
}'
OUTLINE_API_KEY="..." OUTLINE_URL="..." node skills/outline-app-mcp/scripts/mcp_bridge.mjs call "update_document" '{
"id": "doc_uuid_here",
"text": "\n| New Entry | Ready | [Link](url) |",
"editMode": "append"
}'
Use the bulk_sync.mjs script for unified Turnaround (Upload + Update).
OUTLINE_API_KEY="..." OUTLINE_URL="..." node skills/outline-app-mcp/scripts/bulk_sync.mjs "bulk-sync" "target_doc_id" "/path/1.png,/path/2.png" "## 🎨 New Media Assets\n{{MEDIA}}\n---\n*Synced via AI Agent*" "append"
{{MEDIA}} as a placeholder for uploaded images.replace, append, or prepend.OUTLINE_API_KEY="..." OUTLINE_URL="..." node skills/outline-app-mcp/scripts/mcp_bridge.mjs call "create_comment" '{
"documentId": "doc_uuid_here",
"text": "Draft is ready for review."
}'
OUTLINE_API_KEY="..." OUTLINE_URL="..." node skills/outline-app-mcp/scripts/mcp_bridge.mjs call "move_document" '{
"id": "doc_uuid_here",
"collectionId": "new_collection_uuid"
}'
To minimize token consumption and improve responsiveness, always prefer append or prepend modes when adding new information to existing documents.
replace mode (default) if you only need to add a new row or section.bulk_sync.mjs for uploading multiple images to avoid redundant Turnarounds.@modelcontextprotocol/sdk (local)OUTLINE_API_KEYStreamableHTTPClientTransport (POST-based SSE)