本项目演示了一个高级的模型上下文协议(MCP)服务器,该服务器使用 GitHub OAuth 认证,个性化的位置管理,并通过 Open-Meteo 的免费 API 获取天气数据。
npm install
http://localhost:3000http://localhost:3000/oauth/callbackcp .env.example .env
编辑 .env 并添加您的 GitHub OAuth 凭据:
GITHUB_CLIENT_ID=your_github_client_id_here
GITHUB_CLIENT_SECRET=your_github_client_secret_here
GITHUB_REDIRECT_URI=http://localhost:3000/oauth/callback
PORT=3000
node server.js
服务器将在 http://127.0.0.1:3000 上启动
http://localhost:3000/oauth/loginBearer <your-token>在您的 Claude Desktop 配置文件中添加配置:
macOS:~/Library/Application Support/Claude/claude_desktop_config.json
Windows:%APPDATA%\Claude\claude_desktop_config.json
选项 A:自动 OAuth(推荐)
{
"mcpServers": {
"weather-server": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://127.0.0.1:3000/mcp"
]
}
}
}
Claude Desktop 将自动发现 OAuth 端点并打开浏览器进行身份验证。只需在提示时授权 GitHub!
选项 B:手动令牌
{
"mcpServers": {
"weather-server": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://127.0.0.1:3000/mcp",
"--header",
"Authorization: Bearer YOUR_GITHUB_ACCESS_TOKEN",
"--no-auth"
]
}
}
}
首先通过访问 http://localhost:3000/oauth/login 获取您的令牌,然后将 YOUR_GITHUB_ACCESS_TOKEN 替换为您自己的令牌。
一旦通过 Claude Desktop 连接,您可以:
用户浏览器
│
│ 1. 访问 /oauth/login
▼
GitHub OAuth 服务器
│
│ 2. 授权
▼
/oauth/callback
│
│ 3. 访问令牌
▼
┌─────────────────────────────────────────────┐
│ Claude Desktop / MCP 客户端 │
│ (带 Authorization: Bearer 令牌) │
└─────────────────┬───────────────────────────┘
│ 流式 HTTP + 身份验证
▼
┌─────────────────────────────────────────────┐
│ server.js (MCP 服务器) │
│ ┌───────────────────────────────────────┐ │
│ │ OAuth 身份验证 (auth.js) │ │
│ │ ↓ │ │
│ │ 令牌验证中间件 │ │
│ │ ↓ │ │
│ │ 会话管理(每个用户) │ │
│ │ ↓ │ │
│ │ MCP 工具: │ │
│ │ - get_current_weather │ │
│ │ - add_location │ │
│ │ - list_locations │ │
│ │ - delete_location │ |
│ └───────────────────────────────────────┘ │
│ ↓ │
│ ┌───────────────────────────────────────┐ │
│ │ SQLite 数据库 (weather.db) │ │
│ │ - 用户(含 GitHub 数据) │ │
│ │ - 位置 │ │
│ └───────────────────────────────────────┘ │
└─────────────────┬───────────────────────────┘
│
▼
Open-Meteo 天气 API
get_current_weather获取任何位置或已保存标签的实时天气数据。
location (字符串):位置名称或已保存标签(例如,“纽约”,“家”)unit (枚举):温度单位 - "摄氏度" 或 "华氏度"(默认:摄氏度)add_location保存一个具有自定义标签的位置以便快速访问。
label (字符串):自定义标签(例如,“家”,“办公室”,“健身房”)location (字符串):实际位置名称或地址list_locations显示经过身份验证的用户的所有已保存位置。
delete_location通过标签删除已保存的位置。
label (字符串):要删除的位置标签get_user_info获取当前登录用户的信息。
komunite-bootcamp-mcp/
├── server.js # 带 OAuth 的 MCP HTTP 服务器
├── database.js # SQLite 数据库操作
├── auth.js # GitHub OAuth 身份验证
├── index.js # OpenAI 函数调用示例(遗留)
├── .env.example # 环境变量模板
├── .env # 您的环境变量(创建这个文件)
├── package.json # 依赖项和脚本
├── weather.db # SQLite 数据库(首次运行时创建)
└── README.md # 本文档
CREATE TABLE users (
id TEXT PRIMARY KEY,
github_id TEXT UNIQUE,
github_username TEXT,
github_email TEXT,
name TEXT,
avatar_url TEXT,
access_token TEXT,
refresh_token TEXT,
token_expires_at DATETIME,
auth_token TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
CREATE TABLE locations (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
label TEXT NOT NULL,
location_name TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE(user_id, label)
)
server.jssessionServer.tool(
'your_tool_name',
'工具描述',
{
param1: z.string().describe('参数描述'),
},
async ({ param1 }) => {
const userId = sessionUsers[transport.sessionId]?.id;
// 您的工具逻辑在这里
return {
content: [{ type: 'text', text: '结果' }],
};
}
);
当使用 Claude Desktop 登出 OAuth 时:
rm -rf ~/.cache/mcp-remote/auth/
curl -X POST http://localhost:3000/oauth/revoke \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "token=YOUR_ACCESS_TOKEN"
然后清除缓存并重新启动 Claude Desktop。
如果您遇到身份验证错误,您的 GitHub 令牌可能已过期:
http://localhost:3000/oauth/login您可以直接使用 cURL 测试 API:
# 检查 OAuth 服务器元数据:
curl http://localhost:3000/.well-known/oauth-authorization-server
# 检查受保护资源元数据:
curl http://localhost:3000/.well-known/oauth-protected-resource
# 首先通过访问获取您的访问令牌:
open http://localhost:3000/oauth/login
# 然后测试经过身份验证的端点:
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
http://localhost:3000/oauth/me