Skip to main content

Overview

The free MCP for monetizing AI-generated text with affiliate links. Commerce Insert MCP is a resolution + placement MCP tool. Give insert_product_links a piece of AI-generated text and it returns affiliate offers to insert into it - the exact anchor text to hyperlink, its character offsets in the text you sent, and the product URL to point it at. Your text comes back unchanged; your app does the substitution. It doesn’t have to be a chat reply. Anything your model wrote is fair game:
  • Generated articles and roundups - a programmatic “best running shoes” post, a buyer’s guide, a product comparison
  • Newsletters and email copy - a weekly digest that names a few products
  • Social posts and captions - short-form copy with a product mention in it
  • Chat and assistant replies - the classic case: your assistant recommends something, you link it
  • Product descriptions, summaries, scripts - any generated prose where a real product gets named
Send generated text, not the prompt that produced it. This is the single most common integration mistake. message is the model’s output - the sentence that names a product - not the instruction or user question that asked for it. “Write me a post about running shoes” has nothing in it to link.
It’s the companion tool to Commerce Match: Match turns a single phrase you already picked into a shoppable listing, and Insert does the whole job end-to-end on a full passage - find the mention, resolve it, and hand back a ready-to-insert link. Both tools live on the same server behind the same cak_ access key, so connecting once gets you both. Unlike Commerce Match, which returns untagged URLs, Commerce Insert applies your team’s own Amazon Associates tag - you earn on the links it returns. See Set Your Amazon Affiliate Tag.
Amazon US is the catalog live today. There is no marketplace parameter on the tool - the catalog comes from your team’s settings.
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 analyzes text you send it.

Get Your Access Key

Commerce Insert MCP authenticates with a team access key (cak_...) in the x-api-key header - the same key type Commerce Match uses. If you already hold one, reuse it.
  1. Log into app.getchatads.com
  2. Open Commerce Insert
  3. In the Access Keys card, click Create Key
You can hold as many access keys as you have clients - one per MCP client is a good default, so you can revoke them independently. Widget keys (cwk_...) and user keys (uk_...) do not work here.

Set Your Amazon Affiliate Tag

Insert is the one commerce tool that returns commission-bearing links, so the tag is what makes it pay. Set it under Offer Settings on the Commerce Insert tab in app.getchatads.com, alongside marketplace targeting, category rules, and product filters - those settings shape what the tool returns.
  • Without a tag the tool still works, it just returns plain, untagged Amazon URLs. Nothing errors and nothing is blocked; you simply don’t earn on them. Set the tag before you ship.
  • Tags are per marketplace, with no cross-marketplace fallback. A US tag is applied to amazon.com links only and does nothing for amazon.co.uk, and vice versa. A URL whose marketplace has no tag of its own comes back untagged rather than borrowing another marketplace’s.

Connect

Commerce Insert runs on the same MCP server as Commerce Match. If you’ve already connected it, insert_product_links is there too - skip this section. Add the server once; 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:
It’s a Streamable HTTP MCP server, so there’s nothing to install locally and no Node or Python dependency - one URL in a config file. Restart your client and insert_product_links is available.

Tool

Each offer: Each product carries asin, url, brand_name, and confidence. confidence is a directional 0-1 retrieval-similarity score - proprietary, not a conversion probability, and not the carousel order. Fields with no value are omitted. Listing content (title, image, price, category) is deliberately not returned - see Why the Response Is So Minimal.

Example

Calling the tool with:
returns:
Splicing that back into your text gives you:
The tool returns the links, not rewritten text - you own the final copy, so you decide the markup, the placement, and whether to use a given link at all. That’s what makes it drop into a publishing pipeline as easily as a chat loop. The JSON above is the text response. Clients that support MCP structured tool output also receive the data payload directly as structured content - the bare {"status": ..., "returned": n, "offers": [...]} object, matching the tool’s declared output schema, the same way Commerce Match returns theirs.

Response Statuses

data.status tells you what happened. Only filled carries offers; every other status below is a successful “nothing to link” response with an empty offers array, not an error - don’t retry it as-is. The one exception is message_too_long: shorten the message and resend, and it can succeed. data.returned is how many offers came back. The message_too_long cap applies to every call. Client errors - a missing message - come back the other way: the response has no data field and error carries a code and message. Those are worth fixing, not retrying.

Casing Is a Signal

Capitalization isn’t cosmetic here - it feeds both the phrase boundaries we extract and the score the mention gets. Send text cased the way a person would actually write it:
  • Capitalize brand and product names. A brand that isn’t already in our brand data is recognized mostly by its casing pattern: two or more capitalized words in a row, or one capitalized word sitting next to a model number (“Kobo Clara BW”, “Anker 737”). Written lowercase, the same phrase reads as generic prose and scores well below a branded mention - often under the confidence floor.
  • Don’t capitalize words that aren’t names. Title Case prose (“Best Wireless Headphones For Running”) can read as a brand and drag a generic phrase into branded territory.
  • A capital at the start of a sentence is ignored. That’s a sentence-case artifact, not a name, so a brand in that position needs a second capitalized word or a model number beside it.
  • ALL CAPS and all-lowercase text carry no casing signal at all. Headline-cased, shouty, or lowercased input returns fewer results at lower confidence. Normalize it before sending if you can.

Why the Response Is So Minimal

Each product is just an identifier, a URL, a brand, and a confidence score. No title, no price, no image, no category. That’s a deliberate choice, not a gap. Amazon’s Associates Operating Agreement and Product Advertising API license are strict about how product content is obtained, displayed, and passed along. Amazon ties that content to the Associate who fetched it, expects prices to be fresh, and doesn’t allow it to be redistributed as a third-party feed. A response that carried titles, prices, and categories would look like ChatAds acting as a product database sitting between you and Amazon, and anything you stored or displayed from it would be data your own Associates account didn’t license. So the response carries only what you need to place a link. The ASIN identifies the product and the URL takes the reader to Amazon, where the listing content is served by Amazon itself. If you need titles, images, or prices, fetch them by ASIN through your own Product Advertising API access. That keeps every piece of Amazon content on your page traceable to your own agreement with Amazon, and keeps your Associates account clean.

Limits

  • Message length: 10,000 characters per call by default. There is no minimum word count - a single product name is a valid message.
  • Requests: the free tier includes 500 requests per month. Every call counts, including ones that return no offers. Get in touch to raise your cap - tell us roughly what volume you’re expecting.
  • Commerce Insert shares one usage pool with Commerce Match 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 the Commerce Insert tab.
  • Your team’s blocked-keyword, language, category, and product-filter rules still apply - they’re the same rules configured under Offer Settings on the Commerce Insert tab. Content rules surface as a data.status, not an error.

Troubleshooting

”This tool requires a cak_ API key”

You connected with a user key (uk_...). Commerce Insert MCP takes a team access key (cak_...) - create one on the Commerce Insert or Commerce Match tab.

”Message is required”

The message argument was missing, empty, or whitespace only. An empty message is a client error, not an empty-offers success.

The URLs come back with no tag= parameter

Your team has no Amazon Affiliate Tag set for that marketplace, so the link is returned untagged and earns nothing. Add one under Offer Settings on the Commerce Insert tab - see Set Your Amazon Affiliate Tag.

Text that clearly names a product returns no_offer

In order of what usually fixes it:
  1. Check you sent the generated text, not the prompt. A prompt or user question has no product mention in it to link.
  2. Check the casing. The same extraction engine backs both tools and capitalization is a real signal - see Casing Is a Signal.
  3. Check the product is in the catalog. Amazon US today; some products legitimately aren’t there.

”Daily request limit exceeded” / “Monthly request limit exceeded” / “Per-minute rate limit exceeded”

You’ve used your plan’s allowance. See Limits.

”API key disabled. Contact support.”

Your key’s team has been disabled. Email chris@getchatads.com.

Tool not appearing in your MCP client

  1. Verify the URL is exactly: https://api.getchatads.com/tools/mcp/mcp
  2. If your client’s config uses a transport field, it should be "http"
  3. Confirm the key in x-api-key starts with cak_
  4. Restart your MCP client completely
  5. Ask: “What tools do you have access to?”