AirShelf Catalog
REMOTE · MCP.AIRSHELF.AI
Cross-vendor B2B catalog for AI agents: search, compare, find equivalents, request a quote.
Available components
Last scanned (13 hours ago)
Scores higher than 66% of remote servers
Reachable. Last reached 24 Oct 2026.
Category E-commerce
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (request_quote). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability35
- 0% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Fail
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 4164 tokens (~378/item across 11 items; 8 tools + 3 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 24 Oct 26 0
- Tool “search_catalog” rewrote its description, which is the text the model reads security
- “search_catalog” reworded the description of “category” cosmetic
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 24 Sept 26 0
- Tool “search_catalog” rewrote its description, which is the text the model reads security
- “search_catalog” added an optional parameter “merchant” cosmetic
- “search_catalog” reworded the description of “category” cosmetic
- 22 Sept 26 0
- “get_product” reworded the description of “slug” cosmetic
- “search_catalog” reworded the description of “category” cosmetic
2 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.
- 8 Sept 26 0
- Tool “explain_product” rewrote its description, which is the text the model reads security
- Tool “get_product” rewrote its description, which is the text the model reads security
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Aug 26 0
- Stability: 0.97 → pass security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 24 Oct 2026 · Probed https://mcp.airshelf.ai/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=*.airshelf.ai | CN=YR1,O=Let's Encrypt,C=US | 13 Sept 2026 | 12 Dec 2026 | RSA 2048 | SHA256-RSA | 5c92b99727d463631ba98a607a67a0e627b |
| SANs: *.airshelf.ai, airshelf.ai | ||||||
| CN=YR1,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | a20253f15f2691c05dc1ce13b9bcca4e |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.airshelf.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 3799 | 8 | Verified |
| airshelf.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.airshelf.ai/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.airshelf.ai/mcp | HTTPS enforced | 308 | https://mcp.airshelf.ai/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
compare_products Compare products ~195
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). Branch on each item's commercial_data.actionable before using price or stock; stale observations are withheld from action fields. A slug that does not resolve comes back as not_found with a did_you_mean suggestion. The `provenance` option adds the source page and source type already stored with each fact.
| Name | Type | Req | Description |
|---|---|---|---|
| provenance | boolean | – | Include the stored source page and source type for each fact |
| slugs | array | yes | Catalog slugs to compare |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | – | – |
| items | array | yes | – |
No examples provided.
explain_product Explain how a record was built ~130
Explain the evidence behind a catalog row. Returns stored processing stages when available and always returns a golden-record field summary with source coverage. A field's evidence_sha256 is the SHA-256 of the source document AirShelf archived when it extracted that claim. A caller holding the same bytes can compare the hash to check that the cited document has not changed. AirShelf does not serve those archived bytes, and the hash does not promise they remain retrievable. record.scraped_at is the catalog row's scrape time, not a per-claim evidence capture time.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Composite slug to explain |
| Name | Type | Req | Description |
|---|---|---|---|
| canonical_name | string | – | – |
| category | string | – | – |
| count | number | – | – |
| note | string | – | – |
| record | – | – | – |
| sku | string | – | – |
| slug | string | – | – |
| trace | – | – | – |
| trace_status | string | – | – |
No examples provided.
find_products Discover and verify products for a need ~468
Discover candidate products for a buyer need. Takes a need in natural language (e.g. "best value home espresso machine", market "TH"), checks the verified catalog first, then uses live web discovery only when the catalog has no candidates. Returns up to 3 candidates with explicit fit accounting. find_products is the quick candidate-list tool; research_shopping is the full verified-research job. For a specific brand+model, search_catalog is cheaper and returns the same live-lookup block on a miss. Response fields: • candidates[].verification — "catalog-candidate" for a catalog starting point whose fit still needs checking, or "live-unverified" for a live page read during this run. • candidates[].status — "resolved" means both identity and the parsed buyer constraints were supported by the cited page; "abstain" means identity or need fit could not be established. Inspect constraint_check for matched, conflicting, and unverified requirements. • candidates[].constraint_check.receipts maps each receipt-backed matched requirement to its supporting source URL and trust label. • 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 — "no_match" means discovery ran but no candidate was confirmed as satisfying the need; "disabled", "rate_limited", or "unavailable" means no discovery ran. • live_discovery.status="unavailable" means receipted catalog candidates were returned while live discovery was unavailable. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| market | string | – | Buyer market as ISO 3166-1 alpha-2 country code (e.g. "TH"). Biases discovery and marketplace checks toward seller pages serving that country and scopes the cache; availability is not a stock guarant… |
| max | integer | – | Max candidates to verify (each costs a live lookup; capped at 3). |
| need | string | yes | The buyer need in natural language, e.g. "quiet mechanical keyboard for open office" or "best value home espresso machine". |
| Name | Type | Req | Description |
|---|---|---|---|
| candidates | array | yes | – |
| error | string | – | – |
| guidance | string | – | – |
| live_discovery | object | – | – |
| market | – | – | – |
| need | string | – | – |
| reason | string | – | – |
| serp_considered | number | – | – |
| status | string | – | – |
| took_ms | number | – | – |
| verification | string | – | – |
No examples provided.
get_product Get product details ~308
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). A field's evidence_sha256 is the SHA-256 of the source document AirShelf archived when it extracted that claim. A caller holding the same bytes can compare the hash to check that the cited document has not changed. AirShelf does not serve those archived bytes, and the hash does not promise they remain retrievable. Branch on commercial_data.actionable before using price or stock: observations older than 24 hours are withheld from latestPrice and retained only as labelled last_observed history. 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. related_products — relationships extracted from vendor documents (e.g. compatible toner or drum accessories with their source quotes, functional equivalents, supersessions); each entry names the related catalog slug, the relation type, its direction (direction is "from_this" when the relation reads this-product → related-product, "to_this" when it reads related-product → this-product), and the source URL and quote the relation was extracted from.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Composite slug, e.g. toshiba-b-ex4t1-ts12-qm-r |
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| benefits | array | – | – |
| buttonLabel | string | yes | – |
| buyUrl | string | – | – |
| imageUrl | string | – | – |
| pricing_gated | boolean | – | – |
| product | object | – | – |
| productId | string | yes | – |
| related_products | array | – | Documented related catalog products, including accessories, equivalents and replacements. |
| title | string | yes | – |
No examples provided.
list_merchants List merchants ~58
List public AirShelf merchants that have an assigned slug and at least one active product. Internal/demo and empty catalogs are excluded. Returns each merchant's name, slug, and product count; the slug is the `merchant` argument for request_quote.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| merchants | array | yes | – |
| total | number | – | – |
No examples provided.
request_quote Request a quote from a merchant ~288
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.
| Name | Type | Req | Description |
|---|---|---|---|
| brandSlug | string | – | Manufacturer slug (from search results) — required with merchant:"airshelf-network" so the lead reaches the right brand |
| contact | object | yes | Buyer contact details |
| merchant | string | yes | Merchant slug or id (from list_merchants), or "airshelf-network" for network-catalog brands |
| notes | string | – | Any extra context from the buyer |
| products | array | – | Catalog slugs the buyer is interested in; may be omitted when attaching contact to a rep desk reference |
| quantity | integer | – | Units the buyer wants |
| reference | string | – | Rep desk trace returned by ask, so confirmed contact reaches the same request |
| Name | Type | Req | Description |
|---|---|---|---|
| next_step | string | – | – |
| reference_number | string | – | – |
| status | string | – | – |
No examples provided.
research_shopping Research a considered purchase ~316
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. Unsafe medical, legal, financial-advice, and professional-service asks return status "refused" before any work is queued. 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"}.
| Name | Type | Req | Description |
|---|---|---|---|
| answers | object | – | Answers to clarification questions. Set accept_defaults:true to accept budget and market defaults; it does not waive product type, use case, or must-have requirements. |
| market | string | – | Buyer market as an ISO 3166-1 alpha-2 country code. Biases discovery and marketplace checks toward seller pages serving that country; availability is not a stock guarantee. |
| need | string | – | Buyer need in natural language. Required when starting a new research run. |
| persona | string | – | Research persona; b2b produces a quotation/RFQ pack. |
| research_id | string | – | Existing research run identifier to read instead of starting a new run. |
| Name | Type | Req | Description |
|---|---|---|---|
| accepted_defaults | object | – | – |
| dossier | – | – | – |
| elapsed_seconds | number | – | – |
| eta_seconds | – | – | – |
| outcome | – | – | – |
| questions | array | – | – |
| reason | string | – | – |
| research_id | string | – | – |
| stage | – | – | – |
| stage_counters | object | – | Progress counters for a running research job. Individual counters may be absent. |
| status | string | yes | – |
No examples provided.
search_catalog Search product catalog ~1,079
Search the AirShelf cross-vendor product catalog by natural-language query. The catalog covers industrial-automation, wiring-devices, digital-signage, business-display, memory-storage, mfp, barcode-printer, laser-printer, inkjet-printer, mechanical-keyboards, cybersecurity, threat-intelligence-platform. Industrial-automation and wiring-device rows are indexed by manufacturer part number, so a brand or part number in the query ("Pepperl+Fuchs retroreflective sensor", "IN5409") retrieves more reliably than a bare product type; those rows carry no normalized spec facets, so the `specs` filter does not apply to them. Returns ranked products with prices, specs, and per-row match accounting. Each row includes `unverified_specs`, the normalized spec names that lack claim-level receipts; never use those as decisive facts. Example queries: "tactile mechanical keyboard under $150", "Toshiba A3 colour multifunction device", "industrial barcode printer for a warehouse", "threat-intelligence platform with dark-web monitoring". 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 and matched_criteria — query constraints supported by claim-level receipts. unverified_criteria names matching catalog values that still need confirmation; missing_criteria names values that are absent or conflict. • 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. • result.commercial_data — branch on actionable before using price or stock. Observations older than 24 hours are withheld from result.price/result.inStock and retained only as labelled last_observed history. • parsed.weak_match — the response contains an unresolved constraint, q…
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Optional category filter (industrial-automation, wiring-devices, digital-signage, business-display, memory-storage, mfp, barcode-printer, laser-printer, inkjet-printer, mechanical-keyboards, cybersec… |
| limit | integer | – | Max results |
| market | string | – | Buyer market as an assigned ISO 3166-1 alpha-2 country code (e.g. "TH", "AU"). Conflicting country receipts are excluded; global URLs remain market-unverified. |
| merchant | string | – | Optional merchant slug (e.g. "toshiba", "cyble") from list_merchants. Scopes the search to that merchant's own shelf, which is a SEPARATE substrate from the cross-vendor catalog: it is reached only w… |
| q | string | yes | Natural-language query, at most 200 characters. Supports budget hints (e.g. "under $150"). |
| specs | object | – | Hard spec facets, e.g. {"form_factor":"desktop","print_speed_ppm":33}. Filters by exact/range spec match. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | – | – |
| parsed | object | – | – |
| query | string | – | – |
| reason | string | – | – |
| results | array | yes | – |
| status | string | – | – |
| tier3 | object | – | – |
| took_ms | number | – | – |
No examples provided.
How do I install the AirShelf Catalog MCP server?
AirShelf Catalog is a hosted endpoint at https://mcp.airshelf.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.airshelf.ai
claude mcp add --transport http ai-airshelf-catalog 'https://mcp.airshelf.ai/mcp'
What is the AirShelf Catalog MCP server?
AirShelf Catalog is an MCP server listed in the public MCP registry as ai.airshelf/catalog. Cross-vendor B2B catalog for AI agents: search, compare, find equivalents, request a quote. This page covers its hosted endpoint (https://mcp.airshelf.ai/mcp).
Is the AirShelf Catalog MCP server safe to use?
AirShelf Catalog scores 74 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the AirShelf Catalog MCP server expose?
AirShelf Catalog exposes 8 tools: search_catalog, find_products, research_shopping, get_product, compare_products, and 3 more. Their descriptions and schemas cost roughly 2,842 tokens of context every time the server is loaded.
Does the AirShelf Catalog MCP server require authentication?
No. We connected to AirShelf Catalog without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the AirShelf Catalog MCP server still maintained?
AirShelf Catalog is still listed as active in the MCP registry. We last reached this channel on 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.