@olonjs/mcp 1.0.105 → 1.0.106

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/cli.js CHANGED
@@ -179,12 +179,77 @@ var OlonJsMcpServer = class {
179
179
 
180
180
  // src/cli.ts
181
181
  import * as process2 from "process";
182
+ import * as fs from "fs/promises";
183
+ import { existsSync, mkdirSync } from "fs";
184
+ import * as path from "path";
185
+ import * as os from "os";
186
+ async function initMcp() {
187
+ console.log("\n[OlonJs MCP] Initializing Cursor MCP settings...\n");
188
+ const isWin = process2.platform === "win32";
189
+ const commandName = isWin ? "npx.cmd" : "npx";
190
+ const mcpConfig = {
191
+ command: commandName,
192
+ args: ["-y", "@olonjs/mcp@latest", "http://localhost:5174"]
193
+ };
194
+ const homeDir = os.homedir();
195
+ const pathsToCheck = [
196
+ path.join(homeDir, ".cursor", "mcp.json")
197
+ ];
198
+ if (isWin) {
199
+ pathsToCheck.push(path.join(homeDir, "AppData", "Roaming", "Cursor", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json"));
200
+ } else if (process2.platform === "darwin") {
201
+ pathsToCheck.push(path.join(homeDir, "Library", "Application Support", "Cursor", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json"));
202
+ } else {
203
+ pathsToCheck.push(path.join(homeDir, ".config", "Cursor", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json"));
204
+ }
205
+ let updatedCount = 0;
206
+ for (const configPath of pathsToCheck) {
207
+ try {
208
+ let configData = { mcpServers: {} };
209
+ if (existsSync(configPath)) {
210
+ const content = await fs.readFile(configPath, "utf-8");
211
+ try {
212
+ configData = JSON.parse(content);
213
+ } catch (e) {
214
+ console.log(`Warning: Could not parse ${configPath}. Creating new object.`);
215
+ }
216
+ } else {
217
+ const dir = path.dirname(configPath);
218
+ if (!existsSync(dir)) {
219
+ mkdirSync(dir, { recursive: true });
220
+ }
221
+ }
222
+ if (!configData.mcpServers) {
223
+ configData.mcpServers = {};
224
+ }
225
+ configData.mcpServers["OlonJS"] = mcpConfig;
226
+ await fs.writeFile(configPath, JSON.stringify(configData, null, 2));
227
+ console.log(`\u2713 Updated MCP configuration at: ${configPath}`);
228
+ updatedCount++;
229
+ } catch (err) {
230
+ console.log(`Skipped ${configPath} (not found or accessible)`);
231
+ }
232
+ }
233
+ if (updatedCount === 0) {
234
+ console.log("\nCould not find any Cursor MCP configuration files to update.");
235
+ console.log("You can manually add the following JSON to your MCP settings:");
236
+ console.log(JSON.stringify({ "OlonJS": mcpConfig }, null, 2));
237
+ } else {
238
+ console.log("\nOlonJS MCP configured successfully!");
239
+ console.log('Please restart Cursor (or run "Developer: Reload Window") to apply the changes.');
240
+ }
241
+ }
182
242
  async function main() {
183
243
  const targetUrl = process2.argv[2];
244
+ if (targetUrl === "init") {
245
+ await initMcp();
246
+ process2.exit(0);
247
+ }
184
248
  if (!targetUrl) {
185
249
  console.error("====================================================");
186
250
  console.error("\u274C Missing Target URL");
187
251
  console.error("Usage: npx @olonjs/mcp <target-url>");
252
+ console.error("Or setup: npx @olonjs/mcp init");
188
253
  console.error("Example: npx @olonjs/mcp http://localhost:5173");
189
254
  console.error("====================================================");
190
255
  process2.exit(1);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bridge.ts","../src/server.ts","../src/cli.ts"],"sourcesContent":["import { chromium, Browser, Page } from 'playwright';\n\nexport interface WebMcpToolInfo {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport class PlaywrightBridge {\n private browser: Browser | null = null;\n public page: Page | null = null;\n\n constructor(\n private targetUrl: string,\n private privateKey?: string\n ) {}\n\n async connect() {\n console.error(`[PlaywrightBridge] Launching browser...`);\n this.browser = await chromium.launch({ headless: true });\n \n const context = await this.browser.newContext();\n this.page = await context.newPage();\n\n console.error(`[PlaywrightBridge] Navigating to ${this.targetUrl}...`);\n await this.page.goto(this.targetUrl, { waitUntil: 'domcontentloaded' });\n\n // Try to handle Crypto Auth Wall if it exists\n if (this.privateKey) {\n try {\n // We wait a bit to see if an auth input appears.\n // In the future, this selector should match the OlonJS AdminGuard.\n const authInputSelector = 'input[type=\"password\"]'; \n const authButtonSelector = 'button:has-text(\"Authenticate\")';\n\n const isAuthWall = await this.page.locator(authInputSelector).isVisible({ timeout: 2000 }).catch(() => false);\n \n if (isAuthWall) {\n console.error(`[PlaywrightBridge] Auth wall detected. Injecting private key...`);\n await this.page.fill(authInputSelector, this.privateKey);\n await this.page.click(authButtonSelector);\n }\n } catch (err) {\n console.error(`[PlaywrightBridge] Error during auth bypass:`, err);\n }\n }\n\n console.error(`[PlaywrightBridge] Waiting for WebMCP to initialize...`);\n \n // Wait for the navigator.modelContextProtocol to become available\n await this.page.waitForFunction(() => {\n return (window.navigator as any).modelContextProtocol !== undefined;\n }, undefined, { timeout: 15000 }).catch(() => {\n throw new Error(\"Timeout waiting for navigator.modelContextProtocol. Ensure you are navigating to an OlonJS Studio route (e.g. /admin) and WebMCP is enabled.\");\n });\n\n console.error(`[PlaywrightBridge] Connected to WebMCP successfully.`);\n }\n\n async listTools(): Promise<WebMcpToolInfo[]> {\n if (!this.page) throw new Error(\"Not connected\");\n return this.page.evaluate(() => {\n return (window.navigator as any).modelContextProtocol.listTools();\n });\n }\n\n async readResource(uri: string): Promise<string> {\n if (!this.page) throw new Error(\"Not connected\");\n return this.page.evaluate(async (targetUri) => {\n return (window.navigator as any).modelContextProtocol.readResource(targetUri);\n }, uri);\n }\n\n async executeTool(toolName: string, inputArgsJson: string): Promise<string> {\n if (!this.page) throw new Error(\"Not connected\");\n return this.page.evaluate(async ({ name, args }) => {\n return (window.navigator as any).modelContextProtocol.executeTool(name, args);\n }, { name: toolName, args: inputArgsJson });\n }\n\n async disconnect() {\n if (this.browser) {\n await this.browser.close();\n this.browser = null;\n this.page = null;\n console.error(`[PlaywrightBridge] Disconnected.`);\n }\n }\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { PlaywrightBridge } from \"./bridge.js\";\n\nexport class OlonJsMcpServer {\n private server: Server;\n\n constructor(private bridge: PlaywrightBridge) {\n this.server = new Server(\n {\n name: \"@olonjs/mcp\",\n version: \"1.0.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {}, // Enabling resources so Agent can read olon:// URIs\n },\n }\n );\n\n this.setupHandlers();\n \n // Error handling\n this.server.onerror = (error) => console.error(\"[MCP Error]\", error);\n process.on(\"SIGINT\", async () => {\n await this.bridge.disconnect();\n await this.server.close();\n process.exit(0);\n });\n }\n\n private setupHandlers() {\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n try {\n const webMcpTools = await this.bridge.listTools();\n return {\n tools: webMcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema as any, // MCP SDK expects specific types but general JSON schema is supported\n })),\n };\n } catch (err: any) {\n console.error(\"Failed to list tools:\", err);\n return { tools: [] };\n }\n });\n\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n const { name, arguments: args } = request.params;\n const resultString = await this.bridge.executeTool(name, JSON.stringify(args || {}));\n const parsed = JSON.parse(resultString);\n \n return {\n content: parsed.content || [{ type: \"text\", text: resultString }],\n isError: parsed.isError || false,\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\", text: `Error calling tool: ${err.message}` }],\n isError: true,\n };\n }\n });\n\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: \"olon://pages/home\",\n name: \"Home Page Data\",\n description: \"JSON data of the Home page. To fetch other pages, append the slug, e.g. olon://pages/about\",\n mimeType: \"application/json\",\n }\n ]\n }\n });\n\n this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n try {\n const uri = request.params.uri;\n if (!uri.startsWith(\"olon://\")) {\n throw new Error(`Unsupported URI schema: ${uri}. Only olon:// is supported.`);\n }\n\n const dataString = await this.bridge.readResource(uri);\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: dataString,\n },\n ],\n };\n } catch (err: any) {\n console.error(\"Failed to read resource:\", err);\n throw err;\n }\n });\n }\n\n async run() {\n console.error(\"[OlonJsMcpServer] Connecting to WebMCP via Playwright...\");\n await this.bridge.connect();\n \n console.error(\"[OlonJsMcpServer] WebMCP connected. Starting STDIO transport...\");\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error(\"[OlonJsMcpServer] MCP Server is running and listening on STDIO.\");\n }\n}\n","#!/usr/bin/env node\r\nimport { PlaywrightBridge } from './bridge.js';\r\nimport { OlonJsMcpServer } from './server.js';\r\nimport * as process from 'node:process';\r\n\r\nasync function main() {\r\n const targetUrl = process.argv[2];\r\n if (!targetUrl) {\r\n console.error('====================================================');\r\n console.error('❌ Missing Target URL');\r\n console.error('Usage: npx @olonjs/mcp <target-url>');\r\n console.error('Example: npx @olonjs/mcp http://localhost:5173');\r\n console.error('====================================================');\r\n process.exit(1);\r\n }\r\n\r\n // Normalize URL to always point to /admin to access WebMCP\r\n const adminUrl = targetUrl.endsWith('/admin') ? targetUrl : `${targetUrl.replace(/\\/$/, '')}/admin`;\r\n\r\n const privateKey = process.env.OLONJS_PRIVATE_KEY;\r\n\r\n if (privateKey) {\r\n console.error(`[OlonJs MCP] Starting bridge to ${adminUrl} with Auth Injection enabled.`);\r\n } else {\r\n console.error(`[OlonJs MCP] Starting bridge to ${adminUrl} without Auth Injection. Ensure /admin does not have an Auth Wall or WebMCP is unprotected.`);\r\n }\r\n\r\n try {\r\n const bridge = new PlaywrightBridge(adminUrl, privateKey);\r\n const server = new OlonJsMcpServer(bridge);\r\n \r\n await server.run();\r\n } catch (error) {\r\n console.error('[OlonJs MCP] Fatal error starting server:', error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nmain();\r\n"],"mappings":"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","names":["process"]}
1
+ {"version":3,"sources":["../src/bridge.ts","../src/server.ts","../src/cli.ts"],"sourcesContent":["import { chromium, Browser, Page } from 'playwright';\n\nexport interface WebMcpToolInfo {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nexport class PlaywrightBridge {\n private browser: Browser | null = null;\n public page: Page | null = null;\n\n constructor(\n private targetUrl: string,\n private privateKey?: string\n ) {}\n\n async connect() {\n console.error(`[PlaywrightBridge] Launching browser...`);\n this.browser = await chromium.launch({ headless: true });\n \n const context = await this.browser.newContext();\n this.page = await context.newPage();\n\n console.error(`[PlaywrightBridge] Navigating to ${this.targetUrl}...`);\n await this.page.goto(this.targetUrl, { waitUntil: 'domcontentloaded' });\n\n // Try to handle Crypto Auth Wall if it exists\n if (this.privateKey) {\n try {\n // We wait a bit to see if an auth input appears.\n // In the future, this selector should match the OlonJS AdminGuard.\n const authInputSelector = 'input[type=\"password\"]'; \n const authButtonSelector = 'button:has-text(\"Authenticate\")';\n\n const isAuthWall = await this.page.locator(authInputSelector).isVisible({ timeout: 2000 }).catch(() => false);\n \n if (isAuthWall) {\n console.error(`[PlaywrightBridge] Auth wall detected. Injecting private key...`);\n await this.page.fill(authInputSelector, this.privateKey);\n await this.page.click(authButtonSelector);\n }\n } catch (err) {\n console.error(`[PlaywrightBridge] Error during auth bypass:`, err);\n }\n }\n\n console.error(`[PlaywrightBridge] Waiting for WebMCP to initialize...`);\n \n // Wait for the navigator.modelContextProtocol to become available\n await this.page.waitForFunction(() => {\n return (window.navigator as any).modelContextProtocol !== undefined;\n }, undefined, { timeout: 15000 }).catch(() => {\n throw new Error(\"Timeout waiting for navigator.modelContextProtocol. Ensure you are navigating to an OlonJS Studio route (e.g. /admin) and WebMCP is enabled.\");\n });\n\n console.error(`[PlaywrightBridge] Connected to WebMCP successfully.`);\n }\n\n async listTools(): Promise<WebMcpToolInfo[]> {\n if (!this.page) throw new Error(\"Not connected\");\n return this.page.evaluate(() => {\n return (window.navigator as any).modelContextProtocol.listTools();\n });\n }\n\n async readResource(uri: string): Promise<string> {\n if (!this.page) throw new Error(\"Not connected\");\n return this.page.evaluate(async (targetUri) => {\n return (window.navigator as any).modelContextProtocol.readResource(targetUri);\n }, uri);\n }\n\n async executeTool(toolName: string, inputArgsJson: string): Promise<string> {\n if (!this.page) throw new Error(\"Not connected\");\n return this.page.evaluate(async ({ name, args }) => {\n return (window.navigator as any).modelContextProtocol.executeTool(name, args);\n }, { name: toolName, args: inputArgsJson });\n }\n\n async disconnect() {\n if (this.browser) {\n await this.browser.close();\n this.browser = null;\n this.page = null;\n console.error(`[PlaywrightBridge] Disconnected.`);\n }\n }\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { PlaywrightBridge } from \"./bridge.js\";\n\nexport class OlonJsMcpServer {\n private server: Server;\n\n constructor(private bridge: PlaywrightBridge) {\n this.server = new Server(\n {\n name: \"@olonjs/mcp\",\n version: \"1.0.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {}, // Enabling resources so Agent can read olon:// URIs\n },\n }\n );\n\n this.setupHandlers();\n \n // Error handling\n this.server.onerror = (error) => console.error(\"[MCP Error]\", error);\n process.on(\"SIGINT\", async () => {\n await this.bridge.disconnect();\n await this.server.close();\n process.exit(0);\n });\n }\n\n private setupHandlers() {\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n try {\n const webMcpTools = await this.bridge.listTools();\n return {\n tools: webMcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema as any, // MCP SDK expects specific types but general JSON schema is supported\n })),\n };\n } catch (err: any) {\n console.error(\"Failed to list tools:\", err);\n return { tools: [] };\n }\n });\n\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n const { name, arguments: args } = request.params;\n const resultString = await this.bridge.executeTool(name, JSON.stringify(args || {}));\n const parsed = JSON.parse(resultString);\n \n return {\n content: parsed.content || [{ type: \"text\", text: resultString }],\n isError: parsed.isError || false,\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\", text: `Error calling tool: ${err.message}` }],\n isError: true,\n };\n }\n });\n\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: \"olon://pages/home\",\n name: \"Home Page Data\",\n description: \"JSON data of the Home page. To fetch other pages, append the slug, e.g. olon://pages/about\",\n mimeType: \"application/json\",\n }\n ]\n }\n });\n\n this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n try {\n const uri = request.params.uri;\n if (!uri.startsWith(\"olon://\")) {\n throw new Error(`Unsupported URI schema: ${uri}. Only olon:// is supported.`);\n }\n\n const dataString = await this.bridge.readResource(uri);\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: dataString,\n },\n ],\n };\n } catch (err: any) {\n console.error(\"Failed to read resource:\", err);\n throw err;\n }\n });\n }\n\n async run() {\n console.error(\"[OlonJsMcpServer] Connecting to WebMCP via Playwright...\");\n await this.bridge.connect();\n \n console.error(\"[OlonJsMcpServer] WebMCP connected. Starting STDIO transport...\");\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error(\"[OlonJsMcpServer] MCP Server is running and listening on STDIO.\");\n }\n}\n","#!/usr/bin/env node\r\nimport { PlaywrightBridge } from './bridge.js';\r\nimport { OlonJsMcpServer } from './server.js';\r\nimport * as process from 'node:process';\r\nimport * as fs from 'node:fs/promises';\r\nimport { existsSync, mkdirSync } from 'node:fs';\r\nimport * as path from 'node:path';\r\nimport * as os from 'node:os';\r\n\r\nasync function initMcp() {\r\n console.log('\\n[OlonJs MCP] Initializing Cursor MCP settings...\\n');\r\n \r\n const isWin = process.platform === 'win32';\r\n const commandName = isWin ? 'npx.cmd' : 'npx';\r\n \r\n const mcpConfig = {\r\n command: commandName,\r\n args: ['-y', '@olonjs/mcp@latest', 'http://localhost:5174']\r\n };\r\n\r\n const homeDir = os.homedir();\r\n const pathsToCheck = [\r\n path.join(homeDir, '.cursor', 'mcp.json'),\r\n ];\r\n\r\n if (isWin) {\r\n pathsToCheck.push(path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\r\n } else if (process.platform === 'darwin') {\r\n pathsToCheck.push(path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\r\n } else {\r\n pathsToCheck.push(path.join(homeDir, '.config', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\r\n }\r\n\r\n let updatedCount = 0;\r\n\r\n for (const configPath of pathsToCheck) {\r\n try {\r\n let configData: any = { mcpServers: {} };\r\n \r\n if (existsSync(configPath)) {\r\n const content = await fs.readFile(configPath, 'utf-8');\r\n try {\r\n configData = JSON.parse(content);\r\n } catch (e) {\r\n console.log(`Warning: Could not parse ${configPath}. Creating new object.`);\r\n }\r\n } else {\r\n const dir = path.dirname(configPath);\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n }\r\n\r\n if (!configData.mcpServers) {\r\n configData.mcpServers = {};\r\n }\r\n\r\n configData.mcpServers['OlonJS'] = mcpConfig;\r\n\r\n await fs.writeFile(configPath, JSON.stringify(configData, null, 2));\r\n console.log(`✓ Updated MCP configuration at: ${configPath}`);\r\n updatedCount++;\r\n } catch (err) {\r\n console.log(`Skipped ${configPath} (not found or accessible)`);\r\n }\r\n }\r\n\r\n if (updatedCount === 0) {\r\n console.log('\\nCould not find any Cursor MCP configuration files to update.');\r\n console.log('You can manually add the following JSON to your MCP settings:');\r\n console.log(JSON.stringify({ \"OlonJS\": mcpConfig }, null, 2));\r\n } else {\r\n console.log('\\nOlonJS MCP configured successfully!');\r\n console.log('Please restart Cursor (or run \"Developer: Reload Window\") to apply the changes.');\r\n }\r\n}\r\n\r\nasync function main() {\r\n const targetUrl = process.argv[2];\r\n \r\n if (targetUrl === 'init') {\r\n await initMcp();\r\n process.exit(0);\r\n }\r\n\r\n if (!targetUrl) {\r\n console.error('====================================================');\r\n console.error('❌ Missing Target URL');\r\n console.error('Usage: npx @olonjs/mcp <target-url>');\r\n console.error('Or setup: npx @olonjs/mcp init');\r\n console.error('Example: npx @olonjs/mcp http://localhost:5173');\r\n console.error('====================================================');\r\n process.exit(1);\r\n }\r\n\r\n // Normalize URL to always point to /admin to access WebMCP\r\n const adminUrl = targetUrl.endsWith('/admin') ? targetUrl : `${targetUrl.replace(/\\/$/, '')}/admin`;\r\n\r\n const privateKey = process.env.OLONJS_PRIVATE_KEY;\r\n\r\n if (privateKey) {\r\n console.error(`[OlonJs MCP] Starting bridge to ${adminUrl} with Auth Injection enabled.`);\r\n } else {\r\n console.error(`[OlonJs MCP] Starting bridge to ${adminUrl} without Auth Injection. Ensure /admin does not have an Auth Wall or WebMCP is unprotected.`);\r\n }\r\n\r\n try {\r\n const bridge = new PlaywrightBridge(adminUrl, privateKey);\r\n const server = new OlonJsMcpServer(bridge);\r\n \r\n await server.run();\r\n } catch (error) {\r\n console.error('[OlonJs MCP] Fatal error starting server:', error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nmain();\r\n"],"mappings":"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","names":["process"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olonjs/mcp",
3
- "version": "1.0.105",
3
+ "version": "1.0.106",
4
4
  "description": "Local MCP server bridge for OlonJS Tenant Zero-UI automation via Playwright",
5
5
  "private": false,
6
6
  "type": "module",
package/src/cli.ts CHANGED
@@ -2,13 +2,92 @@
2
2
  import { PlaywrightBridge } from './bridge.js';
3
3
  import { OlonJsMcpServer } from './server.js';
4
4
  import * as process from 'node:process';
5
+ import * as fs from 'node:fs/promises';
6
+ import { existsSync, mkdirSync } from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import * as os from 'node:os';
9
+
10
+ async function initMcp() {
11
+ console.log('\n[OlonJs MCP] Initializing Cursor MCP settings...\n');
12
+
13
+ const isWin = process.platform === 'win32';
14
+ const commandName = isWin ? 'npx.cmd' : 'npx';
15
+
16
+ const mcpConfig = {
17
+ command: commandName,
18
+ args: ['-y', '@olonjs/mcp@latest', 'http://localhost:5174']
19
+ };
20
+
21
+ const homeDir = os.homedir();
22
+ const pathsToCheck = [
23
+ path.join(homeDir, '.cursor', 'mcp.json'),
24
+ ];
25
+
26
+ if (isWin) {
27
+ pathsToCheck.push(path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));
28
+ } else if (process.platform === 'darwin') {
29
+ pathsToCheck.push(path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));
30
+ } else {
31
+ pathsToCheck.push(path.join(homeDir, '.config', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));
32
+ }
33
+
34
+ let updatedCount = 0;
35
+
36
+ for (const configPath of pathsToCheck) {
37
+ try {
38
+ let configData: any = { mcpServers: {} };
39
+
40
+ if (existsSync(configPath)) {
41
+ const content = await fs.readFile(configPath, 'utf-8');
42
+ try {
43
+ configData = JSON.parse(content);
44
+ } catch (e) {
45
+ console.log(`Warning: Could not parse ${configPath}. Creating new object.`);
46
+ }
47
+ } else {
48
+ const dir = path.dirname(configPath);
49
+ if (!existsSync(dir)) {
50
+ mkdirSync(dir, { recursive: true });
51
+ }
52
+ }
53
+
54
+ if (!configData.mcpServers) {
55
+ configData.mcpServers = {};
56
+ }
57
+
58
+ configData.mcpServers['OlonJS'] = mcpConfig;
59
+
60
+ await fs.writeFile(configPath, JSON.stringify(configData, null, 2));
61
+ console.log(`✓ Updated MCP configuration at: ${configPath}`);
62
+ updatedCount++;
63
+ } catch (err) {
64
+ console.log(`Skipped ${configPath} (not found or accessible)`);
65
+ }
66
+ }
67
+
68
+ if (updatedCount === 0) {
69
+ console.log('\nCould not find any Cursor MCP configuration files to update.');
70
+ console.log('You can manually add the following JSON to your MCP settings:');
71
+ console.log(JSON.stringify({ "OlonJS": mcpConfig }, null, 2));
72
+ } else {
73
+ console.log('\nOlonJS MCP configured successfully!');
74
+ console.log('Please restart Cursor (or run "Developer: Reload Window") to apply the changes.');
75
+ }
76
+ }
5
77
 
6
78
  async function main() {
7
79
  const targetUrl = process.argv[2];
80
+
81
+ if (targetUrl === 'init') {
82
+ await initMcp();
83
+ process.exit(0);
84
+ }
85
+
8
86
  if (!targetUrl) {
9
87
  console.error('====================================================');
10
88
  console.error('❌ Missing Target URL');
11
89
  console.error('Usage: npx @olonjs/mcp <target-url>');
90
+ console.error('Or setup: npx @olonjs/mcp init');
12
91
  console.error('Example: npx @olonjs/mcp http://localhost:5173');
13
92
  console.error('====================================================');
14
93
  process.exit(1);