Skip to main content

Conversational Management (MCP)

PUNT includes an MCP (Model Context Protocol) server that enables conversational ticket management through AI assistants. Instead of clicking through the UI, you can create and manage tickets using natural language.

What is MCP?

Model Context Protocol is an open standard that allows AI assistants to interact with external tools and data sources. PUNT's MCP server exposes full CRUD operations for tickets, projects, sprints, members, labels, and columns.

Example Interactions

You: "What's the status of PUNT-42?"
AI: PUNT-42: Fix login timeout issue
Type: bug | Priority: high | Status: In Progress
Sprint: Sprint 3 | Assignee: Alice
You: "Create a task to update the documentation"
AI: Created PUNT-43: Update the documentation
Type: task | Priority: medium | Status: To Do
You: "Move PUNT-43 to In Progress and assign it to me"
AI: Moved PUNT-43: column → In Progress
You: "Create a new project called Mobile App with key MOBILE"
AI: Created project MOBILE: Mobile App
You: "Start Sprint 3 with a 2-week duration"
AI: Started sprint "Sprint 3" with 12 tickets

Setup

Prerequisites

  • PUNT installed and running (pnpm dev on port 3000)
  • Node.js 20.9+
  • pnpm 9+
  • An MCP-compatible client (Claude Desktop, Claude Code, etc.)

These are not required for basic MCP usage, but enable the full development workflow with Claude Code:

  • GitHub CLI (gh) — Required for creating PRs, merging, and managing issues from the terminal. Claude Code uses gh for all GitHub operations.
  • Git — For branch management and committing changes via Claude Code.

Install Dependencies

cd /path/to/punt/mcp
pnpm install

Generate Your API Key

Each user needs their own API key to authenticate MCP requests. The key ties MCP actions to your user account.

  1. Log in to PUNT in your web browser
  2. Generate a key using the API:
    curl -X POST http://localhost:3000/api/me/mcp-key \
    -H "Cookie: authjs.session-token=YOUR_SESSION_COOKIE"
  3. Save the returned apiKey — it will only be shown once

To revoke your key: DELETE /api/me/mcp-key To check if you have a key: GET /api/me/mcp-key

Configure Your MCP Client

Add PUNT to your MCP client's configuration. The exact location depends on your client:

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
"mcpServers": {
"punt": {
"type": "stdio",
"command": "pnpm",
"args": ["--dir", "mcp", "exec", "tsx", "src/index.ts"],
"cwd": "/path/to/punt",
"env": {
"MCP_API_KEY": "your-api-key-here"
}
}
}
}

Claude Code (.mcp.json in the project root — gitignored, do not commit):

{
"mcpServers": {
"punt": {
"type": "stdio",
"command": "pnpm",
"args": ["--dir", "mcp", "exec", "tsx", "src/index.ts"],
"env": {
"MCP_API_KEY": "your-api-key-here"
}
}
}
}
caution

The .mcp.json file contains your API key and is gitignored. Do not commit it to version control. The MCP server also requires the PUNT dev server (pnpm dev) to be running on port 3000.

Verify Connection

After configuring, restart your MCP client. You should be able to ask about your tickets:

You: "List all projects"
AI: | Key | Name | Tickets |
| PUNT | Punt Development | 45 |

Available Operations

Tickets

OperationExample Prompt
Get ticket"Show me PUNT-42"
List tickets"List all bugs in PUNT"
Create ticket"Create a bug: Login button not working"
Update ticket"Change PUNT-42 priority to high"
Move ticket"Move PUNT-42 to Done"
Delete ticket"Delete PUNT-42"

Projects

OperationExample Prompt
List projects"What projects exist?"
Get project"Show me the PUNT project"
Create project"Create a project called Mobile App with key MOBILE"
Update project"Change PUNT description to 'Issue tracker'"
Delete project"Delete the MOBILE project"

Sprints

OperationExample Prompt
List sprints"What sprints are in PUNT?"
Get sprint"Show Sprint 3 with its tickets"
Create sprint"Create Sprint 4 with goal 'Bug fixes'"
Update sprint"Change Sprint 4 end date to next Friday"
Start sprint"Start Sprint 4"
Complete sprint"Complete Sprint 3, move incomplete to backlog"
Delete sprint"Delete Sprint 4"

Members

OperationExample Prompt
List members"Who is on the PUNT project?"
Add member"Add Alice to PUNT as Admin"
Remove member"Remove Bob from PUNT"
Change role"Make Alice an Owner of PUNT"
List users"Show all users in the system"

Labels

OperationExample Prompt
List labels"What labels exist in PUNT?"
Create label"Create a 'security' label in PUNT"
Update label"Change the bug label color to red"
Delete label"Delete the deprecated label"
Add to ticket"Add the security label to PUNT-42"
Remove from ticket"Remove the bug label from PUNT-42"

Columns

OperationExample Prompt
List columns"What columns are in PUNT?"
Create column"Add a 'Testing' column after In Review"
Rename column"Rename 'To Do' to 'Backlog'"
Reorder column"Move Testing to position 3"
Delete column"Delete the Testing column, move tickets to In Review"

Tool Reference

Ticket Tools

get_ticket

Get a ticket by its key.

ParameterTypeRequiredDescription
keystringYesTicket key (e.g., "PUNT-2")

list_tickets

List tickets with optional filters.

ParameterTypeRequiredDescription
projectKeystringNoFilter by project
columnstringNoFilter by column name
prioritystringNoFilter by priority
typestringNoFilter by type
assigneestringNoFilter by assignee name
sprintstringNoFilter by sprint name
limitnumberNoMax results (default: 20)

create_ticket

Create a new ticket.

ParameterTypeRequiredDescription
projectKeystringYesProject key
titlestringYesTicket title
typestringNoepic, story, task, bug, subtask (default: task)
prioritystringNolowest, low, medium, high, highest, critical (default: medium)
descriptionstringNoTicket description
columnstringNoInitial column (default: first column)
assigneestringNoAssignee name
storyPointsnumberNoStory points
labelsstring[]NoLabel names to assign
sprintstringNoSprint name
parentstringNoParent ticket key (for subtasks)
estimatestringNoTime estimate (e.g., "2h", "1d")
startDatestringNoStart date (ISO format)
dueDatestringNoDue date (ISO format)
environmentstringNoEnvironment (e.g., "production")
affectedVersionstringNoAffected version
fixVersionstringNoFix version

update_ticket

Update an existing ticket.

ParameterTypeRequiredDescription
keystringYesTicket key
titlestringNoNew title
descriptionstringNoNew description
prioritystringNoNew priority
typestringNoNew type
assigneestring/nullNoNew assignee (null to unassign)
storyPointsnumber/nullNoNew story points
labelsstring[]NoLabel names (replaces existing)
sprintstring/nullNoSprint name (null for backlog)
parentstring/nullNoParent ticket key
estimatestring/nullNoTime estimate
startDatestring/nullNoStart date
dueDatestring/nullNoDue date
environmentstring/nullNoEnvironment
affectedVersionstring/nullNoAffected version
fixVersionstring/nullNoFix version

move_ticket

Move a ticket to a different column or sprint.

ParameterTypeRequiredDescription
keystringYesTicket key
columnstringNoTarget column name
sprintstring/nullNoTarget sprint (null for backlog)

delete_ticket

Delete a ticket.

ParameterTypeRequiredDescription
keystringYesTicket key

Project Tools

list_projects

List all projects.

ParameterTypeRequiredDescription
limitnumberNoMax results (default: 20)

get_project

Get project details including columns and members.

ParameterTypeRequiredDescription
keystringYesProject key

create_project

Create a new project.

ParameterTypeRequiredDescription
namestringYesProject name
keystringYesProject key (2-10 uppercase letters/numbers)
descriptionstringNoProject description
colorstringNoProject color (hex, e.g., #3b82f6)

update_project

Update a project.

ParameterTypeRequiredDescription
keystringYesProject key
namestringNoNew project name
descriptionstring/nullNoNew description (null to clear)
colorstringNoNew color (hex)

delete_project

Delete a project and all its data.

ParameterTypeRequiredDescription
keystringYesProject key
confirmbooleanYesMust be true to confirm deletion

Sprint Tools

list_sprints

List sprints for a project.

ParameterTypeRequiredDescription
projectKeystringYesProject key
statusstringNoplanning, active, or completed

get_sprint

Get sprint details with tickets.

ParameterTypeRequiredDescription
projectKeystringYesProject key
sprintNamestringYesSprint name

create_sprint

Create a new sprint.

ParameterTypeRequiredDescription
projectKeystringYesProject key
namestringYesSprint name
goalstringNoSprint goal
startDatestringNoStart date (ISO format)
endDatestringNoEnd date (ISO format)
budgetnumberNoStory points capacity

update_sprint

Update a sprint.

ParameterTypeRequiredDescription
projectKeystringYesProject key
sprintNamestringYesSprint name to update
namestringNoNew sprint name
goalstring/nullNoNew goal (null to clear)
startDatestring/nullNoNew start date
endDatestring/nullNoNew end date
budgetnumber/nullNoNew capacity

start_sprint

Start a planning sprint.

ParameterTypeRequiredDescription
projectKeystringYesProject key
sprintNamestringYesSprint name to start
startDatestringNoStart date (defaults to today)
endDatestringNoEnd date

complete_sprint

Complete an active sprint.

ParameterTypeRequiredDescription
projectKeystringYesProject key
sprintNamestringYesSprint name to complete
moveIncompleteTostringNo"backlog" or "next" (default: backlog)

delete_sprint

Delete a sprint.

ParameterTypeRequiredDescription
projectKeystringYesProject key
sprintNamestringYesSprint name to delete
confirmbooleanYesMust be true to confirm deletion

Member Tools

list_members

List members of a project.

ParameterTypeRequiredDescription
projectKeystringYesProject key

add_member

Add a user to a project.

ParameterTypeRequiredDescription
projectKeystringYesProject key
userNamestringYesUser name to add
rolestringNoRole name (default: Member)

remove_member

Remove a user from a project.

ParameterTypeRequiredDescription
projectKeystringYesProject key
userNamestringYesUser name to remove

change_member_role

Change a member's role.

ParameterTypeRequiredDescription
projectKeystringYesProject key
userNamestringYesUser name
rolestringYesNew role name

list_users

List all users in the system.

ParameterTypeRequiredDescription
limitnumberNoMax results (default: 50)

Label Tools

list_labels

List all labels for a project.

ParameterTypeRequiredDescription
projectKeystringYesProject key

create_label

Create a new label.

ParameterTypeRequiredDescription
projectKeystringYesProject key
namestringYesLabel name
colorstringNoLabel color (hex)

update_label

Update a label.

ParameterTypeRequiredDescription
projectKeystringYesProject key
labelNamestringYesCurrent label name
namestringNoNew label name
colorstringNoNew color (hex)

delete_label

Delete a label.

ParameterTypeRequiredDescription
projectKeystringYesProject key
labelNamestringYesLabel name to delete

add_label_to_ticket

Add a label to a ticket.

ParameterTypeRequiredDescription
ticketKeystringYesTicket key (e.g., PUNT-42)
labelNamestringYesLabel name to add

remove_label_from_ticket

Remove a label from a ticket.

ParameterTypeRequiredDescription
ticketKeystringYesTicket key (e.g., PUNT-42)
labelNamestringYesLabel name to remove

Column Tools

list_columns

List all columns for a project.

ParameterTypeRequiredDescription
projectKeystringYesProject key

create_column

Create a new column.

ParameterTypeRequiredDescription
projectKeystringYesProject key
namestringYesColumn name
positionnumberNoPosition (1-based, defaults to end)

rename_column

Rename a column.

ParameterTypeRequiredDescription
projectKeystringYesProject key
columnNamestringYesCurrent column name
newNamestringYesNew column name

reorder_column

Move a column to a new position.

ParameterTypeRequiredDescription
projectKeystringYesProject key
columnNamestringYesColumn name to move
positionnumberYesNew position (1-based)

delete_column

Delete a column (moves tickets to another column).

ParameterTypeRequiredDescription
projectKeystringYesProject key
columnNamestringYesColumn name to delete
moveTicketsTostringYesColumn to move tickets to

Tips

  • Use natural language: You don't need to remember exact parameter names. Say "create a high priority bug" instead of specifying priority: "high".
  • Partial matching: Column, sprint, label, and assignee names use partial matching. "prog" matches "In Progress".
  • Batch operations: Describe multiple changes and the AI will make multiple tool calls.
  • Context awareness: The AI remembers context. After asking about a ticket, you can say "move it to Done" without repeating the ticket key.

Troubleshooting

"Failed to connect to punt"

  1. Ensure dependencies are installed: cd mcp && pnpm install
  2. Check the command path in your MCP config
  3. Verify PUNT is running at the configured URL (default: http://localhost:3000)
  4. If using a subpath deployment (e.g., NEXT_PUBLIC_BASE_PATH=/punt), ensure your MCP credentials include the full URL with the basePath (e.g., https://example.com/punt)

"Unauthorized" or "Invalid API key"

  1. Ensure MCP_API_KEY is set in your MCP config's env section
  2. Verify the key was generated via POST /api/me/mcp-key
  3. Check that your user account is still active

"Project not found"

Project keys are case-insensitive but must match exactly. Use list_projects to see available projects.

Real-time Updates

MCP changes appear instantly in the PUNT web UI via Server-Sent Events (SSE). If updates aren't appearing:

  1. Check the browser console for SSE connection errors
  2. Verify the PUNT dev server is running
  3. Try refreshing the page to re-establish the SSE connection