X402 MCP Template
# X402 MCP Template ๐ค๐ฐ
**Production-ready MCP server template for consuming X402-protected APIs with gasless micropayments**
This template provides everything you need to create an MCP (Model Context Protocol) server that can consume X402-enabled APIs, enabling AI agents like Claude to make micropayment-based API calls seamlessly.
> ๐ค **For AI Developers**: See [CLAUDE.md](./CLAUDE.md) for comprehensive X402 + MCP integration documentation, payment flows, and AI development guidance.
## โจ Features
- **๐ X402 Gasless Micropayments** - EIP-712 signatures, no gas fees for API consumption
- **๐ญ Dual Mode Operation** - Demo mode (no wallet) and Payment mode (with wallet)
- **๐ Service Discovery** - Automatic discovery of X402 API capabilities
- **๐ค Claude Desktop Ready** - Drop-in integration with Claude Desktop
- **๐ก MCP Inspector Compatible** - Test and debug with MCP Inspector
- **๐ญ Production-Ready** - Mainnet (Base) and testnet (Base Sepolia) support
- **๐ Full TypeScript** - Type-safe development with comprehensive types
- **โก Auto-Payment Handling** - Automatic 402 retry with payment authorization
## ๐๏ธ Architecture
### MCP + X402 Integration Flow
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Claude Desktop / MCP Client โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ User Request: "Search for coffee shops near me" โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ MCP Protocol: CallTool("search_places", {query: "coffee"}) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ X402 MCP Server (This Template) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Tool Handler: Receives request โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ X402 Payment Client (x402-axios) โ โ
โ โ - EIP-712 signature generation โ โ
โ โ - Automatic 402 retry handling โ โ
โ โ - Payment authorization โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ X402-Protected API Server โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 1. First Request: Returns 402 Payment Required โ โ
โ โ - Includes payment requirements (price, network, address) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 2. Payment Processing: โ โ
โ โ - Verify EIP-712 signature โ โ
โ โ - Submit to facilitator โ โ
โ โ - Execute USDC transfer (gasless) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 3. Second Request: Payment authorized, returns data โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Result Returned to Claude โ
โ - API response data โ
โ - Payment metadata โ
โ - Cost information โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
**Key Points**:
- MCP handles tool protocol and Claude communication
- x402-axios handles payment protocol automatically
- User only needs wallet with USDC - no manual payment steps
- All payment complexity is abstracted away
## ๐ Project Structure
```
Template-x402-Mcp/
โโโ index.ts # Main MCP server implementation
โโโ package.json # Dependencies and scripts
โโโ tsconfig.json # TypeScript configuration
โโโ .env.example # Environment variables template
โโโ README.md # This file - setup and usage guide
โโโ CLAUDE.md # AI-friendly X402 + MCP documentation
```
## ๐ Quick Start
### 1. Clone and Setup
```bash
# Navigate to template directory
cd Template-x402-Mcp
# Install dependencies
npm install
# Copy environment variables
cp .env.example .env
```
### 2. Configure Environment
Edit `.env` file:
**Option A: Demo Mode (No Payment)**
```env
# Leave PRIVATE_KEY empty or with placeholder
PRIVATE_KEY=<your-private-key-here>
# Set your X402 API endpoint
RESOURCE_SERVER_URL=https://places-api.x402hub.xyz
# Network (testnet for demo)
NETWORK=base-sepolia
```
**Option B: Payment Mode (X402 Enabled)**
```env
# Add your wallet private key
PRIVATE_KEY=0x1234567890abcdef...
# Set your X402 API endpoint
RESOURCE_SERVER_URL=https://places-api.x402hub.xyz
# Network: base-sepolia (testnet) or base (mainnet)
NETWORK=base-sepolia
```
### 3. Customize Your Tools
**Edit `index.ts` to define your API-specific tools:**
```typescript
// In ListToolsRequestSchema handler
{
name: "your_custom_tool",
description: "Description of what your tool does",
inputSchema: {
type: "object",
properties: {
// Define your input parameters
param1: {
type: "string",
description: "Parameter description"
}
},
required: ["param1"]
}
}
```
**Add tool handler:**
```typescript
case "your_custom_tool": {
const { param1 } = args as { param1: string };
// Make X402-protected API call
const response = await client.post("/api/your-endpoint", {
param1: param1
});
return {
content: [{
type: "text",
text: JSON.stringify(response.data, null, 2)
}]
};
}
```
### 4. Build and Test
```bash
# Build TypeScript
npm run build
# Test with MCP Inspector
npm run inspector
# Or test in development mode
npm run dev
```
### 5. Claude Desktop Integration
**Add to Claude Desktop configuration:**
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"x402-your-api": {
"command": "node",
"args": ["/absolute/path/to/Template-x402-Mcp/build/index.js"],
"env": {
"PRIVATE_KEY": "0x...",
"RESOURCE_SERVER_URL": "https://your-x402-api.example.com",
"NETWORK": "base-sepolia"
}
}
}
}
```
**Restart Claude Desktop** and your tools will be available!
## ๐ Getting USDC for Testing
### Testnet (Base Sepolia)
```bash
# Use Circle's testnet faucet
# Visit: https://faucet.circle.com/
# Enter your wallet address
# Receive free testnet USDC
```
### Mainnet (Base)
Buy USDC on Base network through:
- [Coinbase](https://www.coinbase.com/)
- [Uniswap](https://app.uniswap.org/)
- [Base Bridge](https://bridge.base.org/)
## ๐ Available Tools
### Built-in Tools
| Tool | Description | Mode |
|------|-------------|------|
| `example_api_call` | Template tool for X402 API calls | Both |
| `service_info` | Get API service discovery metadata | Both |
| `health_check` | Check API availability | Both |
**Demo Mode**: Returns sample data with setup instructions
**Payment Mode**: Makes real X402-protected API calls
## ๐ญ Demo Mode vs Payment Mode
### Demo Mode (No Private Key)
**Features**:
- โ
Works immediately without wallet setup
- โ
Returns sample data for all tools
- โ
Shows setup instructions in responses
- โ
Perfect for development and testing MCP integration
- โ Cannot make real API calls
**Use Cases**:
- Testing MCP server functionality
- Developing tool definitions
- Claude Desktop integration testing
- Learning X402 protocol flow
### Payment Mode (With Private Key)
**Features**:
- โ
Makes real X402-protected API calls
- โ
Automatic payment handling (no manual steps)
- โ
Gasless USDC transfers
- โ
Production-ready
- โ ๏ธ Requires USDC balance in wallet
**Use Cases**:
- Production AI agent deployments
- Real data consumption
- Paid API access
- Enterprise integrations
## ๐ ๏ธ Customization Guide
### Adding a New Tool
**Step 1:** Add tool definition in `ListToolsRequestSchema` handler:
```typescript
{
name: "get_data_by_id",
description: "Fetch specific data by ID from X402 API",
inputSchema: {
type: "object",
properties: {
id: {
type: "string",
description: "Unique identifier for the data"
}
},
required: ["id"]
}
}
```
**Step 2:** Add tool handler in `CallToolRequestSchema` handler:
```typescript
case "get_data_by_id": {
const { id } = args as { id: string };
if (!id?.trim()) {
throw new McpError(ErrorCode.InvalidParams, "ID parameter is required");
}
// Demo mode fallback
if (!paymentEnabled) {
return {
content: [{
type: "text",
text: JSON.stringify({
demo_mode: true,
sample_data: { id, name: "Sample Data" },
setup_instructions: { /* ... */ }
}, null, 2)
}]
};
}
// Payment mode - real API call
const response = await client.get(`/api/data/${id}`);
return {
content: [{
type: "text",
text: JSON.stringify(response.data, null, 2)
}]
};
}
```
### Changing API Endpoint
```env
# In .env file
RESOURCE_SERVER_URL=https://your-new-api.example.com
```
### Switching Networks
```env
# Testnet (Base Sepolia)
NETWORK=base-sepolia
# Mainnet (Base)
NETWORK=base
```
## ๐ Service Discovery
Your MCP server automatically fetches X402 service metadata from `/.well-known/x402`:
```typescript
// Automatically called by service_info tool
const response = await axios.get(`${baseURL}/.well-known/x402`);
// Returns:
{
"service": "API Service Name",
"version": "1.0.0",
"payment": {
"protocol": "x402 v1.0",
"price": "$0.001",
"network": "base-sepolia"
},
"endpoints": {
"/api/endpoint": {
"method": "POST",
"description": "...",
"inputSchema": { /* ... */ },
"outputSchema": { /* ... */ }
}
}
}
```
Use this metadata to dynamically generate tools or provide API documentation to users.
## ๐ Security Best Practices
1. **Never commit `.env`** - Use `.env.example` as template
2. **Rotate private keys** - Change keys regularly for production
3. **Use separate wallets** - Different addresses for testnet/mainnet
4. **Monitor USDC balance** - Track spending and set alerts
5. **Validate API responses** - Check data integrity and structure
6. **Error handling** - Don't expose sensitive info in errors
7. **Rate limiting** - Implement client-side rate limits if needed
## ๐ Monitoring
### Check Wallet Balance
Monitor your USDC balance and payment transactions:
- **Testnet**: [Base Sepolia Explorer](https://sepolia.basescan.org/)
- **Mainnet**: [Base Explorer](https://basescan.org/)
### Server Logs
```bash
# Development mode with logs
npm run dev
# Check payment status
# Logs show: โ
Payment client initialized, wallet address, network
```
### MCP Inspector
```bash
# Test tools interactively
npm run inspector
# Check:
# - Tool definitions are correct
# - Payment mode is active
# - API responses are valid
```
## ๐งช Testing
### Test with MCP Inspector
```bash
# Start inspector
npm run inspector
# Test tools:
1. Select "service_info" - should return API metadata
2. Select "health_check" - should return API health status
3. Select your custom tools - should work in demo or payment mode
```
### Test with Claude Desktop
1. **Add to config** (see Claude Desktop Integration above)
2. **Restart Claude Desktop**
3. **Test in conversation**:
```
You: Can you check the service info for the X402 API?
Claude: [Uses service_info tool, shows API metadata]
You: Search for coffee shops near me
Claude: [Uses your custom tool, makes payment if enabled]
```
### Verify Payment Flow
**Demo Mode**:
- Tools return sample data
- Response includes setup instructions
- No USDC required
**Payment Mode**:
- First call triggers 402 response
- x402-axios automatically retries with payment
- USDC transferred (check explorer)
- Real data returned
## ๐ Troubleshooting
### "Running in DEMO MODE"
**Issue**: Private key not configured or invalid
**Solutions**:
1. Check `.env` file has valid `PRIVATE_KEY=0x...` (66 characters)
2. Ensure private key is not placeholder `<your-private-key-here>`
3. Verify key format: `0x` followed by 64 hex characters
### "Payment Required: Insufficient USDC balance"
**Issue**: Wallet doesn't have enough USDC
**Solutions**:
1. Get testnet USDC: https://faucet.circle.com/
2. For mainnet, buy USDC on Base network
3. Check balance in explorer (link above)
### "Tool execution failed"
**Issue**: API endpoint or configuration problem
**Solutions**:
1. Verify `RESOURCE_SERVER_URL` is correct and accessible
2. Check if API supports X402 protocol
3. Use `health_check` tool to test connectivity
4. Use `service_info` tool to verify API configuration
### MCP Server Not Appearing in Claude
**Issue**: Claude Desktop not detecting MCP server
**Solutions**:
1. Verify `build/index.js` exists: `npm run build`
2. Check Claude Desktop config has absolute path
3. Restart Claude Desktop completely
4. Check logs in Claude Desktop developer tools
## ๐ Resources
- [X402 Protocol Documentation](https://docs.cdp.coinbase.com/x402/docs/welcome)
- [MCP Protocol Specification](https://modelcontextprotocol.io/)
- [Base Network](https://base.org/)
- [Coinbase Developer Platform](https://portal.cdp.coinbase.com/)
- [EIP-712 Standard](https://eips.ethereum.org/EIPS/eip-712)
- [Circle USDC Faucet](https://faucet.circle.com/)
## ๐ License
MIT License - see LICENSE file for details
## ๐ค Contributing
This is a template - fork it and make it your own!
1. Clone the template
2. Customize for your X402 API
3. Deploy and share your MCP server
---
**Built with โค๏ธ using X402 Protocol + Model Context Protocol**
Replace this template with your own API integration and enable AI agents to consume your services! ๐
TDQS
Scored across 3 tools
The three tools have clearly distinct purposes: example_api_call is for making API calls, health_check is for service availability, and service_info is for retrieving service metadata. There is no overlap or ambiguity between these functions, making it easy for an agent to select the right tool for each task.
All tool names follow a consistent snake_case pattern with clear verb_noun structures: example_api_call, health_check, and service_info. This uniformity enhances readability and predictability, making the tool set easy to navigate and understand.
With only three tools, the set feels thin for a server labeled as an 'MCP Template' that might imply broader functionality. While the tools cover basic API interaction, health, and info needs, the count is borderline low for a template that could be expanded, suggesting it might be under-scoped for more complex use cases.
The tools provide foundational coverage for API calls, health checks, and service information, but there are notable gaps. For a template server, missing operations like authentication, error handling, or specific endpoint management could limit agent workflows, indicating an incomplete surface for robust API integration.