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: BTP 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 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