@flowboardlabs/mcp-server 0.3.0 → 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 +9 -7
- 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 +27 -18
- 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,6 +110,7 @@ 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;
|
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":";AAAA;;GAEG;;;AAEH,MAAM,eAAe,GAAG,oDAAoD,CAAC;AAE7E,MAAa,eAAe;IAClB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,SAAS,CAAU;IAE3B,YAAY,MAAc,EAAE,OAAgB,EAAE,SAAkB;QAC9D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,UAA+E,EAAE;QAEjF,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAEhD,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;YAC1C,GAAG,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC;QAEzD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAI,IAA6B,CAAC,OAAO;gBACnD,IAA2B,CAAC,KAAK;gBAClC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,qBAAqB;IAErB,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED,kBAAkB;IAElB,KAAK,CAAC,WAAW,CAAC,UAAuB,EAAE;QACzC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC/C,IAAI,OAAO,CAAC,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAClD,IAAI,OAAO,CAAC,QAAQ;YAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,OAAO,CAAC,SAAS;YAAE,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAC3D,IAAI,OAAO,CAAC,QAAQ;YAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACxD,IAAI,OAAO,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC5C,IAAI,OAAO,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,OAAO,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAe,EAAE,UAAmB;QAChD,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,UAAU,KAAK,SAAS;YAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAqB;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAqB,EAAE,MAAe,EAAE,UAAmB;QAC1E,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,UAAU,KAAK,SAAS;YAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAe,EAAE,UAAmB;QACnD,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,UAAU,KAAK,SAAS;YAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,qBAAqB;IAErB,KAAK,CAAC,WAAW,CAAC,KAAc,EAAE,MAAe,EAAE,UAAmB;QACpE,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,UAAU,KAAK,SAAS;YAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,IAAI,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,MAAe,EAAE,UAAmB;QACjE,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,UAAU,KAAK,SAAS;YAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,qBAAqB;IAErB,KAAK,CAAC,YAAY,CAAC,KAAc;QAC/B,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,kBAAkB;IAElB,KAAK,CAAC,QAAQ,CAAC,MAAe,EAAE,UAAmB;QACjD,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,UAAU,KAAK,SAAS;YAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF;AArID,0CAqIC"}
|
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,13 +23,15 @@ 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
|
{
|
|
@@ -45,9 +47,10 @@ exports.TOOL_DEFINITIONS = [
|
|
|
45
47
|
},
|
|
46
48
|
{
|
|
47
49
|
name: 'update_task',
|
|
48
|
-
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.',
|
|
49
51
|
schema: {
|
|
50
|
-
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(),
|
|
51
54
|
status: zod_1.z.string().describe('New status: open, in_progress, blocked, ready, done, paused').optional(),
|
|
52
55
|
comment: zod_1.z.string().describe('Comment to add (1-5000 characters)').optional(),
|
|
53
56
|
assignee: zod_1.z.string().describe('Assignee email or ID').optional(),
|
|
@@ -59,9 +62,10 @@ exports.TOOL_DEFINITIONS = [
|
|
|
59
62
|
},
|
|
60
63
|
{
|
|
61
64
|
name: 'delete_task',
|
|
62
|
-
description: 'Soft-delete (trash) a task.',
|
|
65
|
+
description: 'Soft-delete (trash) a task. Provide either taskId or taskNumber.',
|
|
63
66
|
schema: {
|
|
64
|
-
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(),
|
|
65
69
|
},
|
|
66
70
|
},
|
|
67
71
|
// ---- Ideas ----
|
|
@@ -75,9 +79,10 @@ exports.TOOL_DEFINITIONS = [
|
|
|
75
79
|
},
|
|
76
80
|
{
|
|
77
81
|
name: 'vote_idea',
|
|
78
|
-
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.',
|
|
79
83
|
schema: {
|
|
80
|
-
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(),
|
|
81
86
|
},
|
|
82
87
|
},
|
|
83
88
|
// ---- Releases ----
|
|
@@ -98,17 +103,19 @@ exports.TOOL_DEFINITIONS = [
|
|
|
98
103
|
// ---- Comments ----
|
|
99
104
|
{
|
|
100
105
|
name: 'get_comments',
|
|
101
|
-
description: 'Get comments for a task.',
|
|
106
|
+
description: 'Get comments for a task. Provide either taskId or taskNumber.',
|
|
102
107
|
schema: {
|
|
103
|
-
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(),
|
|
104
110
|
limit: zod_1.z.number().describe('Max comments (default 50, max 100)').optional(),
|
|
105
111
|
},
|
|
106
112
|
},
|
|
107
113
|
{
|
|
108
114
|
name: 'add_comment',
|
|
109
|
-
description: 'Add a comment to a task.',
|
|
115
|
+
description: 'Add a comment to a task. Provide either taskId or taskNumber.',
|
|
110
116
|
schema: {
|
|
111
|
-
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(),
|
|
112
119
|
text: zod_1.z.string().describe('Comment text (1-5000 characters)'),
|
|
113
120
|
},
|
|
114
121
|
},
|
|
@@ -140,10 +147,12 @@ async function executeTool(client, toolName, args) {
|
|
|
140
147
|
filters.tags = args.tags.split(',').map(s => s.trim());
|
|
141
148
|
if (args.limit)
|
|
142
149
|
filters.limit = args.limit;
|
|
150
|
+
if (args.mine)
|
|
151
|
+
filters.mine = true;
|
|
143
152
|
return client.searchTasks(filters);
|
|
144
153
|
}
|
|
145
154
|
case 'get_task':
|
|
146
|
-
return client.getTask(args.taskId);
|
|
155
|
+
return client.getTask(args.taskId, args.taskNumber);
|
|
147
156
|
case 'create_task': {
|
|
148
157
|
const tags = args.tags ? args.tags.split(',').map(s => s.trim()) : undefined;
|
|
149
158
|
return client.createTask({
|
|
@@ -171,10 +180,10 @@ async function executeTool(client, toolName, args) {
|
|
|
171
180
|
title: args.externalReferenceTitle || undefined,
|
|
172
181
|
};
|
|
173
182
|
}
|
|
174
|
-
return client.updateTask(args.taskId,
|
|
183
|
+
return client.updateTask(update, args.taskId, args.taskNumber);
|
|
175
184
|
}
|
|
176
185
|
case 'delete_task':
|
|
177
|
-
return client.deleteTask(args.taskId);
|
|
186
|
+
return client.deleteTask(args.taskId, args.taskNumber);
|
|
178
187
|
// Ideas
|
|
179
188
|
case 'list_ideas':
|
|
180
189
|
return client.searchTasks({
|
|
@@ -183,7 +192,7 @@ async function executeTool(client, toolName, args) {
|
|
|
183
192
|
limit: args.limit,
|
|
184
193
|
});
|
|
185
194
|
case 'vote_idea':
|
|
186
|
-
return client.voteIdea(args.taskId);
|
|
195
|
+
return client.voteIdea(args.taskId, args.taskNumber);
|
|
187
196
|
// Releases
|
|
188
197
|
case 'list_releases':
|
|
189
198
|
return client.listReleases(args.limit);
|
|
@@ -191,9 +200,9 @@ async function executeTool(client, toolName, args) {
|
|
|
191
200
|
return client.getRelease(args.releaseId);
|
|
192
201
|
// Comments
|
|
193
202
|
case 'get_comments':
|
|
194
|
-
return client.getComments(args.taskId, args.
|
|
203
|
+
return client.getComments(args.limit, args.taskId, args.taskNumber);
|
|
195
204
|
case 'add_comment':
|
|
196
|
-
return client.addComment(args.taskId, args.
|
|
205
|
+
return client.addComment(args.text, args.taskId, args.taskNumber);
|
|
197
206
|
default:
|
|
198
207
|
throw new Error(`Unknown tool: ${toolName}`);
|
|
199
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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"}
|