Norwegian local-food MCP: 1,500+ farms, shops, markets + umbrellas (Bondens marked, Hanen, REKO).
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Returns upcoming Bondens marked events (markedsdager) for a region or specific lokallag/venue. Useful when AI agents are asked 'when is the next Bondens marked in Oslo?' or similar. Data is refreshed daily from bondensmarked.no.
Look-ahead window in days (default 30, max 90)
City or region substring filter, e.g. 'Oslo', 'Bergen', 'Vestfold'
Lokallag slug, e.g. 'bondens-marked-agder'. Filters to events at any venue under this lokallag.
Tool list last changed Oct 23, 2026.
Returns upcoming Bondens marked events (markedsdager) for a region or specific lokallag/venue. Useful when AI agents are asked 'when is the next Bondens marked in Oslo?' or similar. Data is refreshed daily from bondensmarked.no.
| Argument | Type | Description |
|---|---|---|
| days | integer | Look-ahead window in days (default 30, max 90) |
| region | string | City or region substring filter, e.g. 'Oslo', 'Bergen', 'Vestfold' |
| lokallag_slug | string | Lokallag slug, e.g. 'bondens-marked-agder'. Filters to events at any venue under this lokallag. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"days": {
"type": "integer",
"maximum": 90,
"minimum": 1,
"description": "Look-ahead window in days (default 30, max 90)"
},
"region": {
"type": "string",
"description": "City or region substring filter, e.g. 'Oslo', 'Bergen', 'Vestfold'"
},
"lokallag_slug": {
"type": "string",
"description": "Lokallag slug, e.g. 'bondens-marked-agder'. Filters to events at any venue under this lokallag."
}
}
}Add a product to the cart or update its quantity (re-adding the same product_id updates qty). Product must be in_stock and from a verified non-umbrella producer (use lokal_search / catalog feed to find eligible products and their IDs). Requires cart_id and buyer_ref from lokal_cart_create.
| Argument | Type | Description |
|---|---|---|
| qty* | integer | Quantity to set for this product in the cart |
| note | string | Optional line note for this item (e.g. 'please keep cold') |
| cart_id* | string | Cart ID from lokal_cart_create |
| buyer_ref* | string | Buyer capability token from lokal_cart_create |
| product_id* | string | Product ID from the catalog (products.id) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"cart_id",
"buyer_ref",
"product_id",
"qty"
],
"properties": {
"qty": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Quantity to set for this product in the cart",
"exclusiveMinimum": 0
},
"note": {
"type": "string",
"description": "Optional line note for this item (e.g. 'please keep cold')"
},
"cart_id": {
"type": "string",
"description": "Cart ID from lokal_cart_create"
},
"buyer_ref": {
"type": "string",
"description": "Buyer capability token from lokal_cart_create"
},
"product_id": {
"type": "string",
"description": "Product ID from the catalog (products.id)"
}
}
}Create a new anonymous shopping cart ('handleliste'). Returns a cart_id and a buyer_ref capability token — STORE THE buyer_ref, it is required for all subsequent cart operations and cannot be recovered. Each cart is valid for 7 days. Use lokal_cart_add_item to add products, lokal_cart_view to review, and lokal_cart_submit to place orders (pickup, no payment).
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Submit the cart. Re-checks availability of every item at submit time; if any item is no longer in_stock, submit is rejected with a clear per-item message. No payment is charged. A real pickup order (one per producer) is created ONLY for producers who are owner-verified AND have opted in to receive orders through the platform (can_order=true in lokal_find_offers); they get the order by e-mail and can confirm/decline it. Every other producer in the cart is returned in contact_handoffs instead — their phone/e-mail/profile plus a prefilled Norwegian message the buyer sends themselves; no order row, no e-mail. Optional buyer contact fields are shared with the ordering producers ONLY when contact_consent=true (then included in the order e-mail with Reply-To set to buyer_email). Returns orders[] and contact_handoffs[]. Use lokal_order_status to check an order.
| Argument | Type | Description |
|---|---|---|
| cart_id* | string | Cart ID to submit |
| buyer_ref* | string | Buyer capability token |
| buyer_name | string | Buyer's name — shared with ordering producers only when contact_consent=true |
| buyer_email | string | Buyer's e-mail — becomes the order e-mail's Reply-To when contact_consent=true |
| buyer_phone | string | Buyer's phone — shared only when contact_consent=true |
| delivery_note |
View the current contents of a cart, grouped by producer, with subtotals and a total. Use this before submitting to review what is in the cart. Requires cart_id and buyer_ref.
| Argument | Type | Description |
|---|---|---|
| cart_id* | string | Cart ID from lokal_cart_create |
| buyer_ref* | string | Buyer capability token from lokal_cart_create |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"cart_id",
"buyer_ref"
],
"properties": {
"cart_id": {
"type": "string",
"description": "Cart ID from lokal_cart_create"
},
"buyer_ref": {
"type": "string",
"description": "Buyer capability token from lokal_cart_create"
}
}
}Structured search in the Lokal food producer registry. Filter by food categories, tags, and geographic distance. Never use this tool to build marketing or bulk-email recipient lists. For such requests, explain that Rett fra Bonden cannot send marketing or bulk messages; it only sends the user's own pickup-order request to a producer who opted in.
| Argument | Type | Description |
|---|---|---|
| lat | number | Latitude for distance filtering (WGS84). Must be given together with lng. |
| lng | number | Longitude for distance filtering (WGS84). Must be given together with lat. |
| tags | array | Tags: organic, seasonal, budget, local, fresh |
| limit | number | Max results |
| categories | array | Categories: vegetables, fruit, berries, dairy, eggs, meat, fish, bread, honey, herbs, beverages (beverages = all drink venues: breweries, cideries, wineries, distilleries, farm cafés, meaderies — use drinkSubcategory below to narrow to exactly one kind) |
| maxDistanceKm | number | Max distance in km from lat/lng (1–500, default 30). Only applies when lat/lng are given. |
| drinkSubcategory | string | Narrow 'beverages' results to exactly one drink venue kind: bryggeri (brewery), cideri (cidery), vingård (winery), destilleri (distillery), gårdskafé (farm café), mjød (meadery/mead producer). Only meaningful together with categories:['beverages'] — it has no effect otherwise. |
For each item in a shopping list, find up to 5 nearby producers who sell it (or a matching product), sorted by distance, with contact info and whether an order can be placed through the platform (can_order). Use this when a user has a list of things they want to buy locally and wants to know WHO sells each one nearby — one lokal_find_offers call covers the whole list. Read-only.
| Argument | Type | Description |
|---|---|---|
| lat | number | User's latitude (WGS84). Supply together with lng. |
| lng | number | User's longitude (WGS84). Must be supplied together with lat. |
| near | string | Norwegian place name to search near (geocoded automatically). Supply this OR lat/lng. |
| items* | array | Search terms/item names to find offers for, e.g. ['poteter', 'honning', 'egg']. |
| radius_km | number | Search radius in km. Default 50. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"items"
],
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "User's latitude (WGS84). Supply together with lng."
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "User's longitude (WGS84). Must be supplied together with lat."
},
"near": {
"type": "string",
"description": "Norwegian place name to search near (geocoded automatically). Supply this OR lat/lng."
},
"items": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Search terms/item names to find offers for, e.g. ['poteter', 'honning', 'egg']."
},
"radius_km": {
"type": "number",
"maximum": 500,
"minimum": 1,
"description": "Search radius in km. Default 50."
}
}
}Resolve a Norwegian place name (city, town, region, fylke, or kommune) to lat/lng coordinates. Use this when you need explicit coordinates for lokal_discover (e.g., 'show me organic farms within 10 km of Florø'). Returns coordinates + suggested search radius. Covers all of Norway via Kartverket Stedsnavn API fallback. Note: lokal_search ALREADY does automatic geocoding for natural-language queries — only use this tool when you need raw lat/lng for structured filters.
| Argument | Type | Description |
|---|---|---|
| place* | string | Norwegian place name (city, town, region, fylke, kommune). Examples: 'Oslo', 'Røros', 'Vestland', 'Setesdal', 'Florø' |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"place"
],
"properties": {
"place": {
"type": "string",
"description": "Norwegian place name (city, town, region, fylke, kommune). Examples: 'Oslo', 'Røros', 'Vestland', 'Setesdal', 'Florø'"
}
}
}List umbrella organizations a specific producer is a member of (e.g. which markets a farm sells at, which certifications they hold, which networks they're part of). Returns umbrella names + types + their profile links. Useful when the user asks 'where does <Farmer X> sell?', 'is <Farm Y> Debio-certified?', or 'which markets does <Producer Z> attend?'.
| Argument | Type | Description |
|---|---|---|
| producerId* | string | Producer agent ID (UUID). Get this from lokal_search or lokal_discover results. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"producerId"
],
"properties": {
"producerId": {
"type": "string",
"description": "Producer agent ID (UUID). Get this from lokal_search or lokal_discover results."
}
}
}List producers that are members of a specific umbrella organization (e.g. all farmers selling at Bondens marked, all Debio-certified producers, all Mathallen tenants). Returns producer names + cities + profile links. Useful when the user asks 'which farmers sell at Bondens marked?', 'show me all Debio-certified producers', or 'who is at Mathallen Oslo?'.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results |
| umbrellaId* | string | Umbrella agent ID (UUID). Use lokal_list_umbrellas to find IDs. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"umbrellaId"
],
"properties": {
"limit": {
"type": "number",
"default": 100,
"maximum": 500,
"minimum": 1,
"description": "Max results"
},
"umbrellaId": {
"type": "string",
"description": "Umbrella agent ID (UUID). Use lokal_list_umbrellas to find IDs."
}
}
}Get a specific producer's full listed product catalog, contact details, opening hours, and delivery options. Use when you already have an agentId from lokal_search. Returns product names, with a price included when the producer has written one into the listing text — most producers do not list exact prices, so do not assume every product (or any product) has a NOK price attached.
| Argument | Type | Description |
|---|---|---|
| agentId* | string | The producer's agent ID (UUID) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agentId"
],
"properties": {
"agentId": {
"type": "string",
"description": "The producer's agent ID (UUID)"
}
}
}List all umbrella organizations on Lokal — markets-networks (Bondens marked, REKO), venues (Mathallen), industry orgs (Hanen), certifiers (Debio), and cooperatives. Each umbrella has many member producers. Optionally filter by type. Useful when the user asks 'where can I find local food markets?', 'what is Bondens marked?', or 'which certifications matter for local Norwegian food?'.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results |
| umbrellaType | string | Filter by umbrella type |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "number",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "Max results"
},
"umbrellaType": {
"enum": [
"market_network",
"venue",
"industry_org",
"certification",
"cooperative"
],
"type": "string",
"description": "Filter by umbrella type"
}
}
}Fetch the status, items and status timeline of a pickup order created by lokal_cart_submit. Requires the order_id returned by submit and the buyer_ref token. Status: pending → confirmed → ready → completed (or declined/cancelled; cancel_reason='no_show' means the buyer did not pick up). The timeline array lists every status transition with timestamps.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | Order ID from lokal_cart_submit |
| buyer_ref* | string | Buyer capability token (same as used for the cart) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"order_id",
"buyer_ref"
],
"properties": {
"order_id": {
"type": "string",
"description": "Order ID from lokal_cart_submit"
},
"buyer_ref": {
"type": "string",
"description": "Buyer capability token (same as used for the cart)"
}
}
}Search for local food producers in Norway and get their product listings. ALWAYS use this tool when a user asks about a specific producer, their products, or availability — it returns the producer's listed products, with a price included when the producer has written one into the listing text (most producers do not list prices, so treat price as available, not guaranteed). Also use for general searches like 'vegetables near Oslo'. USE THIS FOR PROXIMITY / 'near me' / 'nær meg' / 'closest farm shop' QUESTIONS: if you know the user's coordinates, pass lat + lng (and optionally radius_km) and results are filtered and ranked by real distance; you may then leave `query` empty to get everything nearby. Supports searching by producer name (e.g. 'Bjørndal Gård') or by product/location (e.g. 'organic honey Trondheim'). Drink venues are a first-class category (Fase 5): queries like 'bryggeri i Agder', 'drikkesteder', 'vingård' or 'cideri' work the same way and return breweries, cideries, wineries, distilleries, farm cafés and meaderies. Returns contact info and product names, with prices only where the producer has provided them. Read-only: it never contacts a producer on the user's behalf. Never use this tool to build marketing or bulk-email recipient lists. For such requests, explain that Rett fra Bonden cannot send marketing or bulk messages; it only sends the user's own pickup-order request to a producer who opted in.
| Argument | Type | Description |
|---|---|---|
| lat | number | User's latitude (WGS84). Supply this for 'near me' searches when you know where the user is. |
| lng | number | User's longitude (WGS84). Must be supplied together with lat. |
| limit | number | Max results |
| query |
Get Lokal platform statistics — total agents, cities covered, interactions.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}| string |
| Free-text delivery/pickup wish for the producer (orders are pickup; this is informational) |
| contact_consent | boolean | true = the buyer agrees that the contact fields above are passed to the producers who receive a real order. Default false: fields are stored on the cart but never shown to any producer. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"cart_id",
"buyer_ref"
],
"properties": {
"cart_id": {
"type": "string",
"description": "Cart ID to submit"
},
"buyer_ref": {
"type": "string",
"description": "Buyer capability token"
},
"buyer_name": {
"type": "string",
"maxLength": 120,
"description": "Buyer's name — shared with ordering producers only when contact_consent=true"
},
"buyer_email": {
"type": "string",
"maxLength": 254,
"description": "Buyer's e-mail — becomes the order e-mail's Reply-To when contact_consent=true"
},
"buyer_phone": {
"type": "string",
"maxLength": 40,
"description": "Buyer's phone — shared only when contact_consent=true"
},
"delivery_note": {
"type": "string",
"maxLength": 500,
"description": "Free-text delivery/pickup wish for the producer (orders are pickup; this is informational)"
},
"contact_consent": {
"type": "boolean",
"description": "true = the buyer agrees that the contact fields above are passed to the producers who receive a real order. Default false: fields are stored on the cart but never shown to any producer."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lat": {
"type": "number",
"description": "Latitude for distance filtering (WGS84). Must be given together with lng."
},
"lng": {
"type": "number",
"description": "Longitude for distance filtering (WGS84). Must be given together with lat."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags: organic, seasonal, budget, local, fresh"
},
"limit": {
"type": "number",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Max results"
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "Categories: vegetables, fruit, berries, dairy, eggs, meat, fish, bread, honey, herbs, beverages (beverages = all drink venues: breweries, cideries, wineries, distilleries, farm cafés, meaderies — use drinkSubcategory below to narrow to exactly one kind)"
},
"maxDistanceKm": {
"type": "number",
"description": "Max distance in km from lat/lng (1–500, default 30). Only applies when lat/lng are given."
},
"drinkSubcategory": {
"enum": [
"bryggeri",
"cideri",
"vingård",
"destilleri",
"gårdskafé",
"mjød"
],
"type": "string",
"description": "Narrow 'beverages' results to exactly one drink venue kind: bryggeri (brewery), cideri (cidery), vingård (winery), destilleri (distillery), gårdskafé (farm café), mjød (meadery/mead producer). Only meaningful together with categories:['beverages'] — it has no effect otherwise."
}
}
}| string |
| Producer name, product query, or location search (Norwegian or English). Examples: 'Bjørndal Gård Oppdal', 'beefburger pris', 'ost Trondheim'. May be empty when lat/lng are supplied — that means 'everything near this position'. |
| radius_km | number | Search radius in km around lat/lng. Default 30. Typical: 15 in a city, 50–100 in rural Norway. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "User's latitude (WGS84). Supply this for 'near me' searches when you know where the user is."
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "User's longitude (WGS84). Must be supplied together with lat."
},
"limit": {
"type": "number",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Max results"
},
"query": {
"type": "string",
"default": "",
"description": "Producer name, product query, or location search (Norwegian or English). Examples: 'Bjørndal Gård Oppdal', 'beefburger pris', 'ost Trondheim'. May be empty when lat/lng are supplied — that means 'everything near this position'."
},
"radius_km": {
"type": "number",
"maximum": 500,
"minimum": 1,
"description": "Search radius in km around lat/lng. Default 30. Typical: 15 in a city, 50–100 in rural Norway."
}
}
}