# AirShelf Catalog MCP server

Cross-vendor B2B catalog for AI agents: search, compare, find equivalents, request a quote.

## Links
- Registry page: https://www.getdrio.com/mcp/ai-airshelf-catalog

## Install
- Endpoint: https://mcp.airshelf.ai/mcp
- Auth: Not captured

## Setup notes
- Remote endpoint: https://mcp.airshelf.ai/mcp

## Tools
- search_catalog (Search product catalog) - Search the AirShelf cross-vendor product catalog by natural-language query, across any brand and category (e.g. flowers, jewelry, skincare, chocolate, apparel, keyboards, office printers, industrial hardware). Returns ranked products with prices, specs, and per-row match accounting.
Example queries: "birthday bouquet under $80", "minimalist gold necklace", "Toshiba A3 colour multifunction device", "tactile mechanical keyboard under $150".

Result fields:
• canonical_name — the exact catalog name of the product.
• spec_absence_note — spec fields absent from this product's golden record (AirShelf's verified product record); null when nothing is missing.
• constraint_match_score, matched_criteria, missing_criteria — which of the query's spec constraints the row satisfies.
• parsed.price_availability — all_null = true means every returned price is null. For quote-gated B2B pricing, a null price with a quote path is expected rather than an error; query_had_budget reports whether the query carried one.
• parsed.weak_match — the catalog could not satisfy the query's constraints, so the rows are approximate. parsed.no_match — no product satisfies a hard constraint, and candidates violating it were excluded server-side.

On a miss or near-miss for a specific brand+model the response may also carry a `tier3` block, meaning a real-time lookup for the exact SKU asked about; it can appear alongside fuzzy-neighbour rows.
• tier3.status = "resolved" — a single-source reading of the page at tier3.source_url. MPN-confirmed means the live lookup matched the manufacturer part number. Its verification is "live-unverified": confirmed on a live page during this run, but not yet matched to an AirShelf catalog record. A verified row is matched to the catalog record. tier3.cached = true means it came from a recent prior lookup, with fetched_at recording when the page was read.
• tier3.status = "abstain" — the lookup could not confirm the product exists as asked, so no specs, price, or availability were established. tier3.guidance describes the quote-request path.
No tier3 block on a miss means the lookup did not run (disabled, rate-limited, or no parseable product identity in the query).

Optional `market` (ISO 3166-1 alpha-2, e.g. "TH") biases the live lookup toward seller pages serving that country and scopes its cache. "Available in <market>" means the seller page serves that market, not that stock is guaranteed. Endpoint: https://mcp.airshelf.ai/mcp
- find_products (Discover and verify products for a need) - Discover candidate products for a buyer need the verified catalog does not cover, and verify each one. Takes a need in natural language (e.g. "best value home espresso machine", market "TH"), runs a live web search, and returns up to 3 candidates, each independently checked by a live lookup against a fetched source page.

find_products is the quick candidate-list tool; research_shopping is the full verified-research job. This applies when the need is described rather than named and search_catalog returned weak_match or nothing. For a specific brand+model, search_catalog is cheaper and returns the same live-lookup block on a miss.

Response fields:
• candidates[].verification — always "live-unverified": confirmed on a live page during this run, but not yet matched to an AirShelf catalog record. A verified result is matched to that catalog record.
• candidates[].status — "resolved" means MPN-confirmed, with the live page matched against the manufacturer part number; "abstain" means the product could not be confirmed to exist as named, so no specs, price, or availability were established.
• Candidates come from current web-search results, so they are a sample of what the market offers rather than a ranking.
• status at the top level — "disabled" or "rate_limited" means no discovery ran.

Optional `market` (ISO 3166-1 alpha-2) biases discovery and marketplace checks toward seller pages serving that country and scopes the lookup cache. "Available in <market>" means the seller page serves that market, not that stock is guaranteed. Endpoint: https://mcp.airshelf.ai/mcp
- research_shopping (Research a considered purchase) - research_shopping is the full verified-research job; find_products is the quick candidate-list tool. It runs as a background job and returns status "running" with a research ID while the minutes-long research continues; the same research ID returns the run on later polls until completion. Completed runs return a researched recommendation with per-claim source receipts, or an explicit refusal when evidence is insufficient. Missing decision details return clarification questions before research starts. `market` biases discovery and marketplace checks toward seller pages serving that country; "available in <market>" means the seller page serves that market, not that stock is guaranteed. Example answer keys include {"budget":"500 USD","market":"US","category":"espresso machine"}. Endpoint: https://mcp.airshelf.ai/mcp
- get_product (Get product details) - Get the full golden record (AirShelf's verified product record) and latest price for one catalog product by slug ("<manufacturer>-<model>").

Returns the product's specs and provenance (which page each fact came from), plus canonical_name (its exact catalog name). For quote-gated B2B pricing, a null price with a quote path is expected rather than an error. In clients that render MCP Apps the response also draws one product card per call. Endpoint: https://mcp.airshelf.ai/mcp
- compare_products (Compare products) - Compare 2-10 catalog products side-by-side on their datasheet specs. Slugs come from search_catalog and are case-insensitive and dash-tolerant ("e-STUDIO 331AC", "toshiba-e-studio-331ac" and "e-studio331ac" all resolve to the same product).

Returns one item per product with canonical_name and spec_absence_note (spec fields absent from that product's golden record, AirShelf's verified product record). A slug that does not resolve comes back as not_found with a did_you_mean suggestion. The `provenance` option adds the page each fact came from and a signed-attestation URL. Endpoint: https://mcp.airshelf.ai/mcp
- explain_product (Explain how a record was built) - Return the build trace for a SKU: every processing stage that produced this catalog row, including costs and outcomes. Endpoint: https://mcp.airshelf.ai/mcp
- list_merchants (List merchants) - List the AirShelf merchants whose catalogs are searchable and who can receive a quote request, across every category. Returns each merchant's name, slug, and product count; the slug is the `merchant` argument for request_quote. Endpoint: https://mcp.airshelf.ai/mcp
- request_quote (Request a quote from a merchant) - Send a quote request for catalog products to a merchant's sales team on behalf of a named buyer.

This is a two-step, double opt-in flow. The first call emails a confirmation link to `contact.email` and returns status "confirmation_required"; no lead exists and no merchant is contacted until the buyer confirms. A later call with the same arguments reports "awaiting_confirmation" while the email is unconfirmed, or "received" with a reference_number after confirmation.

Merchant slugs come from list_merchants. Network-catalog brands that are absent from that list use merchant:"airshelf-network" with brandSlug:"<manufacturer-slug>"; AirShelf routes the confirmed request to that brand. Endpoint: https://mcp.airshelf.ai/mcp

## Resources
- ui://airshelf/product-card.html - MIME type: text/html;profile=mcp-app
- ui://airshelf/nda-gate.html - MIME type: text/html;profile=mcp-app
- ui://airshelf/sealed-quote.html - MIME type: text/html;profile=mcp-app

## Prompts
Not captured

## Metadata
- Owner: ai.airshelf
- Version: 1.0.0
- Runtime: Streamable Http
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Jun 16, 2026
- Source: https://registry.modelcontextprotocol.io
