Engineering · MCP · skills

Dev surface

Taste exposes two surfaces. /chat is what a customer sees. This page is what an engineer (or external MCP client) sees — 4 Claude Code skills, 6 slash commands, and one MCP server exposing the read-side of Taste.

Per-persona use cases

Use cases by persona — every Claude primitive lives in one of these scenarios (Customer has 6, the other three have 2 each). Click through to trigger one; /chat also has a Run tour button that auto-plays the two customer scenarios with Studio forced on.

Customer

cust_demo · vegan + peanut allergy · prefers thai/med/japanese

Owner

o_thaifresh / o_verts · each manages one restaurant · no auth, persona = ?for=

Driver

drv_001 Maria / drv_005 Priya · ebike fleet · receives Dispatch assignments

Agent (HIL)

ag_kim / ag_sam · the return path · view escalated handoffs + reply

Skills

Loaded automatically by Claude Code when the in-session conversation matches its description. The engineer asks a question; the skill's expertise becomes available.

Commands

Slash command the engineer types in Claude Code. Deterministic workflow — runs scripts, calls models, returns a structured result.

MCP server

A parallel surface to /chat — same underlying tools, different consumer. External MCP clients (Claude Desktop, Claude Code, third-party agents) drive Taste through this server. Read-side only by ADR-006.

MCP servertaste-mcptaste-mcp/src/server.ts

Streamable-HTTP MCP server exposing Taste over all three MCP primitives (Tools, Resources, Prompts) to external clients — Claude Desktop, Claude Code, third-party agents. Same tools the in-process Concierge uses; different consumer.

Tools (6)

  • searchRestaurantsFilter catalog by cuisine, allergens, dietary, price.
  • getMenuFull menu for one restaurant.
  • searchMenusHybrid (vector + keyword) semantic search across menus.
  • checkAllergensClassify a dish list against an allergen profile.
  • getOrderHistoryRecent orders for a customer (PII-adjacent; see Resources auth caveat).
  • getDriverETALive ETA for an active order.

Resources (4)

  • taste://catalogPublicapplication/json

    Full restaurants + dishes.

  • taste://catalog/summaryPublictext/markdown

    Same block Concierge prompt-caches — markdown form.

  • taste://driversOperationalapplication/json

    Driver fixture (Phase 5). Production would redact.

  • taste://orders/by-customer/{customerId}PIIapplication/json

    Dynamic per-customer order list. Demo posture has no auth; production gate requires a signed token in the MCP transport, not a path param.

Prompts (2)

  • find_dinner(customerId, mood?)

    Concierge-shaped greeting that loads dietary profile and asks for picks.

  • complain_about_order(customerId, issue)

    Opens a support conversation about a specific order. Resolution still routes to human/Support — never through MCP.

NOT exposed (4) — the architectural rule

Capability not present beats capability defended. Write tools stay in-process where the PreToolUse hook and audit trail fire; the MCP server even has a named branch returning tool_not_exposed if a client asks for them.

  • placeOrderWrite (financial)

    Charges card, commits inventory. Must traverse Concierge so the PreToolUse fraud + spend-cap hook fires. Bypassing the hook is the whole point of having it.

  • refundOrderWrite (financial)

    Moves money. Must traverse Support so the autonomous-refund cap ($20, ADR-001) is enforced and the PostToolUse audit trail fires.

  • applyPromoWrite (state-changing)

    Mutates cart pricing; downstream of cart construction. Belongs to OrderBuilder.

  • memory/<id>.md (resource)PII

    Allergies + addresses. Read by in-process runtime only, after Concierge identifies the customer. Never published as a resource.

Drive it from Claude Desktop

Drop this into your claude_desktop_config.json, restart Claude Desktop, then ask "list Taste resources" or invoke the find_dinner prompt.

{
  "mcpServers": {
    "taste": {
      "url": "https://func-taste-dev.azurewebsites.net/api/mcp"
    }
  }
}