@socketsecurity/mcp 0.0.17 → 0.0.18

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/package.json CHANGED
@@ -1,78 +1,103 @@
1
1
  {
2
2
  "name": "@socketsecurity/mcp",
3
- "version": "0.0.17",
4
- "type": "module",
5
- "main": "./index.js",
6
- "bin": {
7
- "socket-mcp": "./index.js"
8
- },
9
- "engines": {
10
- "node": ">=22.0.0",
11
- "npm": ">= 10"
12
- },
13
- "scripts": {
14
- "prepublishOnly": "npm run build",
15
- "postpublish": "npm run clean",
16
- "test": "run-s test:*",
17
- "test:lint": "eslint .",
18
- "test:tsc": "tsc",
19
- "test:node-test": "c8 node --experimental-strip-types --test --test-reporter spec",
20
- "build": "npm run clean && run-s build:*",
21
- "build:types": "tsc -p tsconfig.declaration.json",
22
- "build:permissions": "chmod +x ./index.js && (chmod +x ./mock-client/*.js 2>/dev/null || true)",
23
- "build-mcpb": "run-s build build-mcpb:*",
24
- "build-mcpb:versions_match": "node --experimental-strip-types scripts/check-versions.ts",
25
- "build-mcpb:validate": "npx mcpb validate ./",
26
- "build-mcpb:ensure-deps": "npm install --production --ignore-scripts",
27
- "build-mcpb:mcpb-pack": "npx mcpb pack ./",
28
- "clean": "./scripts/clean.sh",
29
- "debug-stdio": "node --experimental-strip-types ./mock-client/debug-client.ts",
30
- "debug-sdk": "node --experimental-strip-types ./mock-client/stdio-client.ts",
31
- "debug-http": "node --experimental-strip-types ./mock-client/http-client.ts",
32
- "server-stdio": "SOCKET_API_KEY=${SOCKET_API_KEY} node --experimental-strip-types ./index.ts",
33
- "server-http": "MCP_HTTP_MODE=true SOCKET_API_KEY=${SOCKET_API_KEY} node --experimental-strip-types ./index.ts"
34
- },
3
+ "version": "0.0.18",
4
+ "description": "Socket MCP server for scanning dependencies",
35
5
  "keywords": [],
36
- "files": [
37
- "package.json",
38
- "package-lock.json",
39
- "index.js",
40
- "index.d.ts",
41
- "index.d.ts.map",
42
- "mock-client/**/*.js",
43
- "mock-client/**/*.d.ts*"
44
- ],
45
6
  "author": "Alexandros Kapravelos",
46
- "description": "Socket MCP server for scanning dependencies",
47
7
  "repository": {
48
8
  "type": "git",
49
9
  "url": "https://github.com/SocketDev/socket-mcp"
50
10
  },
51
- "dependencies": {
52
- "@anthropic-ai/mcpb": "^1.1.0",
11
+ "bin": {
12
+ "socket-mcp": "./dist/index.cjs"
13
+ },
14
+ "files": [
15
+ "CHANGELOG.md",
16
+ "dist/index.cjs",
17
+ "dist/index.d.ts",
18
+ "hooks/socket-gate",
19
+ "package.json"
20
+ ],
21
+ "type": "module",
22
+ "main": "./dist/index.cjs",
23
+ "publishConfig": {
24
+ "access": "public",
25
+ "provenance": true
26
+ },
27
+ "devDependencies": {
28
+ "@anthropic-ai/mcpb": "^1.2.0",
53
29
  "@modelcontextprotocol/sdk": "1.26.0",
54
- "pino": "^10.0.0",
55
- "pino-pretty": "^13.0.0",
56
- "semver": "^7.7.2",
57
- "zod": "3.25.76"
30
+ "@redwoodjs/agent-ci": "0.16.2",
31
+ "@sinclair/typebox": "0.34.49",
32
+ "@socketregistry/packageurl-js": "1.4.2",
33
+ "@socketregistry/packageurl-js-stable": "npm:@socketregistry/packageurl-js@1.4.2",
34
+ "@socketsecurity/lib": "npm:@socketsecurity/lib@6.0.7",
35
+ "@socketsecurity/lib-stable": "npm:@socketsecurity/lib@6.0.7",
36
+ "@socketsecurity/sdk": "4.0.1",
37
+ "@socketsecurity/sdk-stable": "npm:@socketsecurity/sdk@4.0.1",
38
+ "@types/node": "^24.12.4",
39
+ "@types/shell-quote": "1.7.5",
40
+ "@typescript/native-preview": "7.0.0-dev.20260510.1",
41
+ "@vitest/coverage-v8": "4.1.6",
42
+ "nock": "14.0.15",
43
+ "npm-run-all2": "^8.0.4",
44
+ "oxfmt": "0.48.0",
45
+ "oxlint": "1.63.0",
46
+ "rolldown": "1.0.3",
47
+ "shell-quote": "1.8.4",
48
+ "taze": "19.11.0",
49
+ "untracked": "1.6.1",
50
+ "vitest": "4.1.6"
58
51
  },
59
- "overrides": {
60
- "zod": "3.25.76",
61
- "zod-to-json-schema": "3.25.1"
52
+ "engines": {
53
+ "node": ">=22.0.0",
54
+ "npm": ">=11.16.0"
62
55
  },
63
- "pnpm": {
64
- "overrides": {
65
- "zod": "3.25.76",
66
- "zod-to-json-schema": "3.25.1"
67
- }
56
+ "allowScripts": {
57
+ "cpu-features": false,
58
+ "esbuild": true,
59
+ "protobufjs": false,
60
+ "ssh2": false
68
61
  },
69
- "devDependencies": {
70
- "@types/node": "^24.0.7",
71
- "@types/semver": "^7.7.0",
72
- "@types/triple-beam": "^1.3.5",
73
- "c8": "^10.0.0",
74
- "neostandard": "^0.12.0",
75
- "npm-run-all2": "^8.0.1",
76
- "typescript": "~5.9.2"
62
+ "npm-run-all2": {
63
+ "nodeRun": true
64
+ },
65
+ "scripts": {
66
+ "test": "node scripts/fleet/test.mts",
67
+ "test:e2e": "vitest run --config .config/repo/vitest.config.mts test/server.e2e.ts",
68
+ "cover": "node scripts/fleet/cover.mts",
69
+ "test:tsc": "tsgo --noEmit -p tsconfig.json",
70
+ "lint": "node scripts/fleet/lint.mts",
71
+ "lint:all": "node scripts/fleet/lint.mts --all",
72
+ "format": "oxfmt -c .config/fleet/oxfmtrc.json --write .",
73
+ "format:check": "oxfmt -c .config/fleet/oxfmtrc.json --check .",
74
+ "check": "node scripts/fleet/check.mts",
75
+ "check:all": "node scripts/fleet/check.mts --all",
76
+ "fix": "node scripts/fleet/fix.mts",
77
+ "fix:all": "node scripts/fleet/fix.mts --all",
78
+ "update": "node scripts/fleet/update.mts",
79
+ "build": "npm run clean && run-s build:*",
80
+ "build:bundle": "node scripts/build.mts",
81
+ "build:types": "tsgo -p tsconfig.dts.json",
82
+ "build:permissions": "chmod +x ./dist/index.cjs",
83
+ "build-mcpb": "run-s build build-mcpb:*",
84
+ "build-mcpb:versions_match": "node scripts/check-versions.ts",
85
+ "build-mcpb:validate": "mcpb validate ./",
86
+ "build-mcpb:ensure-deps": "npm install --production --ignore-scripts",
87
+ "build-mcpb:mcpb-pack": "mcpb pack ./",
88
+ "clean": "bash ./scripts/clean.sh",
89
+ "debug-stdio": "node ./mock-client/debug-client.ts",
90
+ "debug-sdk": "node ./mock-client/stdio-client.ts",
91
+ "debug-http": "node ./mock-client/http-client.ts",
92
+ "server-stdio": "SOCKET_API_TOKEN=${SOCKET_API_TOKEN:-${SOCKET_API_KEY}} node ./index.ts",
93
+ "server-stdio:debug": "SOCKET_DEBUG=1 SOCKET_API_TOKEN=${SOCKET_API_TOKEN:-${SOCKET_API_KEY}} node ./index.ts",
94
+ "server-http": "MCP_HTTP_MODE=true SOCKET_API_TOKEN=${SOCKET_API_TOKEN:-${SOCKET_API_KEY}} node ./index.ts",
95
+ "server-http:debug": "SOCKET_DEBUG=1 MCP_HTTP_MODE=true SOCKET_API_TOKEN=${SOCKET_API_TOKEN:-${SOCKET_API_KEY}} node ./index.ts",
96
+ "check:paths": "node scripts/fleet/check-paths.mts",
97
+ "security": "node scripts/fleet/security.mts",
98
+ "setup-security-tools": "node .claude/hooks/fleet/setup-security-tools/install.mts",
99
+ "lockstep": "node scripts/fleet/lockstep.mts",
100
+ "lockstep:emit-schema": "node scripts/fleet/lockstep-emit-schema.mts",
101
+ "ci:local": "agent-ci run --all"
77
102
  }
78
- }
103
+ }
package/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env -S node --experimental-strip-types
2
- export {};
3
- //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":""}
package/index.js DELETED
@@ -1,460 +0,0 @@
1
- #!/usr/bin/env -S node --experimental-strip-types
2
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
- import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
5
- import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
6
- import { randomUUID } from 'node:crypto';
7
- import { z } from 'zod';
8
- import pino from 'pino';
9
- import readline from 'readline';
10
- import { join } from 'path';
11
- import { readFileSync } from 'fs';
12
- import { tmpdir } from 'os';
13
- import { createServer } from 'http';
14
- const __dirname = import.meta.dirname;
15
- const packageJson = JSON.parse(readFileSync(join(__dirname, './package.json'), 'utf8'));
16
- const VERSION = packageJson.version || '0.0.1';
17
- const logger = pino({
18
- level: 'info',
19
- transport: {
20
- targets: [
21
- {
22
- target: 'pino/file',
23
- options: { destination: join(tmpdir(), 'socket-mcp-error.log') },
24
- level: 'error'
25
- },
26
- {
27
- target: 'pino/file',
28
- options: { destination: join(tmpdir(), 'socket-mcp.log') },
29
- level: 'info'
30
- }
31
- ]
32
- }
33
- });
34
- const SOCKET_API_URL = process.env['SOCKET_DEBUG'] === 'true'
35
- ? 'http://localhost:8866/v0/purl?alerts=false&compact=false&fixable=false&licenseattrib=false&licensedetails=false'
36
- : 'https://api.socket.dev/v0/purl?alerts=false&compact=false&fixable=false&licenseattrib=false&licensedetails=false';
37
- async function getApiKeyInteractively() {
38
- const rl = readline.createInterface({
39
- input: process.stdin,
40
- output: process.stderr
41
- });
42
- const apiKey = await new Promise((resolve) => {
43
- rl.question('Please enter your Socket API key: ', (answer) => {
44
- rl.close();
45
- resolve(answer);
46
- });
47
- });
48
- if (!apiKey) {
49
- logger.error('No API key provided');
50
- process.exit(1);
51
- }
52
- return apiKey;
53
- }
54
- let SOCKET_API_KEY = process.env['SOCKET_API_KEY'] || '';
55
- function buildSocketHeaders() {
56
- return {
57
- 'user-agent': `socket-mcp/${VERSION}`,
58
- accept: 'application/x-ndjson',
59
- 'content-type': 'application/json',
60
- authorization: `Bearer ${SOCKET_API_KEY}`
61
- };
62
- }
63
- function createConfiguredServer() {
64
- const srv = new McpServer({ name: 'socket', version: VERSION });
65
- srv.registerTool('depscore', {
66
- title: 'Dependency Score Tool',
67
- description: "Get the dependency score of packages with the `depscore` tool from Socket. Use 'unknown' for version if not known. Use this tool to scan dependencies for their quality and security on existing code or when code is generated. Stop generating code and ask the user how to proceed when any of the scores are low. When checking dependencies, make sure to also check the imports in the code, not just the manifest files (pyproject.toml, package.json, etc).",
68
- inputSchema: {
69
- packages: z.array(z.object({
70
- ecosystem: z.string().describe('The package ecosystem (e.g., npm, pypi)').default('npm'),
71
- depname: z.string().describe('The name of the dependency'),
72
- version: z.string().describe("The version of the dependency, use 'unknown' if not known").default('unknown'),
73
- })).describe('Array of packages to check'),
74
- },
75
- annotations: {
76
- readOnlyHint: true,
77
- },
78
- }, async ({ packages }) => {
79
- logger.info(`Received request for ${packages.length} packages`);
80
- const components = packages.map((pkg) => {
81
- const cleanedVersion = (pkg.version ?? 'unknown').replace(/[\^~]/g, '');
82
- const ecosystem = pkg.ecosystem ?? 'npm';
83
- let purl;
84
- if (cleanedVersion === '1.0.0' || cleanedVersion === 'unknown' || !cleanedVersion) {
85
- purl = `pkg:${ecosystem}/${pkg.depname}`;
86
- }
87
- else {
88
- logger.info(`Using version ${cleanedVersion} for ${pkg.depname}`);
89
- purl = `pkg:${ecosystem}/${pkg.depname}@${cleanedVersion}`;
90
- }
91
- return { purl };
92
- });
93
- try {
94
- const response = await fetch(SOCKET_API_URL, {
95
- method: 'POST',
96
- headers: buildSocketHeaders(),
97
- body: JSON.stringify({ components })
98
- });
99
- const responseText = await response.text();
100
- if (response.status !== 200) {
101
- const errorMsg = `Error processing packages: [${response.status}] ${responseText}`;
102
- logger.error(errorMsg);
103
- return {
104
- content: [{ type: 'text', text: errorMsg }],
105
- isError: true
106
- };
107
- }
108
- else if (!responseText.trim()) {
109
- const errorMsg = 'No packages were found.';
110
- logger.error(errorMsg);
111
- return {
112
- content: [{ type: 'text', text: errorMsg }],
113
- isError: true
114
- };
115
- }
116
- try {
117
- const results = [];
118
- if ((response.headers.get('content-type') || '').includes('x-ndjson')) {
119
- const jsonLines = responseText.split('\n')
120
- .filter(line => line.trim())
121
- .map(line => JSON.parse(line));
122
- if (!jsonLines.length) {
123
- const errorMsg = 'No valid JSON objects found in NDJSON response';
124
- return {
125
- content: [{ type: 'text', text: errorMsg }],
126
- isError: true
127
- };
128
- }
129
- for (const jsonData of jsonLines) {
130
- const purl = `pkg:${jsonData.type || 'unknown'}/${jsonData.name || 'unknown'}@${jsonData.version || 'unknown'}`;
131
- if (jsonData.score && jsonData.score.overall !== undefined) {
132
- const scoreEntries = Object.entries(jsonData.score)
133
- .filter(([key]) => key !== 'overall' && key !== 'uuid')
134
- .map(([key, value]) => {
135
- const numValue = Number(value);
136
- const displayValue = numValue <= 1 ? Math.round(numValue * 100) : numValue;
137
- return `${key}: ${displayValue}`;
138
- })
139
- .join(', ');
140
- results.push(`${purl}: ${scoreEntries}`);
141
- }
142
- else {
143
- results.push(`${purl}: No score found`);
144
- }
145
- }
146
- }
147
- else {
148
- const jsonData = JSON.parse(responseText);
149
- const purl = `pkg:${jsonData.type || 'unknown'}/${jsonData.name || 'unknown'}@${jsonData.version || 'unknown'}`;
150
- if (jsonData.score && jsonData.score.overall !== undefined) {
151
- const scoreEntries = Object.entries(jsonData.score)
152
- .filter(([key]) => key !== 'overall' && key !== 'uuid')
153
- .map(([key, value]) => {
154
- const numValue = Number(value);
155
- const displayValue = numValue <= 1 ? Math.round(numValue * 100) : numValue;
156
- return `${key}: ${displayValue}`;
157
- })
158
- .join(', ');
159
- results.push(`${purl}: ${scoreEntries}`);
160
- }
161
- else {
162
- results.push(`${purl}: No score found`);
163
- }
164
- }
165
- return {
166
- content: [
167
- {
168
- type: 'text',
169
- text: results.length > 0
170
- ? `Dependency scores:\n${results.join('\n')}`
171
- : 'No scores found for the provided packages'
172
- }
173
- ]
174
- };
175
- }
176
- catch (e) {
177
- const error = e;
178
- const errorMsg = `JSON parsing error: ${error.message} -- Response: ${responseText}`;
179
- logger.error(errorMsg);
180
- return {
181
- content: [{ type: 'text', text: 'Error parsing response from Socket API' }],
182
- isError: true
183
- };
184
- }
185
- }
186
- catch (e) {
187
- const error = e;
188
- const errorMsg = `Error processing packages: ${error.message}`;
189
- logger.error(errorMsg);
190
- return {
191
- content: [{ type: 'text', text: 'Error connecting to Socket API' }],
192
- isError: true
193
- };
194
- }
195
- });
196
- return srv;
197
- }
198
- const useHttp = process.env['MCP_HTTP_MODE'] === 'true' || process.argv.includes('--http');
199
- const port = parseInt(process.env['MCP_PORT'] || '3000', 10);
200
- if (!SOCKET_API_KEY) {
201
- if (useHttp) {
202
- logger.error('SOCKET_API_KEY environment variable is not set');
203
- SOCKET_API_KEY = await getApiKeyInteractively();
204
- }
205
- else {
206
- logger.error('SOCKET_API_KEY environment variable is required in stdio mode');
207
- logger.error('Please set the SOCKET_API_KEY environment variable and try again');
208
- process.exit(1);
209
- }
210
- }
211
- if (useHttp) {
212
- logger.info(`Starting HTTP server on port ${port}`);
213
- const sessions = new Map();
214
- function destroySession(id) {
215
- const s = sessions.get(id);
216
- if (!s)
217
- return;
218
- sessions.delete(id);
219
- try {
220
- s.transport.close();
221
- }
222
- catch { }
223
- s.server.close().catch(() => { });
224
- logger.info(`Session ${id} destroyed`);
225
- }
226
- const SESSION_TTL_MS = 30 * 60 * 1000;
227
- const reapInterval = setInterval(() => {
228
- const now = Date.now();
229
- for (const [id, session] of sessions.entries()) {
230
- if (now - session.lastActivity > SESSION_TTL_MS) {
231
- logger.info(`Reaping idle session ${id}`);
232
- destroySession(id);
233
- }
234
- }
235
- }, 60_000);
236
- reapInterval.unref();
237
- const httpServer = createServer(async (req, res) => {
238
- let url;
239
- try {
240
- url = new URL(req.url, `http://localhost:${port}`);
241
- }
242
- catch (error) {
243
- logger.warn(`Invalid URL in request: ${req.url} - ${error}`);
244
- res.writeHead(400, { 'Content-Type': 'application/json' });
245
- res.end(JSON.stringify({
246
- jsonrpc: '2.0',
247
- error: { code: -32000, message: 'Bad Request: Invalid URL' },
248
- id: null
249
- }));
250
- return;
251
- }
252
- if (url.pathname === '/health') {
253
- res.writeHead(200, { 'Content-Type': 'application/json' });
254
- res.end(JSON.stringify({
255
- status: 'healthy',
256
- service: 'socket-mcp',
257
- version: VERSION,
258
- timestamp: new Date().toISOString()
259
- }));
260
- return;
261
- }
262
- const origin = req.headers.origin;
263
- const isLocalhostOrigin = (originUrl) => {
264
- try {
265
- const url = new URL(originUrl);
266
- return url.hostname === 'localhost' || url.hostname === '127.0.0.1';
267
- }
268
- catch {
269
- return false;
270
- }
271
- };
272
- const allowedOrigins = [
273
- 'https://mcp.socket.dev',
274
- 'https://mcp.socket-staging.dev'
275
- ];
276
- const host = req.headers.host || '';
277
- const allowedHosts = allowedOrigins.map(o => new URL(o).hostname);
278
- const isAllowedHost = host === `localhost:${port}` ||
279
- host === `127.0.0.1:${port}` ||
280
- host === 'localhost' ||
281
- host === '127.0.0.1' ||
282
- allowedHosts.includes(host);
283
- const isValidOrigin = origin
284
- ? (isLocalhostOrigin(origin) || allowedOrigins.includes(origin))
285
- : isAllowedHost;
286
- if (!isValidOrigin) {
287
- logger.warn(`Rejected request from invalid origin: ${origin || 'missing'} (host: ${host})`);
288
- res.writeHead(403, { 'Content-Type': 'application/json' });
289
- res.end(JSON.stringify({
290
- jsonrpc: '2.0',
291
- error: { code: -32000, message: 'Forbidden: Invalid origin' },
292
- id: null
293
- }));
294
- return;
295
- }
296
- if (origin) {
297
- res.setHeader('Access-Control-Allow-Origin', origin);
298
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
299
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Accept, Mcp-Session-Id');
300
- res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
301
- }
302
- if (req.method === 'OPTIONS') {
303
- res.writeHead(200);
304
- res.end();
305
- return;
306
- }
307
- if (url.pathname === '/') {
308
- const accept = req.headers.accept || '';
309
- if (!accept.includes('application/json') || !accept.includes('text/event-stream')) {
310
- const requiredAccept = 'application/json, text/event-stream';
311
- req.headers.accept = requiredAccept;
312
- const idx = req.rawHeaders.findIndex(h => h.toLowerCase() === 'accept');
313
- if (idx !== -1) {
314
- req.rawHeaders[idx + 1] = requiredAccept;
315
- }
316
- else {
317
- req.rawHeaders.push('Accept', requiredAccept);
318
- }
319
- }
320
- if (req.method === 'POST') {
321
- let body = '';
322
- req.on('data', (chunk) => { body += chunk; });
323
- req.on('end', async () => {
324
- try {
325
- const jsonData = JSON.parse(body);
326
- const sessionId = req.headers['mcp-session-id'] || undefined;
327
- const session = sessionId ? sessions.get(sessionId) : undefined;
328
- let transport = session?.transport;
329
- if (!transport && isInitializeRequest(jsonData)) {
330
- const clientInfo = jsonData.params?.clientInfo;
331
- logger.info(`Client connected: ${clientInfo?.name || 'unknown'} v${clientInfo?.version || 'unknown'} from ${origin || host}`);
332
- const server = createConfiguredServer();
333
- const newTransport = new StreamableHTTPServerTransport({
334
- enableJsonResponse: true,
335
- sessionIdGenerator: () => randomUUID(),
336
- onsessioninitialized: (id) => {
337
- sessions.set(id, { transport: newTransport, server, lastActivity: Date.now() });
338
- },
339
- onsessionclosed: (id) => { destroySession(id); }
340
- });
341
- newTransport.onclose = () => {
342
- const id = newTransport.sessionId;
343
- if (id)
344
- destroySession(id);
345
- };
346
- transport = newTransport;
347
- await server.connect(transport);
348
- }
349
- if (!transport) {
350
- res.writeHead(400, { 'Content-Type': 'application/json' });
351
- res.end(JSON.stringify({
352
- jsonrpc: '2.0',
353
- error: { code: -32000, message: 'Bad Request: No valid session. Send initialize first.' },
354
- id: null
355
- }));
356
- return;
357
- }
358
- if (sessionId) {
359
- const activeSession = sessions.get(sessionId);
360
- if (activeSession)
361
- activeSession.lastActivity = Date.now();
362
- }
363
- await transport.handleRequest(req, res, jsonData);
364
- }
365
- catch (error) {
366
- logger.error(`Error processing POST request: ${error}`);
367
- if (!res.headersSent) {
368
- res.writeHead(500);
369
- res.end(JSON.stringify({
370
- jsonrpc: '2.0',
371
- error: { code: -32603, message: 'Internal server error' },
372
- id: null
373
- }));
374
- }
375
- }
376
- });
377
- }
378
- else if (req.method === 'GET') {
379
- const sessionId = req.headers['mcp-session-id'] || undefined;
380
- const session = sessionId ? sessions.get(sessionId) : undefined;
381
- if (!session) {
382
- res.writeHead(404, { 'Content-Type': 'application/json' });
383
- res.end(JSON.stringify({
384
- jsonrpc: '2.0',
385
- error: { code: -32000, message: 'Not Found: Invalid or expired session. Re-initialize.' },
386
- id: null
387
- }));
388
- return;
389
- }
390
- try {
391
- session.lastActivity = Date.now();
392
- await session.transport.handleRequest(req, res);
393
- }
394
- catch (error) {
395
- logger.error(`Error processing GET request: ${error}`);
396
- if (!res.headersSent) {
397
- res.writeHead(500);
398
- res.end(JSON.stringify({
399
- jsonrpc: '2.0',
400
- error: { code: -32603, message: 'Internal server error' },
401
- id: null
402
- }));
403
- }
404
- }
405
- }
406
- else if (req.method === 'DELETE') {
407
- const sessionId = req.headers['mcp-session-id'] || undefined;
408
- const transport = sessionId ? sessions.get(sessionId)?.transport : undefined;
409
- if (!transport) {
410
- res.writeHead(404, { 'Content-Type': 'application/json' });
411
- res.end(JSON.stringify({
412
- jsonrpc: '2.0',
413
- error: { code: -32000, message: 'Not Found: Invalid or expired session.' },
414
- id: null
415
- }));
416
- return;
417
- }
418
- try {
419
- await transport.handleRequest(req, res);
420
- }
421
- catch (error) {
422
- logger.error(`Error processing DELETE request: ${error}`);
423
- if (!res.headersSent) {
424
- res.writeHead(500);
425
- res.end(JSON.stringify({
426
- jsonrpc: '2.0',
427
- error: { code: -32603, message: 'Internal server error' },
428
- id: null
429
- }));
430
- }
431
- }
432
- }
433
- else {
434
- res.writeHead(405);
435
- res.end('Method not allowed');
436
- }
437
- }
438
- else {
439
- res.writeHead(404);
440
- res.end('Not found');
441
- }
442
- });
443
- httpServer.listen(port, () => {
444
- logger.info(`Socket MCP HTTP server version ${VERSION} started successfully on port ${port}`);
445
- logger.info(`Connect to: http://localhost:${port}/`);
446
- });
447
- }
448
- else {
449
- logger.info('Starting in stdio mode');
450
- const server = createConfiguredServer();
451
- const transport = new StdioServerTransport();
452
- server.connect(transport)
453
- .then(() => {
454
- logger.info(`Socket MCP server version ${VERSION} started successfully`);
455
- })
456
- .catch((error) => {
457
- logger.error(`Failed to start Socket MCP server: ${error.message}`);
458
- process.exit(1);
459
- });
460
- }
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node --experimental-strip-types
2
- export {};
3
- //# sourceMappingURL=debug-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug-client.d.ts","sourceRoot":"","sources":["debug-client.ts"],"names":[],"mappings":""}