x402-mcp
Supports payments on the Solana blockchain via the x402 payment protocol, enabling creation of payment-protected endpoints and payment requests using SOL or USDC on Solana.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@x402-mcpCreate a protected endpoint at /weather with price $0.001"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
x402-mcp
A TypeScript MCP (Model Context Protocol) Server with Express.js integration for the x402 Payment Protocol.
Overview
This is a hybrid MCP server that combines:
MCP Server: Provides tools to interact with the x402 payment protocol through the Model Context Protocol
Express HTTP Server: Creates payment-protected HTTP endpoints using x402 payment middleware
This allows AI assistants and MCP clients to both manage x402 payments AND dynamically create HTTP endpoints protected by cryptocurrency payments. Built with TypeScript, the official MCP SDK, and x402-express middleware.
Related MCP server: gatepay-local-mcp
Features
🔧 MCP Tools for Payment Management
x402_create_payment_request: Create a new payment request with specified price and details
x402_check_payment_status: Check the status of an existing payment request
x402_get_config: Get the current x402 configuration (payment address, network, facilitator URL)
x402_list_networks: List available networks for x402 payments
🌐 MCP Tools for Express Endpoint Management
x402_create_protected_endpoint: Dynamically create HTTP endpoints protected by x402 payment middleware
x402_list_protected_endpoints: List all protected endpoints on the Express server
x402_get_express_server_status: Get Express server status (running state, port, endpoint count)
x402_update_endpoint_price: Update the price for an existing protected endpoint
⚙️ Configuration
Payment Address:
0x243E0B615BfEa0f315109b8b415e3D6b9c3131F7Network: Base Sepolia (testnet) - change to "base" for mainnet
Payment Token: USDC (stablecoin)
Facilitator URL:
https://x402.org/facilitator(testnet)Express Port:
4021
Installation
npm installDevelopment
Run the server in development mode with hot reload:
npm run devBuild
Compile TypeScript to JavaScript:
npm run buildProduction
Run the compiled server:
npm startArchitecture
This is a hybrid server that runs two servers simultaneously:
┌─────────────────────────────────────────────────────────────┐
│ x402-mcp Process │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────┐ ┌──────────────────────────┐│
│ │ MCP Server (stdio) │ │ Express HTTP Server ││
│ │ │ │ (Port 4021) ││
│ │ • Tool Management │ │ ││
│ │ • Payment Requests │ │ • Payment Middleware ││
│ │ • Endpoint Management │ │ • Protected Routes ││
│ │ • Configuration │ │ • Health Check ││
│ └──────────────────────────┘ └──────────────────────────┘│
│ │
│ Both use X402_CONFIG shared state │
└─────────────────────────────────────────────────────────────┘
│
▼
x402 Facilitator
(Payment Verification)Key Components
MCP Server: Communicates via stdio, provides tools to AI assistants
Express Server: HTTP server with x402 payment middleware
ExpressServerManager: Manages Express lifecycle and protected endpoints
X402Handler: Handles manual payment request creation and tracking
x402-express Middleware: Intercepts HTTP requests, enforces payments
Project Structure
x402-mcp/
├── src/
│ └── index.ts # Main implementation (MCP + Express hybrid)
├── dist/ # Compiled JavaScript output
├── package.json # Dependencies and scripts
├── tsconfig.json # TypeScript configuration
├── .gitignore # Git ignore rules
└── README.md # This fileUsage with MCP Clients
Configuration
Add this server to your MCP client configuration (e.g., Claude Desktop):
{
"mcpServers": {
"x402-mcp": {
"command": "node",
"args": ["/path/to/x402-mcp/dist/index.js"]
}
}
}For development:
{
"mcpServers": {
"x402-mcp": {
"command": "npm",
"args": ["run", "dev"],
"cwd": "/path/to/x402-mcp"
}
}
}Example Tool Calls
Create a Protected HTTP Endpoint
{
"name": "x402_create_protected_endpoint",
"arguments": {
"path": "/weather",
"method": "GET",
"price": "$0.001",
"description": "Get current weather data for any location",
"responseData": {
"weather": "sunny",
"temperature": 72,
"humidity": 45
},
"inputSchema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City name"
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"weather": { "type": "string" },
"temperature": { "type": "number" },
"humidity": { "type": "number" }
}
}
}
}Response:
{
"success": true,
"message": "Protected endpoint created successfully",
"data": {
"endpoint": "GET /weather",
"url": "http://localhost:4021/weather",
"price": "$0.001",
"description": "Get current weather data for any location",
"network": "base-sepolia",
"payTo": "0x243E0B615BfEa0f315109b8b415e3D6b9c3131F7"
}
}Now when someone accesses http://localhost:4021/weather without payment, they'll receive a 402 Payment Required response with payment instructions!
Create Payment Request
{
"name": "x402_create_payment_request",
"arguments": {
"price": "$0.50",
"description": "Access to premium API endpoint",
"resource": "/api/premium/data",
"maxTimeoutSeconds": 120
}
}Response:
{
"success": true,
"message": "Payment request created successfully",
"data": {
"paymentId": "x402_1234567890_abc123",
"paymentUrl": "https://x402.org/facilitator/pay?id=...",
"price": "$0.50",
"network": "base-sepolia",
"payTo": "0x243E0B615BfEa0f315109b8b415e3D6b9c3131F7",
"description": "Access to premium API endpoint",
"expiresAt": "2024-01-01T12:02:00.000Z"
}
}List All Protected Endpoints
{
"name": "x402_list_protected_endpoints",
"arguments": {}
}Response:
{
"success": true,
"message": "Found 1 protected endpoint(s)",
"data": [
{
"method": "GET",
"path": "/weather",
"price": "$0.001",
"description": "Get current weather data for any location",
"url": "http://localhost:4021/weather"
}
]
}Get Express Server Status
{
"name": "x402_get_express_server_status",
"arguments": {}
}Response:
{
"success": true,
"message": "Express server is running",
"data": {
"isRunning": true,
"port": 4021,
"network": "base-sepolia",
"payTo": "0x243E0B615BfEa0f315109b8b415e3D6b9c3131F7",
"facilitatorUrl": "https://x402.org/facilitator",
"endpointCount": 1,
"endpoints": [...]
}
}Check Payment Status
{
"name": "x402_check_payment_status",
"arguments": {
"paymentId": "x402_1234567890_abc123"
}
}Response:
{
"success": true,
"data": {
"paymentId": "x402_1234567890_abc123",
"status": "pending",
"paid": false,
"price": "$0.50",
"network": "base-sepolia",
"createdAt": "2024-01-01T12:00:00.000Z",
"expiresAt": "2024-01-01T12:02:00.000Z"
}
}Get Configuration
{
"name": "x402_get_config",
"arguments": {}
}Response:
{
"success": true,
"message": "Current x402 configuration",
"data": {
"payTo": "0x243E0B615BfEa0f315109b8b415e3D6b9c3131F7",
"network": "base-sepolia",
"facilitatorUrl": "https://x402.org/facilitator"
}
}List Networks
{
"name": "x402_list_networks",
"arguments": {}
}Response:
{
"success": true,
"message": "Available networks for x402 payments",
"data": [
{
"name": "base",
"displayName": "Base Mainnet",
"chainId": 8453,
"currency": "ETH",
"stablecoin": "USDC",
"isMainnet": true
},
{
"name": "base-sepolia",
"displayName": "Base Sepolia Testnet",
"chainId": 84532,
"currency": "ETH",
"stablecoin": "USDC",
"isMainnet": false
},
{
"name": "avalanche",
"displayName": "Avalanche C-Chain",
"chainId": 43114,
"currency": "AVAX",
"stablecoin": "USDC",
"isMainnet": true
},
{
"name": "solana",
"displayName": "Solana Mainnet",
"chainId": null,
"currency": "SOL",
"stablecoin": "USDC",
"isMainnet": true
}
]
}Error Handling
The server includes comprehensive error handling:
Payment not found: Returns error when checking status of non-existent payment
Invalid payment status: Prevents operations on payments in wrong state
Expired payments: Automatically marks pending payments as expired
Invalid arguments: Validates using Zod schemas with detailed error messages
Technology Stack
TypeScript: Type-safe development
Node.js: Runtime environment
MCP SDK: Official Model Context Protocol SDK
x402-express: x402 Payment Protocol integration
Zod: Runtime type validation
How x402 Protocol Works
The x402 protocol is a standard for HTTP-based cryptocurrency payments. This hybrid MCP server provides two complementary approaches:
Approach 1: Express Middleware (Recommended)
This is the standard x402 flow using Express middleware:
Create Protected Endpoint: Use
x402_create_protected_endpointto dynamically create an HTTP endpointClient Makes Request: When a client accesses the endpoint without payment, they receive HTTP 402 Payment Required
Payment Instructions: The 402 response includes payment details (amount, address, network) in the response body
Client Pays: Client submits payment transaction on the blockchain
Retry with Proof: Client retries the request with
X-PAYMENTheader containing cryptographic proof of paymentMiddleware Verifies: x402 middleware verifies the payment via the facilitator
Access Granted: If valid, the endpoint returns the protected content
Approach 2: Manual Payment Requests
For custom payment flows:
Call
x402_create_payment_requestwith price and detailsServer returns a payment URL and unique payment ID
User completes payment through the payment URL
Call
x402_check_payment_statusto verify payment completionGrant access to resource once payment is confirmed
Network Support
Base (mainnet) and Base Sepolia (testnet)
Avalanche C-Chain (mainnet) and Avalanche Fuji (testnet)
Solana (mainnet) and Solana Devnet (testnet)
All payments processed in USDC stablecoin
Use Cases
AI API Monetization: Charge for expensive AI model inference calls
Content Paywalls: Gate premium content behind cryptocurrency payments
Micro-transactions: Enable small payments for individual API calls (as low as $0.001)
Resource Access Control: Manage access to computational resources
Dynamic API Marketplaces: AI agents can discover and pay for APIs automatically
Pay-per-use Services: Weather data, stock prices, translation APIs, etc.
Running on Mainnet
To accept real payments on mainnet, you need to make a few changes:
1. Set up CDP API Keys
Sign up at cdp.coinbase.com
Create a new project and generate API credentials
Set environment variables:
export CDP_API_KEY_ID=your-api-key-id export CDP_API_KEY_SECRET=your-api-key-secret
2. Update Configuration in src/index.ts
// Uncomment the facilitator import
import { facilitator } from "@coinbase/x402";
const X402_CONFIG = {
payTo: "0xYourMainnetAddress", // Your real mainnet wallet address
network: "base" as const, // Change from "base-sepolia" to "base"
facilitatorUrl: "https://x402.org/facilitator", // Not used for mainnet
expressPort: 4021,
};3. Update Express Middleware to Use CDP Facilitator
In the applyPaymentMiddleware() method:
private applyPaymentMiddleware() {
if (Object.keys(this.routeConfigs).length > 0) {
this.app.use(paymentMiddleware(
X402_CONFIG.payTo,
this.routeConfigs,
facilitator // Use CDP facilitator instead of testnet URL
));
}
}Customization
Testnet Configuration (Current)
const X402_CONFIG = {
payTo: "0xYourAddress", // Your receiving wallet address
network: "base-sepolia" as const, // or "avalanche-fuji", "solana-devnet"
facilitatorUrl: "https://x402.org/facilitator",
expressPort: 4021,
};Mainnet Configuration
const X402_CONFIG = {
payTo: "0xYourAddress", // Your receiving wallet address
network: "base" as const, // or "avalanche", "solana"
facilitatorUrl: "https://x402.org/facilitator",
expressPort: 4021,
};Note: When you specify prices like "$0.50", the x402 protocol automatically processes payments in USDC on the selected network.
Resources
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kushalsrinivas/x402-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server