mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-23 01:50:13 +08:00
* ✨ feat: add CDP browser MCP server * ♻️ refactor: add navigation timeout for browser cdp * 🐛 fix: reuse window for execute and add debugger logging * ✨ feat: add show option and multiline execute for browser cdp * ✨ feat: support multiple sessions for browser cdp * ♻️ refactor: add LRU and idle cleanup for browser cdp sessions * Refactor browser-cdp for readability and set Firefox UA * 🐛 fix: type electron mock for cdp tests * ♻️ refactor: rename browser_cdp MCP server to browser Simplify the MCP server name from @cherry/browser-cdp to just browser for cleaner tool naming in the MCP protocol. * ✨ feat: add fetch tool to browser MCP server Add a new `fetch` tool that uses the CDP-controlled browser to fetch URLs and return content in various formats (html, txt, markdown, json). Also ignore .conductor folder in biome and eslint configs. * ♻️ refactor: split browser MCP server into modular folder structure Reorganize browser.ts (525 lines) into browser/ folder with separate files for better maintainability. Each tool now has its own file with schema, definition, and handler. * ♻️ refactor: use switch statement in browser server request handler * ♻️ refactor: extract helpers and use handler registry pattern - Add successResponse/errorResponse helpers in tools/utils.ts - Add closeWindow helper to consolidate window cleanup logic - Add ensureDebuggerAttached helper to consolidate debugger setup - Add toolHandlers map for registry-based handler lookup - Simplify server.ts to use dynamic handler dispatch * 🐛 fix: improve browser MCP server robustness - Add try-catch for JSON.parse in fetch() to handle invalid JSON gracefully - Add Zod schema validation to reset tool for consistency with other tools - Fix memory leak in open() by ensuring event listeners cleanup on timeout - Add JSDoc comments for key methods and classes * ♻️ refactor: rename browser MCP to @cherry/browser Follow naming convention of other builtin MCP servers. * 🌐 i18n: translate pending strings across 8 locales Translate all "[to be translated]" markers including: - CDP browser MCP server description (all 8 locales) - "Extra High" reasoning chain length option (6 locales) - Git Bash configuration strings (el-gr, ja-jp)
49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
import * as z from 'zod'
|
|
|
|
import type { CdpBrowserController } from '../controller'
|
|
import { errorResponse, successResponse } from './utils'
|
|
|
|
export const ExecuteSchema = z.object({
|
|
code: z
|
|
.string()
|
|
.describe(
|
|
'JavaScript evaluated via Chrome DevTools Runtime.evaluate. Keep it short; prefer one-line with semicolons for multiple statements.'
|
|
),
|
|
timeout: z.number().default(5000).describe('Timeout in milliseconds for code execution (default: 5000ms)'),
|
|
sessionId: z.string().optional().describe('Session identifier to target a specific page (default: default)')
|
|
})
|
|
|
|
export const executeToolDefinition = {
|
|
name: 'execute',
|
|
description:
|
|
'Run JavaScript in the current page via Runtime.evaluate. Prefer short, single-line snippets; use semicolons for multiple statements.',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
code: {
|
|
type: 'string',
|
|
description: 'One-line JS to evaluate in page context'
|
|
},
|
|
timeout: {
|
|
type: 'number',
|
|
description: 'Timeout in milliseconds (default 5000)'
|
|
},
|
|
sessionId: {
|
|
type: 'string',
|
|
description: 'Session identifier; targets a specific page (default: default)'
|
|
}
|
|
},
|
|
required: ['code']
|
|
}
|
|
}
|
|
|
|
export async function handleExecute(controller: CdpBrowserController, args: unknown) {
|
|
const { code, timeout, sessionId } = ExecuteSchema.parse(args)
|
|
try {
|
|
const value = await controller.execute(code, timeout, sessionId ?? 'default')
|
|
return successResponse(typeof value === 'string' ? value : JSON.stringify(value))
|
|
} catch (error) {
|
|
return errorResponse(error as Error)
|
|
}
|
|
}
|