@kongyo2/mcp-request-context 1.0.2 → 1.0.3
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/dist/core/storage.d.ts +47 -20
- package/dist/core/storage.d.ts.map +1 -1
- package/dist/core/storage.js +90 -195
- package/dist/core/storage.js.map +1 -1
- package/dist/dashboard/server.d.ts +3 -3
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +33 -80
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.js +25 -57
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +8 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +59 -68
- package/dist/server.js.map +1 -1
- package/dist/tools/get-context-response.d.ts +5 -21
- package/dist/tools/get-context-response.d.ts.map +1 -1
- package/dist/tools/get-context-response.js +30 -26
- package/dist/tools/get-context-response.js.map +1 -1
- package/dist/tools/index.d.ts +6 -7
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +38 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/request-context.d.ts +5 -45
- package/dist/tools/request-context.d.ts.map +1 -1
- package/dist/tools/request-context.js +77 -64
- package/dist/tools/request-context.js.map +1 -1
- package/dist/tools/types.d.ts +7 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/package.json +1 -2
package/dist/dashboard/server.js
CHANGED
|
@@ -3,7 +3,6 @@ import fastifyStatic from '@fastify/static';
|
|
|
3
3
|
import fastifyWebsocket from '@fastify/websocket';
|
|
4
4
|
import fastifyCors from '@fastify/cors';
|
|
5
5
|
import { join, dirname } from 'path';
|
|
6
|
-
import { promises as fs } from 'fs';
|
|
7
6
|
import { fileURLToPath } from 'url';
|
|
8
7
|
import open from 'open';
|
|
9
8
|
import { WebSocket } from 'ws';
|
|
@@ -12,23 +11,19 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
12
11
|
export class DashboardServer {
|
|
13
12
|
app;
|
|
14
13
|
storage;
|
|
15
|
-
projectPath;
|
|
16
14
|
options;
|
|
15
|
+
ownsStorage;
|
|
17
16
|
clients = new Set();
|
|
18
17
|
heartbeatInterval;
|
|
19
18
|
HEARTBEAT_INTERVAL_MS = 30000;
|
|
20
|
-
constructor(
|
|
21
|
-
this.projectPath = projectPath;
|
|
19
|
+
constructor(options = {}) {
|
|
22
20
|
this.options = options;
|
|
23
|
-
|
|
21
|
+
// 外部からストレージが渡された場合はそれを使用、なければ新規作成
|
|
22
|
+
this.storage = options.storage ?? new ContextStorage();
|
|
23
|
+
this.ownsStorage = !options.storage;
|
|
24
24
|
this.app = fastify({ logger: false });
|
|
25
25
|
}
|
|
26
26
|
async start() {
|
|
27
|
-
// Initialize storage
|
|
28
|
-
const initResult = await this.storage.start();
|
|
29
|
-
if (initResult.isErr()) {
|
|
30
|
-
throw new Error(`Failed to initialize storage: ${initResult.error.message}`);
|
|
31
|
-
}
|
|
32
27
|
// Setup storage event listeners
|
|
33
28
|
this.setupStorageEvents();
|
|
34
29
|
// Register plugins
|
|
@@ -68,14 +63,12 @@ export class DashboardServer {
|
|
|
68
63
|
await this.app.listen({ port, host: '127.0.0.1' });
|
|
69
64
|
// Start heartbeat
|
|
70
65
|
this.startHeartbeat();
|
|
71
|
-
// Save session info
|
|
72
66
|
const dashboardUrl = `http://localhost:${port}`;
|
|
73
|
-
await this.saveSession(dashboardUrl, port);
|
|
74
67
|
// Open browser if requested
|
|
75
68
|
if (this.options.autoOpen) {
|
|
76
69
|
await open(dashboardUrl);
|
|
77
70
|
}
|
|
78
|
-
console.
|
|
71
|
+
console.error(`Dashboard running at: ${dashboardUrl}`);
|
|
79
72
|
return dashboardUrl;
|
|
80
73
|
}
|
|
81
74
|
setupStorageEvents() {
|
|
@@ -100,27 +93,23 @@ export class DashboardServer {
|
|
|
100
93
|
timestamp: new Date().toISOString()
|
|
101
94
|
});
|
|
102
95
|
});
|
|
103
|
-
this.storage.on('
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
});
|
|
111
|
-
}
|
|
96
|
+
this.storage.on('request-updated', () => {
|
|
97
|
+
const requests = this.storage.getAllRequests();
|
|
98
|
+
this.broadcast({
|
|
99
|
+
type: 'request-updated',
|
|
100
|
+
data: requests,
|
|
101
|
+
timestamp: new Date().toISOString()
|
|
102
|
+
});
|
|
112
103
|
});
|
|
113
104
|
}
|
|
114
|
-
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
socket.send(JSON.stringify(message));
|
|
123
|
-
}
|
|
105
|
+
sendInitialData(socket) {
|
|
106
|
+
const requests = this.storage.getAllRequests();
|
|
107
|
+
const message = {
|
|
108
|
+
type: 'initial',
|
|
109
|
+
data: requests,
|
|
110
|
+
timestamp: new Date().toISOString()
|
|
111
|
+
};
|
|
112
|
+
socket.send(JSON.stringify(message));
|
|
124
113
|
}
|
|
125
114
|
registerApiRoutes() {
|
|
126
115
|
// Health check
|
|
@@ -128,24 +117,16 @@ export class DashboardServer {
|
|
|
128
117
|
return { status: 'ok', timestamp: new Date().toISOString() };
|
|
129
118
|
});
|
|
130
119
|
// Get all requests
|
|
131
|
-
this.app.get('/api/requests', async (
|
|
132
|
-
|
|
133
|
-
if (result.isErr()) {
|
|
134
|
-
return reply.code(500).send({ error: result.error.message });
|
|
135
|
-
}
|
|
136
|
-
return result.value;
|
|
120
|
+
this.app.get('/api/requests', async () => {
|
|
121
|
+
return this.storage.getAllRequests();
|
|
137
122
|
});
|
|
138
123
|
// Get pending requests
|
|
139
|
-
this.app.get('/api/requests/pending', async (
|
|
140
|
-
|
|
141
|
-
if (result.isErr()) {
|
|
142
|
-
return reply.code(500).send({ error: result.error.message });
|
|
143
|
-
}
|
|
144
|
-
return result.value;
|
|
124
|
+
this.app.get('/api/requests/pending', async () => {
|
|
125
|
+
return this.storage.getPendingRequests();
|
|
145
126
|
});
|
|
146
127
|
// Get single request
|
|
147
128
|
this.app.get('/api/requests/:id', async (request, reply) => {
|
|
148
|
-
const result =
|
|
129
|
+
const result = this.storage.getRequest(request.params.id);
|
|
149
130
|
if (result.isErr()) {
|
|
150
131
|
const code = result.error.code === 'NOT_FOUND' ? 404 : 500;
|
|
151
132
|
return reply.code(code).send({ error: result.error.message });
|
|
@@ -159,7 +140,7 @@ export class DashboardServer {
|
|
|
159
140
|
if (!response || typeof response !== 'string') {
|
|
160
141
|
return reply.code(400).send({ error: 'Response is required' });
|
|
161
142
|
}
|
|
162
|
-
const result =
|
|
143
|
+
const result = this.storage.answerRequest({
|
|
163
144
|
requestId: id,
|
|
164
145
|
response
|
|
165
146
|
});
|
|
@@ -171,7 +152,7 @@ export class DashboardServer {
|
|
|
171
152
|
});
|
|
172
153
|
// Cancel a request
|
|
173
154
|
this.app.post('/api/requests/:id/cancel', async (request, reply) => {
|
|
174
|
-
const result =
|
|
155
|
+
const result = this.storage.cancelRequest(request.params.id);
|
|
175
156
|
if (result.isErr()) {
|
|
176
157
|
const code = result.error.code === 'NOT_FOUND' ? 404 : 500;
|
|
177
158
|
return reply.code(code).send({ error: result.error.message });
|
|
@@ -180,20 +161,13 @@ export class DashboardServer {
|
|
|
180
161
|
});
|
|
181
162
|
// Delete a request
|
|
182
163
|
this.app.delete('/api/requests/:id', async (request, reply) => {
|
|
183
|
-
const result =
|
|
164
|
+
const result = this.storage.deleteRequest(request.params.id);
|
|
184
165
|
if (result.isErr()) {
|
|
185
166
|
const code = result.error.code === 'NOT_FOUND' ? 404 : 500;
|
|
186
167
|
return reply.code(code).send({ error: result.error.message });
|
|
187
168
|
}
|
|
188
169
|
return { success: true };
|
|
189
170
|
});
|
|
190
|
-
// Project info
|
|
191
|
-
this.app.get('/api/project', async () => {
|
|
192
|
-
return {
|
|
193
|
-
projectPath: this.projectPath,
|
|
194
|
-
storagePath: this.storage.getStoragePath()
|
|
195
|
-
};
|
|
196
|
-
});
|
|
197
171
|
}
|
|
198
172
|
broadcast(message) {
|
|
199
173
|
const messageStr = JSON.stringify(message);
|
|
@@ -222,22 +196,6 @@ export class DashboardServer {
|
|
|
222
196
|
}
|
|
223
197
|
}, this.HEARTBEAT_INTERVAL_MS);
|
|
224
198
|
}
|
|
225
|
-
async saveSession(url, port) {
|
|
226
|
-
const sessionPath = join(this.projectPath, '.mcp-request-context', 'dashboard-session.json');
|
|
227
|
-
const session = {
|
|
228
|
-
url,
|
|
229
|
-
port,
|
|
230
|
-
pid: process.pid,
|
|
231
|
-
startedAt: new Date().toISOString()
|
|
232
|
-
};
|
|
233
|
-
try {
|
|
234
|
-
await fs.mkdir(dirname(sessionPath), { recursive: true });
|
|
235
|
-
await fs.writeFile(sessionPath, JSON.stringify(session, null, 2), 'utf-8');
|
|
236
|
-
}
|
|
237
|
-
catch (error) {
|
|
238
|
-
console.error('Failed to save session:', error);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
199
|
async stop() {
|
|
242
200
|
if (this.heartbeatInterval) {
|
|
243
201
|
clearInterval(this.heartbeatInterval);
|
|
@@ -251,16 +209,11 @@ export class DashboardServer {
|
|
|
251
209
|
}
|
|
252
210
|
}
|
|
253
211
|
this.clients.clear();
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
const sessionPath = join(this.projectPath, '.mcp-request-context', 'dashboard-session.json');
|
|
258
|
-
try {
|
|
259
|
-
await fs.unlink(sessionPath);
|
|
260
|
-
}
|
|
261
|
-
catch {
|
|
262
|
-
// Ignore
|
|
212
|
+
// 自分が作成したストレージのみ停止
|
|
213
|
+
if (this.ownsStorage) {
|
|
214
|
+
this.storage.stop();
|
|
263
215
|
}
|
|
216
|
+
await this.app.close();
|
|
264
217
|
}
|
|
265
218
|
getStorage() {
|
|
266
219
|
return this.storage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4B,MAAM,SAAS,CAAC;AACnD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { resolve } from 'path';
|
|
3
2
|
import { RequestContextMCPServer } from './server.js';
|
|
4
|
-
import { DashboardServer } from './dashboard/server.js';
|
|
5
3
|
function parseArgs() {
|
|
6
4
|
const args = process.argv.slice(2);
|
|
7
5
|
const result = {
|
|
8
|
-
|
|
9
|
-
dashboard: false,
|
|
10
|
-
open: true
|
|
6
|
+
noOpen: false
|
|
11
7
|
};
|
|
12
8
|
for (let i = 0; i < args.length; i++) {
|
|
13
9
|
const arg = args[i] ?? '';
|
|
14
|
-
if (arg === '--
|
|
15
|
-
result.dashboard = true;
|
|
16
|
-
}
|
|
17
|
-
else if (arg === '--port' || arg === '-p') {
|
|
10
|
+
if (arg === '--port' || arg === '-p') {
|
|
18
11
|
const nextArg = args[i + 1] ?? '';
|
|
19
12
|
if (nextArg && !nextArg.startsWith('-')) {
|
|
20
13
|
result.port = parseInt(nextArg, 10);
|
|
@@ -22,15 +15,12 @@ function parseArgs() {
|
|
|
22
15
|
}
|
|
23
16
|
}
|
|
24
17
|
else if (arg === '--no-open') {
|
|
25
|
-
result.
|
|
18
|
+
result.noOpen = true;
|
|
26
19
|
}
|
|
27
20
|
else if (arg === '--help' || arg === '-h') {
|
|
28
21
|
printHelp();
|
|
29
22
|
process.exit(0);
|
|
30
23
|
}
|
|
31
|
-
else if (arg && !arg.startsWith('-')) {
|
|
32
|
-
result.projectPath = resolve(arg);
|
|
33
|
-
}
|
|
34
24
|
}
|
|
35
25
|
return result;
|
|
36
26
|
}
|
|
@@ -39,26 +29,19 @@ function printHelp() {
|
|
|
39
29
|
MCP Request Context - LLM agents request context from humans
|
|
40
30
|
|
|
41
31
|
Usage:
|
|
42
|
-
mcp-request-context [
|
|
32
|
+
mcp-request-context [options]
|
|
43
33
|
|
|
44
34
|
Options:
|
|
45
|
-
--dashboard, -d Start the dashboard server instead of MCP server
|
|
46
35
|
--port, -p <port> Dashboard port (default: 5100)
|
|
47
36
|
--no-open Don't auto-open browser for dashboard
|
|
48
37
|
--help, -h Show this help message
|
|
49
38
|
|
|
50
39
|
Examples:
|
|
51
|
-
# Start MCP server
|
|
40
|
+
# Start MCP server with integrated dashboard (browser auto-opens)
|
|
52
41
|
mcp-request-context
|
|
53
42
|
|
|
54
|
-
# Start
|
|
55
|
-
mcp-request-context
|
|
56
|
-
|
|
57
|
-
# Start dashboard server
|
|
58
|
-
mcp-request-context --dashboard
|
|
59
|
-
|
|
60
|
-
# Start dashboard on custom port without auto-opening browser
|
|
61
|
-
mcp-request-context --dashboard --port 5200 --no-open
|
|
43
|
+
# Start on custom port without auto-opening browser
|
|
44
|
+
mcp-request-context --port 5200 --no-open
|
|
62
45
|
|
|
63
46
|
MCP Configuration:
|
|
64
47
|
Add to your MCP settings:
|
|
@@ -66,7 +49,7 @@ MCP Configuration:
|
|
|
66
49
|
"mcpServers": {
|
|
67
50
|
"request-context": {
|
|
68
51
|
"command": "npx",
|
|
69
|
-
"args": ["-y", "mcp-request-context"
|
|
52
|
+
"args": ["-y", "@kongyo2/mcp-request-context"]
|
|
70
53
|
}
|
|
71
54
|
}
|
|
72
55
|
}
|
|
@@ -74,39 +57,24 @@ MCP Configuration:
|
|
|
74
57
|
}
|
|
75
58
|
async function main() {
|
|
76
59
|
const args = parseArgs();
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const url = await dashboard.start();
|
|
92
|
-
console.log(`\nDashboard running at: ${url}`);
|
|
93
|
-
console.log('Press Ctrl+C to stop\n');
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
console.error('Failed to start dashboard:', error);
|
|
97
|
-
process.exit(1);
|
|
98
|
-
}
|
|
60
|
+
// MCP + Dashboard 統合サーバーを起動
|
|
61
|
+
const server = new RequestContextMCPServer({
|
|
62
|
+
port: args.port,
|
|
63
|
+
autoOpen: !args.noOpen // デフォルトでブラウザを開く
|
|
64
|
+
});
|
|
65
|
+
const handleShutdown = async () => {
|
|
66
|
+
console.error('\nShutting down...');
|
|
67
|
+
await server.stop();
|
|
68
|
+
process.exit(0);
|
|
69
|
+
};
|
|
70
|
+
process.on('SIGINT', handleShutdown);
|
|
71
|
+
process.on('SIGTERM', handleShutdown);
|
|
72
|
+
try {
|
|
73
|
+
await server.initialize();
|
|
99
74
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
try {
|
|
104
|
-
await server.initialize();
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
console.error('Failed to start MCP server:', error);
|
|
108
|
-
process.exit(1);
|
|
109
|
-
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error('Failed to start server:', error);
|
|
77
|
+
process.exit(1);
|
|
110
78
|
}
|
|
111
79
|
}
|
|
112
80
|
main().catch((error) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAOtD,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAY;QACtB,MAAM,EAAE,KAAK;KACd,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1B,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACpC,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Bb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,4BAA4B;IAC5B,MAAM,MAAM,GAAG,IAAI,uBAAuB,CAAC;QACzC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAE,gBAAgB;KACzC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { ContextStorage } from './core/storage.js';
|
|
2
|
+
export interface MCPServerOptions {
|
|
3
|
+
port?: number;
|
|
4
|
+
autoOpen?: boolean;
|
|
5
|
+
}
|
|
2
6
|
export declare class RequestContextMCPServer {
|
|
3
7
|
private server;
|
|
4
8
|
private storage;
|
|
5
|
-
private
|
|
9
|
+
private dashboard;
|
|
6
10
|
private dashboardUrl?;
|
|
7
|
-
constructor(
|
|
11
|
+
constructor(options?: MCPServerOptions);
|
|
8
12
|
initialize(): Promise<void>;
|
|
9
|
-
private
|
|
13
|
+
private setupHandlers;
|
|
10
14
|
stop(): Promise<void>;
|
|
11
15
|
getStorage(): ContextStorage;
|
|
16
|
+
getDashboardUrl(): string | undefined;
|
|
12
17
|
}
|
|
13
18
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASnD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,OAAO,GAAE,gBAAqB;IA2CpC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CjC,OAAO,CAAC,aAAa;IAqBf,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,UAAU,IAAI,cAAc;IAI5B,eAAe,IAAI,MAAM,GAAG,SAAS;CAGtC"}
|
package/dist/server.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
3
4
|
import { ContextStorage } from './core/storage.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { registerTools, handleToolCall } from './tools/index.js';
|
|
6
|
+
import { DashboardServer } from './dashboard/server.js';
|
|
6
7
|
import { readFileSync, existsSync } from 'fs';
|
|
7
8
|
import { join, dirname } from 'path';
|
|
8
9
|
import { fileURLToPath } from 'url';
|
|
@@ -10,11 +11,17 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
10
11
|
export class RequestContextMCPServer {
|
|
11
12
|
server;
|
|
12
13
|
storage;
|
|
13
|
-
|
|
14
|
+
dashboard;
|
|
14
15
|
dashboardUrl;
|
|
15
|
-
constructor(
|
|
16
|
-
|
|
17
|
-
this.storage = new ContextStorage(
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
// 共有ストレージを作成
|
|
18
|
+
this.storage = new ContextStorage();
|
|
19
|
+
// ダッシュボードを同じストレージで初期化
|
|
20
|
+
this.dashboard = new DashboardServer({
|
|
21
|
+
storage: this.storage,
|
|
22
|
+
port: options.port ?? 5100,
|
|
23
|
+
autoOpen: options.autoOpen ?? true // デフォルトでブラウザを開く
|
|
24
|
+
});
|
|
18
25
|
// Get version from package.json
|
|
19
26
|
let version = '1.0.0';
|
|
20
27
|
try {
|
|
@@ -27,43 +34,49 @@ export class RequestContextMCPServer {
|
|
|
27
34
|
catch {
|
|
28
35
|
// Use default version
|
|
29
36
|
}
|
|
30
|
-
|
|
37
|
+
// Get all registered tools
|
|
38
|
+
const tools = registerTools();
|
|
39
|
+
// Create tools capability object with each tool name
|
|
40
|
+
const toolsCapability = tools.reduce((acc, tool) => {
|
|
41
|
+
acc[tool.name] = {};
|
|
42
|
+
return acc;
|
|
43
|
+
}, {});
|
|
44
|
+
this.server = new Server({
|
|
31
45
|
name: 'mcp-request-context',
|
|
32
46
|
version
|
|
47
|
+
}, {
|
|
48
|
+
capabilities: {
|
|
49
|
+
tools: toolsCapability
|
|
50
|
+
}
|
|
33
51
|
});
|
|
34
52
|
}
|
|
35
53
|
async initialize() {
|
|
36
|
-
//
|
|
37
|
-
const initResult = await this.storage.initialize();
|
|
38
|
-
if (initResult.isErr()) {
|
|
39
|
-
throw new Error(`Failed to initialize storage: ${initResult.error.message}`);
|
|
40
|
-
}
|
|
41
|
-
// Start storage watcher
|
|
42
|
-
const startResult = await this.storage.start();
|
|
43
|
-
if (startResult.isErr()) {
|
|
44
|
-
throw new Error(`Failed to start storage: ${startResult.error.message}`);
|
|
45
|
-
}
|
|
46
|
-
// Try to get dashboard URL from session file
|
|
54
|
+
// ダッシュボードを先に起動
|
|
47
55
|
try {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const sessionData = JSON.parse(readFileSync(sessionPath, 'utf-8'));
|
|
51
|
-
this.dashboardUrl = sessionData.url;
|
|
52
|
-
}
|
|
56
|
+
this.dashboardUrl = await this.dashboard.start();
|
|
57
|
+
console.error(`Dashboard started at: ${this.dashboardUrl}`);
|
|
53
58
|
}
|
|
54
|
-
catch {
|
|
55
|
-
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error('Failed to start dashboard:', error);
|
|
61
|
+
throw error;
|
|
56
62
|
}
|
|
57
|
-
//
|
|
58
|
-
|
|
63
|
+
// Create context for tools
|
|
64
|
+
const context = {
|
|
65
|
+
projectPath: process.cwd(),
|
|
66
|
+
storage: this.storage,
|
|
67
|
+
dashboardUrl: this.dashboardUrl
|
|
68
|
+
};
|
|
69
|
+
// Register handlers
|
|
70
|
+
this.setupHandlers(context);
|
|
59
71
|
// Connect to stdio transport
|
|
60
72
|
const transport = new StdioServerTransport();
|
|
61
|
-
|
|
62
|
-
// Handle transport close
|
|
73
|
+
// Handle client disconnection
|
|
63
74
|
transport.onclose = async () => {
|
|
64
75
|
await this.stop();
|
|
65
76
|
process.exit(0);
|
|
66
77
|
};
|
|
78
|
+
await this.server.connect(transport);
|
|
79
|
+
// Monitor stdin for client disconnection
|
|
67
80
|
process.stdin.on('end', async () => {
|
|
68
81
|
await this.stop();
|
|
69
82
|
process.exit(0);
|
|
@@ -73,54 +86,29 @@ export class RequestContextMCPServer {
|
|
|
73
86
|
await this.stop();
|
|
74
87
|
process.exit(1);
|
|
75
88
|
});
|
|
76
|
-
console.error(`MCP Request Context server initialized
|
|
77
|
-
|
|
78
|
-
console.error(`Dashboard available at: ${this.dashboardUrl}`);
|
|
79
|
-
}
|
|
89
|
+
console.error(`MCP Request Context server initialized`);
|
|
90
|
+
console.error(`Dashboard URL: ${this.dashboardUrl}`);
|
|
80
91
|
}
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
this.server.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}, async (args) => {
|
|
92
|
+
setupHandlers(context) {
|
|
93
|
+
// Tool list handler
|
|
94
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
95
|
+
tools: registerTools()
|
|
96
|
+
}));
|
|
97
|
+
// Tool call handler
|
|
98
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
89
99
|
try {
|
|
90
|
-
return await
|
|
100
|
+
return await handleToolCall(request.params.name, request.params.arguments || {}, context);
|
|
91
101
|
}
|
|
92
102
|
catch (error) {
|
|
93
103
|
const message = error instanceof Error ? error.message : String(error);
|
|
94
|
-
|
|
95
|
-
success: false,
|
|
96
|
-
message: `Tool execution failed: ${message}`
|
|
97
|
-
};
|
|
98
|
-
return toMCPResponse(response, true);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
// Register get_context_response tool
|
|
102
|
-
this.server.registerTool(GET_CONTEXT_RESPONSE_TOOL_NAME, {
|
|
103
|
-
title: GET_CONTEXT_RESPONSE_TOOL_TITLE,
|
|
104
|
-
description: GET_CONTEXT_RESPONSE_TOOL_DESCRIPTION,
|
|
105
|
-
inputSchema: GetContextResponseInputSchema,
|
|
106
|
-
annotations: GET_CONTEXT_RESPONSE_ANNOTATIONS
|
|
107
|
-
}, async (args) => {
|
|
108
|
-
try {
|
|
109
|
-
return await getContextResponseHandler(args, this.storage, this.dashboardUrl);
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
113
|
-
const response = {
|
|
114
|
-
success: false,
|
|
115
|
-
message: `Tool execution failed: ${message}`
|
|
116
|
-
};
|
|
117
|
-
return toMCPResponse(response, true);
|
|
104
|
+
throw new McpError(ErrorCode.InternalError, message);
|
|
118
105
|
}
|
|
119
106
|
});
|
|
120
107
|
}
|
|
121
108
|
async stop() {
|
|
122
109
|
try {
|
|
123
|
-
await this.
|
|
110
|
+
await this.dashboard.stop();
|
|
111
|
+
this.storage.stop();
|
|
124
112
|
await this.server.close();
|
|
125
113
|
}
|
|
126
114
|
catch (error) {
|
|
@@ -130,5 +118,8 @@ export class RequestContextMCPServer {
|
|
|
130
118
|
getStorage() {
|
|
131
119
|
return this.storage;
|
|
132
120
|
}
|
|
121
|
+
getDashboardUrl() {
|
|
122
|
+
return this.dashboardUrl;
|
|
123
|
+
}
|
|
133
124
|
}
|
|
134
125
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|