Gaurmon MCP
Gaurmon is a remote MCP server that provides Toronto grocery flyer deals, everyday shelf prices, and price history to AI agents. It allows agents to search for offers, compare items across stores, manage grocery lists, and track savings, with all prices backed by source flyer images.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://www.gaurmon.com/api/mcpWhat its tools do
16 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (13)
Can change data (3)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to gaurmon.com ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Find the cheapest grocery stores near a postal code
- Search for this week's flyer deals and compare prices
- Manage and price a grocery list across nearby stores
- Track savings by recording purchases against typical prices
Source and maintenance
Protocol and capabilities
- Server
- gourman 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 16 advertised
- Resources
- 1 advertised
- Resource templates
- 2 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
16 advertised
locate — Locate a place
Place a Canadian postal code, FSA or lat,lng as coordinates. Free. Use it to check a location before searching.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"place"
],
"properties": {
"place": {
"type": "string",
"minLength": 3,
"description": "Where the shopper is: a Canadian postal code (\"M6H 2B6\"), an FSA (\"M6H\"), or \"lat,lng\"."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}coverage — What Gaurmon covers
Banners, current flyer weeks, store counts and known gaps (e.g. FreshCo store locations unknown; shelf prices No Frills only, with Statistics Canada Ontario averages as a labelled fallback). Free. Call it before telling a user something isn't on sale.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}account_status — Gaurmon account status
The user's Gaurmon plan: trial days left, or the paid plan and when it renews. Free.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}stores_near — Grocery stores near a place
Stores within a radius, nearest first, each with every flyer it runs this week and how many offers each flyer has.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"near"
],
"properties": {
"near": {
"type": "string",
"minLength": 3,
"description": "Where the shopper is: a Canadian postal code (\"M6H 2B6\"), an FSA (\"M6H\"), or \"lat,lng\"."
},
"banners": {
"type": "array",
"items": {
"type": "string"
},
"description": "Limit to these banners, e.g. [\"no-frills\", \"food-basics\", \"freshco\"]."
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}search_offers — Search flyer offers
This week's flyer offers for item words, an aisle, or deals near a place: give at least one of `query`, `aisle` or `near`. Each row has a comparable unit price (per kg, L or item), dates (`valid` is the first and last day, Toronto time), the nearest store carrying it, and an offerId for get_offer_evidence and show_offers. At most 50 rows a call; use `aisle` and `unit` filters and `fields` to keep answers small.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"near": {
"type": "string",
"minLength": 3,
"description": "Where the shopper is: a Canadian postal code (\"M6H 2B6\"), an FSA (\"M6H\"), or \"lat,lng\"."
},
"sort": {
"enum": [
"relevance",
"unit_price",
"discount",
"distance"
],
"type": "string"
},
"unit": {
"enum": [
"kg",
"l",
"each"
],
"type": "string",
"description": "Only offers priced per this unit, so prices compare."
},
"aisle": {
"enum": [
"produce",
"meat_seafood",
"deli_prepared",
"dairy_eggs",
"bakery",
"frozen",
"pantry",
"snacks_candy",
"beverages",
"household",
"personal_care",
"baby",
"pet",
"non_food_other"
],
"type": "string"
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Default 20, at most 50."
},
"query": {
"type": "string",
"description": "Item words, e.g. \"chicken thighs\". Omit to browse an aisle or the deals near a place."
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Return only these fields per row (offerId and priceKind are always kept), to save tokens."
},
"banners": {
"type": "array",
"items": {
"type": "string"
},
"description": "Limit to these banners, e.g. [\"no-frills\", \"food-basics\", \"freshco\"]."
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
},
"attributes": {
"type": "array",
"items": {
"enum": [
"organic",
"halal",
"kosher",
"fresh",
"frozen",
"product_of_canada",
"prepared_in_canada",
"gluten_free",
"plant_based",
"boneless",
"skinless",
"bone_in",
"air_chilled",
"wild",
"farmed",
"club_or_family_size",
"store_brand",
"new_product"
],
"type": "string"
},
"description": "Every listed attribute must be present, e.g. [\"halal\"]."
},
"maxUnitPrice": {
"type": "number",
"description": "Dollars per `unit`."
},
"minDiscountPercent": {
"type": "number"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}show_offers — Show chosen offers
Show the user a titled Gaurmon card of flyer offers you chose, in your order: your ranking of the week's best deals, or picks from several searches. Pass offerIds from search_offers or compare_items, plus the same `near` so each row names its nearest store. Use it when the user asks to see, list or rank offers you've already found, instead of writing the list out. Adds no new offers.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"offerIds",
"title"
],
"properties": {
"near": {
"type": "string",
"minLength": 3,
"description": "Where the shopper is: a Canadian postal code (\"M6H 2B6\"), an FSA (\"M6H\"), or \"lat,lng\"."
},
"title": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "What the list is, e.g. \"Cheapest protein per kg\"."
},
"offerIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 20,
"minItems": 1,
"description": "Shown in this order, at most 20."
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}compare_items — Compare items across stores
For each item, the best comparable flyer offer at each banner near a place (priced offers first, the item itself by name, then lowest unit price), plus per-banner totals. Items with no flyer offer come back null: try shelf_prices for those.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"items"
],
"properties": {
"near": {
"type": "string",
"minLength": 3,
"description": "Where the shopper is: a Canadian postal code (\"M6H 2B6\"), an FSA (\"M6H\"), or \"lat,lng\"."
},
"items": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 30,
"minItems": 1,
"description": "E.g. [\"large eggs\", \"chicken thighs\", \"rice\"]."
},
"banners": {
"type": "array",
"items": {
"type": "string"
},
"description": "Limit to these banners, e.g. [\"no-frills\", \"food-basics\", \"freshco\"]."
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}shelf_prices — Everyday shelf prices
Regular (non-flyer) prices for staples, for items not on sale this week. Store shelf prices are No Frills only for now. One row per product; `proxy: true` means the price was read at another branch of the banner. Each row carries `baseline`, the Statistics Canada Ontario average for that kind of item when there is one, and `vsOntarioAveragePct`. When no store price exists (e.g. Food Basics, FreshCo), `hits` is empty and `fallback` holds only the StatCan averages: say they are provincial averages, not what a store charges.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"near": {
"type": "string",
"minLength": 3,
"description": "Where the shopper is: a Canadian postal code (\"M6H 2B6\"), an FSA (\"M6H\"), or \"lat,lng\"."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Default 10, at most 50."
},
"query": {
"type": "string",
"minLength": 2
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Return only these fields per row (offerId and priceKind are always kept), to save tokens."
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_offer_evidence — Flyer evidence for an offer
The flyer crop an offer was read from (as an image), with its page, dates and banner. Use it to show the user, or for a price match at the till.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"offerId"
],
"properties": {
"offerId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}price_range — Price range for an item
Where a price sits: the cheapest, typical (median) and priciest qualified unit price for the same item across stores near a place on a day (flyer offers valid that day, shelf prices read within a week), how many prices each rests on, and `status` ranged | thin_range | unranged. Give quantity, unit and paidMinor to get the percentile and savings for a price. Use it before a purchase to say what a fair price is; record_purchases stores the same numbers.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"item",
"near"
],
"properties": {
"on": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Day to price, YYYY-MM-DD (default today)."
},
"item": {
"type": "string",
"minLength": 2,
"description": "The generic item, as compare_items takes it: \"chicken thighs\", \"large eggs\", \"bananas\". Not a brand or receipt code."
},
"near": {
"type": "string",
"minLength": 3,
"description": "Where the shopper is: a Canadian postal code (\"M6H 2B6\"), an FSA (\"M6H\"), or \"lat,lng\"."
},
"unit": {
"enum": [
"kg",
"g",
"lb",
"l",
"ml",
"each"
],
"type": "string",
"description": "Unit of `quantity`; also picks the unit prices compare in (kg, L or each)."
},
"quantity": {
"type": "number",
"exclusiveMinimum": 0
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
},
"paidMinor": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "A price paid or planned for `quantity`, in cents."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}record_purchases — Record a purchase in the savings record
Add a receipt to the user's savings record: one row per line (generic item, quantity, unit, paidMinor in cents, optional offerId from search_offers). Each line is stored with its price range around the store that day (cheapest, typical, priciest) and returns savings vs each plus the percentile; negative savings (paid above typical) are kept. Lines on a thin range are shown but not totalled. Each line has `basis` (what it was compared with) or `notCounted` (why not) and a plain `summary`; the receipt has a `summary`, `method` and `methodUrl` (how savings are counted, an estimate compared with typical prices nearby) to pass on to the user. Append-only and idempotent: reuse `operationId` to retry safely; to fix a purchase, record a new one with `supersedesPurchaseId`.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"operationId",
"purchasedOn",
"near",
"basis",
"lines"
],
"properties": {
"near": {
"type": "string",
"minLength": 3,
"description": "The store's postal code, or the shopper's; sets which stores the range is drawn from."
},
"basis": {
"enum": [
"receipt",
"user_report"
],
"type": "string",
"description": "receipt: read from a receipt; user_report: the user said so."
},
"lines": {
"type": "array",
"items": {
"type": "object",
"required": [
"item",
"quantity",
"unit",
"paidMinor"
],
"properties": {
"item": {
"type": "string",
"minLength": 2,
"description": "The generic item, as compare_items takes it: \"chicken thighs\", \"large eggs\", \"bananas\". Not a brand or receipt code."
},
"unit": {
"enum": [
"kg",
"g",
"lb",
"l",
"ml",
"each"
],
"type": "string"
},
"label": {
"type": "string",
"maxLength": 200,
"description": "The receipt's own wording, kept as is."
},
"offerId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The flyer offer bought, if known (from search_offers)."
},
"quantity": {
"type": "number",
"exclusiveMinimum": 0
},
"paidMinor": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "What the line cost, in cents (after line discounts). null if unknown."
}
}
},
"maxItems": 60,
"minItems": 1
},
"banner": {
"type": "string",
"description": "Where it was bought, e.g. \"no-frills\"."
},
"storeId": {
"type": "string",
"description": "The store's id from stores_near, when known."
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
},
"operationId": {
"type": "string",
"maxLength": 100,
"minLength": 8,
"description": "A stable id for this write (e.g. a UUID you generate once per receipt). Replaying it returns the same receipt."
},
"purchasedOn": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Purchase date, YYYY-MM-DD."
},
"correctionReason": {
"type": "string",
"maxLength": 300
},
"supersedesPurchaseId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "A purchase this one corrects; the old one stays stored but leaves the totals."
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_savings — The user's savings record
The running savings record, as estimates compared with typical prices nearby: the headline `vsTypical` (paid vs the typical, median price of the same items around the store on the same days; positive = under typical), `vsCheapest` (left on the table) and `vsPriciest`, totals by flyer week and by month, the best and worst lines, every line with the prices behind it, `summary` (lead with this: what was compared, what wasn't and why), `shareable`, one sentence the user can post, and `method` with `methodUrl`, a short plain explanation of how savings are counted and where it's published, to give the user when they ask. Totals count ranged lines only; thin and unranged lines are counted separately. Free, including after the trial.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"linesLimit": {
"type": "integer",
"maximum": 200,
"minimum": 0,
"description": "Most recent lines to include (default 50)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}price_history — Price history for an item
An item's observed unit-price range (min, median, max per kg, L or item) by flyer week (Thursday to Wednesday), from flyer offers and shelf prices near a place, plus `longRun`: the Statistics Canada monthly average unit price for the item since 2017 (Ontario, else Canada), with its 1- and 5-year change. `weeksKnown` says how many weeks Gaurmon has: its history started with the Oct 29 2026 flyer week and grows by one each Thursday, so say so when it's short, and say `longRun` is a provincial average, not a store price.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"item"
],
"properties": {
"item": {
"type": "string",
"minLength": 2,
"description": "The generic item, as compare_items takes it: \"chicken thighs\", \"large eggs\", \"bananas\". Not a brand or receipt code."
},
"near": {
"type": "string",
"minLength": 3,
"description": "Where the shopper is: a Canadian postal code (\"M6H 2B6\"), an FSA (\"M6H\"), or \"lat,lng\"."
},
"unit": {
"enum": [
"kg",
"l",
"each"
],
"type": "string",
"description": "Compare in this unit (default: the one most prices use)."
},
"weeks": {
"type": "integer",
"maximum": 52,
"minimum": 1,
"description": "How many flyer weeks back, including this one (default 8)."
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_list — The user's grocery list
The user's grocery list and the meals behind it, kept by Gaurmon so they're the same in every agent and device. Each item is costed near a place for the amount needed (its own amount plus its meals'), from the cheapest flyer offer or everyday shelf price: by weight, by whole packages, multibuys per item; `price.how` says how and `approximate` when the size isn't comparable. `stops` groups items by store (at most `maxStores`, only `preferBanners` when set). `meals` lists each meal's ingredients and cost share; `mealIds` on an item says which meals need it. Unpriced items aren't counted in `totals`. Ids are for update_list and update_meals. Which stores to visit, and when, is yours to suggest.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"near": {
"type": "string",
"minLength": 3,
"description": "Where to price the list. Remembered for next time; omit to use the last place."
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
},
"maxStores": {
"anyOf": [
{
"type": "integer",
"maximum": 6,
"minimum": 1
},
{
"type": "null"
}
],
"description": "Shop at most this many stores (remembered; null clears it). The list is split across the set that prices the most items for the least."
},
"preferBanners": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Only these banners, e.g. [\"no-frills\", \"food-basics\"] (remembered; null clears it)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}update_list — Change the grocery list
Add items to, remove items from, or tick items on the user's grocery list by hand (at most 100 items; an item already on the list isn't added twice, but one there only for a meal becomes wanted by hand too). Give an amount for each item so it's costed right. Use item ids from get_list. `clear: "checked"` removes ticked items after a shop; `clear: "all"` empties the list and its meals. For a meal's ingredients use update_meals instead, so they stay linked. Returns the list like get_list. After a shop, offer to record what was bought with record_purchases.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"add": {
"type": "array",
"items": {
"type": "object",
"required": [
"item"
],
"properties": {
"item": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 200
},
"unit": {
"type": "string",
"maxLength": 20,
"description": "kg, g, lb, oz, L, mL, cup, tbsp, tsp, each, dozen, can, bunch…"
},
"amount": {
"type": "number",
"description": "How much, with `unit`.",
"exclusiveMinimum": 0
},
"quantity": {
"type": "string",
"maxLength": 40,
"description": "Or free text: \"2 kg\", \"a dozen\", \"2 x 227 g\"."
}
}
},
"maxItems": 50
},
"near": {
"type": "string",
"minLength": 3,
"description": "Where to price the list. Remembered for next time; omit to use the last place."
},
"check": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 100,
"description": "Mark bought."
},
"clear": {
"enum": [
"checked",
"all"
],
"type": "string"
},
"remove": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 100
},
"uncheck": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 100
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
},
"maxStores": {
"anyOf": [
{
"type": "integer",
"maximum": 6,
"minimum": 1
},
{
"type": "null"
}
],
"description": "Shop at most this many stores (remembered; null clears it). The list is split across the set that prices the most items for the least."
},
"preferBanners": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Only these banners, e.g. [\"no-frills\", \"food-basics\"] (remembered; null clears it)."
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}update_meals — Change the meals behind the grocery list
Add, remove, replace or edit the meals behind the user's grocery list; their ingredients go on and off the list to match, in one transaction. Send a whole plan at once with `add` (at most 21 meals, 40 ingredients each, amounts in any unit). Shared ingredients are combined where units allow. Removing a meal lowers what's needed of shared items and removes items no other meal needs, but never items added by hand; ticked items stay, marked noLongerNeeded. `replace` swaps a meal for another in one step. Returns the list like get_list plus `change` (items added and removed, estimate before and after) and `undo`: the update_meals arguments that reverse it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"add": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"ingredients"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 300
},
"source": {
"type": "string",
"maxLength": 300,
"description": "Where the recipe came from: a URL or a note."
},
"status": {
"enum": [
"planned",
"cooked",
"skipped"
],
"type": "string"
},
"servings": {
"type": "integer",
"maximum": 50,
"minimum": 1
},
"plannedFor": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD."
},
"ingredients": {
"type": "array",
"items": {
"type": "object",
"required": [
"item"
],
"properties": {
"item": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 200
},
"unit": {
"type": "string",
"maxLength": 20,
"description": "kg, g, lb, oz, L, mL, cup, tbsp, tsp, each, dozen, can, bunch…"
},
"amount": {
"type": "number",
"description": "How much, with `unit`.",
"exclusiveMinimum": 0
},
"quantity": {
"type": "string",
"maxLength": 40,
"description": "Or free text: \"2 kg\", \"a dozen\", \"2 x 227 g\"."
}
}
},
"maxItems": 40,
"minItems": 1
}
}
},
"maxItems": 21
},
"near": {
"type": "string",
"minLength": 3,
"description": "Where to price the list. Remembered for next time; omit to use the last place."
},
"remove": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 21
},
"update": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"note": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
]
},
"status": {
"enum": [
"planned",
"cooked",
"skipped"
],
"type": "string"
},
"servings": {
"anyOf": [
{
"type": "integer",
"maximum": 50,
"minimum": 1
},
{
"type": "null"
}
]
},
"plannedFor": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
{
"type": "null"
}
]
}
}
},
"maxItems": 21
},
"replace": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"with"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"with": {
"type": "object",
"required": [
"name",
"ingredients"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 300
},
"source": {
"type": "string",
"maxLength": 300,
"description": "Where the recipe came from: a URL or a note."
},
"status": {
"enum": [
"planned",
"cooked",
"skipped"
],
"type": "string"
},
"servings": {
"type": "integer",
"maximum": 50,
"minimum": 1
},
"plannedFor": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD."
},
"ingredients": {
"type": "array",
"items": {
"type": "object",
"required": [
"item"
],
"properties": {
"item": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 200
},
"unit": {
"type": "string",
"maxLength": 20,
"description": "kg, g, lb, oz, L, mL, cup, tbsp, tsp, each, dozen, can, bunch…"
},
"amount": {
"type": "number",
"description": "How much, with `unit`.",
"exclusiveMinimum": 0
},
"quantity": {
"type": "string",
"maxLength": 40,
"description": "Or free text: \"2 kg\", \"a dozen\", \"2 x 227 g\"."
}
}
},
"maxItems": 40,
"minItems": 1
}
}
}
}
},
"maxItems": 21
},
"radiusKm": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Search radius in km around `near` (default 5)."
},
"maxStores": {
"anyOf": [
{
"type": "integer",
"maximum": 6,
"minimum": 1
},
{
"type": "null"
}
],
"description": "Shop at most this many stores (remembered; null clears it). The list is split across the set that prices the most items for the least."
},
"preferBanners": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Only these banners, e.g. [\"no-frills\", \"food-basics\"] (remembered; null clears it)."
}
}
}{
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}Prompts
Not advertised
Resources
1 advertised
Gaurmon
Offer cards, store comparisons, shelf prices and flyer evidence.
ui://gaurmon/view-9f2b675f9c.htmlGaurmon (earlier builds)
Gaurmon's view, for URIs from earlier builds.
ui://gaurmon/view-{build}.htmlGaurmon (v1 offers)
Gaurmon's view, for URIs from earlier builds.
ui://gourman/{name}90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
- 2026-11-09: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 690 ms
- 95th percentile latency
- 690 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 690 ms · metadata changed · 16 tool(s), 1 resource(s), 2 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http gaurmon-mcp https://www.gaurmon.com/api/mcpCodex
codex mcp add gaurmon-mcp --url https://www.gaurmon.com/api/mcpCursor
{
"mcpServers": {
"gaurmon-mcp": {
"url": "https://www.gaurmon.com/api/mcp"
}
}
}Cline
{
"mcpServers": {
"gaurmon-mcp": {
"type": "streamableHttp",
"url": "https://www.gaurmon.com/api/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"gaurmon-mcp": {
"type": "http",
"url": "https://www.gaurmon.com/api/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http gaurmon-mcp https://www.gaurmon.com/api/mcpClaude Desktop
https://www.gaurmon.com/api/mcpWindsurf
{
"mcpServers": {
"gaurmon-mcp": {
"serverUrl": "https://www.gaurmon.com/api/mcp"
}
}
}Let your agent find its tools
Find servers like Gaurmon MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other commerce servers
Do you run Gaurmon MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.