mcp-a2a-ap2-im-hungry 🍔💳
MCP server with A2A protocol (food delivery) + AP2 protocol (payments with Mandates).
Demo

Flow

Quick Start
git clone https://github.com/tas1337/mcp-a2a-ap2-im-hungry.git
cd mcp-a2a-ap2-im-hungry
npm start
Services:
- MCP Server:
http://localhost:8000/mcp - Registry:
http://localhost:8004 - DoorDash/UberEats/Grubhub:
8001-8003(A2A) - Stripe:
http://localhost:8005(AP2)
What's Different from mcp-a2a-im-hungry?
| mcp-a2a-im-hungry | This project |
|---|---|
| A2A only | A2A + AP2 |
| No payments | Stripe payments |
| — | Mandates (signed authorization) |
What is AP2?
Problem: AI agents spending money. Who approved it?
AP2 = Payments with Mandates — cryptographically signed proof of user intent.
MANDATE = { userId, maxAmount, expires, signature }
Flow (matches real-world AP2):
- User asks for cheeseburger 🍔
- Your agent searches restaurants via A2A (discovers DoorDash/UberEats/Grubhub agents)
- Your agent gets menus and delivery estimates
- Your agent decides which restaurant (cheapest/fastest)
- User authorizes payment → User's authorization service creates mandate (signed with user's private key)
- Your agent requests authorization → Receives mandate from user
- Your agent sends payment request WITH mandate to Stripe agent (via A2A)
- Stripe agent VERIFIES mandate (signature valid? not expired? amount ok?)
- If valid → Stripe processes payment ✅
- Your agent places order with food delivery agent (DoorDash/UberEats/Grubhub via A2A)
- 🍔 Burger incoming!
Key Point: The agent NEVER creates mandates. User authorization creates them. Agent only uses them.
Project Structure
src/
├── a2a-client.ts # Calls ANY agent (food or Stripe)
├── tools.ts # Food tools
├── ap2-tools.ts # Payment tools (requests user authorization)
├── user-authorization.ts # User creates mandates (real-world: wallet/auth service)
mock-agents/
├── food-delivery/ # DoorDash, UberEats, Grubhub
├── payments/ # Stripe (verifies mandates!)
└── registry/ # Agent discovery
Tools
| Tool | Description |
|---|---|
search_restaurants | Search food (A2A) |
get_menu | Get menu (A2A) |
place_order | Order food (A2A) |
process_payment | Pay via Stripe (AP2 + Mandate) |
process_refund | Refund via Stripe (AP2 + Mandate) |
Connect to Cursor
{
"mcpServers": {
"mcp-a2a-ap2-im-hungry": {
"url": "http://localhost:8000/mcp"
}
}
}
