@reqlan/mcp 0.2.9 → 0.3.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 +10 -0
- package/out/server.js +159 -73
- package/out/server.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -50,6 +50,16 @@ Set `REQLAN_WORKSPACE` to the workspace root (or run from that directory). Overr
|
|
|
50
50
|
|
|
51
51
|
## Changelog
|
|
52
52
|
|
|
53
|
+
### 0.3.0
|
|
54
|
+
|
|
55
|
+
#### Minor Changes
|
|
56
|
+
|
|
57
|
+
- 6036b1a: up
|
|
58
|
+
|
|
59
|
+
#### Patch Changes
|
|
60
|
+
|
|
61
|
+
- @reqlan/analytical@1.11.0
|
|
62
|
+
|
|
53
63
|
### 0.2.9
|
|
54
64
|
|
|
55
65
|
#### Patch Changes
|
package/out/server.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { openAnalysisApi, } from "@reqlan/analytical/core";
|
|
5
6
|
function resolveWorkspaceRoot() {
|
|
6
7
|
const fromEnv = process.env.REQLAN_WORKSPACE?.trim();
|
|
7
8
|
if (fromEnv) {
|
|
@@ -10,147 +11,232 @@ function resolveWorkspaceRoot() {
|
|
|
10
11
|
return process.cwd();
|
|
11
12
|
}
|
|
12
13
|
function textContent(text) {
|
|
13
|
-
return { content: [{ type:
|
|
14
|
+
return { content: [{ type: "text", text }] };
|
|
14
15
|
}
|
|
15
16
|
export async function startMcpServer() {
|
|
16
17
|
const workspaceRoot = resolveWorkspaceRoot();
|
|
17
18
|
const opened = await openAnalysisApi({
|
|
18
19
|
workspaceRoot,
|
|
19
|
-
storagePath: process.env.REQLAN_INDEX_PATH
|
|
20
|
+
storagePath: process.env.REQLAN_INDEX_PATH,
|
|
20
21
|
});
|
|
21
22
|
const api = opened.api;
|
|
22
23
|
const server = new McpServer({
|
|
23
|
-
name:
|
|
24
|
-
version:
|
|
24
|
+
name: "reqlan",
|
|
25
|
+
version: "0.0.1",
|
|
25
26
|
});
|
|
26
|
-
server.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
server.registerTool("search_requirements", {
|
|
28
|
+
description: "Search requirements by keyword across names, summaries, tags, and references. Optional context paths/ideas bias ranking by graph hop distance.",
|
|
29
|
+
inputSchema: {
|
|
30
|
+
query: z.string().describe("Search text"),
|
|
31
|
+
limit: z
|
|
32
|
+
.number()
|
|
33
|
+
.int()
|
|
34
|
+
.positive()
|
|
35
|
+
.max(50)
|
|
36
|
+
.optional()
|
|
37
|
+
.describe("Maximum number of matches"),
|
|
38
|
+
context: z
|
|
39
|
+
.array(z.string())
|
|
40
|
+
.optional()
|
|
41
|
+
.describe("Relative .rq paths, path#idea refs, or idea names that bias ranking by hop distance"),
|
|
42
|
+
},
|
|
33
43
|
}, async ({ query, limit, context }) => {
|
|
34
44
|
const matches = await api.searchRequirements(query, limit ?? 8, context?.length ? { context } : undefined);
|
|
35
45
|
if (matches.length === 0) {
|
|
36
46
|
return textContent(`No requirements matched "${query}".`);
|
|
37
47
|
}
|
|
38
|
-
const body = matches
|
|
39
|
-
|
|
40
|
-
const
|
|
48
|
+
const body = matches
|
|
49
|
+
.map((match) => {
|
|
50
|
+
const reasons = match.reasons?.length
|
|
51
|
+
? `\nReasons: ${match.reasons.join(", ")}`
|
|
52
|
+
: "";
|
|
53
|
+
const score = match.score !== undefined ? `\nScore: ${match.score}` : "";
|
|
41
54
|
return `${api.formatIdea(match.idea)}${score}${reasons}`;
|
|
42
|
-
})
|
|
55
|
+
})
|
|
56
|
+
.join("\n\n");
|
|
43
57
|
return textContent(body);
|
|
44
58
|
});
|
|
45
|
-
server.
|
|
46
|
-
|
|
59
|
+
server.registerTool("list_requirements", {
|
|
60
|
+
description: "List indexed requirements in the workspace.",
|
|
61
|
+
inputSchema: {
|
|
62
|
+
limit: z
|
|
63
|
+
.number()
|
|
64
|
+
.int()
|
|
65
|
+
.positive()
|
|
66
|
+
.max(100)
|
|
67
|
+
.optional()
|
|
68
|
+
.describe("Maximum number of requirements"),
|
|
69
|
+
},
|
|
47
70
|
}, async ({ limit }) => {
|
|
48
71
|
const ideas = await api.listRequirements(limit ?? 50);
|
|
49
72
|
if (ideas.length === 0) {
|
|
50
|
-
return textContent(
|
|
73
|
+
return textContent("No requirements indexed in the workspace.");
|
|
51
74
|
}
|
|
52
|
-
return textContent(ideas.map(idea => api.formatIdea(idea)).join(
|
|
75
|
+
return textContent(ideas.map((idea) => api.formatIdea(idea)).join("\n\n"));
|
|
53
76
|
});
|
|
54
|
-
server.
|
|
55
|
-
|
|
77
|
+
server.registerTool("file_context", {
|
|
78
|
+
description: "Get requirements in, referencing, or comment-linked to a file.",
|
|
79
|
+
inputSchema: {
|
|
80
|
+
filePath: z
|
|
81
|
+
.string()
|
|
82
|
+
.describe("Relative or absolute path to a .rq file"),
|
|
83
|
+
},
|
|
56
84
|
}, async ({ filePath }) => {
|
|
57
85
|
const related = await api.getFileContext(filePath);
|
|
58
86
|
const sections = [
|
|
59
87
|
`File: ${filePath}`,
|
|
60
|
-
formatGroup(
|
|
61
|
-
formatGroup(
|
|
62
|
-
formatGroup(
|
|
88
|
+
formatGroup("In file", related.ideasInFile, api),
|
|
89
|
+
formatGroup("Referencing", related.referencingIdeas, api),
|
|
90
|
+
formatGroup("Comment-linked", related.commentLinkedIdeas, api),
|
|
63
91
|
];
|
|
64
|
-
return textContent(sections.join(
|
|
92
|
+
return textContent(sections.join("\n\n"));
|
|
65
93
|
});
|
|
66
|
-
server.
|
|
67
|
-
|
|
68
|
-
|
|
94
|
+
server.registerTool("local_graph", {
|
|
95
|
+
description: "Get the local requirement graph around the first requirement in a file.",
|
|
96
|
+
inputSchema: {
|
|
97
|
+
filePath: z
|
|
98
|
+
.string()
|
|
99
|
+
.describe("Relative or absolute path to a .rq file"),
|
|
100
|
+
depth: z
|
|
101
|
+
.number()
|
|
102
|
+
.int()
|
|
103
|
+
.positive()
|
|
104
|
+
.max(5)
|
|
105
|
+
.optional()
|
|
106
|
+
.describe("Graph hop depth"),
|
|
107
|
+
},
|
|
69
108
|
}, async ({ filePath, depth }) => {
|
|
70
109
|
const graph = await api.getLocalGraph(filePath, depth ?? 1);
|
|
71
110
|
if (!graph) {
|
|
72
111
|
return textContent(`No requirements found in ${filePath}.`);
|
|
73
112
|
}
|
|
74
|
-
const nodes = graph.nodes
|
|
113
|
+
const nodes = graph.nodes
|
|
114
|
+
.map((node) => api.formatIdea(node))
|
|
115
|
+
.join("\n\n");
|
|
75
116
|
const edges = graph.edges
|
|
76
117
|
.slice(0, 30)
|
|
77
|
-
.map(edge => `- ${edge.kind}: ${edge.sourceId} -> ${edge.targetId ?? edge.label ??
|
|
78
|
-
.join(
|
|
79
|
-
return textContent(`Graph around ${graph.centerId} (${graph.nodes.length} nodes, ${graph.edges.length} edges)\n\n${nodes}\n\nEdges:\n${edges ||
|
|
118
|
+
.map((edge) => `- ${edge.kind}: ${edge.sourceId} -> ${edge.targetId ?? edge.label ?? "?"}`)
|
|
119
|
+
.join("\n");
|
|
120
|
+
return textContent(`Graph around ${graph.centerId} (${graph.nodes.length} nodes, ${graph.edges.length} edges)\n\n${nodes}\n\nEdges:\n${edges || "(none)"}`);
|
|
80
121
|
});
|
|
81
|
-
server.
|
|
82
|
-
|
|
83
|
-
|
|
122
|
+
server.registerTool("summarize_subtree", {
|
|
123
|
+
description: "Summarise a requirement subtree rooted at a named requirement.",
|
|
124
|
+
inputSchema: {
|
|
125
|
+
requirementName: z
|
|
126
|
+
.string()
|
|
127
|
+
.describe("Requirement name or search text"),
|
|
128
|
+
depth: z
|
|
129
|
+
.number()
|
|
130
|
+
.int()
|
|
131
|
+
.positive()
|
|
132
|
+
.max(5)
|
|
133
|
+
.optional()
|
|
134
|
+
.describe("Graph hop depth"),
|
|
135
|
+
},
|
|
84
136
|
}, async ({ requirementName, depth }) => {
|
|
85
137
|
const graph = await api.summarizeSubtree(requirementName, depth ?? 2);
|
|
86
138
|
if (!graph) {
|
|
87
139
|
return textContent(`No requirement matched "${requirementName}".`);
|
|
88
140
|
}
|
|
89
|
-
const nodes = graph.nodes
|
|
141
|
+
const nodes = graph.nodes
|
|
142
|
+
.map((node) => api.formatIdea(node))
|
|
143
|
+
.join("\n\n");
|
|
90
144
|
return textContent(`Subtree summary for ${requirementName} (${graph.nodes.length} nodes, depth ${graph.depth})\n\n${nodes}`);
|
|
91
145
|
});
|
|
92
|
-
server.
|
|
93
|
-
|
|
146
|
+
server.registerTool("requirement_reference", {
|
|
147
|
+
description: "Resolve a requirement by name for compact AI context.",
|
|
148
|
+
inputSchema: {
|
|
149
|
+
name: z
|
|
150
|
+
.string()
|
|
151
|
+
.optional()
|
|
152
|
+
.describe("Requirement name or search text"),
|
|
153
|
+
},
|
|
94
154
|
}, async ({ name }) => {
|
|
95
155
|
const ideas = await api.resolveRequirementReference(name);
|
|
96
156
|
if (ideas.length === 0) {
|
|
97
|
-
return textContent(
|
|
157
|
+
return textContent("No matching requirements found.");
|
|
98
158
|
}
|
|
99
|
-
return textContent(ideas.map(idea => api.formatIdea(idea)).join(
|
|
159
|
+
return textContent(ideas.map((idea) => api.formatIdea(idea)).join("\n\n"));
|
|
100
160
|
});
|
|
101
|
-
server.
|
|
102
|
-
|
|
161
|
+
server.registerTool("file_reference", {
|
|
162
|
+
description: "Resolve requirements indexed in matching .rq files.",
|
|
163
|
+
inputSchema: {
|
|
164
|
+
path: z.string().optional().describe("Optional path fragment filter"),
|
|
165
|
+
},
|
|
103
166
|
}, async ({ path }) => {
|
|
104
167
|
const files = await api.resolveFileReference(path);
|
|
105
168
|
if (files.length === 0) {
|
|
106
|
-
return textContent(
|
|
169
|
+
return textContent("No matching .rq files found.");
|
|
107
170
|
}
|
|
108
|
-
const body = files
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
171
|
+
const body = files
|
|
172
|
+
.map((file) => {
|
|
173
|
+
const ideas = file.ideas
|
|
174
|
+
.map((idea) => `- ${idea.name}: ${idea.summary || "(no summary)"}`)
|
|
175
|
+
.join("\n");
|
|
176
|
+
return `## ${file.path}\n${ideas || "- (no requirements indexed)"}`;
|
|
177
|
+
})
|
|
178
|
+
.join("\n\n");
|
|
112
179
|
return textContent(body);
|
|
113
180
|
});
|
|
114
|
-
server.
|
|
181
|
+
server.registerTool("completion_status", {
|
|
182
|
+
description: "Summarise completion and deprecation status across the workspace graph.",
|
|
183
|
+
}, async () => {
|
|
115
184
|
const summary = await api.getCompletionStatus();
|
|
116
185
|
return textContent([
|
|
117
186
|
`Total ideas: ${summary.total}`,
|
|
118
187
|
`Outstanding: ${summary.outstanding.length}`,
|
|
119
188
|
`Deprecated: ${summary.deprecated.length}`,
|
|
120
|
-
`Statuses: ${Object.entries(summary.byStatus)
|
|
121
|
-
|
|
189
|
+
`Statuses: ${Object.entries(summary.byStatus)
|
|
190
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
191
|
+
.join(", ")}`,
|
|
192
|
+
].join("\n"));
|
|
122
193
|
});
|
|
123
|
-
server.
|
|
194
|
+
server.registerTool("list_interactions", {
|
|
195
|
+
description: "Discover available requirement graph interactions and parameters.",
|
|
196
|
+
}, async () => {
|
|
124
197
|
const interactions = api.listInteractions();
|
|
125
|
-
const body = interactions
|
|
198
|
+
const body = interactions
|
|
199
|
+
.map((item) => {
|
|
126
200
|
const params = Object.entries(item.parameters)
|
|
127
201
|
.map(([key, value]) => ` - ${key}: ${value}`)
|
|
128
|
-
.join(
|
|
129
|
-
return `## ${item.name}\n${item.description}\nParameters:\n${params ||
|
|
130
|
-
})
|
|
202
|
+
.join("\n");
|
|
203
|
+
return `## ${item.name}\n${item.description}\nParameters:\n${params || " (none)"}`;
|
|
204
|
+
})
|
|
205
|
+
.join("\n\n");
|
|
131
206
|
return textContent(body);
|
|
132
207
|
});
|
|
133
|
-
server.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
208
|
+
server.registerTool("prompt", {
|
|
209
|
+
description: "Prompt-oriented entry point for working with the requirement graph.",
|
|
210
|
+
inputSchema: {
|
|
211
|
+
intent: z
|
|
212
|
+
.string()
|
|
213
|
+
.describe("What you want to know or do with the requirement graph"),
|
|
214
|
+
filePath: z
|
|
215
|
+
.string()
|
|
216
|
+
.optional()
|
|
217
|
+
.describe("Optional .rq file to scope the prompt"),
|
|
218
|
+
requirementName: z
|
|
219
|
+
.string()
|
|
220
|
+
.optional()
|
|
221
|
+
.describe("Optional requirement name to scope the prompt"),
|
|
222
|
+
},
|
|
137
223
|
}, async ({ intent, filePath, requirementName }) => {
|
|
138
224
|
const sections = [`Intent: ${intent}`];
|
|
139
225
|
if (requirementName) {
|
|
140
226
|
const ideas = await api.resolveRequirementReference(requirementName);
|
|
141
|
-
sections.push(
|
|
142
|
-
? ideas.map(idea => api.formatIdea(idea)).join(
|
|
227
|
+
sections.push("Requirement scope:", ideas.length > 0
|
|
228
|
+
? ideas.map((idea) => api.formatIdea(idea)).join("\n\n")
|
|
143
229
|
: `No requirement matched "${requirementName}".`);
|
|
144
230
|
}
|
|
145
231
|
if (filePath) {
|
|
146
232
|
const related = await api.getFileContext(filePath);
|
|
147
|
-
sections.push(`File scope: ${filePath}`, formatGroup(
|
|
233
|
+
sections.push(`File scope: ${filePath}`, formatGroup("In file", related.ideasInFile, api), formatGroup("Referencing", related.referencingIdeas, api));
|
|
148
234
|
}
|
|
149
235
|
const matches = await api.searchRequirements(intent, 5);
|
|
150
|
-
sections.push(
|
|
151
|
-
? matches.map(match => api.formatIdea(match.idea)).join(
|
|
152
|
-
:
|
|
153
|
-
return textContent(sections.join(
|
|
236
|
+
sections.push("Relevant requirements:", matches.length > 0
|
|
237
|
+
? matches.map((match) => api.formatIdea(match.idea)).join("\n\n")
|
|
238
|
+
: "No direct matches found.");
|
|
239
|
+
return textContent(sections.join("\n\n"));
|
|
154
240
|
});
|
|
155
241
|
const transport = new StdioServerTransport();
|
|
156
242
|
await server.connect(transport);
|
|
@@ -158,10 +244,10 @@ export async function startMcpServer() {
|
|
|
158
244
|
await opened.dispose();
|
|
159
245
|
await server.close();
|
|
160
246
|
};
|
|
161
|
-
process.on(
|
|
247
|
+
process.on("SIGINT", () => {
|
|
162
248
|
void shutdown().finally(() => process.exit(0));
|
|
163
249
|
});
|
|
164
|
-
process.on(
|
|
250
|
+
process.on("SIGTERM", () => {
|
|
165
251
|
void shutdown().finally(() => process.exit(0));
|
|
166
252
|
});
|
|
167
253
|
}
|
|
@@ -169,6 +255,6 @@ function formatGroup(title, ideas, api) {
|
|
|
169
255
|
if (ideas.length === 0) {
|
|
170
256
|
return `${title} (0)\nNone`;
|
|
171
257
|
}
|
|
172
|
-
return `${title} (${ideas.length})\n${ideas.map(idea => api.formatIdea(idea)).join(
|
|
258
|
+
return `${title} (${ideas.length})\n${ideas.map((idea) => api.formatIdea(idea)).join("\n\n")}`;
|
|
173
259
|
}
|
|
174
260
|
//# sourceMappingURL=server.js.map
|
package/out/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reqlan/mcp",
|
|
3
3
|
"description": "MCP server exposing reqlan requirement graph tools",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
7
7
|
"repository": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
28
28
|
"zod": "^3.24.2",
|
|
29
|
-
"@reqlan/analytical": "1.
|
|
29
|
+
"@reqlan/analytical": "1.11.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^26.2.0",
|