用于具有外部API集成的ChatGPT应用程序的MCP服务器
MCP(模型上下文协议)服务器,用于将ChatGPT连接到外部API。允许您通过ChatGPT中的自然语言与API进行通信。
🚀 快速开始
1.安装
npm install2.API配置
cp .env.example .env编辑 .env:
最低配置要求:
API_BASE_URL=https://api.yourservice.com
API_KEY=your-api-key-here # Optional: for 'api-key' header
API_TIMEOUT=30000 # Optional: request timeout in ms
PORT=3000 # Optional: server port关于AUTH_TOKEN:
AUTH_TOKEN 是 可选的 并且取决于您的API身份验证方法:
选项1:静态承载令牌(如果您的API使用固定的令牌,但该令牌不会更改):
API_BASE_URL=https://api.yourservice.com
API_KEY=12345 # Static API key (for 'api-key' header)
AUTH_TOKEN=bearer-token-here # Static Bearer token (for 'authorization' header)选项2:动态令牌(如果令牌是在患者授权后生成的):
API_BASE_URL=https://api.yourservice.com
API_KEY=12345 # Static API key (for 'api-key' header)
# AUTH_TOKEN not needed - will be set dynamically after authorization然后使用 api_auth 自动授权患者和存储令牌的工具。动态生成的令牌将覆盖任何静态令牌 AUTH_TOKEN 从 .env.
测试示例(无需密钥):
API_BASE_URL=https://jsonplaceholder.typicode.com
API_KEY=3.构建和运行
npm run build
npm start服务器将于启动 http://localhost:3000
4.连接到ChatGPT
当地通过ngrok:
- 安装ngrok:https://ngrok.com/download
- Run-ngrok:
ngrok http 3000- 复制HTTPS URL(例如。,
https://abc123.ngrok.app) - 在ChatGPT应用程序/开发人员模式下,添加一个URL为的连接器:
https://abc123.ngrok.app/mcp
生产: 部署到HTTPS托管(Cloudflare Workers、Fly.io、Vercel等)
5.使用方法
连接后,只需在ChatGPT中写入:
如果您的API需要患者授权:
- 首次授权:“使用用户名授权患者john@example.com密码密码123“
- 然后使用API:“获取患者列表”、“创建预约”等。
如果您的API不需要授权:
- “获取用户列表”
- “创建一个名为John的新用户”
- “更新id为1的用户”
- “删除id为5的帖子”
📖 运作原理
建筑
ChatGPT → MCP Server → Your External API → Response → ChatGPT过程
- 您在ChatGPT中: “获取用户列表”
- ChatGPT 调用
api_get带参数的工具 - MCP服务器 向发出GET请求
https://api.yourservice.com/users - 您的API 返回数据
- MCP服务器 将结构化数据返回给ChatGPT
- ChatGPT 显示结果
MCP服务器做什么
- ✅ 自动添加
api-key标题与API_KEY值(如果提供) - ✅ 自动添加
Authorization: Bearer标题为:
- 静态 AUTH_TOKEN 从 .env (如有提供),或 - 动态令牌来自 api_auth 工具(如果进行了患者授权)
- ✅ 处理错误和超时
- ✅ 返回对ChatGPT的结构化响应
- ✅ 永远不要将您的API密钥传递给ChatGPT(留在服务器上)
🛠️ 可用工具
api_auth -授权患者
授权患者并自动存储用于所有后续API请求的身份验证令牌。
命令示例:
- “使用用户名授权患者john@example.com密码密码123“
- “使用凭据登录患者”
- “对患者进行身份验证”
参数:
{
"endpoint": "/auth/login",
"credentials": {
"username": "john@example.com",
"password": "secret123"
},
"tokenField": "token" // Optional: field name in response (default: "token" or "accessToken")
}它是如何工作的:
- 使用患者凭据向授权端点发送POST请求
- 从响应中提取令牌(尝试:
token,accessToken,access_token) - 将令牌存储在内存中
- 所有后续API请求将自动包括
Authorization: Bearer头球
注: 令牌存储在内存中,并持续到服务器重新启动。每次会话使用此工具一次。
api_get -获取数据
对外部API执行GET请求。
命令示例:
- “获取用户列表”
- “显示id为1的帖子”
- “查找帖子5的所有评论”
参数:
{
"endpoint": "/users",
"params": {
"page": 1,
"limit": 10
}
}api_post -创建数据
执行POST请求以创建资源。
命令示例:
- “使用电子邮件创建一个名为John的新用户john@example.com"
- “添加标题为“Hello”、文本为“World”的新帖子”
参数:
{
"endpoint": "/users",
"data": {
"name": "John Doe",
"email": "john@example.com"
}
}api_put -更新数据
执行PUT请求以更新资源。
命令示例:
- 更新id为1的用户,将名称更改为Jane
- 将任务5的状态更改为“已完成”
参数:
{
"endpoint": "/users/1",
"data": {
"name": "Jane Doe"
}
}api_delete -删除数据
执行DELETE请求以删除资源。
命令示例:
- “删除id为3的用户”
- “删除第10条帖子”
参数:
{
"endpoint": "/users/3"
}get_info -服务器信息
返回有关MCP服务器和API配置的信息。
🧪 测试
在本地检查服务器
# Check tools list
curl http://localhost:3000/mcp \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'测试工具调用
# Call api_get
curl http://localhost:3000/mcp \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "api_get",
"arguments": {
"endpoint": "/users"
}
},
"id": 1
}'在ChatGPT中进行测试
⚠️ 重要提示: 您需要先将服务器连接到ChatGPT!
- 启动服务器:
npm start - 启动ngrok:
ngrok http 3000 - 连接到ChatGPT(请参阅“连接到ChatGP”部分)
- 然后 您可以在聊天中编写命令
示例测试命令:
- “获取用户列表”
- “显示id为1的帖子”
- “创建新帖子”
📝 不同API的示例
JSON占位符(测试API)
API_BASE_URL=https://jsonplaceholder.typicode.com
API_KEY=命令:
- “获取所有用户”
- “显示id为1的帖子”
- “创建新帖子”
GitHub API
API_BASE_URL=https://api.github.com
API_KEY=ghp_your_github_token_here命令:
- “显示我的存储库”
- “获取有关存储库microsoft/vcode的信息”
您自己的API
API_BASE_URL=https://api.yourservice.com
API_KEY=your-api-key🔐 高级API配置
如果API使用与默认Bearer令牌不同的身份验证方法,则需要修改 server/src/api-client.ts.
1.自定义标头中的API密钥(例如,X-API-Key)
如果您的API需要自定义标头中的密钥:
// In api-client.ts, modify the constructor:
if (this.config.apiKey) {
this.config.headers["X-API-Key"] = this.config.apiKey; // Instead of Authorization
// Or remove the Authorization line if not needed
}2.查询参数中的API键
如果API需要密钥作为查询参数:
// Modify buildUrl method:
private buildUrl(endpoint: string, params?: Record): string {
const url = new URL(endpoint, this.config.baseUrl);
// Add API key as query parameter
if (this.config.apiKey) {
url.searchParams.append("api_key", this.config.apiKey);
}
if (params) {
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null) {
url.searchParams.append(key, String(value));
}
});
}
return url.toString();
}3.基本身份验证
如果您的API使用基本验证:
// In createApiClient function:
export function createApiClient(): ApiClient {
const baseUrl = process.env.API_BASE_URL || "https://api.example.com";
const username = process.env.API_USERNAME || "";
const password = process.env.API_PASSWORD || "";
const credentials = Buffer.from(`${username}:${password}`).toString("base64");
return new ApiClient({
baseUrl,
headers: {
"User-Agent": "MCP-Server/1.0.0",
Authorization: `Basic ${credentials}`,
},
timeout: parseInt(process.env.API_TIMEOUT || "30000", 10),
});
}然后在 .env:
API_BASE_URL=https://api.yourservice.com
API_USERNAME=your-username
API_PASSWORD=your-password4.自定义标题
如果您的API需要自定义标头:
// In createApiClient function:
export function createApiClient(): ApiClient {
const baseUrl = process.env.API_BASE_URL || "https://api.example.com";
const apiKey = process.env.API_KEY || "";
return new ApiClient({
baseUrl,
apiKey,
headers: {
"User-Agent": "MCP-Server/1.0.0",
"X-Custom-Header": process.env.CUSTOM_HEADER_VALUE || "",
Accept: "application/vnd.api+json", // Example
},
timeout: parseInt(process.env.API_TIMEOUT || "30000", 10),
});
}测试您的自定义配置
- 设置您的
.env文件 - 卷曲测试:
# Test GET request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.yourservice.com/endpoint
# Test POST request
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"key":"value"}' \
https://api.yourservice.com/endpoint- 如果curl正常工作,MCP服务器也应该正常工作(具有相同的标头)
其他配置问题
403禁止:
- 检查API密钥权限
- 验证API侧的CORS设置
- 检查是否需要IP白名单
需要帮助?
- 查看API文档以了解身份验证要求
- 修改
api-client.ts以满足API的要求 - 首先使用curl进行测试,然后在代码中实现
🔧 项目结构
mcp/
├── server/
│ └── src/
│ ├── index.ts # Main MCP server
│ └── api-client.ts # API client
├── .env # Your API settings (not in git)
├── .env.example # Configuration template
├── package.json
└── README.md🐛 故障排除
错误:“找不到模块”
npm install错误:“API错误:401未经授权”
- 检查
API_KEY在.env(如果需要,用于“api密钥”标头) - 如果使用静态令牌:检查
AUTH_TOKEN在.env(用于“授权”标题) - 如果使用动态令牌:请确保您已调用
api_auth首先授权患者的工具 - 确保令牌未过期
- 验证令牌格式是否正确
错误:“请求超时”
- 增加
API_TIMEOUT在.env - 检查API的可用性
服务器无法启动
- 检查端口3000是否未被占用
- 改变
PORT在.env
ChatGPT无法连接
- 确保使用HTTPS(ngrok或生产)
- 检查一下
/mcp端点可访问 - 检查CORS设置
ChatGPT不调用工具
- 检查服务器是否正在运行
- 检查ngrok连接
- 确保ChatGPT中的URL以结尾
/mcp
TypeScript错误
- 确保使用Node.js 18+(内置fetch)
🔒 安全
- ✅ API密钥仅存储在服务器上(位于
.env) - ✅
.env文件已在.gitignore - ✅ API密钥从不传递给ChatGPT
- ⚠️ 对于生产,使用安全的秘密存储方法
📚 附加信息
- 官方文件: https://developers.openai.com/apps-sdk/build/mcp-server
- MCP协议: https://modelcontextprotocol.io
🎯 后续步骤
- 在中配置API
.env - 在本地启动服务器
- 通过ngrok连接到ChatGPT
- 使用不同命令进行测试
- 部署到生产环境以供永久使用
______________________________________________________________________
准备好了! 现在您可以通过ChatGPT与您的API进行通信! 🚀
