Skip to main content
Glama
ZhaoLLe
by ZhaoLLe
README.md
# MCP Bridge

一个动态 MCP (Model Context Protocol) 服务桥接器,支持通过 Web UI 或 API 动态注册 MCP 能力,支持 SSE 协议,并实现 MCP Client 与前端之间的双向通信。

## 快速开始

```bash
# 1. 安装依赖
npm install

# 2. 启动服务
npm run dev

# 3. 打开 http://localhost:3000/sdk/simple.html 注册工具

# 4. 在 .mcp/settings.json 中配置连接
```

```json
// .mcp/settings.json
{
  "mcpServers": {
    "mcp-bridge": {
      "url": "http://localhost:3000/sse"
    }
  }
}
```

## 核心功能

### 1. 动态注册 MCP 能力
- **Tools**: 动态注册可被 MCP Client 调用的工具函数 ✅
- **Skills**: 可视化编排复杂工作流,支持条件分支、多工具组合 ✅
- **Resources**: 动态注册可被读取的资源(规划中)
- **Prompts**: 动态注册预定义的提示词模板(规划中)

### 2. 协议支持
- **SSE (HTTP)**: 远程/Web 访问,适配 Claude Code 等网络客户端 ✅
- **stdio**: 本地进程通信(规划中)

### 3. 双向通信
- Web UI 通过 HTTP API 注册工具
- MCP Client (Claude) 调用工具时,MCP Bridge 通过 WebSocket 通知 Web UI 执行
- Web UI 执行完毕后返回结果,MCP Bridge 再返回给 Claude

### 4. 核心调用流程

```
┌──────────┐      ┌──────────┐      ┌──────────┐      ┌──────────┐
│  Web UI  │      │   MCP    │      │   MCP    │      │  Claude  │
│          │      │  Bridge  │      │  Server  │      │ Desktop │
└────┬─────┘      └────┬─────┘      └────┬─────┘      └────┬─────┘
     │                 │                 │                 │
     │  1. 注册工具     │                 │                 │
     │ ───────────────▶│                 │                 │
     │                 │                 │                 │
     │                 │                 │   2. 调用工具    │
     │                 │                 │ ◀───────────────│
     │                 │                 │                 │
     │                 │  3. 转发请求     │                 │
     │                 │ ◀───────────────│                 │
     │                 │                 │                 │
     │  4. tool_request│                 │                 │
     │ ◀───────────────│                 │                 │
     │                 │                 │                 │
     │  5. 执行操作     │                 │                 │
     │  (用户交互/业务) │                 │                 │
     │                 │                 │                 │
     │  6. tool_response│                │                 │
     │ ───────────────▶│                 │                 │
     │                 │                 │                 │
     │                 │  7. 返回结果     │                 │
     │                 │ ───────────────▶│                 │
     │                 │                 │                 │
     │                 │                 │  8. 返回给 Claude│
     │                 │                 │ ───────────────▶│
     │                 │                 │                 │
```

## 技术栈

| 层级 | 技术选型 |
|------|----------|
| 运行时 | Node.js 20+ (ESM) |
| 后端框架 | Hono |
| MCP SDK | @modelcontextprotocol/sdk |
| WebSocket | Hono 内置 |
| 存储 | 内存缓存(Map),后续可升级为 SQLite/Redis |
| 前端 | React 18 + Vite + TypeScript |
| 容器化 | Docker multi-stage build |

## 架构设计

```
┌─────────────────────────────────────────────────────────────────────┐
│                        MCP Bridge Server                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐ │
│  │   Transport     │  │   Core Engine   │  │    Push Service     │ │
│  ├─────────────────┤  ├─────────────────┤  ├─────────────────────┤ │
│  │ • stdio server  │  │ • Tool Registry │  │ • WebSocket Server   │ │
│  │ • SSE server    │  │ • Resource Mgr  │  │ • Event Emitter     │ │
│  │ • HTTP API      │  │ • Prompt Store  │  │ • Subscription Mgr  │ │
│  └─────────────────┘  └─────────────────┘  └─────────────────────┘ │
│           │                   │                      │             │
│           └───────────────────┼──────────────────────┘             │
│                               ▼                                    │
│                    ┌─────────────────────┐                         │
│                    │   Storage Layer     │                         │
│                    │  (Memory Cache)     │                         │
│                    └─────────────────────┘                         │
└─────────────────────────────────────────────────────────────────────┘
        │                                           │
        ▼                                           ▼
┌───────────────┐                         ┌─────────────────┐
│ MCP Clients   │                         │   WebSocket     │
│ (Claude等)    │                         │   连接端点      │
└───────────────┘                         └────────┬────────┘
                                                   │
                                    ┌──────────────┼──────────────┐
                                    │              │              │
                              ┌─────▼─────┐  ┌─────▼─────┐  ┌─────▼─────┐
                              │  Web UI   │  │  前端应用A │  │  前端应用B │
                              │ (内置)    │  │ (任意项目) │  │ (任意项目) │
                              └───────────┘  └───────────┘  └───────────┘
```

### 前端项目接入方式

任意前端项目都可以通过以下方式接入 MCP Bridge:

| 接入方式 | 说明 | 用途 |
|----------|------|------|
| **HTTP API** | `POST /api/tools` | 注册工具 |
| **WebSocket** | `ws://localhost:3000/ws` | 响应工具调用、订阅事件 |

### Web UI 特殊角色

Web UI 是 MCP Bridge 内置的前端项目,具备双重能力:

| 角色 | 功能 | 实现方式 |
|------|------|----------|
| **管理界面** | 注册/编辑/删除/测试工具 | HTTP API |
| **执行端** | 响应 Claude 的工具调用请求 | WebSocket |

## 项目结构

```
mcp-bridge/
├── src/
│   ├── index.ts              # 入口文件
│   ├── config.ts             # 配置管理
│   │
│   ├── core/                 # 核心引擎
│   │   ├── types.ts          # 核心类型定义
│   │   ├── registry.ts       # 工具注册中心(内存存储)
│   │   ├── executor.ts       # 工具执行器
│   │   ├── skillRegistry.ts  # Skill 注册中心
│   │   ├── skillExecutor.ts  # Skill 执行引擎
│   │   ├── skillMdGenerator.ts # SKILL.md 生成器
│   │   └── schemas.ts        # Zod 验证模式
│   │
│   ├── transport/            # 传输层
│   │   ├── sse.ts            # SSE MCP 服务器
│   │   ├── websocket.ts      # WebSocket 客户端管理
│   │   ├── ws-handler.ts     # WebSocket 消息处理
│   │   └── ws-route.ts       # WebSocket 路由
│   │
│   ├── api/                  # HTTP API 路由
│   │   ├── tools.ts          # Tools CRUD API
│   │   ├── skills.ts         # Skills CRUD + invoke API
│   │   └── logs.ts           # 日志查询 API
│   │
│   └── web/                  # React Web UI
│       ├── App.tsx           # 主应用组件
│       ├── main.tsx          # 入口
│       ├── index.html        # HTML 模板
│       ├── styles.css        # 全局样式
│       ├── components/       # 可复用组件
│       ├── pages/            # 页面组件
│       │   ├── ToolListPage.tsx
│       │   ├── SkillEditorPage.tsx
│       │   └── LogsPage.tsx
│       └── services/
│           └── api.ts        # API 客户端
│
├── sdk/                      # 前端 SDK
│   ├── src/
│   │   ├── index.ts          # SDK 入口
│   │   ├── client.ts         # MCPBridgeClient 类
│   │   └── types.ts          # 类型定义
│   ├── simple.html           # 轻量级工具注册页面 ✅
│   ├── test-sdk.html         # SDK 测试页面
│   ├── test.html             # 功能测试页面
│   └── package.json
│
├── .mcp/
│   └── settings.json         # MCP 服务配置
│
├── docs/                     # 文档
│   ├── phase1-design.md      # 第一阶段技术方案
│   └── skill-usage-guide.md  # Skill 使用指南
│
├── package.json
├── tsconfig.json
├── vite.config.ts            # Vite 配置
└── README.md
```

## API 设计

### Skills API

```http
# 列出所有 Skills
GET /api/skills

# 获取单个 Skill
GET /api/skills/:name

# 创建 Skill
POST /api/skills
Content-Type: application/json
{
  "name": "weather_recommend",
  "displayName": "天气活动推荐",
  "description": "根据天气情况推荐合适的活动",
  "triggerPhrases": ["推荐活动", "周末干什么"],
  "exposeModes": {
    "asSkill": true,
    "asTool": true,
    "asPrompt": true
  },
  "inputSchema": {
    "type": "object",
    "properties": {
      "city": { "type": "string", "description": "城市名称" }
    },
    "required": ["city"]
  },
  "nodes": [
    { "id": "start", "type": "start", "name": "开始" },
    { "id": "n1", "type": "tool", "name": "查询天气", "config": { "toolName": "weather_query" } }
  ],
  "edges": [
    { "id": "e1", "source": "start", "target": "n1" }
  ]
}

# 更新 Skill
PUT /api/skills/:name

# 删除 Skill
DELETE /api/skills/:name

# 调用 Skill
POST /api/skills/:name/invoke
Content-Type: application/json
{
  "city": "北京"
}

# 下载 SKILL.md
GET /api/skills/:name/skill-md

# 下载 Prompt 模板
GET /api/skills/:name/prompt-template
```

### Tools API

```http
# 列出所有工具
GET /api/tools

# 获取单个工具
GET /api/tools/:name

# 注册工具
POST /api/tools
Content-Type: application/json
{
  "name": "get_weather",
  "description": "获取指定城市的天气信息",
  "inputSchema": {
    "type": "object",
    "properties": {
      "city": { "type": "string", "description": "城市名称" }
    },
    "required": ["city"]
  },
  "handler": {
    "type": "http",
    "url": "https://api.weather.com/current",
    "method": "GET"
  }
}

# 更新工具
PUT /api/tools/:name

# 删除工具
DELETE /api/tools/:name

# 测试工具
POST /api/tools/:name/invoke
Content-Type: application/json
{
  "city": "北京"
}
```

### Resources API

```http
# 列出所有资源
GET /api/resources

# 获取单个资源
GET /api/resources/:uri

# 注册资源
POST /api/resources
{
  "uri": "config://app",
  "name": "应用配置",
  "description": "全局应用配置",
  "mimeType": "application/json",
  "handler": {
    "type": "static",
    "data": { "version": "1.0.0" }
  }
}

# 删除资源
DELETE /api/resources/:uri
```

### Prompts API

```http
# 列出所有提示词
GET /api/prompts

# 获取单个提示词
GET /api/prompts/:name

# 注册提示词
POST /api/prompts
{
  "name": "code_review",
  "description": "代码审查提示词",
  "arguments": [
    { "name": "language", "description": "编程语言", "required": true }
  ],
  "template": "请审查以下 {{language}} 代码:\n\n{{code}}"
}

# 删除提示词
DELETE /api/prompts/:name
```

## WebSocket 协议设计

WebSocket 用于前端与 MCP Bridge 之间的双向通信,支持客户端注册、工具执行请求/响应、事件订阅等功能。

### 连接端点

```
ws://localhost:3000/ws
```

### 消息格式

所有消息均为 JSON 格式,必须包含 `type` 字段。

---

### 客户端 → 服务端消息

#### 1. 注册(必需,连接后首先发送)

```javascript
{
  "type": "register",
  "clientId": "my-app-001",           // 可选,不填则自动生成
  "capabilities": ["get_weather", "confirm_action"]  // 可执行的工具列表
}
```

#### 2. 心跳

```javascript
{
  "type": "ping"
}
```

#### 3. 订阅事件

```javascript
{
  "type": "subscribe",
  "events": ["tool_invoked", "tool_registered", "tool_deleted"]
}
```

| 事件 | 说明 |
|------|------|
| `tool_invoked` | 工具被调用时触发 |
| `tool_registered` | 新工具注册时触发 |
| `tool_deleted` | 工具删除时触发 |
| `resource_read` | 资源被读取时触发 |
| `prompt_used` | 提示词被使用时触发 |

#### 4. 工具执行响应

当收到 `tool_request` 后,前端执行完毕返回结果:

```javascript
{
  "type": "tool_response",
  "requestId": "uuid-xxx",            // 必须与 tool_request 中的 requestId 一致
  "success": true,
  "result": {                         // 成功时返回
    "temperature": 25,
    "city": "北京"
  }
}
```

执行失败时:

```javascript
{
  "type": "tool_response",
  "requestId": "uuid-xxx",
  "success": false,
  "error": {
    "code": "EXECUTION_FAILED",
    "message": "无法获取天气信息"
  }
}
```

#### 5. 取消订阅

```javascript
{
  "type": "unsubscribe",
  "events": ["tool_invoked"]
}
```

---

### 服务端 → 客户端消息

#### 1. 注册确认

```javascript
{
  "type": "registered",
  "clientId": "my-app-001",
  "timestamp": "2024-03-25T10:00:00Z"
}
```

#### 2. 心跳响应

```javascript
{
  "type": "pong",
  "timestamp": "2024-03-25T10:00:00Z"
}
```

#### 3. 工具执行请求

MCP Client 调用 websocket handler 类型的工具时,服务端向前端发送执行请求:

```javascript
{
  "type": "tool_request",
  "requestId": "uuid-xxx",            // 请求唯一标识,用于匹配响应
  "tool": "get_weather",
  "action": "getUserConfirmation",    // 可选,前端识别的操作类型
  "arguments": {
    "city": "北京"
  },
  "timeout": 30000,                   // 超时时间(毫秒)
  "timestamp": "2024-03-25T10:00:00Z"
}
```

#### 4. 事件通知

订阅的事件发生时推送:

```javascript
{
  "type": "tool_invoked",
  "timestamp": "2024-03-25T10:00:00Z",
  "data": {
    "tool": "get_weather",
    "arguments": { "city": "北京" },
    "result": { "temperature": 25 },
    "clientType": "claude-desktop"
  }
}
```

#### 5. 错误通知

```javascript
{
  "type": "error",
  "code": "INVALID_MESSAGE",
  "message": "Message must include 'type' field"
}
```

---

### 错误码定义

| 错误码 | 说明 |
|--------|------|
| `INVALID_MESSAGE` | 消息格式错误 |
| `UNKNOWN_MESSAGE_TYPE` | 未知的消息类型 |
| `NOT_REGISTERED` | 客户端未注册 |
| `CLIENT_OFFLINE` | 目标客户端离线 |
| `TIMEOUT` | 执行超时 |
| `EXECUTION_FAILED` | 执行失败 |
| `REJECTED` | 前端拒绝执行 |
| `UNKNOWN_TOOL` | 未知的工具 |

---

### 连接生命周期

```
┌─────────┐                                          ┌─────────┐
│  前端    │                                          │ Server  │
└────┬────┘                                          └────┬────┘
     │                                                    │
     │  ── register { capabilities: [...] } ──────────────▶│
     │                                                    │
     │  ◀─────────── registered { clientId } ─────────────│
     │                                                    │
     │  ── subscribe { events: [...] } ──────────────────▶│
     │                                                    │
     │  ◀───────────── subscribed ────────────────────────│
     │                                                    │
     │  ◀──── tool_request { requestId, tool } ──────────│  (Claude 调用)
     │                                                    │
     │  ── tool_response { requestId, result } ──────────▶│
     │                                                    │
     │  ◀──── tool_response_sent ────────────────────────│  (确认已转发给 Claude)
     │                                                    │
     │  ◀────── event: tool_invoked ─────────────────────│  (订阅的事件)
     │                                                    │
     │  ── ping ─────────────────────────────────────────▶│
     │                                                    │
     │  ◀──────────── pong ──────────────────────────────│
     │                                                    │
```

---

### WebSocket Handler 配置

注册工具时,websocket handler 配置:

```typescript
{
  "name": "confirm_action",
  "description": "请求用户确认操作",
  "inputSchema": {
    "type": "object",
    "properties": {
      "message": { "type": "string", "description": "确认消息" }
    },
    "required": ["message"]
  },
  "handler": {
    "type": "websocket",
    "action": "getUserConfirmation",  // 前端识别的 action
    "timeout": 30000,                 // 超时时间(毫秒),默认 30000
    "target": "all"                   // 通知策略:all | first | specific
  }
}
```

| 字段 | 说明 |
|------|------|
| `action` | 前端识别的操作类型,前端根据此字段决定如何处理 |
| `timeout` | 超时时间,超时后返回错误给 MCP Client |
| `target` | `all` - 通知所有能执行该工具的客户端;`first` - 通知第一个响应的客户端;`specific` - 需配合 `clientId` 使用 |

---

### 任意前端项目接入示例

任何前端项目都可以接入 MCP Bridge,实现工具注册和响应调用。

#### 完整流程

```typescript
// 1. 通过 HTTP API 注册工具
await fetch('http://localhost:3000/api/tools', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    name: 'my_custom_tool',
    description: '我的自定义工具',
    inputSchema: {
      type: 'object',
      properties: {
        input: { type: 'string' }
      },
      required: ['input']
    },
    handler: {
      type: 'websocket',  // 指定由前端执行
      action: 'handleCustomTool',
      timeout: 30000
    }
  })
})

// 2. 建立 WebSocket 连接
const ws = new WebSocket('ws://localhost:3000/ws')

ws.onopen = () => {
  // 注册客户端能力(声明能执行哪些工具)
  ws.send(JSON.stringify({
    type: 'register',
    clientId: 'my-frontend-app',
    capabilities: ['my_custom_tool']
  }))
}

ws.onmessage = (event) => {
  const message = JSON.parse(event.data)

  // 处理工具执行请求
  if (message.type === 'tool_request') {
    const { requestId, tool, action, arguments } = message

    if (action === 'handleCustomTool') {
      // 执行你的业务逻辑
      const result = await doSomething(arguments.input)

      // 返回结果
      ws.send(JSON.stringify({
        type: 'tool_response',
        requestId,
        success: true,
        result
      }))
    }
  }
}
```

#### 使用场景

| 场景 | 说明 |
|------|------|
| 用户确认 | Claude 请求用户确认操作,前端弹出确认框 |
| 数据查询 | Claude 需要前端应用的数据 |
| 执行操作 | Claude 触发前端执行某个操作(如发送消息) |
| 人工介入 | 需要人工审核/输入的场景 |

---

### 前端 SDK 使用示例

为简化接入,提供 JavaScript/TypeScript SDK:

```typescript
import { MCPBridgeClient } from 'mcp-bridge-sdk'

const client = new MCPBridgeClient('ws://localhost:3000/ws')

// 连接并注册
await client.connect({
  clientId: 'my-app',
  capabilities: ['get_weather', 'confirm_action']
})

// 监听工具执行请求
client.on('tool_request', async (request) => {
  const { requestId, tool, action, arguments } = request

  if (action === 'getUserConfirmation') {
    const confirmed = await showConfirmDialog(arguments.message)
    client.respond(requestId, confirmed, confirmed ? undefined : { code: 'REJECTED' })
  }

  if (tool === 'get_weather') {
    const weather = await fetchWeather(arguments.city)
    client.respond(requestId, weather)
  }
})

// 订阅事件
client.subscribe(['tool_invoked', 'tool_registered'])

client.on('tool_invoked', (event) => {
  console.log('Tool invoked:', event.data)
})

// 断开连接
client.disconnect()
```

## 实现状态

### ✅ 已完成

| 功能 | 状态 | 说明 |
|------|------|------|
| **Tools 核心模块** | ✅ 完成 | Registry + Executor(内存存储) |
| **Skill 编排引擎** | ✅ 完成 | 可视化编排、条件分支、多工具组合 |
| **Skill 文档生成** | ✅ 完成 | 自动生成 SKILL.md 和 Prompt 模板 |
| **HTTP API (Tools)** | ✅ 完成 | CRUD + invoke 测试接口 |
| **HTTP API (Skills)** | ✅ 完成 | CRUD + invoke + 文档下载 |
| **SSE Transport** | ✅ 完成 | 支持 MCP Client 通过 SSE 连接 |
| **WebSocket 服务** | ✅ 完成 | 双向通信、心跳检测、事件订阅 |
| **WebSocket Handler** | ✅ 完成 | 工具执行请求/响应流程 |
| **前端 SDK** | ✅ 完成 | `mcp-bridge-sdk`,支持注册、监听、响应 |
| **Simple 页面** | ✅ 完成 | 轻量级工具注册页面,支持心跳保活 |
| **MCP 配置生成** | ✅ 完成 | 自动生成 `.mcp/settings.json` |

### 🚧 进行中

| 功能 | 状态 | 说明 |
|------|------|------|
| **static/http handler** | 🚧 部分 | 框架已预留,具体实现待完善 |

### ❌ 未完成

| 功能 | 状态 | 说明 |
|------|------|------|
| **stdio Transport** | ❌ 未开始 | 本地进程通信模式 |
| **Resources 模块** | ❌ 未开始 | 资源注册与读取 |
| **Prompts 模块** | ❌ 未开始 | 提示词模板管理 |
| **React Web UI** | ✅ 已完成 | 完整管理界面(Skill 编排、工具管理、日志查看) |
| **持久化存储** | ❌ 未开始 | SQLite/Redis 支持 |
| **单元测试** | ✅ 已完成 | 核心模块测试覆盖 |
| **Docker 配置** | ❌ 未开始 | Dockerfile + docker-compose |
| **Script Handler** | ❌ 未开始 | 沙箱脚本执行 |

---

## 实现计划(垂直切片)

### 第一阶段:Tools 模块(MVP)✅ 已完成
1. ✅ 核心 Registry 和 Executor(内存存储)
2. ✅ HTTP API (CRUD + invoke)
3. ✅ MCP Server (SSE)
4. ✅ WebSocket 协议实现
   - ✅ 客户端注册/心跳
   - ✅ 工具执行请求/响应
   - ✅ 事件订阅
5. ✅ 前端 SDK + 示例页面
   - ✅ `sdk/simple.html` - 轻量级注册页面
   - ✅ `sdk/test-sdk.html` - SDK 测试页面
   - ✅ `mcp-bridge-sdk` - NPM 包

### 第二阶段:Skill 编排引擎 ✅ 已完成
1. ✅ Skill 核心类型定义
2. ✅ Skill 执行引擎(支持工具调用、条件分支)
3. ✅ Skill 注册中心
4. ✅ 可视化编排 UI
5. ✅ 文档生成功能
   - ✅ SKILL.md 自动生成
   - ✅ Prompt 模板生成
6. ✅ HTTP API (Skills CRUD + invoke + 文档下载)

### 第三阶段:完善功能
1. 🚧 static / http handler 支持
2. ❌ Resources 模块
3. ❌ Prompts 模块

### 第三阶段:持久化与优化
1. ❌ 存储层升级(SQLite/Redis)
2. ✅ 单元测试
3. ❌ 性能优化
4. ✅ 文档完善

## Handler 类型

工具执行支持多种处理器类型:

| 类型 | 说明 | 使用场景 |
|------|------|----------|
| `static` | 返回静态数据 | Mock 数据、固定配置 |
| `http` | 调用外部 HTTP API | 集成第三方服务 |
| `websocket` | 通过 WebSocket 调用前端 | 需要前端参与的操作 |
| `skill` | 调用已定义的 Skill | 复用已有 Skill 能力 |
| `script` | 执行脚本(沙箱) | 自定义逻辑 |

```typescript
// HTTP Handler 示例
{
  "type": "http",
  "url": "https://api.example.com/endpoint",
  "method": "POST",
  "headers": { "Authorization": "Bearer xxx" },
  "bodyMapping": "$.arguments"  // JSONPath 映射
}

// WebSocket Handler 示例
{
  "type": "websocket",
  "timeout": 30000,
  "responsePath": "$.result"  // 从响应中提取结果
}

// Script Handler 示例
{
  "type": "script",
  "runtime": "javascript",
  "code": "return arguments.city.toUpperCase();"
}
```

## Docker 部署

> **注意**:Docker 配置尚未实现,计划在后续版本中添加。

```bash
# 构建镜像(待实现)
docker build -t mcp-bridge:latest .

# 运行容器(待实现)
docker run -d \
  -p 3000:3000 \
  -e MCP_BRIDGE_PORT=3000 \
  --name mcp-bridge \
  mcp-bridge:latest
```

> **注意**:当前使用内存存储,容器重启后数据会丢失。

## 配置说明

```typescript
// src/config.ts
export const config = {
  // 服务端口
  port: parseInt(process.env.MCP_BRIDGE_PORT || '3000', 10),

  // 服务 URL(用于生成 MCP 配置)
  serverUrl: process.env.MCP_BRIDGE_URL || 'http://localhost:3000',

  // MCP 服务器配置
  mcp: {
    name: process.env.MCP_NAME || 'mcp-bridge',
    version: '1.0.0',
  },

  // WebSocket 配置
  websocket: {
    path: '/ws',
    heartbeat: 30000,  // 心跳间隔(毫秒)
  },
}
```

### 环境变量

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `MCP_BRIDGE_PORT` | `3000` | 服务端口 |
| `MCP_BRIDGE_URL` | `http://localhost:3000` | 服务 URL |
| `MCP_NAME` | `mcp-bridge` | MCP 服务名称 |

> **注意**:当前使用内存存储,服务重启后数据会丢失。后续版本将支持持久化存储。

## 使用示例

### 启动服务

```bash
# 安装依赖
npm install

# 开发模式
npm run dev

# 构建
npm run build

# 启动生产服务
npm start
```

### 通过 SSE 连接(推荐)

MCP Bridge 目前支持 SSE 协议,可被 Claude Code 或其他 MCP 客户端连接:

```json
// .mcp/settings.json
{
  "mcpServers": {
    "mcp-bridge": {
      "url": "http://localhost:3000/sse"
    }
  }
}
```

### MCP Client 代码示例

```typescript
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'

const transport = new SSEClientTransport(
  new URL('http://localhost:3000/sse')
)
const client = new Client({ name: 'my-client', version: '1.0.0' }, {})
await client.connect(transport)
```

### 快速测试工具

```bash
# 列出已注册工具
curl http://localhost:3000/api/tools

# 调用工具
curl -X POST http://localhost:3000/api/tools/say_good/invoke \
  -H "Content-Type: application/json" \
  -d '{"name": "测试"}'
```

## License

MIT