Koskamo

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.

Gaurmon MCP logo, by GaurmonVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Gaurmon
You need:sign in with Google or emailAgents that support remote MCP connectors with sign-in
MCP endpoint (Streamable HTTP)
https://www.gaurmon.com/api/mcp
Vendor documentation

What its tools do

16 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

16 of 16 have a description · 16 of 16 declare behavior hints · 6 of 14 with parameters document them all

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

Vendor evidenceRegistry 1.0.1

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
Server-advertised capabilities
{
  "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.

Gaurmon provides grocery price evidence for the Greater Toronto Area: stores near a Canadian postal code, this week's flyer offers with unit prices per kg, litre or item, everyday shelf prices, and the flyer image behind each offer. Tools are read-only and return facts with sources and dates; they do not plan meals or place orders. Most tools take `near` (a postal code, FSA or lat,lng) to scope results to nearby stores. Where the host shows MCP App views, tool results also appear to the user as Gaurmon cards you can't see, so don't retype them or say there's no card; to show offers you chose, in your order, call show_offers.

Tools

16 advertised

locate — Locate a place
Advertised by the server during the last successful anonymous check.
Advertised read-only

Place a Canadian postal code, FSA or lat,lng as coordinates. Free. Use it to check a location before searching.

locate input schema
{
  "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\"."
    }
  }
}
locate annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
coverage — What Gaurmon covers
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

coverage input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
coverage annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_status — Gaurmon account status
Advertised by the server during the last successful anonymous check.
Advertised read-only

The user's Gaurmon plan: trial days left, or the paid plan and when it renews. Free.

account_status input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
account_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
stores_near — Grocery stores near a place
Advertised by the server during the last successful anonymous check.
Advertised read-only

Stores within a radius, nearest first, each with every flyer it runs this week and how many offers each flyer has.

stores_near input schema
{
  "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)."
    }
  }
}
stores_near annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_offers — Search flyer offers
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_offers input schema
{
  "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"
    }
  }
}
search_offers annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
show_offers — Show chosen offers
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

show_offers input schema
{
  "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)."
    }
  }
}
show_offers annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_items — Compare items across stores
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

compare_items input schema
{
  "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)."
    }
  }
}
compare_items annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
shelf_prices — Everyday shelf prices
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

shelf_prices input schema
{
  "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)."
    }
  }
}
shelf_prices annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_offer_evidence — Flyer evidence for an offer
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_offer_evidence input schema
{
  "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)$"
    }
  }
}
get_offer_evidence annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
price_range — Price range for an item
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

price_range input schema
{
  "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."
    }
  }
}
price_range annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
record_purchases — Record a purchase in the savings record
Advertised by the server during the last successful anonymous check.

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`.

record_purchases input schema
{
  "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."
    }
  }
}
record_purchases annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_savings — The user's savings record
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_savings input schema
{
  "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)."
    }
  }
}
get_savings annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
price_history — Price history for an item
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

price_history input schema
{
  "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)."
    }
  }
}
price_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_list — The user's grocery list
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_list input schema
{
  "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)."
    }
  }
}
get_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_list — Change the grocery list
Advertised by the server during the last successful anonymous check.
Advertised destructive

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.

update_list input schema
{
  "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)."
    }
  }
}
update_list annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
update_meals — Change the meals behind the grocery list
Advertised by the server during the last successful anonymous check.
Advertised destructive

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.

update_meals input schema
{
  "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)."
    }
  }
}
update_meals annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

Gaurmon

Advertised by the server during the last successful anonymous check.

Offer cards, store comparisons, shelf prices and flyer evidence.

Gaurmon URI
ui://gaurmon/view-9f2b675f9c.html

MIME type: text/html;profile=mcp-app

Gaurmon (earlier builds)

Advertised by the server during the last successful anonymous check.

Gaurmon's view, for URIs from earlier builds.

Gaurmon (earlier builds) URI template
ui://gaurmon/view-{build}.html

MIME type: text/html;profile=mcp-app

Gaurmon (v1 offers)

Advertised by the server during the last successful anonymous check.

Gaurmon's view, for URIs from earlier builds.

Gaurmon (v1 offers) URI template
ui://gourman/{name}

MIME type: text/html;profile=mcp-app

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.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-07: 1 of 1 checks answered
  2. 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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http gaurmon-mcp https://www.gaurmon.com/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add gaurmon-mcp --url https://www.gaurmon.com/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable gaurmon-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "gaurmon-mcp": {
      "url": "https://www.gaurmon.com/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "gaurmon-mcp": {
      "type": "streamableHttp",
      "url": "https://www.gaurmon.com/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start gaurmon-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "gaurmon-mcp": {
      "type": "http",
      "url": "https://www.gaurmon.com/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http gaurmon-mcp https://www.gaurmon.com/api/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://www.gaurmon.com/api/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.

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.

Claim this listing