Confluence CLI tool with Claude Code skill integration - manage pages, publish markdown, search, and handle attachments in Confluence
Confluence CLI has 8 tools with verb-based names (list-, get-, create-, update-, delete-, search-, upload, publish), which is good. However, critical gaps undermine definition quality: parameter schemas are INCOMPLETE (types visible but not fully structured JSON Schema with explicit 'type' and 'properties' declarations), descriptions vary in quality (some are 30-50 chars, below the 194-char baseline), and output schemas are UNDOCUMENTED. Error handling is not evident in the tool definitions, no guidance for LLMs on recovery steps. The 'get-page' and 'update-page' tools accept overloaded 'idOrTitle' parameters that conflate two types without enum/pattern constraints. No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels. Parameters like 'space' and 'limit' lack proper enums or range constraints. Output documentation is absent entirely, LLMs cannot plan downstream tool calls without knowing what fields are returned.
Create a new page
Delete a page by ID
Get a page by ID or title
List accessible Confluence spaces
Publish a markdown file to Confluence (with images + mermaid)
Search pages by title
Update an existing page
Upload a file as attachment to a page
Parameter schemas are incomplete. Input parameters have string types but lack full JSON Schema structure (no explicit 'properties', 'type': 'object' wrapper, or required array). For example, 'get-page' shows {"idOrTitle":{...}} but should be {"type":"object","properties":{"idOrTitle":{...}},"required":["idOrTitle"]}. This prevents MCP clients from properly parsing and validating inputs.
Output schemas are completely undocumented. No tool specifies what fields it returns or their types. LLMs cannot plan multi-tool sequences without knowing what data is available. For example, 'create-page' should document it returns {id, title, url, version, space_key}, enabling downstream tools to chain calls.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 35 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 37 | - | v1 |
Overloaded 'idOrTitle' parameter in 'get-page' and 'update-page' requires LLM to guess whether to pass a numeric ID or a title string. Should split into separate parameters (page_id, page_title) or use a union type with explicit discrimination. Currently breaks the 'natural-identifiers' pattern, accepts both but doesn't guide LLM selection.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. 'delete-page' is marked DESTRUCTIVE but has no destructiveHint annotation. 'create-page', 'update-page', 'upload', 'publish' are WRITE but lack annotations. Agents cannot distinguish between safe read-only discovery tools and state-altering operations.
'search' and 'list-spaces' have 'limit' parameters with string type and default='25', but no min/max constraints. 'search' accepts any numeric string; unbounded parameters let LLMs request 999999 results, risking timeouts. Should be integer with minimum=1, maximum=100.
'create-page' and 'update-page' accept both 'file' and 'content' parameters but description does not clarify mutually exclusive relationship or which takes precedence. Should state: 'Pass either file OR content, not both. If both provided, content is ignored.'
'upload' requires 'page' (page ID) but description is vague ('Page ID to attach to (required)'). Should specify: 'Numeric page ID from get-page or create-page response.' This enables LLMs to locate the ID in prior responses.
'delete-page' description is only 16 characters ('Delete a page by ID') and lacks guidance on consequences. Should be: 'Permanently delete a page and all its attachments. This action cannot be undone.'
No error handling guidance visible in tool definitions. No mention of recovery steps for common failures (e.g., 'If space not found, call list-spaces() to see available spaces', 'If page not found, try search() with partial title'). Agents have no path forward on errors.
'publish' accepts optional 'page-id' (with hyphen) but should use snake_case consistently. Parameter names with hyphens are unusual in JSON schemas; should be 'page_id'. This inconsistency risks LLM confusion when mapping between parameter names.