_ registry / mcp + a2a streamable-http · checked 1h ago

piknik

https://piknik.spot

Registry code: 242d61f657ed8af0

api record

Piknik local food system platform. Public discovery tools are available; sign in via OAuth or a Personal Access Token (Settings → Developer) for write tools like create_listing, create_recipe, and get_my_places.

endpoint
https://piknik.spot/api/mcp
door code
26f0d0461cf4cf2b
protocol
streamable-http ·2025-03-26
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is piknik live?
Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
Is piknik free to use?
Partly — some of its tools are open, others need a key or payment.
What tools does piknik have?
74 tools: geocode_place, suggest_place, search_products, search_jobs, geocode_address, apply_association, create_listing, calculate_local_food_score, ….
Is piknik safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
99.5%

90 days 99.2%· all time 99.3%

latency
502ms

last good check

priced tools
0

of 74 tools

_ answered our checks, 90 days 1651 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • down → live
  • degraded → down· timeout after 20000ms
  • live → degraded· timeout after 20000ms
_ what it is for
used for
  • find local farms and markets nearby
  • search local food events
  • search food jobs and volunteer posts
  • create listings and events for a local food place
takes → gives
text, data → data
tools
11 reads14 changes data
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 74 tools
8 open9 auth-required 57 never probed 17 of 74 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • fetch_ontario_grocery_retailers reads open 56d ago

    Fetch active Ontario grocery and convenience retailers from AGCO open data. Classifies each by consumer capacity tier (minimal gas/convenience vs community grocer vs regional chain) using licence type and premises type.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "format": {
          "enum": [
            "summary",
            "json"
          ],
          "type": "string",
          "default": "summary",
          "description": "Response format. Use \"json\" for structured retailer records."
        }
      }
    }
    arguments 14 lines
  • get_seasonal_guide open 38d ago

    List local products in season for a given month and growing zone, along with nearby places that currently carry them. Defaults to the current month and Waterloo Region (zone 5b).

    mcp-tool

    {
      "type": "object",
      "properties": {
        "month": {
          "type": "string",
          "description": "Month name or number (1-12). Defaults to the current month."
        },
        "address": {
          "type": "string",
          "description": "Address used to resolve the growing zone and rank places by distance (e.g., \"Kitchener, Ontario\"). Use either address or coordinates, not both."
        },
        "latitude": {
          "type": "number",
          "description": "Latitude coordinate (use with longitude instead of address)"
        },
        "longitude": {
          "type": "number",
          "description": "Longitude coordinate (use with latitude instead of address)"
        }
      }
    }
    arguments 21 lines
  • get_professional_profile reads open 41d ago

    Get professional networking profile information. Respects PROFESSIONAL_NETWORKING feature flag.

    mcp-tool

    {
      "type": "object",
      "required": [
        "username"
      ],
      "properties": {
        "username": {
          "type": "string",
          "description": "Profile username/slug to retrieve"
        }
      }
    }
    arguments 12 lines
  • list_service_locations open 41d ago

    List all service locations (pickup points, delivery hubs) for a specific place. Service locations can be used for CSA pickups, farmers market stalls, delivery points, etc.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id"
      ],
      "properties": {
        "purpose": {
          "enum": [
            "CSA_PICKUP",
            "MARKET_STALL",
            "DELIVERY_DROPOFF",
            "SECONDARY_LOCATION",
            "FARMERS_MARKET",
            "DELIVERY_HUB",
            "PICKUP_POINT"
          ],
          "type": "string",
          "description": "Filter by purpose. Aliases FARMERS_MARKET, DELIVERY_HUB, and PICKUP_POINT are accepted."
        },
        "participant_id": {
          "type": "string",
          "description": "ID of the place to list service locations for"
        },
        "include_inactive": {
          "type": "boolean",
          "default": false,
          "description": "Include inactive locations"
        }
      }
    }
    arguments 30 lines
  • list_products open 41d ago

    List products/offerings for a place, including kind, paused state, and pack sell prices (ways they sell: kg, eighth, etc.). Use create_pack_price to add sell packs on STAPLE offerings.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id"
      ],
      "properties": {
        "search": {
          "type": "string",
          "description": "Search by name or description"
        },
        "category": {
          "type": "string",
          "description": "Filter by category (e.g., vegetables, fruit, meat, dairy)"
        },
        "participant_id": {
          "type": "string",
          "description": "ID of the place"
        },
        "include_inactive": {
          "type": "boolean",
          "default": false
        }
      }
    }
    arguments 24 lines
  • fetch_ontario_farms reads open 56d ago

    Fetch Ontario farm/agri-business records from government open data for populating Piknik. Returns OMAFRA-licensed meat and dairy plants (individual business records with addresses) plus census mid-tier farm counts by county ($100k–$999k receipts, 2021). Does NOT read from existing Piknik data.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "format": {
          "enum": [
            "summary",
            "json"
          ],
          "type": "string",
          "default": "summary",
          "description": "Response format. Use \"json\" for structured farm records."
        }
      }
    }
    arguments 14 lines
  • get_recipe open 41d ago

    Get a recipe by ID (UUID/cuid). Drafts require ownership or admin.

    mcp-tool

    {
      "type": "object",
      "required": [
        "recipe_id"
      ],
      "properties": {
        "recipe_id": {
          "type": "string",
          "description": "Recipe ID"
        }
      }
    }
    arguments 12 lines
  • list_cuisines reads open 41d ago

    List cuisine tags for recipes (id, slug, label). Use IDs with create_recipe / update_recipe.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "query": {
          "type": "string",
          "description": "Optional filter on label/slug"
        }
      }
    }
    arguments 9 lines
  • list_associations auth-required 41d ago

    List associations (id, slug, name). Authenticated. Use before create_place_tour or apply_association.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "number",
          "default": 40
        },
        "query": {
          "type": "string",
          "description": "Filter by name or slug"
        }
      }
    }
    arguments 13 lines
  • get_analytics_metrics reads auth-required 56d ago

    Get analytics and business intelligence metrics for the food system. Admin access required.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "time_range": {
          "enum": [
            "7d",
            "30d",
            "90d"
          ],
          "type": "string",
          "default": "30d",
          "description": "Time range for analytics"
        },
        "metric_type": {
          "enum": [
            "overview",
            "businesses",
            "users",
            "engagement",
            "geographic"
          ],
          "type": "string",
          "default": "overview",
          "description": "Type of analytics to retrieve"
        }
      }
    }
    arguments 27 lines
  • get_marketplace_demand auth-required 41d ago

    🔐 AUTHENTICATED: What people are asking for on the marketplace (posted requests and searches), matched to known food categories and items, as anonymous totals. Nothing is tied to a person or an area. Admins see all demand; place owners see demand for what their own places offer, with how many places already offer each thing.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "days": {
          "enum": [
            7,
            30,
            90
          ],
          "type": "number",
          "description": "Look-back window in days (default 30)"
        },
        "participant_id": {
          "type": "string",
          "description": "Optional: limit the view to one place you manage (get from get_my_places)"
        }
      }
    }
    arguments 18 lines
  • list_neighborhoods auth-required 41d ago

    🔐 ADMIN ONLY: List Waterloo Region neighborhoods (optional municipality filter). Each row includes id, label, kind, municipality, GPS, benchmark price (CAD), DOM, and previousPrice when set. Missing housing fields show as n/a. Structured result.neighborhoods has the full objects.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "municipality": {
          "type": "string",
          "description": "Filter neighborhoods by municipality (e.g. \"Kitchener\", \"Waterloo\", \"Cambridge\", \"Wilmot\", \"Wellesley\", \"Woolwich\", \"North Dumfries\")"
        }
      }
    }
    arguments 9 lines
  • list_pack_prices auth-required 41d ago

    🔐 AUTHENTICATED: List pack/sell-price quotes (includes source_url shop link when set). Filter by place, offering_id, category, quote_id, or fresh_only. Pass include_paused=true to see paused packs (farmer view).

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "limit": {
          "type": "number",
          "description": "Max rows (default 50, max 200)"
        },
        "category": {
          "type": "string",
          "description": "Plate category (potato, eggs, …)"
        },
        "quote_id": {
          "type": "string",
          "description": "Fetch a single quote by ID"
        },
        "fresh_only": {
          "type": "boolean",
          "description": "Only quotes within 31 days (default false)"
        },
        "offering_id": {
          "type": "string"
        },
        "include_paused": {
          "type": "boolean",
          "description": "Include paused packs (default false)"
        },
        "participant_id": {
          "type": "string",
          "description": "Filter by place ID"
        }
      }
    }
    arguments 33 lines
  • list_surplus_category_pages auth-required 14h ago

    🔐 ADMIN: List surplus SEO category pages (slug, summary, pathways). Use before editing copy.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "include_unpublished": {
          "type": "boolean",
          "description": "Include unpublished pages (default false)"
        }
      }
    }
    arguments 9 lines
  • get_my_places auth-required 56d ago

    🔐 AUTHENTICATED: Get list of places (farms, restaurants, markets) that the authenticated user owns or has access to manage. Useful for finding participant_id to use with update_place, create_listing, or create_event.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_place_tours reads auth-required 41d ago

    List drafts and published walking tours for an association you can manage. Returns tours and member places for stops.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "slug": {
          "type": "string",
          "description": "Association slug if id is unknown"
        },
        "association_id": {
          "type": "string",
          "description": "Association id"
        }
      }
    }
    arguments 13 lines
  • list_surplus_source_maps auth-required 14h ago

    🔐 ADMIN: List structured offering→surplus maps (exact FoodCategory keys and Product overrides). No substring rules.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "include_inactive": {
          "type": "boolean",
          "description": "Include inactive maps (default false)"
        }
      }
    }
    arguments 9 lines
  • geocode_place unknown never probed

    🔐 ADMIN ONLY: Detect and set GPS coordinates for a place by geocoding its existing address. Useful for fixing places missing coordinates or correcting inaccurate ones.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id"
      ],
      "properties": {
        "force_redetect": {
          "type": "boolean",
          "default": false,
          "description": "Force re-detection even if place already has coordinates (useful for correcting wrong coordinates)"
        },
        "participant_id": {
          "type": "string",
          "description": "ID of the place to geocode"
        }
      }
    }
    arguments 17 lines
  • suggest_place unknown never probed

    Analyze location coverage gaps and create a new place suggestion. ONLY use this when there is verifiable evidence (such as a website, business registry, or direct confirmation) of the physical business existence. Do NOT make assumptions or suggest unverified places. Returns participant_id in the response when authenticated with business_name

    mcp-tool

    {
      "type": "object",
      "required": [
        "address",
        "business_type"
      ],
      "properties": {
        "radius": {
          "type": "number",
          "default": 25,
          "description": "Analysis radius in kilometers"
        },
        "address": {
          "type": "string",
          "description": "Address to analyze (e.g., \"123 Main St, Toronto, ON\" or \"Toronto, Ontario\")"
        },
        "context": {
          "type": "string",
          "description": "Context for the new business (e.g., \"farmers market\", \"organic grocery\", \"local bakery\")"
        },
        "website": {
          "type": "string",
          "description": "Business website URL (shown on the public place page when approved)"
        },
        "business_name": {
          "type": "string",
          "description": "Proposed name for the new business"
        },
        "business_type": {
          "enum": [
            "farms",
            "restaurants",
            "markets",
            "merchants",
            "processors",
            "delivery"
          ],
          "type": "string",
          "description": "Type of business to analyze for"
        },
        "contact_email": {
          "type": "string",
          "description": "Business contact email (e.g., \"[email protected]\")"
        },
        "contact_phone": {
          "type": "string",
          "description": "Business contact phone number (e.g., \"519-827-7946\")"
        },
        "operating_hours": {
          "type": "string",
          "description": "Proposed operating hours (e.g., \"Monday-Friday: 9:00 AM - 5:00 PM\")"
        },
        "business_address": {
          "type": "string",
          "description": "Full street address for the business (e.g., \"3320 First Ave, Vineland, ON L0R 2E0\"). Use the farm or shop location, not a region placeholder like \"Waterloo Region, ON\"."
        }
      }
    }
    arguments 58 lines
  • search_products reads unknown never probed

    Search the shared product catalog by name or alias. Returns product_id values to pass to create_product. No authentication required.

    mcp-tool

    {
      "type": "object",
      "required": [
        "query"
      ],
      "properties": {
        "limit": {
          "type": "number",
          "default": 10,
          "description": "Maximum results (default 10, max 50)"
        },
        "query": {
          "type": "string",
          "description": "Search term (minimum 2 characters, e.g. \"eggs\", \"maple syrup\", \"tomatoes\")"
        },
        "category": {
          "type": "string",
          "description": "Optional category filter (e.g., vegetables, fruit, meat, dairy, eggs)"
        }
      }
    }
    arguments 21 lines
  • search_jobs reads unknown never probed

    Search job and volunteer postings. Public. Filter by place, text, employment type, or location. Use before create_job to avoid duplicates.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "number",
          "default": 20
        },
        "query": {
          "type": "string",
          "description": "Search title and description"
        },
        "status": {
          "enum": [
            "ACTIVE",
            "PAUSED",
            "FILLED",
            "EXPIRED",
            "CANCELLED",
            "all"
          ],
          "type": "string",
          "description": "Default ACTIVE. Use all when checking for existing postings."
        },
        "address": {
          "type": "string",
          "description": "Search around this address"
        },
        "latitude": {
          "type": "number"
        },
        "longitude": {
          "type": "number"
        },
        "radius_km": {
          "type": "number",
          "default": 50,
          "description": "Radius when location is set"
        },
        "participant_id": {
          "type": "string",
          "description": "Limit to one place"
        },
        "employment_type": {
          "enum": [
            "PAID",
            "VOLUNTEER"
          ],
          "type": "string"
        },
        "include_expired": {
          "type": "boolean",
          "description": "Include jobs past expires_at (default false)"
        }
      }
    }
    arguments 55 lines
  • geocode_address unknown never probed

    Convert an address string to latitude and longitude coordinates. Uses hybrid geocoding (Google Maps API with Nominatim fallback) for accurate results.

    mcp-tool

    {
      "type": "object",
      "required": [
        "address"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Address to geocode (e.g., \"Waterloo, Ontario\" or \"123 Main St, Toronto, ON\")"
        }
      }
    }
    arguments 12 lines
  • apply_association changes data unknown never probed

    🔐 ADMIN ONLY: Link a participant (farm, restaurant, market) to an association (like EFAO or WRCGN).

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id",
        "association_id"
      ],
      "properties": {
        "notes": {
          "type": "string",
          "description": "Optional notes"
        },
        "verified": {
          "type": "boolean",
          "default": true,
          "description": "Whether the membership is verified"
        },
        "association_id": {
          "type": "string",
          "description": "The ID of the association (e.g., EFAO ID)"
        },
        "participant_id": {
          "type": "string",
          "description": "The ID of the participant (place) to link"
        },
        "membership_level": {
          "type": "string",
          "description": "Optional membership level"
        },
        "membership_number": {
          "type": "string",
          "description": "Optional membership number"
        }
      }
    }
    arguments 34 lines
  • create_listing unknown never probed

    Authenticated: Create a personal listing by omitting participant_id (explicit audience required), or a place listing using a managed participant_id. Email verification required.

    mcp-tool

    {
      "type": "object",
      "required": [
        "listing_type",
        "title",
        "description",
        "end_date"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Title of the listing (e.g., \"Organic Carrots Available\", \"Looking for Fresh Milk\")"
        },
        "end_date": {
          "type": "string",
          "description": "When the listing expires (ISO date format, e.g., \"2026-02-15\")"
        },
        "quantity": {
          "type": "string",
          "description": "Quantity available or needed (e.g., \"50 lbs\", \"10 boxes\", \"3 bushels\")"
        },
        "radius_km": {
          "type": "number",
          "default": 5,
          "description": "Service radius in kilometers (how far you are willing to sell/buy within)"
        },
        "description": {
          "type": "string",
          "description": "Detailed description of the listing"
        },
        "offering_id": {
          "type": "string",
          "description": "Optional: link to a place offering (STAPLE or COMPOSED) owned by participant_id"
        },
        "listing_type": {
          "enum": [
            "for_sale",
            "wanted_to_buy",
            "surplus_available"
          ],
          "type": "string",
          "description": "Type of listing"
        },
        "origin_label": {
          "type": "string",
          "description": "Coarse neighborhood label for PUBLIC posts; not a pickup location"
        },
        "audience_mode": {
          "enum": [
            "PUBLIC",
            "PLACES"
          ],
          "type": "string",
          "description": "Required for personal posts; explicit Public or member places"
        },
        "contact_method": {
          "enum": [
            "email"
          ],
          "type": "string",
          "description": "Legacy listing field; interest uses verified email, without revealing your address unless you opt in"
        },
        "participant_id": {
          "type": "string",
          "description": "Optional managed place ID from get_my_places. Omit to post as yourself."
        },
        "association_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Optional: IDs of associations this listing is affiliated with"
        },
        "origin_latitude": {
          "type": "number",
          "description": "Private approximate area latitude for PUBLIC personal posts"
        },
        "origin_place_id": {
          "type": "string",
          "description": "One audience place to anchor approximate distance for PLACES"
        },
        "origin_longitude": {
          "type": "number",
          "description": "Private approximate area longitude for PUBLIC personal posts"
        },
        "wanted_in_return": {
          "type": "string",
          "description": "Optional: What you're seeking in exchange (e.g., \"fresh eggs\", \"vegetables\", \"delivery help\"). Enables barter/trade matching."
        },
        "audience_place_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Active member place IDs when audience_mode is PLACES"
        },
        "share_contact_email": {
          "type": "boolean",
          "description": "Explicit opt-in to sharing poster email with eligible interested users; defaults false"
        }
      }
    }
    arguments 102 lines
  • calculate_local_food_score unknown never probed

    Calculate the Local Food Score for a given address or coordinates. Returns a score from 0-100 with three factors: how local, easy to get, and covers a diet. Only counts food grown within 100 km that is reachable through channels in the search radius.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "address": {
          "type": "string",
          "description": "Address to calculate score for (e.g., \"610 Sandringham Dr, Waterloo, Ontario\"). Use either address or coordinates, not both."
        },
        "latitude": {
          "type": "number",
          "description": "Latitude coordinate (use with longitude instead of address)"
        },
        "longitude": {
          "type": "number",
          "description": "Longitude coordinate (use with latitude instead of address)"
        },
        "radius_km": {
          "type": "number",
          "default": 8,
          "maximum": 30,
          "minimum": 1,
          "description": "Search radius in kilometers (default: 8, min: 1, max: 30)"
        }
      }
    }
    arguments 24 lines
  • link_google_place unknown never probed

    🔐 ADMIN ONLY: Search Google Places for a Piknik place and optionally store its googlePlaceId after human review. Returns ranked candidates with 0-100 match scores and score breakdowns (name, address, status, type, proximity). Default action is search. Linking requires an explicit google_place_id unless auto_select is true.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "force": {
          "type": "boolean",
          "default": false,
          "description": "Relink even if the participant already has a validated Google Place ID."
        },
        "limit": {
          "type": "number",
          "default": 5,
          "description": "Maximum candidates to return for action=search."
        },
        "action": {
          "enum": [
            "search",
            "link"
          ],
          "type": "string",
          "default": "search",
          "description": "search returns Google candidates for human review; link stores the chosen match on the participant."
        },
        "address": {
          "type": "string",
          "description": "Address to search. Defaults to the participant address when participant_id is provided."
        },
        "auto_select": {
          "type": "boolean",
          "default": false,
          "description": "When true, link may pick the top Google candidate automatically if it meets min_confidence. Default false — human should pass google_place_id."
        },
        "business_name": {
          "type": "string",
          "description": "Business name to search. Defaults to the participant name when participant_id is provided."
        },
        "min_confidence": {
          "enum": [
            "high",
            "medium",
            "low"
          ],
          "type": "string",
          "default": "high",
          "description": "Minimum confidence required only when auto_select is true."
        },
        "participant_id": {
          "type": "string",
          "description": "Piknik participant ID to link. Required for action=link."
        },
        "google_place_id": {
          "type": "string",
          "description": "Google Place ID chosen by a human reviewer. Required for action=link unless auto_select is true."
        }
      }
    }
    arguments 55 lines
  • search_games unknown never probed

    Search for active gamification challenges and geographic games. Respects GAMIFICATION_SYSTEM feature flag.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "status": {
          "enum": [
            "ACTIVE",
            "UPCOMING",
            "COMPLETED",
            "all"
          ],
          "type": "string",
          "default": "ACTIVE",
          "description": "Game status filter"
        },
        "location": {
          "type": "object",
          "properties": {
            "lat": {
              "type": "number"
            },
            "lng": {
              "type": "number"
            }
          }
        },
        "include_stats": {
          "type": "boolean",
          "default": true,
          "description": "Include participation statistics"
        }
      }
    }
    arguments 32 lines
  • search_listings unknown never probed

    Authenticated search for food and gardening-tool listings near a specified area. Defaults to 5 km; signed-in audience permissions apply.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "number",
          "default": 20,
          "description": "Maximum number of listings to return"
        },
        "query": {
          "type": "string",
          "description": "Search query for listing title or description (e.g., \"organic carrots\", \"fresh milk\", \"delivery service\")"
        },
        "address": {
          "type": "string",
          "description": "Address to search near (e.g., \"Waterloo, Ontario\"). Will geocode and filter by distance."
        },
        "location": {
          "type": "object",
          "properties": {
            "lat": {
              "type": "number",
              "description": "Latitude coordinate"
            },
            "lng": {
              "type": "number",
              "description": "Longitude coordinate"
            }
          },
          "description": "Location coordinates. Use either address or location, not both."
        },
        "radius_km": {
          "type": "number",
          "default": 5,
          "description": "Search radius in kilometers; defaults to nearby 5 km"
        },
        "listing_type": {
          "enum": [
            "all",
            "for_sale",
            "wanted_to_buy",
            "surplus_available"
          ],
          "type": "string",
          "default": "all",
          "description": "Filter by listing type"
        }
      }
    }
    arguments 48 lines
  • moderate_listing_audience changes data unknown never probed

    Authenticated place owner/admin: hide or restore a personal listing only within your place feed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "place_id",
        "listing_id",
        "hidden"
      ],
      "properties": {
        "hidden": {
          "type": "boolean",
          "description": "True to hide here; false to restore here"
        },
        "place_id": {
          "type": "string"
        },
        "listing_id": {
          "type": "string"
        }
      }
    }
    arguments 20 lines
  • update_listing unknown never probed

    Authenticated: Edit a listing you created or a place listing you manage. Personal audience changes require active membership and a safe approximate origin.

    mcp-tool

    {
      "type": "object",
      "required": [
        "listing_id"
      ],
      "properties": {
        "title": {
          "type": "string"
        },
        "end_date": {
          "type": "string",
          "description": "ISO expiry date"
        },
        "quantity": {
          "type": "string"
        },
        "listing_id": {
          "type": "string",
          "description": "Listing to edit"
        },
        "description": {
          "type": "string"
        },
        "origin_label": {
          "type": "string"
        },
        "audience_mode": {
          "enum": [
            "PUBLIC",
            "PLACES"
          ],
          "type": "string"
        },
        "origin_latitude": {
          "type": "number"
        },
        "origin_place_id": {
          "type": "string"
        },
        "origin_longitude": {
          "type": "number"
        },
        "wanted_in_return": {
          "type": "string"
        },
        "audience_place_ids": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "share_contact_email": {
          "type": "boolean",
          "description": "Explicit opt-in; defaults off"
        }
      }
    }
    arguments 57 lines
  • create_event changes data unknown never probed

    🔐 AUTHENTICATED: Create a new event (farmers market, workshop, community gathering, etc.). Requires OAuth authentication with events:write scope. Respects EVENT_SYSTEM feature flag. Events can be created with or without a participant (place) association.

    mcp-tool

    {
      "type": "object",
      "required": [
        "title",
        "description",
        "start_date",
        "end_date",
        "address"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Event title (e.g., \"Weekly Farmers Market\", \"Organic Farming Workshop\")"
        },
        "address": {
          "type": "string",
          "description": "Full address of the event location"
        },
        "end_date": {
          "type": "string",
          "description": "Event end date and time (ISO format)"
        },
        "event_type": {
          "enum": [
            "market",
            "workshop",
            "tour",
            "festival",
            "meeting",
            "other"
          ],
          "type": "string",
          "description": "Type of event"
        },
        "start_date": {
          "type": "string",
          "description": "Event start date and time (ISO format)"
        },
        "description": {
          "type": "string",
          "description": "Detailed event description"
        },
        "weekly_days": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Weekly recurrence days (e.g., [\"monday\", \"thursday\"]). Preferred over recurrence_rule when both are set."
        },
        "is_recurring": {
          "type": "boolean",
          "default": false,
          "description": "Whether this is a recurring event"
        },
        "location_name": {
          "type": "string",
          "description": "Name of the event location (e.g., \"Waterloo Public Square\")"
        },
        "participant_id": {
          "type": "string",
          "description": "Optional: The ID of your place creating the event (get from get_my_places). If omitted, creates a standalone event not tied to any business."
        },
        "recurrence_rule": {
          "type": "string",
          "description": "Recurrence rule (e.g., \"FREQ=WEEKLY;BYDAY=SA\" for every Saturday)"
        },
        "registration_url": {
          "type": "string",
          "description": "URL for event registration or more info"
        },
        "recurrence_end_date": {
          "type": "string",
          "description": "Last date for recurring instances (ISO format, e.g., end of academic term)"
        }
      }
    }
    arguments 76 lines
  • claim_delivery_task changes data unknown never probed

    🔐 AUTHENTICATED: Claim a delivery coordination task. Caller must have a participant with canDeliver: true.

    mcp-tool

    {
      "type": "object",
      "required": [
        "task_id"
      ],
      "properties": {
        "task_id": {
          "type": "string",
          "description": "ID of the delivery task to claim"
        }
      }
    }
    arguments 12 lines
  • search_offerings unknown never probed

    Search for products and offerings across all places (farms, restaurants, processors). Find what products are available, where, and at what price.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Filter by tags (e.g., [\"organic\", \"certified\"])"
        },
        "limit": {
          "type": "number",
          "default": 50,
          "description": "Maximum results to return"
        },
        "query": {
          "type": "string",
          "description": "Search text to match product name or description"
        },
        "radius": {
          "type": "number",
          "default": 50,
          "description": "Search radius in kilometers"
        },
        "sort_by": {
          "enum": [
            "distance",
            "price_low",
            "price_high",
            "name"
          ],
          "type": "string",
          "default": "distance",
          "description": "Sort results by distance, price, or name"
        },
        "category": {
          "type": "string",
          "description": "Filter by product category (e.g., \"vegetables\", \"fruits\", \"dairy\")"
        },
        "group_by": {
          "enum": [
            "offering",
            "place"
          ],
          "type": "string",
          "default": "offering",
          "description": "Group results by individual offering or by place"
        },
        "latitude": {
          "type": "number",
          "description": "Center latitude for distance search (e.g., 43.4643 for Waterloo, ON)"
        },
        "longitude": {
          "type": "number",
          "description": "Center longitude for distance search (e.g., -80.5204 for Waterloo, ON)"
        },
        "price_max": {
          "type": "number",
          "description": "Maximum price filter"
        },
        "price_min": {
          "type": "number",
          "description": "Minimum price filter"
        },
        "place_types": {
          "type": "array",
          "items": {
            "enum": [
              "FARM",
              "RESTAURANT",
              "MARKET",
              "PROCESSOR",
              "DELIVERY",
              "COMMUNITY_GARDEN",
              "MERCHANT"
            ],
            "type": "string"
          },
          "description": "Filter by place types (e.g., [\"FARM\", \"PROCESSOR\"])"
        },
        "is_available": {
          "type": "boolean",
          "default": true,
          "description": "Only show available offerings"
        },
        "allows_pickup": {
          "type": "boolean",
          "description": "Only show offerings that allow pickup"
        },
        "offering_type": {
          "enum": [
            "PRODUCT",
            "SERVICE",
            "EVENT",
            "SUBSCRIPTION"
          ],
          "type": "string",
          "description": "Filter by offering type (SUBSCRIPTION for CSA programs)"
        },
        "allows_delivery": {
          "type": "boolean",
          "description": "Only show offerings that allow delivery"
        }
      }
    }
    arguments 105 lines
  • list_all_places reads unknown 41d ago

    List all places (farms, markets, restaurants, community gardens) within a radius of coordinates. Get full inventory of participants in an area.

    mcp-tool

    {
      "type": "object",
      "required": [
        "latitude",
        "longitude"
      ],
      "properties": {
        "limit": {
          "type": "number",
          "default": 100,
          "description": "Maximum results to return"
        },
        "format": {
          "enum": [
            "summary",
            "json"
          ],
          "type": "string",
          "default": "summary",
          "description": "Response format. Use \"json\" for structured place records."
        },
        "offset": {
          "type": "number",
          "default": 0,
          "description": "Pagination offset"
        },
        "status": {
          "enum": [
            "ACTIVE",
            "DRAFT",
            "all"
          ],
          "type": "string",
          "default": "ACTIVE",
          "description": "Filter by status"
        },
        "latitude": {
          "type": "number",
          "description": "Center latitude (e.g., 43.4643 for Waterloo, ON)"
        },
        "longitude": {
          "type": "number",
          "description": "Center longitude (e.g., -80.5204 for Waterloo, ON)"
        },
        "radius_km": {
          "type": "number",
          "default": 50,
          "description": "Search radius in kilometers"
        },
        "primary_role": {
          "oneOf": [
            {
              "enum": [
                "FARM",
                "RESTAURANT",
                "MARKET",
                "PROCESSOR",
                "DELIVERY",
                "COMMUNITY_GARDEN",
                "all"
              ],
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "enum": [
                  "FARM",
                  "RESTAURANT",
                  "MARKET",
                  "PROCESSOR",
                  "DELIVERY",
                  "COMMUNITY_GARDEN"
                ],
                "type": "string"
              }
            }
          ],
          "default": "all",
          "description": "Filter by place type(s). Use \"all\" for all types, single string, or array of types (e.g., [\"FARM\", \"MARKET\"])"
        },
        "include_distance": {
          "type": "boolean",
          "default": true,
          "description": "Include distance from center in results"
        }
      }
    }
    arguments 88 lines
  • create_service_location changes data unknown never probed

    🔐 AUTHENTICATED: Create a new service location (CSA pickup point, farmers market stall, delivery hub) for your place. Address will be auto-geocoded.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id",
        "name",
        "purpose"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Location name (e.g., Downtown Pickup, Tuesday Market Stall)"
        },
        "address": {
          "type": "string",
          "description": "Full address (will be auto-geocoded)"
        },
        "purpose": {
          "type": "array",
          "items": {
            "enum": [
              "CSA_PICKUP",
              "MARKET_STALL",
              "DELIVERY_DROPOFF",
              "SECONDARY_LOCATION",
              "FARMERS_MARKET",
              "DELIVERY_HUB",
              "PICKUP_POINT"
            ],
            "type": "string"
          },
          "description": "Purpose(s). Canonical: CSA_PICKUP, MARKET_STALL, DELIVERY_DROPOFF, SECONDARY_LOCATION. Aliases: FARMERS_MARKET→MARKET_STALL, DELIVERY_HUB→DELIVERY_DROPOFF, PICKUP_POINT→SECONDARY_LOCATION."
        },
        "schedule": {
          "type": "string",
          "description": "Schedule/hours (e.g., Tuesdays 4-6pm)"
        },
        "is_active": {
          "type": "boolean",
          "default": true,
          "description": "Currently active"
        },
        "csa_season": {
          "type": "string",
          "description": "For CSA: Season (e.g., May-October 2026)"
        },
        "is_primary": {
          "type": "boolean",
          "default": false,
          "description": "Primary location"
        },
        "instructions": {
          "type": "string",
          "description": "Special instructions (e.g., Park in back)"
        },
        "contact_email": {
          "type": "string",
          "description": "Contact email (if different from main)"
        },
        "contact_phone": {
          "type": "string",
          "description": "Contact phone (if different from main)"
        },
        "participant_id": {
          "type": "string",
          "description": "ID of your place (get from get_my_places)"
        },
        "csa_share_types": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "For CSA: Share types (e.g., [Full, Half])"
        }
      }
    }
    arguments 75 lines
  • update_service_location unknown never probed

    🔐 AUTHENTICATED: Update an existing service location. Only provide fields to change.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id",
        "location_id"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "address": {
          "type": "string"
        },
        "purpose": {
          "type": "array",
          "items": {
            "enum": [
              "CSA_PICKUP",
              "MARKET_STALL",
              "DELIVERY_DROPOFF",
              "SECONDARY_LOCATION",
              "FARMERS_MARKET",
              "DELIVERY_HUB",
              "PICKUP_POINT"
            ],
            "type": "string"
          },
          "description": "Purpose(s). Aliases FARMERS_MARKET, DELIVERY_HUB, and PICKUP_POINT are accepted."
        },
        "schedule": {
          "type": "string"
        },
        "is_active": {
          "type": "boolean"
        },
        "csa_season": {
          "type": "string"
        },
        "is_primary": {
          "type": "boolean"
        },
        "location_id": {
          "type": "string",
          "description": "ID of location to update (get from list_service_locations)"
        },
        "instructions": {
          "type": "string"
        },
        "contact_email": {
          "type": "string"
        },
        "contact_phone": {
          "type": "string"
        },
        "participant_id": {
          "type": "string",
          "description": "ID of your place"
        },
        "csa_share_types": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    }
    arguments 66 lines
  • create_product unknown never probed

    🔐 AUTHENTICATED: Create a place offering. kind=STAPLE (default): catalog food via product_id. kind=COMPOSED: named package/dish with optional ingredients[{source_id,product_id}]. Do NOT use price/price_unit for how the farm sells packs — after creating a STAPLE, call create_pack_price (e.g. 10 kg or 1 eighth). Use source_url for the shop/product page link — never put URLs in description. Use is_available=false to pause. Only with verifiable evidence. Use list_products / search_products first.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id"
      ],
      "properties": {
        "kind": {
          "enum": [
            "STAPLE",
            "COMPOSED"
          ],
          "type": "string",
          "description": "STAPLE = catalog food; COMPOSED = named hybrid using ingredients"
        },
        "name": {
          "type": "string",
          "description": "STAPLE: catalog name if no product_id. COMPOSED: sellable title (required)."
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Freeform tags (e.g. local, community-verified). Prefer quality_claims for Organic / Hormone Free / etc."
        },
        "price": {
          "type": "number",
          "description": "Deprecated for STAPLE sell packs — use create_pack_price instead"
        },
        "category": {
          "type": "string",
          "description": "Category override (usually inferred from catalog/vocabulary)"
        },
        "price_unit": {
          "type": "string",
          "description": "Deprecated for STAPLE sell packs — use create_pack_price instead"
        },
        "product_id": {
          "type": "string",
          "description": "Required for STAPLE: ID from search_products."
        },
        "season_end": {
          "type": "string",
          "description": "ISO date"
        },
        "source_url": {
          "type": "string",
          "description": "Online shop / product page URL for this offering. Do NOT put URLs in description. Pass empty string to clear on update."
        },
        "description": {
          "type": "string"
        },
        "ingredients": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "source_id",
              "product_id"
            ],
            "properties": {
              "item_name": {
                "type": "string"
              },
              "source_id": {
                "type": "string"
              },
              "product_id": {
                "type": "string"
              }
            }
          },
          "description": "COMPOSED only: local ingredients"
        },
        "subcategory": {
          "type": "string"
        },
        "is_available": {
          "type": "boolean",
          "default": true,
          "description": "false = paused (not for sale)"
        },
        "season_start": {
          "type": "string",
          "description": "ISO date (e.g., 2026-06-01)"
        },
        "allows_pickup": {
          "type": "boolean",
          "default": true
        },
        "participant_id": {
          "type": "string",
          "description": "ID of your place (get from get_my_places)"
        },
        "quality_claims": {
          "type": "array",
          "items": {
            "enum": [
              "ethically_raised",
              "hormone_free",
              "environmentally_friendly",
              "non_gmo",
              "nutrient_dense",
              "antibiotic_free",
              "organic"
            ],
            "type": "string"
          },
          "description": "Optional producer-stated quality claims stored on the offering. Pass [] to clear. Allowed: ethically_raised, hormone_free, environmentally_friendly, non_gmo, nutrient_dense, antibiotic_free, organic."
        },
        "allows_delivery": {
          "type": "boolean",
          "default": false
        },
        "production_method": {
          "enum": [
            "FIELD",
            "GREENHOUSE",
            "HYDROPONIC",
            "INDOOR",
            "PASTURE",
            "ORCHARD",
            "AQUACULTURE",
            "WILD_CAUGHT"
          ],
          "type": "string",
          "description": "How the product is produced. GREENHOUSE, HYDROPONIC, and INDOOR count toward regional greenhouse / fresh winter produce scoring."
        }
      }
    }
    arguments 130 lines
  • get_regional_food_improvements reads unknown 56d ago

    Analyze a region for food score gaps and ranked improvement opportunities (connect farms to shops, document inventory, onboard producers, infrastructure). Returns the same JSON as GET /api/regional-score/analyze.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "number",
          "default": 30,
          "maximum": 50,
          "minimum": 1,
          "description": "Max opportunities to return (default 30, max 50)"
        },
        "family": {
          "enum": [
            "connect",
            "document",
            "onboard",
            "infrastructure",
            "fix_location",
            "add_pickup"
          ],
          "type": "string",
          "description": "Optional filter by intervention family"
        },
        "format": {
          "enum": [
            "summary",
            "json"
          ],
          "type": "string",
          "default": "summary",
          "description": "Response format. Use \"json\" for full structured analyze payload."
        },
        "region_id": {
          "type": "string",
          "description": "Region participant ID (use region_id or region_slug, not both required)"
        },
        "region_slug": {
          "type": "string",
          "description": "Region slug from metadata (e.g. \"waterloo-region\")"
        }
      }
    }
    arguments 41 lines
  • suggest_connection changes data unknown never probed

    🔐 AUTHENTICATED: Propose a supplier→buyer sourcing link for admin review (does NOT change scores until approved). ONLY use this when there is verifiable evidence (such as a website link, official registry, or direct confirmation) of the commercial relationship. Do NOT make assumptions or suggest unverified connections. Supplier: FARM, PROCESSOR, COMMUNITY_GARDEN, MERCHANT (shop hop, discovery only), or MARKET with marketKind exchange. Buyer: RESTAURANT, MERCHANT, MARKET, FARM, or FOOD_BANK. Non-admins use this; admins use apply_connection for immediate links.

    mcp-tool

    {
      "type": "object",
      "required": [
        "supplier_id",
        "buyer_id"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Optional note explaining why this connection makes sense"
        },
        "buyer_id": {
          "type": "string",
          "description": "Buyer participant ID (RESTAURANT, MERCHANT, MARKET, FARM, or FOOD_BANK)"
        },
        "products": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Optional list of products involved in the connection"
        },
        "region_id": {
          "type": "string",
          "description": "Optional regional score region ID for attribution"
        },
        "supplier_id": {
          "type": "string",
          "description": "Supplier participant ID (FARM, PROCESSOR, COMMUNITY_GARDEN, MERCHANT, or exchange MARKET)"
        },
        "source_opportunity_id": {
          "type": "string",
          "description": "Optional source opportunity ID from regional score analysis"
        }
      }
    }
    arguments 36 lines
  • remove_connection unknown never probed

    🔐 ADMIN ONLY: Remove a live supplier→buyer sourcing link.

    mcp-tool

    {
      "type": "object",
      "required": [
        "supplier_id",
        "buyer_id"
      ],
      "properties": {
        "buyer_id": {
          "type": "string",
          "description": "Buyer participant ID"
        },
        "supplier_id": {
          "type": "string",
          "description": "Supplier participant ID"
        }
      }
    }
    arguments 17 lines
  • suggest_product changes data unknown never probed

    🔐 AUTHENTICATED: Suggest a new product/offering for an existing place. ONLY use this when there is verifiable evidence (such as a website menu, farm guide, or direct confirmation) that the place actually offers this product. Do NOT make assumptions or suggest unverified products. Creates a pending suggestion for admin review — does not require place ownership.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Product name — must match catalog or local food vocabulary (required if product_id omitted)"
        },
        "notes": {
          "type": "string",
          "description": "Optional notes about the source or evidence for this suggestion"
        },
        "price": {
          "type": "number"
        },
        "category": {
          "type": "string",
          "description": "Category (e.g., vegetables, fruit, meat, dairy)"
        },
        "price_unit": {
          "type": "string",
          "description": "Unit (e.g., lb, dozen, each)"
        },
        "product_id": {
          "type": "string",
          "description": "Preferred: ID from search_products. Ensures nutrient mapping and blocks non-local items."
        },
        "description": {
          "type": "string"
        },
        "participant_id": {
          "type": "string",
          "description": "ID of the place to add the product to"
        }
      }
    }
    arguments 38 lines
  • add_neighborhood changes data unknown never probed

    🔐 ADMIN ONLY: Add a neighborhood to the catalog. Response includes benchmark price, DOM, and previousPrice when provided.

    mcp-tool

    {
      "type": "object",
      "required": [
        "label",
        "municipality",
        "lat",
        "lng"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Optional custom ID. If omitted, will be auto-generated from the label."
        },
        "dom": {
          "type": "number",
          "description": "Average Days on Market"
        },
        "lat": {
          "type": "number",
          "description": "Latitude coordinate of the neighborhood center"
        },
        "lng": {
          "type": "number",
          "description": "Longitude coordinate of the neighborhood center"
        },
        "kind": {
          "enum": [
            "neighborhood",
            "community_area"
          ],
          "type": "string",
          "default": "neighborhood",
          "description": "Whether it is a standard neighborhood or community area"
        },
        "label": {
          "type": "string",
          "description": "The display name of the neighborhood (e.g. \"Downtown Kitchener\")"
        },
        "price": {
          "type": "number",
          "description": "Benchmark home price in CAD ($)"
        },
        "municipality": {
          "type": "string",
          "description": "The municipality of the neighborhood (e.g. \"Kitchener\", \"Waterloo\", etc.)"
        },
        "previousPrice": {
          "type": "number",
          "description": "Previous benchmark home price in CAD ($)"
        }
      }
    }
    arguments 52 lines
  • delete_neighborhood changes data unknown never probed

    🔐 ADMIN ONLY: Delete a neighborhood from the catalog by its ID.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the neighborhood to delete"
        }
      }
    }
    arguments 12 lines
  • rebuild_neighborhood_score_samples changes data unknown never probed

    🔐 ADMIN ONLY: Rebuild the score samples for specified radii (e.g. 1, 3, 5, 8, or 10 km) in the Waterloo Region to update the Local Food Score map coloring.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "radii": {
          "type": "array",
          "items": {
            "enum": [
              1,
              3,
              5,
              8,
              10
            ],
            "type": "number"
          },
          "description": "List of radii in kilometers to rebuild. Defaults to all radii: [1, 3, 5, 8, 10]."
        }
      }
    }
    arguments 19 lines
  • create_pack_price changes data unknown never probed

    🔐 AUTHENTICATED (place owner or admin): Add how a STAPLE offering is sold — total price for a pack size. Examples: offering_id + pack_qty=10 + pack_unit=kg; or pack_qty=1 + pack_unit=eighth (beef share). Optional source_url = online shop page for that pack. Prefer offering_id. Use list_pack_prices to inspect; update_pack_price / delete_pack_price to fix mistakes.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id",
        "total_price_cad",
        "pack_qty",
        "pack_unit"
      ],
      "properties": {
        "notes": {
          "type": "string"
        },
        "scale": {
          "enum": [
            "local_bulk",
            "local_share",
            "local_shelf"
          ],
          "type": "string",
          "description": "Defaults from offering type or local_bulk"
        },
        "category": {
          "type": "string",
          "description": "Optional plate category when no offering_id (admin bulk)"
        },
        "pack_qty": {
          "type": "number",
          "description": "Amount in the pack (e.g. 10 for 10 kg; 1 for one eighth)"
        },
        "pack_unit": {
          "type": "string",
          "description": "kg, lb, eighth, quarter, half, whole, dozen, each, L, g (e.g. 10 kg or 1 eighth of beef)"
        },
        "source_url": {
          "type": "string",
          "description": "Optional URL of the online shop / product page where this pack is sold (shop link)"
        },
        "observed_at": {
          "type": "string",
          "description": "ISO date; defaults to today"
        },
        "offering_id": {
          "type": "string",
          "description": "STAPLE offering ID (required for farm sell packs)"
        },
        "participant_id": {
          "type": "string",
          "description": "Place ID"
        },
        "total_price_cad": {
          "type": "number",
          "description": "Total CAD charged for this pack"
        }
      }
    }
    arguments 55 lines
  • update_pack_price unknown never probed

    🔐 AUTHENTICATED (place owner or admin): Update a pack price quote. Use is_active=false to pause; true to resume. Optional source_url = online shop page for that pack (pass empty string to clear). Use list_pack_prices for quote_id; delete_pack_price to remove permanently.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quote_id"
      ],
      "properties": {
        "grade": {
          "type": "string"
        },
        "notes": {
          "type": "string"
        },
        "scale": {
          "enum": [
            "local_bulk",
            "local_share",
            "local_shelf"
          ],
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "pack_qty": {
          "type": "number"
        },
        "quote_id": {
          "type": "string",
          "description": "Pack price quote ID"
        },
        "is_active": {
          "type": "boolean",
          "description": "false = pause this sell pack; true = resume"
        },
        "pack_unit": {
          "type": "string"
        },
        "source_url": {
          "type": "string",
          "description": "Online shop / product page URL for this pack. Pass empty string to clear."
        },
        "observed_at": {
          "type": "string",
          "description": "ISO date"
        },
        "offering_id": {
          "type": "string"
        },
        "total_price_cad": {
          "type": "number"
        }
      }
    }
    arguments 53 lines
  • search_recipes unknown never probed

    Search public published recipes (or your own with mine=true). Filter by cuisine slug, region, diet, meal, or free-text query.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "diet": {
          "enum": [
            "OMNIVORE",
            "VEGETARIAN",
            "VEGAN"
          ],
          "type": "string"
        },
        "meal": {
          "enum": [
            "BREAKFAST",
            "LUNCH",
            "DINNER",
            "SNACK",
            "OTHER"
          ],
          "type": "string"
        },
        "mine": {
          "type": "boolean",
          "description": "🔐 If true, list recipes you own (includes drafts)"
        },
        "limit": {
          "type": "number",
          "description": "Max results (default 20)"
        },
        "query": {
          "type": "string",
          "description": "Search title/description"
        },
        "cuisine": {
          "type": "string",
          "description": "Cuisine slug, e.g. indian"
        },
        "region_slug": {
          "type": "string"
        },
        "gluten_friendly": {
          "type": "boolean"
        }
      }
    }
    arguments 45 lines
  • update_recipe unknown never probed

    🔐 AUTHENTICATED: Update a recipe you own (or any recipe if admin). Providing ingredients or cuisine_ids replaces those lists entirely.

    mcp-tool

    {
      "type": "object",
      "required": [
        "recipe_id"
      ],
      "properties": {
        "diet": {
          "enum": [
            "OMNIVORE",
            "VEGETARIAN",
            "VEGAN"
          ],
          "type": "string"
        },
        "meal": {
          "enum": [
            "BREAKFAST",
            "LUNCH",
            "DINNER",
            "SNACK",
            "OTHER"
          ],
          "type": "string"
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Ordered cooking steps"
        },
        "title": {
          "type": "string",
          "description": "Recipe title"
        },
        "status": {
          "enum": [
            "DRAFT",
            "PUBLISHED"
          ],
          "type": "string",
          "description": "Draft or published"
        },
        "image_url": {
          "type": "string",
          "description": "Overview photo URL"
        },
        "recipe_id": {
          "type": "string",
          "description": "Recipe ID to update"
        },
        "cuisine_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Up to 3 cuisine IDs from list_cuisines"
        },
        "description": {
          "type": "string",
          "description": "Short description"
        },
        "ingredients": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "label"
            ],
            "properties": {
              "unit": {
                "type": "string",
                "description": "Unit, e.g. cups"
              },
              "label": {
                "type": "string",
                "description": "Ingredient name, e.g. spinach"
              },
              "quantity": {
                "type": "string",
                "description": "Amount, e.g. 3"
              },
              "product_id": {
                "type": "string",
                "description": "Optional catalog product ID (from search_products)"
              }
            }
          },
          "description": "Ingredients (replaces all on update when provided)"
        },
        "region_slug": {
          "type": "string",
          "description": "Region hub slug, e.g. waterloo-region"
        },
        "owner_user_id": {
          "type": "string",
          "description": "Admin only: assign a different owner user ID"
        },
        "association_id": {
          "type": "string",
          "description": "Optional association ID to attribute this recipe to"
        },
        "gluten_friendly": {
          "type": "boolean"
        },
        "step_image_urls": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Photo URL per cooking step (same order as steps)"
        },
        "primary_cuisine_id": {
          "type": "string"
        }
      }
    }
    arguments 117 lines
  • create_association unknown never probed

    🔐 ADMIN ONLY: Create an association. Use when the org does not already exist. Do not invent names.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "description"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Official association name"
        },
        "region": {
          "type": "string"
        },
        "category": {
          "enum": [
            "FOOD_AGRICULTURE",
            "COMMUNITY_SOCIAL",
            "SUSTAINABILITY",
            "COOPERATIVE",
            "LOCAL_BUSINESS",
            "CERTIFICATION",
            "LOCAL_CURRENCY",
            "TECHNOLOGY"
          ],
          "type": "string",
          "description": "Default FOOD_AGRICULTURE"
        },
        "description": {
          "type": "string",
          "description": "Short description as published"
        },
        "website_url": {
          "type": "string"
        }
      }
    }
    arguments 37 lines
  • create_place_tour unknown never probed

    Create a draft walking tour for an association you can manage. Title must not copy the association name. Stops via set_place_tour_stops. Narration is on each place (update_place tourNarration).

    mcp-tool

    {
      "type": "object",
      "required": [
        "title"
      ],
      "properties": {
        "slug": {
          "type": "string",
          "description": "Association slug if id is unknown"
        },
        "title": {
          "type": "string",
          "description": "Tour title (not the association name)"
        },
        "summary": {
          "type": "string"
        },
        "association_id": {
          "type": "string",
          "description": "Association id"
        }
      }
    }
    arguments 23 lines
  • update_place_tour changes data unknown never probed

    Update a tour you can manage. Set status PUBLISHED when stops are ready. Public pages still need the Place Tours feature flag.

    mcp-tool

    {
      "type": "object",
      "required": [
        "tour_id"
      ],
      "properties": {
        "slug": {
          "type": "string",
          "description": "Association slug if id is unknown"
        },
        "title": {
          "type": "string"
        },
        "status": {
          "enum": [
            "DRAFT",
            "PUBLISHED"
          ],
          "type": "string"
        },
        "summary": {
          "type": "string"
        },
        "tour_id": {
          "type": "string"
        },
        "association_id": {
          "type": "string",
          "description": "Association id"
        },
        "home_base_participant_id": {
          "type": "string",
          "description": "Usually the first stop"
        }
      }
    }
    arguments 36 lines
  • set_place_tour_stops unknown never probed

    Replace tour stops in order. participant_ids are Piknik place ids. Does not require membership, but dashboard stop picker lists members.

    mcp-tool

    {
      "type": "object",
      "required": [
        "tour_id",
        "participant_ids"
      ],
      "properties": {
        "slug": {
          "type": "string",
          "description": "Association slug if id is unknown"
        },
        "tour_id": {
          "type": "string"
        },
        "association_id": {
          "type": "string",
          "description": "Association id"
        },
        "participant_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Place ids in walking order"
        }
      }
    }
    arguments 27 lines
  • upsert_offering_category_surplus_map unknown never probed

    🔐 ADMIN: Upsert exact FoodCategory key → surplus streams (e.g. dairy → whey). Key must match normalizeCategoryName.

    mcp-tool

    {
      "type": "object",
      "required": [
        "food_category_key",
        "surplus_categories"
      ],
      "properties": {
        "active": {
          "type": "boolean",
          "description": "Default true"
        },
        "food_category_key": {
          "type": "string",
          "description": "Exact FoodCategory key e.g. baked, dairy, meat"
        },
        "surplus_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Surplus category ids e.g. spent_grain, whey"
        }
      }
    }
    arguments 24 lines
  • delete_surplus_source_map unknown never probed

    🔐 ADMIN: Delete a structured surplus map by kind + id (category map id or product map id).

    mcp-tool

    {
      "type": "object",
      "required": [
        "kind",
        "map_id"
      ],
      "properties": {
        "kind": {
          "type": "string",
          "description": "offering_category | product"
        },
        "map_id": {
          "type": "string"
        }
      }
    }
    arguments 16 lines
  • delete_recipe unknown never probed

    🔐 AUTHENTICATED: Permanently delete a recipe you own (or any if admin).

    mcp-tool

    {
      "type": "object",
      "required": [
        "recipe_id"
      ],
      "properties": {
        "recipe_id": {
          "type": "string",
          "description": "Recipe ID to delete"
        }
      }
    }
    arguments 12 lines
  • search_events reads unknown never probed

    Search for local food events, farmers markets, workshops, and community gatherings. Respects EVENT_SYSTEM feature flag. Can search by address string or coordinates.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "number",
          "default": 20,
          "description": "Maximum number of events to return"
        },
        "query": {
          "type": "string",
          "description": "Search query for event title or description"
        },
        "address": {
          "type": "string",
          "description": "Address to search near (e.g., \"Waterloo, Ontario\"). If provided, will geocode and use for location filtering. Alternative to providing location coordinates."
        },
        "end_date": {
          "type": "string",
          "description": "Filter events ending before this date (ISO format)"
        },
        "location": {
          "type": "object",
          "properties": {
            "lat": {
              "type": "number",
              "description": "Latitude coordinate"
            },
            "lng": {
              "type": "number",
              "description": "Longitude coordinate"
            },
            "radius": {
              "type": "number",
              "default": 25,
              "description": "Search radius in kilometers"
            }
          },
          "description": "Location coordinates. Use either address or location, not both."
        },
        "start_date": {
          "type": "string",
          "description": "Filter events starting after this date (ISO format)"
        },
        "participant_id": {
          "type": "string",
          "description": "Filter events by specific business/participant"
        }
      }
    }
    arguments 49 lines
  • find_places unknown 41d ago

    Find existing places based on location, preferences, and context. Combines multiple recommendation engines for comprehensive results.

    mcp-tool

    {
      "type": "object",
      "required": [
        "address"
      ],
      "properties": {
        "limit": {
          "type": "number",
          "default": 10,
          "description": "Maximum number of suggestions"
        },
        "radius": {
          "type": "number",
          "default": 25,
          "description": "Search radius in kilometers"
        },
        "address": {
          "type": "string",
          "description": "Address to search around (e.g., \"123 Main St, Toronto, ON\" or \"Toronto, Ontario\")"
        },
        "context": {
          "type": "string",
          "description": "Context for suggestions (e.g., \"dinner ingredients\", \"weekend farmers market\", \"organic produce\", \"local honey\")"
        },
        "service_type": {
          "enum": [
            "delivery",
            "pickup",
            "catering",
            "wholesale",
            "retail"
          ],
          "type": "string",
          "description": "Service type filter"
        },
        "business_type": {
          "enum": [
            "all",
            "farms",
            "restaurants",
            "markets",
            "merchants",
            "processors",
            "delivery"
          ],
          "type": "string",
          "default": "all",
          "description": "Type of business to suggest"
        },
        "include_sponsored": {
          "type": "boolean",
          "default": true,
          "description": "Include sponsored/featured businesses"
        }
      }
    }
    arguments 56 lines
  • update_event unknown never probed

    🔐 AUTHENTICATED: Update an existing event. Requires OAuth authentication with events:write scope. Can update event details, times, location, or status.

    mcp-tool

    {
      "type": "object",
      "required": [
        "event_id"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Updated event title"
        },
        "status": {
          "enum": [
            "ACTIVE",
            "PAUSED",
            "CANCELLED",
            "DRAFT"
          ],
          "type": "string",
          "description": "Updated event status"
        },
        "address": {
          "type": "string",
          "description": "Updated address"
        },
        "end_date": {
          "type": "string",
          "description": "Updated event end date and time (ISO format with timezone)"
        },
        "event_id": {
          "type": "string",
          "description": "The ID of the event to update"
        },
        "start_date": {
          "type": "string",
          "description": "Updated event start date and time (ISO format with timezone, e.g., \"2026-03-15T10:00:00-05:00\")"
        },
        "description": {
          "type": "string",
          "description": "Updated event description"
        },
        "location_name": {
          "type": "string",
          "description": "Updated location name"
        }
      }
    }
    arguments 46 lines
  • update_place unknown never probed

    🔐 AUTHENTICATED: Update a place (farm, restaurant, market) that you own or manage. Allows updating profile information like name, description, address, contact details, operating hours, and more. Admin users can also update status.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Business name"
        },
        "image": {
          "type": "string",
          "description": "Public photo URL for this place (profile and tour stops). Pass empty string to clear. Prefer a photo they published. To upload a file: Dashboard → Places or Admin → Places (site admins and place managers)."
        },
        "status": {
          "enum": [
            "DRAFT",
            "ACTIVE",
            "INACTIVE",
            "PRIVATE"
          ],
          "type": "string",
          "description": "🔐 ADMIN ONLY: Change place status. DRAFT=not published, ACTIVE=visible to all, INACTIVE=hidden, PRIVATE=only visible to owner/admins"
        },
        "address": {
          "type": "string",
          "description": "Business address (will automatically geocode coordinates)"
        },
        "website": {
          "type": "string",
          "description": "Website URL"
        },
        "latitude": {
          "type": "number",
          "description": "🔐 ADMIN ONLY: Manually set latitude coordinate (overrides geocoding)"
        },
        "orderUrl": {
          "type": "string",
          "description": "Online order / shop URL shown as Order Online on the public place page"
        },
        "longitude": {
          "type": "number",
          "description": "🔐 ADMIN ONLY: Manually set longitude coordinate (overrides geocoding)"
        },
        "offersCsa": {
          "type": "boolean",
          "description": "Whether this farm offers CSA (Community Supported Agriculture)"
        },
        "marketKind": {
          "enum": [
            "retail",
            "exchange"
          ],
          "type": "string",
          "description": "🔐 ADMIN ONLY: For MARKET places — retail (farmers market, default) or exchange (wholesale produce auction hub like EPAC). Exchange markets use ↔️ on the map and can supply processors."
        },
        "chatEnabled": {
          "type": "boolean",
          "description": "Enable/disable chat functionality"
        },
        "customEmoji": {
          "type": "string",
          "description": "Custom emoji icon for the place (e.g., 🚜 for farms, 🏪 for markets, 🍴 for restaurants)"
        },
        "description": {
          "type": "string",
          "description": "Business description"
        },
        "primaryRole": {
          "enum": [
            "FARM",
            "PROCESSOR",
            "MERCHANT",
            "RESTAURANT",
            "MARKET",
            "DELIVERY",
            "COMMUNITY_GARDEN",
            "COMMUNITY_KITCHEN",
            "FOOD_BANK"
          ],
          "type": "string",
          "description": "🔐 ADMIN ONLY: Correct business role (e.g. FARM → PROCESSOR for a meat packer misclassified as a farm)"
        },
        "businessType": {
          "type": "string",
          "description": "🔐 ADMIN ONLY: Merchant business type (e.g. Bakery, Grocery). Sets merchantProfile.businessType for map display and maker/bakery detection in Local Food Score narratives."
        },
        "chatbotFacts": {
          "type": "string",
          "description": "Custom facts for chatbot responses"
        },
        "contactEmail": {
          "type": "string",
          "description": "Contact email address"
        },
        "contactPhone": {
          "type": "string",
          "description": "Contact phone number"
        },
        "csaSignupUrl": {
          "type": "string",
          "description": "CSA subscription signup URL shown as Join CSA on the public place page"
        },
        "supplierCount": {
          "type": "number",
          "description": "🔐 ADMIN ONLY: Self-declared number of local sources for the hub tier badge (metadata.supplierCount). Tiers: 1-2=Local Source, 3-5=Local Hub, 6-10=Regional Hub, 10+=Major Hub. Pass 0 to clear."
        },
        "tourNarration": {
          "type": "string",
          "description": "Spoken/read walking-tour script for this place (Participant.tourNarration). Used on association place tours. Pass empty string to clear."
        },
        "metadata_notes": {
          "type": "string",
          "description": "🔐 ADMIN ONLY: Public Details notes shown on the place page (metadata.notes). Pass empty string to clear internal suggestion notes."
        },
        "narrative_tags": {
          "type": "array",
          "items": {
            "enum": [
              "hidden-gem",
              "family-run",
              "longtime-staple",
              "back-roads",
              "destination",
              "weekend-ritual",
              "newcomer",
              "maker",
              "iconic",
              "agritourism",
              "aggregator",
              "stall-vendor",
              "small-community",
              "small-hub"
            ],
            "type": "string"
          },
          "description": "🔐 ADMIN ONLY: Internal narrative flavor tags that guide the Local Food Score narrative PDF (stored on metadata.narrativeTags). Not shown on the public place page. Pass [] to clear. Allowed: hidden-gem, family-run, longtime-staple, back-roads, destination, weekend-ritual, newcomer, maker, iconic, agritourism, aggregator, stall-vendor, small-community, small-hub."
        },
        "operatingHours": {
          "type": "string",
          "description": "Operating hours (e.g., \"Mon-Fri 9am-5pm\")"
        },
        "participant_id": {
          "type": "string",
          "description": "ID of the place to update (get from get_my_places)"
        },
        "quality_claims": {
          "type": "array",
          "items": {
            "enum": [
              "ethically_raised",
              "hormone_free",
              "environmentally_friendly",
              "non_gmo",
              "nutrient_dense",
              "antibiotic_free",
              "organic"
            ],
            "type": "string"
          },
          "description": "Farm-wide producer-stated quality claims (ParticipantTag CERTIFICATION). Inherited by all offerings. Pass [] to clear. Allowed: ethically_raised, hormone_free, environmentally_friendly, non_gmo, nutrient_dense, antibiotic_free, organic."
        }
      }
    }
    arguments 164 lines
  • update_delivery_status unknown never probed

    🔐 AUTHENTICATED: Update delivery task status with optional GPS. Caller must be the user who claimed the task.

    mcp-tool

    {
      "type": "object",
      "required": [
        "task_id",
        "status"
      ],
      "properties": {
        "notes": {
          "type": "string",
          "description": "Optional notes"
        },
        "status": {
          "enum": [
            "claimed",
            "en_route_to_pickup",
            "picked_up",
            "in_transit",
            "delivered"
          ],
          "type": "string",
          "description": "Current delivery status"
        },
        "task_id": {
          "type": "string",
          "description": "ID of the delivery task"
        },
        "location": {
          "type": "object",
          "properties": {
            "latitude": {
              "type": "number"
            },
            "longitude": {
              "type": "number"
            }
          },
          "description": "Optional GPS location"
        }
      }
    }
    arguments 40 lines
  • update_product unknown never probed

    🔐 AUTHENTICATED: Update an offering. Use is_available to pause/resume. Use source_url for the shop/product page link — never put URLs in description. For STAPLE sell prices (10 kg, ⅛ animal, etc.) use create_pack_price / update_pack_price / delete_pack_price — not price/price_unit.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id",
        "offering_id"
      ],
      "properties": {
        "kind": {
          "enum": [
            "STAPLE",
            "COMPOSED"
          ],
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Freeform tags. Prefer quality_claims for Organic / Hormone Free / etc."
        },
        "price": {
          "type": "number",
          "description": "Deprecated for STAPLE packs — use pack price tools"
        },
        "category": {
          "type": "string"
        },
        "is_active": {
          "type": "boolean"
        },
        "price_unit": {
          "type": "string",
          "description": "Deprecated for STAPLE packs — use pack price tools"
        },
        "product_id": {
          "type": "string"
        },
        "season_end": {
          "type": "string"
        },
        "source_url": {
          "type": "string",
          "description": "Online shop / product page URL for this offering. Do NOT put URLs in description. Pass empty string to clear."
        },
        "description": {
          "type": "string"
        },
        "ingredients": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "source_id",
              "product_id"
            ],
            "properties": {
              "item_name": {
                "type": "string"
              },
              "source_id": {
                "type": "string"
              },
              "product_id": {
                "type": "string"
              }
            }
          },
          "description": "COMPOSED: replace ingredient list when provided"
        },
        "offering_id": {
          "type": "string",
          "description": "ID of product (get from list_products)"
        },
        "is_available": {
          "type": "boolean",
          "description": "false = paused (not for sale); true = resume"
        },
        "season_start": {
          "type": "string"
        },
        "allows_pickup": {
          "type": "boolean"
        },
        "participant_id": {
          "type": "string"
        },
        "quality_claims": {
          "type": "array",
          "items": {
            "enum": [
              "ethically_raised",
              "hormone_free",
              "environmentally_friendly",
              "non_gmo",
              "nutrient_dense",
              "antibiotic_free",
              "organic"
            ],
            "type": "string"
          },
          "description": "Optional producer-stated quality claims. Merged into offering tags; pass [] to clear claims. Allowed: ethically_raised, hormone_free, environmentally_friendly, non_gmo, nutrient_dense, antibiotic_free, organic."
        },
        "allows_delivery": {
          "type": "boolean"
        },
        "production_method": {
          "enum": [
            "FIELD",
            "GREENHOUSE",
            "HYDROPONIC",
            "INDOOR",
            "PASTURE",
            "ORCHARD",
            "AQUACULTURE",
            "WILD_CAUGHT"
          ],
          "type": "string",
          "description": "How the product is produced. GREENHOUSE, HYDROPONIC, and INDOOR count toward regional greenhouse scoring. Pass empty string to clear."
        }
      }
    }
    arguments 125 lines
  • apply_connection unknown never probed

    🔐 ADMIN ONLY: Create or update a live supplier→buyer sourcing link. ONLY use this when there is verifiable evidence (such as a website link, official registry, or direct confirmation) of the commercial relationship. Do NOT make assumptions or create unverified connections. Supplier: FARM, PROCESSOR, COMMUNITY_GARDEN, MERCHANT (shop hop, discovery only), or MARKET with marketKind exchange. Buyer: RESTAURANT, MERCHANT, MARKET, FARM, FOOD_BANK, or PROCESSOR. Farm and processor supplier links affect Local Food Score (processor chains include upstream farms and exchange hubs). Shop hops do not.

    mcp-tool

    {
      "type": "object",
      "required": [
        "supplier_id",
        "buyer_id"
      ],
      "properties": {
        "buyer_id": {
          "type": "string",
          "description": "Buyer participant ID (RESTAURANT, MERCHANT, MARKET, FARM, or FOOD_BANK)"
        },
        "products": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Optional product categories for this link (e.g. [\"Grains\", \"flour\"])"
        },
        "supplier_id": {
          "type": "string",
          "description": "Supplier participant ID (FARM, PROCESSOR, COMMUNITY_GARDEN, MERCHANT, or exchange MARKET)"
        }
      }
    }
    arguments 24 lines
  • update_neighborhood changes data unknown never probed

    🔐 ADMIN ONLY: Update a neighborhood by ID. Response always includes benchmark price, DOM, and previousPrice (n/a if unset).

    mcp-tool

    {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the neighborhood to update"
        },
        "dom": {
          "type": "number",
          "description": "Updated average Days on Market"
        },
        "lat": {
          "type": "number",
          "description": "Updated latitude coordinate"
        },
        "lng": {
          "type": "number",
          "description": "Updated longitude coordinate"
        },
        "kind": {
          "enum": [
            "neighborhood",
            "community_area"
          ],
          "type": "string",
          "description": "Updated kind"
        },
        "label": {
          "type": "string",
          "description": "Updated display name of the neighborhood"
        },
        "price": {
          "type": "number",
          "description": "Updated benchmark home price in CAD ($)"
        },
        "municipality": {
          "type": "string",
          "description": "Updated municipality of the neighborhood"
        },
        "previousPrice": {
          "type": "number",
          "description": "Updated previous benchmark home price in CAD ($)"
        }
      }
    }
    arguments 48 lines
  • discover_neighborhood_candidates unknown never probed

    🔐 ADMIN ONLY: Discover food-related OSM locations (restaurants, cafes, specialty food shops) in a neighborhood, filtering out ignored franchise names and already imported places. Returns clean candidates for sourcing verification.

    mcp-tool

    {
      "type": "object",
      "required": [
        "neighborhood_id"
      ],
      "properties": {
        "radius_km": {
          "type": "number",
          "default": 1.5,
          "description": "Search radius in kilometers around the neighborhood center (default: 1.5, min: 0.5, max: 5.0)"
        },
        "neighborhood_id": {
          "type": "string",
          "description": "The unique ID of the neighborhood (e.g. uptown-waterloo)"
        },
        "custom_ignore_names": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Optional additional business names to ignore during discovery"
        }
      }
    }
    arguments 24 lines
  • remove_association unknown never probed

    🔐 ADMIN ONLY: Remove a link between a participant and an association.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id",
        "association_id"
      ],
      "properties": {
        "association_id": {
          "type": "string",
          "description": "The ID of the association"
        },
        "participant_id": {
          "type": "string",
          "description": "The ID of the participant"
        }
      }
    }
    arguments 17 lines
  • delete_pack_price unknown never probed

    🔐 AUTHENTICATED (place owner or admin): Permanently delete a pack price when you no longer sell that pack (or it was added by mistake). Prefer is_active=false (pause) if you may resume later.

    mcp-tool

    {
      "type": "object",
      "required": [
        "quote_id"
      ],
      "properties": {
        "quote_id": {
          "type": "string",
          "description": "Pack price quote ID"
        }
      }
    }
    arguments 12 lines
  • create_recipe unknown never probed

    🔐 AUTHENTICATED: Create a crowdsourced recipe. Defaults to DRAFT. Link ingredients to catalog via product_id when known.

    mcp-tool

    {
      "type": "object",
      "required": [
        "title"
      ],
      "properties": {
        "diet": {
          "enum": [
            "OMNIVORE",
            "VEGETARIAN",
            "VEGAN"
          ],
          "type": "string"
        },
        "meal": {
          "enum": [
            "BREAKFAST",
            "LUNCH",
            "DINNER",
            "SNACK",
            "OTHER"
          ],
          "type": "string"
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Ordered cooking steps"
        },
        "title": {
          "type": "string",
          "description": "Recipe title"
        },
        "status": {
          "enum": [
            "DRAFT",
            "PUBLISHED"
          ],
          "type": "string",
          "description": "Draft or published"
        },
        "image_url": {
          "type": "string",
          "description": "Overview photo URL"
        },
        "cuisine_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Up to 3 cuisine IDs from list_cuisines"
        },
        "description": {
          "type": "string",
          "description": "Short description"
        },
        "ingredients": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "label"
            ],
            "properties": {
              "unit": {
                "type": "string",
                "description": "Unit, e.g. cups"
              },
              "label": {
                "type": "string",
                "description": "Ingredient name, e.g. spinach"
              },
              "quantity": {
                "type": "string",
                "description": "Amount, e.g. 3"
              },
              "product_id": {
                "type": "string",
                "description": "Optional catalog product ID (from search_products)"
              }
            }
          },
          "description": "Ingredients (replaces all on update when provided)"
        },
        "region_slug": {
          "type": "string",
          "description": "Region hub slug, e.g. waterloo-region"
        },
        "owner_user_id": {
          "type": "string",
          "description": "Admin only: assign a different owner user ID"
        },
        "association_id": {
          "type": "string",
          "description": "Optional association ID to attribute this recipe to"
        },
        "gluten_friendly": {
          "type": "boolean"
        },
        "step_image_urls": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Photo URL per cooking step (same order as steps)"
        },
        "primary_cuisine_id": {
          "type": "string"
        }
      }
    }
    arguments 113 lines
  • create_job unknown never probed

    🔐 AUTHENTICATED: Create a job or volunteer posting for a place. Admins may post for any place; owners/admins of a place may post for that place. ONLY when a website or official posting names this opening — copy published words. Do not invent jobs.

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_id",
        "title",
        "description"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Job title as published"
        },
        "radius_km": {
          "type": "number",
          "description": "How far job seekers can see this posting (default 2)"
        },
        "center_lat": {
          "type": "number",
          "description": "Defaults to the place coordinates"
        },
        "center_lng": {
          "type": "number",
          "description": "Defaults to the place coordinates"
        },
        "expires_at": {
          "type": "string",
          "description": "ISO date or datetime when the posting closes"
        },
        "description": {
          "type": "string",
          "description": "Job description as published"
        },
        "contact_email": {
          "type": "string"
        },
        "contact_phone": {
          "type": "string"
        },
        "participant_id": {
          "type": "string",
          "description": "Place that is hiring"
        },
        "application_url": {
          "type": "string",
          "description": "Apply / careers page URL"
        },
        "employment_type": {
          "enum": [
            "PAID",
            "VOLUNTEER"
          ],
          "type": "string",
          "description": "Default PAID"
        },
        "optional_skills": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Skill names from the jobs catalog (e.g. Farming, Sales)"
        },
        "required_skills": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Skill names from the jobs catalog (e.g. Farming, Sales)"
        }
      }
    }
    arguments 70 lines
  • update_job changes data unknown never probed

    🔐 AUTHENTICATED: Update or expire a job posting. Admins may edit any job; place owners/admins may edit their own. Set status CANCELLED or FILLED when the opening closes.

    mcp-tool

    {
      "type": "object",
      "required": [
        "job_id"
      ],
      "properties": {
        "title": {
          "type": "string"
        },
        "job_id": {
          "type": "string"
        },
        "status": {
          "enum": [
            "ACTIVE",
            "PAUSED",
            "FILLED",
            "EXPIRED",
            "CANCELLED"
          ],
          "type": "string"
        },
        "radius_km": {
          "type": "number"
        },
        "center_lat": {
          "type": "number"
        },
        "center_lng": {
          "type": "number"
        },
        "expires_at": {
          "type": "string",
          "description": "ISO date/datetime, or empty to clear"
        },
        "description": {
          "type": "string"
        },
        "contact_email": {
          "type": "string"
        },
        "contact_phone": {
          "type": "string"
        },
        "application_url": {
          "type": "string"
        },
        "employment_type": {
          "enum": [
            "PAID",
            "VOLUNTEER"
          ],
          "type": "string"
        },
        "optional_skills": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Skill names from the jobs catalog (e.g. Farming, Sales)"
        },
        "required_skills": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Skill names from the jobs catalog (e.g. Farming, Sales)"
        }
      }
    }
    arguments 70 lines
  • upsert_surplus_category_page unknown never probed

    🔐 ADMIN: Create or update a surplus category guide page (summary, body, published). category e.g. spent_grain.

    mcp-tool

    {
      "type": "object",
      "required": [
        "category",
        "summary",
        "body"
      ],
      "properties": {
        "body": {
          "type": "string",
          "description": "Longer page body"
        },
        "label": {
          "type": "string",
          "description": "Display label override"
        },
        "summary": {
          "type": "string",
          "description": "Short SEO summary"
        },
        "category": {
          "type": "string",
          "description": "Canonical id or slug (spent_grain / spent-grain)"
        },
        "published": {
          "type": "boolean",
          "description": "Default true"
        },
        "reference_url": {
          "type": "string",
          "description": "Optional external reference (e.g. Wikipedia URL). Empty string clears."
        },
        "reference_label": {
          "type": "string",
          "description": "Link label (default Wikipedia). Empty string clears with URL."
        }
      }
    }
    arguments 38 lines
  • upsert_product_surplus_map unknown never probed

    🔐 ADMIN: Upsert catalog Product → surplus streams (overrides category map for that product).

    mcp-tool

    {
      "type": "object",
      "required": [
        "product_id",
        "surplus_categories"
      ],
      "properties": {
        "active": {
          "type": "boolean",
          "description": "Default true"
        },
        "product_id": {
          "type": "string",
          "description": "Product id"
        },
        "surplus_categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Surplus category ids"
        }
      }
    }
    arguments 24 lines
  • notify_participants unknown never probed

    🔐 ADMIN ONLY: Send campaign emails to participants. campaign_type: welcome (claim), freshness (offerings check-in), or surplus (confirm inferred surplus).

    mcp-tool

    {
      "type": "object",
      "required": [
        "participant_ids"
      ],
      "properties": {
        "campaign_type": {
          "enum": [
            "welcome",
            "freshness",
            "surplus"
          ],
          "type": "string",
          "default": "welcome",
          "description": "Email campaign to send (default: welcome)"
        },
        "participant_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Array of participant IDs to notify (get from list_all_places or search results)"
        },
        "include_claim_link": {
          "type": "boolean",
          "default": true,
          "description": "Whether to include a claim link in the email (default: true)"
        }
      }
    }
    arguments 30 lines
  • set_surplus_possible_uses unknown never probed

    🔐 ADMIN: Replace the single pathway list for a surplus category page (destinations and example goods). Not seller intent.

    mcp-tool

    {
      "type": "object",
      "required": [
        "category",
        "uses"
      ],
      "properties": {
        "uses": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "title",
              "summary"
            ],
            "properties": {
              "title": {
                "type": "string"
              },
              "summary": {
                "type": "string"
              }
            }
          },
          "description": "Ordered list of pathways"
        },
        "category": {
          "type": "string",
          "description": "Canonical id or slug (spent_grain / spent-grain)"
        }
      }
    }
    arguments 32 lines
  • seed_surplus_defaults unknown never probed

    🔐 ADMIN: Seed SurplusCategory taxonomy, category pages, and exact source maps.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
_ try it over mcp through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 242d61f657ed8af0.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/242d61f657ed8af0/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/242d61f657ed8af0/badge.svg)](https://brick.blue/agent/242d61f657ed8af0?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we knowoff the mcp door
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.