{"name":"io.github.ivanlai/primer-mcp","slug":"ivanlai-primer-mcp","title":null,"description":"A Jira-lite MCP server that guides planning-first workflows for AI-assisted development.","url":"https://mcp.market/server/ivanlai-primer-mcp","rating":null,"grade":"A","score":88,"certified":false,"status":"active","category":"devtools","tags":["devtools"],"presence":{"score":19,"stars":0,"forks":0,"downloads_week":60,"last_push_at":"2026-10-01T20:28:21.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ivanlai/primer-mcp","website":null,"version":"0.1.8","remotes":[],"packages":[{"registryType":"pypi","identifier":"primer-mcp","version":"0.1.8","transport":{"type":"stdio"}}],"tools":[{"name":"complete_spike","description":"Close a spike by recording its findings — the answer to the question it was investigating and any recommendations. Works from any status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"complete_task","description":"Mark a task as completed with notes on what was done. The notes parameter is a terse one-liner for the frontmatter field; write a fuller summary (approach, key changes, decisions) into the ## Completion Notes body section of the ticket separately. Ideally call start_task first, but this works from any status. After this, call verify_task with evidence to finalise.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_spike","description":"Create a Spike under a story — a timeboxed investigation to answer a specific question before committing to an implementation approach. The parent story must already exist. When done, call complete_spike with your findings.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_story","description":"Create a Story under an epic — a deliverable with acceptance criteria. The epic must exist — if one hasn't been created yet, call plan_epic first. The user will have described their goals; use that to create the epic, asking for clarification if needed. If no ADR has been recorded, the response will suggest capturing decisions first, but the story is still created.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_task","description":"Create a Task under a story — a concrete unit of implementation work with a testable outcome. The parent story must already exist.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_ticket","description":"Delete a ticket. Non-todo tickets are deleted with a warning. Children are reported but not deleted — call delete_ticket on each to cascade. After all deletions, call sweep_blocked_by to clean up dangling references. Recoverable from git history.","write_action":true,"price_micros":0,"input_schema":null},{"name":"export_graph","description":"Generate a self-contained HTML file visualising the project as an interactive graph. Opens in any browser with no external requests. Nodes are coloured by type and status; edges show both hierarchy (epic -> story -> task) and dependencies (blocked_by). Click a node to see its details. On-demand — call when you want a snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_ticket","description":"Read one ticket by ID, with its full body. Also reports which tickets it blocks — that direction is not stored on the ticket itself, so this is the only way to see it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"init_project","description":"Initialise this project for primer-mcp: creates the primer/ ticket store and adds the workflow section to CLAUDE.md and AGENTS.md, creating them if needed. Non-destructive and idempotent. Call this once per project, before any other tool. Optionally pass jira_project_key if tickets may later be exported to Jira.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_actionable","description":"List what can be acted on right now, with epic context.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_tickets","description":"List tickets one per line, newest work last. Filter by type (epic, adr, story, task, spike), status, or parent_id (show only children of that ticket). Use this to find an ID before calling another tool.","write_action":false,"price_micros":0,"input_schema":null},{"name":"plan_epic","description":"Create an Epic — the top-level container for a body of work. Start here: state why the work matters, its goals, and how you'll know it's done. Consider recording decisions (record_adr) before creating stories — it captures reasoning that gets lost once implementation starts.","write_action":true,"price_micros":0,"input_schema":null},{"name":"record_adr","description":"Record an Architecture Decision Record under an epic: the context forcing a choice, the decision, alternatives rejected (with reasons), and consequences accepted. Recording decisions before creating stories is recommended — it captures reasoning that gets lost once implementation starts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"start_task","description":"Transition a task to in-progress — call this when you begin working on a task. Works from any status; you'll get a note if the transition is unusual. After finishing, call complete_task.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sweep_blocked_by","description":"Remove blocked_by references that point to tickets that no longer exist. Call once after finishing a batch of delete_ticket calls.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_ticket","description":"Amend a ticket after creation; anything left out is left alone.","write_action":true,"price_micros":0,"input_schema":null},{"name":"verify_task","description":"Verify a task with evidence that the work holds (e.g. \"218 passed, mypy clean\"). Pass the short commit hash in the commit parameter so it is labelled consistently. Ideally call complete_task first to capture notes, but this works from any status. Sets the task to verified.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":88,"grade":"A","scanned_at":"2026-11-03T07:01:59.694Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-03T07:01:59.570Z","components":{"code":{"score":25,"max":25,"notes":["16 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":12,"max":15,"notes":["last push 32 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"primer-mcp","version":"0.1.8","found":true,"weeklyDownloads":60,"dependencyCount":5,"publishedAt":"2026-09-29T20:46:01.398378Z","repositoryUrl":"https://github.com/ivanlai/primer-mcp"}],"repo":{"found":true,"owner":"ivanlai","repo":"primer-mcp","archived":false,"pushedAt":"2026-10-01T20:28:21Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/8427403?v=4","ownerCreatedAt":"2014-08-12T12:06:09Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/8427403?v=4&s=128","source":"registry"},"presence":{"stars":0,"forks":0,"downloadsWeek":60,"license":"MIT","lastPushAt":"2026-10-01T20:28:21.000Z","score":19}}}},"grade_history":[],"reviews":[]}