io.github.slookisen/lokal-mcp
Norwegian local-food MCP: 1,431+ farms, shops, markets + umbrellas (Bondens marked, Hanen, REKO).
Open source Open in the app JSON README (API)
About
Norwegian local-food MCP: 1,431+ farms, shops, markets + umbrellas (Bondens marked, Hanen, REKO).
Details
- Kind
- MCP servers
- Topic
- No topic detected
- Publisher
- slookisen
- Origin
- official
- Category
- ferramentas
- Transport
- local
- Version
- 0.4.0
- Stars
- 1
- Open pull requests
- 2
- Last push
- 2026-09-05T18:13:15Z
- Repository state
- ativo
- Language
- TypeScript
- License
- MIT
- Added
- 2026-08-29 04:01:24
- Updated
- 2026-08-29 04:01:24
- Origin id
io.github.slookisen/lokal-mcp
README
# 🥬 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:
```json
{
"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`](custom-gpt-instructions.md).
### From your own agent (A2A / REST)
```bash
# 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"}'
```
## 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
- **Privacy policy:** https://rettfrabonden.com/privacy
- **Terms of service:** https://rettfrabonden.com/terms
- **Issues / support:** https://github.com/slookisen/lokal/issues
## License
MIT