AirShelf Catalog
Server Details
Cross-vendor B2B catalog for AI agents: search, compare, find equivalents, request a quote.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
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. 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?
The description reveals important behaviors beyond the readOnlyHint: slug normalization with examples, the branch on commercial_data.actionable before using price/stock, staleness handling, and not_found response with did_you_mean. This gives the agent actionable behavioral context.
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 dense but efficient: it leads with the primary purpose, then covers slug acceptance, output shape, actionability, error behavior, and security bonus in focused sentences. No filler.
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 an output schema exists and annotations already declare read-only, the description still meaningfully covers the remaining context an agent needs: slug format rules, pricing/staleness caveats, not_found behavior, and provenance semantics. It is arguably complete for correct invocation and result use.
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 already covers both parameters at 100%, so baseline is 3. The description adds value by explaining slug case-insensitivity and dash-tolerance with concrete examples, plus the provenance behavior, which enriches the parametric meaning beyond the raw 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 description opens with a specific action and scope: "Compare 2-10 catalog products side-by-side on their datasheet specs." This clearly identifies the tool as a multi-product comparison and distinguishes it from siblings like get_product and explain_product.
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 clear context by stating slugs come from search_catalog and that the tool handles 2-10 products. It stops short of explicitly saying when not to use this tool versus alternatives, such as when a single product comparison is needed.
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.
| 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?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral detail beyond annotations: it discloses that processing stages are returned only 'when available' while the golden-record field summary is always returned, setting accurate expectations about conditional output.
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?
Two sentences with no filler. The core purpose is front-loaded, and the second sentence efficiently explains return behavior and guarantees. Every word earns its place.
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 single-parameter read-only tool with a full output schema, the description is complete. It explains what the tool does, what it returns, and the conditional nature of part of that return, leaving no critical gap for an agent 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?
Schema description coverage is 100% and the single parameter 'slug' is documented as a 'Composite slug to explain.' The description does not add further detail about slug format or construction, but with full schema coverage, the baseline of 3 is appropriate.
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 ('explain') and resource ('evidence behind a catalog row'), and clarifies the unique value proposition: stored processing stages plus a golden-record field summary with source coverage. This clearly distinguishes it from siblings like get_product, which would return product data 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 when to use the tool: when you need the evidence or provenance behind a catalog record. However, it does not explicitly state when not to use it or name alternatives among the sibling tools, so the agent must infer the appropriate context.
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"), 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 " 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?
Even with readOnlyHint and openWorldHint annotations, the description discloses additional behaviors: it prioritizes catalog over live discovery, explains statuses (top-level and per-candidate), clarifies that the list is a sample, and defines 'available' relative to market. It also describes cache scoping and the meaning of statuses like 'unavailable'. No contradiction with 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 description is organized with bullet points and front-loads the core purpose. Every sentence adds value, distinguishing behavior, outcomes, and statuses. No redundancy or filler.
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 tool's complexity (multiple statuses, fallback behavior, cache scoping), the description fully covers operational details: explains catalog-first strategy, live discovery fallback, result fields, and failure modes. The output schema likely covers return structure, but the description adds necessary 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?
Despite 100% schema coverage, the description adds meaningful semantics: it explains how `market` biases discovery and scopes cache, and clarifies that availability is not a stock guarantee. It also elaborates on `need` with examples and the max of 3 candidates (implied). This goes beyond the schema's field descriptions.
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 this tool 'List ALL candidates' and explicitly differentiates it from siblings: it is the 'quick candidate-list tool' while research_shopping is a 'full job' and search_catalog handles specific brand+model. The verb 'list' and resource 'candidates' are specific and unambiguous.
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 provides explicit guidance on when to use this tool versus alternatives: it is for natural-language needs, checks the catalog first, and only falls back to live discovery if necessary. It also directs users to search_catalog for specific models and to research_shopping for deeper research.
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). 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 | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Composite slug, e.g. keychron-q1-pro |
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate read-only and non-destructive behavior, but the description adds substantial behavioral context: older observations are withheld from latestPrice, null price is expected for quote-gated B2B, and related product relations have direction/source quote semantics. No contradiction with annotations exists.
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 long but front-loaded with the core action and then spends each section on important operational nuances: provenance, pricing branching, quote-gated expectations, and the related_products relation semantics. A few return-value details are likely redundant with the output schema, but the structure is organized and purposeful.
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?
The description covers the input contract, the distinguished product record, the price-related caveats, the intended handling of B2B quote null pricing, and the meaning of related product relations. For a one-parameter tool, this leaves little ambiguity about how it operates and what the returned data represents.
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 already documents slug with an example, so the baseline is 3. The description adds the slug convention ('<manufacturer>-<model>'), which provides meaningful but minimal additional clarity beyond the schema's 'Composite slug' description.
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 with a specific verb and resource: it 'get[s] the full golden record' and 'latest price for one catalog product by slug.' It adds a precise identifier format and product context, so it is clearly distinct from sibling discovery/compare tools.
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 makes the tool's context clear: it is for retrieving a specific catalog product by slug, not for search or comparison. It does not explicitly name alternatives or exclusions, but the scope is specific enough that an agent should know when to invoke it.
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. 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?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds meaningful behavioral details: it returns each merchant's name, slug, and product count, and explicitly links the slug to the `merchant` argument of request_quote. It also clarifies exclusion criteria, which goes beyond what annotations 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?
Two concise sentences cover the full scope: the main action, filtering criteria, exclusions, and return values, plus a practical cross-reference to request_quote. Every word earns its place, with no redundancy.
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 parameterless list endpoint with an output schema and read-only annotations, the description fully covers purpose, filtering, exclusions, return contents, and downstream usage of the slug. Nothing an agent needs to understand or invoke this tool 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?
The tool has zero parameters, so the schema provides no parameter information. The description does not attempt to document parameters because none exist. Following the baseline for 0 parameters (4), this score reflects that no further parameter semantics are needed or expected.
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 uses a specific verb ('List') and clearly identifies the resource (public AirShelf merchants) and the exact filters (assigned slug, at least one active product). It does not explicitly contrast with sibling tools, but the enumeration of exclusions (internal/demo, empty catalogs) adds precision beyond a generic description.
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 when to use the tool by specifying that only public merchants with active products are returned, and it notes exclusions (internal/demo, empty catalogs). However, it does not name any alternative tools or provide an explicit 'use X instead' guidance, leaving the comparison to siblings implicit.
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 | Yes | Catalog slugs the buyer is interested in | |
| 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 |
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 already indicate mutation/destructive/external effects, but the description goes far beyond: it details the double opt-in flow, states that no lead exists and no merchant is contacted until confirmation, explains the statuses returned ('confirmation_required', 'awaiting_confirmation', 'received'), and clarifies that a later call with the same arguments is required. This rich behavioral context is essential for correct invocation and is not contradicted by 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 description is four sentences, each earning its place: purpose first, then the critical two-step flow, then merchant routing. No filler, front-loaded with the core action, and structured logically. It is concise yet comprehensive.
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 tool's complexity (multi-step, double opt-in, special routing case) and the existence of an output schema, the description covers all operational details: the status flow, the need for a second call, and the merchant routing rules. Nothing an agent needs to call it correctly is missing, and the output schema presumably covers return format.
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 input schema has 100% parameter description coverage, so baseline is 3. The description adds meaningful context for the 'merchant' parameter (source via list_merchants, and the special 'airshelf-network' plus brandSlug combination) and clarifies that products are catalog slugs. This extra guidance for two parameters raises the score above baseline.
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+resource: 'Send a quote request for catalog products to a merchant's sales team on behalf of a named buyer.' This clearly distinguishes it from sibling tools like search_catalog or list_merchants, which are about discovery, not requests. The special 'airshelf-network' routing clause further sharpens the scope.
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 clear actionable guidance: merchant slugs come from list_merchants, and explains the fallback mechanism for network-catalog brands. It also describes the two-step double opt-in flow, telling the agent what to expect on first call vs subsequent calls. It does not explicitly mention when not to use this tool or name alternatives, but the sibling set has no overlapping tool, so this is adequate.
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 | |
| elapsed_seconds | No | |
| accepted_defaults | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, openWorldHint=true, destructiveHint=false), so the description carries the burden of behavioral disclosure. It rises to the occasion: async execution and polling with research_id, 'refused' status for unsafe requests before work is queued, clarification flow for missing decision details, and the market semantic ('available in <market>' does not imply stock guarantee). All credit beyond what annotations provide.
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 long (~140 words) but each clause earns its place. It front-loads the most important info first (purpose and sibling distinction), then lifecycle, then safety refusals, then market nuance, and closes with an example. It forms a single dense paragraph that could benefit from a line break or two, but it's appropriately scoped for the tool's complexity.
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 tool with this much complexity (async background jobs, polling, safety refusals, clarification flows, market nuance, personas), the description covers the critical call paths thoroughly. The output schema handles return-value documentation. The main gap is not addressing the other siblings (compare_products, get_product, etc.) or edge cases like timeout/error states, but what's here is cohesive and complete enough to call 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?
Schema coverage is 100%, so the schema already documents each parameter. The description adds genuinely useful semantics on top: the market parameter biases discovery but not stock, research_id enables polling for the async run, and the example answer key ({'budget': '500 USD', 'market': 'US', 'category': 'espresso machine'}) clarifies the answers object shape. Valuable, though some of this is also in the schema's descriptions.
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 the specific function: 'research_shopping is the full verified-research job', and immediately distinguishes its scope from sibling find_products, calling it the 'quick candidate-list tool'. It also specifies the resource (considered purchase) and the output (verified research with per-claim receipts). An agent can unambiguously tell this from the alternatives.
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 contrasts with find_products (quick candidate lists vs. full research), which is the single most likely point of confusion, and outlines the polling lifecycle (running → poll with research_id). However, it doesn't address the other six siblings or give an explicit 'use this when...' rule beyond the find_products dichotomy, so some routing decisions are left to inference.
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 components (sensors, encoders, vacuum handling, motors and drives, circuit protection, machine vision — the largest category by row count), wiring devices (plugs, receptacles, connector bodies, rocker switches), multifunction printers (mfp), barcode printers, laser printers, mechanical keyboards, cybersecurity products, and threat-intelligence platforms. 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, 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, mechanical-keyboards, mfp, barcode-printer, laser-printer, inkjet-printer, cybersecurity, or threat-intelligence-platform) |
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 goes far beyond the readOnlyHint/openWorldHint annotations with detailed, non-contradictory behavioral guidance: unverified_specs caveats, weak-match semantics, no-match handling, tier3 lookups, cached lookups, and market-verification limitations. It clearly discloses the behavioral nuances an agent needs to interpret results safely.
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 long, but the complexity is high and the structure is effective: scope, examples, result fields, tier3 states, market caveats. It is front-loaded with the main purpose and practical query guidance, and it earns most sentences through concrete warnings and field-level semantics, even if slightly dense.
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 tool's complex output semantics, 5 parameters, and output schema, the description is unusually complete. It covers retrieval behavior, ranked match accounting, result field caveats, miss/near-miss handling, tier3 resolution states, and market-dependent verification. Very little is left for an agent to guess.
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 documentation is complete, so the baseline is solid, but the description adds meaningful parameter context: query style and brand/part-number reliability, how specs are limited for certain catalog rows, and the detailed market argument effects. Supporting parameter meaning is strong, though limit and category receive little extra 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 description clearly states that this tool searches the AirShelf cross-vendor product catalog via natural-language queries, with concrete examples and category coverage. It is specific about what it does, but it does not explicitly differentiate itself from sibling tools such as find_products or research_shopping, so it misses the highest bar.
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 gives strong usage context: natural-language querying, category scope, manufacturer part-number behavior, and how market filtering changes results. It doesn't explicitly state when not to use this tool or which alternative to prefer for different tasks, but the context is clear enough for most selection cases.
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. Dates show when Glama detected each change.
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."
1 tool update
- Changed
search_catalog1 field changed- added
Input schema / properties / q / minLengthAdded value: +0
1 tool update
- Changed
find_products1 field changed- changed
Output schema / properties / status / enumPrevious value: -[ - "ok", - "no_match", - "disabled", - "rate_limited", - "error" -]New value: +[ + "ok", + "no_match", + "disabled", + "rate_limited", + "error", + "refused" +]
1 tool update
- Changed
find_products1 field changed- added
Output schema / properties / reasonAdded value: +{ + "type": "string" +}
2 tool updates
- Changed
find_products1 field changed- changed
Output schema / properties / status / enumPrevious value: -[ - "ok", - "disabled", - "rate_limited", - "error" -]New value: +[ + "ok", + "no_match", + "disabled", + "rate_limited", + "error" +]
- Changed
research_shopping1 field changed- changed
Output schema / properties / status / enumPrevious value: -[ - "needs_input", - "running", - "complete", - "failed" -]New value: +[ + "needs_input", + "running", + "complete", + "failed", + "refused" +]
1 tool update
- Changed
research_shopping1 field changed- added
Input schema / properties / personaAdded value: +{ + "description": "Research persona; b2b produces a quotation/RFQ pack.", + "enum": [ + "consumer", + "b2b" + ], + "type": "string" +}
2 tool updates
- Changed
request_quote1 field changed- added
Input schema / properties / brandSlug / minLengthAdded value: +1
- Changed
search_catalog3 fields 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, not global catalog rows."New 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." - changed
Input schema / properties / q / descriptionPrevious value: -"Natural-language query. Supports budget hints (e.g. \"under $150\")."New value: +"Natural-language query, at most 200 characters. Supports budget hints (e.g. \"under $150\")." - added
Input schema / properties / q / maxLengthAdded value: +200
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
AI-agent product catalog: search, lookup & purchase routing over verified merchant data.
AI agent product discovery via open marketplace. Search, compare and discover advertiser products.
Agent-callable B2B SaaS directory: capability-structured, continuously verified listings.
Agent-native product catalog: 300M+ products, 150,000+ stores, deliver_to ranking.
Related MCP Servers
- AlicenseAqualityAmaintenanceCross-border product catalog for AI agents. Search and compare products from US and South East Asian markets via Model Context Protocol.652410MIT
- 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.959MIT
- 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.81414MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
The set contains at least two genuinely confusable pairs: find_products vs research_shopping (explicitly cross-referencing each other in their own descriptions, with near-synonymous purposes of discovering products), and get_product vs explain_product vs compare_products, all of which return product records with prices and specs. The descriptions go to great lengths to disambiguate, which flags the very real boundary problem — an agent would struggle to pick correctly without reading thousands of characters.
All eight names follow a clear verb_noun snake_case pattern (compare_products, get_product, search_catalog, request_quote, research_shopping). Minor deviations: singular/plural inconsistency across pairs (get_product vs compare_products), and research_shopping reads as a noun phrase rather than verb+object. Otherwise, predictable and clean.
Eight tools is right in the sweet spot for a research/quoting workflow, and each earns its place: search, find, get, compare, explain, merchants, quote, and the heavy research job. The surface is neither bloated with near-duplicate operations nor so thin that the server feels like a stub.
The buyer-to-quote lifecycle is covered end to end: discovery (search_catalog, find_products), deep verification (get_product, explain_product, tier3 live lookup), comparison, merchant lookup, and a double opt-in request_quote flow that closes the loop. Minor gaps: no way to list prior quotes placed or track a quote's status after the initial response, and no explicit search-catalog pagination control, but agents can work around these.