Connect your agent to local businesses.
blip is an MCP server, and speaks PAP and PACT, that lets your agent find a local business, check prices and times, and send a request. The owner confirms by text. blip never holds money.
Connect
MCP server (Streamable HTTP): https://blip.diwas.ai/mcp
MCP versions: 2026-07-28 (stateless: no initialize and no Mcp-Session-Id; every request carries its version, client and capabilities in _meta and the MCP-Protocol-Version, Mcp-Method and Mcp-Name headers), and 2025-03-26 to 2025-11-25 with the initialize handshake. server/discover lists them.
- Connecting needs nothing. No sign-in. Searching, prices and open times work straight away.
- Acting needs the customer signed in, once. Sign them in with MCP authorization (OAuth) at the same address: they confirm their number on blip's own page, by a texted code or with Google, Apple or Meta, and consent to what you may do. Older clients that keep a session can instead call
verify_phone. - The owner has the last word. Each business sets Allow, Ask me or Never for every action. Some actions wait for the owner's reply: poll
get_approval.
Signing in
blip follows MCP authorization: a 401 names the protected resource metadata in WWW-Authenticate, the authorization server supports Client ID Metadata Documents (the MCP default) and dynamic client registration, S256 PKCE, the iss parameter on every response (RFC 9207), and tokens bound to the MCP server they're for (RFC 8707). Browsing tools need no sign-in, so the challenge comes only when the customer acts. ChatGPT gets it in the tool result (_meta["mcp/www_authenticate"]) as its Apps SDK expects. No one-time code is ever typed into the chat on 2026-07-28 or on ChatGPT; verify_phone is only offered to older clients that keep an MCP session.
Deposits
blip never takes payments. When a business wants a deposit, pay_deposit texts the customer the business's own payment link. A 2026-07-28 client that declares elicitation.url also gets the link as a URL elicitation (multi round-trip: an input_required result with a signed requestState), so it can open the business's payment page for the customer; the retry completes without paying twice.
For shop owners' agents
The owner's own agent runs the shop at https://blip.diwas.ai/owner-mcp (whats_waiting, answer, connect_booking: the shop's own booking system from a link, with at most one approval tap for the owner), with the same MCP versions. The owner signs in with OAuth on blip's page (issuer https://blip.diwas.ai/owner-oauth, scope owner): by a code texted to the shop's owner number, with the Square account the shop connected, or with a Google account tied to the owner number once. The same token works on the REST API at /api/owner (OpenAPI).
Agent identity
blip's A2A agent cards are signed (A2A 1.0): a detached JWS over the card's RFC 8785 canonical JSON, with the key at /.well-known/jwks.json. Agents that sign their requests with Web Bot Auth (HTTP Message Signatures, RFC 9421, tag="web-bot-auth", keys in the agent's /.well-known/http-message-signatures-directory) are recognized and get their own rate-limit budget instead of sharing one with everyone at the same address.
Limits
Up to 120 MCP or API calls per session every 60 seconds; past that, a 429 with Retry-After. Confirmation codes are limited per number and per IP address. Errors come back as tool results with isError and a sentence saying what to fix.
Testing
Fictional sandbox businesses are available for testing and directory review: search find_businesses with a query that includes sandbox (for example "sandbox haircut" or "sandbox plumber"). Real customers never see them. Their owners are fictional, so nothing is texted to a real business, and every action is allowed straight away. Contact us for a test login.
Discovery
| URL | What it is |
|---|---|
/llms.txt | A plain-text summary for agents: what blip is and how to connect |
/.well-known/mcp.json | The MCP server card (a draft standard, SEP-2127) |
/.well-known/poppy.json | Personal Agent Protocol (PAP) discovery for the directory |
/.well-known/agent-card.json | PACT, on A2A: the agent card |
A business with its own agent subdomain also serves these files on its own domain.
Tools
| Tool | Kind | What it does (* required) |
|---|---|---|
find_businesses | reads | Find businesses on blip by what the customer needs (e.g. 'brakes', 'haircut', 'croissants', 'PVC fittings') and/or ZIP code. Returns up to 10 business ids and what each offers: appointments, pickup orders, messages. Results with on_blip false aren't on blip yet: give the customer their phone or website instead of booking.query What the customer needs or the business name · zip The customer's 5-digit ZIP code, to find nearby locations |
business_info | reads | A business's services and prices, pickup menu and pickup times, locations and rules.business* Business id from find_businesses, like corner-bakery |
get_quote | reads | Price, visit fee, duration and deposit for one service at a business.business* Business id from find_businesses, like corner-bakery · service* Service id or name from business_info |
check_availability | reads | Next open times at a business; give a ZIP code to get the nearest location's times. Where times depend on the service (business_info says so), give the service.business* Business id from find_businesses, like corner-bakery · zip Customer's ZIP code (optional) · service Service id or name from business_info (optional) |
book | acts | Book a service at a business in an open slot, for the signed-in customer. Ask the customer to confirm the service and time first. The customer's phone must be verified first (verify_phone); the result may be pending the owner's OK, in which case poll get_approval.business* Business id from find_businesses, like corner-bakery · service* Service id or name from business_info · slot_id* Slot id from check_availability · details Details or what's wrong, in the customer's words |
my_bookings | reads | The customer's bookings, pickup orders and messages (with the businesses' replies), at one business or all of them.business Business id (optional; all businesses if omitted) |
reroute | acts | When a business declined or didn't answer a booking request, send the same request to one of the other options my_bookings listed. Only after the customer agrees to that business. Books the open time closest to the original one; the new business's owner still has to confirm.business* The business that couldn't take it · job_id* The ended booking id, like J-5001 · to_business* The other business the customer chose |
reschedule | acts | Move one of the customer's bookings to another open slot.business* Business id from find_businesses, like corner-bakery · job_id* Booking id, like J-5001 · slot_id* New slot id |
pay_deposit | acts | Pay the deposit for one of the customer's bookings (ask the customer to confirm first): the customer gets the business's payment link by text, or the business collects it its usual way. The business may confirm first.business* Business id from find_businesses, like corner-bakery · job_id* Booking id |
cancel | acts | Cancel one of the customer's bookings, where the business allows it.business* Business id from find_businesses, like corner-bakery · job_id* Booking id |
get_approval | reads | Check an action waiting for a business owner's OK.approval_id* Approval id |
delivery_quote | reads | Delivery fee and timing from a business to an address, before ordering.business* Business id from find_businesses, like corner-bakery · items* What to order, like "2 croissant, 1 oat latte" · address* Full delivery address: street, city, state, ZIP · ready_time When it should be ready ("YYYY-MM-DD HH:MM" from business_info), or "asap" |
place_order | acts | Place a pickup or delivery order with a business, for the customer. Ask the customer to confirm the items and total first. Use names from the business's menu (business_info). Delivery is paid up front by a link we text the customer.business* Business id from find_businesses, like corner-bakery · items* What to order, like "2 croissant, 1 oat latte (extra hot)" · pickup_time When it should be ready, from business_info ("YYYY-MM-DD HH:MM" in the shop local time), or "asap" · note Anything else for the business (optional) · delivery_address For delivery: the full address. Leave empty for pickup · delivery_instructions For delivery: gate code, floor, where to leave it (optional) |
cancel_order | acts | Cancel one of the customer's pickup orders before it's ready.business* Business id from find_businesses, like corner-bakery · order_id* Order id, like O-1001 |
send_message | acts | Send a message or request to a business for the customer: a quote request, a question, a special order, a hold, a call-back. The owner replies by text; check my_bookings for the reply.business* Business id from find_businesses, like corner-bakery · message* The message, in the customer's words, with the details the business needs |
What a search returns
find_businesses returns up to 10 results. Each has on_blip, capabilities (quote, book_visit, book_class, order, pickup_delivery, message) and access: book_here for a business on blip, or contact_directly for a listed business that isn't (with its phone or website and a next_step). Never try to book a listed business that isn't on blip.
Worked example
# MCP 2026-07-28: no handshake and no session. Each request says its version in _meta and in headers.
curl -s https://blip.diwas.ai/mcp -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2026-07-28' -H 'Mcp-Method: tools/call' -H 'Mcp-Name: find_businesses' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"find_businesses","arguments":{"query":"plumber","zip":"94110"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"my-agent","version":"1"},"io.modelcontextprotocol/clientCapabilities":{}}}}'
# Older clients (2025-03-26 to 2025-11-25): initialize, then send the Mcp-Session-Id it returns.
curl -s https://blip.diwas.ai/mcp -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"my-agent","version":"1"}}}'
Protocols
The same businesses are reachable over the Personal Agent Protocol and PACT. Questions: Support.