使用说明
MCP报价服务器🖖
一个全面的模型上下文协议(MCP)服务器,通过资源和工具提供《星际迷航》报价。该服务器使用现代MCP SDK v1.13.2构建,演示了如何为AI助手创建和部署MCP资源。
该项目的特点是 共享库架构 这消除了跨多个服务器实现的代码重复,同时保持了一致的功能和行为。
该代码主要由Claude 4/Cursor创建。
🏗️ 建筑
共享库(lib/)
该项目使用具有共享库的模块化架构来消除代码重复:
- 📋
lib/quote-functions.js-核心业务逻辑功能- 字符搜索、随机选择、文本格式化
- 数据验证和统计
- 🔧
lib/mcp-resources.js-MCP协议定义- 标准资源和工具注册
- 服务器元数据生成
- 🌐
lib/rest-api-helpers.js-REST API响应处理程序- 所有HTTP操作的端点逻辑
- 一致的错误处理
- 🧪
lib/test-helpers.js-测试工具- 共享测试数据和验证功能
- 常见的测试模式和断言
益处
- 🎯 单一真相来源 -核心逻辑定义一次,随处使用
- 🐛 集中式错误修复 -修复一次,修复所有实现
- ⚡ 更快的发展 -同时在所有服务器上添加新功能
- 🧪 更容易测试 -共享实用程序减少了测试重复
- 📏 一致性行为 -所有实现都使用相同的逻辑
🚀 特性
MCP服务器(stdio传输)
资源(3个可用)
- 📚 所有报价 (
quotes://all)-完整的JSON报价集合 - 🎲 随机报价 (
quotes://random)-JSON格式的单随机引用 - 📝 文本格式 (
quotes://text)-所有引号格式为可读文本
工具(2个可用)
- 🔍 按角色获取报价 -按《星际迷航》角色名称搜索引文
- 🎯 随机报价工具 -生成文本格式的随机报价
MCP服务器(HTTP传输)
MCP端点
- 🌐 POST/mcp -MCP客户端请求和初始化
- 📡 GET/mcp -MCP服务器到客户端通知(SSE)
- 🔚 删除/mcp -MCP会话终止
- 💚 GET/健康 -健康检查和会话信息
- 📋 得到/ -API信息
通过HTTP实现相同的MCP功能
- 📚 资源:通过HTTP MCP协议可访问相同的3个资源
- 🛠️ 工具:相同的2个工具可通过HTTP MCP协议调用
- 🔒 会话管理:有状态的会话,并进行适当的清理
- ⚡ 实时:通过SSE发送服务器到客户端的通知
Cloudflare Workers(全球HTTP MCP)
全球边缘网络
- ⚡ 30ms以下响应时间 来自全球300多个地点
- ♾️ 无限扩展 具有自动负载平衡功能
- 🌍 99.9%正常运行时间 具有内置冗余
DRY实施
- 📦 导入quotes.json -数据的单一真实来源
- 🔧 重用共享函数 -所有实用功能来自
lib/quote-functions.js - ⚡ 优化捆绑包 -9.18 KiB(与DRY重构前的531 KiB相比)
- 🧹 干净的代码库 -没有重复的逻辑或硬编码数据
相同的MCP协议和功能
- 📚 资源:全球可用的所有3个MCP资源
- 🛠️ 工具:两种MCP工具都具有边缘性能
- 🌐 CORS就绪:为web应用程序预配置
- 📊 生产监控:内置健康检查
REST API服务器(HTTP端点)
可用端点
- 🌐 得到/ -API信息和可用端点
- 📚 GET/报价 -所有引号均为JSON
- 🎲 GET/报价/随机 -JSON格式的随机引用
- 📝 GET/引号/文本 -所有引号均为格式化文本
- 🔍 GET/引号/字符/:名称 -按字符搜索引号
- 👥 GET/个字符 -列出所有可用字符
- 🔎 获取/搜索?q=术语 -按内容或字符搜索引文
- 💚 GET/健康 -服务器健康检查
本地代理服务器(API密钥桥)
将MCP客户端连接到远程服务器
- 🔑 API关键问题解决者 -Cursor等MCP客户端不支持API密钥
- 🌍 远程服务器访问 -将本地客户端连接到全球Cloudflare部署
- 🔄 透明代理 -通过自动身份验证转发所有MCP请求
- 📊 请求监控 -实时记录所有代理请求和响应
- ⚡ 零客户端更改 -现有MCP客户端无需修改即可工作
数据特征
- 8个经典的《星际迷航》语录,来自心爱的角色
- 不区分大小写的字符搜索
- 部分名称匹配支持
- 全面的错误处理
发展特征
- 📦 模块化架构 -共享库消除了400多行重复代码
- 🔄 干燥原理 -不要在所有实现中重复自己
- 🧪 综合测试 -涵盖所有功能的79项测试
- 🛠️ 易于维护 -核心功能的单点变更
- 📖 证据充分的 -清晰的API文档和代码示例
📋 先决条件
- Node.js(版本16或更高)
- npm(附带Node.js)
- MCP兼容客户端(游标或克劳德码)
⚡ Cursor用户快速入门
要将Cursor连接到生产MCP服务器吗? 使用代理服务器:
# 1. Set up API key (one-time)
cp .env.example .env
# Edit .env: QUOTES_MCP_API_KEY=your_actual_api_key
# 2. Start proxy (keep running while using Cursor)
npm run start:proxy
# 3. Test it works
curl -X POST "http://localhost:3001" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
# 4. Configure Cursor to use the proxy (see MCP Client Configuration section)
结果:Cursor现在访问全球生产级MCP服务器,而不知道API密钥! 🎉
🛠️ 安装
1.克隆或下载
# If using git
git clone <repository-url>
cd mcp-quotes-server
# Or download and extract the files to a directory
2.安装依赖项
npm install
3.设置环境变量(用于测试)
为了运行测试和访问Cloudflare部署,您需要配置API密钥:
# Copy the example environment file
cp .env.example .env
# Edit .env and replace YOUR_API_KEY with a valid API key
# The file should contain:
# QUOTES_MCP_API_KEY=your_actual_api_key_here
重要提示:
- 这
.env文件由测试脚本使用(test-mcp-server.js,quick-test.sh) - 只有当你想测试 Cloudflare Workers部署
- 本地MCP服务器(
npm start,npm run start:mcp-http)做 不 需要API密钥 - 这
.env文件将使用自动加载dotenv包裹 - 联系管理员以获取Cloudflare部署的有效API密钥
4.验证安装
# Test the server
npm test
# Start the server (for testing)
npm start
⚙️ MCP客户端配置
🎯 光标IDE
选项1:本地MCP服务器(建议用于开发)
-
打开光标设置
- 按
Cmd/Ctrl + ,打开设置 - 搜索“MCP”或导航到扩展→ MCP
- 按
-
添加MCP服务器配置 将此配置添加到光标MCP设置中:
{ "mcpServers": { "quotes-server": { "command": "npm", "args": ["start"], "cwd": "/YOUR_PATH/mcp-1", "env": {} } } } -
重新启动游标
- 重新启动Cursor IDE以加载MCP服务器
- 报价服务器将在您的AI聊天中可用
选项2:通过代理远程服务器(建议用于生产环境)
🎯 非常适合将Cursor连接到远程Cloudflare部署!
为什么要使用代理? Cursor(和大多数MCP客户端)不知道API密钥 此实现需要,但远程Cloudflare服务器需要API密钥身份验证。代理通过自动向所有请求添加API密钥来解决此问题。
-
设置环境 (一次性设置):
# Copy and configure API key cp .env.example .env # Edit .env and add your API key: # QUOTES_MCP_API_KEY=your_actual_api_key # REMOTE_MCP_URL=YOUR_MCP_SERVER_URL -
启动代理服务器 (继续运行):
npm run start:proxy代理运行在
http://localhost:3001并转发到远程服务器。 -
测试连接 手动:
# With proxy running, test that it works (no API key needed) curl -X POST "http://localhost:3001" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"tools/list","id":1}' -
配置您的MCP客户端 要连接到代理:
- 适用于支持HTTP的MCP客户端:指向
http://localhost:3001 - 仅适用于Cursor等stdio客户端:在转发到代理的不同端口上使用本地HTTP MCP服务器(需要自定义配置)
备注:HTTP代理的MCP客户端配置因客户端而异。代理提供了一个标准的HTTP JSON-RPC端点,任何支持HTTP的MCP客户端都可以使用。
- 适用于支持HTTP的MCP客户端:指向
-
重新启动游标
- 现在Cursor连接到全球Cloudflare部署 透明地
- ✅ Cursor中不需要API密钥管理
- ✅ 全球响应时间低于30ms
- ✅ 始终与最新部署保持同步
- ✅ 生产级可靠性和可扩展性
🤖 克劳德代码
-
安装Claude代码命令行界面
- 按照以下步骤安装“claude代码” 说明.
-
配置MCP服务器
- 在中创建MCP服务器配置
.mcp.json文件:
{ "mcpServers": { "quotes-server": { "type": "stdio", "command": "node", "args": ["/YOUR-PATH/mcp-1/server.js"], "env": {} } } } - 在中创建MCP服务器配置
重要:更新 args 路径以匹配您的实际安装目录。
您还可以在命令行上配置claude,例如,像这样制作一个远程 使用MCP代理的MCP服务器可用。代理和远程MCP服务器都必须 跑。
claude mcp add quotes --transport http http://localhost:3001
- 运行克劳德
- 使用命令行启动claude代码
claude。您可以检查MCP服务器 命令可用性/mcp'. Use the server by asking for example:给我引述一下皮卡德的话。
- 使用命令行启动claude代码
🌟 Gemini CLI
-
安装Gemini CLI
- 按照以下步骤安装“gemini cli” 说明.
-
配置MCP服务器
- 在中创建MCP服务器配置
.gemini/settings.json文件:
{ "mcpServers": { "quotes-server-stdio": { "type": "stdio", "command": "node", "args": ["/YOUR-PATH/mcp-1/server.js"], "env": {} }, "quotes-server-http": { "type": "http", "command": "node", "args": ["/YOUR-PATH/mcp-1/mcp-server-http.js"], "env": { "PORT": "3001" } }, "quotes-server-http-proxy": { "type": "http", "url": "http://localhost:3001", "description": "Local HTTP proxy for a remote MCP server" }, "quotes-server-cloudflare": { "type": "http", "url": "https://quotes-mcp-worker.klaushofrichter.workers.dev", "description": "Cloudflare Workers deployment with global edge distribution" } } } - 在中创建MCP服务器配置
重要:更新 args 与实际安装目录匹配的路径。
- 运行Gemini CLI
- 使用命令行启动gemini
gemini。您可以检查MCP服务器 命令可用性/mcp.使用服务器,例如:give me a quote by picard.
- 使用命令行启动gemini
📖 API文档
资源
1.所有报价(quotes://all)
以JSON格式返回完整的引号集合。
响应格式:
[
{
"quote": "Live long and prosper.",
"by": "Spock"
},
{
"quote": "Beam me up, Scotty.",
"by": "Captain James T. Kirk"
}
]
2.随机报价(quotes://random)
返回一个JSON格式的随机引号。
响应格式:
{
"quote": "Make it so.",
"by": "Captain Jean-Luc Picard"
}
3.文本格式(quotes://text)
返回所有格式为可读文本的引号。
响应格式:
1. "Live long and prosper." - Spock
2. "Beam me up, Scotty." - Captain James T. Kirk
3. "Resistance is futile." - The Borg
4. "Make it so." - Captain Jean-Luc Picard
5. "I have been, and always shall be, your friend." - Spock
6. "Logic is the beginning of wisdom, not the end." - Spock
7. "It was … fun." - Captain James T. Kirk
8. "I don't believe in the no-win scenario." - Captain James T. Kirk
工具
1.按角色获取报价
搜索特定《星际迷航》角色的语录。
参数:
character(string):要搜索的字符名称
特征:
- 不区分大小写的搜索
- 部分名称匹配
- 返回所有匹配的引号
示例:
Input: "Spock" → Returns all 3 Spock quotes
Input: "spock" → Same result (case-insensitive)
Input: "Captain" → Returns quotes from both Kirk and Picard
Input: "Worf" → Returns "No quotes found" message
2.随机报价工具
生成文本格式的随机引用。
参数: 无
响应格式:
"Live long and prosper." - Spock
🎯 服务器类型以及何时使用
该项目提供 五种不同的服务器实现 对于不同的用例:
1.MCP服务器(stdio)- npm start
最适合:本地AI助手,如Claude、Cursor和其他桌面MCP客户端
- ✅ 本地MCP协议:完全符合MCP规范
- ✅ 自动发现:自动发现的资源和工具
- ✅ 就地安置:非常适合桌面AI助手
- ❌ 仅限本地:无法远程访问
2.MCP服务器(HTTP)- npm run start:mcp-http
最适合:远程MCP客户端、基于web的MCP集成、本地开发
- ✅ 完整的MCP协议:完全符合MCP 2024-11-05规范
- ✅ 远程访问:HTTP传输允许基于网络的MCP客户端
- ✅ 会话管理:具有自动清理功能的基于UUID的会话
- ✅ 实时:通过服务器发送事件(SSE)发送服务器到客户端的通知
- ✅ 安全:DNS重新绑定保护和主机验证
- ✅ 有状态的:跨多个请求维护会话状态
- ✅ 生产就绪:优雅的关机和错误处理
- ❌ 单服务器:在一台机器上运行
3.Cloudflare Workers(HTTP MCP)- npm run worker:deploy
最适合:生产部署、全球规模、web应用程序、高可用性
- ✅ 全球边缘网络:全球300多个地点
- ✅ 超快的:全球响应时间低于30ms
- ✅ 自动缩放:处理无限并发用户
- ✅ 完整的MCP协议:完整的HTTP MCP传输支持
- ✅ 99.9%正常运行时间:内置冗余和故障切换
- ✅ 成本效益高:免费等级+按使用付费扩展
- ✅ 零基础设施:没有要管理的服务器
- ✅ DRY实施:通过共享功能优化捆绑包大小
4.REST API服务器(HTTP)- npm run start:http
最适合:Web应用程序、移动应用程序、通用API访问、非MCP客户端
- ✅ 标准REST:熟悉的HTTP端点
- ✅ 无MCP客户端:适用于任何HTTP客户端
- ✅ 简单集成:易于与现有系统集成
- ❌ 无自动发现:手动端点管理
- ❌ 无MCP功能:缺少MCP特定功能
5.本地代理服务器- npm run start:proxy
最适合:将MCP客户端(如Cursor)连接到需要API密钥的远程服务器
- ✅ 解决API关键问题:MCP客户端不知道API密钥,代理自动处理身份验证
- ✅ 将游标连接到远程服务器:非常适合从Cursor访问全球Cloudflare部署
- ✅ 透明代理:将所有请求原封不动地转发到远程MCP服务器
- ✅ 无客户端修改:现有MCP客户端无需更改即可工作
- ✅ 完整的MCP协议:完全传递所有MCP功能
- ✅ 请求日志记录:显示所有代理请求和响应时间
- ❌ 需要远程服务器:需要Cloudflare部署可用
- ❌ 仅限本地:代理本身在端口3001上本地运行
🔗 本地代理服务器深度学习
本地代理服务器(proxy-server.js)解决了一个关键问题: Cursor等MCP客户不了解API密钥,但生产MCP服务器(如我们的Cloudflare部署)需要身份验证。
🎯 目的和好处
🔑 解决API关键问题
- MCP客户端限制:游标和大多数MCP客户端仅支持简单的stdio/HTTP协议
- 远程服务器要求:生产服务器需要API密钥身份验证以确保安全
- 代理解决方案:充当桥接器,将API密钥自动添加到客户端请求中
🌐 将本地客户端连接到远程服务器
- 无客户端更改:现有MCP客户端无需修改即可工作
- 自动身份验证:代理从注入API密钥
.env文件透明 - 全局访问:从任何MCP客户端连接到生产Cloudflare部署
- 完全协议支持:完全传递所有MCP功能
📈 关键用例
- 🎯 光标集成:将Cursor连接到全球Cloudflare MCP服务器
- 🔧 开发与测试:根据生产部署测试MCP客户端
- 🌍 远程访问:使用本地开发环境中的生产服务器
- 📚 学习与教育:了解MCP协议,无需身份验证复杂性
🚀 快速开始
1.配置环境
确保您的 .env 文件包含API密钥:
# Required for proxy to authenticate with remote server
QUOTES_MCP_API_KEY=your-actual-api-key
# Optional proxy configuration (defaults shown)
PROXY_PORT=3001
REMOTE_MCP_URL=https://quotes-mcp-server.YOUR-SUBDOMAIN.workers.dev
2.启动代理服务器
npm run start:proxy
预期产量:
🚀 MCP Proxy Server Started
================================
📍 Local URL: http://localhost:3001
🌐 Remote URL: https://quotes-mcp-server.YOUR-SUBDOMAIN.workers.dev
🔑 API Key: ✅ Configured
================================
3.测试代理
# Run proxy tests (requires proxy to be running)
./test-proxy.sh
# Or test manually without API key:
curl -X POST "http://localhost:3001" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
🔧 配置选项
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
PROXY_PORT |
3001 |
代理服务器的本地端口 |
REMOTE_MCP_URL |
https://quotes-mcp-server.YOUR-SUBDOMAIN.workers.dev |
远程MCP服务器URL |
QUOTES_MCP_API_KEY |
远程身份验证所需的 | API密钥 |
端点
| 方法 | 终点 | 目的 |
|---|---|---|
| 全部 | /* |
将所有请求代理到远程MCP服务器 |
| 得到 | /proxy/health |
代理服务器运行状况和配置 |
📊 请求流
Local Client → Proxy Server → Remote MCP Server
↑ ↓ ↓
└─── Response ←─┴── + API Key ←──┘
- 客户端请求:客户端向发送MCP请求
http://localhost:3001(没有API密钥) - 代理处理:代理添加
X-API-Key标题来自.env文件 - 远程转发:请求已转发到远程Cloudflare MCP服务器
- 响应返回:远程响应原封不动地返回给客户端
🛠️ 示例用法
MCP协议请求
# Initialize MCP session (no API key required)
curl -X POST "http://localhost:3001" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {"roots": {}, "sampling": {}},
"clientInfo": {"name": "local-client", "version": "1.0.0"}
},
"id": 1
}'
# Get random quote (no API key required)
curl -X POST "http://localhost:3001" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "random-quote-tool",
"arguments": {}
},
"id": 2
}'
健康检查
curl "http://localhost:3001/proxy/health"
预期响应:
{
"status": "healthy",
"proxy": {
"port": 3001,
"remote_url": "https://quotes-mcp-server.YOUR-SUBDOMAIN.workers.dev",
"api_key_configured": true,
"uptime": 120.5
}
}
🔍 监控和记录
代理服务器提供所有请求的实时日志记录:
📨 POST / - Proxying to remote MCP server
📤 200 OK - 45ms
📨 POST / - Proxying to remote MCP server
📤 200 OK - 32ms
🚨 错误处理
| 错误条件 | 响应 | 解决方案 |
|---|---|---|
| 缺少API密钥 | 500,出现JSON-RPC错误 | 添加 QUOTES_MCP_API_KEY 向 .env |
| 远程服务器关闭 | 500,代理错误 | 检查远程服务器状态 |
| 从远程转发的API密钥 | 401无效 | 验证中的API密钥 .env |
| 网络超时 | 500,出现获取错误 | 检查互联网连接 |
🌐 MCP HTTP服务器深度学习
MCP HTTP服务器(mcp-server-http.js)通过HTTP传输提供完整的模型上下文协议功能,使远程MCP客户端能够通过标准HTTP请求进行连接。
🚀 服务器功能
传输层
- 可流式HTTP传输:用途
@modelcontextprotocol/sdk流式HTTP服务器传输 - 双向通信:支持客户端到服务器和服务器到客户端的消息传递
- 基于会话:每个客户端都会获得一个唯一的会话ID,用于有状态通信
- JSON-RPC 2.0:完全符合JSON-RPC规范
安全性和可靠性
- DNS重新绑定保护:防止恶意跨源请求
- 主机验证:仅允许来自以下位置的连接
127.0.0.1和localhost - 会话清理:自动清理过期或终止的会话
- 优雅地关闭:在服务器终止时正确关闭所有会话
- 错误处理:具有正确HTTP状态代码的全面错误响应
端点概述
| 方法 | 终点 | 目的 | 描述 |
|---|---|---|---|
| 职位 | /mcp |
MCP请求 | 客户端到服务器的MCP消息(初始化、资源、工具) |
| 得到 | /mcp |
SSE通知 | 通过服务器发送事件发送服务器到客户端的通知 |
| 删除 | /mcp |
会话终止 | 清理会话关闭和资源清理 |
| 得到 | /health |
健康检查 | 服务器状态和会话信息 |
| 得到 | / |
API信息 | 服务器详细信息和可用终结点 |
🔧 会话管理
会话生命周期
- 初始化:客户端发送
initialize方法toPOST /mcp - 会话创建:服务器生成UUID并在标头中返回会话ID
- 沟通:客户端在后续请求中包含会话ID
- 通知:服务器可以通过以下方式发送通知
GET /mcp上海证券交易所 - 终止:会话已通过关闭
DELETE /mcp或服务器关闭
会话标头
# Client requests must include:
mcp-session-id: 550e8400-e29b-41d4-a716-446655440000
# Server responses include:
mcp-session-id: 550e8400-e29b-41d4-a716-446655440000
📊 MCP资源和工具
HTTP服务器公开了与stdio版本相同的MCP资源和工具:
可用资源
quotes://all-完整报价集合(JSON)quotes://random-单随机引用(JSON)quotes://text-所有引号格式为文本
可用工具
get-quote-by-character-按字符名称搜索引号random-quote-tool-以文本格式生成随机报价
🔍 监测和可观察性
健康端点响应
{
"status": "healthy",
"timestamp": "2024-01-01T12:00:00.000Z",
"quotesLoaded": 8,
"activeSessions": 2,
"transport": "mcp-http"
}
服务器信息
{
"name": "Star Trek Quotes MCP Server",
"version": "1.0.0",
"transport": "mcp-streamable-http",
"totalQuotes": 8,
"activeSessions": 2,
"endpoints": {
"POST /mcp": "MCP client requests and initialization",
"GET /mcp": "MCP server-to-client notifications (SSE)",
"DELETE /mcp": "MCP session termination"
}
}
☁️ Cloudflare员工部署
MCP报价服务器可以部署到 Cloudflare员工 用于全球边缘分布,提供超快的响应时间和无限的可扩展性。
🌟 特性
全球边缘分布
- 30毫秒以下延迟 来自全球300多个边缘位置
- 自动缩放 处理任何交通量
- 99.9%正常运行时间 具有内置冗余
- 零冷启动 为了获得一致的性能
DRY架构优势
- 📦 单一数据源:进口自
quotes.json而不是硬编码数据 - 🔧 共享功能:使用来自的所有实用程序
lib/quote-functions.js - ⚡ 优化捆绑包:9.18 KiB(比DRY重构前小98%)
- 🧹 清洁代码:无重复逻辑,易于维护
生产就绪
- 完全支持MCP协议 通过HTTP传输
- CORS已启用 用于跨来源请求
- 全面的错误处理 监测
- 安全标头 并请求验证
成本效益高
- 免费套餐可用 (100000次请求/天)
- 按次付费 超越免费等级
- 无基础设施管理 必需的
🚀 快速部署
先决条件
- Cloudflare帐户 (免费)
- 牧马人CLI 安装
分3步部署
# 1. Install dependencies
npm install
# 2. Deploy to Cloudflare Workers
npx wrangler deploy
# 3. Validate deployment
npm run test:cloudflare
🎉 您的MCP服务器现已在全球范围内上线!
示例部署URL: https://quotes-mcp-server.YOUR-SUBDOMAIN.workers.dev
🔐 API密钥验证
Cloudflare Workers部署现在包括API密钥安全保护:
- 必填标题:所有请求必须包括
X-API-Key头球 - 有效的API密钥:安全地存储在Cloudflare KV存储中
- 请与管理员联系以获取有效的API密钥
- 密钥通过以下方式动态管理
wrangler kv命令
- 错误响应:
- 缺少API密钥:HTTP 401,错误代码为-32001
- API密钥无效:HTTP 401,错误代码为-32002
看 api-config.md 有关设置说明。
备注:测试脚本自动从加载API密钥 .env 文件。请参阅 环境变量设置 详细说明部分。
📊 性能指标
我们的生产部署实现了:
| 度量 | 性能 |
|---|---|
| 响应时间 | 平均25ms |
| 边缘延迟 | 全球<30ms |
| 可用性 | 99.9%以上的正常运行时间 |
| 并发用户 | 无限制 |
| 全球位置 | 300+边缘城市 |
| 捆绑尺寸 | 9.18 KiB(优化) |
🔧 配置
Workers部署包括:
MCP端点
POST / - MCP protocol requests
CORS支持
为web应用程序预配置:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type
🎯 使用示例
直接HTTP API访问
# MCP protocol request (requires API key)
curl -X POST https://quotes-mcp-server.YOUR-SUBDOMAIN.workers.dev \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05"},"id":1}'
🧪 测试
该项目包括全面的测试套件 79个测试用例 所有服务器实现的总计,围绕 共享库架构测试验证了共享库及其在不同服务器类型之间的集成。
共享库对测试的好处
- 🔄 一致性行为 -所有实现都使用相同的共享函数
- 🧪 减少测试重复 -在共享库中测试一次核心逻辑
- ⚡ 更快的测试运行 -共享测试工具加速测试开发
- 🎯 重点测试 -测试验证集成,而不是重复业务逻辑
- 🐛 集中验证 -共享库中的错误修复在任何地方都会自动测试
运行测试
# Run ALL server implementations (79 total tests)
npm test
# Run all tests comprehensively
npm run test:all
# Run specific test suites by implementation
npm run test:core # Local server implementations (64 tests)
npm run test:mcp # MCP stdio server only (20 tests)
npm run test:http # REST API server only (17 tests)
npm run test:mcp-http # MCP HTTP server only (27 tests)
npm run test:cloudflare # Cloudflare integration tests (15 tests) - requires .env
npm run test:cloudflare-quick # Quick validation script (5 tests) - requires .env
# Development testing
npm run test:watch # Run core tests in watch mode
npm run test:coverage # Run core tests with coverage reporting
测试覆盖率
核心服务器测试(64次测试)
- ✅ MCP服务器测试 (20次测试)-stdio传输功能
- ✅ HTTP REST API测试 (17项测试)-所有端点和操作
- ✅ MCP HTTP服务器测试 (27个测试)-带会话的HTTP传输
Cloudflare Worker测试(15项测试)
- ✅ MCP协议合规性 (5个测试)-初始化、工具、资源
- ✅ 工具功能 (4个测试)-字符搜索和随机引用
- ✅ 资源访问 (3个测试)-所有资源端点
- ✅ 错误处理 (3个测试)-方法、工具无效,JSON格式错误
测试结果总结
📊 Total Test Results:
✅ Core Tests: 64/64 passed (100%)
✅ Cloudflare Tests: 15/15 passed (100%)
📈 Overall Success Rate: 79/79 (100%)
🗂️ 源代码结构
📦 共享库架构(lib/)
该项目遵循 模块化共享库架构 这消除了代码重复,并确保了所有服务器实现的一致行为。
lib/quote-functions.js -核心业务逻辑
// Core quote operations used by all servers
export function searchQuotesByCharacter(quotesData, character) // Character search with fuzzy matching
export function getRandomQuote(quotesData) // Random quote selection
export function formatQuoteAsText(quote) // Single quote formatting
export function formatQuotesAsText(quotesData) // Multi-quote numbered formatting
export function getAvailableCharacters(quotesData) // Unique character extraction
export function searchQuotes(quotesData, query) // General search functionality
export function validateQuoteData(quotesData) // Data structure validation
export function getQuoteStats(quotesData) // Collection statistics
lib/mcp-resources.js -MCP协议定义
// MCP resource and tool registration for all MCP servers
export function registerMcpResources(server, quotesData, serverType) // Standard MCP resources
export function registerMcpTools(server, quotesData, serverType) // Standard MCP tools
export function getMcpServerMetadata(name, transport, quotesData, extras) // Server metadata
lib/rest-api-helpers.js -REST API响应处理程序
// HTTP endpoint handlers used by REST API
export function getApiInfo(quotesData, serverInfo) // API information responses
export function getHealthCheck(quotesData, serverInfo) // Health check responses
export function handleGetAllQuotes(quotesData) // GET /quotes logic
export function handleGetRandomQuote(quotesData) // GET /quotes/random logic
export function handleGetQuotesByCharacter(quotesData, char) // GET /quotes/character/:name logic
export function handleGetCharacters(quotesData) // GET /characters logic
export function handleSearchQuotes(quotesData, query) // GET /search logic
export function handle404NotFound() // Standard 404 responses
export function handleError(message, error) // Error response formatting
lib/test-helpers.js -测试工具
// Shared testing functions and data used across all test files
export const mockQuotesData // Consistent test data
export function createTestHandlers(testQuotesData) // Test handler factories
export function validateQuoteStructure(quote) // Quote validation
export function validateExpectedCharacters(characters) // Character validation
export const characterSearchTests // Common test cases
export function validateResponseHeaders(response) // Header validation
export function validateCORSHeaders(response) // CORS validation
export function validateDataIntegrity(data) // Data integrity checks
🚀 服务器实现
现在,每个服务器实现都是 薄包装纸 围绕共享库,为相同的核心功能提供不同的传输机制。
server.js -MCP服务器(标准传输)
// Minimal MCP server for local client integration (Cursor IDE, Claude Code)
import { registerMcpResources, registerMcpTools } from './lib/mcp-resources.js';
const server = new McpServer({ name: 'quotes-server', version: '1.0.0' });
registerMcpResources(server, quotesData, 'Stdio'); // 3 MCP resources
registerMcpTools(server, quotesData, 'Stdio'); // 2 MCP tools
// Uses: StdioServerTransport for process communication
// Purpose: Local development, IDE integration
// Started with: npm start
mcp-server-http.js -MCP服务器(HTTP传输)
// HTTP-based MCP server with session management
import { registerMcpResources, registerMcpTools, getMcpServerMetadata } from './lib/mcp-resources.js';
function createMcpServer() {
const server = new McpServer({ name: 'quotes-server-http', version: '1.0.0' });
registerMcpResources(server, quotesData, 'HTTP'); // Same 3 MCP resources
registerMcpTools(server, quotesData, 'HTTP'); // Same 2 MCP tools
return server;
}
// Uses: StreamableHTTPServerTransport + Express.js
// Features: Session management, SSE notifications, CORS
// Purpose: Remote MCP clients, web integration
// Started with: npm run start:mcp-http
http-server.js -REST API服务器
// Traditional REST API using shared response handlers
import {
getApiInfo, getHealthCheck, handleGetAllQuotes, handleGetRandomQuote,
handleGetQuotesByCharacter, handleGetCharacters, handleSearchQuotes,
handle404NotFound, handleError
} from './lib/rest-api-helpers.js';
// All endpoints are simple wrappers:
app.get('/quotes', (req, res) => {
const result = handleGetAllQuotes(quotesData);
res.json(result);
});
// Uses: Express.js framework
// Purpose: REST API consumers, web applications
// Started with: npm run start:http
worker.js -Cloudflare Workers MCP(DRY实施)
// Global edge MCP server using DRY principles
import quotesData from './quotes.json'; // Single source of truth
import {
getRandomQuote, formatQuoteAsText, formatQuotesAsText,
searchQuotesByCharacter, getAvailableCharacters
} from './lib/quote-functions.js';
// Lightweight HTTP handler using shared functions
export default {
async fetch(request, env, ctx) {
// Direct MCP protocol implementation
// Uses shared functions for all quote operations
// No duplicated data or logic
}
}
// Uses: Cloudflare Workers Request/Response API
// Features: Global edge distribution, auto-scaling, DRY architecture
// Bundle size: 9.18 KiB (optimized)
// Started with: npx wrangler deploy
📁 数据流
📁 quotes.json (Single Source of Truth)
↓
📦 lib/quote-functions.js (Core Logic)
↓
┌─── 📦 lib/mcp-resources.js ←── MCP Servers (stdio, HTTP)
│ 📦 lib/rest-api-helpers.js ←── REST API Server
└─── 🌐 worker.js ←── Cloudflare Workers (Direct Import)
🎯 这种架构的好处
🔄 干燥原则(不要重复自己)
- 单一真相来源 适用于所有业务逻辑
- 集中式错误修复 -一次修复,处处修复
- Cloudflare Workers优化 -捆绑包尺寸减少98%
📏 一致性行为
- 相同的逻辑 跨所有服务器实现
- 相同的响应格式 无论运输方式如何
- 保证兼容性 不同服务器类型之间
⚡ 开发效率
- 功能开发速度提高4倍 -添加一次,随处可用
- 减少认知负荷 -理解模式一次,适用于任何地方
- 更容易入职 -明确的关注点分离
🧪 简化测试
- 共享测试工具 减少测试代码重复
- 核心逻辑测试一次 在共享库中
- 集成测试 仅验证特定于运输的功能
🛠️ 易于维护
- 集中维护 -更新共享库,所有服务器受益
- 明确依赖关系 -易于理解什么影响什么
- 模块化更新 -改变一个方面而不影响其他方面
📁 完整的文件结构
mcp-quotes-server/
├── 📦 lib/ # Shared Libraries (Eliminates 400+ lines of duplication)
│ ├── quote-functions.js # 🎯 Core: search, format, validate (8 functions)
│ ├── mcp-resources.js # 🔧 MCP: resources, tools, metadata (3 functions)
│ ├── rest-api-helpers.js # 🌐 REST: endpoint handlers (9 functions)
│ └── test-helpers.js # 🧪 Test: shared utilities (10+ functions)
│
├── 🚀 Server Implementations # Thin wrappers around shared libraries
│ ├── server.js # 📡 MCP Stdio (44 lines)
│ ├── mcp-server-http.js # 🌐 MCP HTTP (244 lines)
│ ├── http-server.js # 📋 REST API (187 lines)
│ └── worker.js # ☁️ Workers MCP DRY (269 lines, 9.18 KiB)
│
├── 📊 Data & Configuration
│ ├── quotes.json # 📚 Single source of truth (8 quotes)
│ ├── package.json # 📦 Dependencies & scripts
│ ├── package-lock.json # 🔒 Locked dependency versions
│ └── wrangler.toml # ☁️ Cloudflare Workers config
│
├── 🧪 Testing Suite (79 Tests Total)
│ ├── server.test.js # 📡 MCP Stdio tests (20 tests)
│ ├── http-server.test.js # 📋 REST API tests (17 tests)
│ ├── mcp-server-http.test.js # 🌐 MCP HTTP tests (27 tests)
│ ├── test-mcp-server.js # ☁️ Workers integration tests (15 tests)
│ ├── quick-test.sh # ⚡ Fast validation script (5 tests)
│ └── manual-tests.md # 📖 Manual testing guide
│
└── 📖 Documentation
├── README.md # 📚 Complete documentation
├── CODE-DEDUPLICATION-SUMMARY.md # 📊 Architecture benefits
├── WORKER-DEPLOYMENT.md # ☁️ Deployment guide
└── TESTING.md # 🧪 Testing guide
该架构展示了 企业级软件工程实践 具有明确的关注点分离、全面的测试和针对现代边缘计算优化的可维护代码组织。
🔧 发展
项目脚本
# Server startup
npm start # Start the MCP server (stdio transport)
npm run start:mcp-http # Start the MCP server (HTTP transport)
npm run start:http # Start the REST API server (HTTP)
# Testing
npm test # Run all server implementations (79 tests)
npm run test:all # Run all tests comprehensively
npm run test:core # Run local implementations (64 tests)
npm run test:cloudflare # Run Cloudflare integration tests (15 tests)
npm run test:cloudflare-quick # Quick validation (5 tests)
# Development testing
npm run test:watch # Run core tests in watch mode
npm run test:coverage # Run core tests with coverage
# Cloudflare Workers
npx wrangler deploy # Deploy to Cloudflare Workers
npm run worker:dev # Run Workers locally with Wrangler
添加新报价
- 编辑
quotes.json - 添加新的引号对象
quote和by属性 - 运行测试以确保一切正常:
npm test - 如果使用Cloudflare Workers,请重新部署:
npx wrangler deploy
依赖项
- @模型上下文协议/sdk:^1.13.2-现代MCP SDK
- 表达:^4.18.2-用于REST API的Web框架
- 跨域资源共享:^2.8.5-跨来源资源共享
- 动物圈:^3.23.8-模式验证
开发依赖关系
- 玩笑:^29.7.0-测试框架
- 超级试验:^6.3.4-HTTP测试库
- 牧马人:^4.22.0-Cloudflare Workers CLI
🐛 故障排除
服务器无法启动
-
检查Node.js版本:确保你有Node.js 16+
node --version -
重新安装依赖项:
rm -rf node_modules package-lock.json npm install -
检查文件权限:
chmod +x server.js
MCP客户端无法连接
-
验证配置路径:确保
cwdMCP客户端配置中的路径与实际安装目录匹配。 -
检查服务器启动:手动测试服务器:
cd /path/to/your/mcp-quotes-server npm start -
重新启动MCP客户端:重新加载VS代码(用于Claude代码)或重新启动Cursor。
Cloudflare员工问题
-
部署失败:
# Check Wrangler authentication npx wrangler auth # Verify wrangler.toml configuration cat wrangler.toml # Deploy with verbose output npx wrangler deploy --verbose -
测试部署:
# Run integration tests npm run test:cloudflare # Quick validation npm run test:cloudflare-quick
常见问题
| 问题 | 解决方案 |
|---|---|
| “找不到模块” | 运行 npm install |
| “权限被拒绝” | 检查文件权限 |
| “端口已在使用中” | 终止现有进程 |
| “找不到配置” | 验证MCP客户端配置文件路径 |
| “Worker部署失败” | 检查牧马人身份验证 |
🤝 贡献
- 分叉存储库
- 创建要素分支
- 进行更改
- 运行测试:
npm test - 提交拉取请求
📄 许可证
该项目根据MIT许可证获得许可。
🖖 关于
本项目演示了如何:
- 创建MCP服务器 使用官方SDK进行stdio和HTTP传输
- 实施MCP资源和工具 具有适当的模式验证和错误处理
- 处理多种运输类型 (stdio、可流式HTTP、REST API、Workers)
- 构建全面的测试套件 在所有实现中总共进行了79次测试
- 配置MCP客户端 适用于本地和远程环境
- 管理会话和状态 在具有UUID跟踪的基于HTTP的MCP服务器中
- 实施安全功能 如DNS重新绑定保护和主机验证
- 提供可观察性 通过健康检查和监控端点
- 应用干燥原则 跨实现实现实现可维护、高效的代码
- 针对边缘计算进行优化 部署Cloudflare Workers
非常适合:
- 🎓 学习MCP开发 提供实用的、可投入生产的示例
- 🏗️ 企业MCP服务器基础 有多种运输选择
- 🔧 了解MCP协议 通过工作实施和全面测试
- 🌐 构建远程MCP集成 使用HTTP传输和会话管理
- 📊 测试策略 用于单元测试和与真实服务器进程的集成测试
- 🛡️ 安全模式 适用于网络可访问的MCP服务器
- ⚡ 性能优化 通过DRY架构和边缘部署
长命百岁,繁荣昌盛! 🖖
