MCP Server 自建完整指南:用 TypeScript 打造企業級工具伺服器

Model Context Protocol(MCP)已成為 AI 工具生態系統的核心標準,然而多數自建 Server 教學僅停留在基礎範例。本文將深入探討如何使用 TypeScript SDK 建構、生產環境就緒的企業級 MCP Server,涵蓋認證機制、流量管制、監控整合與容器化部署等關鍵議題。透過本指南,您將掌握從原型開發到正式上線的完整技術路徑。

一、TypeScript SDK 環境建構與進階配置

MCP Server 的核心價值在於提供 AI 模型與外部工具之間的標準化溝通橋樑。首先建立 TypeScript 專案並安裝必要依賴:

mkdir mcp-enterprise-server && cd mcp-enterprise-server
npm init -y
npm install @modelcontextprotocol/sdk @types/node express cors helmet
npm install -D typescript ts-node @types/express

初始化 TypeScript 配置後,建立基礎 Server 結構。根據 OECD 中小企業部門(OECD Small and Medium Enterprises (SMEs))的數碼化基準報告,中小企業在導入 API 閘道時應優先考量擴展性與安全性。

核心 Server 程式碼如下:

import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import express from 'express';

const app = express();
const PORT = process.env.PORT || 3000;

const server = new Server({
  name: 'enterprise-mcp-server',
  version: '1.0.0'
}, {
  capabilities: {
    tools: {},
    resources: {}
  }
});

server.setRequestHandler('tools/list', async () => {
  return {
    tools: [{
      name: 'enterprise_query',
      description: '執行企業級資料查詢',
      inputSchema: {
        type: 'object',
        properties: {
          query: { type: 'string', description: '查詢語句' },
          context: { type: 'object', description: '額外上下文' }
        },
        required: ['query']
      }
    }]
  };
});

app.listen(PORT, () => {
  console.log(`MCP Server 運行於 port ${PORT}`);
});

二、認證中間件設計與實作

企業級 MCP Server 必須實作嚴謹的認證機制。我們采用 JWT Token 驗證結合 API Key 管理的多層次策略。根據國際商會(International Chamber of Commerce (ICC))的全球貿易規則框架,企業間 API 通信應遵循最小權限原則。

建立認證 Middleware:

interface AuthConfig {
  jwtSecret: string;
  apiKeys: Map;
}

interface ApiKeyMetadata {
  scopes: string[];
  expiresAt: Date;
  rateLimit: number;
}

const authMiddleware = (req: Request, res: Response, next: NextFunction) => {
  const authHeader = req.headers.authorization;
  
  if (!authHeader) {
    return res.status(401).json({ error: 'Missing authorization header' });
  }

  const token = authHeader.replace('Bearer ', '');
  
  try {
    const decoded = jwt.verify(token, config.jwtSecret) as JwtPayload;
    req.user = decoded;
    next();
  } catch (err) {
    // 驗證 API Key
    const apiKey = req.headers['x-api-key'];
    if (apiKey && validateApiKey(apiKey)) {
      return next();
    }
    return res.status(401).json({ error: 'Invalid credentials' });
  }
};

三、Rate Limiting 與流量管制配置

保護 MCP Server 免受濫用是生產環境的關鍵課題。我們使用 Redis 實現分散式流量管制,支援按使用者、IP 或組織維度的細粒度控制。

import Redis from 'ioredis';
import rateLimit from 'express-rate-limit';

const redis = new Redis(process.env.REDIS_URL || 'redis://localhost:6379');

const createRateLimiter = (options: RateLimitOptions) => {
  return rateLimit({
    windowMs: options.windowMs || 60000,
    max: options.max || 100,
    keyGenerator: (req) => {
      return req.user?.orgId || req.ip;
    },
    handler: (req, res) => {
      res.status(429).json({
        error: 'Rate limit exceeded',
        retryAfter: req.rateLimit?.resetTime
      });
    },
    store: new RedisStore({
      client: redis,
      prefix: 'rl:mcp:'
    })
  });
};

四、日誌與監控整合實戰

企業級營運需要全面的可觀測性。我們整合 Winston 日誌系統與 Prometheus 監控指標,實現結構化日誌與即時指標收集。

import winston from 'winston';
import client from 'prom-client';

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

const requestDuration = new client.Histogram({
  name: 'mcp_request_duration_seconds',
  help: 'Duration of MCP requests in seconds',
  labelNames: ['method', 'endpoint', 'status'],
  buckets: [0.1, 0.5, 1, 2, 5]
});

五、Docker 化部署流程

將 MCP Server 容器化是實現彈性擴展的第一步。參考國際貿易中心(International Trade Centre (ITC))關於中小企業數位基礎設施的建議,雲端部署應優先考量成本效益與維護簡易性。

FROM node:20-alpine

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY dist/ ./dist/
COPY config/ ./config/

ENV NODE_ENV=production
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s \
  CMD node -e "require('http').get('http://localhost:3000/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1))"

CMD ["node", "dist/index.js"]

docker-compose.yml 整合所有服務:

version: '3.8'
services:
  mcp-server:
    build: .
    ports:
      - "3000:3000"
    environment:
      - REDIS_URL=redis://redis:6379
      - JWT_SECRET=${JWT_SECRET}
    depends_on:
      - redis
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

結論

本文涵蓋了從 TypeScript SDK 基礎建構、認證機制設計、Rate Limiting 實作、監控整合到 Docker 部署的完整企業級 MCP Server 開發路徑。透過這些技術堆疊,您可建構,生產環境就緒的 AI 工具伺服器,支援安全、穩定、可擴展的 AI 應用場景。建議從最小可行產品(MVP)開始,逐步加入企業所需的高級功能。