loading…
Search for a command to run...
loading…
A local-first MCP server for tracking beer releases on Vinmonopolet, enabling users to search new and upcoming beers, check store stock, find nearby stores, and
A local-first MCP server for tracking beer releases on Vinmonopolet, enabling users to search new and upcoming beers, check store stock, find nearby stores, and manage watchlists.
A local-first MCP server for tracking beer releases on Vinmonopolet and an external release-feed API backed by your own collector/database.
npm package: @henrikogard/polvenn-mcp-server
CLI command: polvenn-mcp-server
It is designed to run as a local stdio MCP server:
Polvenn exposes 8 MCP tools:
| Tool | Description | Writes data? |
|---|---|---|
polvenn_search_new_beers |
Search Vinmonopolet's current Nyheter listing and/or your external release feed, with optional Kommende nyheter, releaseDate, and storeId filters |
No |
polvenn_search_upcoming_beers |
Search Vinmonopolet's "Kommende nyheter" listing for upcoming beer releases | No |
polvenn_search_new_beers_near_store |
Search current Nyheter available in one store, using your configured home store or nearest configured location by default |
No |
polvenn_check_store_stock |
Check stock for a beer at a Vinmonopolet store, using the official API when possible and Vinmonopolet's web stock locator as fallback | No |
polvenn_find_nearby_stores |
Find the closest Vinmonopolet stores to a coordinate | No |
polvenn_watchlist |
Add, remove, list, and check watch rules | Yes |
polvenn_configure |
Store API keys, home store, and home coordinates locally | Yes |
polvenn_validate_config |
Validate current config and probe upstream capabilities | No |
Typical use cases:
20162402 in stock near Stavanger?”If the official Vinmonopolet stock endpoint is not available, Polvenn falls back to Vinmonopolet's own web stock locator for store-level counts when possible. If neither source can verify the store, Polvenn reports store-level stock as unknown instead of incorrectly reporting zero stock or inferring "bestillingsutvalget" as a store-stock answer.
For polvenn_search_new_beers, the since filter is best-effort: Polvenn prefers external release dates when available, and otherwise falls back to Vinmonopolet's lastChanged timestamp.
If you pass storeId, only Vinmonopolet-backed results that are available in that store are included.
Any MCP client
(Codex, Claude Desktop, Inspector, others)
│
│ stdio
▼
polvenn-mcp-server
├── tools
├── zod schemas
├── Vinmonopolet service
├── External release feed client
└── SQLite storage via sql.js
│
▼
~/.polvenn/polvenn.db
Project structure:
src/
├── index.ts # MCP server entry point
├── constants.ts # URLs, defaults, retry settings
├── types.ts # Domain types
├── sql.js.d.ts # Local sql.js typings
├── tools/
│ └── index.ts # MCP tool registration and handlers
├── schemas/
│ └── tools.ts # Zod input schemas
├── services/
│ ├── release-feed.ts # External release feed client
│ ├── vinmonopolet.ts # Vinmonopolet API client
│ └── watchlist.ts # Watchlist matching logic
├── utils/
│ ├── geo.ts
│ ├── geo.test.ts
│ └── http.ts
└── db/
└── database.ts # SQLite persistence and config
npm install
npx tsc --noEmit
npm run build
Published npm package:
npm install -g @henrikogard/polvenn-mcp-server
npm start
This starts the MCP server on stdio, which is what local desktop/CLI MCP clients expect.
If your MCP client supports local stdio servers, point it at:
command: node
args: ["/absolute/path/to/polvenn-mcp-server/dist/index.js"]
If you installed the package globally from npm, you can also point the client directly at the CLI:
command: polvenn-mcp-server
args: []
Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"polvenn": {
"command": "node",
"args": ["/absolute/path/to/polvenn-mcp-server/dist/index.js"]
}
}
}
After restarting Claude Desktop, configure your own collector from chat:
Configure polvenn with release feed URL https://releases.example.com.
Codex supports MCP server definitions in ~/.codex/config.toml. Add:
[mcp_servers.polvenn]
command = "node"
args = ["/absolute/path/to/polvenn-mcp-server/dist/index.js"]
Restart Codex after saving the config.
Then configure your own collector from a Codex chat:
Configure polvenn with release feed URL https://releases.example.com.
As of April 7, 2026, ChatGPT apps/custom MCP integrations use remote MCP servers over SSE or streaming HTTP, not local stdio servers.
That means this repo does not plug directly into ChatGPT in its current form.
To use Polvenn with ChatGPT, you would need to:
In other words:
Once connected from an MCP client, configure the local server with your keys and defaults.
Polvenn expects an external release collector that exposes:
GET /releases/latest
You can run your own collector from GitHub here:
Quick setup:
npm install.npm run build.polvenn-release-collector.config.example.json to polvenn-release-collector.config.json.npm start.http://127.0.0.1:4100/health.http://127.0.0.1:4100/releases/latest?limit=3.If you want to expose it publicly on a VPS, follow the deployment guide in the collector repo:
Once your collector is running, choose your own feed URL, for example:
releaseFeedUrl = http://127.0.0.1:4100
or:
releaseFeedUrl = https://releases.example.com
That means the local MCP server will read from:
https://releases.example.com/releases/latest?limit=...
Recommended order:
polvenn-release-collector./health endpoint./releases/latest?limit=3 endpoint.polvenn-mcp-server locally in Codex or Claude Desktop.releaseFeedUrl.Example prompts:
Configure polvenn with release feed URL https://releases.example.com.
Configure polvenn with Vinmonopolet API key <key>.
Set home location to Stavanger (58.97, 5.73).
Set home store to 170.
Validate my Polvenn configuration and tell me which integrations are working.
These work well in Codex, Claude Desktop, or another MCP client:
Search for new stouts from the last 30 days.
Search for new beers available in store 116.
Search for new beers from the 1. april 2026 release.
Search for new beers and include upcoming Vinmonopolet web releases.
Show upcoming beers from Vinmonopolet.
Show upcoming sour beers from Vinmonopolet.
Show new sour beers near my store.
Check whether article 20162402 is in stock at store 170.
Find the 5 closest Vinmonopolet stores to 58.97, 5.73.
Add a watchlist rule for brewery Lervig.
Check my watchlist against the latest release in my external feed.
The watchlist supports four rule types:
| Type | Matches against | Example |
|---|---|---|
brewery |
Producer name | Lervig |
style |
Beer style | Imperial Stout |
series |
Beer name | Racketeers |
keyword |
Beer name and producer | barrel aged |
All local state lives in:
~/.polvenn/polvenn.db
Override the data directory with:
POLVENN_DATA_DIR=/some/path
Stored data includes:
API keys are stored locally and only sent to their respective upstream APIs.
The package metadata is set up for npm publishing:
@henrikogard/polvenn-mcp-serverpolvenn-mcp-serverdist/, README.md, and LICENSEprepack builds the TypeScript output before publishinghttps://apis.vinmonopolet.noOcp-Apim-Subscription-Keyvinmonopolet.no when the API returns sparse article datareleaseFeedUrlGET /releases/latest?limit=N{
"releases": [
{
"id": "2026-04-01-main",
"title": "April 2026 main release",
"source": "vinmonopolet-monthly",
"publishedAt": "2026-04-01T08:00:00Z",
"url": "https://example.com/release/2026-04-01-main",
"items": [
{
"country": "Norge",
"articleNumber": "20162402",
"producer": "Amundsen Bryggeri",
"name": "Example Beer",
"style": "Imperial Stout",
"abv": 12,
"releaseDate": "1. april 2026"
}
]
}
]
}
npm run dev
npx tsc --noEmit
npm run build
npm test
npx @modelcontextprotocol/inspector node dist/index.js
| Package | Purpose |
|---|---|
@modelcontextprotocol/sdk |
MCP server framework |
sql.js |
SQLite in pure JavaScript |
cheerio |
HTML parsing |
zod |
Input validation |
typescript |
Build tooling |
MIT
Выполни в терминале:
claude mcp add polvenn-mcp-server -- npx Безопасность
Низкий рискАвтоматическая эвристика по публичным данным — не гарантия безопасности.