SAP B1 ServiceLayer MCP Server
SAP B1 ServiceLayer MCP Server
MCP-Server (Model Context Protocol) zur Verbindung von KI-Assistenten (opencode, Claude usw.) mit dem ServiceLayer von SAP Business One 10.0 im lokalen Netzwerk. Ausführbar mit npx aus diesem GitHub-Repository, ohne Installation auf dem PC.
Funktionen
Standardmäßig nur lesend: Mit
SAP_B1_READONLY=true(Standard) werden nur Abfrage-Tools (GET) registriert. Die Schreib-Tools (POST/PATCH/DELETE) existieren nicht auf dem Server und können nicht aufgerufen werden.Vollständige Erkennung:
sap_list_entities,sap_get_entity_schemaundsap_list_actionsfragenGET /$metadataab (einmal pro Prozess heruntergeladen und gecacht) und legen die ~140 CRUD-Entitäten (einschließlich Benutzertabellen@und UDOs) sowie die hunderte Service-Methoden des ServiceLayer offen.Optionaler Schreibmodus: Mit
SAP_B1_READONLY=falsewerdensap_create,sap_update,sap_deletefür ServiceLayer-Entitäten undsap_call_actionfür Service-Methoden aktiviert (können Nebenwirkungen haben).Ausführung über
npx github:: ohne manuelle Installation.Verwaltete Sitzung: impliziter Login mit
CompanyDB/Benutzer/Passwort, CookiesB1SESSION+ROUTEIDwerden im Speicher gehalten (unterstützt mehrknotigen ServiceLayer), automatischer Re-Login bei401und garantierter Logout beim Beenden des Prozesses (zusätzlich zum Toolsap_logout).Selbstsigniertes TLS: Unterstützung für selbstsignierte Zertifikate des ServiceLayer (typisch in lokalen Umgebungen) über
SAP_B1_VERIFY_TLS=false.Keine Telemetrie oder externe Aufrufe: Der HTTP-Client zeigt ausschließlich auf die konfigurierte URL (
SAP_B1_SERVER_URL).Sicherheitslimits:
topauf 200 Datensätze pro Abfrage begrenzt.
Related MCP server: BTP MCP Server
Tools
Lesen (immer verfügbar)
Tool | Beschreibung |
| Generisches GET auf beliebige OData-Entitäten mit |
| Listet alle vom ServiceLayer bereitgestellten OData-Entitäten (aus |
| Schema einer Entität: Eigenschaften (Typen/Schlüssel) und navigationProperties (gültig für |
| Listet die Service-Methoden (Function Imports, z. B. |
| Nur-Lese-SQL ( |
| Geschäftspartner (Kunden/Lieferanten), Filter nach |
| Katalogartikel |
| Verkaufsaufträge; in v1 sind die Positionen ( |
| Bestand eines Artikels nach |
| Status der aktiven Sitzung |
| Explizites Beenden der Sitzung |
Schreiben (nur wenn SAP_B1_READONLY=false)
Tool | Beschreibung |
| Erstellt einen Datensatz in einer Entität ( |
| Aktualisiert einen Datensatz über seinen Schlüssel ( |
| Löscht einen Datensatz über seinen Schlüssel ( |
| Ruft eine Service-Methode auf ( |
Voraussetzungen
Node.js 18+
SAP Business One 10.0 mit aktiviertem ServiceLayer (typischer Pfad
https://<host>:50000/b1s/v1)opencode (oder ein beliebiger MCP-Client)
Konfiguration (Umgebungsvariablen)
Variable | Erforderlich | Standard | Beschreibung |
| Ja | - | Basis-URL des ServiceLayer (z. B. |
| Ja | - | Name der CompanyDB (z. B. |
| Ja | - | ServiceLayer-Benutzer |
| Ja | - | Benutzerpasswort |
| Nein |
|
|
| Nein |
|
|
| Nein |
| Maximales |
Verwendung mit opencode
In der opencode.json des Projekts:
{
"mcp": {
"sap-b1-servicelayer": {
"type": "local",
"command": ["npx", "-y", "github:leonardows1/sap-b1-servicelayer-mcp"],
"environment": {
"SAP_B1_SERVER_URL": "https://<host>:50000/b1s/v1",
"SAP_B1_DATABASE": "<CompanyDB>",
"SAP_B1_USERNAME": "<usuario>",
"SAP_B1_PASSWORD": "<password>",
"SAP_B1_SESSION_TIMEOUT": "30",
"SAP_B1_VERIFY_TLS": "false",
"SAP_B1_READONLY": "true"
},
"enabled": true
}
}
}opencode nach dem Speichern der Konfiguration neu starten.
Sicherheit
Anmeldedaten und Sitzungs-Cookies werden nie protokolliert.
Der Prozess kommuniziert nur mit
SAP_B1_SERVER_URL.Im Modus
READONLY=truewerden die Schreib-Tools nicht registriert: Es ist unmöglich, Datensätze zu erstellen/aktualisieren/löschen — by design.Konfiguration wird beim Start validiert: Fehlen
SAP_B1_SERVER_URL,SAP_B1_DATABASE,SAP_B1_USERNAMEoderSAP_B1_PASSWORD→ der Prozess bricht mit klarer Meldung ab.Entitätsnamen werden validiert (
^[A-Za-z][A-Za-z0-9_]*$): Es können keine Pfade injiziert werden (z. B.BusinessPartners/...).Schlüsselwerte und Filter werden in OData escaped (einfache Anführungszeichen verdoppelt): Eine
idoder einItemCodemit'bricht weder die URL noch den$filter.Das Passwort liegt im Klartext in der MCP-Client-Konfiguration. Bei geteiltem Repository einen Secret Manager in Betracht ziehen.
npx github:hat kein Semver-Versioning: Jede Ausführung nimmt die neueste Version desmain-Branches. Nach einem Repo-Updatenpm cache clean --forceverwenden, um das Neuladen zu erzwingen.
Struktur
Pragmatische Hexagonalarchitektur (ESM, ohne Framework): Die Domäne und die
Anwendungsfälle kennen weder den MCP-Transport noch HTTP; die Infrastruktur
implementiert das Port ServiceLayerPort (DIP) und die MCP-Tools sind
dünne Controller.
sap-b1-servicelayer-mcp/
├── package.json # Definición del paquete npm (bin: server.js)
├── server.js # Composition root: cablea dependencias y arranca stdio
├── src/
│ ├── config/
│ │ └── config.js # Configuración desde env, validada e inmutable
│ ├── domain/
│ │ ├── errors.js # Excepciones tipadas (Configuration/InvalidArgument/ServiceLayer)
│ │ ├── oData.js # Helpers puros: query string, filtros, clamp de $top, validación de entidad
│ │ └── edmx.js # Parseo puro de $metadata: entity sets, esquemas, function imports
│ ├── application/
│ │ ├── ports.js # Puerto ServiceLayerPort (contrato, DIP)
│ │ ├── helpers.js # ensureOk / ensureSuccess / unwrapValue
│ │ └── services/
│ │ ├── queryService.js # Consulta GET genérica a entidades OData
│ │ ├── catalogService.js # Socios de negocio y artículos (compone QueryService)
│ │ ├── salesService.js # Pedidos de venta y stock
│ │ ├── sessionService.js # Estado y cierre de sesión
│ │ ├── writeService.js # create / update / delete
│ │ ├── metadataService.js # Descubrimiento: $metadata cacheado, entidades, esquemas y actions
│ │ └── sqlService.js # SQL de solo lectura (SELECT/WITH) vía POST /sql_query
│ └── infrastructure/
│ ├── http/
│ │ ├── httpClient.js # Cliente HTTP mínimo (http/https)
│ │ ├── cookies.js # Manipulación pura de cookies de sesión
│ │ └── serviceLayerClient.js # Adaptador del puerto: login, 401, logout
│ └── mcp/
│ ├── result.js # ok / err / serialize / handle (controladores delgados)
│ └── tools.js # Registro de tools MCP
├── test/ # node:test (sin dependencias externas)
│ ├── config.test.js
│ ├── oData.test.js
│ ├── edmx.test.js # parseo EDMX v3/v4 (entity sets, esquemas, function imports)
│ ├── cookies.test.js
│ ├── client.test.js
│ ├── fakePort.js # fake tipado del puerto ServiceLayerPort (compartido)
│ ├── services.test.js # casos de uso con cliente fake (anti-inyección)
│ ├── metadataService.test.js # descubrimiento y acciones con fake
│ ├── sqlService.test.js # SQL solo-lectura (rechazos, Service Not Found)
│ └── tools.test.js # integración MCP in-memory (registro y llamadas)
├── .gitignore
└── README.mdAnpassung an das reale Schema (verifiziert gegen ServiceLayer 10.0 v1)
Der Server passt sich dynamisch an das $metadata jeder Instanz an, ohne
etwas hartkodiert zu haben. Verifizierte Fakten in einer realen Instanz (v1, OData v3):
Entity-Sets teilen sich EntityType:
Orders/Invoices/DeliveryNotes→SAPB1.Document.sap_get_entity_schemalöst den tatsächlichen Typ automatisch auf.Belegpositionen: In v1 sind es Complex Collections (
DocumentLines,DocumentInstallments), die inline in der Antwort enthalten sind;$expandgilt nur für navigationProperties (das Schema listet sie, z. B.:BusinessPartner,Currency).Finanzfelder: In v1 hat
BusinessPartnerskeinBalance; verwendeCurrentAccountBalance,OpenOrdersBalance,OpenDeliveryNotesBalance. Rechnungen haben keinBalanceDue: Der offene Saldo istDocTotal − PaidToDate.Kein
ItemStockund kein/sql_queryin alten v1:sap_get_stockweist mit tatsächlich erkannten Bestandsentitäten darauf hin;sap_sql_querygibt eine klare Fehlermeldung zurück.Function Imports v3 mit
IsBindable="true"werden alsboundgelistet (nicht eigenständig aufrufbar), umsap_list_actionsnicht zu verunreinigen.
Rezept: Saldenaltersbericht (30/60/90)
Ohne SQL, nur mit sap_query (funktioniert in jedem v1/v2):
Offene Rechnungen (bei vielen mit
skipin Stapeln ≤200 paginieren):sap_query('Invoices', filter='PaidToDate lt DocTotal', select='CardCode,CardName,DocNum,DocDate,DocDueDate,DocTotal,PaidToDate,DocumentStatus,ControlAccount')Für jede Rechnung:
saldo = DocTotal − PaidToDate;Tage = heute − DocDueDate.Gruppieren nach Bereichen 0-30 / 31-60 / 61-90 / 90+ und nach Kunde (oder nach
ControlAccountfür die Sicht nach Sachkonto).Summen pro Kunde/Konto:
sap_get_business_partnersmitCurrentAccountBalance(aktueller Saldo) undCreditLimit.
Mit sap_sql_query (v2) ist derselbe Bericht eine einzige Abfrage über
OINV/OINV3/OFRJ/OCRD.
Entwicklung
npm install # dependencias
npm test # tests (node:test)
npm run typecheck # verificación de tipos estricta (tsc --noEmit sobre JSDoc)
npm start # arranque local (requiere variables de entorno)Der gesamte JS-Code ist mit striktem TypeScript über JSDoc verifiziert
(checkJs + strict + noUncheckedIndexedAccess): tsconfig.json ohne
Build-Schritt, der Server läuft direkt mit node.
Manuelle Verifikation (JSON-RPC über stdio)
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | \
SAP_B1_SERVER_URL=... SAP_B1_DATABASE=... SAP_B1_USERNAME=... SAP_B1_PASSWORD=... \
npx -y github:leonardows1/sap-b1-servicelayer-mcpThis server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables AI assistants to integrate with SAP systems via OData REST APIs for querying entity sets, performing CRUD operations, and executing function imports. It features automatic service discovery, CSRF token management, and smart connection handling without requiring the SAP RFC SDK.1112
- AlicenseAqualityCmaintenanceConnects AI agents to SAP BTP platform APIs for service discovery, instance management, and destination queries via natural language.51MIT
- FlicenseAqualityCmaintenanceEnables interaction with SAP S/4HANA systems via OData, allowing service discovery, metadata exploration, field value retrieval, and CRUD operations through natural language.45
- FlicenseNot gradedqualityDmaintenanceEnables interaction with SAP Business One via Service Layer REST API to retrieve and create business data such as partners, orders, invoices, items, and stock levels through natural language.1
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Odoo ERP for AI agents: hosted OAuth endpoint, gated writes, one endpoint for every instance.
Connect your AI assistants to Keboola and expose your data, transformations, SQL queries, ...
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/leonardows1/sap-b1-servicelayer-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server