MCP Server
Connect ACE to Cursor, VS Code, or Claude over the Model Context Protocol and call 36 tools from your assistant.
Use ACE from your IDE with MCP
ACE (Agentic Commerce Engine) runs inside any app that speaks the Model Context Protocol (MCP). Once connected, your assistant can read the ACE documentation and call ACE tools directly: run the Contextual Enrichment Engine, track jobs, score a feed, manage webhooks, and work with Google Merchant Center, without leaving your editor.
This guide is for people who use ACE at https://ace.authoritas.com and want to plug it into Cursor, VS Code, Claude Code, or another MCP client.
What is MCP and why use it with ACE?
MCP is a standard way for AI assistants to talk to external services. Connecting ACE means:
- Your assistant can read the ACE docs, so it answers questions and writes integration code from the current documentation rather than guesswork.
- Your assistant can call ACE, so "enrich these products for Google Shopping and tell me when the job finishes" becomes one instruction rather than a script you write first.
Which tools are available is controlled per project under Settings, Developer console, MCP.
Where to connect
ACE MCP server URL: https://ace.authoritas.com/api/mcp
It is a streamable HTTP MCP server. Listing tools is public, so a client can connect and discover the catalogue with no key. Calling a tool requires an API key in the Authorization header.
The fastest path is the Connect section under Settings, Developer console, MCP: one-click install buttons for Cursor and VS Code, a copy-paste command for Claude Code, and a config block with your key already filled in. A machine-readable server card is published at https://ace.authoritas.com/.well-known/mcp.json.
Step 1: Get an API key
Use the same key you use for the REST API.
- Log in at https://ace.authoritas.com.
- Go to Settings, Developer console, Keys.
- Create a key with the scopes for the tools you plan to call. An
ace_test_key is free and quota-capped, which makes it ideal for a first connection. Anace_live_key runs against your account for real.
Scopes are enforced on every tool call, so give the key what it needs:
| If you want to | Grant |
|---|---|
| Read docs, jobs, usage, feeds | enrichment:read |
| Run enrichment, cancel jobs, use Merchant Center | enrichment:write |
| Use the scoring and language utilities | utils:read |
| Manage webhook subscriptions | webhooks:write |
New keys get enrichment:read, enrichment:write, and utils:read. Add webhooks:write if you want the webhook tools. See API Keys.
Step 2: Add the server in Cursor
- Open Settings, MCP.
- Click Add new MCP server.
- Set the URL to
https://ace.authoritas.com/api/mcp. - Add a header. Name:
Authorization. Value:Bearer <your-api-key>. - Save, and restart Cursor if prompted.
Or by config, in ~/.cursor/mcp.json or your project's .cursor/mcp.json:
{
"mcpServers": {
"ace": {
"url": "https://ace.authoritas.com/api/mcp",
"headers": {
"Authorization": "Bearer <your-api-key>"
}
}
}
}Step 3: Add the server in VS Code
For GitHub Copilot Agent or another MCP-capable extension, add .vscode/mcp.json:
{
"servers": {
"ace": {
"type": "http",
"url": "https://ace.authoritas.com/api/mcp",
"headers": {
"Authorization": "Bearer <your-api-key>"
}
}
}
}Reload VS Code as your extension requires.
Step 4: Claude Code, other clients, or scripts
For Claude Code, one command:
claude mcp add --transport http ace https://ace.authoritas.com/api/mcp --header "Authorization: Bearer <your-api-key>"For anything else, use the same URL and header. The endpoint speaks MCP streamable HTTP and negotiates the protocol version with your client, currently up to 2025-06-18. Server-sent events are disabled; the server is stateless, so no session store is involved.
Discovery methods (initialize, ping, tools/list) work with no key. Every tools/call requires a valid key. Verify a connection without a client:
curl -X POST https://ace.authoritas.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'For transport details, see the MCP documentation.
Controlling which tools are available
In the ACE app, go to Settings, Developer console, MCP.
- Tools tab: turn each tool on or off per project.
- Try it tab: run a tool with custom JSON arguments and see the result, so you can confirm it works before wiring it into your editor.
Two things worth knowing:
- Discovery always lists the full catalogue. A disabled tool still appears in
tools/list; calling it returns an error telling you to enable it. This keeps the advertised catalogue stable for clients that cache it. - Scope is checked separately from enablement. A tool can be enabled for your project and still refuse a key that lacks the scope. The error names the scopes that would work.
Tool catalogue
36 tools. On means enabled by default; opt means you enable it under Settings, Developer console, MCP. Tools marked credits consume credits on a live key, or the free monthly quota on a test key.
Documentation
| Tool | Default | What it does |
|---|---|---|
list_docs | on | List ACE doc pages, optionally filtered by prefix (guides, using-ace, api-reference). |
read_docs | on | Read one doc page in full by path. |
Any valid key can read the docs, whatever its scopes.
Contextual Enrichment Engine
Scope: enrichment:write. See Contextual Enrichment Engine.
| Tool | Default | What it does |
|---|---|---|
generate_contextual_rules | on, credits | Derive the eight section contextual rules for a product set. Returns them synchronously. |
enrich_content | on, credits | Generate the requested content types per product, grounded in rules. Returns a job id. |
run_enrichment_pipeline | on, credits | Derive rules and generate content in one call. Returns a job id. |
Jobs
Scope: enrichment:read, except cancel_job which needs enrichment:write.
| Tool | Default | What it does |
|---|---|---|
list_jobs | on | List jobs, newest first. Filter by status or kind. |
get_enrichment_job | on | Status, progress, and result of one job. |
get_job_results | on | Paginated per-product results for a job. |
cancel_job | on | Cancel a queued or running job. |
Account, feeds, and utilities
| Tool | Default | Scope | What it does |
|---|---|---|---|
get_usage | on | enrichment:read | Credit balance, rate limit, job count, test quota. |
list_feeds | on | enrichment:read | List the project's product feeds. |
get_feed | on | enrichment:read | One feed's metadata by id. |
detect_language | on | utils:read | Dominant language of a product set. Unbilled. |
check_agentic_readiness | on | utils:read | Per-product readiness score plus a summary. Unbilled. |
score_review_quality | on | utils:read | Weighted overall score from sub-scores. Unbilled. |
search_products | opt | enrichment:read | Natural-language catalog search. Needs an ingested catalog. |
list_experiments | opt | enrichment:read | The project's A/B experiments. |
Content and media
| Tool | Default | What it does |
|---|---|---|
enrich_product | on, credits | Enrich a single product with title, description, attributes, and SEO metadata. |
generate_content | on, credits | Structured content from a layout template. Pass productIds to ground it in real products. |
generate_images | on, credits | Product image variants from a source image. |
translate_content | on, credits | Translate between locales with glossary support. |
generate_feed | on | Format a feed for Google Shopping, Agentic Commerce, Shopify, TikTok, or Pinterest. |
Webhooks
Scope: webhooks:read to list, webhooks:write to change. All opt-in. See Webhooks.
| Tool | What it does |
|---|---|
list_webhooks | List subscriptions and their events. Secrets are never returned. |
create_webhook | Subscribe an HTTPS endpoint to job events. The signing secret is returned once. |
delete_webhook | Delete a subscription. |
Google Merchant Center
All opt-in, and all need a connected Merchant Center account. Read tools need enrichment:read; write tools need enrichment:write. Most take an optional connection id and default to the project's first active connection.
| Tool | What it does |
|---|---|
gmc_list_connections | List the connections available in this project. |
gmc_list_subaccounts | List sub-accounts under a multi-client (MCA) aggregator. |
gmc_list_products | Paginate products straight from Merchant Center, bypassing the local cache. |
gmc_list_data_sources | List data sources such as primary and supplemental feeds. |
gmc_list_issues | Account-level issues plus aggregate product status counts. |
gmc_run_report | Run an MCQL report, for example SELECT offer_id, title FROM product_view LIMIT 1000. |
gmc_pull_products | Pull products from a connection into ACE. |
gmc_push_products | Push linked products back to Merchant Center. |
gmc_resolve_issue | Queue automated fixes for a specific issue code, for example missing_gtin. |
gmc_create_promotion | Create a promotion on a data source. |
gmc_set_inventory | Set local or regional inventory for a product. |
The last five mutate a live Merchant Center account. They are marked as destructive in the protocol, so a well-behaved client asks you to confirm before running them. Start with the read tools.
Tool reference
list_docs
Discover which doc pages exist.
| Parameter | Type | Required | Description |
|---|---|---|---|
prefix | string | No | Filter by path prefix. Top-level sections are guides, using-ace, api-reference. |
{ "name": "list_docs", "arguments": { "prefix": "guides" } }Returns { "pages": [ { "path": "guides/webhooks", "title": "Webhooks" }, ... ] }.
read_docs
Read one page in full.
| Parameter | Type | Required | Description |
|---|---|---|---|
path | string | Yes | Doc slug, for example getting-started, guides/troubleshooting, api-reference/enrichment/rules/post. |
{ "name": "read_docs", "arguments": { "path": "contextual-enrichment-engine" } }generate_contextual_rules
Derive the eight section rules for a product set. Uses credits.
| Parameter | Type | Required | Description |
|---|---|---|---|
products | array | Yes | Products to analyse. Each needs at least id and title. |
brandVoice | object | No | Tone, contentStyle, targetAudience, language. |
creativityLevel | integer | No | 1 (conservative) to 5 (bold). |
{
"name": "generate_contextual_rules",
"arguments": {
"products": [
{ "id": "sku-1", "title": "Merino base layer", "category": "Outdoor", "brand": "Fjell" }
],
"creativityLevel": 3
}
}enrich_content
Generate content types per product, grounded in rules. Uses credits. Returns a job id.
| Parameter | Type | Required | Description |
|---|---|---|---|
products | array | Yes | Products to enrich. |
contentTypes | array | Yes | For example product-description, meta-tags, jsonld-schema, irl-scenarios, internal-links. |
rules | object | No | Rules to ground against. Generated on the fly when omitted. |
brandVoice | object | No | Brand voice for the output. |
targetLanguage | string | No | BCP 47 locale. |
run_enrichment_pipeline
Rules and content in one call. Uses credits. Returns a job id.
| Parameter | Type | Required | Description |
|---|---|---|---|
products | array | Yes | Products to enrich. |
contentTypes | array | No | Defaults to a standard set. |
brandVoice | object | No | Brand voice for the output. |
creativityLevel | integer | No | 1 to 5. |
targetLanguage | string | No | BCP 47 locale. |
{
"name": "run_enrichment_pipeline",
"arguments": {
"products": [{ "id": "sku-1", "title": "Merino base layer" }],
"contentTypes": ["product-description", "meta-tags"],
"targetLanguage": "de-DE"
}
}list_jobs, get_enrichment_job, get_job_results, cancel_job
| Tool | Parameters |
|---|---|
list_jobs | status (queued, running, completed, partial, failed, cancelled), kind (rules, content, pipeline, article), page, pageSize (max 100) |
get_enrichment_job | jobId (required) |
get_job_results | jobId (required), page, pageSize (max 200) |
cancel_job | jobId (required) |
A typical flow: run the pipeline, poll get_enrichment_job until status is terminal, then page get_job_results.
enrich_product
Enrich one product. Uses credits.
| Parameter | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Product title. |
description | string | Yes | Raw product description. |
price | number | Yes | Product price. |
images | array | Yes | Image URLs. |
category | string | Yes | Product category. |
attributes | object | No | Existing attributes to preserve or enhance. |
locale | string | No | Target locale. Default en. |
generate_content
Structured content from a layout template. Uses credits.
| Parameter | Type | Required | Description |
|---|---|---|---|
topic | string | Yes | Content topic or title. |
layout | string | Yes | One of ranked-list, grid-showcase, comparison-guide, category-roundup, how-to-guide, buying-guide, editorial, listicle-article, review, product-spotlight, seasonal-campaign. |
keywords | array | Yes | SEO keywords to target. |
locale | string | Yes | Content locale. |
productIds | array | No | Products to feature. They are loaded from your catalog and used as source material. |
tone | string | No | For example professional, conversational. |
wordCount | integer | No | Target word count, 200 to 10000. |
layout selects the generator: product-backed layouts produce a listicle or comparison article, while how-to-guide and editorial produce prose. If you pass productIds that do not exist in the project, the call fails rather than inventing placeholder products, so use search_products to find valid ids.
generate_feed
| Parameter | Type | Required | Description |
|---|---|---|---|
productIds | array | Yes | Products to include. |
platform | string | Yes | google-shopping, agentic-commerce, shopify, tiktok, or pinterest. |
locale | string | No | Output locale. |
includeEnrichments | boolean | No | Include AI-enriched data. Default true. |
generate_images
| Parameter | Type | Required | Description |
|---|---|---|---|
sourceImageUrl | string | Yes | Source image to work from. |
variants | array | Yes | lifestyle, on-model, environment, seasonal, or ugc-style. |
Charged per variant.
translate_content
| Parameter | Type | Required | Description |
|---|---|---|---|
content | object | Yes | The content to translate. |
sourceLocale | string | Yes | Source locale. |
targetLocale | string | Yes | Target locale. |
contentType | string | Yes | article, product, or feed. |
brandVoice | string | No | Brand voice to preserve. |
glossary | array | No | Term mappings, each { source, target, context? }. |
Utilities
| Tool | Parameters | Returns |
|---|---|---|
detect_language | products (required) | Dominant locale, confidence, per-locale breakdown |
check_agentic_readiness | products (required) | Per-product score and missing fields, plus a summary |
score_review_quality | items (required), each with contentQuality, seoScore, aiReadability, optional brandVoice and id | Weighted overall score per item |
All three are unbilled.
Webhooks
| Tool | Parameters |
|---|---|
list_webhooks | none |
create_webhook | url (required, must be HTTPS), events (required), description |
delete_webhook | id (required) |
Event types: enrichment.job.succeeded, enrichment.job.partial, enrichment.job.failed, article.job.succeeded, article.job.failed.
Authentication and errors
- Authentication: every
tools/calltohttps://ace.authoritas.com/api/mcpmust include a valid key asAuthorization: Bearer <your-api-key>. Use the same keys as the REST API. See API Keys. - Scopes: a key without the scope a tool requires gets an error naming the scopes that would work. Widen the key rather than retrying.
- Rate limits: keys have a requests per minute limit. Exceeding it returns a rate limit error. See API Reference.
- Credits: enrichment, content, and image tools consume credits on a live key and the free monthly quota on a test key. Check with
get_usage, or GET /api/v1/usage.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| 401 on a tool call | Missing or invalid key. Check the Authorization: Bearer <key> header and that the key is active. |
| Client shows no tools | Wrong URL, or the client did not complete the handshake. tools/list is public, so test it with the curl above. |
| "tool is disabled" | Enable it for your project under Settings, Developer console, MCP. |
| "requires one of these API key scopes" | The key is valid but too narrow. Edit its scopes under Settings, Developer console, Keys. |
| Credits or 402 | Out of credits, or a test key has spent its monthly quota. Call get_usage or see Credits and usage. |
| Merchant Center tool fails | It needs a connected Merchant Center account. Connect one in ACE first. |
| A job never finishes | Poll get_enrichment_job. A partial status means some products failed; get_job_results shows which. |
Tips for daily use
- Ask your assistant to call
list_docsandread_docsbefore it writes integration code, so it works from the current documentation. - Start with
check_agentic_readinesson a sample. It is free and tells you which products are too thin to enrich well. - Prefer
run_enrichment_pipelinefor a first run andenrich_contentwith cached rules for later batches. - Keep the Merchant Center write tools disabled until you specifically need them.
