@reqlan/mcp 0.2.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 +53 -0
- package/README.template.md +53 -0
- package/bin/mcp.js +6 -0
- package/out/main.d.ts +1 -0
- package/out/main.js +6 -0
- package/out/main.js.map +1 -0
- package/out/server.d.ts +1 -0
- package/out/server.js +174 -0
- package/out/server.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/littletuna4/reqlan/HEAD/site/public/logo.svg" alt="reqlan logo" width="128" height="128">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# @reqlan/mcp
|
|
6
|
+
|
|
7
|
+
MCP server exposing reqlan requirement graph tools
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- Stdio MCP server over `AnalysisApi` — no VS Code host required
|
|
12
|
+
- Tools for search, file context, local graph, subtree summary, and completion status
|
|
13
|
+
- Shared ideas index at `<workspace>/.reqlan/ideas-index.sqlite` (same path as the VS Code extension and CLI)
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g @reqlan/mcp
|
|
19
|
+
# or
|
|
20
|
+
npx @reqlan/mcp
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Cursor
|
|
24
|
+
|
|
25
|
+
Add to `.cursor/mcp.json`:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"mcpServers": {
|
|
30
|
+
"reqlan": {
|
|
31
|
+
"command": "npx",
|
|
32
|
+
"args": ["-y", "@reqlan/mcp"],
|
|
33
|
+
"env": {
|
|
34
|
+
"REQLAN_WORKSPACE": "${workspaceFolder}"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Set `REQLAN_WORKSPACE` to the workspace root (or run from that directory). Override the storage directory with `REQLAN_INDEX_PATH` when needed.
|
|
42
|
+
|
|
43
|
+
## Links
|
|
44
|
+
|
|
45
|
+
- [Site](https://reqlan.com)
|
|
46
|
+
- [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=reqlan.reqlan-extension)
|
|
47
|
+
- [Open VSX](https://open-vsx.org/extension/reqlan/reqlan-extension)
|
|
48
|
+
- [GitHub repository](https://github.com/littletuna4/reqlan)
|
|
49
|
+
- [Contact](mailto:reqlan@reqlan.com)
|
|
50
|
+
|
|
51
|
+
## Changelog
|
|
52
|
+
|
|
53
|
+
_No releases yet._
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="{{LOGO_URL}}" alt="reqlan logo" width="128" height="128">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# {{PACKAGE_NAME}}
|
|
6
|
+
|
|
7
|
+
{{DESCRIPTION}}
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- Stdio MCP server over `AnalysisApi` — no VS Code host required
|
|
12
|
+
- Tools for search, file context, local graph, subtree summary, and completion status
|
|
13
|
+
- Shared ideas index at `<workspace>/.reqlan/ideas-index.sqlite` (same path as the VS Code extension and CLI)
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g @reqlan/mcp
|
|
19
|
+
# or
|
|
20
|
+
npx @reqlan/mcp
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Cursor
|
|
24
|
+
|
|
25
|
+
Add to `.cursor/mcp.json`:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"mcpServers": {
|
|
30
|
+
"reqlan": {
|
|
31
|
+
"command": "npx",
|
|
32
|
+
"args": ["-y", "@reqlan/mcp"],
|
|
33
|
+
"env": {
|
|
34
|
+
"REQLAN_WORKSPACE": "${workspaceFolder}"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Set `REQLAN_WORKSPACE` to the workspace root (or run from that directory). Override the storage directory with `REQLAN_INDEX_PATH` when needed.
|
|
42
|
+
|
|
43
|
+
## Links
|
|
44
|
+
|
|
45
|
+
- [{{SITE_LABEL}}]({{SITE_URL}})
|
|
46
|
+
- [{{VSC_LABEL}}]({{VSC_URL}})
|
|
47
|
+
- [{{OPENVSX_LABEL}}]({{OPENVSX_URL}})
|
|
48
|
+
- [GitHub repository]({{GITHUB_URL}})
|
|
49
|
+
- [Contact]({{EMAIL_URL}})
|
|
50
|
+
|
|
51
|
+
## Changelog
|
|
52
|
+
|
|
53
|
+
{{CHANGELOG}}
|
package/bin/mcp.js
ADDED
package/out/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/out/main.js
ADDED
package/out/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,cAAc,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
package/out/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startMcpServer(): Promise<void>;
|
package/out/server.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { openAnalysisApi } from '@reqlan/analytical/core';
|
|
5
|
+
function resolveWorkspaceRoot() {
|
|
6
|
+
const fromEnv = process.env.REQLAN_WORKSPACE?.trim();
|
|
7
|
+
if (fromEnv) {
|
|
8
|
+
return fromEnv;
|
|
9
|
+
}
|
|
10
|
+
return process.cwd();
|
|
11
|
+
}
|
|
12
|
+
function textContent(text) {
|
|
13
|
+
return { content: [{ type: 'text', text }] };
|
|
14
|
+
}
|
|
15
|
+
export async function startMcpServer() {
|
|
16
|
+
const workspaceRoot = resolveWorkspaceRoot();
|
|
17
|
+
const opened = await openAnalysisApi({
|
|
18
|
+
workspaceRoot,
|
|
19
|
+
storagePath: process.env.REQLAN_INDEX_PATH
|
|
20
|
+
});
|
|
21
|
+
const api = opened.api;
|
|
22
|
+
const server = new McpServer({
|
|
23
|
+
name: 'reqlan',
|
|
24
|
+
version: '0.0.1'
|
|
25
|
+
});
|
|
26
|
+
server.tool('search_requirements', 'Search requirements by keyword across names, summaries, tags, and references. Optional context paths/ideas bias ranking by graph hop distance.', {
|
|
27
|
+
query: z.string().describe('Search text'),
|
|
28
|
+
limit: z.number().int().positive().max(50).optional().describe('Maximum number of matches'),
|
|
29
|
+
context: z
|
|
30
|
+
.array(z.string())
|
|
31
|
+
.optional()
|
|
32
|
+
.describe('Relative .rq paths, path#idea refs, or idea names that bias ranking by hop distance')
|
|
33
|
+
}, async ({ query, limit, context }) => {
|
|
34
|
+
const matches = await api.searchRequirements(query, limit ?? 8, context?.length ? { context } : undefined);
|
|
35
|
+
if (matches.length === 0) {
|
|
36
|
+
return textContent(`No requirements matched "${query}".`);
|
|
37
|
+
}
|
|
38
|
+
const body = matches.map(match => {
|
|
39
|
+
const reasons = match.reasons?.length ? `\nReasons: ${match.reasons.join(', ')}` : '';
|
|
40
|
+
const score = match.score !== undefined ? `\nScore: ${match.score}` : '';
|
|
41
|
+
return `${api.formatIdea(match.idea)}${score}${reasons}`;
|
|
42
|
+
}).join('\n\n');
|
|
43
|
+
return textContent(body);
|
|
44
|
+
});
|
|
45
|
+
server.tool('list_requirements', 'List indexed requirements in the workspace.', {
|
|
46
|
+
limit: z.number().int().positive().max(100).optional().describe('Maximum number of requirements')
|
|
47
|
+
}, async ({ limit }) => {
|
|
48
|
+
const ideas = await api.listRequirements(limit ?? 50);
|
|
49
|
+
if (ideas.length === 0) {
|
|
50
|
+
return textContent('No requirements indexed in the workspace.');
|
|
51
|
+
}
|
|
52
|
+
return textContent(ideas.map(idea => api.formatIdea(idea)).join('\n\n'));
|
|
53
|
+
});
|
|
54
|
+
server.tool('file_context', 'Get requirements in, referencing, or comment-linked to a file.', {
|
|
55
|
+
filePath: z.string().describe('Relative or absolute path to a .rq file')
|
|
56
|
+
}, async ({ filePath }) => {
|
|
57
|
+
const related = await api.getFileContext(filePath);
|
|
58
|
+
const sections = [
|
|
59
|
+
`File: ${filePath}`,
|
|
60
|
+
formatGroup('In file', related.ideasInFile, api),
|
|
61
|
+
formatGroup('Referencing', related.referencingIdeas, api),
|
|
62
|
+
formatGroup('Comment-linked', related.commentLinkedIdeas, api)
|
|
63
|
+
];
|
|
64
|
+
return textContent(sections.join('\n\n'));
|
|
65
|
+
});
|
|
66
|
+
server.tool('local_graph', 'Get the local requirement graph around the first requirement in a file.', {
|
|
67
|
+
filePath: z.string().describe('Relative or absolute path to a .rq file'),
|
|
68
|
+
depth: z.number().int().positive().max(5).optional().describe('Graph hop depth')
|
|
69
|
+
}, async ({ filePath, depth }) => {
|
|
70
|
+
const graph = await api.getLocalGraph(filePath, depth ?? 1);
|
|
71
|
+
if (!graph) {
|
|
72
|
+
return textContent(`No requirements found in ${filePath}.`);
|
|
73
|
+
}
|
|
74
|
+
const nodes = graph.nodes.map(node => api.formatIdea(node)).join('\n\n');
|
|
75
|
+
const edges = graph.edges
|
|
76
|
+
.slice(0, 30)
|
|
77
|
+
.map(edge => `- ${edge.kind}: ${edge.sourceId} -> ${edge.targetId ?? edge.label ?? '?'}`)
|
|
78
|
+
.join('\n');
|
|
79
|
+
return textContent(`Graph around ${graph.centerId} (${graph.nodes.length} nodes, ${graph.edges.length} edges)\n\n${nodes}\n\nEdges:\n${edges || '(none)'}`);
|
|
80
|
+
});
|
|
81
|
+
server.tool('summarize_subtree', 'Summarise a requirement subtree rooted at a named requirement.', {
|
|
82
|
+
requirementName: z.string().describe('Requirement name or search text'),
|
|
83
|
+
depth: z.number().int().positive().max(5).optional().describe('Graph hop depth')
|
|
84
|
+
}, async ({ requirementName, depth }) => {
|
|
85
|
+
const graph = await api.summarizeSubtree(requirementName, depth ?? 2);
|
|
86
|
+
if (!graph) {
|
|
87
|
+
return textContent(`No requirement matched "${requirementName}".`);
|
|
88
|
+
}
|
|
89
|
+
const nodes = graph.nodes.map(node => api.formatIdea(node)).join('\n\n');
|
|
90
|
+
return textContent(`Subtree summary for ${requirementName} (${graph.nodes.length} nodes, depth ${graph.depth})\n\n${nodes}`);
|
|
91
|
+
});
|
|
92
|
+
server.tool('requirement_reference', 'Resolve a requirement by name for compact AI context.', {
|
|
93
|
+
name: z.string().optional().describe('Requirement name or search text')
|
|
94
|
+
}, async ({ name }) => {
|
|
95
|
+
const ideas = await api.resolveRequirementReference(name);
|
|
96
|
+
if (ideas.length === 0) {
|
|
97
|
+
return textContent('No matching requirements found.');
|
|
98
|
+
}
|
|
99
|
+
return textContent(ideas.map(idea => api.formatIdea(idea)).join('\n\n'));
|
|
100
|
+
});
|
|
101
|
+
server.tool('file_reference', 'Resolve requirements indexed in matching .rq files.', {
|
|
102
|
+
path: z.string().optional().describe('Optional path fragment filter')
|
|
103
|
+
}, async ({ path }) => {
|
|
104
|
+
const files = await api.resolveFileReference(path);
|
|
105
|
+
if (files.length === 0) {
|
|
106
|
+
return textContent('No matching .rq files found.');
|
|
107
|
+
}
|
|
108
|
+
const body = files.map(file => {
|
|
109
|
+
const ideas = file.ideas.map(idea => `- ${idea.name}: ${idea.summary || '(no summary)'}`).join('\n');
|
|
110
|
+
return `## ${file.path}\n${ideas || '- (no requirements indexed)'}`;
|
|
111
|
+
}).join('\n\n');
|
|
112
|
+
return textContent(body);
|
|
113
|
+
});
|
|
114
|
+
server.tool('completion_status', 'Summarise completion and deprecation status across the workspace graph.', {}, async () => {
|
|
115
|
+
const summary = await api.getCompletionStatus();
|
|
116
|
+
return textContent([
|
|
117
|
+
`Total ideas: ${summary.total}`,
|
|
118
|
+
`Outstanding: ${summary.outstanding.length}`,
|
|
119
|
+
`Deprecated: ${summary.deprecated.length}`,
|
|
120
|
+
`Statuses: ${Object.entries(summary.byStatus).map(([key, value]) => `${key}=${value}`).join(', ')}`
|
|
121
|
+
].join('\n'));
|
|
122
|
+
});
|
|
123
|
+
server.tool('list_interactions', 'Discover available requirement graph interactions and parameters.', {}, async () => {
|
|
124
|
+
const interactions = api.listInteractions();
|
|
125
|
+
const body = interactions.map(item => {
|
|
126
|
+
const params = Object.entries(item.parameters)
|
|
127
|
+
.map(([key, value]) => ` - ${key}: ${value}`)
|
|
128
|
+
.join('\n');
|
|
129
|
+
return `## ${item.name}\n${item.description}\nParameters:\n${params || ' (none)'}`;
|
|
130
|
+
}).join('\n\n');
|
|
131
|
+
return textContent(body);
|
|
132
|
+
});
|
|
133
|
+
server.tool('prompt', 'Prompt-oriented entry point for working with the requirement graph.', {
|
|
134
|
+
intent: z.string().describe('What you want to know or do with the requirement graph'),
|
|
135
|
+
filePath: z.string().optional().describe('Optional .rq file to scope the prompt'),
|
|
136
|
+
requirementName: z.string().optional().describe('Optional requirement name to scope the prompt')
|
|
137
|
+
}, async ({ intent, filePath, requirementName }) => {
|
|
138
|
+
const sections = [`Intent: ${intent}`];
|
|
139
|
+
if (requirementName) {
|
|
140
|
+
const ideas = await api.resolveRequirementReference(requirementName);
|
|
141
|
+
sections.push('Requirement scope:', ideas.length > 0
|
|
142
|
+
? ideas.map(idea => api.formatIdea(idea)).join('\n\n')
|
|
143
|
+
: `No requirement matched "${requirementName}".`);
|
|
144
|
+
}
|
|
145
|
+
if (filePath) {
|
|
146
|
+
const related = await api.getFileContext(filePath);
|
|
147
|
+
sections.push(`File scope: ${filePath}`, formatGroup('In file', related.ideasInFile, api), formatGroup('Referencing', related.referencingIdeas, api));
|
|
148
|
+
}
|
|
149
|
+
const matches = await api.searchRequirements(intent, 5);
|
|
150
|
+
sections.push('Relevant requirements:', matches.length > 0
|
|
151
|
+
? matches.map(match => api.formatIdea(match.idea)).join('\n\n')
|
|
152
|
+
: 'No direct matches found.');
|
|
153
|
+
return textContent(sections.join('\n\n'));
|
|
154
|
+
});
|
|
155
|
+
const transport = new StdioServerTransport();
|
|
156
|
+
await server.connect(transport);
|
|
157
|
+
const shutdown = async () => {
|
|
158
|
+
await opened.dispose();
|
|
159
|
+
await server.close();
|
|
160
|
+
};
|
|
161
|
+
process.on('SIGINT', () => {
|
|
162
|
+
void shutdown().finally(() => process.exit(0));
|
|
163
|
+
});
|
|
164
|
+
process.on('SIGTERM', () => {
|
|
165
|
+
void shutdown().finally(() => process.exit(0));
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
function formatGroup(title, ideas, api) {
|
|
169
|
+
if (ideas.length === 0) {
|
|
170
|
+
return `${title} (0)\nNone`;
|
|
171
|
+
}
|
|
172
|
+
return `${title} (${ideas.length})\n${ideas.map(idea => api.formatIdea(idea)).join('\n\n')}`;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@reqlan/mcp",
|
|
3
|
+
"description": "MCP server exposing reqlan requirement graph tools",
|
|
4
|
+
"version": "0.2.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "AGPL-3.0-only",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/littletuna4/reqlan.git"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=20.10.0",
|
|
13
|
+
"npm": ">=10.2.3"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"bin",
|
|
17
|
+
"out"
|
|
18
|
+
],
|
|
19
|
+
"bin": {
|
|
20
|
+
"reqlan-mcp": "./bin/mcp.js"
|
|
21
|
+
},
|
|
22
|
+
"main": "./out/main.js",
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
28
|
+
"zod": "^3.24.2",
|
|
29
|
+
"@reqlan/analytical": "0.10.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"shx": "~0.4.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"clean": "shx rm -fr *.tsbuildinfo out",
|
|
36
|
+
"build": "tsc -b tsconfig.json",
|
|
37
|
+
"build:clean": "pnpm run clean && pnpm run build",
|
|
38
|
+
"start": "node ./bin/mcp.js"
|
|
39
|
+
}
|
|
40
|
+
}
|