2025-05-17 gateway.mjs MCP Gateway 的最小版伺服器解釋

2025-05-17 gateway.mjs MCP Gateway 的最小版伺服器解釋

很好 👌 這份 gateway.mjs 就是你 MCP Gateway 的最小版伺服器。我幫你逐段解釋,最後整理出重點。


🔎 程式逐段說明

1. 匯入模組 & 啟動設定

1
2
3
4
5
import express from 'express';
import dotenv from 'dotenv';
dotenv.config();
const app = express();
app.use(express.json());
  • express → Node.js 最常用的 Web 框架,用來建 API。
  • dotenv → 讀取 .env 檔案,把裡面的設定值放到 process.env 裡。
  • dotenv.config() → 這行會自動讀取 .env
  • app.use(express.json()) → 讓 Express 可以解析 JSON 格式的 request body。

2. 讀取環境變數

1
2
const OPENAI_KEY = process.env.OPENAI_API_KEY || '';
const DEEPSEEK_KEY = process.env.DEEPSEEK_API_KEY || '';
  • 嘗試讀 .env 裡的 OPENAI_API_KEYDEEPSEEK_API_KEY
  • 如果沒設定,預設就是空字串(方便之後用「mock 模式」測試)。

3. Providers(提供者適配器)

1
2
3
4
5
6
7
8
9
10
11
const providers = {
openai: async ({ messages }) => {
if (!OPENAI_KEY) return { text: '[mock openai] 這是模擬回覆' };
...
},

deepseek: async ({ messages }) => {
if (!DEEPSEEK_KEY) return { text: '[mock deepseek] 這是模擬回覆' };
...
}
};
  • 這裡定義了 兩個 AI 提供者的呼叫方式openaideepseek
  • 特別設計:如果 key 沒設定 → 回傳一個 假回覆(mock),方便本地測試。
  • 否則就真的去呼叫 API(用 fetch POST 到對應的 API endpoint)。
  • 回傳格式統一 { text, raw }text 是簡單結果,raw 是完整 API 回覆。

4. 健康檢查 API

1
app.get('/health', (req, res) => res.json({ status: 'ok', role: 'mcp-gateway' }));
  • 提供 /health API,確認伺服器活著。
  • 通常監控系統或 DevOps 會打這個來檢查服務是否正常。

5. 聊天 API

1
2
3
4
5
6
7
8
9
10
11
12
app.post('/api/chat', async (req, res) => {
const { provider = 'openai', messages = [{ role:'user', content:'hello' }] } = req.body;
const adapter = providers[provider];
if (!adapter) return res.status(400).json({ error: 'unknown provider' });
try {
const { text, raw } = await adapter({ messages });
return res.json({ provider, text, raw });
} catch (err) {
console.error('provider error', err);
return res.status(500).json({ error: 'provider error' });
}
});
  • 這是主要的 API:**POST /api/chat**。

  • Request body 應該包含:

    1
    2
    3
    4
    {
    "provider": "openai",
    "messages": [{ "role": "user", "content": "hello" }]
    }
  • 如果沒提供,預設就是 openai + 一個簡單訊息。

  • 根據 provider 來選擇要呼叫哪個適配器。

  • 如果 provider 不存在 → 回傳 400(Bad Request)。

  • 如果 API 呼叫失敗 → 回傳 500(Server Error)。

  • 成功就回傳:

    1
    2
    3
    4
    5
    {
    "provider": "openai",
    "text": "... AI 回覆 ...",
    "raw": { ...完整 API 結果... }
    }

6. 啟動伺服器

1
2
const port = process.env.PORT || 4000;
app.listen(port, () => console.log(`MCP gateway listening on ${port}`));
  • .env 讀取 PORT,如果沒設定就用 4000
  • 啟動 Express 伺服器,監聽這個 port。
  • 啟動成功會在終端機輸出提示。

🚩 重點整理

  1. 模組

    • express → Web 伺服器
    • dotenv → 讀取 .env
  2. 環境變數管理

    • API Key 都放在 .env,不寫死在程式裡。
    • Key 留空時會回 mock 回覆,方便測試。
  3. API 路徑

    • GET /health → 檢查服務狀態
    • POST /api/chat → 呼叫 AI(支援 openaideepseek
  4. 設計重點

    • Adapter Pattern(適配器模式):每個 provider 都是一個 adapter,以後要加新 provider(例如 Anthropic、Gemini)也很容易。
    • 錯誤處理:有 try/catch,避免伺服器直接掛掉。
    • Mock 機制:沒 API key 也能本地跑通,降低開發阻力。

要不要我幫你畫一個 請求流程圖(從前端發送 → gateway → provider → 回傳)?這樣你一看就能明白整個 Gateway 的作用。