Skip to main content
Glama
pansin
by pansin
index.ts6.54 kB
/** * Browser MCP Server entry point */ // Export all types and interfaces export * from './types/index.js'; export * from './interfaces/tools.js'; export * from './interfaces/browser.js'; export * from './interfaces/mcp.js'; export * from './errors/index.js'; export * from './config/default.js'; // 导入管理器和工具 import { BrowserManager } from './managers/browser-manager.js'; import { PageController } from './managers/page-controller.js'; import { ConfigManager } from './managers/config-manager.js'; import { ToolRegistry } from './managers/tool-registry.js'; import { MCPServerHandler } from './managers/mcp-server-handler.js'; // 导入工具类 import { NavigateTool, RefreshTool, GoBackTool, GoForwardTool } from './tools/navigation-tools.js'; import { GetPageSourceTool, GetPageMetadataTool, TakeScreenshotTool, ExtractTextTool } from './tools/content-tools.js'; import { ClickTool, TypeTool, SelectTool, WaitForElementTool } from './tools/interaction-tools.js'; import { ElementExistsTool, TextExistsTool, GetAttributeTool, EvaluateScriptTool } from './tools/testing-tools.js'; import { BaiduSearchTool, AIArticleSearchTool } from './tools/search-tools.js'; import { GetFormattedPageContentTool, GetFormattedTextContentTool } from './tools/formatted-content-tools.js'; // 主服务器类 export class BrowserMCPServer { private configManager: ConfigManager; private browserManager!: BrowserManager; private pageController!: PageController; private toolRegistry: ToolRegistry; private mcpHandler: MCPServerHandler; private defaultPageId: string | null = null; constructor(configPath?: string) { // 初始化配置管理器 this.configManager = new ConfigManager(configPath); // 初始化工具注册表 this.toolRegistry = new ToolRegistry(); // 初始化MCP处理器 this.mcpHandler = new MCPServerHandler(this.toolRegistry); } /** * 启动服务器 */ async start(): Promise<void> { console.log('浏览器MCP服务器启动中...'); try { // 加载配置 const config = await this.configManager.loadConfig(); // 初始化浏览器管理器 this.browserManager = new BrowserManager(config); await this.browserManager.initialize(); // 初始化页面控制器 this.pageController = new PageController( config.security.allowedDomains, config.security.blockedDomains ); // 创建默认页面 this.defaultPageId = await this.browserManager.createPage('default'); const defaultPage = await this.browserManager.getPage(this.defaultPageId); this.pageController.setCurrentPage(defaultPage); // 注册工具 this.registerTools(); // 启动MCP处理器 await this.mcpHandler.initialize(); await this.mcpHandler.start(); console.log('浏览器MCP服务器已启动'); } catch (error) { console.error('启动服务器失败:', error); await this.stop(); throw error; } } /** * 停止服务器 */ async stop(): Promise<void> { console.log('浏览器MCP服务器停止中...'); try { // 停止MCP处理器 await this.mcpHandler.stop(); // 清理浏览器资源 if (this.browserManager) { await this.browserManager.cleanup(); } console.log('浏览器MCP服务器已停止'); } catch (error) { console.error('停止服务器失败:', error); throw error; } } /** * 注册工具 */ private registerTools(): void { // 导航工具 this.toolRegistry.registerTool(new NavigateTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new RefreshTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new GoBackTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new GoForwardTool(this.pageController).getMCPTool()); // 内容提取工具 this.toolRegistry.registerTool(new GetPageSourceTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new GetPageMetadataTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new TakeScreenshotTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new ExtractTextTool(this.pageController).getMCPTool()); // 元素交互工具 this.toolRegistry.registerTool(new ClickTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new TypeTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new SelectTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new WaitForElementTool(this.pageController).getMCPTool()); // 测试和验证工具 this.toolRegistry.registerTool(new ElementExistsTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new TextExistsTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new GetAttributeTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new EvaluateScriptTool(this.pageController).getMCPTool()); // 搜索工具 this.toolRegistry.registerTool(new BaiduSearchTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new AIArticleSearchTool(this.pageController).getMCPTool()); // 格式化内容工具 this.toolRegistry.registerTool(new GetFormattedPageContentTool(this.pageController).getMCPTool()); this.toolRegistry.registerTool(new GetFormattedTextContentTool(this.pageController).getMCPTool()); console.log(`已注册 ${this.toolRegistry.getTools().length} 个工具`); } /** * 处理工具调用 */ async handleToolCall(name: string, args: any): Promise<any> { return this.mcpHandler.handleToolCall(name, args); } /** * 获取服务器状态 */ getStatus(): string { return this.mcpHandler.getStatus(); } } // CLI entry point if (import.meta.url === `file://${process.argv[1]}`) { const server = new BrowserMCPServer(); process.on('SIGINT', async () => { console.log('\nReceived SIGINT, shutting down gracefully...'); await server.stop(); process.exit(0); }); process.on('SIGTERM', async () => { console.log('\nReceived SIGTERM, shutting down gracefully...'); await server.stop(); process.exit(0); }); server.start().catch((error) => { console.error('Failed to start server:', error); process.exit(1); }); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pansin/browserMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server