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)開始,逐步加入企業所需的高級功能。