MCP Tools
Complete reference for all 17 SpecForge MCP tools — parameters, usage, and examples.
SpecForge exposes 17 MCP tools organized in five categories. These tools are available to any MCP-compatible coding agent (Claude Code, Cursor, VS Code with Copilot, Gemini CLI, etc.) once the SpecForge MCP server is configured.
Queries
Six tools for reading project data, searching tickets, and generating reports. These are read-only — they never modify your specification.
get
Retrieves a single entity by type and ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | "project" | "specification" | "epic" | "ticket" | "blueprint" | Yes | Entity type to retrieve |
id | string | Yes | Entity ID |
specificationId | string | No | Specification context (required for epics and tickets) |
{
"type": "ticket",
"id": "tkt_abc123",
"specificationId": "spec_xyz789"
}Returns
Returns the full entity object. The shape depends on the type parameter:
Ticket (type: "ticket"):
| Field | Type | Description |
|---|---|---|
id | string | Ticket ID |
epicId | string | Parent epic ID |
ticketNumber | number | Sequential ticket number |
title | string | Ticket title |
description | string | Detailed description |
status | "pending" | "ready" | "active" | "done" | "blocked" | Current status |
progress | number | Completion progress (0–100) |
complexity | "small" | "medium" | "large" | "xlarge" | Complexity estimate |
tags | string[] | Tags |
estimatedHours | number | Estimated effort in hours |
acceptanceCriteria | object[] | Acceptance criteria with id, description, validated |
implementation | object | Implementation steps, code examples, prerequisites |
technicalDetails | object | File operations, API endpoints, database operations |
notes | string | object | Implementation notes or structured notes |
blockReason | string | Why the ticket is blocked (if applicable) |
createdAt | string | ISO 8601 timestamp |
updatedAt | string | ISO 8601 timestamp |
Specification (type: "specification"):
| Field | Type | Description |
|---|---|---|
id | string | Specification ID |
projectId | string | Parent project ID |
title | string | Specification title |
description | string | What to build |
status | "draft" | "planning" | "ready" | "in_progress" | "done" | Current status |
progress | number | Overall progress (0–100) |
goals | string[] | Specification goals |
requirements | string[] | Requirements |
techStack | string[] | Technologies used |
tags | string[] | Tags |
estimatedHours | number | Total estimated effort |
Epic (type: "epic"):
| Field | Type | Description |
|---|---|---|
id | string | Epic ID |
specificationId | string | Parent specification ID |
epicNumber | number | Sequential epic number |
title | string | Epic title |
description | string | Epic description |
objective | string | What this epic achieves |
status | "todo" | "in_progress" | "completed" | Current status |
progress | number | Completion progress (0–100) |
order | number | Display order |
ticketCount | number | Total tickets |
completedTicketCount | number | Completed tickets |
Project (type: "project"):
| Field | Type | Description |
|---|---|---|
id | string | Project ID |
name | string | Project name |
description | string | Project description |
specCount | number | Total specifications |
completedSpecCount | number | Completed specifications |
ticketCount | number | Total tickets across all specs |
list
Lists entities of a given type with optional filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | "projects" | "specifications" | "epics" | "tickets" | "blueprints" | Yes | Entity type to list |
projectId | string | No | Filter by project (required for specifications) |
specificationId | string | No | Filter by specification (required for epics and tickets) |
epicId | string | No | Filter tickets by epic |
{
"type": "tickets",
"specificationId": "spec_xyz789",
"epicId": "epic_456"
}Returns
Returns a paginated list:
| Field | Type | Description |
|---|---|---|
items | object[] | Array of entities matching the query |
total | number | Total number of matching entities |
nextToken | string | Pagination token for the next page (if more results exist) |
Each item in items is the full entity object (see get returns above for field details).
{
"items": [
{ "id": "tkt_abc123", "title": "Set up User model", "status": "ready", ... },
{ "id": "tkt_def456", "title": "Implement bcrypt hashing", "status": "pending", ... }
],
"total": 4
}search
Unified search across tickets with full-text queries and structured filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | No | Full-text search across ticket titles and descriptions |
files | string[] | No | Filter by expected file paths |
tags | string[] | No | Filter by tags |
status | string[] | No | Filter by status: "pending", "ready", "active", "done" |
complexity | string[] | No | Filter by complexity: "small", "medium", "large", "xlarge" |
limit | number | No | Maximum results to return |
offset | number | No | Pagination offset |
fields | string[] | No | Specific fields to include in results |
{
"query": "authentication middleware",
"status": ["ready", "pending"],
"complexity": ["large", "xlarge"],
"limit": 10
}Returns
Returns a paginated list of tickets:
| Field | Type | Description |
|---|---|---|
items | Ticket[] | Array of matching tickets |
total | number | Total number of matches |
nextToken | string | Pagination token (if more results exist) |
When using the fields parameter, only the requested fields are included in each ticket object.
✅ Combine
fileswithtagsto find all tickets touching a specific part of your codebase. For example,files: ["src/auth/**"]withtags: ["security"].
get_next_actionable_tickets
Returns tickets in ready status with all dependencies satisfied, ordered by complexity.
| Parameter | Type | Required | Description |
|---|---|---|---|
specificationId | string | Yes | Specification to query |
projectId | string | No | Project context |
limit | number | No | Maximum tickets to return |
{
"specificationId": "spec_xyz789",
"limit": 5
}Returns
Returns an array of ticket objects in ready status with all dependencies satisfied, ordered by complexity (smallest first).
[
{
"id": "tkt_abc123",
"title": "Implement JWT token generation",
"status": "ready",
"complexity": "medium",
"epicId": "epic_456",
"ticketNumber": 3,
...
}
]This is the primary entry point for agents deciding what to work on next. In Agent Teams, the orchestrator calls this to assign tickets to workers.
get_blocked_tickets
Returns tickets in pending status along with the reasons they’re blocked.
| Parameter | Type | Required | Description |
|---|---|---|---|
specificationId | string | Yes | Specification to query |
Returns
Returns an array of blocked ticket entries:
| Field | Type | Description |
|---|---|---|
ticket | Ticket | The blocked ticket object |
blockedBy | object[] | Array of { id, title, status } for each unresolved dependency |
daysBlocked | number | Number of days the ticket has been blocked |
[
{
"ticket": { "id": "tkt_ghi789", "title": "Build login endpoint", "status": "pending", ... },
"blockedBy": [
{ "id": "tkt_def456", "title": "Implement bcrypt hashing", "status": "active" }
],
"daysBlocked": 2
}
]get_report
Generates analytical reports at different scopes and time ranges.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | "implementation" | "time" | "blockers" | "work" | "sessions" | Yes | Report type |
scope | "project" | "specification" | "epic" | Yes | Report scope. sessions requires scope="project". |
scopeId | string | Yes | ID of the scope entity |
startDate | string | No | Start date for time-ranged reports (ISO 8601) |
endDate | string | No | End date for time-ranged reports (ISO 8601) |
| Report Type | Description |
|---|---|
implementation | Progress summary with completion percentages and remaining work |
time | Time tracking analysis with estimated vs. actual hours |
blockers | Detailed blocker analysis with dependency chains |
work | Work session history and activity log |
sessions | Active planning, work, and review sessions for a project (project scope only) |
Returns
The response shape varies by report type:
implementation — Progress summary:
| Field | Type | Description |
|---|---|---|
project | Project | Project or scope entity |
specifications | object[] | Per-spec breakdown with completedEpics, totalEpics, completedTickets, totalTickets |
recentActivity | object[] | Recent actions with ticketId, ticketTitle, action, timestamp |
time — Time tracking:
| Field | Type | Description |
|---|---|---|
totalHours | number | Actual hours spent |
estimatedHours | number | Total estimated hours |
variance | number | Difference between estimated and actual |
ticketBreakdown | object[] | Per-ticket { ticketId, ticketTitle, estimated, actual } |
blockers — Blocker analysis:
| Field | Type | Description |
|---|---|---|
blockedTickets | object[] | Blocked tickets with ticket, blockedBy[], daysBlocked |
blockingChains | object[] | Root blockers with rootBlocker, affectedTickets count |
sessions — Active sessions (project scope only):
| Field | Type | Description |
|---|---|---|
planning | object[] | Active planning sessions with sessionId, specificationId, specificationTitle, startedAt |
work | object[] | Active work sessions with sessionId, ticketId, ticketTitle, startedAt |
review | object[] | Active review sessions with sessionId, specificationId, specificationTitle, startedAt |
summary | object | { totalActive, planningCount, workCount, reviewCount } |
Errors — calling with scope !== "project" or a missing scopeId returns a validation error telling the agent to call get_report({ type: "sessions", scope: "project", scopeId: <projectId> }).
Lifecycle
Nine tools that drive specifications through planning, implementation, and review. These are the core workflow tools.
start_planning_session
Opens a planning session for a specification, enabling structural changes.
| Parameter | Type | Required | Description |
|---|---|---|---|
specificationId | string | Yes | Specification to plan |
The specification must be in draft or planning state.
Returns
| Field | Type | Description |
|---|---|---|
specificationId | string | Specification ID |
sessionId | string | Planning session ID |
previousStatus | string | Status before opening the session |
newStatus | string | Status after opening (e.g., "planning") |
message | string | Confirmation message |
action_planning_session
Performs operations within an active planning session. This is the primary tool for building specifications — it handles 25 distinct operations. Each operation is passed as an operation object whose type is the operation name; the remaining fields are that operation’s payload.
| Parameter | Type | Required | Description |
|---|---|---|---|
specificationId | string | Yes | Specification being planned |
operation | object | Yes | Operation to perform — an object with a type field (see tables below) plus per-operation payload fields |
To read a single ticket, use the get tool (type: "ticket") rather than a planning operation.
Specification & Structure Operations
| Operation | Description |
|---|---|
update_spec | Update specification fields (background, goals, nonGoals, constraints, successCriteria) |
create_epic | Create a new epic shell (title, description, objective) |
update_epic | Expand or modify an existing epic |
delete_epic | Remove an epic and its tickets |
create_ticket | Create a ticket within an epic |
ticket_general_actions | Update a ticket’s general fields (title, description, complexity, …) |
ticket_step_actions | Add, update, or remove a ticket’s implementation steps |
ticket_criteria_actions | Add, update, or remove a ticket’s acceptance criteria |
ticket_test_actions | Add, update, or remove a ticket’s tests |
delete_ticket | Remove a single ticket |
Blueprint Operations
| Operation | Description |
|---|---|
create_blueprint | Create a new blueprint document |
update_blueprint | Modify an existing blueprint |
delete_blueprint | Remove a blueprint |
link_blueprint_to_tickets | Link a blueprint to one or more tickets |
unlink_blueprint_to_tickets | Unlink a blueprint from tickets |
Step-Link Operations
| Operation | Description |
|---|---|
link_step_file | Attach a file path to an implementation step |
unlink_step_file | Detach a file path from an implementation step |
link_step_snippet | Attach a blueprint snippet to an implementation step |
unlink_step_snippet | Detach a blueprint snippet from an implementation step |
Dependency Operations
| Operation | Description |
|---|---|
create_dependencies | Define dependency links between tickets |
delete_dependencies | Remove dependency links between tickets |
Justification & Election Operations
| Operation | Description |
|---|---|
apply_creator_election | Apply the creator-election decision for contested entities |
justify | Declare a field not-applicable with a justification |
unjustify | Remove a not-applicable justification |
Status Operation
| Operation | Description |
|---|---|
get_planning_status | Get the current planning session status and phase progress |
Example — Creating a ticket:
{
"specificationId": "spec_xyz789",
"operation": {
"type": "create_ticket",
"epicId": "epic_456",
"title": "Implement JWT token generation",
"description": "Create a service that generates signed JWT access tokens with configurable expiration.",
"complexity": "medium"
}
}Returns
The response depends on the operation:
Structure operations (create_epic, create_ticket, update_epic, ticket_general_actions, …): Returns the created or updated entity object.
Delete operations (delete_epic, delete_ticket, delete_blueprint): Returns { id, message } confirmation.
Linking operations (create_dependencies, link_blueprint_to_tickets, link_step_file, …): Returns { id, message } or the linked entity.
Status operation (get_planning_status): Returns the current planning session status and phase progress.
ℹ️ The specification stays in the single
planningstate for the whole session. The 7-phase planning machine (planning_spec→epic_decomposition→epic_expansion→ticket_decomposition→ticket_expansion→cross_validation→planned) advances on the planning session, not the specification. You don’t manage these phases manually.
complete_planning_session
Ends the planning session and triggers the Planning Review gate.
| Parameter | Type | Required | Description |
|---|---|---|---|
specificationId | string | Yes | Specification to complete planning |
Returns
| Field | Type | Description |
|---|---|---|
specificationId | string | Specification ID |
message | string | Confirmation message |
gateResult | object | Planning Review result (if gate is enabled) |
gateResult.passed | boolean | Whether the review passed |
gateResult.score | number | Readiness score (0–100) |
gateResult.findings | object[] | Issues found: { severity, category, field, message, suggestion } |
If the Planning Review gate is enabled and the specification passes, it advances to ready.
start_work_session
Begins implementation work on a specific ticket.
| Parameter | Type | Required | Description |
|---|---|---|---|
ticketId | string | Yes | Ticket to work on (must be in ready status) |
Transitions the ticket from ready to active.
Returns
Returns the full implementation context:
| Field | Type | Description |
|---|---|---|
ticket | Ticket | The ticket being implemented (full object) |
epic | Epic | The parent epic |
specification | Specification | The parent specification |
dependencies.blockedBy | object[] | Tickets that must complete before this one: { id, title, status } |
dependencies.blocks | object[] | Tickets waiting on this one: { id, title, status } |
relatedTickets | object[] | Other tickets in the same epic: { id, title, status, sameEpic } |
patterns | object | Code patterns and conventions from the project |
activeSession | object | null | Active implementation session summary |
previousAttempts | object[] | Previous implementation attempts with test results |
relatedDiscoveries | object[] | Discoveries from related tickets |
{
"ticket": {
"id": "tkt_abc123",
"title": "Implement JWT token generation",
"status": "active",
"acceptanceCriteria": [
{ "id": "ac-0", "description": "Tokens are signed with RS256", "validated": false }
],
"implementation": {
"steps": [
{ "order": 1, "title": "Create JwtService", "action": "create", "detail": "..." }
]
},
...
},
"epic": { "id": "epic_456", "title": "Token Management", ... },
"specification": { "id": "spec_xyz789", "title": "Auth System", ... },
"dependencies": { "blockedBy": [], "blocks": [...] },
"relatedTickets": [...],
"previousAttempts": [],
"relatedDiscoveries": []
}action_work_session
Records progress, results, and discoveries during implementation.
| Parameter | Type | Required | Description |
|---|---|---|---|
ticketId | string | Yes | Active ticket |
steps | object[] | No | Step completion updates |
acceptanceCriteria | object[] | No | Acceptance criteria results |
testResults | object[] | No | Test execution results |
notes | string | No | Implementation notes |
files | object[] | No | File changes made |
discovery | object | No | New information discovered during implementation |
blockReason | string | No | Report an external blocker |
{
"ticketId": "tkt_abc123",
"steps": [
{ "index": 0, "completed": true },
{ "index": 1, "completed": true }
],
"files": [
{ "path": "src/auth/jwt.service.ts", "action": "created" },
{ "path": "src/auth/jwt.service.test.ts", "action": "created" }
],
"notes": "Used jose library instead of jsonwebtoken for Edge Runtime compatibility."
}Returns
Returns confirmation with the updated work session state:
| Field | Type | Description |
|---|---|---|
ticketId | string | Ticket ID |
workSessionId | string | Work session ID |
message | string | Confirmation message |
complete_work_session
Finalizes work on a ticket with a summary and validation results.
| Parameter | Type | Required | Description |
|---|---|---|---|
ticketId | string | Yes | Active ticket |
summary | string | Yes | Summary of work performed |
files | object[] | No | Final list of file changes |
actualHours | number | No | Hours spent on implementation |
validation | object | No | Validation results: tests, lint, typeCheck, build |
Returns
| Field | Type | Description |
|---|---|---|
ticketId | string | Ticket ID |
status | "done" | New ticket status |
workSessionId | string | Completed work session ID |
message | string | Confirmation message |
dependentsUnblocked | string[] | IDs of tickets that became ready as a result |
Transitions the ticket from active to done. Dependent tickets are recalculated and may become ready.
Mutations
Two tools for modifying and linking project data.
reopen_specification
Reopens a completed or reviewed specification for additional work.
| Parameter | Type | Required | Description |
|---|---|---|---|
specificationId | string | Yes | Specification to reopen |
Returns
| Field | Type | Description |
|---|---|---|
specificationId | string | Specification ID |
previousStatus | string | Status before reopening |
newStatus | string | New status (e.g., "in_progress") |
message | string | Confirmation message |
link_pull_request
Associates a pull request with a completed ticket.
| Parameter | Type | Required | Description |
|---|---|---|---|
ticketId | string | Yes | Ticket to link |
prNumber | number | Yes | Pull request number |
prUrl | string | Yes | Full pull request URL |
title | string | Yes | PR title |
author | string | Yes | PR author |
repoUrl | string | Yes | Repository URL |
Returns
Returns the created link object:
| Field | Type | Description |
|---|---|---|
id | string | Link ID |
ticketId | string | Ticket ID |
linkType | "pull_request" | Link type |
url | string | PR URL |
prNumber | number | PR number |
title | string | PR title |
status | string | PR status |
createdAt | string | ISO 8601 timestamp |
Orchestration
Two tools for understanding and navigating the dependency graph.
get_critical_path
Calculates the longest dependency chain in a specification — the sequence of tickets that determines the minimum time to completion.
| Parameter | Type | Required | Description |
|---|---|---|---|
specificationId | string | Yes | Specification to analyze |
Returns
| Field | Type | Description |
|---|---|---|
criticalPath | object[] | Ordered list of tickets on the critical path |
criticalPath[].id | string | Ticket ID |
criticalPath[].title | string | Ticket title |
criticalPath[].status | string | Current status |
criticalPath[].estimatedHours | number | Estimated effort |
criticalPath[].complexity | string | Complexity level |
totalEstimatedHours | number | Sum of estimated effort on the critical path |
pathLength | number | Number of tickets in the critical path |
get_dependency_tree
Renders the complete upstream and downstream dependency tree for a specification.
| Parameter | Type | Required | Description |
|---|---|---|---|
specificationId | string | Yes | Specification to analyze |
Returns
Returns a tree structure showing all tickets, their dependencies, and statuses:
| Field | Type | Description |
|---|---|---|
tree | object[] | Root nodes (tickets with no dependencies) |
tree[].id | string | Ticket ID |
tree[].title | string | Ticket title |
tree[].status | string | Current status |
tree[].epicId | string | Parent epic ID |
tree[].children | object[] | Downstream dependent tickets (recursive structure) |
totalTickets | number | Total ticket count |
completedTickets | number | Completed ticket count |
Useful for visualizing the overall shape of work and identifying bottlenecks.
Utility
feedback
Submit feedback, report issues, or suggest improvements.
| Parameter | Type | Required | Description |
|---|---|---|---|
operation | "submit" | "list" | "get" | Yes | Feedback operation |
category | string | No | Feedback category (for submit) |
summary | string | No | Feedback summary (for submit) |
severity | string | No | Issue severity (for submit) |
tool | string | No | Which tool the feedback relates to (for submit) |
Returns
Depends on the operation:
submit: Returns{ id, message }— the feedback ID and confirmation.list: Returns an array of feedback entries withid,category,summary,status,createdAt.get: Returns the full feedback entry by ID.
See Also
- CLI Commands — CLI equivalents for common operations
- Specification States — State machine triggered by lifecycle tools
- Ticket States — Ticket states driven by work session tools