kantban-mcp 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -0
- package/dist/client.d.ts +28 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +59 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/boards.d.ts +4 -0
- package/dist/tools/boards.d.ts.map +1 -0
- package/dist/tools/boards.js +156 -0
- package/dist/tools/boards.js.map +1 -0
- package/dist/tools/columns.d.ts +4 -0
- package/dist/tools/columns.d.ts.map +1 -0
- package/dist/tools/columns.js +88 -0
- package/dist/tools/columns.js.map +1 -0
- package/dist/tools/comments.d.ts +4 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +73 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/documents.d.ts +4 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +94 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/fields.d.ts +4 -0
- package/dist/tools/fields.d.ts.map +1 -0
- package/dist/tools/fields.js +131 -0
- package/dist/tools/fields.js.map +1 -0
- package/dist/tools/projects.d.ts +4 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +20 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/search.d.ts +4 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +21 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/spaces.d.ts +4 -0
- package/dist/tools/spaces.d.ts.map +1 -0
- package/dist/tools/spaces.js +31 -0
- package/dist/tools/spaces.js.map +1 -0
- package/dist/tools/tickets.d.ts +4 -0
- package/dist/tools/tickets.d.ts.map +1 -0
- package/dist/tools/tickets.js +422 -0
- package/dist/tools/tickets.js.map +1 -0
- package/dist/tools/workflow.d.ts +4 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +218 -0
- package/dist/tools/workflow.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# kantban-mcp
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for [KantBan](https://github.com/Meltero/cantban) — manage kanban boards, tickets, documents, and workflows from Claude Code and other MCP clients.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Node.js 22+
|
|
8
|
+
- A running KantBan API instance
|
|
9
|
+
- A KantBan API token
|
|
10
|
+
|
|
11
|
+
## Setup
|
|
12
|
+
|
|
13
|
+
### 1. Generate an API Token
|
|
14
|
+
|
|
15
|
+
In your KantBan app, go to **Account Settings > API Tokens** and generate a new token. Copy the token — it starts with `cb_` and is only shown once.
|
|
16
|
+
|
|
17
|
+
### 2. Configure Your MCP Client
|
|
18
|
+
|
|
19
|
+
#### Claude Code
|
|
20
|
+
|
|
21
|
+
Add to your project's `.mcp.json` (or global `~/.claude/.mcp.json`):
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"mcpServers": {
|
|
26
|
+
"kantban": {
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": ["-y", "kantban-mcp@latest"],
|
|
29
|
+
"env": {
|
|
30
|
+
"KANTBAN_API_TOKEN": "cb_your_token_here",
|
|
31
|
+
"KANTBAN_API_URL": "https://your-kantban-api.example.com"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
#### Cursor / Windsurf / Other MCP Clients
|
|
39
|
+
|
|
40
|
+
Most MCP clients use the same JSON format. Check your client's documentation for where to place the config. The server communicates over stdio using JSON-RPC.
|
|
41
|
+
|
|
42
|
+
#### Run Directly
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
KANTBAN_API_TOKEN=cb_... KANTBAN_API_URL=https://... npx -y kantban-mcp@latest
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 3. Verify
|
|
49
|
+
|
|
50
|
+
After configuring, restart your MCP client. You should see KantBan tools available. Try asking your AI assistant to "list my KantBan projects" to verify the connection.
|
|
51
|
+
|
|
52
|
+
## Environment Variables
|
|
53
|
+
|
|
54
|
+
| Variable | Required | Description |
|
|
55
|
+
|----------|----------|-------------|
|
|
56
|
+
| `KANTBAN_API_TOKEN` | Yes | API token starting with `cb_` — generate from account settings |
|
|
57
|
+
| `KANTBAN_API_URL` | Yes | Base URL of your KantBan API (e.g. `https://your-app.up.railway.app`) |
|
|
58
|
+
|
|
59
|
+
## Available Tools (61)
|
|
60
|
+
|
|
61
|
+
### Projects
|
|
62
|
+
`list_projects` `delete_project`
|
|
63
|
+
|
|
64
|
+
### Boards
|
|
65
|
+
`list_boards` `get_board` `create_board` `update_board` `delete_board` `get_board_context`
|
|
66
|
+
|
|
67
|
+
### Columns
|
|
68
|
+
`list_columns` `create_column` `update_column` `delete_column` `reorder_columns`
|
|
69
|
+
|
|
70
|
+
### Tickets
|
|
71
|
+
`list_tickets` `get_ticket` `search_tickets` `create_ticket` `create_tickets` `update_ticket` `update_tickets` `move_ticket` `move_tickets` `export_ticket_markdown` `delete_ticket` `archive_ticket` `archive_tickets` `unarchive_ticket` `unarchive_tickets` `archive_column_tickets` `list_backlog` `move_to_board`
|
|
72
|
+
|
|
73
|
+
### Comments
|
|
74
|
+
`list_comments` `create_comment` `create_comments` `update_comment` `delete_comment`
|
|
75
|
+
|
|
76
|
+
### Document Spaces
|
|
77
|
+
`list_spaces` `delete_space`
|
|
78
|
+
|
|
79
|
+
### Documents
|
|
80
|
+
`list_documents` `get_document` `create_document` `update_document` `move_document` `delete_document`
|
|
81
|
+
|
|
82
|
+
### Search
|
|
83
|
+
`search`
|
|
84
|
+
|
|
85
|
+
### Custom Fields
|
|
86
|
+
`list_fields` `create_field` `update_field` `delete_field` `list_field_overrides` `set_field_override` `get_field_values` `set_field_value` `set_field_values`
|
|
87
|
+
|
|
88
|
+
### Workflow
|
|
89
|
+
`list_transition_rules` `set_transition_rules` `delete_transition_rule` `list_transition_requirements` `set_transition_requirements` `delete_transition_requirement` `check_transition`
|
|
90
|
+
|
|
91
|
+
## License
|
|
92
|
+
|
|
93
|
+
MIT
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ApiResponse<T> {
|
|
2
|
+
success: true;
|
|
3
|
+
data: T;
|
|
4
|
+
}
|
|
5
|
+
export interface ApiError {
|
|
6
|
+
success: false;
|
|
7
|
+
error: {
|
|
8
|
+
code: string;
|
|
9
|
+
message: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare class ApiRequestError extends Error {
|
|
13
|
+
readonly status: number;
|
|
14
|
+
readonly body: unknown;
|
|
15
|
+
constructor(message: string, status: number, body: unknown);
|
|
16
|
+
}
|
|
17
|
+
export declare class KantBanClient {
|
|
18
|
+
private baseUrl;
|
|
19
|
+
private token;
|
|
20
|
+
constructor(baseUrl: string, token: string);
|
|
21
|
+
get<T>(path: string): Promise<T>;
|
|
22
|
+
post<T>(path: string, body?: unknown): Promise<T>;
|
|
23
|
+
patch<T>(path: string, body?: unknown): Promise<T>;
|
|
24
|
+
put<T>(path: string, body?: unknown): Promise<T>;
|
|
25
|
+
delete(path: string): Promise<void>;
|
|
26
|
+
private request;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,OAAO;gBAF7B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO;CAKhC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKpC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAiB3B,OAAO;CAsBtB"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export class ApiRequestError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
body;
|
|
4
|
+
constructor(message, status, body) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.status = status;
|
|
7
|
+
this.body = body;
|
|
8
|
+
this.name = 'ApiRequestError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class KantBanClient {
|
|
12
|
+
baseUrl;
|
|
13
|
+
token;
|
|
14
|
+
constructor(baseUrl, token) {
|
|
15
|
+
this.baseUrl = baseUrl.replace(/\/+$/, '');
|
|
16
|
+
this.token = token;
|
|
17
|
+
}
|
|
18
|
+
async get(path) {
|
|
19
|
+
return this.request('GET', path);
|
|
20
|
+
}
|
|
21
|
+
async post(path, body) {
|
|
22
|
+
return this.request('POST', path, body);
|
|
23
|
+
}
|
|
24
|
+
async patch(path, body) {
|
|
25
|
+
return this.request('PATCH', path, body);
|
|
26
|
+
}
|
|
27
|
+
async put(path, body) {
|
|
28
|
+
return this.request('PUT', path, body);
|
|
29
|
+
}
|
|
30
|
+
async delete(path) {
|
|
31
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
32
|
+
method: 'DELETE',
|
|
33
|
+
headers: {
|
|
34
|
+
Authorization: `Bearer ${this.token}`,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok) {
|
|
38
|
+
const err = await res.json().catch(() => ({ error: { message: res.statusText } }));
|
|
39
|
+
throw new ApiRequestError(err.error?.message ?? `HTTP ${res.status}`, res.status, err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async request(method, path, body) {
|
|
43
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
44
|
+
method,
|
|
45
|
+
headers: {
|
|
46
|
+
Authorization: `Bearer ${this.token}`,
|
|
47
|
+
...(body !== undefined && { 'Content-Type': 'application/json' }),
|
|
48
|
+
},
|
|
49
|
+
...(body !== undefined && { body: JSON.stringify(body) }),
|
|
50
|
+
});
|
|
51
|
+
if (!res.ok) {
|
|
52
|
+
const err = await res.json().catch(() => ({ error: { message: res.statusText } }));
|
|
53
|
+
throw new ApiRequestError(err.error?.message ?? `HTTP ${res.status}`, res.status, err);
|
|
54
|
+
}
|
|
55
|
+
const json = (await res.json());
|
|
56
|
+
return json.data;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { KantBanClient } from './client.js';
|
|
5
|
+
import { registerProjectTools } from './tools/projects.js';
|
|
6
|
+
import { registerBoardTools } from './tools/boards.js';
|
|
7
|
+
import { registerColumnTools } from './tools/columns.js';
|
|
8
|
+
import { registerTicketTools } from './tools/tickets.js';
|
|
9
|
+
import { registerCommentTools } from './tools/comments.js';
|
|
10
|
+
import { registerSpaceTools } from './tools/spaces.js';
|
|
11
|
+
import { registerDocumentTools } from './tools/documents.js';
|
|
12
|
+
import { registerSearchTools } from './tools/search.js';
|
|
13
|
+
import { registerFieldTools } from './tools/fields.js';
|
|
14
|
+
import { registerWorkflowTools } from './tools/workflow.js';
|
|
15
|
+
const apiToken = process.env['KANTBAN_API_TOKEN'];
|
|
16
|
+
const apiUrl = process.env['KANTBAN_API_URL'];
|
|
17
|
+
if (!apiToken) {
|
|
18
|
+
console.error('Error: KANTBAN_API_TOKEN environment variable is required');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
if (!apiUrl) {
|
|
22
|
+
console.error('Error: KANTBAN_API_URL environment variable is required');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const client = new KantBanClient(apiUrl, apiToken);
|
|
26
|
+
const server = new McpServer({
|
|
27
|
+
name: 'kantban',
|
|
28
|
+
version: '0.1.0',
|
|
29
|
+
}, {
|
|
30
|
+
instructions: `KantBan is a personal kanban board. Install: npx -y kantban-mcp@latest. Requires KANTBAN_API_TOKEN and KANTBAN_API_URL environment variables.
|
|
31
|
+
|
|
32
|
+
## Setup
|
|
33
|
+
|
|
34
|
+
Add to your MCP client config (e.g. Claude Code .mcp.json):
|
|
35
|
+
|
|
36
|
+
{
|
|
37
|
+
"mcpServers": {
|
|
38
|
+
"kantban": {
|
|
39
|
+
"command": "npx",
|
|
40
|
+
"args": ["-y", "kantban-mcp@latest"],
|
|
41
|
+
"env": {
|
|
42
|
+
"KANTBAN_API_TOKEN": "cb_your_token_here",
|
|
43
|
+
"KANTBAN_API_URL": "https://your-kantban-api.example.com"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Generate an API token from your KantBan account settings. The token starts with cb_.
|
|
50
|
+
|
|
51
|
+
## Data Model
|
|
52
|
+
|
|
53
|
+
Hierarchy: Projects > Boards > Columns > Tickets. A ticket with column_id=null is in the Backlog (a virtual holding area outside any column).
|
|
54
|
+
|
|
55
|
+
Projects contain boards and a shared backlog. Each project has a ticket_prefix for display IDs (e.g. PROJ-123).
|
|
56
|
+
|
|
57
|
+
Boards contain columns and tickets. Use get_board_context for complete board state in one call — it returns board details, columns, ticket summaries, transition rules, and field requirements.
|
|
58
|
+
|
|
59
|
+
Columns have types (start, in_progress, done, default), optional WIP limits, auto-archive settings, and default assignees.
|
|
60
|
+
|
|
61
|
+
Tickets support full Markdown in descriptions. Each has a ticket_number and can have custom field values, comments, and an assignee.
|
|
62
|
+
|
|
63
|
+
Documents are organized in Spaces (like folders). Documents can be nested with parent_id.
|
|
64
|
+
|
|
65
|
+
## Workflow Rules
|
|
66
|
+
|
|
67
|
+
Boards may have workflow rules that restrict column-to-column moves (transition rules) and require custom fields before entering a column (transition field requirements). No rules means open workflow — all moves allowed.
|
|
68
|
+
|
|
69
|
+
Always call check_transition before move_ticket if the board has workflow rules. It returns allowed=true/false with violation details and recovery_steps. If blocked, the response tells you exactly which tools to call to fix the issue (tool name, params, and description).
|
|
70
|
+
|
|
71
|
+
## Custom Fields
|
|
72
|
+
|
|
73
|
+
Custom fields are defined at project level (11 types: short_text, long_text, rich_text, number, date, single_select, multi_select, checkbox, user, ticket_link, document_link). Use list_fields to discover them. Boards can override field visibility, requirements, and defaults via set_field_override.
|
|
74
|
+
|
|
75
|
+
Use get_field_values to read all values for a ticket. Use set_field_value for one field or set_field_values for batch updates on a single ticket.
|
|
76
|
+
|
|
77
|
+
## Batch Operations
|
|
78
|
+
|
|
79
|
+
Batch tools (create_tickets, update_tickets, move_tickets, archive_tickets, unarchive_tickets, create_comments, set_field_values) accept arrays and return per-item results with success/failure status and a summary.
|
|
80
|
+
|
|
81
|
+
## Best Practices
|
|
82
|
+
|
|
83
|
+
1. Start with list_projects to discover available projects.
|
|
84
|
+
2. Use get_board_context instead of multiple calls — it returns everything about a board in one request.
|
|
85
|
+
3. Check workflow rules with check_transition before moving tickets on boards with rules.
|
|
86
|
+
4. Use batch tools when operating on multiple items — they're atomic per-item and return detailed results.
|
|
87
|
+
5. Destructive tools (delete_*) default to dry_run=true — set dry_run=false to actually delete.`,
|
|
88
|
+
});
|
|
89
|
+
registerProjectTools(server, client);
|
|
90
|
+
registerBoardTools(server, client);
|
|
91
|
+
registerColumnTools(server, client);
|
|
92
|
+
registerTicketTools(server, client);
|
|
93
|
+
registerCommentTools(server, client);
|
|
94
|
+
registerSpaceTools(server, client);
|
|
95
|
+
registerDocumentTools(server, client);
|
|
96
|
+
registerSearchTools(server, client);
|
|
97
|
+
registerFieldTools(server, client);
|
|
98
|
+
registerWorkflowTools(server, client);
|
|
99
|
+
async function main() {
|
|
100
|
+
const transport = new StdioServerTransport();
|
|
101
|
+
await server.connect(transport);
|
|
102
|
+
console.error('KantBan MCP server running on stdio');
|
|
103
|
+
}
|
|
104
|
+
main().catch((error) => {
|
|
105
|
+
console.error('Fatal error:', error);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAE9C,IAAI,CAAC,QAAQ,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEnD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gGAyD8E;CAC7F,CACF,CAAC;AAEF,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACrC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACrC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACtC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boards.d.ts","sourceRoot":"","sources":["../../src/tools/boards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,QAqM1E"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerBoardTools(server, client) {
|
|
3
|
+
// list_boards
|
|
4
|
+
server.tool('list_boards', 'List all boards in a project', { projectId: z.string().uuid().describe('Project ID') }, async ({ projectId }) => {
|
|
5
|
+
const data = await client.get(`/projects/${projectId}/boards`);
|
|
6
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
7
|
+
});
|
|
8
|
+
// get_board
|
|
9
|
+
server.tool('get_board', 'Get a single board with its details and your role', {
|
|
10
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
11
|
+
boardId: z.string().uuid().describe('Board ID'),
|
|
12
|
+
}, async ({ projectId, boardId }) => {
|
|
13
|
+
const data = await client.get(`/projects/${projectId}/boards/${boardId}`);
|
|
14
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
15
|
+
});
|
|
16
|
+
// create_board
|
|
17
|
+
server.tool('create_board', 'Create a new board in a project. Optionally create default columns (To Do, In Progress, Done).', {
|
|
18
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
19
|
+
name: z.string().min(1).max(100).describe('Board name'),
|
|
20
|
+
visibility: z.enum(['public', 'private']).optional().describe('Board visibility (default: private)'),
|
|
21
|
+
createDefaultColumns: z.boolean().optional().describe('Create default columns (To Do, In Progress, Done)'),
|
|
22
|
+
}, async ({ projectId, name, visibility, createDefaultColumns }) => {
|
|
23
|
+
const body = { name };
|
|
24
|
+
if (visibility !== undefined)
|
|
25
|
+
body.visibility = visibility;
|
|
26
|
+
if (createDefaultColumns !== undefined)
|
|
27
|
+
body.create_default_columns = createDefaultColumns;
|
|
28
|
+
const data = await client.post(`/projects/${projectId}/boards`, body);
|
|
29
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
30
|
+
});
|
|
31
|
+
// update_board
|
|
32
|
+
server.tool('update_board', 'Update a board\'s name, visibility, icon, or color', {
|
|
33
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
34
|
+
boardId: z.string().uuid().describe('Board ID'),
|
|
35
|
+
name: z.string().min(1).max(100).optional().describe('New board name'),
|
|
36
|
+
visibility: z.enum(['public', 'private']).optional().describe('New visibility'),
|
|
37
|
+
icon: z.string().nullable().optional().describe('Icon (1-3 char initials or storage path, null to clear)'),
|
|
38
|
+
color: z.string().nullable().optional().describe('Palette color key (null to clear)'),
|
|
39
|
+
}, async ({ projectId, boardId, name, visibility, icon, color }) => {
|
|
40
|
+
const body = {};
|
|
41
|
+
if (name !== undefined)
|
|
42
|
+
body.name = name;
|
|
43
|
+
if (visibility !== undefined)
|
|
44
|
+
body.visibility = visibility;
|
|
45
|
+
if (icon !== undefined)
|
|
46
|
+
body.icon = icon;
|
|
47
|
+
if (color !== undefined)
|
|
48
|
+
body.color = color;
|
|
49
|
+
const data = await client.patch(`/projects/${projectId}/boards/${boardId}`, body);
|
|
50
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
51
|
+
});
|
|
52
|
+
// delete_board
|
|
53
|
+
server.tool('delete_board', 'Delete a board. Tickets are moved to backlog by default. Use dry_run=true (default) to preview impact before deleting.', {
|
|
54
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
55
|
+
boardId: z.string().uuid().describe('Board ID'),
|
|
56
|
+
dry_run: z.boolean().default(true).describe('Preview impact without deleting (default: true)'),
|
|
57
|
+
ticket_action: z.enum(['move_to_backlog', 'archive', 'delete']).default('move_to_backlog')
|
|
58
|
+
.describe('What to do with tickets when dry_run=false'),
|
|
59
|
+
}, { readOnlyHint: false, destructiveHint: true }, async ({ projectId, boardId, dry_run, ticket_action }) => {
|
|
60
|
+
if (dry_run) {
|
|
61
|
+
const preview = await client.get(`/projects/${projectId}/boards/${boardId}/delete-preview`);
|
|
62
|
+
return { content: [{ type: 'text', text: JSON.stringify({ dry_run: true, impact: preview }, null, 2) }] };
|
|
63
|
+
}
|
|
64
|
+
await client.post(`/projects/${projectId}/boards/${boardId}/delete`, { ticket_action });
|
|
65
|
+
return { content: [{ type: 'text', text: JSON.stringify({ success: true, deleted: boardId }, null, 2) }] };
|
|
66
|
+
});
|
|
67
|
+
// get_board_context
|
|
68
|
+
server.tool('get_board_context', 'Get complete board context in a single call: board details, columns, ticket summaries, transition rules, and field requirements. Use this instead of calling list_columns + list_tickets + list_transition_rules + list_transition_requirements separately.', {
|
|
69
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
70
|
+
boardId: z.string().uuid().describe('Board ID'),
|
|
71
|
+
}, async ({ projectId, boardId }) => {
|
|
72
|
+
const [board, columns, tickets, rules, requirements] = await Promise.all([
|
|
73
|
+
client.get(`/projects/${projectId}/boards/${boardId}`),
|
|
74
|
+
client.get(`/projects/${projectId}/boards/${boardId}/columns`),
|
|
75
|
+
client.get(`/projects/${projectId}/boards/${boardId}/tickets`),
|
|
76
|
+
client.get(`/projects/${projectId}/boards/${boardId}/transition-rules`),
|
|
77
|
+
client.get(`/projects/${projectId}/boards/${boardId}/transition-field-requirements`),
|
|
78
|
+
]);
|
|
79
|
+
const colMap = new Map(columns.map((c) => [c.id, c.name]));
|
|
80
|
+
// Summarize tickets: only essential fields to keep payload small
|
|
81
|
+
const ticketSummaries = (Array.isArray(tickets) ? tickets : [])
|
|
82
|
+
.filter((t) => t.archived_at == null)
|
|
83
|
+
.map((t) => {
|
|
84
|
+
const assignee = t.assignee;
|
|
85
|
+
return {
|
|
86
|
+
id: t.id,
|
|
87
|
+
ticket_number: t.ticket_number,
|
|
88
|
+
title: t.title,
|
|
89
|
+
column_id: t.column_id,
|
|
90
|
+
column_name: t.column_id ? (colMap.get(t.column_id) ?? 'Unknown') : 'Backlog',
|
|
91
|
+
assignee_id: t.assignee_id ?? null,
|
|
92
|
+
assignee_name: assignee?.display_name ?? null,
|
|
93
|
+
position: t.position,
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
const result = {
|
|
97
|
+
board,
|
|
98
|
+
columns,
|
|
99
|
+
tickets: ticketSummaries,
|
|
100
|
+
transition_rules: rules,
|
|
101
|
+
transition_requirements: requirements,
|
|
102
|
+
summary: {
|
|
103
|
+
column_count: columns.length,
|
|
104
|
+
ticket_count: ticketSummaries.length,
|
|
105
|
+
rule_count: Array.isArray(rules) ? rules.length : 0,
|
|
106
|
+
requirement_count: Array.isArray(requirements) ? requirements.length : 0,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
110
|
+
});
|
|
111
|
+
// get_board_context
|
|
112
|
+
server.tool('get_board_context', 'Get complete board context in a single call: board details, columns, ticket summaries, transition rules, and field requirements. Use this instead of calling list_columns + list_tickets + list_transition_rules + list_transition_requirements separately.', {
|
|
113
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
114
|
+
boardId: z.string().uuid().describe('Board ID'),
|
|
115
|
+
}, async ({ projectId, boardId }) => {
|
|
116
|
+
const [board, columns, tickets, rules, requirements] = await Promise.all([
|
|
117
|
+
client.get(`/projects/${projectId}/boards/${boardId}`),
|
|
118
|
+
client.get(`/projects/${projectId}/boards/${boardId}/columns`),
|
|
119
|
+
client.get(`/projects/${projectId}/boards/${boardId}/tickets`),
|
|
120
|
+
client.get(`/projects/${projectId}/boards/${boardId}/transition-rules`),
|
|
121
|
+
client.get(`/projects/${projectId}/boards/${boardId}/transition-field-requirements`),
|
|
122
|
+
]);
|
|
123
|
+
const colMap = new Map(columns.map((c) => [c.id, c.name]));
|
|
124
|
+
// Summarize tickets: only essential fields to keep payload small
|
|
125
|
+
const ticketSummaries = (Array.isArray(tickets) ? tickets : [])
|
|
126
|
+
.filter((t) => t.archived_at == null)
|
|
127
|
+
.map((t) => {
|
|
128
|
+
const assignee = t.assignee;
|
|
129
|
+
return {
|
|
130
|
+
id: t.id,
|
|
131
|
+
ticket_number: t.ticket_number,
|
|
132
|
+
title: t.title,
|
|
133
|
+
column_id: t.column_id,
|
|
134
|
+
column_name: t.column_id ? (colMap.get(t.column_id) ?? 'Unknown') : 'Backlog',
|
|
135
|
+
assignee_id: t.assignee_id ?? null,
|
|
136
|
+
assignee_name: assignee?.display_name ?? null,
|
|
137
|
+
position: t.position,
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
const result = {
|
|
141
|
+
board,
|
|
142
|
+
columns,
|
|
143
|
+
tickets: ticketSummaries,
|
|
144
|
+
transition_rules: rules,
|
|
145
|
+
transition_requirements: requirements,
|
|
146
|
+
summary: {
|
|
147
|
+
column_count: columns.length,
|
|
148
|
+
ticket_count: ticketSummaries.length,
|
|
149
|
+
rule_count: Array.isArray(rules) ? rules.length : 0,
|
|
150
|
+
requirement_count: Array.isArray(requirements) ? requirements.length : 0,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=boards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boards.js","sourceRoot":"","sources":["../../src/tools/boards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../src/tools/columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,QA6G3E"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerColumnTools(server, client) {
|
|
3
|
+
// list_columns
|
|
4
|
+
server.tool('list_columns', 'Use this when you need to see all columns on a board, including their IDs, types, WIP limits, and archive settings. Column IDs are required by move_ticket, check_transition, and transition rule tools.', {
|
|
5
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
6
|
+
boardId: z.string().uuid().describe('Board ID'),
|
|
7
|
+
}, { readOnlyHint: true, destructiveHint: false }, async ({ projectId, boardId }) => {
|
|
8
|
+
const data = await client.get(`/projects/${projectId}/boards/${boardId}/columns`);
|
|
9
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
10
|
+
});
|
|
11
|
+
// create_column
|
|
12
|
+
server.tool('create_column', 'Use this to add a new column to a board. Position is auto-calculated as the last column.', {
|
|
13
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
14
|
+
boardId: z.string().uuid().describe('Board ID'),
|
|
15
|
+
name: z.string().min(1).max(100).describe('Column name'),
|
|
16
|
+
color: z.string().optional().describe('Hex color (default: #6b7280)'),
|
|
17
|
+
}, { readOnlyHint: false, destructiveHint: false }, async ({ projectId, boardId, name, color }) => {
|
|
18
|
+
const body = { name };
|
|
19
|
+
if (color !== undefined)
|
|
20
|
+
body.color = color;
|
|
21
|
+
const data = await client.post(`/projects/${projectId}/boards/${boardId}/columns`, body);
|
|
22
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
23
|
+
});
|
|
24
|
+
// update_column
|
|
25
|
+
server.tool('update_column', 'Use this to change a column\'s name, color, description, type, WIP limit, default assignee, or archive settings. Only pass the fields you want to change.', {
|
|
26
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
27
|
+
columnId: z.string().uuid().describe('Column ID'),
|
|
28
|
+
name: z.string().min(1).max(100).optional().describe('New column name'),
|
|
29
|
+
color: z.string().optional().describe('New hex color'),
|
|
30
|
+
description: z.string().nullable().optional().describe('Column description (null to clear)'),
|
|
31
|
+
columnType: z.enum(['start', 'in_progress', 'done', 'default']).optional().describe('Column type'),
|
|
32
|
+
wipLimit: z.number().int().nullable().optional().describe('WIP limit (null for no limit)'),
|
|
33
|
+
defaultAssigneeId: z.string().uuid().nullable().optional().describe('Default assignee user ID (null to clear)'),
|
|
34
|
+
archiveMode: z.enum(['off', 'immediate', 'delayed', 'manual']).optional().describe('Auto-archive mode'),
|
|
35
|
+
archiveDelayHours: z.number().positive().nullable().optional().describe('Hours before auto-archive in delayed mode'),
|
|
36
|
+
archiveOverflowLimit: z.number().int().positive().nullable().optional().describe('Max tickets before oldest are auto-archived'),
|
|
37
|
+
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: true }, async ({ projectId, columnId, name, color, description, columnType, wipLimit, defaultAssigneeId, archiveMode, archiveDelayHours, archiveOverflowLimit }) => {
|
|
38
|
+
const body = {};
|
|
39
|
+
if (name !== undefined)
|
|
40
|
+
body.name = name;
|
|
41
|
+
if (color !== undefined)
|
|
42
|
+
body.color = color;
|
|
43
|
+
if (description !== undefined)
|
|
44
|
+
body.description = description;
|
|
45
|
+
if (columnType !== undefined)
|
|
46
|
+
body.column_type = columnType;
|
|
47
|
+
if (wipLimit !== undefined)
|
|
48
|
+
body.wip_limit = wipLimit;
|
|
49
|
+
if (defaultAssigneeId !== undefined)
|
|
50
|
+
body.default_assignee_id = defaultAssigneeId;
|
|
51
|
+
if (archiveMode !== undefined)
|
|
52
|
+
body.archive_mode = archiveMode;
|
|
53
|
+
if (archiveDelayHours !== undefined)
|
|
54
|
+
body.archive_delay_hours = archiveDelayHours;
|
|
55
|
+
if (archiveOverflowLimit !== undefined)
|
|
56
|
+
body.archive_overflow_limit = archiveOverflowLimit;
|
|
57
|
+
const data = await client.patch(`/projects/${projectId}/columns/${columnId}`, body);
|
|
58
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
59
|
+
});
|
|
60
|
+
// delete_column
|
|
61
|
+
server.tool('delete_column', 'Delete a column. Tickets move to backlog by default. Related transition rules are marked broken. Use dry_run=true (default) to preview impact.', {
|
|
62
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
63
|
+
columnId: z.string().uuid().describe('Column ID'),
|
|
64
|
+
dry_run: z.boolean().default(true).describe('Preview impact without deleting (default: true)'),
|
|
65
|
+
ticket_action: z.enum(['move_to_backlog', 'archive', 'delete']).default('move_to_backlog')
|
|
66
|
+
.describe('What to do with tickets when dry_run=false'),
|
|
67
|
+
}, { readOnlyHint: false, destructiveHint: true }, async ({ projectId, columnId, dry_run, ticket_action }) => {
|
|
68
|
+
if (dry_run) {
|
|
69
|
+
const preview = await client.get(`/projects/${projectId}/columns/${columnId}/delete-preview`);
|
|
70
|
+
return { content: [{ type: 'text', text: JSON.stringify({ dry_run: true, impact: preview }, null, 2) }] };
|
|
71
|
+
}
|
|
72
|
+
await client.post(`/projects/${projectId}/columns/${columnId}/delete`, { ticket_action });
|
|
73
|
+
return { content: [{ type: 'text', text: JSON.stringify({ success: true, deleted: columnId }, null, 2) }] };
|
|
74
|
+
});
|
|
75
|
+
// reorder_columns
|
|
76
|
+
server.tool('reorder_columns', 'Use this to change the display order of columns. Pass all columns with new positions. Use list_columns first to get IDs.', {
|
|
77
|
+
projectId: z.string().uuid().describe('Project ID'),
|
|
78
|
+
boardId: z.string().uuid().describe('Board ID'),
|
|
79
|
+
columns: z.array(z.object({
|
|
80
|
+
id: z.string().uuid().describe('Column ID'),
|
|
81
|
+
position: z.number().int().nonnegative().describe('New position'),
|
|
82
|
+
})).describe('Array of column positions'),
|
|
83
|
+
}, { readOnlyHint: false, destructiveHint: false, idempotentHint: true }, async ({ projectId, boardId, columns }) => {
|
|
84
|
+
await client.put(`/projects/${projectId}/boards/${boardId}/columns/reorder`, columns);
|
|
85
|
+
return { content: [{ type: 'text', text: JSON.stringify({ success: true, reordered: columns.length }, null, 2) }] };
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.js","sourceRoot":"","sources":["../../src/tools/columns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAUlD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,QAiG5E"}
|