SAP B1 ServiceLayer MCP Server
SAP B1 ServiceLayer MCP Server
Сервер MCP (Model Context Protocol) для подключения ИИ-ассистентов (opencode, Claude и т. д.) к ServiceLayer SAP Business One 10.0 в локальной сети. Запускается с помощью npx из этого репозитория GitHub, без установки чего-либо на ПК.
Характеристики
Только чтение по умолчанию: с
SAP_B1_READONLY=true(по умолчанию) регистрируются только инструменты запросов (GET). Инструменты записи (POST/PATCH/DELETE) не существуют на сервере и не могут быть вызваны.Полное обнаружение:
sap_list_entities,sap_get_entity_schemaиsap_list_actionsзапрашиваютGET /$metadata(скачивается один раз за процесс и кэшируется) и предоставляют ~140 сущностей CRUD (включая пользовательские таблицы@и UDO) и сотни сервисных методов ServiceLayer.Опциональный режим записи: с
SAP_B1_READONLY=falseвключаютсяsap_create,sap_update,sap_deleteдля сущностей ServiceLayer иsap_call_actionдля сервисных методов (могут иметь побочные эффекты).Запуск через
npx github:: без ручной установки.Управляемая сессия: неявный вход с
CompanyDB/пользователем/паролем, файлы cookieB1SESSION+ROUTEIDхранятся в памяти (поддержка многоузлового ServiceLayer), автоматический повторный вход при401и гарантированный выход при завершении процесса (плюс инструментsap_logout).Самоподписанный TLS: поддержка самоподписанных сертификатов ServiceLayer (типично для локальных сред) с помощью
SAP_B1_VERIFY_TLS=false.Без телеметрии и внешних вызовов: HTTP-клиент обращается исключительно к настроенному URL (
SAP_B1_SERVER_URL).Лимиты безопасности:
topограничен 200 записями на запрос.
Related MCP server: SAP Business One MCP Server
Инструменты
Чтение (всегда доступны)
Tool | Описание |
| Общий GET к любой сущности OData с |
| Список всех сущностей OData, предоставляемых ServiceLayer (из |
| Схема сущности: свойства (типы/ключи) и navigationProperties (действительны для |
| Список сервисных методов (function imports, напр.: |
| SQL только для чтения ( |
| Деловые партнеры (клиенты/поставщики), фильтр по |
| Товары каталога |
| Заказы на продажу; в v1 строки ( |
| Остатки товара по |
| Состояние активной сессии |
| Явное завершение сессии |
Запись (только если SAP_B1_READONLY=false)
Tool | Описание |
| Создает запись в сущности ( |
| Обновляет запись по её ключу ( |
| Удаляет запись по её ключу ( |
| Вызывает сервисный метод ( |
Требования
Node.js 18+
SAP Business One 10.0 с включенным ServiceLayer (типичный путь
https://<host>:50000/b1s/v1)opencode (или любой MCP-клиент)
Конфигурация (переменные окружения)
Variable | Требуется | По умолчанию | Описание |
| Да | - | Базовый URL ServiceLayer (напр.: |
| Да | - | Имя CompanyDB (напр.: |
| Да | - | Пользователь ServiceLayer |
| Да | - | Пароль пользователя |
| Нет |
|
|
| Нет |
|
|
| Нет |
| Максимальный лимит |
Использование с opencode
В opencode.json проекта:
{
"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 после сохранения конфигурации.
Безопасность
Учетные данные и cookie сессии никогда не записываются в логи.
Процесс связывается только с
SAP_B1_SERVER_URL.В режиме
READONLY=trueинструменты записи не регистрируются: создать/обновить/удалить записи невозможно по дизайну.Конфигурация проверяется при запуске: отсутствие
SAP_B1_SERVER_URL,SAP_B1_DATABASE,SAP_B1_USERNAMEилиSAP_B1_PASSWORD→ процесс прерывается с понятным сообщением.Имена сущностей проверяются (
^[A-Za-z][A-Za-z0-9_]*$): невозможно внедрить пути (напр.:BusinessPartners/...).Значения ключей и фильтры экранируются в OData (дублирование одинарных кавычек):
idилиItemCodeс'не ломает URL или$filter.Пароль хранится в открытом виде в конфигурации MCP-клиента. Рекомендуется использовать менеджер секретов, если репозиторий доступен другим.
npx github:не имеет semver-версионирования: каждый запуск берёт последнюю версию веткиmain. После обновления репозитория выполнитеnpm cache clean --force, чтобы принудительно перезагрузить.
Структура
Прагматичная гексагональная архитектура (ESM, без фреймворка): домен и
варианты использования не знают о транспорте MCP или HTTP; инфраструктура
реализует порт ServiceLayerPort (DIP), а инструменты MCP являются
тонкими контроллерами.
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.mdАдаптация к реальной схеме (проверено на ServiceLayer 10.0 v1)
Сервер динамически адаптируется к $metadata каждого экземпляра, ничего
не захардкожено. Проверенные факты на реальном экземпляре (v1, OData v3):
Entity sets разделяют EntityType:
Orders/Invoices/DeliveryNotes→SAPB1.Document.sap_get_entity_schemaавтоматически разрешает реальный тип.Строки документа: в v1 это complex collections (
DocumentLines,DocumentInstallments), которые приходят inline в ответе;$expandприменяется только к navigationProperties (схема их перечисляет, напр.:BusinessPartner,Currency).Финансовые поля: в v1
BusinessPartnersне имеетBalance; используйтеCurrentAccountBalance,OpenOrdersBalance,OpenDeliveryNotesBalance. В счетах нетBalanceDue: открытый баланс — этоDocTotal − PaidToDate.Нет
ItemStockи/sql_queryв старых v1:sap_get_stockуведомляет с реальными обнаруженными сущностями остатков;sap_sql_queryвозвращает понятную ошибку.Function imports v3 с
IsBindable="true"перечисляются какbound(не вызываемые отдельно), чтобы не загрязнятьsap_list_actions.
Рецепт: отчет по срокам давности остатков (30/60/90)
Без SQL, только с sap_query (работает на любых v1/v2):
Открытые счета (разбивайте с
skipпартиями ≤200, если их много):sap_query('Invoices', filter='PaidToDate lt DocTotal', select='CardCode,CardName,DocNum,DocDate,DocDueDate,DocTotal,PaidToDate,DocumentStatus,ControlAccount')Для каждого счета:
остаток = DocTotal − PaidToDate;дней = сегодня − DocDueDate.Сгруппируйте по диапазонам 0-30 / 31-60 / 61-90 / 90+ и по клиенту (или по
ControlAccountдля вида по бухгалтерскому счету).Итоги по клиенту/счету:
sap_get_business_partnersсCurrentAccountBalance(текущий остаток) иCreditLimit.
С помощью sap_sql_query (v2) этот же отчет выполняется одним запросом по
OINV/OINV3/OFRJ/OCRD.
Разработка
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)Весь код JS проверяется строгим TypeScript через JSDoc
(checkJs + strict + noUncheckedIndexedAccess): tsconfig.json без
шага сборки, сервер запускается напрямую с помощью node.
Ручная проверка (JSON-RPC через 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 deployed
Maintenance
Related MCP Connectors
Any REST/SOAP/GraphQL/OData/SQL API as MCP tools for Claude & ChatGPT. 299 connectors: SAP, ERP.
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Connect any AI assistant to Odoo 16–19 via OAuth 2.0 + PKCE. 400 free calls, no local install.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
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-
- 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-
- FlicenseNot gradedqualityCmaintenanceEnables interaction with SAP Business One Service Layer through MCP, providing tools for querying entities, checking sessions, and executing OData requests with optional write protection.-
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants and n8n workflows to interact with SAP S/4HANA and ECC systems via OData, IDoc, and RFC/BAPI, with governed read-only-by-default access and multiple authentication types.3ISC