A2A Retailmedia — the agentic retail-media hub for grocery

Connecting grocery retail to 350k makers for media buys.

Should I use this

Quality & Safety

A
Description quality
96%
Schema completeness
75%
Naming quality
91%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'get_banner_card' description lacks action verbin get_banner_card
  • LOWTool 'a2a_handoff' description lacks action verbin a2a_handoff

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,705Tokens (tool definitions)
~800 BTypical response size
Significant attention impact (2.11% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "a2a-retailmedia": {
      "url": "https://mcp.a2a-retailmedia.ai/mcp"
    }
  }
}

Remote endpoints

https://mcp.a2a-retailmedia.ai/mcpstreamable-http

What it can do

Tool inventory

Tools (19)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢resolve_jurisdiction(market)

Where is the media bought? Resolve a market (e.g. FR, UK, US, Japan) to one of the 20 markets on the record. UK is the label; GB is accepted.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string"
    }
  },
  "required": [
    "market"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢resolve_actor(actor_class)

Who is asking? maker, brand_owner, agency, distributor or retailer_media_team (trade); auditor (read only). The consumer is never the counterparty.

Input Schema

{
  "type": "object",
  "properties": {
    "actor_class": {
      "type": "string"
    }
  },
  "required": [
    "actor_class"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
⚪gate_transaction(market, actor_class)

The gate before a handshake: allow or deny for one market and one actor class. Returns a decision_id the handshake tools ask for. A deny is not charged.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string"
    },
    "actor_class": {
      "type": "string"
    }
  },
  "required": [
    "market",
    "actor_class"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢find_makers(segment, region, node, limit)

Find the brand: makers on the grocery record of one market (node = one of the 20 markets). segment is taken as a lane where it names one (organic, free-from, plant-based, artisan, origin, premium). Read live from the A2A Grocery door.

Input Schema

{
  "type": "object",
  "properties": {
    "segment": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "region": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "node": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "limit": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢resolve_gtin(gtin)

Confirm the product is real: is this Global Trade Item Number (GTIN) well-formed, and is it on the grocery record, with its brand and maker. Read live from the A2A Grocery door.

Input Schema

{
  "type": "object",
  "properties": {
    "gtin": {
      "type": "string"
    }
  },
  "required": [
    "gtin"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢check_eligibility(gtin, banner, country_iso)

Confirm it is on the shelf: does the grocery record list this GTIN at this banner in this market? No listing, no media pitch. Read live from the A2A Grocery door.

Input Schema

{
  "type": "object",
  "properties": {
    "gtin": {
      "type": "string"
    },
    "banner": {
      "type": "string"
    },
    "country_iso": {
      "type": "string"
    }
  },
  "required": [
    "gtin",
    "banner",
    "country_iso"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢list_banners(market, with_program, search, limit, offset)

Pick the banners: the grocery banners of one market with each one's media program (or "none listed") and card status. with_program=true returns only banners with a program listed.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string"
    },
    "with_program": {
      "default": false,
      "type": "boolean"
    },
    "search": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "limit": {
      "default": 100,
      "type": "integer"
    },
    "offset": {
      "default": 0,
      "type": "integer"
    }
  },
  "required": [
    "market"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢get_banner_card(market, banner)

The signed card of one banner and its status (unclaimed, claimed or registered). banner = the banner's slug, id or name.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string"
    },
    "banner": {
      "type": "string"
    }
  },
  "required": [
    "market",
    "banner"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢list_banner_cards(market, status, limit, offset)

The cards of one market, optionally by status (unclaimed, claimed, registered): banner, media program, status and the card's address.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string"
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "limit": {
      "default": 200,
      "type": "integer"
    },
    "offset": {
      "default": 0,
      "type": "integer"
    }
  },
  "required": [
    "market"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢list_packages(market, banner, decision_id)

Match a package: what one banner's media program says it sells, in the program's own words, each tagged onsite, offsite or in-store. Offsite is tagged so it is never taken for a shelf slot. Empty where no program is listed — the agent stops.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string"
    },
    "banner": {
      "type": "string"
    },
    "decision_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "required": [
    "market",
    "banner"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢quote_package(market, banner, decision_id)

Price it: returns where the banner's own media program publishes its rates or takes an enquiry. GSC never prices; a quote comes from the retailer's program.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string"
    },
    "banner": {
      "type": "string"
    },
    "decision_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "required": [
    "market",
    "banner"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢find_buyer(maker, market, decision_id)

Qualify the buyer: find a maker on the grocery record by name, with its own website where the record has one.

Input Schema

{
  "type": "object",
  "properties": {
    "maker": {
      "type": "string"
    },
    "market": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "decision_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "required": [
    "maker"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟡submit_demand(maker, budget, budget_approved_by, gtins, market, ...)

Hand off: the packet — the maker, a budget a person has approved, one or more GTINs, a market and a list of banners — or a gap naming what is missing. Routes each banner by its card status: unclaimed is a referral, claimed goes to the retailer's media team, registered goes agent to agent. Settles at the door.

Input Schema

{
  "type": "object",
  "properties": {
    "maker": {
      "type": "string"
    },
    "budget": {
      "type": "number"
    },
    "budget_approved_by": {
      "type": "string"
    },
    "gtins": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "market": {
      "type": "string"
    },
    "banners": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "contact": {
      "type": "string"
    },
    "decision_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    },
    "note": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "required": [
    "maker",
    "budget",
    "budget_approved_by",
    "gtins",
    "market",
    "banners",
    "contact"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
⚪receive_demand(market, banner, handoff_id, decision_id)

Retailer side: a registered program agent takes a qualified packet. Only a card in the registered state can receive; any other card is refused and nothing is charged.

Input Schema

{
  "type": "object",
  "properties": {
    "market": {
      "type": "string"
    },
    "banner": {
      "type": "string"
    },
    "handoff_id": {
      "type": "string"
    },
    "decision_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "required": [
    "market",
    "banner",
    "handoff_id"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢a2a_handoff(handoff_id)

Hand to a person: the state of a handoff and its Navigator desk ticket, where the media program has no agent.

Input Schema

{
  "type": "object",
  "properties": {
    "handoff_id": {
      "type": "string"
    }
  },
  "required": [
    "handoff_id"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢pull_measurement(handoff_id)

Read the till: results of a campaign, returned by the retailer's program. Available only after the program returns a campaign id for a handoff.

Input Schema

{
  "type": "object",
  "properties": {
    "handoff_id": {
      "type": "string"
    }
  },
  "required": [
    "handoff_id"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
⚪renew_package(prior_quote_id, budget, budget_approved_by, decision_id)

Renew: a prior quote id from the retailer's program and a new approved budget. Without a quote id from the program there is nothing to renew.

Input Schema

{
  "type": "object",
  "properties": {
    "prior_quote_id": {
      "type": "string"
    },
    "budget": {
      "type": "number"
    },
    "budget_approved_by": {
      "type": "string"
    },
    "decision_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "required": [
    "prior_quote_id",
    "budget",
    "budget_approved_by"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟡log_audit(event, detail)

Write one audit line for a step of the chain; returns its id.

Input Schema

{
  "type": "object",
  "properties": {
    "event": {
      "type": "string"
    },
    "detail": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null
    }
  },
  "required": [
    "event"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
⚪enrol_maker(maker, markets, media_exposure, contact)

Makers: be seen. Enrol a maker for media exposure in grocery: its name, its markets (one or more of the 20), the tick, and a contact a person can answer. Enrolment only — a handoff waits for a budget a person has approved.

Input Schema

{
  "type": "object",
  "properties": {
    "maker": {
      "type": "string"
    },
    "markets": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "media_exposure": {
      "type": "boolean"
    },
    "contact": {
      "type": "string"
    }
  },
  "required": [
    "maker",
    "markets",
    "media_exposure",
    "contact"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded19 tools