-
Chat with Jessica on the left, every product she finds as large numbered cards on the right. Here: search by photo, under $60.
-
Landing page. The receipt on the right replays a real agent run: brief, searches, offers compared, pick, PayPal approval.
-
How it works: you brief it by text or voice, it searches and compares across 25,000 stores, you choose and it sets up the PayPal payment.
-
Cart drawer. Items from the gallery or from chat ("add 2 and 5 to the cart") check out as one PayPal order.
-
Orders page: status, items with store links, totals, PayPal order and capture ids. Pending orders refresh from PayPal.
Links
- Code (public, MIT): https://github.com/ritwikareddykancharla/errand
- Setup and run instructions: the README in the repo (
npm install,.envfrom.env.example,npm run dev) - Hosted demo: coming with the Render deployment
Inspiration
Every "AI shopping assistant" we tried stops at the same place: it recommends, then hands you a link and you do the actual buying. We wanted the opposite. An agent you can brief like a friend who shops well, that works across real stores, shows you everything it found instead of hiding the choice, and when you say "buy number 4", actually pays.
PayPal made that last step possible. Vaulting a buyer once means the agent can complete a payment later without dragging the person through a checkout screen, while PayPal still holds the consent and the money movement.
What it does
Errand is a conversational shopping agent with a real wallet. You brief it by text or voice, Jessica (the agent's voice) searches real retailers, you choose, and it pays with PayPal on the spot.
Features
| Feature | What you get |
|---|---|
| Chat or talk | Type a brief or press Talk and say it. Jessica replies in text and out loud, and narrates each search as it runs ("Searching for trail running headlamp", "8 in the gallery"). A Stop button cuts her off. |
| Real stores | Every search covers 100M+ products from 25,000 retailers via Channel3, with per-retailer offers and store links. |
| Numbered gallery | Everything she finds appears as a large card with image, store, and price. Nothing is hidden behind a summary, and you refer to items by number. |
| Search by photo | Attach a picture, add "something like this under $60", and get visual matches. "More like number 3" runs a real similarity search. |
| You stay in charge | Buy, Add to cart, or Save for later on any card. Or say it: "add 2 and 5 to the cart", "save number 4", "check out my cart". The agent never buys unless told to. |
| Pays with PayPal, instantly | Connect PayPal once (PayPal Vault). After that, "buy number 4" or "pay for my cart" completes the payment immediately and shows a receipt with the capture id. Not connected? You get a normal PayPal approval link. |
| Cart, Saved, Orders | A cart drawer that checks out as one PayPal order, a Saved page, and an Orders page with status (paid, awaiting approval, cancelled), items, totals, capture ids and links back to the store. Pending orders refresh from PayPal. |
| Clean catalog | Colour variants and relistings are de-duplicated. Prices are re-fetched seconds before checkout. Broken images fall back to alternates. |
Architecture

The Next.js app sits in the middle. The agent (Claude, run through the Claude Code CLI in print mode) gets its tools over MCP from an endpoint inside the same app, so API keys and the PayPal vault token never reach the model. Every chat message carries Gallery, Cart and Saved blocks that map card numbers to product ids, which is how "number 4" resolves exactly.
Payment flow: consent once, then the agent pays

PayPal Vault turns a one-time approval into instant payments. The vault token lives server-side under an httpOnly session cookie, and the MCP endpoint looks it up from a session id in its URL, never from the prompt.
How we built it
- PayPal Orders v2 for every purchase: one order, one or many items,
CAPTUREintent. PayPal Vault v3 (setup tokens, payment tokens) for the one-time "Connect PayPal" consent, after which orders are created with thevault_idand complete immediately. Disconnecting deletes the token at PayPal. - Claude is the agent. It runs through Claude Code in print mode (
claude -p) with the conversation resumed per turn, so the chat has memory. Its tools are served over MCP from/api/mcp(built withmcp-handler):search_products,search_by_image,find_similar,get_product_offers,add_to_cart,save_for_later,create_paypal_checkout. The tool allowlist is enforced by the CLI, not by the prompt. - Channel3 for the catalog: text search (agentic mode for rich briefs), image search, similarity search, and fresh per-retailer offers.
- ElevenLabs for voice both ways: Scribe transcribes spoken briefs, Flash text-to-speech gives Jessica her voice.
- Next.js 16 / React 19 / TypeScript, Server-Sent Events for the live agent stream, Playwright for browser QA of every flow.
- The PayPal MCP server is also wired into the development environment, so the same agent tooling can manage invoices, subscriptions, and disputes.
Challenges we ran into
- Agentic payment without losing consent. The first version created an order and sent the user through PayPal's full checkout every time, which is not agentic. Vault was the answer, and it has sharp edges: vaulted orders require a
PayPal-Request-Idheader, and the approval must be bound to a consumer account rather than the merchant. - Keeping the model away from secrets. The agent calls tools over MCP, so binding checkout to a buyer meant looking the vault token up server-side from a session id in the MCP URL, never passing it through the prompt.
- Safari audio. Browsers block audio that starts after a network request unless the player was unlocked by a click. One persistent audio element, unlocked on the first Send, fixed it.
- Catalog noise. Retailers list the same product per colour and per sister domain. De-duplicating by brand and title, keeping the cheapest offer, made the gallery usable.
Accomplishments that we're proud of
- A true end-to-end agentic purchase: "buy number 4" to a captured PayPal payment with no checkout screen, under the user's one-time consent.
- The agent narrates its own work out loud as it searches, which makes a 30-second search feel alive rather than like a spinner.
- Every flow (chat, gallery, cart, saved, orders, image search, voice) is exercised by headless browser tests before we call it done.
What we learned
- Agentic commerce is mostly a consent and control problem, not a model problem. Users want the agent to do the work and the paying, but they also want to see everything it found and to be the one who says "that one".
- MCP is a clean seam between an agent and a product. The same tools serve the chat agent, a terminal, and any other MCP client.
What's next for Errand
- Deploy to Render with a Workflow for the long-running agent turns, and swap the Claude Code CLI for the Anthropic SDK in production.
- Price watching: "tell me when number 3 drops under $40", then buy automatically within a pre-approved budget.
- Multi-store carts with PayPal Payouts to settle with each retailer.
- Proper buyer accounts so the vaulted PayPal follows you across devices.
How it meets the technology requirement
- PayPal: Orders v2 (create, capture, multi-item), Vault v3 (setup tokens, payment tokens, vaulted orders for instant payment), sandbox throughout; PayPal MCP server for merchant tooling.
- AI: Claude as the conversational agent with tool use over MCP; Channel3 agentic and image search; ElevenLabs speech-to-text and text-to-speech.
Built With
- anthropic
- channel3
- claude
- elevenlabs
- mcp
- next.js
- node.js
- paypal
- paypal-orders-api
- paypal-vault
- playwright
- react
- typescript
Log in or sign up for Devpost to join the conversation.