@granoflow/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.
- package/LICENSE +21 -0
- package/README.md +203 -0
- package/dist/api.d.ts +26 -0
- package/dist/api.js +98 -0
- package/dist/api.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.js +148 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata.d.ts +2 -0
- package/dist/metadata.js +3 -0
- package/dist/metadata.js.map +1 -0
- package/dist/setup.d.ts +126 -0
- package/dist/setup.js +363 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools.d.ts +11 -0
- package/dist/tools.js +268 -0
- package/dist/tools.js.map +1 -0
- package/package.json +54 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { requestGranoflowApi } from "./api.js";
|
|
3
|
+
import { detectLocalApi, getSetupStatus, openGranoflowApp, openSetupConfig, writeSetupConfig, } from "./setup.js";
|
|
4
|
+
const jsonInputSchema = z
|
|
5
|
+
.record(z.string(), z.unknown())
|
|
6
|
+
.describe("JSON object sent to the Granoflow Local HTTP API.");
|
|
7
|
+
const resourceStatusSchema = z.string().min(1).optional();
|
|
8
|
+
function compactRecord(record) {
|
|
9
|
+
return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
|
|
10
|
+
}
|
|
11
|
+
function textResult(text) {
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: "text", text }],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function jsonTextResult(value) {
|
|
17
|
+
return textResult(JSON.stringify(value, null, 2));
|
|
18
|
+
}
|
|
19
|
+
async function apiTool(options) {
|
|
20
|
+
return jsonTextResult(await requestGranoflowApi(options));
|
|
21
|
+
}
|
|
22
|
+
export function registerGranoflowTools(server) {
|
|
23
|
+
server.tool("granoflow_setup_status", "Inspect Granoflow MCP config and Local HTTP API health without printing secrets.", {}, async () => jsonTextResult(await getSetupStatus()));
|
|
24
|
+
server.tool("granoflow_setup_detect_local_api", "Probe a bounded localhost port list for a running Granoflow Local HTTP API.", {
|
|
25
|
+
ports: z
|
|
26
|
+
.array(z.number().int().min(1).max(65_535))
|
|
27
|
+
.max(20)
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Small localhost port candidate list. Defaults to known Granoflow candidates."),
|
|
30
|
+
timeoutMs: z.number().int().min(50).max(5_000).optional(),
|
|
31
|
+
}, async ({ ports, timeoutMs }) => jsonTextResult(await detectLocalApi({
|
|
32
|
+
ports: Array.isArray(ports) ? ports.map(Number) : undefined,
|
|
33
|
+
timeoutMs: typeof timeoutMs === "number" ? timeoutMs : undefined,
|
|
34
|
+
})));
|
|
35
|
+
server.tool("granoflow_setup_write_config", "Preview or write MCP-owned non-secret Granoflow connection config. Defaults to dry-run.", {
|
|
36
|
+
apiBaseUrl: z.string().url().optional(),
|
|
37
|
+
dryRun: z.boolean().default(true),
|
|
38
|
+
}, async ({ apiBaseUrl, dryRun }) => jsonTextResult(await writeSetupConfig({
|
|
39
|
+
apiBaseUrl: typeof apiBaseUrl === "string" ? apiBaseUrl : undefined,
|
|
40
|
+
dryRun: dryRun !== false,
|
|
41
|
+
})));
|
|
42
|
+
server.tool("granoflow_setup_open_config", "Create and optionally open the MCP-owned non-secret Granoflow config file.", {
|
|
43
|
+
createIfMissing: z.boolean().default(true),
|
|
44
|
+
open: z.boolean().default(false),
|
|
45
|
+
}, async ({ createIfMissing, open }) => jsonTextResult(await openSetupConfig({
|
|
46
|
+
createIfMissing: createIfMissing !== false,
|
|
47
|
+
open: open === true,
|
|
48
|
+
})));
|
|
49
|
+
server.tool("granoflow_setup_open_app", "Preview or open the installed Granoflow app after user approval. Defaults to dry-run.", {
|
|
50
|
+
appPath: z.string().min(1).optional(),
|
|
51
|
+
appName: z.string().min(1).optional(),
|
|
52
|
+
dryRun: z.boolean().default(true),
|
|
53
|
+
}, async ({ appName, appPath, dryRun }) => jsonTextResult(await openGranoflowApp({
|
|
54
|
+
appPath: typeof appPath === "string" ? appPath : undefined,
|
|
55
|
+
appName: typeof appName === "string" ? appName : undefined,
|
|
56
|
+
dryRun: dryRun !== false,
|
|
57
|
+
})));
|
|
58
|
+
server.tool("granoflow_health", "Check whether the Granoflow Local HTTP API is reachable.", {}, async () => apiTool({ path: "/v1/health" }));
|
|
59
|
+
server.tool("granoflow_version", "Show Granoflow app and Local HTTP API version metadata.", {}, async () => apiTool({ path: "/v1/version" }));
|
|
60
|
+
server.tool("granoflow_capabilities", "List capabilities exposed by the running Granoflow app.", {}, async () => apiTool({ path: "/v1/capabilities" }));
|
|
61
|
+
server.tool("granoflow_ai_agent_tools", "List Granoflow AI-agent tool contracts.", {}, async () => apiTool({ path: "/v1/ai-agent/tools" }));
|
|
62
|
+
server.tool("granoflow_task_list", "List tasks from Granoflow.", {}, async () => apiTool({ path: "/v1/tasks" }));
|
|
63
|
+
server.tool("granoflow_task_export", "Export a task context for an AI agent.", { taskId: z.string().min(1).describe("Granoflow task id.") }, async ({ taskId }) => apiTool({ path: `/v1/ai-agent/tasks/${String(taskId)}/export` }));
|
|
64
|
+
server.tool("granoflow_task_validate", "Validate an AI-agent task result before importing it into Granoflow.", { input: jsonInputSchema }, async ({ input }) => apiTool({ method: "POST", path: "/v1/ai-agent/tasks/validate", body: input }));
|
|
65
|
+
server.tool("granoflow_task_import", "Import an AI-agent task result into Granoflow. Use dryRun first unless the user explicitly asks to write.", {
|
|
66
|
+
input: jsonInputSchema,
|
|
67
|
+
dryRun: z
|
|
68
|
+
.boolean()
|
|
69
|
+
.default(true)
|
|
70
|
+
.describe("When true, previews the request without writing."),
|
|
71
|
+
}, async ({ input, dryRun }) => apiTool({
|
|
72
|
+
method: "POST",
|
|
73
|
+
path: "/v1/ai-agent/tasks/import",
|
|
74
|
+
body: input,
|
|
75
|
+
dryRun: dryRun !== false,
|
|
76
|
+
}));
|
|
77
|
+
server.tool("granoflow_task_create", "Create a Granoflow task from a JSON payload.", {
|
|
78
|
+
input: jsonInputSchema,
|
|
79
|
+
dryRun: z
|
|
80
|
+
.boolean()
|
|
81
|
+
.default(true)
|
|
82
|
+
.describe("When true, previews the request without writing."),
|
|
83
|
+
}, async ({ input, dryRun }) => apiTool({
|
|
84
|
+
method: "POST",
|
|
85
|
+
path: "/v1/tasks",
|
|
86
|
+
body: input,
|
|
87
|
+
dryRun: dryRun !== false,
|
|
88
|
+
}));
|
|
89
|
+
server.tool("granoflow_task_create_structured", "Create a Granoflow task with common structured fields. Defaults to dry-run.", {
|
|
90
|
+
title: z.string().min(1),
|
|
91
|
+
description: z.string().optional(),
|
|
92
|
+
dueAt: z.string().optional(),
|
|
93
|
+
projectId: z.string().min(1).optional(),
|
|
94
|
+
milestoneId: z.string().min(1).optional(),
|
|
95
|
+
status: resourceStatusSchema,
|
|
96
|
+
dryRun: z
|
|
97
|
+
.boolean()
|
|
98
|
+
.default(true)
|
|
99
|
+
.describe("When true, previews the request without writing."),
|
|
100
|
+
}, async ({ title, description, dueAt, projectId, milestoneId, status, dryRun }) => apiTool({
|
|
101
|
+
method: "POST",
|
|
102
|
+
path: "/v1/tasks",
|
|
103
|
+
body: compactRecord({
|
|
104
|
+
title,
|
|
105
|
+
description,
|
|
106
|
+
dueAt,
|
|
107
|
+
projectId,
|
|
108
|
+
milestoneId,
|
|
109
|
+
status,
|
|
110
|
+
}),
|
|
111
|
+
dryRun: dryRun !== false,
|
|
112
|
+
}));
|
|
113
|
+
server.tool("granoflow_task_update", "Update a Granoflow task through the Local HTTP API.", {
|
|
114
|
+
taskId: z.string().min(1).describe("Granoflow task id."),
|
|
115
|
+
input: jsonInputSchema,
|
|
116
|
+
dryRun: z
|
|
117
|
+
.boolean()
|
|
118
|
+
.default(true)
|
|
119
|
+
.describe("When true, previews the request without writing."),
|
|
120
|
+
}, async ({ taskId, input, dryRun }) => apiTool({
|
|
121
|
+
method: "PATCH",
|
|
122
|
+
path: `/v1/tasks/${String(taskId)}`,
|
|
123
|
+
body: input,
|
|
124
|
+
dryRun: dryRun !== false,
|
|
125
|
+
}));
|
|
126
|
+
server.tool("granoflow_task_update_structured", "Update a Granoflow task with common structured fields. Defaults to dry-run.", {
|
|
127
|
+
taskId: z.string().min(1).describe("Granoflow task id."),
|
|
128
|
+
title: z.string().min(1).optional(),
|
|
129
|
+
description: z.string().optional(),
|
|
130
|
+
dueAt: z.string().optional(),
|
|
131
|
+
projectId: z.string().min(1).optional(),
|
|
132
|
+
milestoneId: z.string().min(1).optional(),
|
|
133
|
+
status: resourceStatusSchema,
|
|
134
|
+
dryRun: z
|
|
135
|
+
.boolean()
|
|
136
|
+
.default(true)
|
|
137
|
+
.describe("When true, previews the request without writing."),
|
|
138
|
+
}, async ({ taskId, title, description, dueAt, projectId, milestoneId, status, dryRun }) => apiTool({
|
|
139
|
+
method: "PATCH",
|
|
140
|
+
path: `/v1/tasks/${String(taskId)}`,
|
|
141
|
+
body: compactRecord({
|
|
142
|
+
title,
|
|
143
|
+
description,
|
|
144
|
+
dueAt,
|
|
145
|
+
projectId,
|
|
146
|
+
milestoneId,
|
|
147
|
+
status,
|
|
148
|
+
}),
|
|
149
|
+
dryRun: dryRun !== false,
|
|
150
|
+
}));
|
|
151
|
+
server.tool("granoflow_task_complete", "Complete a Granoflow task.", {
|
|
152
|
+
taskId: z.string().min(1).describe("Granoflow task id."),
|
|
153
|
+
input: jsonInputSchema.optional(),
|
|
154
|
+
dryRun: z
|
|
155
|
+
.boolean()
|
|
156
|
+
.default(true)
|
|
157
|
+
.describe("When true, previews the request without writing."),
|
|
158
|
+
}, async ({ taskId, input, dryRun }) => apiTool({
|
|
159
|
+
method: "POST",
|
|
160
|
+
path: `/v1/tasks/${String(taskId)}/complete`,
|
|
161
|
+
body: input,
|
|
162
|
+
dryRun: dryRun !== false,
|
|
163
|
+
}));
|
|
164
|
+
server.tool("granoflow_project_list", "List Granoflow projects.", {}, async () => apiTool({ path: "/v1/projects" }));
|
|
165
|
+
server.tool("granoflow_project_create", "Create a Granoflow project with common structured fields. Defaults to dry-run.", {
|
|
166
|
+
title: z.string().min(1),
|
|
167
|
+
description: z.string().optional(),
|
|
168
|
+
domainTag: z.string().min(1).optional(),
|
|
169
|
+
status: resourceStatusSchema,
|
|
170
|
+
dryRun: z
|
|
171
|
+
.boolean()
|
|
172
|
+
.default(true)
|
|
173
|
+
.describe("When true, previews the request without writing."),
|
|
174
|
+
}, async ({ title, description, domainTag, status, dryRun }) => apiTool({
|
|
175
|
+
method: "POST",
|
|
176
|
+
path: "/v1/projects",
|
|
177
|
+
body: compactRecord({
|
|
178
|
+
title,
|
|
179
|
+
description,
|
|
180
|
+
domainTag,
|
|
181
|
+
status,
|
|
182
|
+
}),
|
|
183
|
+
dryRun: dryRun !== false,
|
|
184
|
+
}));
|
|
185
|
+
server.tool("granoflow_project_update", "Update a Granoflow project with common structured fields. Defaults to dry-run.", {
|
|
186
|
+
projectId: z.string().min(1).describe("Granoflow project id."),
|
|
187
|
+
title: z.string().min(1).optional(),
|
|
188
|
+
description: z.string().optional(),
|
|
189
|
+
domainTag: z.string().min(1).optional(),
|
|
190
|
+
status: resourceStatusSchema,
|
|
191
|
+
dryRun: z
|
|
192
|
+
.boolean()
|
|
193
|
+
.default(true)
|
|
194
|
+
.describe("When true, previews the request without writing."),
|
|
195
|
+
}, async ({ projectId, title, description, domainTag, status, dryRun }) => apiTool({
|
|
196
|
+
method: "PATCH",
|
|
197
|
+
path: `/v1/projects/${String(projectId)}`,
|
|
198
|
+
body: compactRecord({
|
|
199
|
+
title,
|
|
200
|
+
description,
|
|
201
|
+
domainTag,
|
|
202
|
+
status,
|
|
203
|
+
}),
|
|
204
|
+
dryRun: dryRun !== false,
|
|
205
|
+
}));
|
|
206
|
+
server.tool("granoflow_milestone_list", "List Granoflow milestones.", {}, async () => apiTool({ path: "/v1/milestones" }));
|
|
207
|
+
server.tool("granoflow_milestone_create", "Create a Granoflow milestone with common structured fields. Defaults to dry-run.", {
|
|
208
|
+
projectId: z.string().min(1).describe("Granoflow project id."),
|
|
209
|
+
title: z.string().min(1),
|
|
210
|
+
description: z.string().optional(),
|
|
211
|
+
dueAt: z.string().optional(),
|
|
212
|
+
status: resourceStatusSchema,
|
|
213
|
+
dryRun: z
|
|
214
|
+
.boolean()
|
|
215
|
+
.default(true)
|
|
216
|
+
.describe("When true, previews the request without writing."),
|
|
217
|
+
}, async ({ projectId, title, description, dueAt, status, dryRun }) => apiTool({
|
|
218
|
+
method: "POST",
|
|
219
|
+
path: "/v1/milestones",
|
|
220
|
+
body: compactRecord({
|
|
221
|
+
projectId,
|
|
222
|
+
title,
|
|
223
|
+
description,
|
|
224
|
+
dueAt,
|
|
225
|
+
status,
|
|
226
|
+
}),
|
|
227
|
+
dryRun: dryRun !== false,
|
|
228
|
+
}));
|
|
229
|
+
server.tool("granoflow_milestone_update", "Update a Granoflow milestone with common structured fields. Defaults to dry-run.", {
|
|
230
|
+
milestoneId: z.string().min(1).describe("Granoflow milestone id."),
|
|
231
|
+
projectId: z.string().min(1).optional(),
|
|
232
|
+
title: z.string().min(1).optional(),
|
|
233
|
+
description: z.string().optional(),
|
|
234
|
+
dueAt: z.string().optional(),
|
|
235
|
+
status: resourceStatusSchema,
|
|
236
|
+
dryRun: z
|
|
237
|
+
.boolean()
|
|
238
|
+
.default(true)
|
|
239
|
+
.describe("When true, previews the request without writing."),
|
|
240
|
+
}, async ({ milestoneId, projectId, title, description, dueAt, status, dryRun }) => apiTool({
|
|
241
|
+
method: "PATCH",
|
|
242
|
+
path: `/v1/milestones/${String(milestoneId)}`,
|
|
243
|
+
body: compactRecord({
|
|
244
|
+
projectId,
|
|
245
|
+
title,
|
|
246
|
+
description,
|
|
247
|
+
dueAt,
|
|
248
|
+
status,
|
|
249
|
+
}),
|
|
250
|
+
dryRun: dryRun !== false,
|
|
251
|
+
}));
|
|
252
|
+
server.tool("granoflow_review_day_show", "Show a Granoflow daily review by date.", { date: z.string().describe("Date in YYYY-MM-DD format.") }, async ({ date }) => apiTool({ path: `/v1/reviews/days/${String(date)}` }));
|
|
253
|
+
server.tool("granoflow_api_request", "Run an allowed Granoflow Local HTTP API request. Prefer dedicated tools when available.", {
|
|
254
|
+
method: z.enum(["GET", "POST", "PATCH", "DELETE"]).default("GET"),
|
|
255
|
+
path: z
|
|
256
|
+
.string()
|
|
257
|
+
.min(1)
|
|
258
|
+
.refine((path) => path.startsWith("/v1/"), "path must start with /v1/"),
|
|
259
|
+
input: jsonInputSchema.optional(),
|
|
260
|
+
dryRun: z.boolean().default(true).describe("When true, previews write requests."),
|
|
261
|
+
}, async ({ method, path, input, dryRun }) => apiTool({
|
|
262
|
+
method: method,
|
|
263
|
+
path: String(path),
|
|
264
|
+
body: input,
|
|
265
|
+
dryRun: method === "GET" ? false : dryRun !== false,
|
|
266
|
+
}));
|
|
267
|
+
}
|
|
268
|
+
//# 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,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@granoflow/mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Granoflow: exposes the Local HTTP API as tools for AI agents, IDEs, and automation.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"homepage": "https://github.com/granoflow/granoflow-mcp-server#readme",
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/granoflow/granoflow-mcp-server/issues"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/granoflow/granoflow-mcp-server.git"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"bin": {
|
|
19
|
+
"granoflow-mcp-server": "dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"clean": "rm -rf dist",
|
|
28
|
+
"build": "npm run clean && tsc -p tsconfig.json",
|
|
29
|
+
"dev": "tsx src/index.ts",
|
|
30
|
+
"lint": "eslint .",
|
|
31
|
+
"format": "prettier --check .",
|
|
32
|
+
"format:write": "prettier --write .",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"check": "npm run format && npm run lint && npm run build && npm run test",
|
|
35
|
+
"prepublishOnly": "npm run check"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=20"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
42
|
+
"zod": "^3.25.76"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@eslint/js": "^9.39.1",
|
|
46
|
+
"@types/node": "^24.10.1",
|
|
47
|
+
"eslint": "^9.39.1",
|
|
48
|
+
"prettier": "^3.6.2",
|
|
49
|
+
"tsx": "^4.20.6",
|
|
50
|
+
"typescript": "^5.9.3",
|
|
51
|
+
"typescript-eslint": "^8.48.1",
|
|
52
|
+
"vitest": "^4.0.14"
|
|
53
|
+
}
|
|
54
|
+
}
|