Gå til indhold

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.

Adressehttps://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

  1. Tilføj serveren i terminalen.
  2. 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/mcp

Med 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

  1. Åbn Indstillinger → Connectors → Tilføj custom connector.
  2. Navn: Reolora. URL: adressen herunder. Tryk Tilføj og log ind.
  3. Virker i Claude.ai, Claude Desktop og Claude på mobilen.
https://mcp.reolora.dk/mcp
Åbn Connectors i Claude

ChatGPT / Dots

  1. Indstillinger → Apps & Connectors → Avanceret → slå Developer mode til.
  2. Opret en connector: navn Reolora, URL herunder, login OAuth.
  3. 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/mcp

Codex

  1. Tilføj serveren, og log ind (åbner browseren).
codex mcp add reolora --url https://mcp.reolora.dk/mcp
codex mcp login reolora

Med 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

  1. 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_…"
      }
    }
  }
}
Add to Cursor

Grok

  1. grok.com → Connectors → New connector → Custom. URL herunder, og log ind.
  2. Grok Build CLI tilføjes som Claude Code. Fra xAI’s API bruger du MCP-værktøjet:
https://mcp.reolora.dk/mcp

xAI API

{
  "type": "mcp",
  "server_url": "https://mcp.reolora.dk/mcp",
  "server_label": "reolora",
  "authorization": "Bearer rk_live_…"
}
Åbn Grok connectors

VS Code

  1. 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"}'
Installér i VS Code

Gemini CLI

  1. Tilføj serveren, og log ind med /mcp auth reolora.
gemini mcp add --transport http reolora https://mcp.reolora.dk/mcp

Med 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.

NavnHvad den gørSlags
warehouse_statusStart 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_itemsFind 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_overviewStock 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_detailEverything 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_itemsThe 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_suppliersThe item group tree (id, name, parent) and the suppliers (id, name, lead time in days, e-mail).{}læser
reorder_suggestionsWhat 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_levelsMin/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_suggestionsItems below min here that another site has more of than its own min: move them with create_transfer instead of buying.{}læser
purchase_ordersPurchase 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
transfersTransfers in and out of this site, with lines (asked, sent, received). Open ones only unless open_only is false.{}læser
count_suggestionsLocations worth counting now: ABC class, days since the last count, recent shortages, traffic.{"limit": 15}læser
reportKey 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_locationOne location (code or the customer alias) and what it holds.{"code": "A-01-02-1"}læser
list_ordersCustomer orders, newest first, with lines; optionally one status (new, allocated, picking, picked, production, produced, packing, packed, shipped, cancelled).{"status": "new"}læser
eventsThe 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
proposalsChanges agents have proposed for this site and their status (pending by default).{"status": "approved"}læser
set_stock_levelsSet 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_orderCreate 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_orderChange a draft purchase order: replace its lines, expected date or note.{"po": "IK-0004", "lines": [{"sku": "SKU-1003", "qty": 50}]}ændrer
send_purchase_orderMark a draft purchase order as sent to the supplier; its quantities then count as on their way.{"po": "IK-0004"}ændrer
cancel_purchase_orderCancel a purchase order (a partly received one is closed for the rest).{"po": "IK-0004"}ændrer
receive_purchaseGoods 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_transferCreate 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_transferSend a draft transfer from this site; units are taken from the places holding most.{"transfer": "FL-0002"}ændrer
receive_transferReceive a transfer on its way to this site; units go to the best places.{"transfer": "FL-0002"}ændrer
register_returnA 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_itemCreate 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_groupCreate an item group (optionally under a parent, by name or id), or rename one by id.{"name": "Kampagne", "parent": "Tilbehør"}ændrer
set_item_groupPut 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_supplierCreate 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_stockMove 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_stockSet 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
countRecord a blind count at a location; returns the difference to the system quantity.{"location": "A-01-02-1", "qty": 11}ændrer
create_orderCreate 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_statusMove an order forward (production, produced, packing, packed, shipped). Cancelling needs a manager.{"order": "WEB-1042", "status": "packed"}ændrer
proposeFor 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
whoamiWho 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
searchSearch 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
fetchThe 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
subscribeGet 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
unsubscribeStop a webhook by its id (from subscribe or webhooks).{"webhook": "0b6d…"}ændrer
webhooksYour 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.”