Skip to main content
Glama
tas1337

MCP A2A AP2 Food Delivery & Payments

by tas1337
README.md
# mcp-a2a-ap2-im-hungry šŸ”šŸ’³

MCP server with **A2A protocol** (food delivery) + **AP2 protocol** (payments with Mandates).

## Demo

![AP2 Demo](./assets/mcp-a2a-ap2-demo.gif)

## Flow

![AP2 Flow](./assets/ap2-flow.png)

## Quick Start

```bash
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):**
1. User asks for cheeseburger šŸ”
2. Your agent searches restaurants via A2A (discovers DoorDash/UberEats/Grubhub agents)
3. Your agent gets menus and delivery estimates
4. Your agent decides which restaurant (cheapest/fastest)
5. **User authorizes payment** → User's authorization service creates mandate (signed with user's private key)
6. **Your agent requests authorization** → Receives mandate from user
7. **Your agent sends payment request WITH mandate to Stripe agent** (via A2A)
8. **Stripe agent VERIFIES mandate** (signature valid? not expired? amount ok?)
9. If valid → Stripe processes payment āœ…
10. **Your agent places order with food delivery agent** (DoorDash/UberEats/Grubhub via A2A)
11. šŸ” 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

```json
{
  "mcpServers": {
    "mcp-a2a-ap2-im-hungry": {
      "url": "http://localhost:8000/mcp"
    }
  }
}
```

## Resources

- [A2A Protocol (Google)](https://developers.googleblog.com/a2a-a-new-era-of-agent-interoperability/)
- [MCP Specification](https://modelcontextprotocol.io)
- [AP2 Protocol (Google)](https://cloud.google.com/blog/products/ai-machine-learning/announcing-agents-to-payments-ap2-protocol)