Overview
Commerce Match MCP is a resolution-only MCP tool. Givefind_product_matches a single product phrase and it returns up to three matching product listings, best pick first - title, image, brand, category, and a product page URL you can link straight to. Every match resolves against the catalog of a merchant you already work with, and the url comes back untagged, so you append your own affiliate tag or link as-is - there is no new affiliate account to sign up for and no ChatAds tag in the response.
It’s the inverse of Commerce Signals: Signals finds the product mentions inside a block of text, Match turns one of those phrases into something shoppable. Both tools live on the same server behind the same cak_ access key, so connecting once gives you both.
This is a different server from the MCP Data Connector. That one is read-only access to your own widget data with a
uk_ user key. This one takes a cak_ team access key and matches text you send it.Get Your Access Key
Commerce Match MCP authenticates with a team access key (cak_...) in the x-api-key header - the same key type Commerce Signals uses. If you already hold one, reuse it.
- Log into app.getchatads.com
- Open Commerce Match
- In the Access Keys card, click Create Key
cwk_...) and user keys (uk_...) do not work here.
Connect
Commerce Match runs on the same MCP server as Commerce Signals. If you’ve already connected it,find_product_matches is there too - skip this section. Add the server once, under whatever name you like; one entry serves both tools.
In Claude Code it’s one command. Most other clients (Claude Desktop, Cursor, Windsurf, etc.) take the JSON block - drop the transport field if your client rejects it:
find_product_matches is available.
Tool
If
term appears more than once in context, only the first occurrence is used. The words immediately around that occurrence are what drive the category and vertical signals, so a context where the same phrase appears twice under different brands or in two unrelated topics resolves against the first one and ignores the rest. When that matters, trim context down to the passage you actually mean. The response carries no offsets, so there’s no way to tell after the fact which occurrence was used. Everything outside 500 characters either side of that occurrence is dropped before matching, so trimming a long context yourself is optional - it changes which passage is used, not whether the call succeeds.
Each match:
The response is a
matches array of 0 to 3 items plus a count. matches[0] is the best pick. An empty matches array is a success, not an error - it means we found no confident match for that term, and retrying won’t change that.
Example
Calling the tool with:data payload directly as structured content - the bare {"matches": [...], "count": n} object, matching the tool’s declared output schema. Same envelope shape as Commerce Signals.
Limits
- Input length:
termis capped at 100 characters andcontextat 500 characters either side of the term’s first occurrence. Over-cap input is truncated or windowed, not rejected - the call still succeeds. Near-miss copies (smart quotes, extra whitespace, invisible characters, markdown wrapping) are normalized before the containment check, so they match rather than erroring. - Requests: the free tier includes 500 requests per month. Every call counts, including ones that return zero matches. Get in touch to raise your cap - tell us roughly what volume you’re expecting.
- Commerce Match shares one usage pool with Commerce Signals and the rest of your team’s API usage, and the same per-minute burst limit. Your current month’s usage is shown at the top of both the Commerce Match and Commerce Signals tabs - same team-wide figure either way.
- Your team’s blocked-keyword and language content rules still apply. Text that trips one returns an empty
matchesarray rather than an error.
Troubleshooting
”This tool requires a cak_ API key”
You connected with a user key (uk_...). Commerce Match MCP takes a team access key (cak_...) - create one on the Commerce Match or Commerce Signals tab.
”term is required”
Theterm argument was missing, empty, or whitespace only. An empty term is a client error, not an empty-matches success.
”term must appear in context”
Thecontext you sent doesn’t contain term verbatim. context is the passage the term was pulled from, not a slot for background you write separately. Near-miss copies - smart quotes, extra whitespace, invisible characters, markdown wrapping - are normalized on both fields first, so this error means the term genuinely isn’t there. Fix the input or drop context and send term alone; it’s an INVALID_INPUT client error, so retrying the same call won’t help.
”Extraction backend temporarily unavailable - please retry”
ASERVICE_UNAVAILABLE error means the matching service didn’t respond. It’s deliberately surfaced as an error rather than silently returning zero matches, so a retry is safe and correct here.
”Daily request limit exceeded” / “Monthly request limit exceeded”
You’ve used your plan’s allowance. See Limits.An obvious product returns "count": 0
We had no confident match for that phrase in the catalog. In order of what usually fixes it:
- Put the brand in
term. “Bose QuietComfort Ultra earbuds” matches far better than “earbuds”. - Check the casing. The same scoring engine backs both tools, and capitalization is a real signal - see Casing Is a Signal.
- Trim
contextto the passage the term actually came from, so the category signals around it are the right ones.
matches array is a success - treat it as “no link for this one” and move on rather than retrying.
Tool not appearing in your MCP client
- Verify the URL is exactly:
https://api.getchatads.com/tools/mcp/mcp - If your client’s config uses a
transportfield, it should be"http" - Confirm the key in
x-api-keystarts withcak_ - Restart your MCP client completely
- Ask: “What tools do you have access to?”