# browser-mcp-client **Repository Path**: mofum/browser-mcp-client ## Basic Information - **Project Name**: browser-mcp-client - **Description**: Model Context Protocol (MCP) 浏览器客户端库,用于调试或调用MCP协议的服务器 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-30 - **Last Updated**: 2025-10-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: MCP, mcp-client, JavaScript, browser ## README # MCP Client

Model Context Protocol (MCP) 客户端库,用于与支持MCP协议的服务器进行高效通信

📖 项目介绍✨ 功能特点📁 项目结构🚀 快速开始💻 使用示例🔌 支持的连接类型📦 依赖

## 📖 项目介绍 MCP Client 是一个功能强大的客户端库,专门设计用于与支持 Model Context Protocol 的服务器进行无缝通信。它提供了多种现代化的连接方式,包括 SSE (Server-Sent Events)、Streamable HTTP 和 WebSocket,使开发者能够根据应用需求灵活选择最适合的通信方式。 ![VSCode风格的MCP客户端演示界面](examples/vscode-layout-demo/scrent.png) ## ✨ 功能特点 - **多协议支持**:集成了 SSE、Streamable HTTP 和 WebSocket 三种通信协议 - **统一接口**:提供一致的客户端 API,简化跨协议开发体验 - **完整请求/响应流程**:支持标准的请求-响应模式 - **会话管理**:内置会话状态维护机制 - **安全认证**:支持多种认证方式,保障通信安全 - **能力声明**:客户端可声明自身能力,服务器据此提供定制化服务 - **TypeScript 支持**:完整的类型定义,提供开发时类型检查与自动补全 - **AJV 验证**:使用 Ajv 作为主要的 JSON Schema 验证库,提供更强大的模式验证能力 - **轻量级设计**:优化的代码结构,最小化依赖 ## 📁 项目结构 ``` ├── src/ # 源代码目录 │ └── libs/ # 核心库文件(详见 ) │ ├── client/ # 客户端实现 │ ├── shared/ # 共享工具和协议定义 │ ├── types.d.ts # TypeScript类型定义 │ ├── types.d.ts.map # TypeScript类型映射文件 │ ├── types.js # JavaScript类型定义 │ └── types.js.map # JavaScript类型映射文件 ├── examples/ # 示例代码 │ ├── sse-demo/ # SSE连接示例 │ ├── streamable-demo/ # Streamable连接示例 │ ├── websocket-demo/ # WebSocket连接示例 │ └── vscode-layout-demo/ # VSCode风格的综合演示界面 ├── electron/ # Electron应用源码(详见 ) ├── electron-dist/ # Electron应用构建输出(详见 ) ├── package.json # 项目配置和依赖 ├── package-lock.json # 依赖锁定文件 ├── webpack.config.js # Webpack构建配置 ├── webpack.client.config.js # 客户端库专用Webpack配置 └── webpack.electron.config.js # Electron应用构建配置 ``` ## 🚀 快速开始 ### 安装依赖 ```bash # 使用npm安装 npm install ``` ### 构建项目 ```bash # 构建客户端库 npm run build # 构建Electron应用 npm run electron:build ``` ### 开发模式 ```bash # 启动Web开发服务器(端口8000) npm run dev # 启动Electron开发模式 npm run electron:dev ``` ### Electron打包 ```bash # 打包当前平台 npm run electron:pack # 打包Windows平台 npm run electron:pack:win # 打包macOS平台 npm run electron:pack:mac # 打包Linux平台 npm run electron:pack:linux ``` **注意**:当前版本不支持一次性打包所有平台的命令。 ## 💻 使用示例 ### 基本用法 以下是创建MCP客户端并发送请求的基本示例: ```javascript // 导入客户端和传输层 import { Client } from "./src/libs/client/index.js"; import { SSEClientTransport } from "./src/libs/client/sse.js"; // 创建客户端实例 const client = new Client({ name: "browser-client", version: "1.0.0" }); // 创建传输层 const transport = new SSEClientTransport("http://localhost:8081/sse"); // 连接传输层并初始化客户端 await client.connect(transport); // 发送请求 const result = await client.request("method.name", { param1: "value1" }); console.log("请求结果:", result); // 使用便捷方法(根据服务器支持的能力) // await client.complete({ prompt: "Hello, world!" }); // await client.ping(); // await client.setLoggingLevel("debug"); // const tools = await client.listTools(); // 关闭客户端连接 // await client.close(); ``` ### 认证方式 MCP客户端支持OAuth 2.0认证,可以通过实现`OAuthClientProvider`接口来自定义认证流程: ```javascript // 创建带认证的传输层 const authProvider = { // 授权后重定向URL get redirectUrl() { return window.location.origin + window.location.pathname; }, // 客户端元数据 get clientMetadata() { return { client_name: "My MCP Client", scope: "read write" }; }, // 保存客户端信息(动态注册时使用) async saveClientInformation(clientInfo) { localStorage.setItem('clientInfo', JSON.stringify(clientInfo)); }, // 获取已保存的客户端信息 async clientInformation() { const info = localStorage.getItem('clientInfo'); return info ? JSON.parse(info) : undefined; }, // 保存令牌 async saveTokens(tokens) { localStorage.setItem('tokens', JSON.stringify(tokens)); }, // 获取已保存的令牌 async tokens() { const tokens = localStorage.getItem('tokens'); return tokens ? JSON.parse(tokens) : undefined; }, // 重定向到授权页面 redirectToAuthorization(authorizationUrl) { window.location.href = authorizationUrl.href; }, // 保存PKCE验证器 async saveCodeVerifier(codeVerifier) { localStorage.setItem('codeVerifier', codeVerifier); }, // 获取PKCE验证器 async codeVerifier() { return localStorage.getItem('codeVerifier') || ''; }, // 处理授权失败时的凭据失效 async invalidateCredentials(scope) { if (scope === 'tokens' || scope === 'all') { localStorage.removeItem('tokens'); } if (scope === 'client' || scope === 'all') { localStorage.removeItem('clientInfo'); } } }; // 创建带认证的传输层 const transport = new SSEClientTransport("http://localhost:8081/sse", { authProvider }); // 连接传输层并初始化客户端(会自动处理认证流程) await client.connect(transport); // 检查URL中是否有授权码(授权回调时使用) const urlParams = new URLSearchParams(window.location.search); const code = urlParams.get('code'); if (code) { // 如果URL中有授权码,使用它完成认证流程 await auth(authProvider, { serverUrl: "http://localhost:8081/sse", authorizationCode: code }); // 清除URL中的授权码 window.history.replaceState({}, document.title, window.location.pathname); } ``` ### 运行示例项目 项目包含多个示例,展示了不同连接方式的使用方法: | 示例目录 | 描述 | 特点 | |----------|------|------| | `examples/sse-demo/` | SSE连接示例 | 适合单向服务器推送场景 | | `examples/streamable-demo/` | Streamable HTTP连接示例 | 支持流式HTTP响应 | | `examples/websocket-demo/` | WebSocket连接示例 | 提供双向实时通信能力 | | `examples/vscode-layout-demo/` | VSCode风格的综合演示界面 | 完整的UI演示,展示所有连接方式 | 您可以使用以下命令启动开发服务器直接访问示例: ```bash npm run dev ``` 这将自动打开浏览器并访问 http://localhost:8000/examples/vscode-layout-demo/ 查看VSCode风格的综合演示。 ## 🔌 支持的连接类型 MCP Client 支持多种连接方式,满足不同应用场景的需求: | 连接类型 | 描述 | 适用场景 | |---------|------|---------| | **SSE (Server-Sent Events)** | 单向服务器推送协议 | 接收服务器事件流、通知更新、状态监控 | | **Streamable HTTP** | 可流式传输的HTTP连接 | 大型数据传输、渐进式内容加载、长轮询替代方案 | | **WebSocket** | 双向实时通信协议 | 实时聊天、游戏、协作工具、需要频繁交互的应用 | ## 🛠️ 客户端能力 MCP Client 实现了客户端能力声明机制,使客户端能够向服务器表明其支持的功能和特性。服务器可以根据这些信息调整其行为,提供更加个性化的服务。 ### 能力声明示例 ```javascript // 声明客户端能力 client.declareCapabilities({ stream: true, // 支持流式处理 largePayload: true, // 支持大 payload compression: ['gzip', 'deflate'], // 支持的压缩算法 authentication: ['oauth2', 'basic'] // 支持的认证方式 }); // 获取当前声明的能力 const capabilities = client.getCapabilities(); console.log('客户端能力:', capabilities); ``` ### 能力协商流程 1. 客户端初始化后声明其能力 2. 服务器接收并解析客户端能力声明 3. 服务器根据客户端能力调整响应策略 4. 客户端接收服务器响应时,可根据服务器支持的能力调整自身行为 ## 📦 依赖 MCP Client 依赖以下核心库: | 依赖名称 | 版本 | 用途 | 来源 | |---------|------|------|------| | [ajv](https://github.com/ajv-validator/ajv) | ^8.17.1 | JSON Schema验证库 | GitHub | | [pkce-challenge](https://github.com/curityio/pkce-challenge) | ^5.0.0 | PKCE挑战生成工具 | GitHub | | [zod](https://github.com/colinhacks/zod) | ^4.1.11 | TypeScript-first schema声明和验证库(备用) | GitHub | ## 🛠️ 开发工具 项目使用以下开发工具和技术栈: - [Webpack](https://webpack.js.org/) - 模块打包工具 - [Babel](https://babeljs.io/) - JavaScript编译器,支持最新JS特性 - [TypeScript类型定义](https://www.typescriptlang.org/) - 提供类型定义文件,支持TypeScript开发 ## 🌐 跨域处理 在使用MCP客户端库与不同域名的服务器进行通信时,可能会遇到跨域资源共享(CORS)限制。以下是处理跨域问题的几种常见方式,按推荐程度排序: ### 1. 使用Electron版本(推荐) 最简单的解决方案是使用项目提供的Electron版本,它自动忽略了所有跨域限制: ```bash # 构建并运行Electron应用 npm run electron:build npm run electron:dev ``` 详细信息请参考 。 ### 1. 服务器端配置CORS 最直接且推荐的解决方案是在服务器端配置CORS,允许来自客户端域名的请求。服务器需要设置适当的响应头,如: ``` Access-Control-Allow-Origin: * # 或指定允许的域名 Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type, Authorization Access-Control-Allow-Credentials: true # 如果需要发送凭证 ``` ### 2. 开发环境使用代理服务器 在开发环境中,可以使用webpack等工具配置代理服务器转发请求,绕过浏览器的跨域限制: ```javascript // webpack.config.js module.exports = { // ... devServer: { proxy: { '/api': { target: 'http://localhost:8081', changeOrigin: true, pathRewrite: { '^/api': '' } } } } }; ``` ### 3. 生产环境配置反向代理 在生产环境中,推荐在后端服务器配置反向代理,将客户端请求转发到目标服务器。以下是使用Nginx配置反向代理的完整示例: ```nginx server { listen 80; server_name yourdomain.com; # 可选:重定向HTTP到HTTPS # return 301 https://$server_name$request_uri; location /api { proxy_pass http://target-server.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket支持(如果需要) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # 静态资源服务 location / { root /path/to/your/static/files; index index.html; try_files $uri $uri/ /index.html; } } ``` ## 📝 许可证 该项目采用 **MIT 许可证** - 详见 [LICENSE](LICENSE) 文件。 ## 👥 作者与贡献 - **作者**:[Mofum] - Mofum 欢迎提交Issue和Pull Request来帮助改进这个项目!