Skip to main content
Glama
haode01

romate-mcp-server

by haode01
README.md
# ๐Ÿš€ mcp-proxy-server

**HTTP MCP Gateway** โ€” ๅฐ†ๆœฌๅœฐ stdio MCP ๅทฅๅ…ทๆšด้œฒไธบ HTTP/SSE ๅ่ฎฎใ€‚

> ไฝ ๅช้œ€่ฆ้…็ฝฎๆœฌๅœฐๆ‰ง่กŒ็š„ๅ‘ฝไปค๏ผŒromate-mcp-server ๅฐฑไผš่‡ชๅŠจๅฐ†ไปปๆ„ stdio MCP ๆœๅŠกๅ™จๆณจๅ†Œไธบ HTTP ็ซฏ็‚น๏ผŒ่ฎฉ่ฟœ็จ‹ๅฎขๆˆท็ซฏ๏ผˆๅฆ‚ Claude Desktopใ€Cline ็ญ‰๏ผ‰้€š่ฟ‡็ฝ‘็ปœ่ฐƒ็”จใ€‚

---

## ็‰นๆ€ง

| ็‰นๆ€ง | ่ฏดๆ˜Ž |
|------|------|
| ๐Ÿ”Œ **้›ถไปฃ็ ้›†ๆˆ** | ๅช้œ€ YAML ้…็ฝฎๅ‘ฝไปค๏ผŒๆ— ้œ€ไฟฎๆ”นไปปไฝ• MCP ๆœๅŠกๅ™จไปฃ็  |
| ๐ŸŒ **HTTP + SSE ๅŒๅ่ฎฎ** | ๆ”ฏๆŒ Streamable HTTP ๅ’Œ Server-Sent Events ไธค็งไผ ่พ“ๆ–นๅผ |
| ๐Ÿ”— **่šๅˆๆจกๅผ** | ๅ•ไธ€่ทฏๅพ„่šๅˆๆ‰€ๆœ‰ๅทฅๅ…ท๏ผŒ่‡ชๅŠจ `proxyName_toolName` ๅ‰็ผ€่ทฏ็”ฑ |
| ๐Ÿ” **Bearer Token ้‰ดๆƒ** | ๅฏ้€‰ Token ้‰ดๆƒ๏ผŒๆ”ฏๆŒๆŽ’้™ค่ทฏๅพ„ |
| โ™ป๏ธ **่‡ชๅŠจ้‡ๅฏ** | ๅญ่ฟ›็จ‹ๅดฉๆบƒๅŽ่‡ชๅŠจ้‡ๅฏ๏ผŒๆŒ‡ๆ•ฐ้€€้ฟ็ญ–็•ฅ |
| โฑ๏ธ **่ถ…ๆ—ถๆŽงๅˆถ** | ๆกๆ‰‹่ถ…ๆ—ถ 10s๏ผŒๅทฅๅ…ท่ฐƒ็”จ่ถ…ๆ—ถ 60s |
| ๐Ÿ”„ **้…็ฝฎ็ƒญ้‡่ฝฝ** | ็›‘ๅฌ้…็ฝฎๆ–‡ไปถๅ˜ๆ›ด๏ผŒ่‡ชๅŠจๅขžๅˆ ๆ”นไปฃ็†ๅฎžไพ‹ |
| ๐Ÿฉบ **ๅฅๅบทๆฃ€ๆŸฅ** | `/health` ๅ’Œ `/tools` ็ซฏ็‚น๏ผŒๅฎžๆ—ถ็›‘ๆŽง็Šถๆ€ |

---

## ๅฟซ้€Ÿๅผ€ๅง‹

### ๅฎ‰่ฃ…

```bash
git clone https://github.com/haode01/mcp-proxy-server.git && cd romate-mcp-server
npm install
npm run build
```

### ้…็ฝฎ

ๅˆ›ๅปบ `config.yaml`๏ผš

```yaml
server:
  port: 3100
  host: "0.0.0.0"
  auth:
    token: "your-secret-token"      # ๅฏ้€‰๏ผŒBearer Token ้‰ดๆƒ
    excludePaths:
      - "/health"                    # ๆ— ้œ€้‰ดๆƒ็š„่ทฏๅพ„

tools:
  - name: "filesystem"
    description: "ๆ–‡ไปถ็ณป็ปŸๆ“ไฝœๅทฅๅ…ท"
    command: "npx"
    args:
      - "-y"
      - "@modelcontextprotocol/server-filesystem"
      - "/tmp"
    restart: true
    restartDelay: 2000

  - name: "github"
    description: "GitHub API ๅทฅๅ…ท"
    command: "npx"
    args:
      - "-y"
      - "@modelcontextprotocol/server-github"
    env:
      GITHUB_TOKEN: "${GITHUB_TOKEN}"   # ๆ”ฏๆŒ็Žฏๅขƒๅ˜้‡ๆ’ๅ€ผ
```

### ๅฏๅŠจ

```bash
# ๅผ€ๅ‘ๆจกๅผ๏ผˆ็ƒญ้‡่ฝฝ๏ผ‰
npm run dev -- ./config.yaml

# ็”Ÿไบงๆจกๅผ
npm run build
node dist/index.js ./config.yaml
```

---

## ่ทฏ็”ฑๆ€ป่งˆ

| ่ทฏๅพ„ | ๆ–นๆณ• | ่ฏดๆ˜Ž |
|------|------|------|
| `/health` | GET | ๅฅๅบทๆฃ€ๆŸฅ๏ผˆๆ— ้œ€้‰ดๆƒ๏ผ‰ |
| `/tools` | GET | ๅˆ—ๅ‡บๆ‰€ๆœ‰ๅทฒๆณจๅ†Œๅทฅๅ…ท |
| `/mcp/:toolName` | POST | ๅ•ๅทฅๅ…ท Streamable HTTP |
| `/mcp/:toolName/sse` | GET | ๅ•ๅทฅๅ…ท SSE ็ซฏ็‚น |
| `/mcp/:toolName/message?sessionId=` | POST | ๅ•ๅทฅๅ…ท SSE ๆถˆๆฏ |
| `/mcp` | POST | **่šๅˆๆจกๅผ** โ€” ๆ‰€ๆœ‰ๅทฅๅ…ท็ปŸไธ€ๅ…ฅๅฃ |
| `/mcp/sse` | GET | **่šๅˆๆจกๅผ** SSE ็ซฏ็‚น |
| `/mcp/message?sessionId=` | POST | **่šๅˆๆจกๅผ** SSE ๆถˆๆฏ |

---

## ไฝฟ็”จ็คบไพ‹

### ๅ•ๅทฅๅ…ทๆจกๅผ

```bash
# ๅˆ—ๅ‡บๅทฅๅ…ท
curl -H "Authorization: Bearer your-secret-token" \
  -H "Content-Type: application/json" \
  -X POST http://localhost:3100/mcp/filesystem \
  -d '{"method":"tools/list","id":1}'

# ่ฐƒ็”จๅทฅๅ…ท
curl -H "Authorization: Bearer your-secret-token" \
  -H "Content-Type: application/json" \
  -X POST http://localhost:3100/mcp/filesystem \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "read_file",
      "arguments": { "path": "/tmp/test.txt" }
    },
    "id": 2
  }'
```

### ่šๅˆๆจกๅผ

่šๅˆๆจกๅผไธ‹๏ผŒๅทฅๅ…ทๅ่‡ชๅŠจๆทปๅŠ  `{proxyName}_` ๅ‰็ผ€ไปฅ้ฟๅ…ๅ†ฒ็ช๏ผš

```bash
# ๅˆ—ๅ‡บๆ‰€ๆœ‰ๅทฅๅ…ท๏ผˆ่ฟ”ๅ›ž echo_echo, filesystem_read_file, github_search_repos ็ญ‰๏ผ‰
curl -H "Authorization: Bearer your-secret-token" \
  -H "Content-Type: application/json" \
  -X POST http://localhost:3100/mcp \
  -d '{"method":"tools/list","id":1}'

# ่ฐƒ็”จๅทฅๅ…ท โ€” ไฝฟ็”จ proxyName_toolName ๆ ผๅผ
curl -H "Authorization: Bearer your-secret-token" \
  -H "Content-Type: application/json" \
  -X POST http://localhost:3100/mcp \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "filesystem_read_file",
      "arguments": { "path": "/tmp/test.txt" }
    },
    "id": 2
  }'
```

### SSE ๆจกๅผ๏ผˆ้€‚็”จไบŽ Claude Desktop ็ญ‰ๅฎขๆˆท็ซฏ๏ผ‰

```
# 1. ๅฎขๆˆท็ซฏๅปบ็ซ‹ SSE ่ฟžๆŽฅ
GET /mcp/filesystem/sse
โ†’ event: endpoint
โ†’ data: http://localhost:3100/mcp/filesystem/message?sessionId=filesystem-1
โ†’ event: tools_list
โ†’ data: [...]

# 2. ๅฎขๆˆท็ซฏๅ‘ endpoint URL ๅ‘้€ JSON-RPC ่ฏทๆฑ‚
POST http://localhost:3100/mcp/filesystem/message?sessionId=filesystem-1
Content-Type: application/json

{"method":"tools/list","id":1}

# 3. ๅ“ๅบ”้€š่ฟ‡ SSE ่ฟžๆŽฅ่ฟ”ๅ›ž
โ†’ event: message
โ†’ data: {"jsonrpc":"2.0","result":{"tools":[...]},"id":1}
```

---

## MCP ๅฎขๆˆท็ซฏ้…็ฝฎ

romate-mcp-server ๅ…ผๅฎนๆ‰€ๆœ‰ๆ”ฏๆŒ HTTP/SSE ไผ ่พ“็š„ MCP ๅฎขๆˆท็ซฏใ€‚ไปฅไธ‹ๆ˜ฏไธ€ไบ›ๅธธ่งๅฎขๆˆท็ซฏ็š„้…็ฝฎๆ–นๅผ๏ผš

### Claude Desktop

ๅœจ `claude_desktop_config.json` ไธญๆทปๅŠ  MCP ๆœๅŠกๅ™จ้…็ฝฎ๏ผš

```json
{
  "mcpServers": {
    "romate-filesystem": {
      "type": "sse",
      "url": "http://your-server:3100/mcp/filesystem/sse",
      "headers": {
        "Authorization": "Bearer your-secret-token"
      }
    },
    "romate-github": {
      "type": "sse",
      "url": "http://your-server:3100/mcp/github/sse",
      "headers": {
        "Authorization": "Bearer your-secret-token"
      }
    }
  }
}
```

### Cline / Roo Code / Claude Dev

ๅœจ MCP ้…็ฝฎๆ–‡ไปถ๏ผˆ้€šๅธธไธบ `~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json` ๆˆ–็ฑปไผผ่ทฏๅพ„๏ผ‰ไธญๆทปๅŠ ๏ผš

```json
{
  "mcpServers": {
    "romate-filesystem": {
      "type": "sse",
      "url": "http://your-server:3100/mcp/filesystem/sse",
      "headers": {
        "Authorization": "Bearer your-secret-token"
      }
    }
  }
}
```

### ่šๅˆๆจกๅผๅฎขๆˆท็ซฏ้…็ฝฎ

ๅฆ‚ๆžœๅธŒๆœ›ๅœจไธ€ไธช SSE ่ฟžๆŽฅไธญ่ฎฟ้—ฎๆ‰€ๆœ‰ๅทฅๅ…ท๏ผŒไฝฟ็”จ่šๅˆ็ซฏ็‚น๏ผš

```json
{
  "mcpServers": {
    "romate-all-tools": {
      "type": "sse",
      "url": "http://your-server:3100/mcp/sse",
      "headers": {
        "Authorization": "Bearer your-secret-token"
      }
    }
  }
}
```

> **ๆณจๆ„**๏ผš่šๅˆๆจกๅผไธ‹ๅทฅๅ…ทๅไผšๅธฆๆœ‰ `{proxyName}_` ๅ‰็ผ€๏ผŒไพ‹ๅฆ‚ `filesystem_read_file`ใ€`github_search_repos`ใ€‚

### ่‡ชๅฎšไน‰ๅฎขๆˆท็ซฏ๏ผˆStreamable HTTP๏ผ‰

ๆ”ฏๆŒ MCP Streamable HTTP ไผ ่พ“็š„ๅฎขๆˆท็ซฏๅฏไปฅ็›ดๆŽฅไฝฟ็”จ POST ็ซฏ็‚น๏ผš

```
POST http://your-server:3100/mcp/filesystem
Content-Type: application/json
Authorization: Bearer your-secret-token

{"method":"tools/list","id":1}
```

---

## ้…็ฝฎๅ‚่€ƒ

### `server` ้…็ฝฎ

| ๅญ—ๆฎต | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | ่ฏดๆ˜Ž |
|------|------|--------|------|
| `port` | number | `3100` | HTTP ็›‘ๅฌ็ซฏๅฃ |
| `host` | string | `"0.0.0.0"` | ็›‘ๅฌๅœฐๅ€ |
| `auth.token` | string | โ€” | Bearer Token๏ผŒไธ้…็ฝฎๅˆ™ไธๅฏ็”จ้‰ดๆƒ |
| `auth.excludePaths` | string[] | `["/health"]` | ๆ— ้œ€้‰ดๆƒ็š„่ทฏๅพ„ๅ‰็ผ€ |

### `tools[]` ้…็ฝฎ

| ๅญ—ๆฎต | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | ่ฏดๆ˜Ž |
|------|------|--------|------|
| `name` | string | โ€” | **ๅฟ…ๅกซ**ใ€‚ๅทฅๅ…ทๅ”ฏไธ€ๆ ‡่ฏ†ๅ |
| `description` | string | `""` | ๅทฅๅ…ทๆ่ฟฐ |
| `command` | string | โ€” | **ๅฟ…ๅกซ**ใ€‚ๅฏๅŠจๅ‘ฝไปค |
| `args` | string[] | `[]` | ๅ‘ฝไปคๅ‚ๆ•ฐ |
| `env` | object | `{}` | ็Žฏๅขƒๅ˜้‡๏ผŒๆ”ฏๆŒ `${VAR_NAME}` ๆ’ๅ€ผ |
| `cwd` | string | โ€” | ๅทฅไฝœ็›ฎๅฝ• |
| `restart` | boolean | `true` | ๅดฉๆบƒๅŽๆ˜ฏๅฆ่‡ชๅŠจ้‡ๅฏ |
| `restartDelay` | number | `2000` | ้‡ๅฏๅŸบ็ก€ๅปถ่ฟŸ(ms)๏ผŒๆŒ‡ๆ•ฐ้€€้ฟ x2๏ผŒไธŠ้™ 30s |

---

## ๆžถๆž„

```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  HTTP Client                     โ”‚
โ”‚        (Claude Desktop, Cline, curl, etc.)       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                   โ”‚ HTTP/SSE
                   โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              romate-mcp-server                   โ”‚
โ”‚                                                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”‚
โ”‚  โ”‚  Auth    โ”‚  โ”‚  Routes  โ”‚  โ”‚  Health  โ”‚       โ”‚
โ”‚  โ”‚ Middlewareโ”‚  โ”‚  /mcp/*  โ”‚  โ”‚  /health โ”‚       โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ”‚
โ”‚                     โ”‚                             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚            ProxyManager                      โ”‚ โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚ โ”‚
โ”‚  โ”‚  โ”‚ McpProxy โ”‚  โ”‚ McpProxy โ”‚  โ”‚ McpProxy โ”‚   โ”‚ โ”‚
โ”‚  โ”‚  โ”‚ (echo)   โ”‚  โ”‚(fs)      โ”‚  โ”‚(github)  โ”‚   โ”‚ โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚              โ”‚              โ”‚
           โ–ผ              โ–ผ              โ–ผ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚  stdio   โ”‚  โ”‚  stdio   โ”‚  โ”‚  stdio   โ”‚
     โ”‚ MCP ่ฟ›็จ‹ โ”‚  โ”‚ MCP ่ฟ›็จ‹ โ”‚  โ”‚ MCP ่ฟ›็จ‹ โ”‚
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```

### ๅทฅไฝœๆต็จ‹

1. **ๅฏๅŠจ** โ†’ ๅŠ ่ฝฝ YAML ้…็ฝฎ โ†’ ไธบๆฏไธชๅทฅๅ…ทๅˆ›ๅปบ `McpProxy` ๅฎžไพ‹
2. **่ฟžๆŽฅ** โ†’ ๆฏไธช `McpProxy` ้€š่ฟ‡ `StdioClientTransport` ๅฏๅŠจๅญ่ฟ›็จ‹ โ†’ ๅฎŒๆˆ MCP ๆกๆ‰‹ โ†’ ็ผ“ๅญ˜ tools/resources/prompts
3. **ไปฃ็†** โ†’ HTTP ่ฏทๆฑ‚ๅˆฐ่พพ โ†’ ้‰ดๆƒ โ†’ ่ทฏ็”ฑๅˆฐๅฏนๅบ” `McpProxy` โ†’ JSON-RPC ่ฐƒ็”จ่ฝฌๅ‘ๅˆฐๅญ่ฟ›็จ‹ โ†’ ่ฟ”ๅ›ž็ป“ๆžœ
4. **ๅฎน้”™** โ†’ ๅญ่ฟ›็จ‹ๅดฉๆบƒ โ†’ `onclose` ่งฆๅ‘ โ†’ ๆŒ‡ๆ•ฐ้€€้ฟ่‡ชๅŠจ้‡ๅฏ๏ผˆ`restart: true` ๆ—ถ๏ผ‰
5. **็ƒญ้‡่ฝฝ** โ†’ ้…็ฝฎๆ–‡ไปถๅ˜ๆ›ด โ†’ ๅฏนๆฏ”ๆ–ฐๆ—ง้…็ฝฎ โ†’ ่‡ชๅŠจๅขž/ๅˆ /ๆ”นไปฃ็†ๅฎžไพ‹

---

## ๅผ€ๅ‘

```bash
# ็ฑปๅž‹ๆฃ€ๆŸฅ
npm run typecheck

# ๅผ€ๅ‘ๆจกๅผ๏ผˆtsx watch ่‡ชๅŠจ้‡ๅฏ๏ผ‰
npm run dev -- ./config.yaml

# ๆž„ๅปบ
npm run build

# ็”ŸไบงๅฏๅŠจ
npm start -- ./config.yaml
```

---

## ่ฎธๅฏ่ฏ

MIT