MCP server for Atlassian Confluence. Provides tools enabling AI systems (LLMs) to list/get spaces & pages (content formatted as Markdown) and search via CQL. Connects AI seamlessly to Confluence knowledge bases using the standard MCP interface.
This server demonstrates good definition quality with well-structured tool descriptions and comprehensive parameter documentation. All 5 tools have descriptions exceeding 200 characters with explicit WHEN TO USE and WHEN NOT TO USE sections that guide LLM selection. Parameter schemas are present and typed. However, there are notable gaps: tool annotations (readOnlyHint, destructiveHint) are missing entirely, output schemas are not formally documented in the code, and parameter enum constraints are not fully declared in the schema definitions. The descriptions are verbose (excellent for LLM guidance) but border on exceeding the 1024-char soft limit. Naming follows verb_noun conventions consistently (list_, get_, search_). Error handling guidance is embedded in descriptions but not formalized in error response structures. Overall, this is a solid B-grade implementation that would benefit from schema formalization and tool annotations.
Retrieve a Confluence page's full content and metadata by its numeric ID. PURPOSE: Fetches the complete content (converted to Markdown) and comprehensive metadata for a specific Confluence page, identified by its numeric ID. The page content is properly formatted with headings, tables, lists, and other Markdown elements. WHEN TO USE: - When you need to read, analyze, or summarize the full content of a specific page. - When you need detailed page metadata (author, version, status, etc.). - After finding a page ID through 'list_pages' or 'search' and need its complete content. - When you need the actual content of a page rather than just its metadata. WHEN NOT TO USE: - When you only have a space ID or space key (use 'list_pages' first). - When you need to find pages based on criteria (use 'list_pages' or 'search'). - When you want to discover spaces rather than specific pages (use space tools). - When you need to search across multiple pages (use 'search'). RETURNS: Comprehensive page details formatted in Markdown, including: - Full title, space information, and creation metadata - Complete page content (converted from Atlassian Document Format to Markdown) - Version information, permissions status, and URL - Metadata including labels, restrictions, and ancestors The page content is fetched using the Confluence Content REST API, with the body transformed from ADF (Atlassian Document Format) to readable Markdown. EXAMPLES: - Get page with ID 123456: { pageId: "123456" } ERRORS: - Page not found (404): Verify the numeric page ID exists and is accessible. - Permission denied (403): Check if the page has view restrictions. - Authentication failure: Verify API credentials. - Content conversion failures: Some complex content elements may not convert perfectly to Markdown.
Retrieve comprehensive details about a specific Confluence space by ID. PURPOSE: Fetches complete metadata and configuration information for a space, identified by its numeric ID. Provides all available details about a space, including permissions, themes, and homepage. WHEN TO USE: - When you need detailed information about a specific space's configuration. - When you need the numeric ID of a space's homepage to use with 'get_page'. - When you need to verify permissions, status, or theme settings. - When you need to analyze space metadata before working with its content. - After finding a space through 'list_spaces' and needing more details. - When you need to determine if a space is active, archived, or has specific restrictions. WHEN NOT TO USE: - When you need to discover spaces (use 'list_spaces' instead). - When you need to list pages in a space (use 'list_pages' instead). - When you need to search for content (use 'search' instead). - When you only have a space key and need the ID (use 'list_spaces' first). RETURNS: Comprehensive space details formatted in Markdown, including: - Full name, key, and ID information - Description and homepage details - Type, status, and theme configuration - Permissions and restrictions - Creation and modification metadata - URLs for accessing the space directly All available metadata is fetched by default to provide complete information. EXAMPLES: - Get space with ID 123456: { spaceId: "123456" } ERRORS: - Space not found (404): Verify the numeric space ID exists and is accessible. - Permission denied (403): Check if you have access to the space. - Authentication failure: Verify Confluence credentials. - Invalid ID format: Ensure the spaceId is a valid numeric identifier.
Tool annotations missing entirely. No readOnlyHint, destructiveHint, or idempotentHint declarations. All tools are read-only but this is not signaled in the tool registration, forcing LLMs to infer safety from descriptions alone.
Output schemas not formally documented. Tool descriptions state what is returned (e.g., 'page ID, title, space ID, status, author...') but the actual JSON response structure is not declared in a schema property. LLMs cannot validate or plan based on return types.
Input parameter enums not declared in schema. For example, 'status' parameter accepts 'current' or 'archived' per description, but this is not expressed as an enum in the JSON schema definition, allowing LLMs to pass arbitrary strings.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 72 | <=2025-11-25 | v2 |
| 2026-03-09 | C | 60 | - | v1 |
List Confluence pages, optionally filtering by space ID(s), status, or title/content/label query, with pagination. PURPOSE: Discover pages within specific spaces or across the instance based on status or simple text matching. Provides page metadata and IDs needed for the 'get_page' tool. WHEN TO USE: - To list pages within one or more specific spaces (using 'spaceId'). - To find pages based on their status ('current', 'archived', etc.). - To perform simple text searches on page titles or labels ('query'). - To get an overview of recent pages in a space before getting full content. - To obtain 'pageId' values for use with 'get_page'. WHEN NOT TO USE: - When you need to search the *full content* of pages with complex logic (use 'search' with CQL). - When you already know the 'pageId' and need details (use 'get_page'). - When you need space information (use space tools). - If you only have the space *key* (use 'list-spaces' or 'get-space' to find the numeric 'spaceId' first). RETURNS: Formatted list of pages including ID, title, space ID, status, author, creation date, version, and URL. Includes pagination details if applicable (Confluence uses cursor-based pagination). SORTING: By default, pages are sorted by modified date in descending order (most recently modified first). You can change this by specifying a different value in the 'sort' parameter (e.g., "title" for alphabetical sorting). EXAMPLES: - List pages in space 123456: { spaceId: ["123456"] } - List archived pages in space 123456: { spaceId: ["123456"], status: ["archived"] } - Find pages with "Project Plan" in title/label in space 123456: { spaceId: ["123456"], query: "Project Plan" } - Paginate results: { limit: 10, cursor: "some-cursor-value" } - Sort pages by title: { spaceId: ["123456"], sort: "title" } ERRORS: - Space ID not found: Verify the numeric 'spaceId' is correct. - Invalid status: Ensure 'status' is one of the allowed values. - Authentication failures: Check Confluence credentials. - No pages found: Filters might be too restrictive, or the space is empty/inaccessible.
List available Confluence spaces with filtering options and pagination support. PURPOSE: Discovers accessible Confluence spaces, providing metadata about each space including ID, key, name, description, and status. This tool is essential for finding spaces before working with their content. WHEN TO USE: - When you need to discover what spaces exist in the Confluence instance. - When you need to find a space's ID or key to use with other tools. - When you need to filter spaces by type ('global', 'personal', 'archived'). - When you need to locate a space by partial name matching. - When you need to browse available content sources. - As a first step before using 'list_pages' or content search tools. WHEN NOT TO USE: - When you already know the specific space ID/key (use 'get_space' instead). - When you need to search for page content (use 'search' instead). - When you need to list pages within a known space (use 'list_pages' instead). - When you need detailed information about a specific space (use 'get_space' instead). RETURNS: Formatted list of spaces including: - Numeric ID (used for most API operations) - Space key (short identifier, e.g., 'DEV', 'HR', etc.) - Display name and description - Type (global, personal) and status (current, archived) - Creation information and URL Results can be paginated using the 'limit' and 'cursor' parameters. SORTING: By default, spaces are sorted by name in descending order. EXAMPLES: - List all spaces: {} - Filter by type: { type: ["global"] } - Filter by status: { status: ["current"] } - Search by name: { query: "Engineering" } - With pagination: { limit: 20, cursor: "some-cursor-value" } ERRORS: - Authentication failures: Check Confluence credentials. - Permission issues: Ensure you have access to view spaces. - Invalid filter values: Verify type/status values match allowed options. - No spaces found: May indicate permission issues or overly restrictive filters.
Search Confluence content using CQL (Confluence Query Language) for precise results. PURPOSE: Performs advanced content searches across Confluence using CQL queries, allowing for complex search patterns, content filtering, and targeted results. This is the most powerful search tool for Confluence, supporting complex filtering and sorting. WHEN TO USE: - When you need to search for specific text or patterns within page content (not just titles). - When you need to combine multiple search criteria (e.g., text + space + date + type). - When you need to search using complex logical operators (AND, OR, NOT). - When simple title/label searches via 'list_pages' are insufficient. - When you need to search across all content types (pages, blog posts, attachments, etc.). - When you need fine-grained sorting control over search results. WHEN NOT TO USE: - When you already know the page ID (use 'get_page' instead). - When you only need to list pages in a space by title (use 'list_pages' with optional query). - When you need to explore or browse spaces (use space-related tools). - When you're not searching for actual content (e.g., for space metadata). RETURNS: Formatted search results including: - Result type (page, blog, attachment, etc.) - Title and content excerpt with highlighted match terms - Space information, creation metadata, and URL - Content ID for use with other tools like 'get_page' Results can be paginated using the 'limit' and 'cursor' parameters. CQL EXAMPLES: - Basic text search: { cql: "text ~ 'project plan'" } - Combined criteria: { cql: "text ~ 'quarterly report' AND space = DEV AND type = 'page'" } - Date filtering: { cql: "created >= '2023-01-01' AND created <= '2023-12-31'" } - Content by specific user: { cql: "creator = 'jsmith'" } - Exact phrase with label: { cql: "text = 'API Documentation' AND label = 'public'" } Common CQL fields: - text: Full-text content search - title: Title search - space: Space key - type: Content type (page, blogpost, attachment) - created/modified: Date criteria - label: Content labels - creator/contributor: User references ERRORS: - Invalid CQL syntax: Check query format against CQL documentation. - No results: Try broadening search criteria. - Authentication/permission failures: Ensure proper credentials. - Rate limiting: For large result sets, use pagination and caching.
Error handling documented in descriptions but not formalized. Descriptions include error cases ('Space ID not found', 'Permission denied') and recovery steps, but there is no structured error response format that guides LLM retry logic or mitigation strategies.
Parameter type 'array' used for string filters (e.g., spaceId, status, type) without explaining why arrays are required. Single values are more natural for users; if multiple filtering is needed, document the composition logic (AND vs OR).