Appearance
Product (commerce) MCP β
Expose your product catalog's search to an outside AI tool β Claude Code, Cursor, or any MCP-capable host β as a set of read-only product-search tools scoped to one account and one product catalog. Use this when you're building an AI sales agent outside MyChatBot and want it to run the same catalog search, category browsing, and attribute filtering that the in-app agent uses.
Cheat sheet β
| Item | Value |
|---|---|
| Server address | https://product.mychatbot.app/mcp/{account_id}/{integration_id}/stream |
| Transport | Streamable HTTP MCP |
| Access | Scoped by the account + catalog IDs already baked into the URL β the URL itself is the key |
| What's exposed | 10 read-only product-search tools (see below) |
| Where to get it | In the app: Knowledge Base or Agents β Connectors β Connect AI tools |
Add to Claude Code:
bash
claude mcp add --transport http product-search "https://product.mychatbot.app/mcp/{account_id}/{integration_id}/stream"Add to Cursor (~/.cursor/mcp.json):
json
{
"mcpServers": {
"product-search": {
"url": "https://product.mychatbot.app/mcp/{account_id}/{integration_id}/stream"
}
}
}Get the ready-made command from the app β don't build the URL by hand
Both {account_id} and {integration_id} are filled in for you. Open the Connect AI tools dialog and copy the setup for your tool:
- Sales Platform β Knowledge Base (app.mychatbot.app/knowledge-base) β on a product catalog card, open the card menu β Connect AI tools.
- Agents β Connectors (app.mychatbot.app/agents/connectors) β open a product catalog β Connect AI tools.
The dialog shows the Server address, a ready-to-run Claude Code command, and a Cursor config block, each with its own copy button. {integration_id} is the specific product catalog (product-feed integration) you connected.
Scoping & access β
Every connection targets exactly one catalog:
https://product.mychatbot.app/mcp/{account_id}/{integration_id}/stream{account_id}β the MyChatBot account that owns the catalog.{integration_id}β one specific product catalog on that account. Search results, categories, and attributes are read only from this catalog.
There is no header, token, or password β the account and catalog IDs in the URL are the access control. Anyone holding the full URL can query that catalog.
Treat the server address as a secret
Because the IDs in the URL are the only access control, anyone who obtains the address can read that catalog's products, categories, and attribute values. Share it only with trusted integrators, keep it out of public repos and client-side bundles, and re-create the catalog integration if an address leaks.
Tools exposed β
The server offers 10 read-only tools. Your MCP client discovers them automatically once connected β you never call them by hand; the agent picks the right one. All of them read from the account + catalog in the URL.
| Tool (MCP) | What it does | When the agent uses it |
|---|---|---|
semantic_product_search | Free-text (or image) search across the catalog; returns matching products plus the categories they fall under. Can be narrowed by attribute values. | The main entry point β "find me X". |
filter_category_products | Lists products inside one category, with attribute filtering (price, size, and other attributes). | After a category is known and you want a deterministic category listing rather than ranked search. |
get_all_categories | Returns the catalog's category list. | To learn what categories exist before filtering. |
get_product_details | Full record for one product, including the long description that search results leave out. | When the agent needs everything about a specific item. |
get_product_variants | Lists the variants (size, color, etc.) of one product. | To present the options for a chosen product. |
find_similar_products | Returns products similar to a given one. | "Show me something like this." |
get_category_attributes | Lists the attribute names that exist in a category. | To learn the real, catalog-specific filter keys before building a filter. |
get_category_attribute_values | Lists the common values for one attribute in a category. | To learn which values are valid (e.g. which colors exist). |
get_available_filters | Returns faceted filters for a category β each attribute with its values and how many products match each. | To drive guided, faceted narrowing instead of guessing. |
get_products_by_ids | Fetches several products at once by their IDs. | To batch-load a known set of items efficiently. |
Every tool is read-only. Adding or updating products happens through the product feed, not over MCP β see Getting inventory in.
How filtering works β
The agent can narrow results by product attributes β price, color, brand, tags, and so on. Three things are worth knowing:
- Every operator is enforced everywhere. Equality/membership (
eq/in), exclusion (ne), substring (contains), prefixes/suffixes (startswith/endswith), and numeric ranges (gt/gte/lt/lte) all apply as hard constraints on free-text semantic search and on the category tools alike β a filter is never silently ignored. - String-substring narrowing is the forgiving option.
containsperforms a case-insensitive literal substring match on a string field. Use the reservednameattribute for a partial product name, such asname contains ASHEN.startswith/endswithare case-sensitive and test the whole stored string. - Number ranges need numeric values, not necessarily numeric columns. For "under 500" or "between 40 and 44", the comparison is numeric whenever the stored values read as numbers β even when the attribute is stored as text (
"50"), and the bound may be a number or a numeric string. A range means the attribute exists and compares β products lacking the attribute are excluded, and a decorated string price like"1 200 Π³ΡΠ½"doesn't match either (get_category_attribute_valuesshows what the values look like).
contains requires a nonblank string value and is intended for string fields. Numeric and boolean fields are unsupported and may return an empty result or a type error. Characters such as * and ? are matched literally. For a list attribute such as stickers, eq means the list has one exact element and in means it has any of the supplied exact elements; neither is substring matching.
Discover attributes before filtering
Attribute names and values are specific to each catalog. A good agent calls get_all_categories, then get_category_attributes / get_category_attribute_values (or get_available_filters), to learn the real keys and values before it builds a filter β rather than guessing field names.
Search results are trimmed to stay fast
To keep responses small, search results omit the heavy long-form description and detail fields, and semantic_product_search returns the top-level description as "[truncated]" by default. When the agent needs the full record, it should call get_product_details.
Best practices β
Do
- Let the agent learn the catalog first β categories, then attribute names and values β before it builds filters.
- Use
containswhen a shopper knows only part of a product name or another string value; don't add wildcard characters. - Use
get_available_filtersto power faceted narrowing (values + counts per attribute) instead of guessing. - Batch known IDs through
get_products_by_idsrather than looping single lookups. - Ask for full descriptions only when the model actually needs them; otherwise keep responses lean.
Don't
- Don't lean on number-range narrowing in free-text search; resolve a category first, then filter within it.
- Don't expect writes β every tool is read-only. Catalog updates come through the product feed.
Test it β
- Connect it. Paste the copied command into your terminal (Claude Code) or drop the config into
~/.cursor/mcp.json(Cursor). - Confirm the client sees it. In Claude Code, run
claude mcp list(or/mcpinside a session) and check thatproduct-searchis connected. - Ask a catalog question. Try something like "search the catalog for a gift for dry skin under 500" and confirm the agent runs a product search and returns real items.
- Try a partial name. Ask for a known fragment such as "find the product with ASHEN in its name" and confirm the agent sends
{"attribute":"name","operator":"contains","value":"ASHEN"}and returns the expected product regardless of case.
Empty results on older catalogs
If attribute filters silently return nothing, the catalog was probably indexed before searchable attributes existed. Fixing it needs a full reindex, which isn't a self-serve toggle: delete and re-add the catalog integration, or contact MyChatBot support with the catalog details and we'll run the reindex for you. See Troubleshooting.
See also β
- Search tools reference β what each of the 10 tools returns, in detail.
- Filters & params β how attribute filtering and faceted narrowing behave.
- Prompts β prompt patterns that steer the agent toward the right tool.
- Image search β searching the catalog by image.
- Getting inventory in β the product feed that populates the catalog.
- Testing search β known-hit patterns for sanity-checking search quality.
- Troubleshooting β stale catalogs, empty filters, and other gotchas.