{"name":"io.github.TomAtAP/storymapper","slug":"tomatap-storymapper","title":"Story Mapper","description":"User story map + kanban with a live browser UI; AI agents and humans plan the same backlog via MCP.","url":"https://mcp.market/server/tomatap-storymapper","rating":null,"grade":"A","score":88,"certified":false,"status":"active","category":"scraping","tags":["scraping","maps"],"presence":{"score":24,"stars":1,"forks":0,"downloads_week":37,"last_push_at":"2026-07-20T05:33:59.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/TomAtAP/storymapper","website":"https://github.com/TomAtAP/storymapper#readme","version":"1.0.1","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"storymapper","version":"1.0.1","runtimeHint":"npx","transport":{"type":"stdio"},"packageArguments":[{"description":"Run in MCP stdio mode","isRequired":true,"value":"mcp","type":"positional"},{"description":"Directory for the SQLite database (share it with the browser UI to see the same projects)","type":"named","name":"--data-dir"}]}],"tools":[{"name":"attachment_delete","description":"Delete a binary attachment by id. Returns {deleted: id|null}.","write_action":true,"price_micros":0,"input_schema":null},{"name":"attachment_get","description":"Read a binary attachment. ALWAYS returns metadata + a downloadUrl (the REST","write_action":false,"price_micros":0,"input_schema":null},{"name":"attachment_list","description":"List binary attachments (metadata only — no content) of a project. Pass ticketId","write_action":false,"price_micros":0,"input_schema":null},{"name":"attachment_put","description":"Upload a binary attachment (base64) to a project. OMIT ticketId for a","write_action":true,"price_micros":0,"input_schema":null},{"name":"bulk_change_status","description":"Change the status of multiple tickets in one revision. Each ticket","write_action":false,"price_micros":0,"input_schema":null},{"name":"bulk_link_create","description":"Create the same-typed link from each ticket in sourceTicketIds[] to","write_action":true,"price_micros":0,"input_schema":null},{"name":"bulk_ticket_update","description":"Apply the same `patch` to multiple tickets in one revision. Per-item:","write_action":true,"price_micros":0,"input_schema":null},{"name":"cancel_ticket","description":"Cancel a ticket — record a deliberate non-implementation (scope reduction), gate-free. Cancel ≠ Delete: cancel keeps the ticket VISIBLE with its full history + links (use ticket_delete only for mistakes). Cancelling an EPIC cascades: every contained non-terminal story is cancelled in one revision and the epic rolls up to cancelled (or done, if some stories had already shipped). Cancelled tickets d","write_action":true,"price_micros":0,"input_schema":null},{"name":"change_ticket_status","description":"Change a ticket's status. Forward transitions crossing → ready check DoR; crossing → done check DoD. A transition INTO the done category ALSO fires the complete_ticket governance gates (SM-299: MISSING_TEST_DEFINITION for user-story/bug, STALE_LINKED_DEF, OPEN_MODIFIES) — there is no bypass around complete_ticket. Failures come back as isError with kind/missing. NOT applicable to epics — an epic's","write_action":false,"price_micros":0,"input_schema":null},{"name":"complete_ticket","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"derive_test_definition","description":"SM-301: derive a test-definition from a ticket's ACCEPTANCE CRITERIA — one step per AC (step = the criterion, expectedResult = its observable outcome), linked back via a `tests`-link. The acceptance criteria ARE the test plan: set them first, then call this immediately as the north-star plan (refine steps during implementation). Draft by default; pass publish:true to also publish (the target must ","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_project","description":"Export a whole project as the re-importable storymap-project JSON envelope","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_product_doc","description":"Generate a current-state product description (Markdown) by FOLDING the tickets","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_config","description":"Read a project config section. section ∈ definitions | workflow |","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_drift_report","description":"Round-trip / drift report (SM-182, direction-A Phase 4) — keeps the PRD a living","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_revision","description":"Fetch a single revision (full snapshot at that point in time). Returns 404-error if the revision does not exist.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_trace_coverage","description":"Direction-A coverage report (mirror of generate_product_doc). For each requirement,","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_tickets","description":"Bulk-import tickets from CSV (header row = field keys: key, type, title, description,","write_action":false,"price_micros":0,"input_schema":null},{"name":"ingest_slice_candidates","description":"Read a project attachment (a source PRD), convert it to Markdown server-side","write_action":false,"price_micros":0,"input_schema":null},{"name":"link_create","description":"Add a typed link from one ticket to another. linkTypeId references a project.linkTypes entry (predecessor-of / blocks / follows-on / contains / relates-to by default — get_link_types for the catalogue). Throws LINK_SELF for self-links, LINK_TARGET_MISSING for unknown target, LINK_DUPLICATE for duplicate (linkTypeId, targetTicketId), LINK_CYCLE if the new edge would close a cycle in a cycle-checked","write_action":true,"price_micros":0,"input_schema":null},{"name":"link_delete","description":"Remove a single link from a ticket by linkId. No-op if the linkId is not on the source ticket.","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_links_for_ticket","description":"List links involving a ticket. direction: 'forward' = links this ticket owns; 'backward' = links from OTHER tickets pointing here (resolved via project.linkTypes.inverseLabel); 'both' (default) = combined. Each entry has linkTypeId, label (project-resolved or the link's stored label), direction, target { id, ticketKey, title, type }. Use this to power a Ticket-Detail-Modal's Links-section.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_process_steps","description":"List all non-deleted process steps of a project, sorted by sortOrder.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_projects","description":"List all (non-deleted) project IDs","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_releases","description":"List all non-deleted releases of a project. Returns an array of release objects sorted by sortOrder.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_revisions","description":"List the revision history of a project (reverse-chrono). Returns up to `limit` entries (default 100); pass `before` (a revision id) to page older entries.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_tickets","description":"List non-deleted tickets of a project. Filters (all optional, AND-combined):","write_action":false,"price_micros":0,"input_schema":null},{"name":"mark_ready","description":"Shortcut for change_ticket_status → 'ready'. Fails with kind=DoR + missing[] if the DoR is not satisfied. NOT applicable to epics (kind=EPIC_STATUS_DERIVED) — epic status is derived from its stories. Compact response by default; pass verbose:true for the full ticket.","write_action":false,"price_micros":0,"input_schema":null},{"name":"next_actionable","description":"What can I start NOW? Returns the work-item tickets that are ready to pull:","write_action":false,"price_micros":0,"input_schema":null},{"name":"process_step_create","description":"Create a new process step (a column on the story-map backbone).","write_action":true,"price_micros":0,"input_schema":null},{"name":"process_step_delete","description":"Soft-delete a process step.","write_action":true,"price_micros":0,"input_schema":null},{"name":"process_step_update","description":"Patch fields on a process step (name, description, epicId, sortOrder).","write_action":true,"price_micros":0,"input_schema":null},{"name":"project_create","description":"Create a new project. Optional fields: definitions (DoR/DoD), workflow (statuses + transitions + per-type overrides), entityTypeConfig (per-type modal config), ticketTypes (allowed type names).","write_action":true,"price_micros":0,"input_schema":null},{"name":"project_delete","description":"Soft-delete a project (filtered out of list_projects)","write_action":true,"price_micros":0,"input_schema":null},{"name":"project_get","description":"Load the full snapshot of a project","write_action":false,"price_micros":0,"input_schema":null},{"name":"project_update","description":"Patch project header fields (name, description, ticketPrefix, definitions)","write_action":true,"price_micros":0,"input_schema":null},{"name":"publish_test_definition","description":"Promote a test-definition from lifecycle='draft' to 'published'. Runs the SM-93 governance publish-gates: ≥1 step, ≥1 outgoing 'tests'-link, every step has expectedResult, target ticket has reached 'ready'+. On gate failure returns isError with kind/errors/message{title,reason,suggestion,skillRef}.","write_action":true,"price_micros":0,"input_schema":null},{"name":"query_tickets","description":"Targeted ticket search (SM-187) with a JQL-angelehnter query language — the precise","write_action":false,"price_micros":0,"input_schema":null},{"name":"release_create","description":"Create a new release on the project. Returns the created release plus revision/savedAt.","write_action":true,"price_micros":0,"input_schema":null},{"name":"release_delete","description":"Soft-delete a release (recoverable via history). Refuses the LAST remaining release (422 kind=LAST_RELEASE) — a project always keeps ≥1 release.","write_action":true,"price_micros":0,"input_schema":null},{"name":"release_update","description":"Patch fields on a release (name, description, status, startDate, endDate, sortOrder).","write_action":true,"price_micros":0,"input_schema":null},{"name":"reopen_test_definition","description":"Revert a test-definition from lifecycle='published' to 'draft' so its spec can be edited again. Blocks with kind=ACTIVE_EXECUTION if any associated test-execution is currently in 'in-progress' — finish or cancel the run first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reorder","description":"Reorder entities by full id list. entity ∈ 'tickets' | 'releases' |","write_action":false,"price_micros":0,"input_schema":null},{"name":"request_switch_project","description":"Ask every connected browser to switch to the named project. The browser shows a confirm dialog; the tool waits up to wait_seconds (default 30) for the user's verdict and returns { requested, requestId, response:{accepted}, timedOut? }. Pass wait_seconds:0 for fire-and-forget. Use this AFTER preparing a project so the user lands on the right place and can verify your work.","write_action":false,"price_micros":0,"input_schema":null},{"name":"requirement_create","description":"Create a `requirement` SpecObject — one atomic, sliced PRD statement. Provide its","write_action":true,"price_micros":0,"input_schema":null},{"name":"requirement_list","description":"List requirement SpecObjects of a project, in document order (by sectionPath).","write_action":false,"price_micros":0,"input_schema":null},{"name":"resolve_definitions_for_ticket","description":"Return the EFFECTIVE DoR/DoD checklists for a ticket — i.e. the per-ticket frozen items with their current checked-state. Use this to see what's left to do for mark_ready / complete_ticket.","write_action":false,"price_micros":0,"input_schema":null},{"name":"restore_revision","description":"Restore a project to a previous revision. The restore creates a NEW revision with op='project_restore', so the restore itself is undoable.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_checklist_item","description":"Check or uncheck a single DoR/DoD item on a ticket. gate ∈ 'dor'|'dod'","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_config","description":"Replace a project config section (full replace, no merge). section ∈","write_action":false,"price_micros":0,"input_schema":null},{"name":"spec_module_create","description":"Create a spec module — the container for the requirements sliced from ONE source","write_action":true,"price_micros":0,"input_schema":null},{"name":"split_process_step","description":"Split a process step (SM-247): create a NEW step directly after it and move the chosen epics (with their contained stories) into the new step. Loose stories stay with the original. epicIds must reference epics currently in this step (else 422 with `missing`). Empty/omitted epicIds inserts an empty step after the original. One revision.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_def_prereq_add","description":"Append a prerequisite to a test-definition. patch = { label: string, required?: boolean }. Default required=true.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_def_prereq_check","description":"Mark a prerequisite as checked.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_def_prereq_remove","description":"Remove a prerequisite from a test-definition.","write_action":true,"price_micros":0,"input_schema":null},{"name":"test_def_prereq_uncheck","description":"Mark a prerequisite as unchecked.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_def_prereq_update","description":"Update a prerequisite. patch = { label?, required? }.","write_action":true,"price_micros":0,"input_schema":null},{"name":"test_def_step_add","description":"Append a step to a test-definition. patch = { step: string, data?: string, expectedResult: string, position?: number }. Returns the created step.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_def_step_remove","description":"Remove a step from a test-definition.","write_action":true,"price_micros":0,"input_schema":null},{"name":"test_def_step_reorder","description":"Reorder steps on a test-definition by full ID list. orderedStepIds is the new sequence; missing steps are appended at the end (defensive). Pass tolerated JSON-string for Claude Code MCP bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_def_step_update","description":"Update a step on a test-definition. patch = { step?, data?, expectedResult? } (subset).","write_action":true,"price_micros":0,"input_schema":null},{"name":"test_exec_history","description":"List test-execution tickets for a given test-definition, sorted by runAt descending. Use the resulting executions[].id to recordTestExecStep / setTestExecOutcome.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_exec_record","description":"Record per-step result on a test-execution. stepId may be either the definition-step id (clone source) or the execution-step's own id. patch = { actualResult?, status?, note? } where status ∈ pending|passed|failed|blocked|skipped.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_exec_set_outcome","description":"Set the manual outcome override on a test-execution. outcome ∈ pending|passed|failed|blocked|skipped or 'auto' to reset (let deriveOutcome take over). The 'auto' form clears outcomeOverride.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_exec_start","description":"Start a test-execution run. Creates a new test-execution ticket, clones the definition's steps (snapshot semantics — later definition edits don't bleed back), opens an 'executes' link to the definition, sets runAt=now and runBy=actor (or opts.runBy). opts = { env?, runBy? }. Returns the new execution ticket. SM-94: definition must be in lifecycle='published' — fails with kind=DEFINITION_DRAFT othe","write_action":false,"price_micros":0,"input_schema":null},{"name":"ticket_create","description":"Create a ticket. Pass acceptanceCriteria as [{text}] to set them at creation (no more create-then-update). The DoR/DoD checklists are resolved from the project's definitions for this ticket type and FROZEN onto the ticket. Compact response by default ({revision, savedAt, ticket:{id, ticketKey, type, status, title, position}}); pass verbose:true for the full ticket.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ticket_delete","description":"Soft-delete a ticket","write_action":true,"price_micros":0,"input_schema":null},{"name":"ticket_get","description":"Get a ticket by id (includes frozen DoR/DoD checklists). Default","write_action":false,"price_micros":0,"input_schema":null},{"name":"ticket_update","description":"Patch a ticket (title, description, type, position, labels, acceptanceCriteria).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_test_definition_metadata","description":"Edit cosmetic metadata on a test-definition (title, description, labels). Deliberately small surface — does NOT touch steps, prerequisites, or lifecycle. Safe to call on both draft and published definitions: the spec stays frozen, only the human-facing labelling changes.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":88,"grade":"A","scanned_at":"2026-09-25T17:24:10.760Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T17:24:10.760Z","components":{"code":{"score":25,"max":25,"notes":["49 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 67 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"storymapper","version":"1.0.1","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":5,"publishedAt":"2026-07-20T05:34:51.672Z","repositoryUrl":"git+https://github.com/TomAtAP/storymapper.git","weeklyDownloads":37}],"repo":{"found":true,"owner":"TomAtAP","repo":"storymapper","archived":false,"pushedAt":"2026-07-20T05:33:59Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/101551790?v=4","ownerCreatedAt":"2022-03-14T08:08:56Z","license":"Apache-2.0"},"icon":{"url":null,"source":"none"},"presence":{"stars":1,"forks":0,"downloadsWeek":37,"license":"Apache-2.0","lastPushAt":"2026-07-20T05:33:59.000Z","score":24}}}},"grade_history":[],"reviews":[]}