MCP server for issue tracking, project management, lessons learned, flags, and retries with multi-tenant support
Strong foundational quality with comprehensive schema definitions and consistent naming conventions across 37 tools. Tool names uniformly follow verb_noun patterns (CreateIssue, ListIssues, UpdateIssue, etc.). All 37 tools have descriptions present, with most in the 40-150 character range. Input schemas are complete and properly typed with JSON Schema format across the board. However, parameter descriptions lack depth in many cases, most are 1-5 words rather than actionable guidance ('Issue ID' vs 'The unique identifier of the issue; can be numeric or UUID format'). Output schemas are documented via code comments but not exposed in parameter descriptions. Error handling is basic, tools return structured results but lack recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are visible in the code, despite clear risk classifications in the metadata. Response size protection is implemented (protectedListResult, maxResponseChars=50k) showing agent-aware design. The server demonstrates production maturity in naming, schema structure, and parameter consistency, but falls short of A-grade polish due to shallow descriptions and missing error recovery guidance.
Add a comment to an issue
Add a dependency relationship between issues
Add an event to an issue
Add a label to an issue
Admin: Delete a project by slug or UUID
Admin: Update project name and/or slug
Compact old issues by age threshold (default 7 days)
Admin: Create an API key for a tenant with optional label
Parameter descriptions are uniformly minimal (1-5 words). 'Issue ID', 'Filter by status', 'Optional context JSON' lack actionable format or constraint guidance. Per pattern:tool-description, LLMs cannot infer parameter meaning from names alone. Descriptions should state format, range, valid values, and usage context.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 58 | - | v1 |
Create a new issue with title, description, priority, type, and optional project assignment
Create a new project with name and slug
Admin: Create a new tenant with name and slug
Delete an issue by ID
Admin: Delete a tenant by slug
Get the dependency tree for an issue
Retrieve a single issue by ID
Admin: List API keys for a tenant
List comments for an issue
List dependencies for an issue
List events for an issue
List flags with optional filtering by project, status, severity, and issue ID
List issues with filtering by status, type, priority, assignee, project, and sorting options
List all labels for an issue
List lessons learned with optional filtering by project, status, expert, component, and severity
List all projects
List retry attempts for an issue with optional status filtering
Admin: List all tenants
Raise a flag on an issue with type, severity, and summary
Record a lessons learned entry with mistake, correction, and optional project/issue association
Record a retry attempt for an issue with status and error information
Remove a dependency relationship between issues
Remove a label from an issue
Resolve a flag with a resolution and optional resolver name
Mark a lesson as resolved
Admin: Revoke an API key by prefix
Admin: Generate a new admin API key and invalidate the old one stored in the database
Update issue properties including title, description, status, priority, assignee, owner, pinned status, and notes
Admin: Update tenant name and/or slug
No tool annotations visible in source code. Despite risk classifications in metadata (WRITE, READ_ONLY, DESTRUCTIVE), no readOnlyHint, destructiveHint, or idempotentHint are present in tool definitions. Per MCP spec 2026-07-28, these annotations guide agent planning and safety.
Error handling responses are basic. Code shows errResult() returning error text in TextContent but no recovery guidance, actionable constraint details, or categorization (retryable vs fatal). Per pattern:recovery-guide, errors should direct agents to next steps.
Destructive operations (DeleteIssue, DeleteTenant, AdminDeleteProject) lack confirmation/dry-run support. Per pattern:confirmation-request, irreversible operations should offer a confirmation step to prevent accidental destruction by agents.
Multiple list tools accept 'limit' parameter but no hard maximum is documented in descriptions. Code shows applyListDefaults() and hardCapNoProject=20 internally, but this constraint is not exposed in parameter descriptions. LLMs may request unreasonable limits without guidance.
Admin tools (CreateTenant, CreateAPIKey, RotateAdminKey, etc.) have no visible permission checks in the source excerpt. No scope declarations or auth gates are evident. Per pattern:permission-gate, destructive and privileged operations must verify authority before execution.
Tool composition could be streamlined. 'Compact' tool accepts only 'age' parameter and compacts issues by age. Per pattern:tool, tools should do one thing well, and the response size protection (protectedListResult auto-compaction) suggests the agent never explicitly calls Compact, it happens behind the scenes. Consider documenting this contract explicitly or consolidating with ListIssues.
Filter parameters in ListIssues, ListDependencies, ListFlags, ListLessons accept string values without enum constraints. E.g., 'status' and 'issue_type' parameters have no enum definitions, inviting hallucinated values. Per pattern:constrained-input, free-form strings should become enums with valid options explicitly listed.