@olonjs/mcp 1.0.120 → 1.0.122
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 +3 -0
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -7,6 +7,8 @@ var PlaywrightBridge = class {
|
|
|
7
7
|
this.targetUrl = targetUrl;
|
|
8
8
|
this.privateKey = privateKey;
|
|
9
9
|
}
|
|
10
|
+
targetUrl;
|
|
11
|
+
privateKey;
|
|
10
12
|
browser = null;
|
|
11
13
|
page = null;
|
|
12
14
|
async connect() {
|
|
@@ -112,6 +114,7 @@ var OlonJsMcpServer = class {
|
|
|
112
114
|
process.exit(0);
|
|
113
115
|
});
|
|
114
116
|
}
|
|
117
|
+
bridge;
|
|
115
118
|
server;
|
|
116
119
|
setupHandlers() {
|
|
117
120
|
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
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 public 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 navigateTo(slug: string): Promise<void> {\n if (!this.page) throw new Error(\"Not connected\");\n const baseUrl = this.targetUrl.replace(/\\/admin.*$/, '');\n const targetUrl = `${baseUrl}/admin/${slug}`;\n console.error(`[PlaywrightBridge] Navigating to ${targetUrl}...`);\n await this.page.goto(targetUrl, { waitUntil: 'domcontentloaded' });\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 WebMCP on /admin/${slug}.`);\n });\n console.error(`[PlaywrightBridge] Now on slug: ${slug}`);\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: [\n {\n name: \"navigate-to-page\",\n description: \"Navigate the Studio Playwright browser to a specific page by slug. Call this before update-section whenever you need to edit a page different from the current one.\",\n inputSchema: {\n type: \"object\",\n properties: {\n slug: {\n type: \"string\",\n description: \"The page slug to navigate to (e.g. 'chi-sono', 'home', 'contatti').\",\n },\n },\n required: [\"slug\"],\n additionalProperties: false,\n },\n },\n ...webMcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema as any,\n })),\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\n if (name === \"navigate-to-page\") {\n const slug = (args as any)?.slug;\n if (!slug) throw new Error(\"Missing required parameter: slug\");\n await this.bridge.navigateTo(slug);\n return {\n content: [{ type: \"text\", text: `Navigated to /admin/${slug}. Studio is now on slug \"${slug}\".` }],\n isError: false,\n };\n }\n\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\nimport { PlaywrightBridge } from './bridge.js';\nimport { OlonJsMcpServer } from './server.js';\nimport * as process from 'node:process';\nimport * as fs from 'node:fs/promises';\nimport { existsSync, mkdirSync } from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { execSync } from 'node:child_process';\n\nasync function initMcp() {\n console.log('\\n[OlonJs MCP] Initializing Cursor MCP settings...\\n');\n \n let isWin = process.platform === 'win32';\n let isWsl = false;\n let wslHostHome = '';\n\n // Detect WSL\n if (process.platform === 'linux' && process.env.WSL_DISTRO_NAME) {\n isWsl = true;\n try {\n // Find the Windows user profile path from within WSL\n const winProfile = execSync('cmd.exe /c \"echo %USERPROFILE%\"').toString().trim();\n // Convert C:\\Users\\name to /mnt/c/Users/name\n if (winProfile && winProfile.includes(':\\\\')) {\n const drive = winProfile.charAt(0).toLowerCase();\n const rest = winProfile.slice(2).replace(/\\\\/g, '/');\n wslHostHome = `/mnt/${drive}${rest}`;\n }\n } catch (e) {\n console.log('Warning: Detected WSL but could not resolve Windows host profile path.');\n }\n }\n\n const commandName = isWin || isWsl ? 'wsl' : 'npx';\n const mcpConfig: any = {\n command: commandName,\n args: ['-y', '@olonjs/mcp@latest', 'http://localhost:5174']\n };\n\n // If we are configuring for a Windows host (either natively or from WSL),\n // we must setup the wsl bridge arguments so the host Windows Cursor can reach the Linux npx.\n if (isWsl) {\n const distro = process.env.WSL_DISTRO_NAME || 'Ubuntu';\n mcpConfig.args = [\n '-d', distro,\n '--cd', '~',\n 'bash', '-ilc',\n 'npx -y @olonjs/mcp@latest http://localhost:5174'\n ];\n } else if (isWin) {\n mcpConfig.command = 'npx.cmd';\n }\n\n const homeDir = os.homedir();\n const pathsToCheck: string[] = [];\n\n // 1. Add native path\n pathsToCheck.push(path.join(homeDir, '.cursor', 'mcp.json'));\n\n // 2. Add WSL host path if applicable\n if (isWsl && wslHostHome) {\n pathsToCheck.push(path.join(wslHostHome, '.cursor', 'mcp.json'));\n pathsToCheck.push(path.join(wslHostHome, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\n }\n\n if (isWin) {\n pathsToCheck.push(path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\n } else if (process.platform === 'darwin') {\n pathsToCheck.push(path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\n } else if (!isWsl) {\n pathsToCheck.push(path.join(homeDir, '.config', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\n }\n\n let updatedCount = 0;\n\n for (const configPath of pathsToCheck) {\n try {\n let configData: any = { mcpServers: {} };\n \n if (existsSync(configPath)) {\n const content = await fs.readFile(configPath, 'utf-8');\n try {\n // Strip trailing commas before parsing just in case\n const sanitizedContent = content.replace(/,\\s*([\\]}])/g, '$1');\n configData = JSON.parse(sanitizedContent);\n } catch (e) {\n console.log(`Warning: Could not parse ${configPath}. Creating new object.`);\n }\n } else {\n const dir = path.dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n if (!configData.mcpServers) {\n configData.mcpServers = {};\n }\n\n configData.mcpServers['OlonJS'] = mcpConfig;\n\n await fs.writeFile(configPath, JSON.stringify(configData, null, 2));\n console.log(`✓ Updated MCP configuration at: ${configPath}`);\n updatedCount++;\n } catch (err) {\n console.log(`Skipped ${configPath} (not found or accessible)`);\n }\n }\n\n if (updatedCount === 0) {\n console.log('\\nCould not find any Cursor MCP configuration files to update.');\n console.log('You can manually add the following JSON to your MCP settings:');\n console.log(JSON.stringify({ \"OlonJS\": mcpConfig }, null, 2));\n } else {\n console.log('\\nOlonJS MCP configured successfully!');\n console.log('Please restart Cursor (or run \"Developer: Reload Window\") to apply the changes.');\n }\n}\n\nasync function main() {\n const targetUrl = process.argv[2];\n \n if (targetUrl === 'init') {\n await initMcp();\n process.exit(0);\n }\n\n if (!targetUrl) {\n console.error('====================================================');\n console.error('❌ Missing Target URL');\n console.error('Usage: npx @olonjs/mcp <target-url>');\n console.error('Or setup: npx @olonjs/mcp init');\n console.error('Example: npx @olonjs/mcp http://localhost:5173');\n console.error('====================================================');\n process.exit(1);\n }\n\n // Normalize URL to always point to /admin to access WebMCP\n const adminUrl = targetUrl.endsWith('/admin') ? targetUrl : `${targetUrl.replace(/\\/$/, '')}/admin`;\n\n const privateKey = process.env.OLONJS_PRIVATE_KEY;\n\n if (privateKey) {\n console.error(`[OlonJs MCP] Starting bridge to ${adminUrl} with Auth Injection enabled.`);\n } else {\n console.error(`[OlonJs MCP] Starting bridge to ${adminUrl} without Auth Injection. Ensure /admin does not have an Auth Wall or WebMCP is unprotected.`);\n }\n\n try {\n const bridge = new PlaywrightBridge(adminUrl, privateKey);\n const server = new OlonJsMcpServer(bridge);\n \n await server.run();\n } catch (error) {\n console.error('[OlonJs MCP] Fatal error starting server:', error);\n process.exit(1);\n }\n}\n\nmain();\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 public 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 navigateTo(slug: string): Promise<void> {\n if (!this.page) throw new Error(\"Not connected\");\n const baseUrl = this.targetUrl.replace(/\\/admin.*$/, '');\n const targetUrl = `${baseUrl}/admin/${slug}`;\n console.error(`[PlaywrightBridge] Navigating to ${targetUrl}...`);\n await this.page.goto(targetUrl, { waitUntil: 'domcontentloaded' });\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 WebMCP on /admin/${slug}.`);\n });\n console.error(`[PlaywrightBridge] Now on slug: ${slug}`);\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: [\n {\n name: \"navigate-to-page\",\n description: \"Navigate the Studio Playwright browser to a specific page by slug. Call this before update-section whenever you need to edit a page different from the current one.\",\n inputSchema: {\n type: \"object\",\n properties: {\n slug: {\n type: \"string\",\n description: \"The page slug to navigate to (e.g. 'chi-sono', 'home', 'contatti').\",\n },\n },\n required: [\"slug\"],\n additionalProperties: false,\n },\n },\n ...webMcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema as any,\n })),\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\n if (name === \"navigate-to-page\") {\n const slug = (args as any)?.slug;\n if (!slug) throw new Error(\"Missing required parameter: slug\");\n await this.bridge.navigateTo(slug);\n return {\n content: [{ type: \"text\", text: `Navigated to /admin/${slug}. Studio is now on slug \"${slug}\".` }],\n isError: false,\n };\n }\n\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\nimport { PlaywrightBridge } from './bridge.js';\nimport { OlonJsMcpServer } from './server.js';\nimport * as process from 'node:process';\nimport * as fs from 'node:fs/promises';\nimport { existsSync, mkdirSync } from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { execSync } from 'node:child_process';\n\nasync function initMcp() {\n console.log('\\n[OlonJs MCP] Initializing Cursor MCP settings...\\n');\n \n let isWin = process.platform === 'win32';\n let isWsl = false;\n let wslHostHome = '';\n\n // Detect WSL\n if (process.platform === 'linux' && process.env.WSL_DISTRO_NAME) {\n isWsl = true;\n try {\n // Find the Windows user profile path from within WSL\n const winProfile = execSync('cmd.exe /c \"echo %USERPROFILE%\"').toString().trim();\n // Convert C:\\Users\\name to /mnt/c/Users/name\n if (winProfile && winProfile.includes(':\\\\')) {\n const drive = winProfile.charAt(0).toLowerCase();\n const rest = winProfile.slice(2).replace(/\\\\/g, '/');\n wslHostHome = `/mnt/${drive}${rest}`;\n }\n } catch (e) {\n console.log('Warning: Detected WSL but could not resolve Windows host profile path.');\n }\n }\n\n const commandName = isWin || isWsl ? 'wsl' : 'npx';\n const mcpConfig: any = {\n command: commandName,\n args: ['-y', '@olonjs/mcp@latest', 'http://localhost:5174']\n };\n\n // If we are configuring for a Windows host (either natively or from WSL),\n // we must setup the wsl bridge arguments so the host Windows Cursor can reach the Linux npx.\n if (isWsl) {\n const distro = process.env.WSL_DISTRO_NAME || 'Ubuntu';\n mcpConfig.args = [\n '-d', distro,\n '--cd', '~',\n 'bash', '-ilc',\n 'npx -y @olonjs/mcp@latest http://localhost:5174'\n ];\n } else if (isWin) {\n mcpConfig.command = 'npx.cmd';\n }\n\n const homeDir = os.homedir();\n const pathsToCheck: string[] = [];\n\n // 1. Add native path\n pathsToCheck.push(path.join(homeDir, '.cursor', 'mcp.json'));\n\n // 2. Add WSL host path if applicable\n if (isWsl && wslHostHome) {\n pathsToCheck.push(path.join(wslHostHome, '.cursor', 'mcp.json'));\n pathsToCheck.push(path.join(wslHostHome, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\n }\n\n if (isWin) {\n pathsToCheck.push(path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\n } else if (process.platform === 'darwin') {\n pathsToCheck.push(path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\n } else if (!isWsl) {\n pathsToCheck.push(path.join(homeDir, '.config', 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'));\n }\n\n let updatedCount = 0;\n\n for (const configPath of pathsToCheck) {\n try {\n let configData: any = { mcpServers: {} };\n \n if (existsSync(configPath)) {\n const content = await fs.readFile(configPath, 'utf-8');\n try {\n // Strip trailing commas before parsing just in case\n const sanitizedContent = content.replace(/,\\s*([\\]}])/g, '$1');\n configData = JSON.parse(sanitizedContent);\n } catch (e) {\n console.log(`Warning: Could not parse ${configPath}. Creating new object.`);\n }\n } else {\n const dir = path.dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n if (!configData.mcpServers) {\n configData.mcpServers = {};\n }\n\n configData.mcpServers['OlonJS'] = mcpConfig;\n\n await fs.writeFile(configPath, JSON.stringify(configData, null, 2));\n console.log(`✓ Updated MCP configuration at: ${configPath}`);\n updatedCount++;\n } catch (err) {\n console.log(`Skipped ${configPath} (not found or accessible)`);\n }\n }\n\n if (updatedCount === 0) {\n console.log('\\nCould not find any Cursor MCP configuration files to update.');\n console.log('You can manually add the following JSON to your MCP settings:');\n console.log(JSON.stringify({ \"OlonJS\": mcpConfig }, null, 2));\n } else {\n console.log('\\nOlonJS MCP configured successfully!');\n console.log('Please restart Cursor (or run \"Developer: Reload Window\") to apply the changes.');\n }\n}\n\nasync function main() {\n const targetUrl = process.argv[2];\n \n if (targetUrl === 'init') {\n await initMcp();\n process.exit(0);\n }\n\n if (!targetUrl) {\n console.error('====================================================');\n console.error('❌ Missing Target URL');\n console.error('Usage: npx @olonjs/mcp <target-url>');\n console.error('Or setup: npx @olonjs/mcp init');\n console.error('Example: npx @olonjs/mcp http://localhost:5173');\n console.error('====================================================');\n process.exit(1);\n }\n\n // Normalize URL to always point to /admin to access WebMCP\n const adminUrl = targetUrl.endsWith('/admin') ? targetUrl : `${targetUrl.replace(/\\/$/, '')}/admin`;\n\n const privateKey = process.env.OLONJS_PRIVATE_KEY;\n\n if (privateKey) {\n console.error(`[OlonJs MCP] Starting bridge to ${adminUrl} with Auth Injection enabled.`);\n } else {\n console.error(`[OlonJs MCP] Starting bridge to ${adminUrl} without Auth Injection. Ensure /admin does not have an Auth Wall or WebMCP is unprotected.`);\n }\n\n try {\n const bridge = new PlaywrightBridge(adminUrl, privateKey);\n const server = new OlonJsMcpServer(bridge);\n \n await server.run();\n } catch (error) {\n console.error('[OlonJs MCP] Fatal error starting server:', error);\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["process"]}
|