Skip to main content
Glama
tubone24

remote-mcp-oauth-github

by tubone24
README.md
# Cloudflare Workers MCP Server with OAuth

A Model Context Protocol (MCP) server for Claude.ai custom integrations, running on Cloudflare Workers with GitHub OAuth authentication.

## Demo(Slide)

<https://slide-tubone24.pages.dev/slides/authmcp/1>

## Features

- ✅ Claude.ai Custom Integration support
- ✅ Full compliance with MCP authentication specification
- ✅ OAuth 2.0 authorization flow (GitHub)
- ✅ Dynamic Client Registration (DCR) for OAuth clients
- ✅ OAuth 2.0 Protected Resource Metadata (RFC 9728)
- ✅ Session management with KV storage
- ✅ Permission-based access control
- ✅ MCP tools for user information, calculations, and GitHub repository access

## Architecture

```mermaid
graph TB
    subgraph "Claude.ai Platform"
        User[User]
        Claude[Claude.ai]
        MCP[MCP Client]
    end
    
    subgraph "Cloudflare Workers"
        Worker[MCP OAuth Server]
        KV[(KV Storage)]
        
        subgraph "OAuth Endpoints"
            Auth["/auth"]
            Token["/token"]
            Register["/register"]
            Callback["/callback"]
        end
        
        subgraph "Well-Known Endpoints"
            AuthMeta["/.well-known/oauth-authorization-server"]
            ResourceMeta["/.well-known/oauth-protected-resource"]
        end
        
        subgraph "MCP Endpoints"
            MCPHttp["/mcp"]
            SSE["/sse"]
        end
    end
    
    subgraph "External Services"
        GitHub[GitHub OAuth API]
        GitHubAPI[GitHub API]
    end
    
    User --> Claude
    Claude --> MCP
    MCP --> Worker
    
    Worker --> Auth
    Worker --> Token
    Worker --> Register
    Worker --> Callback
    Worker --> AuthMeta
    Worker --> ResourceMeta
    Worker --> MCPHttp
    Worker --> SSE
    
    Worker --> KV
    Worker --> GitHub
    Worker --> GitHubAPI
    
    Auth --> GitHub
    Callback --> GitHub
    GitHub --> Callback
```

### Authentication Flow Sequence

```mermaid
sequenceDiagram
    participant User
    participant Claude as Claude.ai
    participant MCP as MCP Client
    participant Worker as Cloudflare Worker
    participant KV as KV Storage
    participant GitHub as GitHub OAuth

    User->>Claude: Start conversation with integration
    Claude->>MCP: Initialize MCP connection
    MCP->>Worker: GET /.well-known/oauth-protected-resource
    Worker-->>MCP: Return resource metadata (RFC 9728)
    
    MCP->>Worker: POST /register (Dynamic Client Registration)
    Worker->>KV: Store client credentials
    Worker-->>MCP: Return client_id & client_secret
    
    Note over MCP: Generate PKCE code_verifier & code_challenge
    MCP->>User: Request authorization
    User->>Worker: GET /auth?client_id=...&redirect_uri=...&code_challenge=...&code_challenge_method=S256
    Worker->>KV: Store state, redirect_uri & code_challenge
    Worker->>User: Redirect to GitHub OAuth
    
    User->>GitHub: Authorize application
    GitHub->>Worker: GET /callback?code=...&state=...
    Worker->>KV: Verify state
    Worker->>GitHub: Exchange code for access token
    GitHub-->>Worker: Return access token
    Worker->>KV: Store session with auth context
    Worker->>KV: Store authorization code with PKCE data
    Worker->>User: Redirect with auth code
    
    MCP->>Worker: POST /token (Exchange auth code + code_verifier)
    Worker->>KV: Validate auth code & client
    Worker->>Worker: Verify PKCE: SHA256(code_verifier) == code_challenge
    Worker->>KV: Create MCP access token
    Worker-->>MCP: Return access token
    
    MCP->>Worker: POST /mcp (with Bearer token)
    Worker->>KV: Validate access token
    Worker->>KV: Get auth context
    Worker-->>MCP: Return MCP response
    
    MCP->>Claude: Provide tool results
    Claude->>User: Display results
```

## Setup

### 1. Prerequisites

- Cloudflare account
- GitHub account
- Node.js 18+
- Wrangler CLI

### 2. Setup Cloudflare Worker

Login to Cloudflare (if not already logged in)

```bash
npx wrangler auth login
```

Update the worker name in `wrangler.toml` if desired

```toml
name = "your-mcp-server-name"
```

### 3. Create GitHub OAuth App

1. Go to [GitHub Settings > Developer settings > OAuth Apps](https://github.com/settings/applications/new)
2. Create a new OAuth app:
   - **Application name**: `MCP Auth Demo`
   - **Homepage URL**: `https://your-worker.workers.dev`
   - **Authorization callback URL**: `https://your-worker.workers.dev/callback`
3. Save the Client ID and Client Secret

### 4. Create Cloudflare KV Namespace

```bash
npx wrangler kv namespace create "OAUTH_KV"
```

Update `wrangler.toml` with the generated ID:

```toml
[[kv_namespaces]]
binding = "OAUTH_KV"
id = "your-kv-namespace-id"
```

### 5. Configure Environment Variables

Set the following secrets using Wrangler CLI:

```bash
# Set GitHub OAuth credentials
wrangler secret put GITHUB_CLIENT_ID
wrangler secret put GITHUB_CLIENT_SECRET

# Set cookie encryption key (generate a random string)
wrangler secret put COOKIE_ENCRYPTION_KEY

# Optional: Restrict access to specific GitHub usernames (comma-separated)
wrangler secret put ALLOWED_USERNAMES
```

### 6. Deploy

```bash
# Install dependencies
npm install

# Deploy to Cloudflare Workers
npm run deploy
```

## Claude.ai Configuration

### Adding Custom Integration

1. Log into Claude.ai (Team/Enterprise plan required)
2. Go to Settings > Integrations
3. Click "Add Custom Integration"
4. Enter the following information:
   - **Name**: MCP Auth Demo
   - **MCP Server URL**: `https://your-worker.workers.dev/mcp`
   - **OAuth Authorization URL**: `https://your-worker.workers.dev/auth`
   - **OAuth Token URL**: `https://your-worker.workers.dev/token`
   - **Client Registration URL**: `https://your-worker.workers.dev/register`

### Usage

1. Start a new conversation in Claude
2. Enable the integration
3. When prompted, authenticate with GitHub
4. MCP tools become available

## Available Tools

### 1. `get_user_info`
Retrieves authenticated user information.

```
User: Show my user info
Claude: Using get_user_info tool...
```

### 2. `calculate`
Performs basic arithmetic calculations.

```
User: Calculate 7 to the power of 8
Claude: Using calculate tool...
```

### 3. `get_github_repos`
Lists user's GitHub repositories.

```
User: Show my GitHub repositories
Claude: Using get_github_repos tool...
```

## OAuth Endpoints

### Well-Known Endpoints

- `/.well-known/oauth-authorization-server` - OAuth 2.0 Authorization Server Metadata
- `/.well-known/oauth-protected-resource` - OAuth 2.0 Protected Resource Metadata (RFC 9728)

### OAuth Flow Endpoints

- `/auth` - Authorization endpoint
- `/callback` - OAuth callback endpoint
- `/token` - Token exchange endpoint
- `/register` - Dynamic client registration endpoint

### MCP Endpoints

- `/mcp` - HTTP POST endpoint for MCP requests
- `/sse` - Server-Sent Events endpoint for streaming

## Development

### Local Development

```bash
# Install dependencies
npm install

# Start development server
npm run dev

# Generate TypeScript types
npm run cf-typegen
```

### Testing & Quality Assurance

This project includes comprehensive testing and linting setup:

```bash
# Run tests
npm test

# Run tests in watch mode
npm run test:watch

# Run tests with coverage
npm run test:coverage

# Run linter
npm run lint

# Fix linting issues automatically
npm run lint:fix

# Format code
npm run format

# Check code formatting
npm run format:check

# Type check
npm run typecheck
```

### CI/CD

The project uses GitHub Actions for continuous integration and deployment:

- **CI Pipeline** (`.github/workflows/ci.yml`):
  - Runs on all branches and pull requests
  - Executes linting, type checking, and tests
  - Generates code coverage reports

- **Deployment Pipeline** (`.github/workflows/deploy.yml`):
  - Runs on pushes to the `main` branch
  - Runs all quality checks
  - Automatically deploys to Cloudflare Workers

To enable automatic deployment, add the following secrets to your GitHub repository:
- `CLOUDFLARE_API_TOKEN`: Your Cloudflare API token
- `CLOUDFLARE_ACCOUNT_ID`: Your Cloudflare account ID

### Manual Testing

You can test the MCP server using the Claude Code Inspector:

1. **Start the Inspector**:
   ```bash
   npx @modelcontextprotocol/inspector https://your-worker.workers.dev/mcp
   ```

2. **Test OAuth 2.0 Metadata Endpoints**:
   - Visit `https://your-worker.workers.dev/.well-known/oauth-authorization-server`
   - Visit `https://your-worker.workers.dev/.well-known/oauth-protected-resource`
   - Verify RFC 9728 compliance

3. **Test Dynamic Client Registration**:
   ```bash
   curl -X POST https://your-worker.workers.dev/register \
     -H "Content-Type: application/json" \
     -d '{
       "client_name": "Test MCP Client",
       "redirect_uris": ["urn:ietf:wg:oauth:2.0:oob"]
     }'
   ```

4. **Test OAuth Flow** (using Inspector):
   - The Inspector will automatically handle the OAuth flow
   - Follow the GitHub authentication prompts
   - Verify successful token exchange

5. **Test MCP Tools**:
   Once authenticated, test the available tools in the Inspector:
   - `get_user_info` - Retrieve authenticated user information
   - `calculate` - Perform arithmetic operations
   - `get_github_repos` - List GitHub repositories

6. **Verify Server Health**:
   ```bash
   curl https://your-worker.workers.dev/health
   ```

The Inspector provides a comprehensive interface for testing MCP servers with OAuth authentication, making it easy to verify all functionality works correctly.


## Resources

- [MCP Specification](https://modelcontextprotocol.io/)
- [OAuth 2.0 Protected Resource Metadata (RFC 9728)](https://datatracker.ietf.org/doc/html/rfc9728)
- [Claude.ai Integrations Documentation](https://support.anthropic.com/en/articles/11175166)
- [Cloudflare Workers Documentation](https://developers.cloudflare.com/workers/)

## License

MIT License