Skip to main content
Glama

🥬 Rett fra Bonden — Local Food Agent Network for Norway

Live: https://rettfrabonden.com | MCP Server: https://rettfrabonden.com/mcp | API Spec: https://rettfrabonden.com/openapi.yaml

Rett fra Bonden is the discovery layer for local food in Norway. 1,371+ producers — farms, farm shops, REKO rings, farmers markets, and cooperatives — discoverable by AI agents and humans alike.

Not an app. Not a webshop. Infrastructure — the DNS for food agents.

Use Rett fra Bonden

From Claude (remote MCP via Claude Connectors)

The recommended setup for Claude.ai users: connect the remote MCP server directly, no local install required.

  • MCP Server URL: https://rettfrabonden.com/mcp

  • Transport: Streamable HTTP (MCP protocol 2025-06-18)

  • Authentication: None required — the server is publicly accessible

Once connected, ask Claude things like:

  • "Finn økologiske grønnsaker nær Oslo som leverer hjem"

  • "Which dairy farms in Rogaland sell raw milk directly to consumers?"

  • "Compare three honey producers in Innlandet — who ships nationwide?"

From Claude Desktop (MCP stdio)

If you prefer a local install over remote:

{
  "mcpServers": {
    "lokal": {
      "command": "npx",
      "args": ["lokal-mcp"]
    }
  }
}

From ChatGPT (Developer Mode / Custom GPT)

Developer Mode: Add https://rettfrabonden.com/mcp as the MCP server URL.

Custom GPT: Create a GPT with Actions pointing to https://rettfrabonden.com/openapi.yaml. Instructions in custom-gpt-instructions.md.

From your own agent (A2A / REST)

# Natural language search
curl "https://rettfrabonden.com/api/marketplace/search?q=organic+vegetables+near+Oslo"

# Structured discovery
curl -X POST https://rettfrabonden.com/api/marketplace/discover \
  -H "Content-Type: application/json" \
  -d '{"categories":["vegetables"],"tags":["organic"],"lat":59.91,"lng":10.75,"maxDistanceKm":30}'

# A2A JSON-RPC
curl -X POST https://rettfrabonden.com/a2a \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"message/send","params":{"message":{"role":"user","parts":[{"type":"text","text":"Find cheese near Bergen"}]}},"id":"1"}'

Related MCP server: datakilder-mcp

MCP Tools & Resources

The remote MCP endpoint at /mcp exposes four tools and two resources.

Tool

Purpose

Read/Write

lokal_search

Natural-language producer search (NO/EN). Auto-starts a conversation with top matches so sellers can respond.

Read + Write

lokal_discover

Structured filter — categories, tags, geo-radius. Auto-starts conversations.

Read + Write

lokal_info

Full producer profile — address, products, opening hours, certifications.

Read only

lokal_stats

Platform-level metrics — total agents, cities covered.

Read only

Resource URI

Mime

Description

lokal://producers/overview

text/plain

Aggregate view of producers by city

lokal://producers/{agentId}

application/json

Detailed info about a specific producer

HTTP API

Endpoint

Method

Description

/mcp

POST/GET/DELETE

MCP Streamable HTTP (remote MCP transport)

/api/marketplace/search?q=...

GET

Natural language search (NO/EN)

/api/marketplace/discover

POST

Structured filtering

/api/marketplace/agents/:id/info

GET

Producer details

/api/stats

GET

Platform statistics

/a2a

POST

A2A JSON-RPC 2.0

/.well-known/agent-card.json

GET

A2A Agent Card

/.well-known/mcp/server-card.json

GET

MCP Server Card (human + machine-readable metadata)

/openapi.yaml

GET

OpenAPI 3.1 spec

/llms.txt

GET

AI-discovery index

/privacy

GET

Privacy policy (NO/EN)

Full spec: https://rettfrabonden.com/openapi.yaml

Architecture

  • TypeScript + Express on Fly.io

  • SQLite with WAL mode, persistent volume

  • MCP 2025-06-18 over Streamable HTTP + stdio (remote + local)

  • A2A v1.0.0 compliant (JSON-RPC 2.0 + Agent Card)

  • Value-based matching — no ads, no pay-to-rank

  • 1,386+ agents across 374+ Norwegian cities

For producers

Your farm/market might already be listed. Visit https://rettfrabonden.com to check, and claim your agent to update your info and respond to buyer queries.

Troubleshooting

"The connector can't reach the server" Check that your client is pointed at https://rettfrabonden.com/mcp (HTTPS, no trailing slash). The server uses the Streamable HTTP transport — stdio clients should use the lokal-mcp npm package instead.

"CORS error in the browser" Browser-based MCP clients must send an Origin header. The server allow-lists https://claude.ai, https://www.claude.ai, https://chatgpt.com, and https://chat.openai.com. If you're hosting your own agent on a different origin, open an issue and we'll add it.

"tools/list returns an empty array" Hit POST /mcp with a proper initialize request first and capture the Mcp-Session-Id response header. Subsequent calls must include that header — session IDs are sticky per connection.

"Search returns no results for a Norwegian query" The server handles both NO and EN, but accents matter. Use økologisk rather than okologisk for best relevance. Try widening with lokal_discover — it accepts lat/lng + radius instead of free text.

"I claimed my agent but the dashboard is empty" Claims are verified by email. Check spam for the verification code from kontakt@rettfrabonden.com. The token is valid for 24 hours.

Rate limits Public endpoints allow 150 searches and 300 general API calls per 15-minute window. MCP tools/call counts against the search bucket. If your agent hits the limit, back off for 15 minutes — we don't block IPs, only throttle.

Still stuck Open an issue at https://github.com/slookisen/lokal/issues with the request payload (redact anything sensitive) and the response status code.

Privacy, Terms & Support

License

MIT

Available Tools

4 tools
lokal_discoverBInspect

Structured search in the Lokal food producer registry. Filter by food categories, tags, and geographic distance. Returns ranked producers with contact info and vCard links.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoriesNoCategories: vegetables, fruit, berries, dairy, eggs, meat, fish, bread, honey, herbs
tagsNoTags: organic, seasonal, budget, local, fresh
latNoLatitude for distance filtering
lngNoLongitude for distance filtering
maxDistanceKmNoMax distance in km
limitNoMax results

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that results are 'ranked' and includes 'contact info and vCard links,' which adds some behavioral context beyond basic search functionality. However, it lacks critical information about permissions, rate limits, error conditions, pagination (beyond the limit parameter), or whether this is a read-only operation. For a search tool with no annotations, this leaves significant gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that efficiently conveys the tool's purpose, key parameters, and return value. It's front-loaded with the core functionality and avoids any redundant or unnecessary information. Every part of the sentence earns its place by adding value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (6 parameters, no output schema, no annotations), the description is adequate but has clear gaps. It covers the basic purpose and return format, but lacks behavioral details (e.g., error handling, authentication) and usage guidelines relative to siblings. With no output schema, it doesn't fully explain the structure of returned data beyond mentioning 'ranked producers with contact info and vCard links.' This makes it minimally viable but incomplete for optimal agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters thoroughly with descriptions and constraints (e.g., categories and tags with example values, lat/lng for distance filtering, limit with min/max/default). The description adds marginal value by summarizing the filtering capabilities ('Filter by food categories, tags, and geographic distance') but doesn't provide additional syntax, format details, or usage examples beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs 'structured search in the Lokal food producer registry' with specific filtering capabilities (categories, tags, geographic distance) and indicates what it returns (ranked producers with contact info and vCard links). It distinguishes itself from siblings by focusing on structured search with specific filters, though it doesn't explicitly differentiate from 'lokal_search' which might have overlapping functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus the sibling tools (lokal_info, lokal_search, lokal_stats). It doesn't mention prerequisites, alternatives, or specific use cases that would help an agent choose between these tools. The only implied usage is for searching with specific filters, but no comparative context is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lokal_infoAInspect

Get detailed information about a specific Lokal producer — address, products, opening hours, certifications, and a vCard link the user can add to their contacts.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentIdYesThe producer's agent ID (UUID)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It describes the return data structure (address, products, etc.) and mentions a vCard link functionality, which adds useful context. However, it doesn't disclose behavioral traits like whether this is a read-only operation, error handling, or performance characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that efficiently communicates purpose and return values. Every element (verb, resource, specific data fields) earns its place with zero wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read operation with no output schema, the description provides good coverage of what information will be returned. It could be more complete by mentioning the response format or error cases, but it adequately conveys the tool's purpose and output scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the single 'agentId' parameter as a UUID. The description adds no additional parameter semantics beyond what's in the schema, but the baseline is 3 when schema coverage is high.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get') and resource ('specific Lokal producer'), specifying the exact information returned (address, products, opening hours, certifications, vCard link). It distinguishes from sibling tools by focusing on detailed information for a specific producer rather than discovery, search, or statistics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by specifying 'specific Lokal producer,' suggesting this tool should be used when the user already has a producer ID. However, it doesn't explicitly state when NOT to use it or name alternatives like 'lokal_search' for finding producers without an ID.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lokal_statsBInspect

Get Lokal platform statistics — total agents, cities covered, interactions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. While it indicates this is a read operation ('Get'), it doesn't specify whether authentication is required, rate limits apply, or what format the statistics are returned in. For a tool with zero annotation coverage, this leaves significant gaps in understanding how the tool behaves beyond its basic purpose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—a single sentence that efficiently communicates the tool's purpose and the specific statistics it returns. Every word earns its place with no redundancy or unnecessary elaboration, making it easy to parse and understand immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema, no annotations), the description is adequate but minimal. It explains what statistics are retrieved but doesn't address behavioral aspects like authentication needs or response format. For a read-only statistics tool, this provides the core information but leaves practical implementation details unclear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema description coverage is 100% (though trivial since there are no parameters). The description appropriately doesn't discuss parameters since none exist, and it provides context about what statistics are retrieved. This meets the baseline expectation for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Get') and resource ('Lokal platform statistics'), listing the types of statistics returned (total agents, cities covered, interactions). It distinguishes itself from siblings by focusing on platform-wide statistics rather than discovery, information, or search functions. However, it doesn't explicitly differentiate from siblings in the description text, so it falls just short of a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus its siblings (lokal_discover, lokal_info, lokal_search). It doesn't mention any prerequisites, alternatives, or specific contexts where this tool is appropriate. The agent must infer usage based solely on the tool name and description without explicit direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.3.1
    • First observedlokal_discover
    • First observedlokal_info
    • First observedlokal_search
    • First observedlokal_stats

TDQS

A3.5/5.0

Scored across 4 tools

Disambiguation3/5

The tools have overlapping purposes that could cause confusion. 'lokal_discover' and 'lokal_search' both search for producers, with 'discover' offering structured filtering and 'search' using natural language, making them potentially ambiguous. 'lokal_info' and 'lokal_stats' are distinct, but the two search tools may lead to misselection due to unclear boundaries in their use cases.

Naming Consistency5/5

All tool names follow a consistent 'lokal_' prefix with a descriptive suffix pattern (e.g., discover, info, search, stats). This predictable verb_noun-like structure is clear and uniform throughout the set, with no deviations in style or convention.

Tool Count4/5

With 4 tools, the count is reasonable and well-scoped for a food producer registry server. It covers key operations like searching, retrieving details, and getting platform stats, though it might feel slightly thin if more advanced features are expected, but overall it's appropriate for the domain.

Completeness3/5

The tool set covers basic search and retrieval functions but has notable gaps. There is no ability to create, update, or delete producer data, which limits CRUD coverage. However, for a read-only registry focused on discovery and information, it handles core workflows adequately, leaving agents to work around the lack of write operations.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides LLM-friendly weather tools and Norwegian place name resolution via MCP, enabling weather forecasts, air quality, marine conditions, and activity planning.
    1
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    MCP server providing typed tools for Norwegian public data sources, enabling natural language queries to official datasets like SSB, Brønnøysund, MET, Kartverket, Entur, and more, without requiring API keys.
    47
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables searching products, viewing product details, managing the basket, and accessing order history on nemlig.com through natural language. It does not support placing orders or accessing payment cards.
    6
    MIT