Weather MCP Server with GitHub OAuth & Location Management

Weather MCP Server with GitHub OAuth & Location Management

Enables users to check weather conditions using Open-Meteo's free API with GitHub OAuth authentication and personalized location management. Users can save custom location labels (like 'home' or 'office') and query weather using these convenient shortcuts.

Category
访问服务器

README

Weather MCP Server with GitHub OAuth & Location Management

This project demonstrates an advanced Model Context Protocol (MCP) server with GitHub OAuth authentication, personalized location management, and weather data retrieval using Open-Meteo's free API.

Features

  • 🔐 GitHub OAuth 2.0 Authentication: Secure authentication using GitHub Apps
  • 📍 Personal Location Management: Save and manage custom location labels (e.g., "home", "office")
  • 🌤️ Smart Weather Queries: Check weather using saved labels or direct location names
  • 💾 SQLite Database: Persistent storage for users and their locations
  • 🆓 Free Weather API: Uses Open-Meteo API - no API key required!
  • 🔄 Streamable HTTP Transport: Modern HTTP transport with MCP SDK
  • 🛠️ Multiple Tools: Weather lookup, location management (add, list, delete), user info
  • 👤 User Profiles: Automatic user creation from GitHub profile data with profile retrieval

Prerequisites

  • Node.js (v18 or higher recommended)
  • GitHub Account
  • GitHub OAuth App (instructions below)
  • OpenAI API Key (optional, for the client example)

Setup

1. Install dependencies:

npm install

2. Create GitHub OAuth App:

  1. Go to GitHub Developer Settings
  2. Click "New OAuth App"
  3. Fill in the application details:
    • Application name: Weather MCP Server (or your preferred name)
    • Homepage URL: http://localhost:3000
    • Authorization callback URL: http://localhost:3000/oauth/callback
  4. Click "Register application"
  5. Copy your Client ID
  6. Click "Generate a new client secret" and copy it

3. Configure Environment Variables:

cp .env.example .env

Edit .env and add your GitHub OAuth credentials:

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

4. Start the MCP server:

node server.js

The server will start on http://127.0.0.1:3000

5. Authenticate with GitHub:

  1. Open your browser and visit: http://localhost:3000/oauth/login
  2. Click "Authorize" to connect with GitHub
  3. Copy the access token displayed on the success page
  4. Use this token in the Authorization header: Bearer <your-token>

6. Configure Claude Desktop

Add the configuration to your Claude Desktop config file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

Option A: Automatic OAuth (Recommended)

{
  "mcpServers": {
    "weather-server": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "http://127.0.0.1:3000/mcp"
      ]
    }
  }
}

Claude Desktop will automatically discover the OAuth endpoints and open your browser for authentication. Just authorize with GitHub when prompted!

Option B: Manual Token

{
  "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"
      ]
    }
  }
}

First get your token by visiting http://localhost:3000/oauth/login, then replace YOUR_GITHUB_ACCESS_TOKEN with your token.

Usage Examples

Once connected via Claude Desktop, you can:

Basic Weather Queries

  • "What is the weather like in San Francisco?"
  • "Tell me the current weather in Tokyo"
  • "How's the weather in Paris?"

Save Personal Locations

  • "Save my home location as New York"
  • "Add my office location as San Francisco"
  • "Save the gym location as 123 Main Street, Boston"

Query Using Saved Labels

  • "What's the weather at home?"
  • "How's the weather at the office?"
  • "Check the weather at the gym"

Manage Locations

  • "List all my saved locations"
  • "Show my locations"
  • "Delete my home location"

User Profile

  • "Who am I?"
  • "Show my profile"
  • "What's my GitHub username?"

How It Works

  1. OAuth Flow: User authenticates via GitHub OAuth 2.0
  2. Token Exchange: Server exchanges authorization code for access token
  3. User Creation: Server creates or updates user profile from GitHub data
  4. Authentication: Client sends Bearer token in Authorization header
  5. Token Validation: Server validates token against SQLite database
  6. Session Creation: Server creates authenticated session with user context
  7. Tool Discovery: Client discovers available MCP tools from server
  8. Tool Execution:
    • Weather queries resolve location labels to actual addresses
    • Location management stores data per-user in database
    • All operations are scoped to the authenticated user
  9. Weather Data: Server fetches real-time weather from Open-Meteo API
  10. Response: Results returned to client with user-specific context

Architecture

      User Browser
           │
           │ 1. Visit /oauth/login
           ▼
    GitHub OAuth Server
           │
           │ 2. Authorization
           ▼
      /oauth/callback
           │
           │ 3. Access Token
           ▼
┌─────────────────────────────────────────────┐
│        Claude Desktop / MCP Client          │
│  (with Authorization: Bearer token)         │
└─────────────────┬───────────────────────────┘
                  │ Streamable HTTP + Auth
                  ▼
┌─────────────────────────────────────────────┐
│           server.js (MCP Server)            │
│  ┌───────────────────────────────────────┐  │
│  │  OAuth Authentication (auth.js)       │  │
│  │           ↓                           │  │
│  │  Token Validation Middleware          │  │
│  │           ↓                           │  │
│  │  Session Management (per-user)        │  │
│  │           ↓                           │  │
│  │  MCP Tools:                           │  │
│  │  - get_current_weather                │  │
│  │  - add_location                       │  │
│  │  - list_locations                     │  │
│  │  - delete_location                    │  │
│  └───────────────────────────────────────┘  │
│                 ↓                           │
│  ┌───────────────────────────────────────┐  │
│  │     SQLite Database (weather.db)      │  │
│  │  - users (with GitHub data)           │  │
│  │  - locations                          │  │
│  └───────────────────────────────────────┘  │
└─────────────────┬───────────────────────────┘
                  │
                  ▼
         Open-Meteo Weather API

MCP Tools

1. get_current_weather

Fetches real-time weather data for any location or saved label.

  • Parameters:
    • location (string): Location name or saved label (e.g., "New York", "home")
    • unit (enum): Temperature unit - "celsius" or "fahrenheit" (default: celsius)
  • Returns: Temperature, condition, humidity, wind speed, pressure, cloud cover
  • Special: Automatically resolves saved location labels to addresses

2. add_location

Save a location with a custom label for quick access.

  • Parameters:
    • label (string): Custom label (e.g., "home", "office", "gym")
    • location (string): Actual location name or address
  • Returns: Confirmation message
  • Note: Replaces existing label if it already exists

3. list_locations

Display all saved locations for the authenticated user.

  • Parameters: None
  • Returns: List of all saved locations with their labels

4. delete_location

Remove a saved location by its label.

  • Parameters:
    • label (string): Label of the location to delete
  • Returns: Confirmation or error message

5. get_user_info

Get information about the currently logged-in user.

  • Parameters: None
  • Returns: User profile with GitHub username, name, email, avatar URL, and user ID

Project Structure

komunite-bootcamp-mcp/
├── server.js              # MCP HTTP server with OAuth
├── database.js            # SQLite database operations
├── auth.js                # GitHub OAuth authentication
├── index.js               # OpenAI function calling example (legacy)
├── .env.example           # Environment variables template
├── .env                   # Your environment variables (create this)
├── package.json           # Dependencies and scripts
├── weather.db             # SQLite database (created on first run)
└── README.md             # This file

Database Schema

Users Table

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
)

Locations Table

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)
)

Security Features

  • GitHub OAuth 2.0: Industry-standard OAuth authentication flow
  • PKCE (RFC 7636): Proof Key for Code Exchange with S256 for public clients
  • Dynamic Client Registration (RFC 7591): Automatic client registration
  • State Parameter: CSRF protection with state verification
  • Bearer Token Authentication: All MCP endpoints require valid authentication
  • Token Validation: Access tokens validated against database
  • User Isolation: Each user can only access their own locations
  • Session Management: Secure session handling with user context
  • Database Constraints: Foreign key constraints ensure data integrity
  • Automatic Token Expiration: Token expiry tracking for enhanced security

Customization

Adding Custom MCP Tools

  1. Open server.js
  2. Register a new tool after existing tools:
sessionServer.tool(
  'your_tool_name',
  'Tool description',
  {
    param1: z.string().describe('Parameter description'),
  },
  async ({ param1 }) => {
    const userId = sessionUsers[transport.sessionId]?.id;
    // Your tool logic here
    return {
      content: [{ type: 'text', text: 'Result' }],
    };
  }
);
  1. The tool will automatically be discovered by clients

API Endpoints

OAuth Discovery Endpoints (RFC 8414 & RFC 9728)

  • GET /.well-known/oauth-authorization-server - OAuth 2.0 Authorization Server Metadata
  • GET /.well-known/oauth-protected-resource - OAuth 2.0 Protected Resource Metadata

OAuth Endpoints (Standards-Compliant)

  • POST /oauth/register - Dynamic Client Registration (RFC 7591)
  • GET /oauth/authorize - OAuth 2.0 Authorization Endpoint
  • POST /oauth/token - OAuth 2.0 Token Endpoint
  • POST /oauth/revoke - OAuth 2.0 Token Revocation (RFC 7009)
  • GET /oauth/login - Manual OAuth flow (browser-based)
  • GET /oauth/callback - OAuth callback handler
  • GET /oauth/me - Returns current user info (requires authentication)

MCP Endpoints

  • POST /mcp - Main MCP endpoint for tool calls
  • GET /mcp - Server-Sent Events for notifications
  • DELETE /mcp - Session termination

Utility Endpoints

  • GET /health - Health check endpoint

Notes

  • Based on the Model Context Protocol (MCP) specification
  • Uses @modelcontextprotocol/sdk for MCP server implementation
  • Streamable HTTP transport: Modern HTTP transport with session management
  • SQLite Database: Lightweight, file-based database with better-sqlite3
  • GitHub OAuth 2.0: Secure authentication via GitHub Apps
  • Uses Open-Meteo API - free and open-source weather API
  • No API key required for weather data!
  • Per-user location management with database isolation
  • Automatic label resolution for convenient weather queries
  • User profiles automatically created from GitHub data

Logout / Revoke Access

To logout from OAuth when using Claude Desktop:

Option 1: Clear mcp-remote Cache

rm -rf ~/.cache/mcp-remote/auth/

Option 2: Manual Token Revocation

curl -X POST http://localhost:3000/oauth/revoke \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "token=YOUR_ACCESS_TOKEN"

Then clear the cache and restart Claude Desktop.

Troubleshooting

Token Expired

If you get authentication errors, your GitHub token may have expired:

  1. Visit http://localhost:3000/oauth/login again
  2. Get a new access token
  3. Update your Claude Desktop configuration with the new token

Testing with cURL

You can test the API directly with cURL:

# Check OAuth server metadata:
curl http://localhost:3000/.well-known/oauth-authorization-server

# Check protected resource metadata:
curl http://localhost:3000/.well-known/oauth-protected-resource

# Get your access token first by visiting:
open http://localhost:3000/oauth/login

# Then test the authenticated endpoint:
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  http://localhost:3000/oauth/me

References

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选