@thantos66/claude-context-mcp 0.1.1 → 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/dist/index.js CHANGED
@@ -21,10 +21,16 @@ import { registerPermissionsTools } from "./tools/permissions.js";
21
21
  import { registerAgentTools } from "./tools/agents.js";
22
22
  import { registerSkillTools } from "./tools/skills.js";
23
23
  import { registerMetaTools } from "./tools/meta.js";
24
+ import { runProxy } from "./proxy.js";
24
25
  async function main() {
26
+ // Subcommand: proxy mode — sanitize tool schemas from an external MCP server
27
+ if (process.argv[2] === "proxy") {
28
+ runProxy(process.argv.slice(3));
29
+ return;
30
+ }
25
31
  const server = new McpServer({
26
32
  name: "claude-context-mcp",
27
- version: "0.1.0",
33
+ version: "0.2.0",
28
34
  });
29
35
  registerMcpTools(server);
30
36
  registerPermissionsTools(server);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,0EAA0E;IAC1E,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAChE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAAgC,GAAa,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,KAAK,UAAU,IAAI;IACjB,6EAA6E;IAC7E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAChC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,0EAA0E;IAC1E,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAChE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAAgC,GAAa,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runProxy(childArgs: string[]): void;
package/dist/proxy.js ADDED
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Schema-sanitizing MCP stdio proxy.
3
+ *
4
+ * Sits between Claude Code and any MCP server. Transparently passes all
5
+ * JSON-RPC messages, but intercepts `tools/list` responses and flattens
6
+ * `oneOf`, `anyOf`, and `allOf` in tool input schemas — which the Claude
7
+ * API rejects.
8
+ *
9
+ * Usage:
10
+ * node dist/index.js proxy <command> [args...]
11
+ * npx @thantos66/claude-context-mcp proxy npx -y @stripe/mcp
12
+ *
13
+ * Security: The proxy never touches secrets or data payloads — only schema
14
+ * metadata in tools/list responses. The child process inherits env as-is.
15
+ */
16
+ import { spawn } from "node:child_process";
17
+ import { createInterface } from "node:readline";
18
+ // ── Schema sanitization ─────────────────────────────────────────────
19
+ /**
20
+ * Recursively walk a JSON Schema node and flatten any oneOf/anyOf/allOf
21
+ * by merging all branch properties into a single object schema.
22
+ */
23
+ function sanitizeSchema(schema) {
24
+ if (schema === null || typeof schema !== "object" || Array.isArray(schema)) {
25
+ return schema;
26
+ }
27
+ const result = { ...schema };
28
+ // Handle top-level or nested oneOf/anyOf/allOf
29
+ for (const keyword of ["oneOf", "anyOf", "allOf"]) {
30
+ if (Array.isArray(result[keyword])) {
31
+ const branches = result[keyword];
32
+ const merged = mergeBranches(branches);
33
+ // Remove the keyword and merge the result
34
+ delete result[keyword];
35
+ Object.assign(result, merged);
36
+ }
37
+ }
38
+ // Ensure we have type: "object" if we have properties
39
+ if (result.properties && !result.type) {
40
+ result.type = "object";
41
+ }
42
+ // Recurse into properties
43
+ if (result.properties && typeof result.properties === "object") {
44
+ const props = result.properties;
45
+ const sanitized = {};
46
+ for (const [key, value] of Object.entries(props)) {
47
+ sanitized[key] =
48
+ value && typeof value === "object" && !Array.isArray(value)
49
+ ? sanitizeSchema(value)
50
+ : value;
51
+ }
52
+ result.properties = sanitized;
53
+ }
54
+ // Recurse into items (array schemas)
55
+ if (result.items && typeof result.items === "object" && !Array.isArray(result.items)) {
56
+ result.items = sanitizeSchema(result.items);
57
+ }
58
+ // Recurse into additionalProperties if it's a schema
59
+ if (result.additionalProperties &&
60
+ typeof result.additionalProperties === "object" &&
61
+ !Array.isArray(result.additionalProperties)) {
62
+ result.additionalProperties = sanitizeSchema(result.additionalProperties);
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Merge multiple JSON Schema branch objects into a single flat object schema.
68
+ * Properties from all branches are collected; required arrays are unioned.
69
+ */
70
+ function mergeBranches(branches) {
71
+ const mergedProps = {};
72
+ const mergedRequired = new Set();
73
+ let hasProperties = false;
74
+ for (const branch of branches) {
75
+ if (branch === null || typeof branch !== "object")
76
+ continue;
77
+ // Recursively sanitize each branch first
78
+ const clean = sanitizeSchema(branch);
79
+ if (clean.properties && typeof clean.properties === "object") {
80
+ hasProperties = true;
81
+ const props = clean.properties;
82
+ for (const [key, value] of Object.entries(props)) {
83
+ // First branch wins for conflicting property definitions
84
+ if (!(key in mergedProps)) {
85
+ mergedProps[key] = value;
86
+ }
87
+ }
88
+ }
89
+ if (Array.isArray(clean.required)) {
90
+ for (const r of clean.required) {
91
+ if (typeof r === "string")
92
+ mergedRequired.add(r);
93
+ }
94
+ }
95
+ }
96
+ const result = { type: "object" };
97
+ if (hasProperties) {
98
+ result.properties = mergedProps;
99
+ }
100
+ // Only include required fields that actually exist in merged properties
101
+ const validRequired = [...mergedRequired].filter((r) => r in mergedProps);
102
+ if (validRequired.length > 0) {
103
+ result.required = validRequired;
104
+ }
105
+ return result;
106
+ }
107
+ /**
108
+ * Check if a schema (or any nested part) contains oneOf/anyOf/allOf.
109
+ */
110
+ function schemaHasUnion(schema) {
111
+ if (schema === null || typeof schema !== "object" || Array.isArray(schema)) {
112
+ return false;
113
+ }
114
+ const obj = schema;
115
+ if (obj.oneOf || obj.anyOf || obj.allOf)
116
+ return true;
117
+ // Check nested properties
118
+ if (obj.properties && typeof obj.properties === "object") {
119
+ for (const value of Object.values(obj.properties)) {
120
+ if (schemaHasUnion(value))
121
+ return true;
122
+ }
123
+ }
124
+ if (obj.items && typeof obj.items === "object") {
125
+ if (schemaHasUnion(obj.items))
126
+ return true;
127
+ }
128
+ if (obj.additionalProperties && typeof obj.additionalProperties === "object") {
129
+ if (schemaHasUnion(obj.additionalProperties))
130
+ return true;
131
+ }
132
+ return false;
133
+ }
134
+ // ── JSON-RPC message processing ─────────────────────────────────────
135
+ /**
136
+ * Process a JSON-RPC response. If it's a tools/list result, sanitize
137
+ * tool input schemas. Returns the (possibly modified) message string.
138
+ */
139
+ function processMessage(line) {
140
+ let msg;
141
+ try {
142
+ msg = JSON.parse(line);
143
+ }
144
+ catch {
145
+ return line; // Not JSON — pass through
146
+ }
147
+ // Only process JSON-RPC responses that have a result with tools array
148
+ if (!msg.result || typeof msg.result !== "object")
149
+ return line;
150
+ const result = msg.result;
151
+ if (!Array.isArray(result.tools))
152
+ return line;
153
+ // This is a tools/list response — sanitize each tool's inputSchema
154
+ const tools = result.tools;
155
+ const patched = [];
156
+ for (const tool of tools) {
157
+ if (!tool.inputSchema || typeof tool.inputSchema !== "object")
158
+ continue;
159
+ const schema = tool.inputSchema;
160
+ if (schemaHasUnion(schema)) {
161
+ const name = tool.name || "(unknown)";
162
+ tool.inputSchema = sanitizeSchema(schema);
163
+ patched.push(name);
164
+ }
165
+ }
166
+ if (patched.length > 0) {
167
+ process.stderr.write(`[claude-context-mcp proxy] sanitized ${patched.length} tool schema(s): ${patched.join(", ")}\n`);
168
+ }
169
+ return JSON.stringify(msg);
170
+ }
171
+ // ── Main proxy logic ────────────────────────────────────────────────
172
+ export function runProxy(childArgs) {
173
+ if (childArgs.length === 0) {
174
+ process.stderr.write("[claude-context-mcp proxy] error: no command specified\n" +
175
+ "Usage: claude-context-mcp proxy <command> [args...]\n");
176
+ process.exit(1);
177
+ }
178
+ const [command, ...args] = childArgs;
179
+ const child = spawn(command, args, {
180
+ stdio: ["pipe", "pipe", "inherit"], // stdin: pipe, stdout: pipe, stderr: inherit
181
+ env: process.env,
182
+ });
183
+ child.on("error", (err) => {
184
+ process.stderr.write(`[claude-context-mcp proxy] failed to spawn "${command}": ${err.message}\n`);
185
+ process.exit(1);
186
+ });
187
+ child.on("exit", (code, signal) => {
188
+ if (signal) {
189
+ process.stderr.write(`[claude-context-mcp proxy] child killed by signal ${signal}\n`);
190
+ process.exit(1);
191
+ }
192
+ process.exit(code ?? 0);
193
+ });
194
+ // stdin → child stdin (pass through, no processing needed)
195
+ process.stdin.pipe(child.stdin);
196
+ // child stdout → process stdout (intercept and sanitize)
197
+ const rl = createInterface({ input: child.stdout, crlfDelay: Infinity });
198
+ rl.on("line", (line) => {
199
+ const processed = processMessage(line);
200
+ process.stdout.write(processed + "\n");
201
+ });
202
+ // Handle parent stdin closing
203
+ process.stdin.on("end", () => {
204
+ child.stdin.end();
205
+ });
206
+ process.stderr.write(`[claude-context-mcp proxy] proxying: ${command} ${args.join(" ")}\n`);
207
+ }
208
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
1
  import { z } from "zod";
2
2
  import fs from "node:fs/promises";
3
+ import { spawn } from "node:child_process";
3
4
  import { allPlatformPaths } from "../services/paths.js";
4
5
  import { loadMcpConfig } from "../services/mcp-config.js";
5
6
  import { loadSettings } from "../services/permissions.js";
6
7
  import { backupFile } from "../services/backup.js";
8
+ import { getServer } from "../services/mcp-config.js";
9
+ import { isStdioServer } from "../schemas/mcp-config.js";
7
10
  import { handle, okResponse } from "./helpers.js";
8
11
  export function registerMetaTools(server) {
9
12
  // ------------------------------------------------------------------
@@ -75,5 +78,252 @@ export function registerMetaTools(server) {
75
78
  }, (result) => result.backup
76
79
  ? okResponse(`backed up ${result.filePath} -> ${result.backup}`, result)
77
80
  : okResponse(`no-op: ${result.filePath} did not exist`, result)));
81
+ // ------------------------------------------------------------------
82
+ // meta_check_server_health
83
+ // ------------------------------------------------------------------
84
+ server.registerTool("meta_check_server_health", {
85
+ title: "Check if an MCP server can start",
86
+ description: "Spawn a stdio MCP server, send an initialize request, and check " +
87
+ "if it responds within a timeout. Reports: ok, failed, or timeout. " +
88
+ "Provide either (scope + name) to look up the config, or (command + args) directly.",
89
+ inputSchema: {
90
+ scope: z.enum(["desktop", "user", "project"]).optional(),
91
+ name: z.string().optional().describe("Server name to look up in config."),
92
+ command: z.string().optional().describe("Command to spawn directly (alternative to scope+name)."),
93
+ args: z.array(z.string()).optional(),
94
+ projectPath: z.string().optional(),
95
+ timeoutMs: z.number().optional().describe("Timeout in ms (default 10000)."),
96
+ },
97
+ annotations: {
98
+ readOnlyHint: true,
99
+ destructiveHint: false,
100
+ idempotentHint: true,
101
+ openWorldHint: true,
102
+ },
103
+ }, async (input) => handle(async () => {
104
+ let cmd;
105
+ let cmdArgs = [];
106
+ let env;
107
+ if (input.command) {
108
+ cmd = input.command;
109
+ cmdArgs = input.args ?? [];
110
+ }
111
+ else if (input.scope && input.name) {
112
+ const entry = await getServer({
113
+ scope: input.scope,
114
+ name: input.name,
115
+ projectPath: input.projectPath,
116
+ revealSecrets: true,
117
+ });
118
+ if (!entry) {
119
+ return { status: "not_found", message: `Server "${input.name}" not found in ${input.scope} scope.` };
120
+ }
121
+ if (!isStdioServer(entry.entry)) {
122
+ return { status: "skip", message: `Server "${input.name}" is HTTP-based, not stdio.` };
123
+ }
124
+ cmd = entry.entry.command;
125
+ cmdArgs = entry.entry.args ?? [];
126
+ env = entry.entry.env;
127
+ }
128
+ else {
129
+ throw new Error("Provide either (scope + name) or (command + args).");
130
+ }
131
+ const timeout = input.timeoutMs ?? 10000;
132
+ return await checkServerHealth(cmd, cmdArgs, env, timeout);
133
+ }, (result) => okResponse(`status: ${result.status}\n${result.message ?? ""}`, result)));
134
+ // ------------------------------------------------------------------
135
+ // meta_env_template
136
+ // ------------------------------------------------------------------
137
+ server.registerTool("meta_env_template", {
138
+ title: "Manage a secrets env template",
139
+ description: "Create, read, or validate a secrets .env file. When action=create, " +
140
+ "writes a template with placeholder comments (chmod 600). When " +
141
+ "action=validate, checks that all keys have non-empty, non-placeholder values.",
142
+ inputSchema: {
143
+ action: z.enum(["create", "read", "validate"]),
144
+ filePath: z.string().describe("Absolute path to the .env file."),
145
+ entries: z
146
+ .array(z.object({
147
+ key: z.string(),
148
+ comment: z.string().optional(),
149
+ }))
150
+ .optional()
151
+ .describe("Key definitions for create action. Each entry becomes KEY= with optional # comment."),
152
+ header: z.string().optional().describe("Header comment block for create action."),
153
+ },
154
+ annotations: {
155
+ readOnlyHint: false,
156
+ destructiveHint: false,
157
+ idempotentHint: true,
158
+ openWorldHint: false,
159
+ },
160
+ }, async (input) => handle(async () => {
161
+ if (input.action === "create") {
162
+ const lines = [];
163
+ if (input.header) {
164
+ for (const line of input.header.split("\n")) {
165
+ lines.push(`# ${line}`);
166
+ }
167
+ lines.push("");
168
+ }
169
+ for (const entry of input.entries ?? []) {
170
+ if (entry.comment) {
171
+ lines.push(`# ${entry.comment}`);
172
+ }
173
+ lines.push(`${entry.key}=`);
174
+ }
175
+ lines.push(""); // trailing newline
176
+ const content = lines.join("\n");
177
+ await fs.writeFile(input.filePath, content, { mode: 0o600 });
178
+ return {
179
+ action: "create",
180
+ filePath: input.filePath,
181
+ keys: (input.entries ?? []).map((e) => e.key),
182
+ message: `Created template at ${input.filePath} (chmod 600) with ${(input.entries ?? []).length} key(s).`,
183
+ };
184
+ }
185
+ if (input.action === "read") {
186
+ let content;
187
+ try {
188
+ content = await fs.readFile(input.filePath, "utf8");
189
+ }
190
+ catch (err) {
191
+ if (err.code === "ENOENT") {
192
+ return { action: "read", filePath: input.filePath, exists: false, message: "File does not exist." };
193
+ }
194
+ throw err;
195
+ }
196
+ const parsed = parseEnvFile(content);
197
+ return { action: "read", filePath: input.filePath, exists: true, keys: parsed };
198
+ }
199
+ // validate
200
+ let content;
201
+ try {
202
+ content = await fs.readFile(input.filePath, "utf8");
203
+ }
204
+ catch (err) {
205
+ if (err.code === "ENOENT") {
206
+ return { action: "validate", filePath: input.filePath, valid: false, message: "File does not exist." };
207
+ }
208
+ throw err;
209
+ }
210
+ const parsed = parseEnvFile(content);
211
+ const issues = [];
212
+ for (const { key, value } of parsed) {
213
+ if (!value || value.trim() === "") {
214
+ issues.push(`${key}: empty`);
215
+ }
216
+ else if (/^<YOUR_.*>$/i.test(value.trim())) {
217
+ issues.push(`${key}: placeholder value`);
218
+ }
219
+ }
220
+ return {
221
+ action: "validate",
222
+ filePath: input.filePath,
223
+ valid: issues.length === 0,
224
+ total: parsed.length,
225
+ filled: parsed.length - issues.length,
226
+ issues,
227
+ message: issues.length === 0
228
+ ? `All ${parsed.length} key(s) are filled.`
229
+ : `${issues.length} of ${parsed.length} key(s) need attention: ${issues.join(", ")}`,
230
+ };
231
+ }, (result) => okResponse(result.message ?? JSON.stringify(result), result)));
232
+ }
233
+ // ── Helpers ──────────────────────────────────────────────────────────
234
+ function parseEnvFile(content) {
235
+ const results = [];
236
+ for (const line of content.split("\n")) {
237
+ const trimmed = line.trim();
238
+ if (!trimmed || trimmed.startsWith("#"))
239
+ continue;
240
+ const eqIdx = trimmed.indexOf("=");
241
+ if (eqIdx === -1)
242
+ continue;
243
+ results.push({
244
+ key: trimmed.slice(0, eqIdx),
245
+ value: trimmed.slice(eqIdx + 1),
246
+ });
247
+ }
248
+ return results;
249
+ }
250
+ function checkServerHealth(command, args, env, timeoutMs) {
251
+ return new Promise((resolve) => {
252
+ const childEnv = env ? { ...process.env, ...env } : process.env;
253
+ let child;
254
+ try {
255
+ child = spawn(command, args, {
256
+ stdio: ["pipe", "pipe", "pipe"],
257
+ env: childEnv,
258
+ });
259
+ }
260
+ catch (err) {
261
+ resolve({
262
+ status: "failed",
263
+ message: `Failed to spawn "${command}": ${err.message}`,
264
+ });
265
+ return;
266
+ }
267
+ let stdout = "";
268
+ let stderr = "";
269
+ let settled = false;
270
+ const timer = setTimeout(() => {
271
+ if (!settled) {
272
+ settled = true;
273
+ child.kill("SIGTERM");
274
+ resolve({
275
+ status: "timeout",
276
+ message: `Server did not respond within ${timeoutMs}ms.`,
277
+ stderr: stderr.slice(0, 500),
278
+ });
279
+ }
280
+ }, timeoutMs);
281
+ child.stdout.on("data", (chunk) => {
282
+ stdout += chunk.toString();
283
+ // Check if we got a valid JSON-RPC response
284
+ if (!settled && stdout.includes('"result"')) {
285
+ settled = true;
286
+ clearTimeout(timer);
287
+ child.kill("SIGTERM");
288
+ resolve({ status: "ok", message: "Server responded to initialize." });
289
+ }
290
+ });
291
+ child.stderr.on("data", (chunk) => {
292
+ stderr += chunk.toString();
293
+ });
294
+ child.on("error", (err) => {
295
+ if (!settled) {
296
+ settled = true;
297
+ clearTimeout(timer);
298
+ resolve({
299
+ status: "failed",
300
+ message: `Spawn error: ${err.message}`,
301
+ });
302
+ }
303
+ });
304
+ child.on("exit", (code) => {
305
+ if (!settled) {
306
+ settled = true;
307
+ clearTimeout(timer);
308
+ resolve({
309
+ status: "failed",
310
+ message: `Server exited with code ${code} before responding.`,
311
+ stderr: stderr.slice(0, 500),
312
+ });
313
+ }
314
+ });
315
+ // Send an initialize request
316
+ const initRequest = JSON.stringify({
317
+ jsonrpc: "2.0",
318
+ id: 1,
319
+ method: "initialize",
320
+ params: {
321
+ protocolVersion: "2025-03-26",
322
+ capabilities: {},
323
+ clientInfo: { name: "health-check", version: "1.0" },
324
+ },
325
+ });
326
+ child.stdin.write(initRequest + "\n");
327
+ });
78
328
  }
79
329
  //# sourceMappingURL=meta.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/tools/meta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/tools/meta.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thantos66/claude-context-mcp",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "MCP server for managing Claude Code MCP servers, subagents, skills, and permissions across projects.",
5
5
  "type": "module",
6
6
  "bin": {