@jvittechs/jai1-mcp 1.0.2 → 1.1.1
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 +6 -6
- package/dist/index.js +18 -18
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -104,7 +104,7 @@ Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_
|
|
|
104
104
|
|
|
105
105
|
Once connected, the following tools are available to your AI agent:
|
|
106
106
|
|
|
107
|
-
### `
|
|
107
|
+
### `plan_feature`
|
|
108
108
|
|
|
109
109
|
Create a structured development plan for a feature.
|
|
110
110
|
|
|
@@ -114,7 +114,7 @@ Create a structured development plan for a feature.
|
|
|
114
114
|
- `tech_stack`: Tech stack being used
|
|
115
115
|
- `constraints`: Any constraints to consider
|
|
116
116
|
|
|
117
|
-
### `
|
|
117
|
+
### `suggest_techstack`
|
|
118
118
|
|
|
119
119
|
Get tech stack recommendations based on requirements.
|
|
120
120
|
|
|
@@ -124,7 +124,7 @@ Get tech stack recommendations based on requirements.
|
|
|
124
124
|
- `constraints`: Budget, team skills, timeline
|
|
125
125
|
- `preferences`: Technology preferences
|
|
126
126
|
|
|
127
|
-
### `
|
|
127
|
+
### `research`
|
|
128
128
|
|
|
129
129
|
Research a technical topic.
|
|
130
130
|
|
|
@@ -133,7 +133,7 @@ Research a technical topic.
|
|
|
133
133
|
- `context`: Context for the research
|
|
134
134
|
- `depth`: One of "brief", "standard", "deep"
|
|
135
135
|
|
|
136
|
-
### `
|
|
136
|
+
### `review_code`
|
|
137
137
|
|
|
138
138
|
Review code for quality and best practices.
|
|
139
139
|
|
|
@@ -143,7 +143,7 @@ Review code for quality and best practices.
|
|
|
143
143
|
- `scope`: Areas to focus on
|
|
144
144
|
- `project_guidelines`: Project-specific guidelines
|
|
145
145
|
|
|
146
|
-
### `
|
|
146
|
+
### `review_security`
|
|
147
147
|
|
|
148
148
|
Audit code for security vulnerabilities.
|
|
149
149
|
|
|
@@ -152,7 +152,7 @@ Audit code for security vulnerabilities.
|
|
|
152
152
|
- `language`: Programming language
|
|
153
153
|
- `context`: Context about the code
|
|
154
154
|
|
|
155
|
-
### `
|
|
155
|
+
### `generate_commit`
|
|
156
156
|
|
|
157
157
|
Generate a commit message from a git diff.
|
|
158
158
|
|
package/dist/index.js
CHANGED
|
@@ -70,23 +70,23 @@ var ProxyError = class extends Error {
|
|
|
70
70
|
}
|
|
71
71
|
};
|
|
72
72
|
var TOOL_TO_AGENT = {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
plan_feature: "planning-agent",
|
|
74
|
+
suggest_techstack: "research-agent",
|
|
75
|
+
research: "research-agent",
|
|
76
|
+
review_code: "code-review-agent",
|
|
77
|
+
review_security: "security-agent",
|
|
78
|
+
generate_commit: "commit-agent"
|
|
79
79
|
};
|
|
80
80
|
function formatToolArgsToPrompt(toolName, args) {
|
|
81
81
|
switch (toolName) {
|
|
82
|
-
case "
|
|
82
|
+
case "plan_feature":
|
|
83
83
|
return [
|
|
84
84
|
`Feature: ${args.feature_description}`,
|
|
85
85
|
args.codebase_context && `Codebase Context: ${args.codebase_context}`,
|
|
86
86
|
args.tech_stack && `Tech Stack: ${args.tech_stack}`,
|
|
87
87
|
args.constraints && `Constraints: ${args.constraints}`
|
|
88
88
|
].filter(Boolean).join("\n\n");
|
|
89
|
-
case "
|
|
89
|
+
case "suggest_techstack":
|
|
90
90
|
return [
|
|
91
91
|
`Project Requirements: ${args.requirements}`,
|
|
92
92
|
args.project_type && `Project Type: ${args.project_type}`,
|
|
@@ -94,7 +94,7 @@ function formatToolArgsToPrompt(toolName, args) {
|
|
|
94
94
|
args.preferences && `Preferences: ${args.preferences}`,
|
|
95
95
|
"\nPlease recommend an optimal tech stack."
|
|
96
96
|
].filter(Boolean).join("\n");
|
|
97
|
-
case "
|
|
97
|
+
case "research": {
|
|
98
98
|
const depthInstructions = {
|
|
99
99
|
brief: "Provide a brief overview.",
|
|
100
100
|
standard: "Provide a detailed analysis.",
|
|
@@ -106,7 +106,7 @@ function formatToolArgsToPrompt(toolName, args) {
|
|
|
106
106
|
depthInstructions[args.depth || "standard"]
|
|
107
107
|
].filter(Boolean).join("\n");
|
|
108
108
|
}
|
|
109
|
-
case "
|
|
109
|
+
case "review_code":
|
|
110
110
|
return [
|
|
111
111
|
args.language && `Language: ${args.language}`,
|
|
112
112
|
args.scope && `Focus areas: ${args.scope}`,
|
|
@@ -114,14 +114,14 @@ function formatToolArgsToPrompt(toolName, args) {
|
|
|
114
114
|
"\n```\n" + args.code + "\n```",
|
|
115
115
|
"\nPlease review this code for quality and best practices."
|
|
116
116
|
].filter(Boolean).join("\n");
|
|
117
|
-
case "
|
|
117
|
+
case "review_security":
|
|
118
118
|
return [
|
|
119
119
|
args.language && `Language: ${args.language}`,
|
|
120
120
|
args.context && `Context: ${args.context}`,
|
|
121
121
|
"\n```\n" + args.code + "\n```",
|
|
122
122
|
"\nPlease audit this code for security vulnerabilities."
|
|
123
123
|
].filter(Boolean).join("\n");
|
|
124
|
-
case "
|
|
124
|
+
case "generate_commit":
|
|
125
125
|
return [
|
|
126
126
|
args.files_changed && `Files changed:
|
|
127
127
|
${args.files_changed}`,
|
|
@@ -299,7 +299,7 @@ var MCPProxy = class {
|
|
|
299
299
|
// src/index.ts
|
|
300
300
|
var TOOLS = [
|
|
301
301
|
{
|
|
302
|
-
name: "
|
|
302
|
+
name: "plan_feature",
|
|
303
303
|
description: "Create a structured development plan for a feature. Returns requirements, design approach, and task breakdown.",
|
|
304
304
|
inputSchema: {
|
|
305
305
|
type: "object",
|
|
@@ -325,7 +325,7 @@ var TOOLS = [
|
|
|
325
325
|
}
|
|
326
326
|
},
|
|
327
327
|
{
|
|
328
|
-
name: "
|
|
328
|
+
name: "suggest_techstack",
|
|
329
329
|
description: "Get tech stack recommendations based on project requirements. Returns recommended technologies with justification.",
|
|
330
330
|
inputSchema: {
|
|
331
331
|
type: "object",
|
|
@@ -351,7 +351,7 @@ var TOOLS = [
|
|
|
351
351
|
}
|
|
352
352
|
},
|
|
353
353
|
{
|
|
354
|
-
name: "
|
|
354
|
+
name: "research",
|
|
355
355
|
description: "Research a technical topic. Returns structured summary with key concepts, best practices, and resources.",
|
|
356
356
|
inputSchema: {
|
|
357
357
|
type: "object",
|
|
@@ -374,7 +374,7 @@ var TOOLS = [
|
|
|
374
374
|
}
|
|
375
375
|
},
|
|
376
376
|
{
|
|
377
|
-
name: "
|
|
377
|
+
name: "review_code",
|
|
378
378
|
description: "Review code for quality, maintainability, and best practices. Returns quality checklist and improvement suggestions.",
|
|
379
379
|
inputSchema: {
|
|
380
380
|
type: "object",
|
|
@@ -400,7 +400,7 @@ var TOOLS = [
|
|
|
400
400
|
}
|
|
401
401
|
},
|
|
402
402
|
{
|
|
403
|
-
name: "
|
|
403
|
+
name: "review_security",
|
|
404
404
|
description: "Audit code for security vulnerabilities. Returns security checklist and vulnerability report.",
|
|
405
405
|
inputSchema: {
|
|
406
406
|
type: "object",
|
|
@@ -422,7 +422,7 @@ var TOOLS = [
|
|
|
422
422
|
}
|
|
423
423
|
},
|
|
424
424
|
{
|
|
425
|
-
name: "
|
|
425
|
+
name: "generate_commit",
|
|
426
426
|
description: "Generate a commit message from a git diff. Returns Conventional Commits formatted message.",
|
|
427
427
|
inputSchema: {
|
|
428
428
|
type: "object",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/proxy.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\n\nimport { loadConfig } from \"./config.js\";\nimport { MCPProxy, ProxyError } from \"./proxy.js\";\n\n/**\n * Jai1 MCP Proxy Server\n * \n * This is a stdio MCP server that acts as a proxy to the remote Jai1 MCP Server.\n * It allows IDE AI agents (Cursor, Windsurf) to access Jai1 developer tools.\n * \n * Usage:\n * JAI1_ACCESS_KEY=your_key npx @jvittechs/jai1-mcp\n * \n * Or in Cursor MCP config:\n * {\n * \"mcpServers\": {\n * \"jai1\": {\n * \"command\": \"npx\",\n * \"args\": [\"@jvittechs/jai1-mcp\"],\n * \"env\": {\n * \"JAI1_ACCESS_KEY\": \"your_key\"\n * }\n * }\n * }\n * }\n */\n\n// Tool definitions matching the mcp-server tools\nconst TOOLS = [\n {\n name: \"jai1_plan_feature\",\n description:\n \"Create a structured development plan for a feature. Returns requirements, design approach, and task breakdown.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n feature_description: {\n type: \"string\",\n description: \"Description of the feature to plan\",\n },\n codebase_context: {\n type: \"string\",\n description:\n \"Current codebase context (tech stack, patterns, relevant code)\",\n },\n tech_stack: {\n type: \"string\",\n description: \"Tech stack being used\",\n },\n constraints: {\n type: \"string\",\n description: \"Any constraints or requirements to consider\",\n },\n },\n required: [\"feature_description\"],\n },\n },\n {\n name: \"jai1_suggest_techstack\",\n description:\n \"Get tech stack recommendations based on project requirements. Returns recommended technologies with justification.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n requirements: {\n type: \"string\",\n description: \"Project requirements and goals\",\n },\n project_type: {\n type: \"string\",\n description: \"Type of project (web app, mobile, API, CLI, etc.)\",\n },\n constraints: {\n type: \"string\",\n description: \"Constraints (budget, team skills, timeline)\",\n },\n preferences: {\n type: \"string\",\n description: \"Any technology preferences or existing stack\",\n },\n },\n required: [\"requirements\"],\n },\n },\n {\n name: \"jai1_research\",\n description:\n \"Research a technical topic. Returns structured summary with key concepts, best practices, and resources.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n description: \"The topic to research\",\n },\n context: {\n type: \"string\",\n description: \"Context for the research (project, use case)\",\n },\n depth: {\n type: \"string\",\n enum: [\"brief\", \"standard\", \"deep\"],\n description:\n \"Depth of research: brief (overview), standard (detailed), deep (comprehensive)\",\n },\n },\n required: [\"topic\"],\n },\n },\n {\n name: \"jai1_review_code\",\n description:\n \"Review code for quality, maintainability, and best practices. Returns quality checklist and improvement suggestions.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n code: {\n type: \"string\",\n description: \"The code or diff to review\",\n },\n language: {\n type: \"string\",\n description: \"Programming language\",\n },\n scope: {\n type: \"string\",\n description:\n \"Specific areas to focus on (e.g., 'error handling', 'performance')\",\n },\n project_guidelines: {\n type: \"string\",\n description: \"Project-specific guidelines to check\",\n },\n },\n required: [\"code\"],\n },\n },\n {\n name: \"jai1_review_security\",\n description:\n \"Audit code for security vulnerabilities. Returns security checklist and vulnerability report.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n code: {\n type: \"string\",\n description: \"The code or diff to audit\",\n },\n language: {\n type: \"string\",\n description: \"Programming language\",\n },\n context: {\n type: \"string\",\n description:\n \"Context about the code (e.g., 'authentication endpoint', 'file upload handler')\",\n },\n },\n required: [\"code\"],\n },\n },\n {\n name: \"jai1_generate_commit\",\n description:\n \"Generate a commit message from a git diff. Returns Conventional Commits formatted message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n diff: {\n type: \"string\",\n description: \"Git diff content\",\n },\n files_changed: {\n type: \"string\",\n description: \"List of files changed with status\",\n },\n },\n required: [\"diff\"],\n },\n },\n];\n\nasync function main() {\n // Load configuration\n let config;\n try {\n config = loadConfig();\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const proxy = new MCPProxy(config);\n\n // Verify server is reachable\n const isHealthy = await proxy.healthCheck();\n if (!isHealthy) {\n console.error(\n `Warning: Cannot reach MCP server at ${config.serverUrl}. ` +\n `Requests may fail.`\n );\n }\n\n // Create MCP server\n const server = new Server(\n {\n name: \"jai1-mcp\",\n version: \"1.0.0\",\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Handle tool listing\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return { tools: TOOLS };\n });\n\n // Handle tool execution\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n // Validate tool exists\n const tool = TOOLS.find((t) => t.name === name);\n if (!tool) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: Unknown tool '${name}'. Available tools: ${TOOLS.map((t) => t.name).join(\", \")}`,\n },\n ],\n isError: true,\n };\n }\n\n try {\n // Call the remote MCP server\n const result = await proxy.callTool(name, args as Record<string, unknown>);\n\n // Handle different response types\n if (typeof result === \"string\") {\n return {\n content: [{ type: \"text\" as const, text: result }],\n };\n }\n\n if (typeof result === \"object\" && result !== null) {\n // If result has a 'result' property, extract it\n const data = (result as Record<string, unknown>).result ?? result;\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof data === \"string\" ? data : JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n return {\n content: [{ type: \"text\" as const, text: String(result) }],\n };\n } catch (error) {\n const message =\n error instanceof ProxyError\n ? `[${error.code}] ${error.message}`\n : `Error: ${error instanceof Error ? error.message : String(error)}`;\n\n return {\n content: [{ type: \"text\" as const, text: message }],\n isError: true,\n };\n }\n });\n\n // Connect via stdio\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Handle graceful shutdown\n process.on(\"SIGINT\", async () => {\n await server.close();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n await server.close();\n process.exit(0);\n });\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n","import { z } from \"zod\";\n\n/**\n * Configuration schema for the MCP proxy\n * \n * Required environment variables:\n * - JAI1_ACCESS_KEY: Your Jai1 access key\n * - JAI1_MCP_SERVER_URL: MCP server URL (e.g., https://mcp.example.com)\n * \n * Optional environment variables:\n * - JAI1_MCP_TIMEOUT: Request timeout in ms (default: 120000)\n * - JAI1_MCP_DEBUG: Enable debug logging (default: false)\n */\nconst ConfigSchema = z.object({\n /** MCP Server URL - REQUIRED, no default to avoid exposing URL in published package */\n serverUrl: z\n .string()\n .url(\"JAI1_MCP_SERVER_URL must be a valid URL\"),\n\n /** JAI1 Access Key for authentication */\n accessKey: z.string().min(1, \"JAI1_ACCESS_KEY is required\"),\n\n /** Request timeout in milliseconds */\n timeout: z.number().positive().default(120000),\n\n /** Enable debug logging */\n debug: z.boolean().default(false),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\n/**\n * Load configuration from environment variables\n * \n * Example Cursor MCP config:\n * ```json\n * {\n * \"mcpServers\": {\n * \"jai1\": {\n * \"command\": \"npx\",\n * \"args\": [\"@jvittechs/jai1-mcp\"],\n * \"env\": {\n * \"JAI1_ACCESS_KEY\": \"your_access_key\",\n * \"JAI1_MCP_SERVER_URL\": \"https://mcp.example.com\"\n * }\n * }\n * }\n * }\n * ```\n */\nexport function loadConfig(): Config {\n const rawConfig = {\n serverUrl: process.env.JAI1_MCP_SERVER_URL,\n accessKey: process.env.JAI1_ACCESS_KEY,\n timeout: process.env.JAI1_MCP_TIMEOUT\n ? parseInt(process.env.JAI1_MCP_TIMEOUT, 10)\n : undefined,\n debug:\n process.env.JAI1_MCP_DEBUG === \"true\" ||\n process.env.DEBUG === \"true\",\n };\n\n const result = ConfigSchema.safeParse(rawConfig);\n\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(\n `Invalid MCP proxy configuration:\\n${errors}\\n\\n` +\n `Required environment variables:\\n` +\n ` JAI1_ACCESS_KEY - Your Jai1 access key\\n` +\n ` JAI1_MCP_SERVER_URL - MCP server URL\\n\\n` +\n `Optional environment variables:\\n` +\n ` JAI1_MCP_TIMEOUT - Request timeout in ms (default: 120000)\\n` +\n ` JAI1_MCP_DEBUG - Enable debug logging (default: false)\\n\\n` +\n `Example Cursor MCP config:\\n` +\n ` {\\n` +\n ` \"mcpServers\": {\\n` +\n ` \"jai1\": {\\n` +\n ` \"command\": \"npx\",\\n` +\n ` \"args\": [\"@jvittechs/jai1-mcp\"],\\n` +\n ` \"env\": {\\n` +\n ` \"JAI1_ACCESS_KEY\": \"your_key\",\\n` +\n ` \"JAI1_MCP_SERVER_URL\": \"https://mcp.example.com\"\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }`\n );\n }\n\n return result.data;\n}\n\n/**\n * Default config values for documentation purposes\n * Note: serverUrl has no default - must be provided via env\n */\nexport const DEFAULT_CONFIG = {\n timeout: 120000,\n debug: false,\n} as const;\n\n","import type { Config } from \"./config.js\";\n\n/**\n * Error class for proxy-related errors\n */\nexport class ProxyError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode?: number\n ) {\n super(message);\n this.name = \"ProxyError\";\n }\n}\n\n/**\n * Tool to Agent mapping\n * Maps MCP tool names to their corresponding agent IDs on the server\n */\nconst TOOL_TO_AGENT: Record<string, string> = {\n jai1_plan_feature: \"planning-agent\",\n jai1_suggest_techstack: \"research-agent\",\n jai1_research: \"research-agent\",\n jai1_review_code: \"code-review-agent\",\n jai1_review_security: \"security-agent\",\n jai1_generate_commit: \"commit-agent\",\n};\n\n/**\n * Format tool arguments into a prompt message for the agent\n */\nfunction formatToolArgsToPrompt(toolName: string, args: Record<string, unknown>): string {\n switch (toolName) {\n case \"jai1_plan_feature\":\n return [\n `Feature: ${args.feature_description}`,\n args.codebase_context && `Codebase Context: ${args.codebase_context}`,\n args.tech_stack && `Tech Stack: ${args.tech_stack}`,\n args.constraints && `Constraints: ${args.constraints}`,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n case \"jai1_suggest_techstack\":\n return [\n `Project Requirements: ${args.requirements}`,\n args.project_type && `Project Type: ${args.project_type}`,\n args.constraints && `Constraints: ${args.constraints}`,\n args.preferences && `Preferences: ${args.preferences}`,\n \"\\nPlease recommend an optimal tech stack.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n case \"jai1_research\": {\n const depthInstructions: Record<string, string> = {\n brief: \"Provide a brief overview.\",\n standard: \"Provide a detailed analysis.\",\n deep: \"Provide a comprehensive, in-depth analysis.\",\n };\n return [\n `Research Topic: ${args.topic}`,\n args.context && `Context: ${args.context}`,\n depthInstructions[(args.depth as string) || \"standard\"],\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n case \"jai1_review_code\":\n return [\n args.language && `Language: ${args.language}`,\n args.scope && `Focus areas: ${args.scope}`,\n args.project_guidelines && `Project guidelines: ${args.project_guidelines}`,\n \"\\n```\\n\" + args.code + \"\\n```\",\n \"\\nPlease review this code for quality and best practices.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n case \"jai1_review_security\":\n return [\n args.language && `Language: ${args.language}`,\n args.context && `Context: ${args.context}`,\n \"\\n```\\n\" + args.code + \"\\n```\",\n \"\\nPlease audit this code for security vulnerabilities.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n case \"jai1_generate_commit\":\n return [\n args.files_changed && `Files changed:\\n${args.files_changed}`,\n `\\nDiff:\\n\\`\\`\\`diff\\n${args.diff}\\n\\`\\`\\``,\n \"\\nGenerate a commit message for these changes.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n default:\n // Fallback: just stringify all args\n return Object.entries(args)\n .map(([key, value]) => `${key}: ${value}`)\n .join(\"\\n\");\n }\n}\n\n/**\n * HTTP client for proxying requests to the MCP server\n */\nexport class MCPProxy {\n private config: Config;\n private debug: (...args: unknown[]) => void;\n\n constructor(config: Config) {\n this.config = config;\n this.debug = config.debug\n ? (...args: unknown[]) => console.error(\"[MCP-PROXY]\", ...args)\n : () => { };\n }\n\n /**\n * Call a tool on the remote MCP server\n * Maps tools to agents and calls the Mastra generate endpoint\n */\n async callTool(\n toolName: string,\n args: Record<string, unknown>\n ): Promise<unknown> {\n // Get the agent ID for this tool\n const agentId = TOOL_TO_AGENT[toolName];\n if (!agentId) {\n throw new ProxyError(\n `Unknown tool: ${toolName}. Available: ${Object.keys(TOOL_TO_AGENT).join(\", \")}`,\n \"ERR-MCP-003\",\n 404\n );\n }\n\n // Build the correct endpoint URL\n const url = `${this.config.serverUrl}/api/agents/${agentId}/generate`;\n\n // Format args into a message prompt\n const prompt = formatToolArgsToPrompt(toolName, args);\n const body = {\n messages: [{ role: \"user\", content: prompt }],\n };\n\n this.debug(`Calling tool: ${toolName}`, { url, agentId, prompt: prompt.substring(0, 100) });\n\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.timeout\n );\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.accessKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n this.debug(`Tool error response:`, { status: response.status, body: errorBody });\n\n if (response.status === 401) {\n throw new ProxyError(\n \"Invalid JAI1_ACCESS_KEY\",\n \"ERR-MCP-001\",\n 401\n );\n }\n if (response.status === 404) {\n throw new ProxyError(\n `Agent not found: ${agentId}`,\n \"ERR-MCP-003\",\n 404\n );\n }\n throw new ProxyError(\n `Server error: ${errorBody}`,\n \"ERR-MCP-004\",\n response.status\n );\n }\n\n const result = await response.json() as { text?: string };\n this.debug(`Tool response:`, { toolName, hasText: !!result.text });\n\n // Return the text content from the agent response\n return result.text || result;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ProxyError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new ProxyError(\n `Request timeout after ${this.config.timeout}ms`,\n \"ERR-MCP-002\",\n 504\n );\n }\n\n throw new ProxyError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n \"ERR-MCP-005\"\n );\n }\n }\n\n /**\n * List available tools from the MCP server\n */\n async listTools(): Promise<ToolInfo[]> {\n const url = `${this.config.serverUrl}/api/mcp/tools`;\n this.debug(`Listing tools from: ${url}`);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.timeout\n );\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.config.accessKey}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new ProxyError(\n \"Invalid JAI1_ACCESS_KEY\",\n \"ERR-MCP-001\",\n 401\n );\n }\n throw new ProxyError(\n `Failed to list tools: ${response.statusText}`,\n \"ERR-MCP-004\",\n response.status\n );\n }\n\n const data = await response.json();\n this.debug(`Available tools:`, data);\n return data.tools || [];\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ProxyError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new ProxyError(\n `Request timeout after ${this.config.timeout}ms`,\n \"ERR-MCP-002\",\n 504\n );\n }\n\n throw new ProxyError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n \"ERR-MCP-005\"\n );\n }\n }\n\n /**\n * Health check for the MCP server\n */\n async healthCheck(): Promise<boolean> {\n const url = `${this.config.serverUrl}/health`;\n this.debug(`Health check: ${url}`);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n signal: AbortSignal.timeout(5000),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Tool information returned from the server\n */\nexport interface ToolInfo {\n name: string;\n description: string;\n inputSchema: {\n type: string;\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/proxy.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\n\nimport { loadConfig } from \"./config.js\";\nimport { MCPProxy, ProxyError } from \"./proxy.js\";\n\n/**\n * Jai1 MCP Proxy Server\n * \n * This is a stdio MCP server that acts as a proxy to the remote Jai1 MCP Server.\n * It allows IDE AI agents (Cursor, Windsurf) to access Jai1 developer tools.\n * \n * Usage:\n * JAI1_ACCESS_KEY=your_key npx @jvittechs/jai1-mcp\n * \n * Or in Cursor MCP config:\n * {\n * \"mcpServers\": {\n * \"jai1\": {\n * \"command\": \"npx\",\n * \"args\": [\"@jvittechs/jai1-mcp\"],\n * \"env\": {\n * \"JAI1_ACCESS_KEY\": \"your_key\"\n * }\n * }\n * }\n * }\n */\n\n// Tool definitions matching the mcp-server tools\nconst TOOLS = [\n {\n name: \"plan_feature\",\n description:\n \"Create a structured development plan for a feature. Returns requirements, design approach, and task breakdown.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n feature_description: {\n type: \"string\",\n description: \"Description of the feature to plan\",\n },\n codebase_context: {\n type: \"string\",\n description:\n \"Current codebase context (tech stack, patterns, relevant code)\",\n },\n tech_stack: {\n type: \"string\",\n description: \"Tech stack being used\",\n },\n constraints: {\n type: \"string\",\n description: \"Any constraints or requirements to consider\",\n },\n },\n required: [\"feature_description\"],\n },\n },\n {\n name: \"suggest_techstack\",\n description:\n \"Get tech stack recommendations based on project requirements. Returns recommended technologies with justification.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n requirements: {\n type: \"string\",\n description: \"Project requirements and goals\",\n },\n project_type: {\n type: \"string\",\n description: \"Type of project (web app, mobile, API, CLI, etc.)\",\n },\n constraints: {\n type: \"string\",\n description: \"Constraints (budget, team skills, timeline)\",\n },\n preferences: {\n type: \"string\",\n description: \"Any technology preferences or existing stack\",\n },\n },\n required: [\"requirements\"],\n },\n },\n {\n name: \"research\",\n description:\n \"Research a technical topic. Returns structured summary with key concepts, best practices, and resources.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n description: \"The topic to research\",\n },\n context: {\n type: \"string\",\n description: \"Context for the research (project, use case)\",\n },\n depth: {\n type: \"string\",\n enum: [\"brief\", \"standard\", \"deep\"],\n description:\n \"Depth of research: brief (overview), standard (detailed), deep (comprehensive)\",\n },\n },\n required: [\"topic\"],\n },\n },\n {\n name: \"review_code\",\n description:\n \"Review code for quality, maintainability, and best practices. Returns quality checklist and improvement suggestions.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n code: {\n type: \"string\",\n description: \"The code or diff to review\",\n },\n language: {\n type: \"string\",\n description: \"Programming language\",\n },\n scope: {\n type: \"string\",\n description:\n \"Specific areas to focus on (e.g., 'error handling', 'performance')\",\n },\n project_guidelines: {\n type: \"string\",\n description: \"Project-specific guidelines to check\",\n },\n },\n required: [\"code\"],\n },\n },\n {\n name: \"review_security\",\n description:\n \"Audit code for security vulnerabilities. Returns security checklist and vulnerability report.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n code: {\n type: \"string\",\n description: \"The code or diff to audit\",\n },\n language: {\n type: \"string\",\n description: \"Programming language\",\n },\n context: {\n type: \"string\",\n description:\n \"Context about the code (e.g., 'authentication endpoint', 'file upload handler')\",\n },\n },\n required: [\"code\"],\n },\n },\n {\n name: \"generate_commit\",\n description:\n \"Generate a commit message from a git diff. Returns Conventional Commits formatted message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n diff: {\n type: \"string\",\n description: \"Git diff content\",\n },\n files_changed: {\n type: \"string\",\n description: \"List of files changed with status\",\n },\n },\n required: [\"diff\"],\n },\n },\n];\n\nasync function main() {\n // Load configuration\n let config;\n try {\n config = loadConfig();\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const proxy = new MCPProxy(config);\n\n // Verify server is reachable\n const isHealthy = await proxy.healthCheck();\n if (!isHealthy) {\n console.error(\n `Warning: Cannot reach MCP server at ${config.serverUrl}. ` +\n `Requests may fail.`\n );\n }\n\n // Create MCP server\n const server = new Server(\n {\n name: \"jai1-mcp\",\n version: \"1.0.0\",\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Handle tool listing\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return { tools: TOOLS };\n });\n\n // Handle tool execution\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n // Validate tool exists\n const tool = TOOLS.find((t) => t.name === name);\n if (!tool) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: Unknown tool '${name}'. Available tools: ${TOOLS.map((t) => t.name).join(\", \")}`,\n },\n ],\n isError: true,\n };\n }\n\n try {\n // Call the remote MCP server\n const result = await proxy.callTool(name, args as Record<string, unknown>);\n\n // Handle different response types\n if (typeof result === \"string\") {\n return {\n content: [{ type: \"text\" as const, text: result }],\n };\n }\n\n if (typeof result === \"object\" && result !== null) {\n // If result has a 'result' property, extract it\n const data = (result as Record<string, unknown>).result ?? result;\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof data === \"string\" ? data : JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n\n return {\n content: [{ type: \"text\" as const, text: String(result) }],\n };\n } catch (error) {\n const message =\n error instanceof ProxyError\n ? `[${error.code}] ${error.message}`\n : `Error: ${error instanceof Error ? error.message : String(error)}`;\n\n return {\n content: [{ type: \"text\" as const, text: message }],\n isError: true,\n };\n }\n });\n\n // Connect via stdio\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Handle graceful shutdown\n process.on(\"SIGINT\", async () => {\n await server.close();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n await server.close();\n process.exit(0);\n });\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n","import { z } from \"zod\";\n\n/**\n * Configuration schema for the MCP proxy\n * \n * Required environment variables:\n * - JAI1_ACCESS_KEY: Your Jai1 access key\n * - JAI1_MCP_SERVER_URL: MCP server URL (e.g., https://mcp.example.com)\n * \n * Optional environment variables:\n * - JAI1_MCP_TIMEOUT: Request timeout in ms (default: 120000)\n * - JAI1_MCP_DEBUG: Enable debug logging (default: false)\n */\nconst ConfigSchema = z.object({\n /** MCP Server URL - REQUIRED, no default to avoid exposing URL in published package */\n serverUrl: z\n .string()\n .url(\"JAI1_MCP_SERVER_URL must be a valid URL\"),\n\n /** JAI1 Access Key for authentication */\n accessKey: z.string().min(1, \"JAI1_ACCESS_KEY is required\"),\n\n /** Request timeout in milliseconds */\n timeout: z.number().positive().default(120000),\n\n /** Enable debug logging */\n debug: z.boolean().default(false),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\n/**\n * Load configuration from environment variables\n * \n * Example Cursor MCP config:\n * ```json\n * {\n * \"mcpServers\": {\n * \"jai1\": {\n * \"command\": \"npx\",\n * \"args\": [\"@jvittechs/jai1-mcp\"],\n * \"env\": {\n * \"JAI1_ACCESS_KEY\": \"your_access_key\",\n * \"JAI1_MCP_SERVER_URL\": \"https://mcp.example.com\"\n * }\n * }\n * }\n * }\n * ```\n */\nexport function loadConfig(): Config {\n const rawConfig = {\n serverUrl: process.env.JAI1_MCP_SERVER_URL,\n accessKey: process.env.JAI1_ACCESS_KEY,\n timeout: process.env.JAI1_MCP_TIMEOUT\n ? parseInt(process.env.JAI1_MCP_TIMEOUT, 10)\n : undefined,\n debug:\n process.env.JAI1_MCP_DEBUG === \"true\" ||\n process.env.DEBUG === \"true\",\n };\n\n const result = ConfigSchema.safeParse(rawConfig);\n\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(\n `Invalid MCP proxy configuration:\\n${errors}\\n\\n` +\n `Required environment variables:\\n` +\n ` JAI1_ACCESS_KEY - Your Jai1 access key\\n` +\n ` JAI1_MCP_SERVER_URL - MCP server URL\\n\\n` +\n `Optional environment variables:\\n` +\n ` JAI1_MCP_TIMEOUT - Request timeout in ms (default: 120000)\\n` +\n ` JAI1_MCP_DEBUG - Enable debug logging (default: false)\\n\\n` +\n `Example Cursor MCP config:\\n` +\n ` {\\n` +\n ` \"mcpServers\": {\\n` +\n ` \"jai1\": {\\n` +\n ` \"command\": \"npx\",\\n` +\n ` \"args\": [\"@jvittechs/jai1-mcp\"],\\n` +\n ` \"env\": {\\n` +\n ` \"JAI1_ACCESS_KEY\": \"your_key\",\\n` +\n ` \"JAI1_MCP_SERVER_URL\": \"https://mcp.example.com\"\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }`\n );\n }\n\n return result.data;\n}\n\n/**\n * Default config values for documentation purposes\n * Note: serverUrl has no default - must be provided via env\n */\nexport const DEFAULT_CONFIG = {\n timeout: 120000,\n debug: false,\n} as const;\n\n","import type { Config } from \"./config.js\";\n\n/**\n * Error class for proxy-related errors\n */\nexport class ProxyError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode?: number\n ) {\n super(message);\n this.name = \"ProxyError\";\n }\n}\n\n/**\n * Tool to Agent mapping\n * Maps MCP tool names to their corresponding agent IDs on the server\n */\nconst TOOL_TO_AGENT: Record<string, string> = {\n plan_feature: \"planning-agent\",\n suggest_techstack: \"research-agent\",\n research: \"research-agent\",\n review_code: \"code-review-agent\",\n review_security: \"security-agent\",\n generate_commit: \"commit-agent\",\n};\n\n/**\n * Format tool arguments into a prompt message for the agent\n */\nfunction formatToolArgsToPrompt(toolName: string, args: Record<string, unknown>): string {\n switch (toolName) {\n case \"plan_feature\":\n return [\n `Feature: ${args.feature_description}`,\n args.codebase_context && `Codebase Context: ${args.codebase_context}`,\n args.tech_stack && `Tech Stack: ${args.tech_stack}`,\n args.constraints && `Constraints: ${args.constraints}`,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n case \"suggest_techstack\":\n return [\n `Project Requirements: ${args.requirements}`,\n args.project_type && `Project Type: ${args.project_type}`,\n args.constraints && `Constraints: ${args.constraints}`,\n args.preferences && `Preferences: ${args.preferences}`,\n \"\\nPlease recommend an optimal tech stack.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n case \"research\": {\n const depthInstructions: Record<string, string> = {\n brief: \"Provide a brief overview.\",\n standard: \"Provide a detailed analysis.\",\n deep: \"Provide a comprehensive, in-depth analysis.\",\n };\n return [\n `Research Topic: ${args.topic}`,\n args.context && `Context: ${args.context}`,\n depthInstructions[(args.depth as string) || \"standard\"],\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n case \"review_code\":\n return [\n args.language && `Language: ${args.language}`,\n args.scope && `Focus areas: ${args.scope}`,\n args.project_guidelines && `Project guidelines: ${args.project_guidelines}`,\n \"\\n```\\n\" + args.code + \"\\n```\",\n \"\\nPlease review this code for quality and best practices.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n case \"review_security\":\n return [\n args.language && `Language: ${args.language}`,\n args.context && `Context: ${args.context}`,\n \"\\n```\\n\" + args.code + \"\\n```\",\n \"\\nPlease audit this code for security vulnerabilities.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n case \"generate_commit\":\n return [\n args.files_changed && `Files changed:\\n${args.files_changed}`,\n `\\nDiff:\\n\\`\\`\\`diff\\n${args.diff}\\n\\`\\`\\``,\n \"\\nGenerate a commit message for these changes.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n default:\n // Fallback: just stringify all args\n return Object.entries(args)\n .map(([key, value]) => `${key}: ${value}`)\n .join(\"\\n\");\n }\n}\n\n/**\n * HTTP client for proxying requests to the MCP server\n */\nexport class MCPProxy {\n private config: Config;\n private debug: (...args: unknown[]) => void;\n\n constructor(config: Config) {\n this.config = config;\n this.debug = config.debug\n ? (...args: unknown[]) => console.error(\"[MCP-PROXY]\", ...args)\n : () => { };\n }\n\n /**\n * Call a tool on the remote MCP server\n * Maps tools to agents and calls the Mastra generate endpoint\n */\n async callTool(\n toolName: string,\n args: Record<string, unknown>\n ): Promise<unknown> {\n // Get the agent ID for this tool\n const agentId = TOOL_TO_AGENT[toolName];\n if (!agentId) {\n throw new ProxyError(\n `Unknown tool: ${toolName}. Available: ${Object.keys(TOOL_TO_AGENT).join(\", \")}`,\n \"ERR-MCP-003\",\n 404\n );\n }\n\n // Build the correct endpoint URL\n const url = `${this.config.serverUrl}/api/agents/${agentId}/generate`;\n\n // Format args into a message prompt\n const prompt = formatToolArgsToPrompt(toolName, args);\n const body = {\n messages: [{ role: \"user\", content: prompt }],\n };\n\n this.debug(`Calling tool: ${toolName}`, { url, agentId, prompt: prompt.substring(0, 100) });\n\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.timeout\n );\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.accessKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n this.debug(`Tool error response:`, { status: response.status, body: errorBody });\n\n if (response.status === 401) {\n throw new ProxyError(\n \"Invalid JAI1_ACCESS_KEY\",\n \"ERR-MCP-001\",\n 401\n );\n }\n if (response.status === 404) {\n throw new ProxyError(\n `Agent not found: ${agentId}`,\n \"ERR-MCP-003\",\n 404\n );\n }\n throw new ProxyError(\n `Server error: ${errorBody}`,\n \"ERR-MCP-004\",\n response.status\n );\n }\n\n const result = await response.json() as { text?: string };\n this.debug(`Tool response:`, { toolName, hasText: !!result.text });\n\n // Return the text content from the agent response\n return result.text || result;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ProxyError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new ProxyError(\n `Request timeout after ${this.config.timeout}ms`,\n \"ERR-MCP-002\",\n 504\n );\n }\n\n throw new ProxyError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n \"ERR-MCP-005\"\n );\n }\n }\n\n /**\n * List available tools from the MCP server\n */\n async listTools(): Promise<ToolInfo[]> {\n const url = `${this.config.serverUrl}/api/mcp/tools`;\n this.debug(`Listing tools from: ${url}`);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.timeout\n );\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.config.accessKey}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new ProxyError(\n \"Invalid JAI1_ACCESS_KEY\",\n \"ERR-MCP-001\",\n 401\n );\n }\n throw new ProxyError(\n `Failed to list tools: ${response.statusText}`,\n \"ERR-MCP-004\",\n response.status\n );\n }\n\n const data = await response.json();\n this.debug(`Available tools:`, data);\n return data.tools || [];\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ProxyError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new ProxyError(\n `Request timeout after ${this.config.timeout}ms`,\n \"ERR-MCP-002\",\n 504\n );\n }\n\n throw new ProxyError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n \"ERR-MCP-005\"\n );\n }\n }\n\n /**\n * Health check for the MCP server\n */\n async healthCheck(): Promise<boolean> {\n const url = `${this.config.serverUrl}/health`;\n this.debug(`Health check: ${url}`);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n signal: AbortSignal.timeout(5000),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Tool information returned from the server\n */\nexport interface ToolInfo {\n name: string;\n description: string;\n inputSchema: {\n type: string;\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n"],"mappings":";;;AAEA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACI;AAAA,EACA;AAAA,OACG;;;ACPP,SAAS,SAAS;AAalB,IAAM,eAAe,EAAE,OAAO;AAAA;AAAA,EAE1B,WAAW,EACN,OAAO,EACP,IAAI,yCAAyC;AAAA;AAAA,EAGlD,WAAW,EAAE,OAAO,EAAE,IAAI,GAAG,6BAA6B;AAAA;AAAA,EAG1D,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAM;AAAA;AAAA,EAG7C,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACpC,CAAC;AAuBM,SAAS,aAAqB;AACjC,QAAM,YAAY;AAAA,IACd,WAAW,QAAQ,IAAI;AAAA,IACvB,WAAW,QAAQ,IAAI;AAAA,IACvB,SAAS,QAAQ,IAAI,mBACf,SAAS,QAAQ,IAAI,kBAAkB,EAAE,IACzC;AAAA,IACN,OACI,QAAQ,IAAI,mBAAmB,UAC/B,QAAQ,IAAI,UAAU;AAAA,EAC9B;AAEA,QAAM,SAAS,aAAa,UAAU,SAAS;AAE/C,MAAI,CAAC,OAAO,SAAS;AACjB,UAAM,SAAS,OAAO,MAAM,OACvB,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAClD,KAAK,IAAI;AACd,UAAM,IAAI;AAAA,MACN;AAAA,EAAqC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoB/C;AAAA,EACJ;AAEA,SAAO,OAAO;AAClB;;;ACxFO,IAAM,aAAN,cAAyB,MAAM;AAAA,EAClC,YACI,SACgB,MACA,YAClB;AACE,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EAChB;AACJ;AAMA,IAAM,gBAAwC;AAAA,EAC1C,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,iBAAiB;AACrB;AAKA,SAAS,uBAAuB,UAAkB,MAAuC;AACrF,UAAQ,UAAU;AAAA,IACd,KAAK;AACD,aAAO;AAAA,QACH,YAAY,KAAK,mBAAmB;AAAA,QACpC,KAAK,oBAAoB,qBAAqB,KAAK,gBAAgB;AAAA,QACnE,KAAK,cAAc,eAAe,KAAK,UAAU;AAAA,QACjD,KAAK,eAAe,gBAAgB,KAAK,WAAW;AAAA,MACxD,EACK,OAAO,OAAO,EACd,KAAK,MAAM;AAAA,IAEpB,KAAK;AACD,aAAO;AAAA,QACH,yBAAyB,KAAK,YAAY;AAAA,QAC1C,KAAK,gBAAgB,iBAAiB,KAAK,YAAY;AAAA,QACvD,KAAK,eAAe,gBAAgB,KAAK,WAAW;AAAA,QACpD,KAAK,eAAe,gBAAgB,KAAK,WAAW;AAAA,QACpD;AAAA,MACJ,EACK,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,IAElB,KAAK,YAAY;AACb,YAAM,oBAA4C;AAAA,QAC9C,OAAO;AAAA,QACP,UAAU;AAAA,QACV,MAAM;AAAA,MACV;AACA,aAAO;AAAA,QACH,mBAAmB,KAAK,KAAK;AAAA,QAC7B,KAAK,WAAW,YAAY,KAAK,OAAO;AAAA,QACxC,kBAAmB,KAAK,SAAoB,UAAU;AAAA,MAC1D,EACK,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,IAClB;AAAA,IAEA,KAAK;AACD,aAAO;AAAA,QACH,KAAK,YAAY,aAAa,KAAK,QAAQ;AAAA,QAC3C,KAAK,SAAS,gBAAgB,KAAK,KAAK;AAAA,QACxC,KAAK,sBAAsB,uBAAuB,KAAK,kBAAkB;AAAA,QACzE,YAAY,KAAK,OAAO;AAAA,QACxB;AAAA,MACJ,EACK,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,IAElB,KAAK;AACD,aAAO;AAAA,QACH,KAAK,YAAY,aAAa,KAAK,QAAQ;AAAA,QAC3C,KAAK,WAAW,YAAY,KAAK,OAAO;AAAA,QACxC,YAAY,KAAK,OAAO;AAAA,QACxB;AAAA,MACJ,EACK,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,IAElB,KAAK;AACD,aAAO;AAAA,QACH,KAAK,iBAAiB;AAAA,EAAmB,KAAK,aAAa;AAAA,QAC3D;AAAA;AAAA;AAAA,EAAwB,KAAK,IAAI;AAAA;AAAA,QACjC;AAAA,MACJ,EACK,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,IAElB;AAEI,aAAO,OAAO,QAAQ,IAAI,EACrB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,KAAK,EAAE,EACxC,KAAK,IAAI;AAAA,EACtB;AACJ;AAKO,IAAM,WAAN,MAAe;AAAA,EACV;AAAA,EACA;AAAA,EAER,YAAY,QAAgB;AACxB,SAAK,SAAS;AACd,SAAK,QAAQ,OAAO,QACd,IAAI,SAAoB,QAAQ,MAAM,eAAe,GAAG,IAAI,IAC5D,MAAM;AAAA,IAAE;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SACF,UACA,MACgB;AAEhB,UAAM,UAAU,cAAc,QAAQ;AACtC,QAAI,CAAC,SAAS;AACV,YAAM,IAAI;AAAA,QACN,iBAAiB,QAAQ,gBAAgB,OAAO,KAAK,aAAa,EAAE,KAAK,IAAI,CAAC;AAAA,QAC9E;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,MAAM,GAAG,KAAK,OAAO,SAAS,eAAe,OAAO;AAG1D,UAAM,SAAS,uBAAuB,UAAU,IAAI;AACpD,UAAM,OAAO;AAAA,MACT,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,IAChD;AAEA,SAAK,MAAM,iBAAiB,QAAQ,IAAI,EAAE,KAAK,SAAS,QAAQ,OAAO,UAAU,GAAG,GAAG,EAAE,CAAC;AAE1F,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY;AAAA,MACd,MAAM,WAAW,MAAM;AAAA,MACvB,KAAK,OAAO;AAAA,IAChB;AAEA,QAAI;AACA,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAC9B,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK,OAAO,SAAS;AAAA,QAClD;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,QAAQ,WAAW;AAAA,MACvB,CAAC;AAED,mBAAa,SAAS;AAEtB,UAAI,CAAC,SAAS,IAAI;AACd,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,aAAK,MAAM,wBAAwB,EAAE,QAAQ,SAAS,QAAQ,MAAM,UAAU,CAAC;AAE/E,YAAI,SAAS,WAAW,KAAK;AACzB,gBAAM,IAAI;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,SAAS,WAAW,KAAK;AACzB,gBAAM,IAAI;AAAA,YACN,oBAAoB,OAAO;AAAA,YAC3B;AAAA,YACA;AAAA,UACJ;AAAA,QACJ;AACA,cAAM,IAAI;AAAA,UACN,iBAAiB,SAAS;AAAA,UAC1B;AAAA,UACA,SAAS;AAAA,QACb;AAAA,MACJ;AAEA,YAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAK,MAAM,kBAAkB,EAAE,UAAU,SAAS,CAAC,CAAC,OAAO,KAAK,CAAC;AAGjE,aAAO,OAAO,QAAQ;AAAA,IAC1B,SAAS,OAAO;AACZ,mBAAa,SAAS;AAEtB,UAAI,iBAAiB,YAAY;AAC7B,cAAM;AAAA,MACV;AAEA,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACvD,cAAM,IAAI;AAAA,UACN,yBAAyB,KAAK,OAAO,OAAO;AAAA,UAC5C;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,IAAI;AAAA,QACN,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACxE;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAiC;AACnC,UAAM,MAAM,GAAG,KAAK,OAAO,SAAS;AACpC,SAAK,MAAM,uBAAuB,GAAG,EAAE;AAEvC,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY;AAAA,MACd,MAAM,WAAW,MAAM;AAAA,MACvB,KAAK,OAAO;AAAA,IAChB;AAEA,QAAI;AACA,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAC9B,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,eAAe,UAAU,KAAK,OAAO,SAAS;AAAA,QAClD;AAAA,QACA,QAAQ,WAAW;AAAA,MACvB,CAAC;AAED,mBAAa,SAAS;AAEtB,UAAI,CAAC,SAAS,IAAI;AACd,YAAI,SAAS,WAAW,KAAK;AACzB,gBAAM,IAAI;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,QACJ;AACA,cAAM,IAAI;AAAA,UACN,yBAAyB,SAAS,UAAU;AAAA,UAC5C;AAAA,UACA,SAAS;AAAA,QACb;AAAA,MACJ;AAEA,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAK,MAAM,oBAAoB,IAAI;AACnC,aAAO,KAAK,SAAS,CAAC;AAAA,IAC1B,SAAS,OAAO;AACZ,mBAAa,SAAS;AAEtB,UAAI,iBAAiB,YAAY;AAC7B,cAAM;AAAA,MACV;AAEA,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACvD,cAAM,IAAI;AAAA,UACN,yBAAyB,KAAK,OAAO,OAAO;AAAA,UAC5C;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,IAAI;AAAA,QACN,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACxE;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAgC;AAClC,UAAM,MAAM,GAAG,KAAK,OAAO,SAAS;AACpC,SAAK,MAAM,iBAAiB,GAAG,EAAE;AAEjC,QAAI;AACA,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAC9B,QAAQ;AAAA,QACR,QAAQ,YAAY,QAAQ,GAAI;AAAA,MACpC,CAAC;AACD,aAAO,SAAS;AAAA,IACpB,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;;;AF1QA,IAAM,QAAQ;AAAA,EACV;AAAA,IACI,MAAM;AAAA,IACN,aACI;AAAA,IACJ,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,qBAAqB;AAAA,UACjB,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,kBAAkB;AAAA,UACd,MAAM;AAAA,UACN,aACI;AAAA,QACR;AAAA,QACA,YAAY;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,aAAa;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,qBAAqB;AAAA,IACpC;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,aACI;AAAA,IACJ,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,cAAc;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,cAAc;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,aAAa;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,aAAa;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,cAAc;AAAA,IAC7B;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,aACI;AAAA,IACJ,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,OAAO;AAAA,UACH,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,OAAO;AAAA,UACH,MAAM;AAAA,UACN,MAAM,CAAC,SAAS,YAAY,MAAM;AAAA,UAClC,aACI;AAAA,QACR;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACtB;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,aACI;AAAA,IACJ,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,MAAM;AAAA,UACF,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,UAAU;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,OAAO;AAAA,UACH,MAAM;AAAA,UACN,aACI;AAAA,QACR;AAAA,QACA,oBAAoB;AAAA,UAChB,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACrB;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,aACI;AAAA,IACJ,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,MAAM;AAAA,UACF,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,UAAU;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,UACL,MAAM;AAAA,UACN,aACI;AAAA,QACR;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACrB;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,aACI;AAAA,IACJ,aAAa;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,QACR,MAAM;AAAA,UACF,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,QACA,eAAe;AAAA,UACX,MAAM;AAAA,UACN,aAAa;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACrB;AAAA,EACJ;AACJ;AAEA,eAAe,OAAO;AAElB,MAAI;AACJ,MAAI;AACA,aAAS,WAAW;AAAA,EACxB,SAAS,OAAO;AACZ,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,QAAQ,IAAI,SAAS,MAAM;AAGjC,QAAM,YAAY,MAAM,MAAM,YAAY;AAC1C,MAAI,CAAC,WAAW;AACZ,YAAQ;AAAA,MACJ,uCAAuC,OAAO,SAAS;AAAA,IAE3D;AAAA,EACJ;AAGA,QAAM,SAAS,IAAI;AAAA,IACf;AAAA,MACI,MAAM;AAAA,MACN,SAAS;AAAA,IACb;AAAA,IACA;AAAA,MACI,cAAc;AAAA,QACV,OAAO,CAAC;AAAA,MACZ;AAAA,IACJ;AAAA,EACJ;AAGA,SAAO,kBAAkB,wBAAwB,YAAY;AACzD,WAAO,EAAE,OAAO,MAAM;AAAA,EAC1B,CAAC;AAGD,SAAO,kBAAkB,uBAAuB,OAAO,YAAY;AAC/D,UAAM,EAAE,MAAM,WAAW,KAAK,IAAI,QAAQ;AAG1C,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC9C,QAAI,CAAC,MAAM;AACP,aAAO;AAAA,QACH,SAAS;AAAA,UACL;AAAA,YACI,MAAM;AAAA,YACN,MAAM,wBAAwB,IAAI,uBAAuB,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,UAChG;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,MACb;AAAA,IACJ;AAEA,QAAI;AAEA,YAAM,SAAS,MAAM,MAAM,SAAS,MAAM,IAA+B;AAGzE,UAAI,OAAO,WAAW,UAAU;AAC5B,eAAO;AAAA,UACH,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,OAAO,CAAC;AAAA,QACrD;AAAA,MACJ;AAEA,UAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAE/C,cAAM,OAAQ,OAAmC,UAAU;AAC3D,eAAO;AAAA,UACH,SAAS;AAAA,YACL;AAAA,cACI,MAAM;AAAA,cACN,MAAM,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,YACxE;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,aAAO;AAAA,QACH,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,OAAO,MAAM,EAAE,CAAC;AAAA,MAC7D;AAAA,IACJ,SAAS,OAAO;AACZ,YAAM,UACF,iBAAiB,aACX,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO,KAChC,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAE1E,aAAO;AAAA,QACH,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,CAAC;AAAA,QAClD,SAAS;AAAA,MACb;AAAA,IACJ;AAAA,EACJ,CAAC;AAGD,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAG9B,UAAQ,GAAG,UAAU,YAAY;AAC7B,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK,CAAC;AAAA,EAClB,CAAC;AAED,UAAQ,GAAG,WAAW,YAAY;AAC9B,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK,CAAC;AAAA,EAClB,CAAC;AACL;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACpB,UAAQ,MAAM,gBAAgB,KAAK;AACnC,UAAQ,KAAK,CAAC;AAClB,CAAC;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jvittechs/jai1-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "MCP stdio proxy for Jai1 MCP Server - connects IDE AI agents to Jai1 developer tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"vitest": "^2.1.4"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
|
-
"build": "tsup src/index.ts --format esm --target node22 --out-dir dist --sourcemap --dts",
|
|
42
|
+
"build": "tsup src/index.ts --format esm --target node22 --out-dir dist --sourcemap --dts && chmod +x dist/index.js",
|
|
43
43
|
"dev": "tsx src/index.ts",
|
|
44
44
|
"lint": "eslint .",
|
|
45
45
|
"test": "vitest run",
|