MCP server for Jira Data Center REST API with support for issues, projects, users, boards, sprints, epics, metadata, and attachments
The server implements 15 tools across attachments, boards, epics with generally good naming and comprehensive parameter schemas. Most tools have descriptive text and clear input definitions. However, several critical gaps exist: (1) Some tool descriptions are generic or incomplete, e.g., jira_get_board_sprints and jira_get_board_epics lack full prose descriptions, only input schemas; (2) Return/output schemas are not explicitly documented in the tool definitions provided, descriptions mention what is returned but formal output schema documentation is absent; (3) Error handling guidance is present in descriptions but lacks structured recovery hints (e.g., 'If epic not found, try...'); (4) No tool annotations visible beyond toolAnnotations=true flag (no per-tool readOnlyHint/destructiveHint observed in schemas); (5) Parameter descriptions are generally good (72 chars baseline achieved) but a few are minimal; (6) No sensitive data validation or secret handling patterns visible. Overall, definitions are mid-tier solid, clear intent, proper enums, but missing the LLM-optimized polish and formal output schema documentation that separates A-grade servers.
Upload a file attachment to a Jira issue. The file content must be provided as a base64-encoded string. Args: - issueIdOrKey (string, required): Issue key (e.g., "PROJ-123") or numeric ID - filename (string, required): Name for the uploaded file (e.g., "screenshot.png") - content (string, required): File content as a base64-encoded string Returns: Attachment metadata including ID, filename, size, and download URL. Examples: - Upload text file: { issueIdOrKey: "PROJ-123", filename: "notes.txt", content: "SGVsbG8gV29ybGQ=" } Error handling: - 404: Issue not found. - 403: No permission to add attachments to this issue. - 413: File too large. Check Jira's attachment size limit.
Delete an attachment by ID. This action is permanent and cannot be undone. Args: - attachmentId (string, required): Attachment ID to delete Returns: Confirmation that the attachment was deleted. Examples: - Delete attachment: { attachmentId: "12345" } Error handling: - 404: Attachment not found. - 403: No permission to delete this attachment.
Get attachment metadata by ID. Args: - attachmentId (string, required): Attachment ID - response_format (string, optional): "markdown" (default) or "json" Returns: Attachment metadata including filename, MIME type, size, author, and download URL. Examples: - Get attachment: { attachmentId: "12345" } Error handling: - 404: Attachment not found. - 403: No permission to view this attachment.
Two tools (jira_get_board_sprints, jira_get_board_epics) have minimal descriptions, only input schemas provided, no prose explanation of purpose or when to call them. Descriptions under 50 characters fail the 20 - 1024 character guideline and provide insufficient LLM decision context.
Output/return schemas are not formally documented in tool definitions. Descriptions mention 'Returns: ...' but no structured schema (JSON Schema format) is provided. LLMs cannot reliably plan downstream calls or parse results without explicit output schemas.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Get details for a single board by its ID. Args: boardId: The numeric ID of the board. response_format: "markdown" (default) or "json". Returns: Board details including name, type, and associated project location. Examples: - Get board 42: { boardId: 42 } Error handling: Returns a 404 error if the board does not exist or is not accessible.
List issues in the backlog of a board with optional JQL filtering. Args: boardId: The numeric ID of the board. jql: Optional JQL expression to filter the backlog issues. startAt: Pagination offset (0-based, default 0). maxResults: Page size (1-100, default 50). fields: Optional list of field names to include (e.g., ["summary","status"]). response_format: "markdown" (default) or "json". Returns: A paginated list of backlog issues with key, summary, status, priority, and assignee. Examples: - Backlog for board 42: { boardId: 42 } - Filtered backlog: { boardId: 42, jql: "priority = High" } Error handling: Returns an error if the board does not exist, the backlog is not enabled, or the JQL is invalid.
Get the configuration of a board including columns, estimation, and filter settings. Args: boardId: The numeric ID of the board. response_format: "markdown" (default) or "json". Returns: Board configuration with column mappings, estimation type, filter ID, and ranking field. Examples: - Get config for board 42: { boardId: 42 } Error handling: Returns a 404 error if the board does not exist or a 403 if you lack permission.
List all epics associated with a board.
List issues on a board with optional JQL filtering. Args: boardId: The numeric ID of the board. jql: Optional JQL expression to filter the issues returned. startAt: Pagination offset (0-based, default 0). maxResults: Page size (1-100, default 50). fields: Optional list of field names to include (e.g., ["summary","status"]). response_format: "markdown" (default) or "json". Returns: A paginated list of issues on the board with key, summary, status, priority, and assignee. Examples: - All issues on board 42: { boardId: 42 } - Filtered: { boardId: 42, jql: "status = 'In Progress'" } - With specific fields: { boardId: 42, fields: ["summary", "status", "assignee"] } Error handling: Returns an error if the board does not exist or the JQL is invalid.
List all sprints associated with a board, including active, future, and completed sprints.
Get details for a single epic by its ID or issue key. Args: epicIdOrKey: The numeric ID or issue key (e.g., "PROJ-100") of the epic. response_format: "markdown" (default) or "json". Returns: Epic details including key, name, summary, done status, and color. Examples: - By key: { epicIdOrKey: "PROJ-100" } - By ID: { epicIdOrKey: "10500" } Error handling: Returns a 404 if the epic does not exist or is not accessible.
List issues belonging to an epic with optional JQL filtering. Args: epicIdOrKey: The numeric ID or issue key of the epic. startAt: Pagination offset (0-based, default 0). maxResults: Page size (1-100, default 50). jql: Optional JQL expression to further filter the issues in the epic. fields: Optional list of field names to include (e.g., ["summary","status"]). response_format: "markdown" (default) or "json". Returns: A paginated list of issues in the epic with key, summary, status, priority, and assignee. Examples: - All issues in epic: { epicIdOrKey: "PROJ-100" } - Filtered: { epicIdOrKey: "PROJ-100", jql: "status != Done" } - With specific fields: { epicIdOrKey: "PROJ-100", fields: ["summary", "status", "assignee"] } Error handling: Returns a 404 if the epic does not exist or a 400 if the JQL is invalid.
List all boards visible to the current user from the Jira Agile API. Args: type: Optional board type filter ("scrum", "kanban", or "simple"). name: Optional name filter (substring match, case-insensitive). startAt: Pagination offset (0-based, default 0). maxResults: Page size (1-100, default 50). response_format: "markdown" (default) or "json". Returns: A paginated list of boards with their IDs, names, types, and project locations. Examples: - List all boards: {} - List scrum boards: { type: "scrum" } - Search by name: { name: "Frontend" } - Page 2 of results: { startAt: 50, maxResults: 50 } Error handling: Returns an error message if the Agile API is unreachable or if authentication fails.
Move one or more issues into an epic. Issues can be specified by key (e.g., "PROJ-123") or numeric ID. Args: epicIdOrKey: The numeric ID or issue key of the target epic (required). issues: An array of issue keys or IDs to add to the epic (required, at least one). Returns: A confirmation message indicating the issues were moved successfully. Examples: - Move one issue: { epicIdOrKey: "PROJ-100", issues: ["PROJ-123"] } - Move multiple: { epicIdOrKey: "PROJ-100", issues: ["PROJ-123", "PROJ-124", "PROJ-125"] } Error handling: Returns a 404 if the epic or any issue does not exist, or 403 if you lack permission.
Remove one or more issues from their current epic, leaving them unassigned to any epic. Issues can be specified by key or numeric ID. Args: issues: An array of issue keys or IDs to remove from their epic (required, at least one). Returns: A confirmation message indicating the issues were removed from their epic. Examples: - Remove one issue: { issues: ["PROJ-123"] } - Remove multiple: { issues: ["PROJ-123", "PROJ-124"] } Error handling: Returns a 404 if any issue does not exist or 403 if you lack permission.
Update an existing epic. Only the fields you provide will be changed. Args: epicIdOrKey: The numeric ID or issue key of the epic to update (required). name: New name for the epic. summary: New summary for the epic. done: Set to true to mark the epic as done, false to mark it as not done. Returns: The updated epic object with all current fields. Examples: - Rename: { epicIdOrKey: "PROJ-100", name: "New Epic Name" } - Mark as done: { epicIdOrKey: "PROJ-100", done: true } - Update summary: { epicIdOrKey: "PROJ-100", summary: "Revised scope for Q2" } - Multiple fields: { epicIdOrKey: "PROJ-100", name: "Auth Epic", summary: "All authentication work", done: false } Error handling: Returns a 404 if the epic does not exist, 400 for invalid field values, or 403 if you lack permission.
Error handling descriptions provide HTTP status codes and brief messages but lack actionable recovery guidance (e.g., 'If epic not found, try search_epics() first' or 'This error is retryable'). Recovery guidance is not structured (not categorized as retryable/user-fixable/fatal).
No tool annotations visible in input schemas. The server declares toolAnnotations=true but individual tools lack readOnlyHint, destructiveHint, or idempotentHint markers in their schema definitions. Agents cannot distinguish read-only from destructive tools without scanning descriptions.
Destructive operations (jira_delete_attachment, jira_update_epic, jira_move_issues_to_epic, jira_remove_issues_from_epic) lack dry-run or confirmation steps. Agents making mistakes cannot preview the impact before execution.
Pagination is supported in list/board/backlog/epic tools (startAt, maxResults) but maxResults lacks explicit min/max bounds in descriptions. Guidelines recommend stating '1-100, default 50' explicitly in the description text (not relying on schema constraints alone).