UNPKG

mcpdog

Version:

MCPDog - Universal MCP Server Manager with Web Interface

166 lines 6.32 kB
export class MCPRegistry { servers = new Map(); constructor() { this.initializeRegistry(); } initializeRegistry() { // BrowserMCP 配置 this.servers.set('browsermcp', { config: { name: 'browsermcp', command: 'npx', args: ['@browsermcp/mcp@latest'], description: '浏览器自动化工具,支持网页导航、截图、点击等操作' }, tools: [ { name: 'browser_navigate', description: '导航到指定URL', inputSchema: { type: 'object', properties: { url: { type: 'string', description: '要导航到的URL地址' } }, required: ['url'] } }, { name: 'browser_snapshot', description: '获取当前页面的可访问性快照', inputSchema: { type: 'object', properties: {} } }, { name: 'browser_click', description: '点击页面元素', inputSchema: { type: 'object', properties: { element: { type: 'string', description: '要点击的元素描述' }, ref: { type: 'string', description: '元素引用ID' } }, required: ['element', 'ref'] } }, { name: 'browser_type', description: '在输入框中输入文本', inputSchema: { type: 'object', properties: { element: { type: 'string', description: '输入元素描述' }, ref: { type: 'string', description: '元素引用ID' }, text: { type: 'string', description: '要输入的文本' }, submit: { type: 'boolean', description: '输入后是否提交' } }, required: ['element', 'ref', 'text', 'submit'] } }, { name: 'browser_screenshot', description: '截取当前页面截图', inputSchema: { type: 'object', properties: {} } }, { name: 'browser_go_back', description: '返回上一页', inputSchema: { type: 'object', properties: {} } }, { name: 'browser_go_forward', description: '前进到下一页', inputSchema: { type: 'object', properties: {} } }, { name: 'browser_wait', description: '等待指定时间', inputSchema: { type: 'object', properties: { time: { type: 'number', description: '等待时间(秒)' } }, required: ['time'] } } ], keywords: ['browser', 'navigate', 'click', 'type', 'screenshot', 'web', 'page', 'url', '浏览器', '导航', '点击', '输入', '截图', '网页'] }); // 可以添加更多MCP服务器配置 // this.servers.set('gmail-mcp', { ... }); // this.servers.set('file-mcp', { ... }); } getAllServers() { return Array.from(this.servers.values()); } getServerByName(name) { return this.servers.get(name); } findToolsByKeywords(keywords) { const results = []; for (const [serverName, serverInfo] of this.servers) { for (const tool of serverInfo.tools) { const matchScore = this.calculateKeywordMatchScore(keywords, [tool.name, tool.description, ...serverInfo.keywords]); if (matchScore > 0) { results.push({ server: serverName, tool, matchScore }); } } } return results.sort((a, b) => b.matchScore - a.matchScore); } calculateKeywordMatchScore(userKeywords, toolKeywords) { let score = 0; const normalizedUserKeywords = userKeywords.map(k => k.toLowerCase()); const normalizedToolKeywords = toolKeywords.map(k => k.toLowerCase()); for (const userKeyword of normalizedUserKeywords) { for (const toolKeyword of normalizedToolKeywords) { if (toolKeyword.includes(userKeyword) || userKeyword.includes(toolKeyword)) { score += 1; } } } return score / userKeywords.length; } addServer(name, serverInfo) { this.servers.set(name, serverInfo); } } //# sourceMappingURL=mcp-registry.js.map