MCP Commerce Server Starter
Clone-and-deploy boilerplate for a commerce MCP server. Live on Vercel in five minutes. Reachable by Claude, ChatGPT, Gemini, Cursor, and every other MCP-compatible client.
Full build guide (with the why behind every line): How to Build an MCP Server in 2026
What you get
- Product catalog Resource โ agents read the full catalog before acting
search_products Tool โ keyword + category + max-price filter
initiate_checkout Tool โ returns order summary + checkout URL
- Optional API-key auth โ
X-API-Key header, toggle with REQUIRE_AUTH=true
- Health endpoint at
/health
- Vercel-ready โ one command deploy, free Hobby tier
Stack: Python ยท FastMCP ยท FastAPI ยท Vercel
Quick start (local)
git clone https://github.com/NewPlanetWW/mcp-commerce-starter
cd mcp-commerce-starter
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python server.py
Test the health endpoint:
curl http://localhost:8000/health
Deploy to Vercel (free)
Requires Node 18+ for the Vercel CLI. No GitHub required โ the CLI uploads directly.
npm i -g vercel
vercel login
vercel --prod
The CLI prints your production URL. Your MCP endpoint is at:
https://your-project.vercel.app/mcp
Set environment variables in the Vercel dashboard (Settings โ Environment Variables):
| Variable | Default | Notes |
|---|
API_KEY | dev-secret-key | Change before going live |
REQUIRE_AUTH | false | Set true to enforce the key |
Wire into Claude Desktop
Option A โ Local stdio (fast iteration while building):
Edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS (see full guide for Windows/Linux paths):
{
"mcpServers": {
"commerce-catalog": {
"command": "uvicorn",
"args": ["server:app", "--host", "127.0.0.1", "--port", "8001"],
"env": {
"REQUIRE_AUTH": "false"
},
"cwd": "/path/to/mcp-commerce-starter"
}
}
}
Option B โ Remote (after Vercel deploy) using mcp-remote:
{
"mcpServers": {
"commerce-catalog-remote": {
"command": "npx",
"args": [
"-y", "mcp-remote@latest",
"https://your-project.vercel.app/mcp",
"--header", "Authorization: Bearer ${MCP_API_KEY}"
],
"env": { "MCP_API_KEY": "your-secret-key" }
}
}
}
Fully quit and relaunch Claude Desktop. Ask: "What products do you have under $100?" โ Claude calls search_products and responds with your catalog.
Customize
Replace the sample products
Edit the PRODUCTS list in server.py. Each product needs: sku, name, price, description, availability, category, image_url.
For real inventory, replace the list with a database call:
import psycopg2
def get_products():
return [...]
PRODUCTS = get_products()
Add Stripe checkout
Replace the stub in initiate_checkout with a real Stripe session:
import stripe
stripe.api_key = os.getenv("STRIPE_SECRET_KEY")
session = stripe.checkout.Session.create(
line_items=[{"price": price_id, "quantity": quantity}],
mode="payment",
success_url="https://yourstore.com/success",
cancel_url="https://yourstore.com/cancel",
)
return {"success": True, "checkout_url": session.url, ...}
The 5 errors you'll hit (and how to fix them)
Covered in the full guide: 30daypivot.com/agentmall_spoke_mcp
MCP error -32600 โ initialization order violation
422 Unprocessable Entity โ Pydantic model vs plain args mismatch
405 Method Not Allowed โ missing DELETE in CORS allowed methods
stateless_http not set โ serverless Vercel requires stateless_http=True
ModuleNotFoundError: mcp โ wrong package name (mcp[cli], not fastmcp)
Project structure
mcp-commerce-starter/
โโโ server.py # FastMCP app โ resource, tools, middleware, FastAPI mount
โโโ requirements.txt # Pinned dependencies
โโโ vercel.json # Vercel deployment config
โโโ mcp.json # MCP server manifest
โโโ .env.example # Environment variable template
โโโ README.md
Go deeper
This starter is the code companion to the AgentMall spoke series on 30DayPivot:
License
MIT