MCP server for Slab knowledge bases — built around what actually works in the Slab GraphQL API (syncPost), not what the schema advertises.
Strong foundation with 16 well-named tools following verb_noun convention (slab_get_post, slab_search_posts, slab_upsert_post). All tools have descriptions (avg ~150 chars, within 10-1024 baseline). Input schemas are complete with proper JSON Schema types and enums. Pagination is well-implemented across list tools with cursor support. Key strengths: consistent naming, clear parameter descriptions, proper enum constraints for response_format. Weaknesses: output schemas are not explicitly documented in code (only inferred from descriptions); error handling guidance is minimal; some experimental tools (slab_create_topic, slab_create_comment) lack confidence statements in descriptions; no dry-run/confirmation pattern for destructive operations.
Archive a Slab post (soft delete). Args: - id_or_url (string): Slab post ID or URL. - response_format ('markdown' | 'json'): Output format (default 'markdown'). Archived posts remain in Slab but are hidden from most views. They can be restored with slab_unarchive_post.
Post a comment on an existing Slab post. ⚠️ EXPERIMENTAL: this mutation has not been verified against Slab's production API. It may fail with INTERNAL_SERVER_ERROR similarly to 'updatePostContent'. If so, please open an issue. Args: - id_or_url (string): Slab post ID or URL. - content (string): Comment body (plain text). - response_format ('markdown' | 'json'): Output format (default 'markdown'). The comment is attributed to the API token's owner.
Create a new topic in the Slab organisation. ⚠️ EXPERIMENTAL: this mutation has not been verified against Slab's schema in the same depth as the post mutations. If you get a "Cannot query field 'createTopic'" error, please open an issue with the exact response. Args: - name (string): Topic name. - description (string, optional): Topic description. - response_format ('markdown' | 'json'): Output format (default 'markdown').
Return the user the current SLAB_API_TOKEN belongs to. Args: - response_format ('markdown' | 'json'): Output format (default 'markdown'). Useful for confirming auth is working and seeing whose name will be attributed to writes.
Output schemas not explicitly documented in code. Tool descriptions mention return fields (title, metadata, content) but no formal schema definitions visible. LLMs cannot reliably plan downstream tool calls without knowing exact response structure.
Experimental tools (slab_create_topic, slab_create_comment) marked with ⚠️ EXPERIMENTAL but lack clear guidance on failure modes or recovery steps. Descriptions warn of potential errors but don't tell LLM what to do if they occur.
Destructive operations (slab_archive_post, slab_upsert_post) lack confirmation or dry-run pattern. Agents could accidentally archive posts or overwrite content without user approval.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2025-06-18+ | v2 |
Fetch a single Slab post by ID or URL. Args: - id_or_url (string): Slab post ID or full URL. - response_format ('markdown' | 'json'): Output format (default 'markdown'). Returns the post's title, metadata (owner, topics, timestamps, archivedAt) and content rendered from Quill ops to markdown for readability.
Fetch a single topic by ID. Args: - topic_id (string): Slab topic ID. - response_format ('markdown' | 'json'): Output format (default 'markdown').
Fetch a single user by ID. Args: - user_id (string): Slab user ID. - response_format ('markdown' | 'json'): Output format (default 'markdown').
List comments attached to a Slab post. Args: - id_or_url (string): Slab post ID or URL. - first (number): Page size, 1–100 (default 20). - after (string, optional): Cursor from a previous result. - response_format ('markdown' | 'json'): Output format (default 'markdown').
List all posts in the organisation, paginated. Args: - first (number): Page size, 1–100 (default 20). - after (string, optional): Cursor from a previous result. - response_format ('markdown' | 'json'): Output format (default 'markdown').
List posts within a topic, paginated. Args: - topic_id (string): Slab topic ID. - first (number): Page size, 1–100 (default 20). - after (string, optional): Cursor from a previous result. - response_format ('markdown' | 'json'): Output format (default 'markdown').
List all topics in the organisation, paginated. Args: - first (number): Page size, 1–100 (default 20). - after (string, optional): Cursor from a previous result. - response_format ('markdown' | 'json'): Output format (default 'markdown').
List users in the Slab organisation, paginated. Args: - first (number): Page size, 1–100 (default 20). - after (string, optional): Cursor from a previous result. - response_format ('markdown' | 'json'): Output format (default 'markdown').
Search Slab posts by free-text query. Args: - query (string): Search string. Supports the same operators as the Slab UI. - first (number): Page size, 1–100 (default 20). - after (string, optional): Cursor from a previous result's pageInfo.endCursor. - response_format ('markdown' | 'json'): Output format (default 'markdown').
Attach or detach a topic from a Slab post. Args: - id_or_url (string): Slab post ID or URL. - topic_id (string): Slab topic ID. - attach (boolean): true to attach, false to detach (default true). - response_format ('markdown' | 'json'): Output format (default 'markdown').
Restore an archived Slab post. Args: - id_or_url (string): Slab post ID or URL. - response_format ('markdown' | 'json'): Output format (default 'markdown').
Create or update a Slab post (idempotent on externalId). Args: - external_id (string): Stable external identifier (e.g. a doc ID from your source system). - content (string): Post body in markdown. - title (string, optional): Post title. If omitted, Slab infers from the first line of content. - edit_url (string, optional): URL to edit the source document. - read_url (string, optional): URL to view the source document. - response_format ('markdown' | 'json'): Output format (default 'markdown'). The same externalId always resolves to the same Slab post id; content is refreshed in place. Useful for syncing docs from external systems.
No error classification or recovery guidance in tool descriptions. When a tool fails (e.g., 'Cannot query field createTopic'), descriptions don't tell LLM whether to retry, ask user, or escalate.
CHARACTER_LIMIT constant (25000 chars) enforced in responses but not documented in tool descriptions. LLMs don't know responses may be truncated, risking incomplete data interpretation.