AirShelf Catalog
Server Details
Cross-vendor B2B catalog for AI agents: search, compare, find equivalents, request a quote.
- Status
- Healthy
- Uptime
- 100.0% over 80 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- AirShelf
TDQS
Scored across 8 tools
The three discovery-ish tools (search_catalog, find_products, research_shopping) overlap in intent, but the descriptions explicitly define a cost/depth hierarchy (quick candidate list vs. full research job vs. exact brand+model lookup). get_product, explain_product, and compare_products also share evidence/provenance concepts, yet each has a distinct shape (single record, evidence audit, multi-item diff) and the descriptions cross-reference each other.
All eight tools use lowercase snake_case verb_noun form (compare_products, get_product, search_catalog, request_quote, list_merchants). research_shopping is slightly less literal but still follows the same pattern and is easy to place alongside the other discovery tools.
Eight tools is well within the ideal 3-15 range for a product-catalog server. Each tool maps to a distinct buyer workflow: search, inspect, compare, audit evidence, discover, deep research, list sellers, and request quotes.
The surface covers the main lifecycle: discovery → lookup → comparison → evidence → merchant listing → quote request, plus async research. Minor gaps remain: there is no way to browse/enumerate catalog categories or paginate a catalog listing, and no standalone quote-status or merchant-detail tool (request_quote doubles as status, and merchant info is only name/slug/count).
Available Tools
8 toolscompare_productsCompare productsARead-onlyInspect
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. An item's commercial_disclosure is present when its maker is a seller AirShelf serves through its own agent endpoints. 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 | Required | Description | Default |
|---|---|---|---|
| slugs | Yes | Catalog slugs to compare | |
| provenance | No | Include the stored source page and source type for each fact |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: it discloses the per-product return shape (canonical_name, spec_absence_note), the actionable/stale-observation gating on commercial_data, what commercial_disclosure signals about the seller relationship, and the not_found/did_you_mean failure mode. Nothing here contradicts readOnlyHint=true, destructiveHint=false — it is a pure read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core comparison behavior and cardinality, then progressively de-risks with slug formatting and response branching. It is dense but each sentence carries information; the final provenance sentence is the one piece that largely repeats the schema and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only comparison tool with an output schema, this covers everything an agent needs: valid inputs, failure handling, and how to interpret the commercially sensitive fields before acting on them. The spec_absence_note and golden-record framing also pre-empt misreading absent specs as zeros.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining slug normalization and tolerance with concrete examples that the schema's 'Catalog slugs to compare' does not convey. The provenance option is only restated from the schema, so it adds no new meaning there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — compare 2-10 catalog products side-by-side on datasheet specs — with an explicit cardinality bound. It is clearly distinguishable from siblings like get_product and search_catalog, which fetch rather than compare across multiple items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent where slugs come from (search_catalog) and how to format them (case-insensitive, dash-tolerant, with three worked variants), which is the practical prerequisite for calling the tool. It does not explicitly say when to prefer get_product or explain_product instead when only one product is of interest, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_productExplain how a record was builtARead-onlyInspect
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 | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Composite slug to explain |
Output Schema
| Name | Required | Description |
|---|---|---|
| sku | No | |
| note | No | |
| slug | No | |
| count | No | |
| trace | No | |
| record | No | |
| category | No | |
| trace_status | No | |
| canonical_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description discloses the meaning of evidence_sha256, clarifies that AirShelf does not serve archived bytes, and distinguishes record.scraped_at from per-claim capture time. These are significant behavioral details that prevent misinterpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each adding a distinct piece of information: purpose, output, hash semantics, and timestamp clarification. It is front-loaded with the core purpose and avoids redundancy, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description does not need to list return fields, but it adds critical clarifications about hash usage and timestamp interpretation. It covers the key behavioral aspects thoroughly, though it omits potential error conditions, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides a description for the single parameter slug ('Composite slug to explain'), so coverage is 100%. The description does not add further parameter-specific meaning beyond referring to the catalog row, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool explains the evidence behind a catalog row, and specifies it returns processing stages and a golden-record field summary with source coverage. This distinguishes it from sibling tools like get_product or compare_products, which focus on retrieval or comparison rather than provenance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when evidence or provenance is needed, but it does not explicitly compare with alternatives or state when not to use it. It gives context on what the tool returns, but no direct routing guidance, so it is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_productsDiscover and verify products for a needARead-onlyInspect
Discover candidate products for a buyer need. Takes a need in natural language (e.g. "best value home espresso machine", market "TH"), Unless the need is out of scope or live discovery is off or rate-limited, each call reads the verified catalog and also runs live web discovery, which sends the need text to web-search providers. A confirmed live result is returned when there is one; catalog candidates are returned instead when live discovery is unavailable, rate-limited, fails, or confirms no fit. 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-verified" for a catalog row whose stated requirements each have a receipt, "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. • Live 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 no candidate was confirmed as satisfying the need; "disabled" means live discovery is off and no candidates are returned; "rate_limited" or "unavailable" means no discovery ran and no catalog candidate was found.
• 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 " means the seller page serves that market, not that stock is guaranteed.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max candidates to verify (each costs a live lookup; capped at 3). | |
| need | Yes | The buyer need in natural language, e.g. "quiet mechanical keyboard for open office" or "best value home espresso machine". | |
| market | No | 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 guarantee. |
Output Schema
| Name | Required | Description |
|---|---|---|
| need | No | |
| error | No | |
| market | No | |
| reason | No | |
| status | No | |
| took_ms | No | |
| guidance | No | |
| candidates | Yes | |
| verification | No | |
| live_discovery | No | |
| serp_considered | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations: it discloses that each call sends the need text to web-search providers (a real privacy/egress signal), that live results are a sample not a ranking, and how fallback behaves when discovery is rate-limited, unavailable, fails, or finds no fit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening two sentences and the sibling routing are well front-loaded, but the large bulleted response-fields block largely restates a return contract that an output schema already declares, making the definition noticeably heavier than needed for the decision it supports.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter, open-world, live-network tool the description is nearly complete: degradation states, candidate status semantics, and egress are all covered. It is slightly over-complete on return values that the output schema already carries, which is redundancy rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns an extra point by clarifying what market actually means ('Available in <market>' means the seller page serves that market, not a stock guarantee) and by explaining the cap on max via 'Returns up to 3 candidates'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (discover) and resource (candidate products) plus the input form (natural-language need, market). It also positions itself precisely against siblings: 'find_products is the quick candidate-list tool; research_shopping is the full verified-research job' and search_catalog for a specific brand+model.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit alternatives with selection conditions are given for both siblings (research_shopping for full research, search_catalog when a specific brand+model is known and cheaper). The description also names exclusions — out-of-scope needs, live discovery off, rate-limited — so an agent knows when the tool degrades or does not run.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productGet product detailsARead-onlyInspect
Get the full golden record (AirShelf's verified product record) and latest price for one catalog product by slug ("-").
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. product.commercial_disclosure is present when the product's maker is a seller AirShelf serves through its own agent endpoints (relationship "onboarded_merchant"). 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 | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Composite slug, e.g. toshiba-b-ex4t1-ts12-qm-r |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | Yes | |
| action | Yes | |
| buyUrl | No | |
| product | No | |
| benefits | No | |
| imageUrl | No | |
| productId | Yes | |
| buttonLabel | Yes | |
| pricing_gated | No | |
| related_products | No | Documented related catalog products, including accessories, equivalents and replacements. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/non-destructive annotations, the description discloses provenance hash semantics, that AirShelf does not serve or guarantee the archived bytes, the 24-hour latestPrice withholding rule, quote-gated null behavior, commercial_disclosure conditions, MCP Apps card rendering, and related_products direction semantics. These are substantive behavioral traits not covered by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and most sentences carry meaningful caveats, but the description is very long for a one-parameter read tool. It spends substantial text explaining return-shape details even though an output schema exists, and the single-block format makes later caveats harder to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex catalog lookup with rich output, the description covers provenance, price staleness, quote-gated nulls, merchant disclosure, and related-product relations, so an agent has enough context to invoke and interpret it. The main gap is explicit sibling routing rather than missing operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required slug parameter with 100% schema description coverage, and the schema already gives a composite slug example. The description restates the '<manufacturer>-<model>' format but adds no syntax, constraints, or edge cases beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb ('Get'), resource ('full golden record... latest price'), and scope ('one catalog product by slug'), and gives the slug shape. This clearly separates it from catalog search/find/compare siblings, even without naming them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to interpret returned commercial data, including branching on commercial_data.actionable and expecting null quote-gated prices. However, it never states when to choose this tool over find_products, search_catalog, or explain_product; the requirement for a composite slug only implies that discovery happens elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_merchantsList merchantsARead-onlyInspect
List public AirShelf merchants that have an assigned slug and at least one active product. Every listed merchant has an account with AirShelf; catalog makers without one are not listed. 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| merchants | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnly and non-destructive annotations already make the safety profile clear. Beyond them, the description discloses the exclusion rules that matter for interpreting results: no internal/demo catalogs, no empty catalogs, and no catalog makers lacking an AirShelf account. It says nothing about pagination or ordering, but in all other respects it is richer than the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, and the sentence that states the tool's core scope comes first. The sentence about the return fields and the sentence about the request_quote link each carry distinct information, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so field-level return documentation is not required. The description still fills the remaining gaps: which merchants appear in that schema, which are filtered out, and how a returned slug is consumed by a sibling tool, so an agent has everything it needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4 and there is nothing to document. The description correctly imposes no argument burden on the caller and instead documents the one output field that is an input elsewhere (slug feeding request_quote).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List public AirShelf merchants') plus the exact inclusion criteria: assigned slug and at least one active product. This is enough to separate it from every sibling, all of which operate on products or quotes rather than merchants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the downstream use case clearly: 'the slug is the `merchant` argument for request_quote', which tells an agent when this tool is the right first step. It does not name an alternative or an explicit case where this tool should be avoided, but no sibling lists merchants, so there is nothing to route against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_quoteRequest a quote from a merchantADestructiveInspect
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:""; AirShelf routes the confirmed request to that brand.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Any extra context from the buyer | |
| contact | Yes | Buyer contact details | |
| merchant | Yes | Merchant slug or id (from list_merchants), or "airshelf-network" for network-catalog brands | |
| products | No | Catalog slugs the buyer is interested in; may be omitted when attaching contact to a rep desk reference | |
| quantity | No | Units the buyer wants | |
| brandSlug | No | Manufacturer slug (from search results) — required with merchant:"airshelf-network" so the lead reaches the right brand | |
| reference | No | Rep desk trace returned by ask, so confirmed contact reaches the same request |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| next_step | No | |
| reference_number | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag it as a non-read-only, open-world, destructive write. The description adds substantial context beyond that: the double opt-in flow, that no lead exists and no merchant is contacted until confirmation, and the exact status strings ("confirmation_required", "awaiting_confirmation", "received") plus the reference_number returned. This is exactly the extra behavioral detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight paragraphs, front-loaded with purpose followed by flow and edge-case routing. Every sentence carries information, though the density is high and could be marginally trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with nested objects and an output schema, the description covers the flow, status states, required identifier sourcing, and the network-brand edge case. Since an output schema exists, return values need not be explained, and nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real meaning beyond the schema by explaining the merchant/brandSlug relationship for airshelf-network and clarifying the merchant slug source, though it does not elaborate on reference, quantity, or products syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource and actor: 'Send a quote request for catalog products to a merchant's sales team on behalf of a named buyer.' It is clearly distinct from the read-oriented siblings (find_products, get_product, list_merchants) and references list_merchants as the source of merchant slugs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong conditional guidance: merchant slugs come from list_merchants, and network-catalog brands absent from that list must use merchant:"airshelf-network" with brandSlug. It also explains the two-step opt-in sequence. It stops short of stating when NOT to use this tool versus an alternative, so it does not reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_shoppingResearch a considered purchaseAInspect
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 " 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 | Required | Description | Default |
|---|---|---|---|
| need | No | Buyer need in natural language. Required when starting a new research run. | |
| market | No | 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. | |
| answers | No | 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. | |
| persona | No | Research persona; b2b produces a quotation/RFQ pack. | |
| research_id | No | Existing research run identifier to read instead of starting a new run. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stage | No | |
| reason | No | |
| status | Yes | |
| dossier | No | |
| outcome | No | |
| questions | No | |
| eta_seconds | No | |
| research_id | No | |
| stage_counters | No | Progress counters for a running research job. Individual counters may be absent. |
| elapsed_seconds | No | |
| accepted_defaults | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by disclosing async execution, polling via research_id, 'running'/'refused' statuses, per-claim source receipts, explicit refusal on insufficient evidence, and clarification-before-research behavior. It also clarifies the market semantics as 'seller page serves that market, not that stock is guaranteed.' This adds substantial behavioral context beyond readOnlyHint, openWorldHint, and destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description carries signal: purpose contrast, async lifecycle, refusal policy, completion output, clarification flow, market caveat, and example answer keys. It is front-loaded with the tool's purpose and contains no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 5-parameter async job, the description covers the full lifecycle: starting research, polling by research ID, receiving a completed recommendation, handling refusals, and getting clarification questions. It also explains nested and market-dependent semantics. Since an output schema exists, not restating the full return shape in prose is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented. The description adds extra meaning by explaining the market bias and by providing an example answer key for the answers object ({budget, market, category}), which helps an agent structure a nested free-form parameter. It does not redundantly re-explain need or persona.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens by stating a specific verb, resource, and scope: 'research_shopping is the full verified-research job,' and immediately contrasts it with 'find_products is the quick candidate-list tool.' The title 'Research a considered purchase' reinforces the intended use case. An agent can distinguish this tool from siblings without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly positions research_shopping against find_products, signaling that it is the slower, more thorough alternative. It also clarifies when research will not proceed: unsafe domains are 'refused' and missing decision details produce clarification questions. It does not explicitly route the agent among the other siblings like compare_products or request_quote, so some usage context is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_catalogSearch product catalogARead-onlyInspect
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", "600 dpi 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. • result.commercial_disclosure — present when the product's maker is a seller AirShelf serves through its own agent endpoints (relationship "onboarded_merchant", with its merchant_slug). Ranking does not read it. • parsed.weak_match — the response contains an unresolved constraint, query match, or product-identity warning. parsed.unverified_identity_count counts returned names without an identity receipt. 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.
• tier3.status = "declined" — an applicable lookup did not run; tier3.reason says why (disabled, rate_limited, daily_cap, negative_cache, error). No specs or availability were established, and none should be inferred.
No tier3 block at all means a live lookup was not applicable to this query (no parseable brand+model identity).
Optional market (ISO 3166-1 alpha-2, e.g. "TH") excludes catalog rows whose country-specific URL conflicts with the buyer market and scopes tier3 lookup/cache. A remaining global URL is not local-availability proof: parsed.weak_match stays true and unsatisfied_constraints includes market_availability until every returned row has a matching country receipt. "Available in " still does not guarantee stock.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Natural-language query, at most 200 characters. Supports budget hints (e.g. "under $150"). | |
| limit | No | Max results | |
| specs | No | Hard spec facets, e.g. {"form_factor":"desktop","print_speed_ppm":33}. Filters by exact/range spec match. | |
| market | No | 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. | |
| category | No | Optional category filter (industrial-automation, wiring-devices, digital-signage, business-display, memory-storage, mfp, barcode-printer, laser-printer, inkjet-printer, mechanical-keyboards, cybersecurity, threat-intelligence-platform) | |
| merchant | No | 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 when the cross-vendor catalog returns nothing, and its rows carry the merchant's own product data rather than datasheet-extracted golden records. Omit it for cross-vendor search, which is the default and the right choice for "what should I buy". |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| query | No | |
| tier3 | No | |
| parsed | No | |
| reason | No | |
| status | No | |
| results | Yes | |
| took_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: quote-gated pricing, stale commercial observations, `unverified_specs`, `weak_match`, `no_match`, and the three `tier3` statuses. These details warn the agent about interpretation and fallback behavior that annotations alone do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and structured with bullets, but it is very long and includes extensive return-field documentation even though an output schema exists. Much of that detail is useful, but it weakens conciseness by duplicating structured output information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex search tool with six parameters, nested `specs`, market-dependent behavior, and tier3 fallback logic, the description is thorough. It covers the main edge cases an agent needs to interpret results and avoid overclaiming from weak or unverified data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema, especially how `market` affects weak-match status and tier3 lookup/cache, why `specs` does not apply to certain rows, and how `merchant` switches to a separate substrate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: search the AirShelf cross-vendor product catalog by natural-language query. It also clarifies the catalog's coverage and some row-indexing behavior. It does not explicitly differentiate itself from sibling tools such as find_products, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage context: omit `merchant` for default cross-vendor search, use it only when the cross-vendor catalog returns nothing, and note that `specs` does not apply to industrial-automation and wiring-device rows. However, it does not explicitly name or exclude sibling alternatives, so it is clear but not fully comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
search_catalog1 field changed- changed
Input schema / properties / category / descriptionPrevious value: -"Optional category filter (industrial-automation, wiring-devices, digital-signage, business-display, mfp, barcode-printer, laser-printer, inkjet-printer, mechanical-keyboards, cybersecurity, threat-intelligence-platform)"New value: +"Optional category filter (industrial-automation, wiring-devices, digital-signage, business-display, memory-storage, mfp, barcode-printer, laser-printer, inkjet-printer, mechanical-keyboards, cybersecurity, threat-intelligence-platform)"
1 tool update
- Changed
request_quote5 fields changed- added
Input schema / properties / products / defaultAdded value: +[] - changed
Input schema / properties / products / descriptionPrevious value: -"Catalog slugs the buyer is interested in"New value: +"Catalog slugs the buyer is interested in; may be omitted when attaching contact to a rep desk reference" - removed
Input schema / properties / products / minItemsRemoved value: -1 - added
Input schema / properties / referenceAdded value: +{ + "description": "Rep desk trace returned by ask, so confirmed contact reaches the same request", + "pattern": "^REQ-[A-Z0-9-]{1,4}-[A-Z0-9]{6}$", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "merchant", - "products", - "contact" -]New value: +[ + "merchant", + "contact" +]
1 tool update
- Changed
search_catalog1 field changed- added
Input schema / properties / merchantAdded value: +{ + "description": "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 when the cross-vendor catalog returns nothing, and its rows carry the merchant's own product data rather than datasheet-extracted golden records. Omit it for cross-vendor search, which is the default and the right choice for \"what should I buy\".", + "pattern": "^[a-z0-9][a-z0-9-]{0,62}$", + "type": "string" +}
4 tool updates
- Changed
get_product6 fields changed- added
Output schema / properties / product / propertiesAdded value: +{ + "cited_field_count": { + "description": "Number of golden-record fields with claim-level citations.", + "type": "number" + }, + "field_count": { + "description": "Total golden-record fields used as the evidence coverage denominator.", + "type": "number" + }, + "latestPrice": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "capturedAt": { + "type": "string" + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "inStock": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "price": { + "type": "number" + }, + "retailer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "price", + "currency", + "retailer", + "inStock", + "capturedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Latest valid price observation within 24 hours. Null when absent or stale; stale history remains in commercial_data.last_observed." + }, + "lifecycle_status": { + "description": "Retirement marker from stored product evidence. current means no retirement marker was found.", + "enum": [ + "current", + "retired" + ], + "type": "string" + }, + "pdfFilenames": { + "description": "Stored source PDF filenames. A filename is not a download URL.", + "items": { + "type": "string" + }, + "type": "array" + }, + "qualityScore": { + "description": "Percentage of golden-record fields with claim-level citations. Zero when there are no fields.", + "type": "number" + }, + "related_products": { + "description": "Documented related catalog products, including accessories, equivalents and replacements.", + "items": { + "additionalProperties": {}, + "properties": { + "direction": { + "description": "from_this means this product points to the related product; to_this means the reverse.", + "enum": [ + "from_this", + "to_this" + ], + "type": "string" + }, + "relation": { + "description": "Relationship type recorded from vendor documents.", + "type": "string" + }, + "slug": { + "type": "string" + }, + "source": { + "anyOf": [ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Stored source URL, quote, section or page for the relationship; null when none was recorded." + } + }, + "required": [ + "slug", + "relation", + "direction" + ], + "type": "object" + }, + "type": "array" + }, + "sources": { + "anyOf": [ + { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Stored source type, such as pdf or product_page." + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Source document or product-page URL when recorded." + } + }, + "type": "object" + }, + { + "type": "string" + } + ] + }, + "type": "array" + }, + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ], + "description": "Stored evidence sources. Imports may preserve a source object, use ref instead of url, or list plain strings. Null when unavailable." + }, + "updatedAt": { + "description": "Catalog row update time as an ISO 8601 timestamp, not a per-claim verification time.", + "type": "string" + } +} - removed
Output schema / properties / product / propertyNamesRemoved value: -{ - "type": "string" -} - added
Output schema / properties / related_products / descriptionAdded value: +"Documented related catalog products, including accessories, equivalents and replacements." - added
Output schema / properties / related_products / items / propertiesAdded value: +{ + "direction": { + "description": "from_this means this product points to the related product; to_this means the reverse.", + "enum": [ + "from_this", + "to_this" + ], + "type": "string" + }, + "relation": { + "description": "Relationship type recorded from vendor documents.", + "type": "string" + }, + "slug": { + "type": "string" + }, + "source": { + "anyOf": [ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Stored source URL, quote, section or page for the relationship; null when none was recorded." + } +} - removed
Output schema / properties / related_products / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Output schema / properties / related_products / items / requiredAdded value: +[ + "slug", + "relation", + "direction" +]
- Changed
list_merchants4 fields changed- added
Output schema / properties / merchants / items / properties / checkout_capabilityAdded value: +{ + "description": "shopify indicates a connected Shopify store; redirect sends the buyer to the product page.", + "enum": [ + "shopify", + "redirect" + ], + "type": "string" +} - added
Output schema / properties / merchants / items / properties / manifest_urlAdded value: +{ + "description": "Merchant agent manifest URL with supported endpoints and capabilities.", + "type": "string" +} - added
Output schema / properties / merchants / items / properties / products_urlAdded value: +{ + "description": "Merchant product-listing endpoint URL.", + "type": "string" +} - added
Output schema / properties / merchants / items / properties / search_urlAdded value: +{ + "description": "Merchant-scoped product-search endpoint URL.", + "type": "string" +}
- Changed
research_shopping3 fields changed- added
Output schema / properties / stage_counters / descriptionAdded value: +"Progress counters for a running research job. Individual counters may be absent." - added
Output schema / properties / stage_counters / propertiesAdded value: +{ + "candidates_found": { + "description": "Candidates found during discovery.", + "type": "number" + }, + "listings_checked": { + "description": "Market listing URLs recorded during commercial checks.", + "type": "number" + }, + "stage": { + "description": "Current pipeline stage identifier, or queued before work starts.", + "type": "string" + }, + "verified": { + "description": "Candidates examined during verification, not a count of candidates that passed.", + "type": "number" + } +} - removed
Output schema / properties / stage_counters / propertyNamesRemoved value: -{ - "type": "string" -}
- Changed
search_catalog1 field changed- changed
Input schema / properties / category / descriptionPrevious value: -"Optional category filter (industrial-automation, wiring-devices, digital-signage, business-display, mechanical-keyboards, mfp, barcode-printer, laser-printer, inkjet-printer, cybersecurity, or threat-intelligence-platform)"New value: +"Optional category filter (industrial-automation, wiring-devices, digital-signage, business-display, mfp, barcode-printer, laser-printer, inkjet-printer, mechanical-keyboards, cybersecurity, threat-intelligence-platform)"
1 tool update
- Changed
search_catalog1 field changed- changed
Input schema / properties / category / descriptionPrevious value: -"Optional category filter (industrial-automation, wiring-devices, mechanical-keyboards, mfp, barcode-printer, laser-printer, inkjet-printer, cybersecurity, or threat-intelligence-platform)"New value: +"Optional category filter (industrial-automation, wiring-devices, digital-signage, business-display, mechanical-keyboards, mfp, barcode-printer, laser-printer, inkjet-printer, cybersecurity, or threat-intelligence-platform)"
1 tool update
- Changed
get_product1 field changed- changed
Input schema / properties / slug / descriptionPrevious value: -"Composite slug, e.g. keychron-q1-pro"New value: +"Composite slug, e.g. toshiba-b-ex4t1-ts12-qm-r"
1 tool update
- Changed
search_catalog1 field changed- changed
Input schema / properties / category / descriptionPrevious value: -"Optional category filter (industrial-automation, wiring-devices, mechanical-keyboards, mfp, barcode-printer, laser-printer, cybersecurity, or threat-intelligence-platform)"New value: +"Optional category filter (industrial-automation, wiring-devices, mechanical-keyboards, mfp, barcode-printer, laser-printer, inkjet-printer, cybersecurity, or threat-intelligence-platform)"
1 tool update
- Changed
get_product1 field changed- added
Output schema / properties / related_productsAdded value: +{ + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" +}
1 tool update
- Changed
search_catalog1 field changed- changed
Input schema / properties / category / descriptionPrevious value: -"Optional category filter (mechanical-keyboards, mfp, barcode-printer, laser-printer, cybersecurity, or threat-intelligence-platform)"New value: +"Optional category filter (industrial-automation, wiring-devices, mechanical-keyboards, mfp, barcode-printer, laser-printer, cybersecurity, or threat-intelligence-platform)"
1 tool update
- Changed
find_products1 field changed- added
Output schema / properties / live_discoveryAdded value: +{ + "additionalProperties": false, + "properties": { + "guidance": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "status": { + "const": "unavailable", + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" +}
1 tool update
- Changed
find_products1 field changed- changed
Output schema / properties / status / enumPrevious value: -[ - "ok", - "no_match", - "disabled", - "rate_limited", - "error", - "refused" -]New value: +[ + "ok", + "no_match", + "disabled", + "rate_limited", + "unavailable", + "error", + "refused" +]
1 tool update
- Changed
research_shopping1 field changed- added
Output schema / properties / accepted_defaultsAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" +}
1 tool update
- Changed
search_catalog2 fields changed- added
Output schema / properties / reasonAdded value: +{ + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "enum": [ + "refused" + ], + "type": "string" +}
1 tool update
- Changed
research_shopping1 field changed- changed
Input schema / properties / answers / descriptionPrevious value: -"Answers to clarification questions. Set accept_defaults:true to explicitly waive missing dimensions."New value: +"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."
1 tool update
- Changed
search_catalog1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Buyer market as an assigned ISO 3166-1 alpha-2 country code (e.g. \"TH\", \"AU\"). It affects only tier3 live lookup and does not filter or rank global catalog rows."New value: +"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."
Related MCP Connectors
The E-commerce Marketplace For Every AI Agent. A Governed Catalog Of 600M+ US Products, Plus Four Agent Ready Capabilities Search, Price Comparison, Product-Vs-Product, And Detailed Q&A.
AI-agent product catalog: search, lookup & purchase routing over verified merchant data.
Company catalogs for AI agents: products, prices, availability. Search, read, or start one free.
The E-commerce Marketplace For Every AI Agent. A Governed Catalog Of 600M+ US Products.
Related MCP Servers
- AlicenseAqualityBmaintenanceCross-border product catalog for AI agents. Search and compare products from US and South East Asian markets via Model Context Protocol.6209 npm15MIT
- AlicenseAqualityDmaintenanceEnables AI agents to discover, compare, and select the best AI models across multiple providers based on pricing, performance, and capabilities, with real-time cost estimation and benchmarking.93,909 npm1MIT
- AlicenseAqualityFmaintenanceUniversal search engine for AI agents. Discover products, services, and businesses across every category. 10 MCP tools, zero LLM calls, millisecond responses.114AGPL 3.0
- AlicenseAqualityAmaintenanceGive your AI agent access to 8,400+ software tools — search, compare, get pricing, find alternatives, and discover the best tool for any use case.11268 npm4MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.