hou-tea
# @hou-tea/mcp-server
> Agent-app MCP server for [hou-tea.com](https://hou-tea.com) — let your AI agent browse, recommend, and **buy authentic Chinese tea with USDC** via the [x402 protocol](https://www.x402.org).
Designed for Claude Desktop, Cursor, Cline, Continue, Zed, and any [Model Context Protocol](https://modelcontextprotocol.io) compatible AI agent.
> **v0.3.0-beta** - server now ships as an *agent app layer*, not just a tool list:
> progressive tool discovery (core + extended), strict JSON Schemas, structured
> response/error envelopes (`ok`, `data`, `error`, `next_action`, `meta.request_id`),
> stable error codes, explicit hand-off hints to wallet MCPs, and MCP Apps UI
> metadata backed by the public `@hou-tea/agent-ui-contract` package. See
> [What changed in 0.3.0](#what-changed-in-030-beta) below.
---
## What it does
Exposes the [hou-tea agent API](https://hou-tea.com/.well-known/agent) as MCP tools so your AI assistant can shop on your behalf.
**Default `tools/list` (core + meta) — always visible:**
| Tool | What it does |
|---|---|
| `hou_tea_browse` | List tea catalog with filters (category, price, season, difficulty) |
| `hou_tea_recommend` | Natural-language recommendations: "warming tea for cold winter nights" |
| `hou_tea_explain` | Deep dive on one product: brewing guide, story, health info |
| `hou_tea_get_payment_requirements` | Initiate x402 payment intent (returns recipient + amount; auto `register_buyer_list_token` / `buyer_list_token` for buyer order history) |
| `hou_tea_check_order` | Poll order status after payment |
| `hou_tea_list_my_orders` | List your x402 orders by `buyer_list_token` (Bearer; uses `HOU_TEA_BUYER_LIST_TOKEN` env) |
| `hou_tea_discover_extended` | Reveal extended tools (compare / health-filter / agent-card) on demand |
**Extended (revealed after `hou_tea_discover_extended`):**
| Tool | What it does |
|---|---|
| `hou_tea_compare` | Side-by-side comparison of 2–4 candidates |
| `hou_tea_filter_by_health` | Filter by conditions: pregnant, insomnia, caffeine sensitive |
| `hou_tea_agent_card` | Fetch full agent capability descriptor (diagnostics) |
**Payment is handled by an x402-capable wallet MCP** (e.g. [`@coinbase/payments-mcp`](https://github.com/coinbase/payments-mcp)) — this server only emits payment intents, it never holds keys or signs transactions.
---
## Install
### Claude Desktop
Edit `claude_desktop_config.json` (Settings → Developer → Edit Config):
```json
{
"mcpServers": {
"hou-tea": {
"command": "npx",
"args": ["-y", "@hou-tea/mcp-server@next"]
},
"coinbase-payments": {
"command": "npx",
"args": ["-y", "@coinbase/payments-mcp"],
"env": {
"EVM_PRIVATE_KEY": "0x..."
}
}
}
}
```
Restart Claude Desktop. You should see "hou-tea" listed under tools.
### Cursor
Add to `~/.cursor/mcp.json` or `<project>/.cursor/mcp.json`:
```json
{
"mcpServers": {
"hou-tea": {
"command": "npx",
"args": ["-y", "@hou-tea/mcp-server@next"]
}
}
}
```
### Cline / Continue / Zed
Same `npx -y @hou-tea/mcp-server@next` invocation in their MCP config.
### Wallet MCP pairing
Hou Tea emits x402 payment requirements, but it does not hold keys or sign
transactions. For agent-native checkout, pair this MCP with an x402-capable
wallet MCP such as `@coinbase/payments-mcp`:
```json
{
"mcpServers": {
"hou-tea": {
"command": "npx",
"args": ["-y", "@hou-tea/mcp-server@next"]
},
"coinbase-payments": {
"command": "npx",
"args": ["-y", "@coinbase/payments-mcp"],
"env": {
"EVM_PRIVATE_KEY": "0x..."
}
}
}
}
```
Fund the wallet with Base USDC before asking the agent to buy. After the first
successful purchase, copy the returned `buyer_list_token` into
`HOU_TEA_BUYER_LIST_TOKEN` so future order history queries stay scoped to the
same buyer identity.
---
## Try it
After install, ask your agent:
> *"Recommend a warming tea for winter nights, around $30."*
The agent will call `hou_tea_recommend`, return real products with prices and brewing notes, then offer to buy.
> *"I'll take the first one."*
The agent calls `hou_tea_get_payment_requirements`, gets back a 402 with the merchant's Base-chain USDC address and amount, plus a `buy_request_body` field (includes `register_buyer_list_token` or your saved `buyer_list_token`). The **retry POST to `/pay/api/v1/buy` after paying must use that exact JSON body** plus the `X-Payment` header — otherwise buyer grouping breaks. If you've also installed `@coinbase/payments-mcp` with a funded wallet, configure it to forward the same body. After the first successful purchase, copy `buyer_list_token` from the JSON response into MCP env `HOU_TEA_BUYER_LIST_TOKEN` so `hou_tea_list_my_orders` and future checkouts stay under one identity.
---
## Configuration
All settings via environment variables (optional):
| Env var | Default | Purpose |
|---|---|---|
| `HOU_TEA_API_BASE` | `https://hou-tea.com` | Override API host (e.g. for staging). |
| `HOU_TEA_PAY_BASE` | `https://hou-tea.com/pay` | Override x402 middleware host. |
| `HOU_TEA_STORE_ID` | `fengshui` | Default store_id. |
| `HOU_TEA_AGENT_KEY` | *(none)* | Optional `X-Agent-Key` for higher rate limits / private skills. Contact [support@hou-tea.com](mailto:support@hou-tea.com). |
| `HOU_TEA_BUYER_LIST_TOKEN` | *(none)* | After first successful `/buy`, paste the `buyer_list_token` from the response. Future `hou_tea_get_payment_requirements` calls send this as `buyer_list_token`; enables `hou_tea_list_my_orders`. |
| `HOU_TEA_AUTO_REGISTER_BUYER_LIST_TOKEN` | `true` | Set to `false` to stop sending `register_buyer_list_token` / `buyer_list_token` on `/buy` (legacy behavior). |
Most users need none of these — the public catalog and x402 buy endpoint are open. For **buyer order history**, set `HOU_TEA_BUYER_LIST_TOKEN` once you have it from a confirmed purchase.
---
## Agent UI and MCP Apps
The `next` beta exposes MCP Apps metadata for hosts that can render structured
tool results. The shared UI contract is public:
```bash
npm i @hou-tea/agent-ui-contract
```
The contract currently defines:
| Component | Used by |
|---|---|
| `TeaRecommendationGrid` | `hou_tea_browse`, `hou_tea_recommend` |
| `PaymentReviewCard` | `hou_tea_get_payment_requirements` |
| `OrderTimeline` | `hou_tea_check_order`, `hou_tea_list_my_orders` |
Tool descriptors include `_meta.ui.component`, `_meta.ui.schemaVersion`,
`_meta.ui.resourceUri`, and `_meta.ui.resultMappingId`. MCP hosts can read the
matching resource URI and inspect the embedded `agent-ui/v1` manifest.
Public discovery:
- Agent Card: `https://hou-tea.com/.well-known/agent`
- Agent App docs: `https://shop.hou-tea.com/agents`
- UI schema JSON: `https://shop.hou-tea.com/api/agent-ui-contract`
---
## Troubleshooting
- **Tools do not appear**: restart the host app after editing MCP config, then
run `npx -y @hou-tea/mcp-server@next --help` in a terminal to confirm npm can
download the package.
- **Payment fails**: confirm the wallet MCP is installed separately, the wallet
has Base USDC, and the retry POST uses the exact `buy_request_body` returned
by `hou_tea_get_payment_requirements`.
- **Order history is empty**: set `HOU_TEA_BUYER_LIST_TOKEN` from a confirmed
purchase response. Without it, `hou_tea_list_my_orders` cannot scope the
buyer safely.
- **Corporate network blocks npm**: install once with
`npm i -g @hou-tea/mcp-server@next` and point the MCP config command to
`hou-tea-mcp`.
---
## Architecture
```
┌─────────────────┐ ┌────────────────────┐
│ Claude / Cursor │ │ hou-tea.com │
│ │ HTTPS │ /api/agent/* │
│ ┌─────────────┐ │ ──────► │ (catalog/ │
│ │ hou-tea MCP │ │ ◄────── │ recommend/etc.) │
│ └─────────────┘ │ └────────────────────┘
│ │
│ ┌─────────────┐ │ HTTPS ┌────────────────────┐
│ │ payments MCP│ │ ──────► │ /pay/api/v1/buy │
│ │ (Coinbase) │ │ ◄ 402 ─ │ x402-middleware │
│ └─────────────┘ │ │ │
│ │ │ Base │ verifies on- │
│ └─────────┼──────►──┤ chain tx, marks │
│ USDC transfer │ chain │ order confirmed │
└─────────────────┘ └────────────────────┘
```
---
## Build from source
```bash
git clone https://github.com/hou-tea/hou-tea-mcp-server.git
cd hou-tea-mcp-server
npm install
npm run build
node dist/index.js # speaks MCP over stdio
npm run test:unit # offline unit tests (envelope + registry)
npm run test:smoke # live HTTP smoke (hits hou-tea.com)
npm run test:mcp # full MCP stdio smoke (build + spawn)
```
---
## What changed in 0.3.0-beta
This release adds the public Agent UI protocol layer:
1. **Public MCP Apps manifests.** Core buying tools now advertise UI metadata
through `_meta.ui`, including component name, `agent-ui/v1` schema version,
resource URI, and result mapping ID.
2. **Shared npm contract.** `@hou-tea/agent-ui-contract` is published as the
single source of truth for component manifests, TypeScript types, MCP UI
resource names, and result mappings.
3. **Manifest-backed UI resources.** MCP `resources/read` responses now embed
the exact component manifest in HTML so compatible hosts can render product
grids, payment review cards, and order timelines without scraping text.
4. **External discovery surfaces.** The Agent Card and public `/agents` page
point agents and developers to npm packages, schema JSON, MCP install
snippets, and wallet pairing instructions.
This is a `next`-tagged beta; install with:
```bash
npm i @hou-tea/mcp-server@next
# or, in MCP config: "args": ["-y", "@hou-tea/mcp-server@next"]
```
The 0.1.x line keeps working - tool names are unchanged, but the `next` beta
adds structured envelopes, progressive discovery, and UI metadata.
---
## What changed in 0.2.0-beta
Anthropic's Skills + MCP guidance pushes MCP servers from "a flat list of tools"
toward an **agent app layer**: progressive discovery, strict schemas,
program-friendly responses, and explicit hand-off to other MCPs.
This release brings that posture to `@hou-tea/mcp-server`:
1. **Progressive tool discovery.** Default `tools/list` returns 6 core tools
+ `hou_tea_discover_extended`. Extended tools (`hou_tea_compare`,
`hou_tea_filter_by_health`, `hou_tea_agent_card`) are revealed on demand.
Calling an extended tool before discovery returns a structured error:
```json
{ "ok": false,
"error": { "code": "extended_not_revealed",
"retryable": true,
"hint": "Call hou_tea_discover_extended …" } }
```
2. **Structured envelope on every call.**
```json
{
"ok": true,
"data": { /* tool payload */ },
"next_action": [
{ "tool": "hou_tea_explain", "reason": "...", "args_hint": { "skill_id": "..." } }
],
"meta": { "request_id": "req_…", "tool": "hou_tea_recommend",
"took_ms": 412, "server_version": "0.2.0-beta.0" }
}
```
Errors share the same envelope with `ok: false` and a stable `error.code`
(`bad_request`, `unauthorized`, `not_found`, `conflict`, `timeout`,
`rate_limited`, `server_error`, `network_error`,
`missing_buyer_list_token`, `extended_not_revealed`, `unknown_tool`,
`internal_error`). Each error also carries `retryable` and a `hint`.
3. **Strict JSON Schema.** Every `inputSchema` sets
`additionalProperties: false`, with `required`, `enum`, `pattern`,
`minItems` / `maxItems` etc. — so agent-side validators can rely on it.
4. **Hand-off hints to wallet MCP.** `hou_tea_get_payment_requirements`
returns the 402 `buy_request_body` plus a `next_action` block that points
the agent to an x402 wallet MCP (e.g. `@coinbase/payments-mcp`) and then
back to `hou_tea_check_order`.
5. **Traceability.** Every response carries `meta.request_id` so you can
include it in support tickets / logs.
This is a `next`-tagged beta; install with:
```bash
npm i @hou-tea/mcp-server@next
# or, in MCP config: "args": ["-y", "@hou-tea/mcp-server@next"]
```
The 0.1.x line keeps working — tool names are unchanged, only the result
shape and the default `tools/list` size are different.
---
## Why this exists
Chinese tea has 1500+ years of cultural depth and a global market larger than coffee. But until now, AI agents either (a) hallucinated product names from training data, or (b) failed to scrape JavaScript-rendered storefronts. This MCP gives agents a **direct, authoritative, agent-native** path to a real catalog with real prices and real on-chain settlement.
If you're building an AI shopping agent, a tea recommendation app, or just want your Claude to be able to actually buy you tea — this is for you.
---
## License
MIT © hou-tea
TDQS
Scored across 7 tools
Each tool serves a unique function: browsing catalog, checking orders, discovering extended tools, explaining products, initiating payment, listing orders, and recommending teas. No functional overlap exists.
All tools follow the 'hou_tea_verb_noun' pattern in snake_case, e.g., hou_tea_browse, hou_tea_check_order, hou_tea_discover_extended. Naming is uniform and predictable.
With 7 tools, the surface is well-scoped for a tea e-commerce server covering browsing, recommendations, explanations, payments, and order management. No excess or deficiency.
The core workflow of browse, recommend, explain, pay, and track orders is covered. However, there is no explicit order creation tool (though payment initiation implies it) and missing cancellation/update capabilities, which are minor gaps.