@flowboardlabs/mcp-server 0.1.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.
@@ -0,0 +1,131 @@
1
+ /**
2
+ * FlowBoard API client — thin HTTP wrapper over Cloud Functions endpoints.
3
+ */
4
+ export declare class FlowBoardClient {
5
+ private apiKey;
6
+ private baseUrl;
7
+ constructor(apiKey: string, baseUrl?: string);
8
+ private request;
9
+ listProjects(): Promise<{
10
+ projects: Project[];
11
+ }>;
12
+ searchTasks(filters?: TaskFilters): Promise<{
13
+ tasks: Task[];
14
+ filters: Record<string, unknown>;
15
+ }>;
16
+ getTask(taskId: string): Promise<{
17
+ task: Task;
18
+ comments: Comment[];
19
+ }>;
20
+ createTask(data: CreateTaskInput): Promise<{
21
+ id: string;
22
+ taskNumber: string;
23
+ message: string;
24
+ }>;
25
+ updateTask(taskId: string, data: UpdateTaskInput): Promise<{
26
+ success: boolean;
27
+ taskId: string;
28
+ message: string;
29
+ }>;
30
+ deleteTask(taskId: string): Promise<{
31
+ success: boolean;
32
+ taskId: string;
33
+ message: string;
34
+ }>;
35
+ getComments(taskId: string, limit?: number): Promise<{
36
+ comments: Comment[];
37
+ taskId: string;
38
+ }>;
39
+ addComment(taskId: string, text: string): Promise<{
40
+ commentId: string;
41
+ taskId: string;
42
+ message: string;
43
+ }>;
44
+ listReleases(limit?: number): Promise<{
45
+ releases: Release[];
46
+ }>;
47
+ getRelease(releaseId: string): Promise<{
48
+ release: Release;
49
+ tasks: Task[];
50
+ }>;
51
+ voteIdea(taskId: string): Promise<{
52
+ success: boolean;
53
+ taskId: string;
54
+ voted: boolean;
55
+ voteCount: number;
56
+ message: string;
57
+ }>;
58
+ }
59
+ export interface Project {
60
+ id: string;
61
+ name: string;
62
+ description: string | null;
63
+ color: string | null;
64
+ createdAt: string | null;
65
+ updatedAt: string | null;
66
+ }
67
+ export interface Task {
68
+ id: string;
69
+ title: string;
70
+ description?: string;
71
+ status: string;
72
+ type: string;
73
+ taskNumber?: string;
74
+ tags?: string[];
75
+ assignee?: string;
76
+ projectId?: string;
77
+ createdAt?: string | null;
78
+ updatedAt?: string | null;
79
+ startedAt?: string | null;
80
+ doneAt?: string | null;
81
+ finishedAt?: string | null;
82
+ voteCount?: number;
83
+ [key: string]: unknown;
84
+ }
85
+ export interface Comment {
86
+ id: string;
87
+ text: string;
88
+ createdBy: string;
89
+ createdAt: string | null;
90
+ type: string;
91
+ }
92
+ export interface Release {
93
+ id: string;
94
+ name: string;
95
+ version: string | null;
96
+ status: string | null;
97
+ description: string | null;
98
+ releaseDate: string | null;
99
+ createdAt: string | null;
100
+ updatedAt: string | null;
101
+ taskCount?: number;
102
+ }
103
+ export interface TaskFilters {
104
+ board?: string;
105
+ status?: string;
106
+ statuses?: string[];
107
+ projectId?: string;
108
+ assignee?: string;
109
+ type?: string;
110
+ tags?: string[];
111
+ limit?: number;
112
+ }
113
+ export interface CreateTaskInput {
114
+ title: string;
115
+ description: string;
116
+ type: 'idea' | 'bug';
117
+ tags?: string[];
118
+ metadata?: Record<string, unknown>;
119
+ }
120
+ export interface UpdateTaskInput {
121
+ status?: string;
122
+ comment?: string;
123
+ externalReference?: {
124
+ type: string;
125
+ url: string;
126
+ id?: string;
127
+ title?: string;
128
+ };
129
+ assignee?: string;
130
+ branchName?: string;
131
+ }
package/dist/client.js ADDED
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * FlowBoard API client — thin HTTP wrapper over Cloud Functions endpoints.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FlowBoardClient = void 0;
7
+ const DEFAULT_API_URL = 'https://europe-west3-flowwboard.cloudfunctions.net';
8
+ class FlowBoardClient {
9
+ apiKey;
10
+ baseUrl;
11
+ constructor(apiKey, baseUrl) {
12
+ this.apiKey = apiKey;
13
+ this.baseUrl = (baseUrl || DEFAULT_API_URL).replace(/\/+$/, '');
14
+ }
15
+ async request(path, options = {}) {
16
+ const { method = 'GET', body, query } = options;
17
+ let url = `${this.baseUrl}/${path}`;
18
+ if (query) {
19
+ const params = new URLSearchParams(query);
20
+ url += `?${params.toString()}`;
21
+ }
22
+ const headers = {
23
+ Authorization: `Bearer ${this.apiKey}`,
24
+ 'Content-Type': 'application/json',
25
+ };
26
+ const res = await fetch(url, {
27
+ method,
28
+ headers,
29
+ body: body ? JSON.stringify(body) : undefined,
30
+ });
31
+ const data = await res.json();
32
+ if (!res.ok) {
33
+ const message = data.message ||
34
+ data.error ||
35
+ `HTTP ${res.status}`;
36
+ throw new Error(message);
37
+ }
38
+ return data;
39
+ }
40
+ // ---- Projects ----
41
+ async listProjects() {
42
+ return this.request('listProjects');
43
+ }
44
+ // ---- Tasks ----
45
+ async searchTasks(filters = {}) {
46
+ const query = {};
47
+ if (filters.board)
48
+ query.board = filters.board;
49
+ if (filters.status)
50
+ query.status = filters.status;
51
+ if (filters.statuses)
52
+ query.statuses = filters.statuses.join(',');
53
+ if (filters.projectId)
54
+ query.projectId = filters.projectId;
55
+ if (filters.assignee)
56
+ query.assignee = filters.assignee;
57
+ if (filters.type)
58
+ query.type = filters.type;
59
+ if (filters.tags)
60
+ query.tags = filters.tags.join(',');
61
+ if (filters.limit)
62
+ query.limit = String(filters.limit);
63
+ return this.request('getTasks', { query });
64
+ }
65
+ async getTask(taskId) {
66
+ return this.request('getTask', { query: { taskId } });
67
+ }
68
+ async createTask(data) {
69
+ return this.request('submitTask', { method: 'POST', body: data });
70
+ }
71
+ async updateTask(taskId, data) {
72
+ return this.request('updateTask', { method: 'PATCH', body: data, query: { taskId } });
73
+ }
74
+ async deleteTask(taskId) {
75
+ return this.request('deleteTask', { method: 'DELETE', query: { taskId } });
76
+ }
77
+ // ---- Comments ----
78
+ async getComments(taskId, limit) {
79
+ const query = { taskId };
80
+ if (limit)
81
+ query.limit = String(limit);
82
+ return this.request('getComments', { query });
83
+ }
84
+ async addComment(taskId, text) {
85
+ return this.request('addComment', { method: 'POST', body: { text }, query: { taskId } });
86
+ }
87
+ // ---- Releases ----
88
+ async listReleases(limit) {
89
+ const query = {};
90
+ if (limit)
91
+ query.limit = String(limit);
92
+ return this.request('listReleases', { query });
93
+ }
94
+ async getRelease(releaseId) {
95
+ return this.request('getRelease', { query: { releaseId } });
96
+ }
97
+ // ---- Ideas ----
98
+ async voteIdea(taskId) {
99
+ return this.request('voteIdea', { method: 'POST', query: { taskId } });
100
+ }
101
+ }
102
+ exports.FlowBoardClient = FlowBoardClient;
103
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const client_js_1 = require("./client.js");
7
+ const tools_js_1 = require("./tools.js");
8
+ const API_KEY = process.env.FLOWBOARD_API_KEY;
9
+ const API_URL = process.env.FLOWBOARD_API_URL;
10
+ if (!API_KEY) {
11
+ console.error('Error: FLOWBOARD_API_KEY environment variable is required.');
12
+ console.error('Generate one at: FlowBoard → Settings → Integrations → API Keys');
13
+ process.exit(1);
14
+ }
15
+ const client = new client_js_1.FlowBoardClient(API_KEY, API_URL);
16
+ const server = new mcp_js_1.McpServer({
17
+ name: 'flowboard',
18
+ version: '0.1.0',
19
+ });
20
+ // ---- Register tools ----
21
+ for (const def of tools_js_1.TOOL_DEFINITIONS) {
22
+ server.tool(def.name, def.description, def.inputSchema, async (args) => {
23
+ try {
24
+ const result = await (0, tools_js_1.executeTool)(client, def.name, args);
25
+ return {
26
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
27
+ };
28
+ }
29
+ catch (err) {
30
+ const message = err instanceof Error ? err.message : String(err);
31
+ return {
32
+ content: [{ type: 'text', text: `Error: ${message}` }],
33
+ isError: true,
34
+ };
35
+ }
36
+ });
37
+ }
38
+ // ---- Register resources ----
39
+ // Static resource: list of projects
40
+ server.resource('projects', 'flowboard://projects', { description: 'List of all projects in the workspace' }, async () => {
41
+ const result = await client.listProjects();
42
+ return {
43
+ contents: [
44
+ {
45
+ uri: 'flowboard://projects',
46
+ mimeType: 'application/json',
47
+ text: JSON.stringify(result.projects, null, 2),
48
+ },
49
+ ],
50
+ };
51
+ });
52
+ // Dynamic resource: individual task by ID
53
+ server.resource('task', new mcp_js_1.ResourceTemplate('flowboard://tasks/{taskId}', { list: undefined }), { description: 'A single FlowBoard task with its comments' }, async (uri, params) => {
54
+ const taskId = params.taskId;
55
+ const result = await client.getTask(taskId);
56
+ return {
57
+ contents: [
58
+ {
59
+ uri: uri.href,
60
+ mimeType: 'application/json',
61
+ text: JSON.stringify(result, null, 2),
62
+ },
63
+ ],
64
+ };
65
+ });
66
+ // ---- Start server ----
67
+ async function main() {
68
+ const transport = new stdio_js_1.StdioServerTransport();
69
+ await server.connect(transport);
70
+ }
71
+ main().catch((err) => {
72
+ console.error('Fatal error:', err);
73
+ process.exit(1);
74
+ });
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { FlowBoardClient } from './client.js';
2
+ /**
3
+ * Tool definitions for the FlowBoard MCP server.
4
+ * Each tool maps to one or more FlowBoard API calls.
5
+ */
6
+ export interface ToolDef {
7
+ name: string;
8
+ description: string;
9
+ inputSchema: Record<string, unknown>;
10
+ }
11
+ export declare const TOOL_DEFINITIONS: ToolDef[];
12
+ /**
13
+ * Execute an MCP tool call against the FlowBoard API.
14
+ */
15
+ export declare function executeTool(client: FlowBoardClient, toolName: string, args: Record<string, unknown>): Promise<unknown>;
package/dist/tools.js ADDED
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TOOL_DEFINITIONS = void 0;
4
+ exports.executeTool = executeTool;
5
+ exports.TOOL_DEFINITIONS = [
6
+ // ---- Projects ----
7
+ {
8
+ name: 'list_projects',
9
+ description: 'List all projects in the FlowBoard workspace.',
10
+ inputSchema: {
11
+ type: 'object',
12
+ properties: {},
13
+ },
14
+ },
15
+ // ---- Tasks ----
16
+ {
17
+ name: 'search_tasks',
18
+ description: 'Search and filter tasks. Supports filtering by board (flow/bugs/ideas), status, project, assignee, type, and tags.',
19
+ inputSchema: {
20
+ type: 'object',
21
+ properties: {
22
+ board: { type: 'string', description: 'Board to search: "flow", "bugs", or "ideas"' },
23
+ status: { type: 'string', description: 'Filter by status: open, in_progress, blocked, ready, done, paused' },
24
+ statuses: { type: 'string', description: 'Comma-separated list of statuses' },
25
+ projectId: { type: 'string', description: 'Filter by project ID' },
26
+ assignee: { type: 'string', description: 'Filter by assignee email or ID' },
27
+ type: { type: 'string', description: 'Filter by type: idea, bug, task' },
28
+ tags: { type: 'string', description: 'Comma-separated list of tags to filter by' },
29
+ limit: { type: 'number', description: 'Max results (default 100, max 500)' },
30
+ },
31
+ },
32
+ },
33
+ {
34
+ name: 'get_task',
35
+ description: 'Get a single task by ID, including its comments.',
36
+ inputSchema: {
37
+ type: 'object',
38
+ properties: {
39
+ taskId: { type: 'string', description: 'The task ID' },
40
+ },
41
+ required: ['taskId'],
42
+ },
43
+ },
44
+ {
45
+ name: 'create_task',
46
+ description: 'Create a new task (idea or bug) in FlowBoard.',
47
+ inputSchema: {
48
+ type: 'object',
49
+ properties: {
50
+ title: { type: 'string', description: 'Task title (3-200 characters)' },
51
+ description: { type: 'string', description: 'Task description (0-5000 characters)' },
52
+ type: { type: 'string', enum: ['idea', 'bug'], description: 'Task type: idea or bug' },
53
+ tags: { type: 'string', description: 'Comma-separated tags (max 10, each max 50 chars)' },
54
+ },
55
+ required: ['title', 'description', 'type'],
56
+ },
57
+ },
58
+ {
59
+ name: 'update_task',
60
+ description: 'Update a task — change status, add a comment, link a PR/MR, assign someone, or set a branch name.',
61
+ inputSchema: {
62
+ type: 'object',
63
+ properties: {
64
+ taskId: { type: 'string', description: 'The task ID to update' },
65
+ status: { type: 'string', description: 'New status: open, in_progress, blocked, ready, done, paused' },
66
+ comment: { type: 'string', description: 'Comment to add (1-5000 characters)' },
67
+ assignee: { type: 'string', description: 'Assignee email or ID' },
68
+ branchName: { type: 'string', description: 'Git branch name (max 200 chars)' },
69
+ externalReferenceType: { type: 'string', description: 'External ref type, e.g. "github_pr", "gitlab_mr"' },
70
+ externalReferenceUrl: { type: 'string', description: 'External ref URL' },
71
+ externalReferenceTitle: { type: 'string', description: 'External ref title' },
72
+ },
73
+ required: ['taskId'],
74
+ },
75
+ },
76
+ {
77
+ name: 'delete_task',
78
+ description: 'Soft-delete (trash) a task.',
79
+ inputSchema: {
80
+ type: 'object',
81
+ properties: {
82
+ taskId: { type: 'string', description: 'The task ID to delete' },
83
+ },
84
+ required: ['taskId'],
85
+ },
86
+ },
87
+ // ---- Ideas ----
88
+ {
89
+ name: 'list_ideas',
90
+ description: 'List ideas with optional status filter. Shortcut for search_tasks with board=ideas.',
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ status: { type: 'string', description: 'Filter by status' },
95
+ limit: { type: 'number', description: 'Max results (default 100)' },
96
+ },
97
+ },
98
+ },
99
+ {
100
+ name: 'vote_idea',
101
+ description: 'Toggle a vote on an idea. Voting again removes the vote.',
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ taskId: { type: 'string', description: 'The idea task ID to vote on' },
106
+ },
107
+ required: ['taskId'],
108
+ },
109
+ },
110
+ // ---- Releases ----
111
+ {
112
+ name: 'list_releases',
113
+ description: 'List releases in the workspace.',
114
+ inputSchema: {
115
+ type: 'object',
116
+ properties: {
117
+ limit: { type: 'number', description: 'Max results (default 25, max 100)' },
118
+ },
119
+ },
120
+ },
121
+ {
122
+ name: 'get_release',
123
+ description: 'Get a single release with its associated tasks.',
124
+ inputSchema: {
125
+ type: 'object',
126
+ properties: {
127
+ releaseId: { type: 'string', description: 'The release ID' },
128
+ },
129
+ required: ['releaseId'],
130
+ },
131
+ },
132
+ // ---- Comments ----
133
+ {
134
+ name: 'get_comments',
135
+ description: 'Get comments for a task.',
136
+ inputSchema: {
137
+ type: 'object',
138
+ properties: {
139
+ taskId: { type: 'string', description: 'The task ID' },
140
+ limit: { type: 'number', description: 'Max comments (default 50, max 100)' },
141
+ },
142
+ required: ['taskId'],
143
+ },
144
+ },
145
+ {
146
+ name: 'add_comment',
147
+ description: 'Add a comment to a task.',
148
+ inputSchema: {
149
+ type: 'object',
150
+ properties: {
151
+ taskId: { type: 'string', description: 'The task ID' },
152
+ text: { type: 'string', description: 'Comment text (1-5000 characters)' },
153
+ },
154
+ required: ['taskId', 'text'],
155
+ },
156
+ },
157
+ ];
158
+ /**
159
+ * Execute an MCP tool call against the FlowBoard API.
160
+ */
161
+ async function executeTool(client, toolName, args) {
162
+ switch (toolName) {
163
+ // Projects
164
+ case 'list_projects':
165
+ return client.listProjects();
166
+ // Tasks
167
+ case 'search_tasks': {
168
+ const filters = {};
169
+ if (args.board)
170
+ filters.board = args.board;
171
+ if (args.status)
172
+ filters.status = args.status;
173
+ if (args.statuses)
174
+ filters.statuses = args.statuses.split(',').map(s => s.trim());
175
+ if (args.projectId)
176
+ filters.projectId = args.projectId;
177
+ if (args.assignee)
178
+ filters.assignee = args.assignee;
179
+ if (args.type)
180
+ filters.type = args.type;
181
+ if (args.tags)
182
+ filters.tags = args.tags.split(',').map(s => s.trim());
183
+ if (args.limit)
184
+ filters.limit = args.limit;
185
+ return client.searchTasks(filters);
186
+ }
187
+ case 'get_task':
188
+ return client.getTask(args.taskId);
189
+ case 'create_task': {
190
+ const tags = args.tags ? args.tags.split(',').map(s => s.trim()) : undefined;
191
+ return client.createTask({
192
+ title: args.title,
193
+ description: args.description,
194
+ type: args.type,
195
+ tags,
196
+ });
197
+ }
198
+ case 'update_task': {
199
+ const update = {};
200
+ if (args.status)
201
+ update.status = args.status;
202
+ if (args.comment)
203
+ update.comment = args.comment;
204
+ if (args.assignee !== undefined)
205
+ update.assignee = args.assignee;
206
+ if (args.branchName !== undefined)
207
+ update.branchName = args.branchName;
208
+ if (args.externalReferenceType && args.externalReferenceUrl) {
209
+ update.externalReference = {
210
+ type: args.externalReferenceType,
211
+ url: args.externalReferenceUrl,
212
+ title: args.externalReferenceTitle || undefined,
213
+ };
214
+ }
215
+ return client.updateTask(args.taskId, update);
216
+ }
217
+ case 'delete_task':
218
+ return client.deleteTask(args.taskId);
219
+ // Ideas
220
+ case 'list_ideas':
221
+ return client.searchTasks({
222
+ board: 'ideas',
223
+ status: args.status,
224
+ limit: args.limit,
225
+ });
226
+ case 'vote_idea':
227
+ return client.voteIdea(args.taskId);
228
+ // Releases
229
+ case 'list_releases':
230
+ return client.listReleases(args.limit);
231
+ case 'get_release':
232
+ return client.getRelease(args.releaseId);
233
+ // Comments
234
+ case 'get_comments':
235
+ return client.getComments(args.taskId, args.limit);
236
+ case 'add_comment':
237
+ return client.addComment(args.taskId, args.text);
238
+ default:
239
+ throw new Error(`Unknown tool: ${toolName}`);
240
+ }
241
+ }
242
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@flowboardlabs/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "FlowBoard MCP Server — lets AI tools manage projects, tasks, ideas, and releases",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "flowboard-mcp": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "start": "node dist/index.js",
12
+ "dev": "tsc --watch"
13
+ },
14
+ "keywords": ["flowboard", "mcp", "ai", "project-management", "claude"],
15
+ "license": "MIT",
16
+ "engines": {
17
+ "node": ">=18"
18
+ },
19
+ "dependencies": {
20
+ "@modelcontextprotocol/sdk": "^1.12.1"
21
+ },
22
+ "devDependencies": {
23
+ "typescript": "~5.5.0",
24
+ "@types/node": "^20.0.0"
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ]
29
+ }