@flowboardlabs/mcp-server 0.2.1 → 0.4.0
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 +21 -6
- package/dist/client.d.ts +11 -8
- package/dist/client.js +49 -13
- package/dist/client.js.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/tools.js +31 -20
- package/dist/tools.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,7 +21,8 @@ Add the following to your MCP server configuration:
|
|
|
21
21
|
"command": "npx",
|
|
22
22
|
"args": ["-y", "@flowboardlabs/mcp-server"],
|
|
23
23
|
"env": {
|
|
24
|
-
"FLOWBOARD_API_KEY": "your-api-key-here"
|
|
24
|
+
"FLOWBOARD_API_KEY": "your-api-key-here",
|
|
25
|
+
"FLOWBOARD_USER_EMAIL": "you@example.com"
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
28
|
}
|
|
@@ -37,7 +38,8 @@ Add the following to your MCP server configuration:
|
|
|
37
38
|
"command": "cmd",
|
|
38
39
|
"args": ["/c", "npx", "-y", "@flowboardlabs/mcp-server"],
|
|
39
40
|
"env": {
|
|
40
|
-
"FLOWBOARD_API_KEY": "your-api-key-here"
|
|
41
|
+
"FLOWBOARD_API_KEY": "your-api-key-here",
|
|
42
|
+
"FLOWBOARD_USER_EMAIL": "you@example.com"
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
45
|
}
|
|
@@ -58,14 +60,15 @@ Add the following to your MCP server configuration:
|
|
|
58
60
|
|----------|----------|-------------|
|
|
59
61
|
| `FLOWBOARD_API_KEY` | Yes | Your FlowBoard API key |
|
|
60
62
|
| `FLOWBOARD_API_URL` | No | Custom API URL (for self-hosted instances) |
|
|
63
|
+
| `FLOWBOARD_USER_EMAIL` | No | Your email address in the workspace. Enables user-aware features: `mine` filter in search, and proper comment attribution |
|
|
61
64
|
|
|
62
65
|
## Available Tools
|
|
63
66
|
|
|
64
67
|
| Tool | Description |
|
|
65
68
|
|------|-------------|
|
|
66
69
|
| `list_projects` | List all projects in your workspace |
|
|
67
|
-
| `search_tasks` | Search and filter tasks by board, status, project, assignee, type,
|
|
68
|
-
| `get_task` | Get a single task
|
|
70
|
+
| `search_tasks` | Search and filter tasks by board, status, project, assignee, type, tags. Use `mine: true` to list your own tasks |
|
|
71
|
+
| `get_task` | Get a single task by ID or task number, including its comments |
|
|
69
72
|
| `create_task` | Create a new idea or bug |
|
|
70
73
|
| `update_task` | Change status, add comment, link a PR, assign someone |
|
|
71
74
|
| `delete_task` | Soft-delete (trash) a task |
|
|
@@ -76,15 +79,27 @@ Add the following to your MCP server configuration:
|
|
|
76
79
|
| `get_comments` | Get comments for a task |
|
|
77
80
|
| `add_comment` | Add a comment to a task |
|
|
78
81
|
|
|
82
|
+
### Task identification
|
|
83
|
+
|
|
84
|
+
All task-related tools accept either a `taskId` (Firestore document ID) or a `taskNumber` (the human-readable integer, e.g. `42`). Task numbers are easier to work with — agents can extract them from git branch names like `feature/42-fix-login`.
|
|
85
|
+
|
|
86
|
+
### User identity
|
|
87
|
+
|
|
88
|
+
When `FLOWBOARD_USER_EMAIL` is set, the MCP server sends an `X-User-Email` header with every request. This enables:
|
|
89
|
+
|
|
90
|
+
- **`mine` filter** — `search_tasks` with `mine: true` returns only tasks assigned to you
|
|
91
|
+
- **Comment attribution** — comments added via `add_comment` or `update_task` are attributed to your user account instead of the generic "api" author
|
|
92
|
+
|
|
79
93
|
## Example Prompts
|
|
80
94
|
|
|
81
95
|
Once configured, just ask naturally:
|
|
82
96
|
|
|
97
|
+
- "Show me my in-progress tasks"
|
|
83
98
|
- "Show me all open bugs in the backend project"
|
|
84
99
|
- "Create a bug: login page returns 500 when email contains a plus sign"
|
|
85
|
-
- "Move task
|
|
100
|
+
- "Move task 42 to in_progress and assign it to me"
|
|
86
101
|
- "What are the latest releases?"
|
|
87
|
-
- "Add a comment to task
|
|
102
|
+
- "Add a comment to task 15: Fixed in PR #42"
|
|
88
103
|
|
|
89
104
|
## Requirements
|
|
90
105
|
|
package/dist/client.d.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
export declare class FlowBoardClient {
|
|
5
5
|
private apiKey;
|
|
6
6
|
private baseUrl;
|
|
7
|
-
|
|
7
|
+
private userEmail?;
|
|
8
|
+
constructor(apiKey: string, baseUrl?: string, userEmail?: string);
|
|
8
9
|
private request;
|
|
9
10
|
listProjects(): Promise<{
|
|
10
11
|
projects: Project[];
|
|
@@ -13,7 +14,7 @@ export declare class FlowBoardClient {
|
|
|
13
14
|
tasks: Task[];
|
|
14
15
|
filters: Record<string, unknown>;
|
|
15
16
|
}>;
|
|
16
|
-
getTask(taskId
|
|
17
|
+
getTask(taskId?: string, taskNumber?: number): Promise<{
|
|
17
18
|
task: Task;
|
|
18
19
|
comments: Comment[];
|
|
19
20
|
}>;
|
|
@@ -22,21 +23,21 @@ export declare class FlowBoardClient {
|
|
|
22
23
|
taskNumber: string;
|
|
23
24
|
message: string;
|
|
24
25
|
}>;
|
|
25
|
-
updateTask(
|
|
26
|
+
updateTask(data: UpdateTaskInput, taskId?: string, taskNumber?: number): Promise<{
|
|
26
27
|
success: boolean;
|
|
27
28
|
taskId: string;
|
|
28
29
|
message: string;
|
|
29
30
|
}>;
|
|
30
|
-
deleteTask(taskId
|
|
31
|
+
deleteTask(taskId?: string, taskNumber?: number): Promise<{
|
|
31
32
|
success: boolean;
|
|
32
33
|
taskId: string;
|
|
33
34
|
message: string;
|
|
34
35
|
}>;
|
|
35
|
-
getComments(taskId
|
|
36
|
+
getComments(limit?: number, taskId?: string, taskNumber?: number): Promise<{
|
|
36
37
|
comments: Comment[];
|
|
37
38
|
taskId: string;
|
|
38
39
|
}>;
|
|
39
|
-
addComment(
|
|
40
|
+
addComment(text: string, taskId?: string, taskNumber?: number): Promise<{
|
|
40
41
|
commentId: string;
|
|
41
42
|
taskId: string;
|
|
42
43
|
message: string;
|
|
@@ -48,7 +49,7 @@ export declare class FlowBoardClient {
|
|
|
48
49
|
release: Release;
|
|
49
50
|
tasks: Task[];
|
|
50
51
|
}>;
|
|
51
|
-
voteIdea(taskId
|
|
52
|
+
voteIdea(taskId?: string, taskNumber?: number): Promise<{
|
|
52
53
|
success: boolean;
|
|
53
54
|
taskId: string;
|
|
54
55
|
voted: boolean;
|
|
@@ -109,11 +110,13 @@ export interface TaskFilters {
|
|
|
109
110
|
type?: string;
|
|
110
111
|
tags?: string[];
|
|
111
112
|
limit?: number;
|
|
113
|
+
mine?: boolean;
|
|
112
114
|
}
|
|
113
115
|
export interface CreateTaskInput {
|
|
114
116
|
title: string;
|
|
115
117
|
description: string;
|
|
116
|
-
type: 'idea' | 'bug';
|
|
118
|
+
type: 'idea' | 'bug' | 'feature' | 'improvement' | 'fix' | 'chore';
|
|
119
|
+
projectId?: string;
|
|
117
120
|
tags?: string[];
|
|
118
121
|
metadata?: Record<string, unknown>;
|
|
119
122
|
}
|
package/dist/client.js
CHANGED
|
@@ -8,9 +8,11 @@ const DEFAULT_API_URL = 'https://europe-west3-flowwboard.cloudfunctions.net';
|
|
|
8
8
|
class FlowBoardClient {
|
|
9
9
|
apiKey;
|
|
10
10
|
baseUrl;
|
|
11
|
-
|
|
11
|
+
userEmail;
|
|
12
|
+
constructor(apiKey, baseUrl, userEmail) {
|
|
12
13
|
this.apiKey = apiKey;
|
|
13
14
|
this.baseUrl = (baseUrl || DEFAULT_API_URL).replace(/\/+$/, '');
|
|
15
|
+
this.userEmail = userEmail;
|
|
14
16
|
}
|
|
15
17
|
async request(path, options = {}) {
|
|
16
18
|
const { method = 'GET', body, query } = options;
|
|
@@ -23,6 +25,9 @@ class FlowBoardClient {
|
|
|
23
25
|
Authorization: `Bearer ${this.apiKey}`,
|
|
24
26
|
'Content-Type': 'application/json',
|
|
25
27
|
};
|
|
28
|
+
if (this.userEmail) {
|
|
29
|
+
headers['X-User-Email'] = this.userEmail;
|
|
30
|
+
}
|
|
26
31
|
const res = await fetch(url, {
|
|
27
32
|
method,
|
|
28
33
|
headers,
|
|
@@ -60,29 +65,55 @@ class FlowBoardClient {
|
|
|
60
65
|
query.tags = filters.tags.join(',');
|
|
61
66
|
if (filters.limit)
|
|
62
67
|
query.limit = String(filters.limit);
|
|
68
|
+
if (filters.mine)
|
|
69
|
+
query.mine = 'true';
|
|
63
70
|
return this.request('getTasks', { query });
|
|
64
71
|
}
|
|
65
|
-
async getTask(taskId) {
|
|
66
|
-
|
|
72
|
+
async getTask(taskId, taskNumber) {
|
|
73
|
+
const query = {};
|
|
74
|
+
if (taskId)
|
|
75
|
+
query.taskId = taskId;
|
|
76
|
+
if (taskNumber !== undefined)
|
|
77
|
+
query.taskNumber = String(taskNumber);
|
|
78
|
+
return this.request('getTask', { query });
|
|
67
79
|
}
|
|
68
80
|
async createTask(data) {
|
|
69
81
|
return this.request('submitTask', { method: 'POST', body: data });
|
|
70
82
|
}
|
|
71
|
-
async updateTask(taskId,
|
|
72
|
-
|
|
83
|
+
async updateTask(data, taskId, taskNumber) {
|
|
84
|
+
const query = {};
|
|
85
|
+
if (taskId)
|
|
86
|
+
query.taskId = taskId;
|
|
87
|
+
if (taskNumber !== undefined)
|
|
88
|
+
query.taskNumber = String(taskNumber);
|
|
89
|
+
return this.request('updateTask', { method: 'PATCH', body: data, query });
|
|
73
90
|
}
|
|
74
|
-
async deleteTask(taskId) {
|
|
75
|
-
|
|
91
|
+
async deleteTask(taskId, taskNumber) {
|
|
92
|
+
const query = {};
|
|
93
|
+
if (taskId)
|
|
94
|
+
query.taskId = taskId;
|
|
95
|
+
if (taskNumber !== undefined)
|
|
96
|
+
query.taskNumber = String(taskNumber);
|
|
97
|
+
return this.request('deleteTask', { method: 'DELETE', query });
|
|
76
98
|
}
|
|
77
99
|
// ---- Comments ----
|
|
78
|
-
async getComments(taskId,
|
|
79
|
-
const query = {
|
|
100
|
+
async getComments(limit, taskId, taskNumber) {
|
|
101
|
+
const query = {};
|
|
102
|
+
if (taskId)
|
|
103
|
+
query.taskId = taskId;
|
|
104
|
+
if (taskNumber !== undefined)
|
|
105
|
+
query.taskNumber = String(taskNumber);
|
|
80
106
|
if (limit)
|
|
81
107
|
query.limit = String(limit);
|
|
82
108
|
return this.request('getComments', { query });
|
|
83
109
|
}
|
|
84
|
-
async addComment(taskId,
|
|
85
|
-
|
|
110
|
+
async addComment(text, taskId, taskNumber) {
|
|
111
|
+
const query = {};
|
|
112
|
+
if (taskId)
|
|
113
|
+
query.taskId = taskId;
|
|
114
|
+
if (taskNumber !== undefined)
|
|
115
|
+
query.taskNumber = String(taskNumber);
|
|
116
|
+
return this.request('addComment', { method: 'POST', body: { text }, query });
|
|
86
117
|
}
|
|
87
118
|
// ---- Releases ----
|
|
88
119
|
async listReleases(limit) {
|
|
@@ -95,8 +126,13 @@ class FlowBoardClient {
|
|
|
95
126
|
return this.request('getRelease', { query: { releaseId } });
|
|
96
127
|
}
|
|
97
128
|
// ---- Ideas ----
|
|
98
|
-
async voteIdea(taskId) {
|
|
99
|
-
|
|
129
|
+
async voteIdea(taskId, taskNumber) {
|
|
130
|
+
const query = {};
|
|
131
|
+
if (taskId)
|
|
132
|
+
query.taskId = taskId;
|
|
133
|
+
if (taskNumber !== undefined)
|
|
134
|
+
query.taskNumber = String(taskNumber);
|
|
135
|
+
return this.request('voteIdea', { method: 'POST', query });
|
|
100
136
|
}
|
|
101
137
|
}
|
|
102
138
|
exports.FlowBoardClient = FlowBoardClient;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAM,eAAe,GAAG,oDAAoD,CAAC;AAE7E,MAAa,eAAe;IAClB,MAAM,CAAS;IACf,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,15 +7,16 @@ const client_js_1 = require("./client.js");
|
|
|
7
7
|
const tools_js_1 = require("./tools.js");
|
|
8
8
|
const API_KEY = process.env.FLOWBOARD_API_KEY;
|
|
9
9
|
const API_URL = process.env.FLOWBOARD_API_URL;
|
|
10
|
+
const USER_EMAIL = process.env.FLOWBOARD_USER_EMAIL;
|
|
10
11
|
if (!API_KEY) {
|
|
11
12
|
console.error('Error: FLOWBOARD_API_KEY environment variable is required.');
|
|
12
13
|
console.error('Generate one at: FlowBoard → Settings → Integrations → API Keys');
|
|
13
14
|
process.exit(1);
|
|
14
15
|
}
|
|
15
|
-
const client = new client_js_1.FlowBoardClient(API_KEY, API_URL);
|
|
16
|
+
const client = new client_js_1.FlowBoardClient(API_KEY, API_URL, USER_EMAIL);
|
|
16
17
|
const server = new mcp_js_1.McpServer({
|
|
17
18
|
name: 'flowboard',
|
|
18
|
-
version: '0.
|
|
19
|
+
version: '0.4.0',
|
|
19
20
|
});
|
|
20
21
|
// ---- Register tools ----
|
|
21
22
|
for (const def of tools_js_1.TOOL_DEFINITIONS) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,oEAAsF;AACtF,wEAAiF;AACjF,2CAA8C;AAC9C,yCAA2D;AAE3D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.js
CHANGED
|
@@ -23,30 +23,34 @@ exports.TOOL_DEFINITIONS = [
|
|
|
23
23
|
type: zod_1.z.string().describe('Filter by type: idea, bug, task').optional(),
|
|
24
24
|
tags: zod_1.z.string().describe('Comma-separated list of tags to filter by').optional(),
|
|
25
25
|
limit: zod_1.z.number().describe('Max results (default 100, max 500)').optional(),
|
|
26
|
+
mine: zod_1.z.boolean().describe('If true, filter tasks assigned to the current user (requires FLOWBOARD_USER_EMAIL)').optional(),
|
|
26
27
|
},
|
|
27
28
|
},
|
|
28
29
|
{
|
|
29
30
|
name: 'get_task',
|
|
30
|
-
description: 'Get a single task by ID, including its comments.',
|
|
31
|
+
description: 'Get a single task by ID or task number, including its comments. Provide either taskId or taskNumber.',
|
|
31
32
|
schema: {
|
|
32
|
-
taskId: zod_1.z.string().describe('The task ID'),
|
|
33
|
+
taskId: zod_1.z.string().describe('The task ID (Firestore document ID)').optional(),
|
|
34
|
+
taskNumber: zod_1.z.number().describe('The task number (e.g. 42). More practical than taskId — can be extracted from branch names like "feature/42-fix-login"').optional(),
|
|
33
35
|
},
|
|
34
36
|
},
|
|
35
37
|
{
|
|
36
38
|
name: 'create_task',
|
|
37
|
-
description: 'Create a new task (
|
|
39
|
+
description: 'Create a new task in FlowBoard. Ideas go to the ideas board, bugs to the bugs board, and flow types (feature, improvement, fix, chore) require a projectId targeting a specific project.',
|
|
38
40
|
schema: {
|
|
39
41
|
title: zod_1.z.string().describe('Task title (3-200 characters)'),
|
|
40
42
|
description: zod_1.z.string().describe('Task description (0-5000 characters)'),
|
|
41
|
-
type: zod_1.z.enum(['idea', 'bug']).describe('Task type
|
|
43
|
+
type: zod_1.z.enum(['idea', 'bug', 'feature', 'improvement', 'fix', 'chore']).describe('Task type'),
|
|
44
|
+
projectId: zod_1.z.string().describe('Target project ID (required for feature/improvement/fix/chore, optional for idea/bug). Use list_projects to find project IDs.').optional(),
|
|
42
45
|
tags: zod_1.z.string().describe('Comma-separated tags (max 10, each max 50 chars)').optional(),
|
|
43
46
|
},
|
|
44
47
|
},
|
|
45
48
|
{
|
|
46
49
|
name: 'update_task',
|
|
47
|
-
description: 'Update a task — change status, add a comment, link a PR/MR, assign someone, or set a branch name.',
|
|
50
|
+
description: 'Update a task — change status, add a comment, link a PR/MR, assign someone, or set a branch name. Provide either taskId or taskNumber.',
|
|
48
51
|
schema: {
|
|
49
|
-
taskId: zod_1.z.string().describe('The task ID to update'),
|
|
52
|
+
taskId: zod_1.z.string().describe('The task ID to update').optional(),
|
|
53
|
+
taskNumber: zod_1.z.number().describe('The task number (alternative to taskId)').optional(),
|
|
50
54
|
status: zod_1.z.string().describe('New status: open, in_progress, blocked, ready, done, paused').optional(),
|
|
51
55
|
comment: zod_1.z.string().describe('Comment to add (1-5000 characters)').optional(),
|
|
52
56
|
assignee: zod_1.z.string().describe('Assignee email or ID').optional(),
|
|
@@ -58,9 +62,10 @@ exports.TOOL_DEFINITIONS = [
|
|
|
58
62
|
},
|
|
59
63
|
{
|
|
60
64
|
name: 'delete_task',
|
|
61
|
-
description: 'Soft-delete (trash) a task.',
|
|
65
|
+
description: 'Soft-delete (trash) a task. Provide either taskId or taskNumber.',
|
|
62
66
|
schema: {
|
|
63
|
-
taskId: zod_1.z.string().describe('The task ID to delete'),
|
|
67
|
+
taskId: zod_1.z.string().describe('The task ID to delete').optional(),
|
|
68
|
+
taskNumber: zod_1.z.number().describe('The task number (alternative to taskId)').optional(),
|
|
64
69
|
},
|
|
65
70
|
},
|
|
66
71
|
// ---- Ideas ----
|
|
@@ -74,9 +79,10 @@ exports.TOOL_DEFINITIONS = [
|
|
|
74
79
|
},
|
|
75
80
|
{
|
|
76
81
|
name: 'vote_idea',
|
|
77
|
-
description: 'Toggle a vote on an idea. Voting again removes the vote.',
|
|
82
|
+
description: 'Toggle a vote on an idea. Voting again removes the vote. Provide either taskId or taskNumber.',
|
|
78
83
|
schema: {
|
|
79
|
-
taskId: zod_1.z.string().describe('The idea task ID to vote on'),
|
|
84
|
+
taskId: zod_1.z.string().describe('The idea task ID to vote on').optional(),
|
|
85
|
+
taskNumber: zod_1.z.number().describe('The task number (alternative to taskId)').optional(),
|
|
80
86
|
},
|
|
81
87
|
},
|
|
82
88
|
// ---- Releases ----
|
|
@@ -97,17 +103,19 @@ exports.TOOL_DEFINITIONS = [
|
|
|
97
103
|
// ---- Comments ----
|
|
98
104
|
{
|
|
99
105
|
name: 'get_comments',
|
|
100
|
-
description: 'Get comments for a task.',
|
|
106
|
+
description: 'Get comments for a task. Provide either taskId or taskNumber.',
|
|
101
107
|
schema: {
|
|
102
|
-
taskId: zod_1.z.string().describe('The task ID'),
|
|
108
|
+
taskId: zod_1.z.string().describe('The task ID').optional(),
|
|
109
|
+
taskNumber: zod_1.z.number().describe('The task number (alternative to taskId)').optional(),
|
|
103
110
|
limit: zod_1.z.number().describe('Max comments (default 50, max 100)').optional(),
|
|
104
111
|
},
|
|
105
112
|
},
|
|
106
113
|
{
|
|
107
114
|
name: 'add_comment',
|
|
108
|
-
description: 'Add a comment to a task.',
|
|
115
|
+
description: 'Add a comment to a task. Provide either taskId or taskNumber.',
|
|
109
116
|
schema: {
|
|
110
|
-
taskId: zod_1.z.string().describe('The task ID'),
|
|
117
|
+
taskId: zod_1.z.string().describe('The task ID').optional(),
|
|
118
|
+
taskNumber: zod_1.z.number().describe('The task number (alternative to taskId)').optional(),
|
|
111
119
|
text: zod_1.z.string().describe('Comment text (1-5000 characters)'),
|
|
112
120
|
},
|
|
113
121
|
},
|
|
@@ -139,16 +147,19 @@ async function executeTool(client, toolName, args) {
|
|
|
139
147
|
filters.tags = args.tags.split(',').map(s => s.trim());
|
|
140
148
|
if (args.limit)
|
|
141
149
|
filters.limit = args.limit;
|
|
150
|
+
if (args.mine)
|
|
151
|
+
filters.mine = true;
|
|
142
152
|
return client.searchTasks(filters);
|
|
143
153
|
}
|
|
144
154
|
case 'get_task':
|
|
145
|
-
return client.getTask(args.taskId);
|
|
155
|
+
return client.getTask(args.taskId, args.taskNumber);
|
|
146
156
|
case 'create_task': {
|
|
147
157
|
const tags = args.tags ? args.tags.split(',').map(s => s.trim()) : undefined;
|
|
148
158
|
return client.createTask({
|
|
149
159
|
title: args.title,
|
|
150
160
|
description: args.description,
|
|
151
161
|
type: args.type,
|
|
162
|
+
projectId: args.projectId,
|
|
152
163
|
tags,
|
|
153
164
|
});
|
|
154
165
|
}
|
|
@@ -169,10 +180,10 @@ async function executeTool(client, toolName, args) {
|
|
|
169
180
|
title: args.externalReferenceTitle || undefined,
|
|
170
181
|
};
|
|
171
182
|
}
|
|
172
|
-
return client.updateTask(args.taskId,
|
|
183
|
+
return client.updateTask(update, args.taskId, args.taskNumber);
|
|
173
184
|
}
|
|
174
185
|
case 'delete_task':
|
|
175
|
-
return client.deleteTask(args.taskId);
|
|
186
|
+
return client.deleteTask(args.taskId, args.taskNumber);
|
|
176
187
|
// Ideas
|
|
177
188
|
case 'list_ideas':
|
|
178
189
|
return client.searchTasks({
|
|
@@ -181,7 +192,7 @@ async function executeTool(client, toolName, args) {
|
|
|
181
192
|
limit: args.limit,
|
|
182
193
|
});
|
|
183
194
|
case 'vote_idea':
|
|
184
|
-
return client.voteIdea(args.taskId);
|
|
195
|
+
return client.voteIdea(args.taskId, args.taskNumber);
|
|
185
196
|
// Releases
|
|
186
197
|
case 'list_releases':
|
|
187
198
|
return client.listReleases(args.limit);
|
|
@@ -189,9 +200,9 @@ async function executeTool(client, toolName, args) {
|
|
|
189
200
|
return client.getRelease(args.releaseId);
|
|
190
201
|
// Comments
|
|
191
202
|
case 'get_comments':
|
|
192
|
-
return client.getComments(args.taskId, args.
|
|
203
|
+
return client.getComments(args.limit, args.taskId, args.taskNumber);
|
|
193
204
|
case 'add_comment':
|
|
194
|
-
return client.addComment(args.taskId, args.
|
|
205
|
+
return client.addComment(args.text, args.taskId, args.taskNumber);
|
|
195
206
|
default:
|
|
196
207
|
throw new Error(`Unknown tool: ${toolName}`);
|
|
197
208
|
}
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|