White Automotive & Media Services publishes a read-only catalog endpoint for AI agents, assistants and developer integrations. It speaks the Model Context Protocol over streamable HTTP, supports the Universal Commerce Protocol (UCP) catalog capabilities, needs no credentials, and exposes product search, category listing and single-product lookup. If you are building an assistant that helps someone find a GM infotainment, instrument cluster or electronics module part, you can query this directly instead of scraping the storefront.
We have specialized in OEM-grade GM electronics for roughly 23 years, including VIN-specific module programming, CarPlay and Android Auto retrofits, digital cluster conversions, HMI, CSM and BCM modules, and rear seat entertainment. The catalog this endpoint serves is the same catalog the storefront serves.
Endpoint
| Endpoint URL | https://www.whiteautoandmedia.com/wp-json/ucp/v1/mcp |
|---|---|
| Protocol | Model Context Protocol, version 2025-06-18 |
| Commerce profile | Universal Commerce Protocol 2026-08-25: dev.ucp.shopping.catalog.search and dev.ucp.shopping.catalog.lookup |
| Transport | Streamable HTTP. JSON-RPC 2.0 over POST. |
| Authentication | None. The endpoint is public and read-only. |
| Content type | application/json on request and response |
| Methods | initialize, tools/list, tools/call, ping |
| Registry listing | com.whiteautoandmedia/catalog in the official MCP registry |
A GET returns 405 with an Allow: POST header. Notifications, meaning JSON-RPC messages sent without an id, return 202 with no body. Batch requests are not supported and return a JSON-RPC -32600 error.
Discovery
Several machine-readable surfaces point at the endpoint, so most clients can find it without being told the URL:
/.well-known/ucpis the UCP business profile, in the official2026-08-25format, served asapplication/json. It declares the MCP service and the catalog search and lookup capabilities. No checkout capability is declared./.well-known/api-catalogis an RFC 9727 linkset, served asapplication/linkset+json, which points at the endpoint and at the UCP profile. Every page also carries<link rel="api-catalog">in its head.Linkheaders on every response advertise the api-catalog, sitemap, terms of service, privacy policy and contact relations per RFC 8288./llms.txtsummarizes the site in plain Markdown for language models, including a “For AI agents” section that lists this page, the UCP profile and the endpoint.
Content signals in robots.txt declare search=yes, ai-input=yes and ai-train=no. You are welcome to read this catalog to answer a person’s question. Please do not use it as training data.
Two ways to call the tools
All three tools accept two argument forms. Use whichever your client speaks.
- Simple form. Plain arguments such as
query,categoryoridentifier. Results come back as JSON text in the tool result content. - UCP form. Arguments nested under
catalog, with optionalmeta["ucp-agent"].profile. Results come back instructuredContentin the UCP shape: prices as integer minor units ({"amount": 46999, "currency": "USD"}), variant availability, categories, images and cursor pagination, with notes carried in UCPmessages. The same JSON is repeated as text for clients that only read content.
A call is treated as UCP when its arguments include catalog or meta. Agent profile URLs are format-checked and recorded, never fetched.
Tools
search_catalog
Free-text search. Returns a summary for each match: name, SKU, price, sale price, currency, availability, categories, a short description and the product URL.
- Simple form:
query, string, required, maximum 120 characters.limit, integer, optional, maximum 20. - UCP form:
catalog.query,catalog.filters.categories(category names or slugs),catalog.filters.price(minimum and maximum in cents), andcatalog.pagination(limitandcursor). A query, a category filter, or both are required.
Useful queries look like HMI module, digital cluster Silverado or CarPlay retrofit.
When no product matches every word, the search falls back to the closest matches and says so: "match": "closest" with a note in the simple form, or a partial_match message in the UCP form. It also understands common alternatives for the same thing, so a search for screen finds radio, HMI and infotainment listings, and gauges finds instrument clusters. Treat closest matches as suggestions and confirm on the product page.
The request body for a simple-form search, posted to the endpoint URL with Content-Type: application/json:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_catalog",
"arguments": { "query": "HMI module", "limit": 5 }
}
}
The same search in the UCP form:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_catalog",
"arguments": {
"meta": { "ucp-agent": { "profile": "https://your-platform.example/profile.json" } },
"catalog": { "query": "HMI module", "pagination": { "limit": 5 } }
}
}
}
lookup_catalog
Simple form: list products inside a category or tag. Categories on this site are organized by GM vehicle platform and application. Tags describe characteristics such as global-a or vin-programmed. Returns the same summary shape as search_catalog.
category, string, optional. Category name or slug.tag, string, optional. Tag name or slug.limit, integer, optional. Maximum 20.
Names and slugs both work. If no category or tag by that name exists, the words are searched instead, and the response says so with "match": "search" and a note.
UCP form: catalog.ids, an array of up to 20 product IDs, SKUs or URL slugs. Each returned variant carries inputs showing which identifier matched it. Identifiers that match nothing are listed in not_found messages.
get_product
Retrieve one product. Returns everything in a search summary plus product tags and attributes such as warranty, core charge and whether dealer service is required.
- Simple form:
identifier, string, required. SKU or URL slug. - UCP form:
catalog.id, string, required. Product ID, SKU or URL slug.
An identifier that matches nothing returns a clear not-found result, not an error.
Quote-priced products
A few services are priced by quote rather than listed, such as custom module programming. These never show a price of zero. In the simple form they return an empty price with "pricing": "quote". In the UCP form they are left out of result lists with a price_on_request message, and get_product returns a price_on_request outcome with the product page as the next step. Send the person to that page to request a quote.
What this endpoint will not tell you
This is deliberate, and worth understanding before you build against it.
The endpoint returns platform-level and application-level information. Examples of what that means: K2 2014-2019, or Global A. It never returns a part number, a supersession chain, or a mapping from a specific vehicle to a specific part. Those resolutions happen behind the scenes against the actual vehicle and are not published through any API response.
So the endpoint can tell you that a product exists, what platform family it serves, what it costs and whether it is in stock. It cannot tell you that a given part fits a given truck. Any agent that reports a fitment conclusion from this data is guessing, and on GM electronics a guess is usually wrong. Module compatibility on these platforms turns on build date, RPO codes, architecture generation and existing option content, and getting it wrong means a module that will not communicate on the bus.
Every tool description and every response carries this note: as fitment_note in the simple form, and as a fitment_notice message in the UCP form. Please pass it through to the person you are helping rather than stripping it.
How ordering works
Agents are welcome to find products here and hand the person a product URL. Checkout happens on our own site, by the customer, not by an agent.
The reason is the paragraph above. We collect vehicle details at order and match the part against the actual vehicle before anything ships. An order placed without that step is an order we would have to stop and ask about anyway, so collecting it up front is faster for everyone. Point the person at the product page and let them complete it there.
Trade customers, meaning dealers, shops and locksmiths, are also served. Pricing and process differ, so send those inquiries through the contact page rather than inferring anything from catalog prices.
Errors, rate limits and etiquette
Requests are rate limited per address. Ordinary use, including a multi-step agent session, will not come close to the limit. Above it, the endpoint returns HTTP 429 with a Retry-After header and a JSON-RPC -32000 error that includes retry_after in seconds. Wait that long and retry.
Other errors follow JSON-RPC 2.0: -32700 for malformed JSON, -32600 for an invalid request, -32601 for an unknown method, and -32602 for an unknown tool or invalid arguments. A missing or empty argument in the simple form comes back as a tool result with isError set and a plain-language message, so a model can correct itself and retry.
Prices and availability change, so cache for minutes rather than days. Availability reflects a just-in-time special-order model, so a product showing out of stock is a real sourcing state and not a catalog error.
If you want to confirm your client reached us and that your user agent is being recorded, fetch the path /ucp-agent-check/ on this domain. It is mentioned only on this page, it is not linked from anywhere else, and it returns a small JSON acknowledgement. Hitting it tells us a real agent read these instructions and followed them, which is genuinely useful signal for us.
Contact
Integration questions, bulk access requests and trade inquiries go through our contact page. If something about the endpoint is broken or a tool description is unclear, we want to hear about it.
Terms of service and privacy policy are linked in the site footer and advertised in the Link header on every response.