Claude verbinden met SAP EWM: een stapsgewijze handleiding voor het bouwen van je eigen MCP-connector

Claude verbinden met SAP EWM: een stapsgewijze handleiding voor het bouwen van je eigen MCP-connector

Hoe we Claude veilige, directe toegang tot een SAP Extended Warehouse Management-systeem hebben gegeven met behulp van het Model Context Protocol — en hoe je hetzelfde kunt doen in je eigen SAP-demo omgeving.

Waarom we dit hebben gebouwd

SAP Extended Warehouse Management (EWM) biedt een uitgebreide set OData v4-API’s voor onder andere magazijnorders, magazijntaken, resources en leveringen. Ze zijn krachtig, maar ze zijn ontworpen voor systeem-tot-systeemintegratie: de juiste headers, CSRF-tokens, ETags en vereisten vanuit de businesslaag moeten allemaal correct zijn voordat één verzoek succesvol kan worden uitgevoerd.

Wij wilden iets anders: de mogelijkheid om simpelweg te vragen: “annuleer deze magazijntaak”, “zoek een achterstallige magazijnorder en geef die een hogere prioriteit” of “laat me de openstaande leveringen voor dit magazijn zien” — en dat het vervolgens correct gebeurt, zonder ook maar één SAP-transactie te openen.

Daarvoor moesten we Claude een echte, werkende verbinding met SAP geven. In dit artikel leggen we precies uit hoe we die verbinding hebben gebouwd, welke problemen we onderweg tegenkwamen en hoe je deze kunt instellen op je eigen SAP-demonstratiesysteem.

[Screenshot: Claude chat window showing a natural-language request followed by Claude’s confirmation]  

[Screenshot: Claude chat window showing a natural-language request followed by Claude’s confirmation]

Wat is MCP, in eenvoudige woorden?

Het Model Context Protocol (MCP) is een open standaard om AI-assistenten te verbinden met externe tools en systemen. In plaats van dat een AI alleen over een systeem kan praten, stelt MCP de AI in staat om rechtstreeks met het systeem te communiceren — API’s aan te roepen, gegevens te lezen en acties uit te voeren — via een kleine “server” die als brug fungeert.

Voor onze toepassing is die brug een klein programma dat lokaal draait. Het vertaalt verzoeken in natuurlijke taal naar correcte SAP OData v4-aanroepen, inclusief alle benodigde headers, tokens en foutafhandeling, en stuurt de resultaten vervolgens terug naar Claude.

Architectuuroverzicht

Claude SAP EWM connection

  • Claude Desktop is de plek waar je verzoeken in gewone taal invoert.

  • De MCP-server is een klein Node.js-programma, verpakt als een Claude Desktop-extensie (een .mcpb-bestand), dat lokaal op je computer draait.

  • SAP EWM wordt via het netwerk bereikt — in ons geval via een privé-Tailscale-netwerk, maar elk bereikbaar HTTPS-eindpunt werkt.

Inloggegevens worden lokaal door Claude Desktop opgeslagen en verlaten je computer alleen om rechtstreeks met je SAP-host te communiceren.

Van een verzoek in gewone taal naar een SAP API-aanroep

Dit is wat er daadwerkelijk gebeurt tussen het moment waarop je een zin invoert en SAP de gegevens bijwerkt:

“Zoek alle magazijnorders voor uitgaande picking die al meer dan 12 uur openstaan en wijs ze toe aan de prioriteitswachtrij.”

  1. Claude vertaalt je verzoek naar een query. “Meer dan 12 uur open” is geen echt SAP-veld. Claude bepaalt daarom zelf het juiste tijdstip en bouwt de juiste filter voor uitgaande picking-orders die nog niet bevestigd zijn.

  2. De server bevraagt SAP en retourneert de magazijnorders die op dat moment aan de voorwaarden voldoen.

  3. Claude controleert of de resultaten logisch zijn en past zijn aanpak aan als dat niet het geval is — filters gedragen zich niet altijd zoals je zou verwachten.

  4. Voor elke order die aan de voorwaarden voldoet, haalt de server de @odata.etag en een nieuw CSRF-token op. Vervolgens wordt een PATCH-verzoek verstuurd waarmee het wachtrijveld van de order wordt ingesteld op de prioriteitswachtrij. Daarbij worden het token en de @odata.etag meegestuurd als een If-Match-header, zodat SAP kan controleren of er ondertussen niets anders aan de order is gewijzigd. SAP reageert per order en bevestigt de wijziging of legt uit waarom deze niet kon worden uitgevoerd.

  5. Claude rapporteert het resultaat in gewone taal — hoeveel orders er zijn gevonden, hoeveel er een hogere prioriteit hebben gekregen en welke zaken nog aandacht nodig hebben.

Je ziet alleen het resultaat in gewone taal, maar wat voor jou als één opdracht voelt, kan daaronder uit een tiental of meer SAP-aanroepen bestaan.

Waarom dan niet gewoon de OData API rechtstreeks aanroepen?

Een terechte vraag. De SAP-API gedraagt zich precies hetzelfde, ongeacht wat haar aanroept — een script, een RPA-bot of onze connector. Uiteindelijk versturen ze allemaal dezelfde HTTP-verzoeken. MCP geeft SAP geen nieuwe mogelijkheden.

Concreet definieert MCP een standaardmanier waarop een AI-app aan een server kan vragen: “Wat kun je doen?” De server retourneert vervolgens een lijst met tools, elk met een naam, een beschrijving in gewone taal en de exacte parameters die nodig zijn. Onze connector publiceert bijvoorbeeld op deze manier een tool genaamd sap_odata_request. Claude leest die lijst, kiest de tool die bij het verzoek past en roept deze aan met gestructureerde parameters. MCP definieert ook precies hoe die aanroep en het resultaat worden opgemaakt, zodat Claude altijd een betrouwbaar leesbaar antwoord krijgt.

Dat is het daadwerkelijke voordeel van een standaard: zonder MCP betekent AI-toegang tot je systemen dat je aangepaste integratiecode moet schrijven die specifiek is voor het AI-product dat je gebruikt. Bouw je één keer een connector met MCP, dan kan elke MCP-compatibele AI-app dezelfde tools ontdekken en gebruiken zonder extra werk — net zoals iedere browser iedere website kan openen omdat beide kanten HTTP spreken.

Het is ook wat Claude in staat stelde om tijdens de taak zijn aanpak aan te passen. Bij het bouwen van de controle voor “meer dan 12 uur open” leverde de eerste filteraanpak via dezelfde generieke tool stilletjes een verkeerd antwoord op. Claude merkte dit op, probeerde een andere aanpak en controleerde het resultaat voordat er actie werd ondernomen — iets wat een vast script uit zichzelf nooit zou detecteren.

En omdat MCP een open standaard is en geen eenmalige maatwerkoplossing, werkt dezelfde connector met iedere MCP-compatibele AI-tool, niet alleen met deze.

Vereisten

Voordat je begint, heb je het volgende nodig:

  • Een bereikbaar SAP-systeem met een geactiveerde OData v4-service — bijvoorbeeld de standaard Warehouse Order and Task (A2X)-API (API_WAREHOUSE_ORDER_TASK_2).

  • SAP-gebruikersgegevens met toegang tot de relevante EWM-magazijnen. Let op: OData v4-services in SAP kunnen niet worden uitgevoerd met uitgeschakelde CSRF-bescherming. In tegenstelling tot OData v2 is er geen configuratieschakelaar om deze uit te schakelen (zie SAP Note 2322624). Echte authenticatie moet op de service actief zijn.

  • Claude Desktop, met Extensions ingeschakeld via de instellingen.

SAP EWM Connectie met Claude

[Screenshot: SICF service activation screen showing the OData v4 service node]

Opmerking: De onderstaande stappen 1–3 beschrijven hoe wij de connector hebben gebouwd — de projectstructuur, het manifest en het verpakkingsproces. Je hoeft dit zelf niet te doen. Aan het einde van dit artikel delen we het volledig afgewerkte en direct te gebruiken .mcpb-bestand. Als je dus gewoon aan de slag wilt, kun je direct doorgaan naar [Stap 4]. De stappen 1–3 zijn bedoeld voor iedereen die wil weten wat er onder de motorkap gebeurt of de connector verder wil uitbreiden.

Stap 1 — De lokale MCP-server opzetten (hoe wij hem hebben gebouwd — niet vereist voor jou)

Maak een projectmap met de volgende structuur:

sap-ewm-mcp/
├── manifest.json
├── package.json
└── server/
    └── index.js

package.json bevat twee afhankelijkheden:

{
  "name": "sap-ewm-mcp",
  "version": "1.0.0",
  "type": "module",
  "main": "server/index.js",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.12.0",
    "zod": "^3.24.1"
  }
}

server/index.js bevat de daadwerkelijke logica. Op hoofdlijnen moet deze:

  1. De verbindingsinstellingen (host, gebruikersnaam, wachtwoord) lezen uit omgevingsvariabelen die door Claude Desktop worden aangeleverd.

  2. Voor iedere schrijfactie (POST/PATCH/DELETE) een CSRF-token ophalen bij SAP met een GET-verzoek met de header X-CSRF-Token: Fetch, en de sessiecookies opslaan die SAP samen met het token terugstuurt.

  3. Het token terugsturen bij het daadwerkelijke schrijfverzoek via X-CSRF-Token, samen met een If-Match-header die de huidige @odata.etag van de entiteit bevat (SAP’s controle voor optimistische concurrency).

  4. Als een schrijfactie een 403 retourneert, het token één keer vernieuwen en opnieuw proberen — tokens kunnen tussen twee aanroepen verouderd raken.

  5. Een klein aantal MCP-tools beschikbaar maken die Claude kan aanroepen — bijvoorbeeld een generieke sap_odata_request (GET/POST/PATCH/DELETE voor elk pad) en een handige tool zoals cancel_warehouse_task.

Dit is echt het lastigste onderdeel van het hele bouwproces. We bespreken precies waar we tegenaan liepen in het onderdeel Lessons learned hieronder.

Stap 2 — De extensie beschrijven in manifest.json (hoe wij hem hebben gebouwd — niet vereist voor jou)

Het manifest vertelt Claude Desktop hoe de server moet worden uitgevoerd en welke configuratie aan de gebruiker moet worden gevraagd:

{
  "manifest_version": "0.3",
  "name": "sap-ewm-mcp",
  "display_name": "SAP EWM Connector",
  "version": "1.0.0",
  "description": "Lets Claude read and write to your SAP EWM OData v4 API.",
  "server": {
    "type": "node",
    "entry_point": "server/index.js",
    "mcp_config": {
      "command": "node",
      "args": ["${__dirname}/server/index.js"],
      "env": {
        "SAP_HOST": "${user_config.sap_host}",
        "SAP_USER": "${user_config.sap_user}",
        "SAP_PASSWORD": "${user_config.sap_password}",
        "SAP_SEND_AUTH": "${user_config.sap_send_auth}"
      }
    }
  },
  "tools": [
    {
      "name": "sap_odata_request",
      "description": "Raw OData v4 GET/POST/PATCH/DELETE against the SAP EWM API."
    },
    {
      "name": "cancel_warehouse_task",
      "description": "Cancel a specific WarehouseTask."
    }
  ],
  "user_config": {
    "sap_host": {
      "type": "string",
      "title": "SAP Host",
      "required": true
    },
    "sap_user": {
      "type": "string",
      "title": "SAP Username",
      "required": false
    },
    "sap_password": {
      "type": "string",
      "title": "SAP Password",
      "sensitive": true,
      "required": false
    },
    "sap_send_auth": {
      "type": "boolean",
      "title": "Send Basic Auth",
      "default": false
    }
  }
}

Het user_config-blok maakt dit herbruikbaar: iedereen die de extensie installeert, wordt gevraagd om zijn eigen SAP-host en inloggegevens — er is niets hard gecodeerd.

Stap 3 — Verpakken als Claude Desktop-extensie (hoe wij hem hebben gebouwd — niet vereist voor jou)

Met de MCP-packaging-CLI geïnstalleerd:

npm install -g @anthropic-ai/mcpb
cd sap-ewm-mcp
npm install
mcpb pack

Dit produceert één sap-ewm-mcp.mcpb-bestand — een draagbaar en deelbaar pakket met de servercode en de bijbehorende afhankelijkheden.

Dit is het bestand dat we aan het einde van dit artikel delen, dus tenzij je de connector zelf wilt aanpassen, kun je stap 1–3 volledig overslaan en het bestand daar rechtstreeks ophalen.

Stap 4 — Installeren in Claude Desktop

Hier begint het voor jou.

Download het sap-ewm-mcp.mcpb-bestand. Je krijgt toegang tot dit bestand door ons te mailen via thomas@4scm.nl Daarna volg je deze stappen:

  1. Open Claude Desktop → Settings → Extensions → Advanced settings → Extension Developer.

  2. Klik op Install Extension… en selecteer het .mcpb-bestand.

  3. Je wordt gevraagd om je eigen SAP-host, gebruikersnaam en wachtwoord — niets van onze configuratie is in het pakket ingebouwd.

  4. Start Claude Desktop opnieuw zodat de nieuwe tools worden geladen.

Na de installatie zijn er automatisch twee nieuwe tools beschikbaar voor Claude — je hoeft geen speciale syntaxis te gebruiken. Je praat er gewoon op de normale manier tegen.installeren claude SAP EWM

[Screenshot: Claude Desktop’s Extension Developer install dialog]

claude SAP EWM installeren

[Screenshot: the configuration prompt asking for SAP Host / Username / Password]

Stap 5 — Uitproberen

Zodra de connector is geïnstalleerd, kun je bijvoorbeeld gewoon vragen:

“Zoek een open magazijnorder in magazijn 4SCM.”

“Annuleer magazijntaak 100012969.”

“Laat me de openstaande uitgaande leveringen voor magazijn 4SCM zien.”

“Zoek magazijnorders die langer dan 24 uur openstaan en markeer ze.”

Claude bepaalt welke API-aanroepen nodig zijn, handelt authenticatie en tokens op de achtergrond af en rapporteert het resultaat in gewone taal.

taal Claude sap EWM connectie

[Screenshot: a full example conversation — request in, Claude’s tool call indicator, and the result]

Lessons learned: de moeilijke onderdelen

Als je iets soortgelijks bouwt, zijn dit de zaken die je daadwerkelijk het meeste tijd zullen kosten — dus het is de moeite waard om ze vooraf te kennen.

CSRF-tokens zijn verplicht voor OData v4, zonder uitzonderingen. In OData v2 kun je CSRF-controle voor een service soms uitschakelen. In v4 kan dat niet (SAP Note 2322624) — iedere schrijfactie heeft een nieuw opgehaald token nodig en de sessiecookies die daarbij horen.

“Geen authenticatie” betekent niet echt dat er geen sessie is. Als je SAP-systeem is geconfigureerd voor demo-/anonieme toegang, kan het mogelijk geen correct sessiegebonden CSRF-token uitgeven. Als je voortdurend CSRF-fouten krijgt terwijl authenticatie is uitgeschakeld, kan de oplossing simpelweg zijn om echte authenticatie weer in te schakelen voor de service.

Niet iedere schrijfactie die je verwacht, is toegestaan. Sommige entiteiten — magazijntaken bijvoorbeeld — hebben directe veldupdates op platformniveau volledig uitgeschakeld. Alleen de specifieke acties die SAP beschikbaar stelt (zoals annuleren en bevestigen) zijn toegestaan. Je kunt niet zomaar willekeurige velden van deze entiteiten aanpassen met PATCH, zelfs niet wanneer ze eruitzien alsof ze bewerkbaar zijn.

De connector delen

We publiceren de connector die we hebben gebouwd zodat anderen deze kunnen aanpassen aan hun eigen SAP-systemen. Hij bevat:

  • manifest.json — extensiedefinitie en configuratievragen

  • package.json — afhankelijkheden

  • server/index.js — de MCP-server zelf (CSRF-/ETag-afhandeling, generieke OData-requesttool en tool voor het annuleren van magazijntaken)

  • SETUP.md — installatie-instructies

[Download de sap-ewm-mcp-connector →] Om toegang te krijgen tot deze file, kun je een mail sturen naar thomas@4scm.nl

Een paar dingen om te weten als je hem opnieuw gebruikt:

  • Je moet hem naar je eigen SAP-host laten verwijzen en de servicepaden aanpassen als je met andere OData-services werkt dan de services die wij hebben gebruikt.

  • Inloggegevens worden per installatie via de configuratie-interface van Claude Desktop ingevoerd en lokaal opgeslagen — ze zijn nooit in het pakket zelf opgenomen.

Wat nu?

Dit is een eerste stap naar iets groters: bedrijfssystemen waarmee je daadwerkelijk kunt praten, in plaats van er alleen doorheen te klikken.

We blijven deze connector uitbreiden — met meer acties, betere foutafhandeling en ondersteuning voor meer SAP-warehousing-API’s — en zullen updates delen zodra we die hebben.

Zelf uitproberen?

We sturen je graag de file zodat je zelf aan de slag kan gaan. Om toegang te krijgen, neem je contact op via thomas@4scm.nl.

Als je dit op je eigen systeem uitprobeert, horen we graag hoe het gaat.