2025-05-17 gateway.mjs MCP Gateway 的最小版伺服器解釋
2025-05-17 gateway.mjs MCP Gateway 的最小版伺服器解釋
很好 👌 這份 gateway.mjs 就是你 MCP Gateway 的最小版伺服器。我幫你逐段解釋,最後整理出重點。
🔎 程式逐段說明
1. 匯入模組 & 啟動設定
1 | import express from 'express'; |
express→ Node.js 最常用的 Web 框架,用來建 API。dotenv→ 讀取.env檔案,把裡面的設定值放到process.env裡。dotenv.config()→ 這行會自動讀取.env。app.use(express.json())→ 讓 Express 可以解析 JSON 格式的 request body。
2. 讀取環境變數
1 | const OPENAI_KEY = process.env.OPENAI_API_KEY || ''; |
- 嘗試讀
.env裡的OPENAI_API_KEY和DEEPSEEK_API_KEY。 - 如果沒設定,預設就是空字串(方便之後用「mock 模式」測試)。
3. Providers(提供者適配器)
1 | const providers = { |
- 這裡定義了 兩個 AI 提供者的呼叫方式:
openai和deepseek。 - 特別設計:如果 key 沒設定 → 回傳一個 假回覆(mock),方便本地測試。
- 否則就真的去呼叫 API(用
fetchPOST 到對應的 API endpoint)。 - 回傳格式統一
{ text, raw },text是簡單結果,raw是完整 API 回覆。
4. 健康檢查 API
1 | app.get('/health', (req, res) => res.json({ status: 'ok', role: 'mcp-gateway' })); |
- 提供
/healthAPI,確認伺服器活著。 - 通常監控系統或 DevOps 會打這個來檢查服務是否正常。
5. 聊天 API
1 | app.post('/api/chat', async (req, res) => { |
這是主要的 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 | const port = process.env.PORT || 4000; |
- 從
.env讀取PORT,如果沒設定就用4000。 - 啟動 Express 伺服器,監聽這個 port。
- 啟動成功會在終端機輸出提示。
🚩 重點整理
模組
express→ Web 伺服器dotenv→ 讀取.env
環境變數管理
- API Key 都放在
.env,不寫死在程式裡。 - Key 留空時會回 mock 回覆,方便測試。
- API Key 都放在
API 路徑
GET /health→ 檢查服務狀態POST /api/chat→ 呼叫 AI(支援openai、deepseek)
設計重點
- Adapter Pattern(適配器模式):每個 provider 都是一個 adapter,以後要加新 provider(例如 Anthropic、Gemini)也很容易。
- 錯誤處理:有 try/catch,避免伺服器直接掛掉。
- Mock 機制:沒 API key 也能本地跑通,降低開發阻力。
要不要我幫你畫一個 請求流程圖(從前端發送 → gateway → provider → 回傳)?這樣你一看就能明白整個 Gateway 的作用。