MCP-server
Lad din AI-agent arbejde på lageret
Reolora har en MCP-server, så Claude, ChatGPT, Codex, Cursor, Grok og andre agenter kan se beholdning, bestille ind, flytte og tælle. De følger de samme regler som en medarbejder, og alt står i hændelsesloggen under agentens navn.
https://mcp.reolora.dk/mcp- Transport
- Streamable HTTP
- Login
- OAuth 2.1 eller API-nøgle
- Værktøjer
- 43
Forbind
Vælg din klient. Interaktive klienter logger ind med OAuth; bots og scripts bruger en API-nøgle.
Claude Code
- Tilføj serveren i terminalen.
- Skriv /mcp i Claude Code og vælg reolora for at logge ind i browseren.
claude mcp add --transport http reolora https://mcp.reolora.dk/mcpMed en API-nøgle i stedet:
claude mcp add --transport http reolora https://mcp.reolora.dk/mcp \
--header "Authorization: Bearer rk_live_…"Claude.ai / Desktop
- Åbn Indstillinger → Connectors → Tilføj custom connector.
- Navn: Reolora. URL: adressen herunder. Tryk Tilføj og log ind.
- Virker i Claude.ai, Claude Desktop og Claude på mobilen.
https://mcp.reolora.dk/mcpChatGPT / Dots
- Indstillinger → Apps & Connectors → Avanceret → slå Developer mode til.
- Opret en connector: navn Reolora, URL herunder, login OAuth.
- Kræver en Business- eller Enterprise-plan hos OpenAI. Dots bruger de samme connectors; Deep Research bruger værktøjerne search og fetch.
https://mcp.reolora.dk/mcpCodex
- Tilføj serveren, og log ind (åbner browseren).
codex mcp add reolora --url https://mcp.reolora.dk/mcp
codex mcp login reoloraMed en API-nøgle i stedet: (~/.codex/config.toml)
[mcp_servers.reolora]
url = "https://mcp.reolora.dk/mcp"
bearer_token_env_var = "REOLORA_API_KEY"Cursor
- Tryk på knappen, eller læg blokken i ~/.cursor/mcp.json. Cursor beder dig logge ind.
{
"mcpServers": {
"reolora": {
"url": "https://mcp.reolora.dk/mcp"
}
}
}Med en API-nøgle i stedet:
{
"mcpServers": {
"reolora": {
"url": "https://mcp.reolora.dk/mcp",
"headers": {
"Authorization": "Bearer rk_live_…"
}
}
}
}Grok
- grok.com → Connectors → New connector → Custom. URL herunder, og log ind.
- Grok Build CLI tilføjes som Claude Code. Fra xAI’s API bruger du MCP-værktøjet:
https://mcp.reolora.dk/mcpxAI API
{
"type": "mcp",
"server_url": "https://mcp.reolora.dk/mcp",
"server_label": "reolora",
"authorization": "Bearer rk_live_…"
}VS Code
- Tryk på knappen, eller læg blokken i .vscode/mcp.json. Copilot beder dig logge ind.
{
"servers": {
"reolora": {
"type": "http",
"url": "https://mcp.reolora.dk/mcp"
}
}
}Eller i terminalen:
code --add-mcp '{"name":"reolora","type":"http","url":"https://mcp.reolora.dk/mcp"}'Gemini CLI
- Tilføj serveren, og log ind med /mcp auth reolora.
gemini mcp add --transport http reolora https://mcp.reolora.dk/mcpMed en API-nøgle i stedet: (~/.gemini/settings.json)
{
"mcpServers": {
"reolora": {
"httpUrl": "https://mcp.reolora.dk/mcp",
"headers": {
"Authorization": "Bearer rk_live_…"
}
}
}
}Log ind
OAuth 2.1
Til Claude.ai, ChatGPT, Dots, Grok, Cursor, VS Code og CLI’erne med login. Klienten finder selv login-siden; du logger ind med din e-mail og godkender. Appen kan så det samme som dig.
API-nøgle
Til bots, der kører selv, og CLI’er uden browser. En nøgle hører til en agent i Team, så agenten har sit eget navn og sin egen rolle. Send den som Authorization: Bearer rk_live_…. Nøglen vises én gang; 120 kald i minuttet som standard.
Opret nøglen under Kontor → Team → Nøgler.
Roller
Hvad en agent må, afhænger af dens rolle. Den vælges, når agenten oprettes, og kan ændres når som helst.
Se read
Læser alt på sine lagre. Ændrer intet og foreslår intet.
Foreslå suggest
Ændringer bliver til forslag under Forslag, som en leder godkender. Godt at starte med.
Arbejd execute
Daglig drift: modtag, send flytninger, tæl, flyt, ordrer og returer. Indkøb og kartotek bliver forslag.
Styr manage
Som en leder: også indkøb, min/max og kartotek.
Logger du ind med OAuth, har agenten din egen rolle.
Værktøjer 43
Listen kommer direkte fra serveren. Alle lister har limit og cursor; alle ændringer har preview og request_id; site kan udelades, når man har ét lager.
| Navn | Hvad den gør | Slags |
|---|---|---|
warehouse_status | Start here. Orders by status, items out/reorder/ok, open purchase orders and transfers, pending proposals, the latest events and cursor (the newest event n). Pass since (a cursor you kept) to also get summary_since: what happened after it, by kind and by who.{"since": 1520} | læser |
find_items | Find items by SKU, EAN, supplier SKU or part of the name, with where they are on this site.{"query": "løbesko 42"} | læser |
stock_overview | Stock per item: available (on hand minus reserved), on its way, min/max, sold in 30 days, days left and status (out, reorder, coming, over, ok, none = no min/max). Filter by status, group or text; most urgent first.{"status": "out"} | læser |
item_detail | Everything about one item: master data, stock on every site, places here, min/max, what is on its way, 12 weeks of sales, recent history.{"sku": "SKU-1003"} | læser |
list_items | The catalogue (all sites) with group and supplier: filter by group name, items without a group, or text. For grouping and clean-up.{"without_group": true} | læser |
groups_and_suppliers | The item group tree (id, name, parent) and the suppliers (id, name, lead time in days, e-mail).{} | læser |
reorder_suggestions | What to buy now, per supplier: items below min (counting what is on its way), filled up to max in whole packs, with value and stock at other sites. Filter by supplier name.{"supplier": "FitGear"} | læser |
suggest_levels | Min/max from sales: daily mean and spread over days (default 60), lead time, 95 % service level, two-week review, whole packs. Compare with current_min/current_max.{"skus": ["SKU-1003"], "days": 90} | læser |
balance_suggestions | Items below min here that another site has more of than its own min: move them with create_transfer instead of buying.{} | læser |
purchase_orders | Purchase orders for this site with lines (ordered and received), supplier, expected date and value. Open ones only unless open_only is false.{"open_only": false} | læser |
transfers | Transfers in and out of this site, with lines (asked, sent, received). Open ones only unless open_only is false.{} | læser |
count_suggestions | Locations worth counting now: ABC class, days since the last count, recent shortages, traffic.{"limit": 15} | læser |
report | Key figures over days (default 30): stock value, picks per day, short picks, orders shipped, best sellers, dead stock, ABC split, count differences.{"days": 7} | læser |
get_location | One location (code or the customer alias) and what it holds.{"code": "A-01-02-1"} | læser |
list_orders | Customer orders, newest first, with lines; optionally one status (new, allocated, picking, picked, production, produced, packing, packed, shipped, cancelled).{"status": "new"} | læser |
events | The event log in order. Pass since (the cursor you kept) for only new events, and kind for one area (move, adjust, receive, count, pick, short, order, status, purchase, transfer, return, levels, proposal). Keep the returned cursor for next time.{"since": 1520, "kind": "short"} | læser |
proposals | Changes agents have proposed for this site and their status (pending by default).{"status": "approved"} | læser |
set_stock_levels | Set min/max for items: levels [{sku, min, max}]; min and max null removes the level. source "suggested" when the numbers come from suggest_levels. Managers only; agents that may not, use propose.{"levels": [{"sku": "SKU-1003", "min": 20, "max": 60}]} | ændrer |
create_purchase_order | Create a DRAFT purchase order for a supplier (name or id): lines [{sku, qty, cost?}]. Nothing is sent until send_purchase_order.{"supplier": "FitGear", "lines": [{"sku": "SKU-1003", "qty": 40}]} | ændrer |
update_purchase_order | Change a draft purchase order: replace its lines, expected date or note.{"po": "IK-0004", "lines": [{"sku": "SKU-1003", "qty": 50}]} | ændrer |
send_purchase_order | Mark a draft purchase order as sent to the supplier; its quantities then count as on their way.{"po": "IK-0004"} | ændrer |
cancel_purchase_order | Cancel a purchase order (a partly received one is closed for the rest).{"po": "IK-0004"} | ændrer |
receive_purchase | Goods in against a purchase order line: qty units to a location (or the best free place when left out).{"po": "IK-0004", "line": 1, "qty": 40} | ændrer |
create_transfer | Create a DRAFT transfer between two sites of the company (codes or ids); from_site defaults to this site. Lines [{sku, qty}].{"to_site": "WH-02", "lines": [{"sku": "SKU-1002", "qty": 10}]} | ændrer |
ship_transfer | Send a draft transfer from this site; units are taken from the places holding most.{"transfer": "FL-0002"} | ændrer |
receive_transfer | Receive a transfer on its way to this site; units go to the best places.{"transfer": "FL-0002"} | ændrer |
register_return | A customer return: back on a shelf (restock true, the default) or written off. Say why.{"sku": "SKU-1003", "qty": 1, "reason": "Forkert størrelse"} | ændrer |
save_item | Create or change an item by SKU; only the fields given change. group may be a path ("Sko / Løbesko", created when missing), supplier a name. Fields: sku, name, ean, group, supplier, supplier_sku, unit, pack_qty, cost, price, weight_grams, active, notes.{"item": {"sku": "SKU-1003", "price": 159}} | ændrer |
save_group | Create an item group (optionally under a parent, by name or id), or rename one by id.{"name": "Kampagne", "parent": "Tilbehør"} | ændrer |
set_item_group | Put many items (SKUs) in one group (name or id); null takes them out of any group.{"skus": ["SKU-1002", "SKU-1003"], "group": "Kampagne"} | ændrer |
save_supplier | Create or change a supplier: name, contact, email, phone, lead_days, notes (id to change an existing one).{"supplier": {"name": "FitGear Europe", "lead_days": 10}} | ændrer |
move_stock | Move units between two locations on this site; never mixes two items in one location.{"from": "A-01-02-1", "to": "B-03-01-2", "qty": 10, "reason": "Tættere på pakning"} | ændrer |
adjust_stock | Set the quantity at a location (0 empties it). Give sku when the location is empty. Say why.{"location": "A-01-02-1", "qty": 12, "reason": "Optalt"} | ændrer |
count | Record a blind count at a location; returns the difference to the system quantity.{"location": "A-01-02-1", "qty": 11} | ændrer |
create_order | Create a customer order. Lines [{sku, qty, location?}]; missing locations are allocated from stock.{"ref": "WEB-1042", "customer": "Mia Holm", "lines": [{"sku": "SKU-1003", "qty": 2}]} | ændrer |
set_order_status | Move an order forward (production, produced, packing, packed, shipped). Cancelling needs a manager.{"order": "WEB-1042", "status": "packed"} | ændrer |
propose | For agents that may not change things themselves: propose a change for a manager to approve in Forslag, with the database command, its arguments and why. Commands: set_stock_levels {levels, source}, create_purchase_order {supplier_id, lines, expected_at?, note?}, send_purchase_order {po}, create_transfer {from_site?, to_site, lines} (site ids), save_item {item}, set_item_group {skus, group_id}, move_stock {from, to, qty, reason}, adjust_stock {location, qty, sku?, reason}, create_order, set_order_status.{"command": "move_stock", "args": {"from": "A-01-02-1", "to": "B-03-01-2", "qty": 10, "reason": "Fyld op"}, "reason": "Pladsen er næsten tom"} | ændrer |
whoami | Who you are signed in as: your name, role (and agent mode), company and the sites you can work on, with which one is used when you leave site out.{} | læser |
search | Search the warehouse (items by SKU, EAN or name) and get ids for fetch. Returns {results: [{id, title, url}]}, the shape ChatGPT and Deep Research use.{"query": "drikkedunk"} | læser |
fetch | The full record behind a search id: an item with stock per site, places, min/max, what is on its way and recent sales. Returns {id, title, text, url, metadata}.{"id": "item:SKU-1003@WH-01"} | læser |
subscribe | Get a POST to your https URL whenever events of these kinds happen on this site (empty: all): move, adjust, receive, count, pick, short, order, status, purchase, transfer, return, levels, proposal, layout. Signed with the returned secret; failed deliveries are retried.{"url": "https://example.com/hooks/reolora", "kinds": ["short", "proposal"]} | ændrer |
unsubscribe | Stop a webhook by its id (from subscribe or webhooks).{"webhook": "0b6d…"} | ændrer |
webhooks | Your webhooks on this site (managers see all), with failures and the last answer.{} | læser |
Til agenter, der kører selv
preview: true- Kør en ændring og se resultatet uden at gemme noget. Samme kontrol som den rigtige.
request_id- Giv hver ændring et id. Prøver agenten igen med samme id, sker det ikke to gange.
Fejl med næste skridt- Fejl kommer som {code, message, hint, next}, fx not_found med next: find_items.
since og cursor- warehouse_status og events giver en cursor. Næste gang: since = cursor, og summary_since fortæller hvad der er sket.
Webhooks- subscribe(url, kinds) sender et signeret POST, når fx en vare mangler eller et forslag kommer. Fejlede kald prøves igen.
Ressourcer og prompts- reolora://guide og status pr. lager; prompts som dagens-indkob og ugens-optaelling.
Tjek signaturen på et webhook:
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody: the request body exactly as received (a string), secret: whsec_… from subscribe
const expected = 'sha256=' + createHmac('sha256', secret)
.update(`${req.headers['x-reolora-timestamp']}.${rawBody}`)
.digest('hex');
const ok = timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-reolora-signature']));Prøv det
Med en API-nøgle i REOLORA_API_KEY:
curl -s https://mcp.reolora.dk/mcp \
-H "Authorization: Bearer $REOLORA_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'curl -s https://mcp.reolora.dk/mcp \
-H "Authorization: Bearer $REOLORA_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'Tre ting at spørge om
- “Hvad skal vi bestille hos Løbeland i dag? Lav kladder, men send intet.”
- “Hvad er sket på lageret siden i går, og er noget udsolgt?”
- “Flyt 10 stk. SKU-1003 til butikken WH-02. Vis mig først, hvad der vil ske.”