Current Tools
What's exposed
MCP (Model Context Protocol) is the open standard for connecting a model to external tools and data. These five tools are the current surface — query-shaped, not a SQL dump.
meta
Call this first. Category slugs, the spec keys actually observed per category (with units and five-language labels), and live totals — not documentation that drifts from reality. Guessing category and key names blind, before this tool existed, got 4 of 13 slugs and 7 of 14 keys right. This is why you don't have to.
meta()
// live response, abbreviated — full payload covers all 161 categories
{
"vocab_version": "0.30.0",
"generated_at": "2026-10-23 14:17:48.711613-04:00",
"totals": { "products": 935534, "facts": 7591309,
"manufacturers": 229, "categories_with_data": 161 },
"categories": [
{ "slug": "power_contactors",
"labels": { "en": "Power contactors", "zh-TW": "功率接觸器",
"es": "Contactores de potencia",
"fr": "Contacteurs de puissance", "th": "คอนแทคเตอร์กำลัง" },
"products": 12905,
"typed_products": 12198,
"spec_keys": [
{ "key": "rated_current_ac3_a", "unit": "A", "type": "number" }
] }
]
}
find_equivalents
Cross-brand alternates for a given part number — a deterministic, per-spec comparison on the category's required keys. A disagreement on a key both sides publish rules a candidate out; a key a candidate doesn't publish never does, and is reported as not_published. Every candidate says where its data came from and what its lifecycle status rests on, and every compared spec carries the source type and verification of both sides.
find_equivalents(mpn="3RT20262AL24")
// live response, abbreviated — 3 brands, up to 3 candidates each; two brands shown
{
"target": { "mpn": "3RT20262AL24", "brand": "Siemens",
"category": "power_contactors",
"data_origin": "manufacturer_source",
"spec_provenance": { ... } },
"compared_on": ["rated_current_ac3_a", "coil_voltage_v", "poles", "voltage_max_v"],
"tolerance": 0.25,
"brands_found": 3,
"equivalents": {
"schneider_electric": [{ "mpn": "LC1D25P7",
"spec_comparison": {
"rated_current_ac3_a": { "target": 25.0, "candidate": "25 A AC",
"delta_pct": 0.0, "status": "match",
"candidate_provenance": { "tier": "manufacturer_stated",
"verification": "manufacturer_url_confirmed",
"verified_against": "https://www.se.com/us/en/product/LC1D25P7/..." },
"target_provenance": { ... } },
"coil_voltage_v": { "target": "230 V AC", "candidate": "230 V AC",
"delta_pct": 0.0, "status": "match", ... }
},
"match_basis": { "compared": 4, "of": 4 },
"lifecycle_status": "Active", "lifecycle_basis": "distributor", "orderable": null,
"data_origin": "distributor_source" }],
"abb": [{ "mpn": "AFC26-30-00-34",
"spec_comparison": {
"rated_current_ac3_a": { "target": 25.0, "candidate": 26.0,
"delta_pct": 4.0, "status": "match", ... },
"coil_voltage_v": { "target": "230 V AC", "candidate": 208.0,
"delta_pct": -9.6, "status": "match", ... }
},
"differences": [{ "key": "power_kw", "target": "11 kW AC",
"candidate": 15.0, "delta_pct": 36.4 }, ...],
"match_basis": { "compared": 4, "of": 4 },
"lifecycle_status": "Active", "lifecycle_basis": "defaulted", "orderable": null,
"data_origin": "manufacturer_source" }]
}
}
Note the Schneider match shows data_origin: distributor_source and a distributor-based lifecycle, yet its rated current is already confirmed against Schneider's own page. The labels are per fact, and that is the real, current state for this record, not smoothed over. Differences outside the compared keys (power, depth, weight, temperature range) are listed, not hidden. See Coverage.
get_product
Full typed profile of one MPN — headline specs plus the fully qualified fact table (voltage/temperature derating rows distributors don't show), with every fact labeled by source type, verification status, the page it was checked against, and confidence. Lifecycle says where the status came from and asserts orderable only on manufacturer evidence.
get_product(mpn="3RT20262AL24")
// live response, headline_specs abbreviated (all_facts carries the full derating table)
{
"mpn": "3RT20262AL24",
"manufacturer": "Siemens",
"family": "SIRIUS 3RT contactors, 3-pole, up to 250 kW",
"category": "power_contactors",
"lifecycle_status": "Active",
"lifecycle": { "status": "Active", "basis": "declared",
"source": "siemens_sieportal", "region": "us", "orderable": true },
"source_link": {
"url": "https://sieportal.siemens.com/en-us/products-services/detail/3RT20262AL24",
"points_at": "product_page", "basis": "importer_declared" },
"data_origin": "manufacturer_source",
"headline_specs": {
"rated_current_ac3_a": { "value": 25.0, "unit": "A",
"qualifiers": { "standard": "iec", "at_voltage_v": 400, "utilisation_category": "ac3" },
"source": "siemens_sieportal", "provenance_tier": "manufacturer_stated",
"verification_status": "manufacturer_url_confirmed",
"verified_against": "https://sieportal.siemens.com/en-us/products-services/detail/3RT20262AL24",
"confidence": 0.95 },
"coil_voltage_v": { "value": 230.0, "unit": "V", "qualifiers": { "current_kind": "ac" },
"source": "digikey", "provenance_tier": "distributor_stated",
"verification_status": "unverified", "verified_against": null, "confidence": 0.85 },
"mechanical_life_cycles": { "value": 10000000.0,
"source": "siemens_sieportal", "provenance_tier": "manufacturer_stated",
"verification_status": "manufacturer_url_confirmed",
"verified_against": "https://sieportal.siemens.com/en-us/products-services/detail/3RT20262AL24",
"confidence": 0.95 }
},
"vocabulary": "canonical_keys.yaml v0.30.0"
}
search_products
Query by category and spec constraints — min / max / eq objects evaluated across headline, qualified, text and range facts, not free-text search. Returns the true total alongside the page.
search_products(
category="power_contactors",
constraints={
"rated_current_ac3_a": {"min": 25},
"coil_voltage_v": {"eq": 230}
},
limit=5
)
// live response: 5 of 167 matches returned; first result shown
{ "count": 5, "total": 167,
"results": [{
"mpn": "3RT20261AP001AA0", "brand": "Siemens",
"lifecycle_basis": "declared", "orderable": true,
"data_origin": "manufacturer_source",
"specs": { "rated_current_ac3_a": 25.0,
"coil_voltage_v": 230.0 },
"spec_provenance": {
"rated_current_ac3_a": {
"tier": "manufacturer_stated",
"verification": "manufacturer_url_confirmed",
"verified_against": "https://sieportal.siemens.com/..." },
"coil_voltage_v": {
"tier": "distributor_stated",
"verification": "unverified",
"verified_against": null } } }, ...] }
get_datasheet
Document pointers for a part — manufacturer asset URLs, plus locally archived PDFs where we've kept a copy. 3.0M+ document and image links are indexed — datasheets; operating, installation, programming and design guides; and product images.
get_datasheet(mpn="3RT20262AL24")
// live response, abbreviated
{
"mpn": "3RT20262AL24",
"manufacturer": "Siemens",
"data_origin": "manufacturer_source",
"documents": [
{ "type": "datasheet",
"hosted_by": "manufacturer",
"url": "https://mall.industry.siemens.com/
teddatasheet/?format=PDF&mlfbs=
3RT2026-2AL24&language=en&
caller=SiePortal" },
{ "type": "datasheet",
"hosted_by": "third_party",
"url": "https://media.distributordatasolutions.com/
siemenscomplete/2023q3/documents/
03cd75a6c8e3624feae10591789d37ca37b458f2.pdf" }
],
"local_pdfs": []
}
Why It's Hard
Why teams don't just scrape it themselves
- 33+ manufacturers means 33+ different site structures, 33+ different vocabularies for the same physical spec, and at least one JavaScript-rendered SPA that breaks plain scrapers.
- Normalization is the actual cost. Getting to a shared schema across brands means building and maintaining a reviewed mapping dictionary per source — not a one-time script.
- Cross-brand equivalence is a standalone hard problem. Knowing that a Schneider contactor and a Siemens contactor are real substitutes, with per-spec justification, is expertise-gated work today.
- Provenance has to be structural, not promised. Every fact here is tagged with its source and a confidence score at write time, not asserted after the fact.
Four more tools, built on what already exists
Not speculative additions — each one sits on infrastructure the database already has (versioning, cross-referenced identifiers, category taxonomy). Scoped, not shipped.
list_categories()
A lightweight listing — slug and product count only — so an agent can find the right category without pulling the full meta payload before it can call search_products.
get_history(mpn)
Every fact is already versioned — this returns the actual diff: old value, new value, manufacturer link, timestamp. The engine behind the spec-change monitoring on our distributor roadmap.
resolve_identifier()
Go from a barcode scan (gtin=) or a distributor's internal SKU (distributor_sku=) straight to the canonical MPN. Built on 985K+ identifiers already cross-referenced in the database.
batch_get_products(mpns=[…])
Full spec sheets for a whole BOM in one call instead of one get_product request per line item.
Workflows
What these look like chained together
Current tools and roadmap tools (marked) combined into actual workflows.
Three calls, not a support ticket
get_product shows a lifecycle_status that's moved off Active. get_history (roadmap) pulls the actual change — old status, new status, manufacturer notice, date. find_equivalents immediately proposes verified substitutes.
"15HP compressor, 380V, needs a contactor"
search_products turns the constraint into real candidates. batch_get_products (roadmap) pulls full spec sheets for the shortlist in one call. get_datasheet attaches the manufacturer PDF for sign-off.
A customer's parts list, mixed brands
resolve_identifier (roadmap) turns barcodes scanned off installed equipment into canonical MPNs. find_equivalents checks each one against what a distributor actually stocks, brand by brand.
Get Access
Request early access
We're onboarding a small number of teams directly before opening broader access. Tell us what you're building and we'll follow up.