Skip to main content
Glama
ilia-inovaflow

S/4HANA MCP Server

S/4HANA MCP Server

Сервер MCP, предоставляющий 38 инструментов для SAP S/4HANA (Cloud Public Edition и on-premise Private Edition) через OData V2, OData V4 и SOAP: бизнес-партнеры, продукты, ценообразование продаж, склады, заказы на закупку, информационные записи закупок, счета поставщиков (включая проводку и отмену), листы ввода услуг, журнальные записи, центры затрат и организационная структура финансов.

Инструменты записи (create_*, cancel_supplier_invoice, check_invoice_posting_readiness) и get_finance_structure возвращают свой результат встроенно в виде JSON. Каждый другой (читающий) инструмент записывает свой результат — CSV для коллекций, Markdown для отдельных записей — в песочницу E2B и возвращает путь(и) к файлу(ам), вместо того чтобы встраивать потенциально большие наборы результатов SAP (сотни бизнес-партнеров, полные детали элементов журнальных записей и т.д.) непосредственно в контекст вызывающего агента. Этот сервер подключается только к песочнице E2B, которая уже принадлежит вашему MCP-клиенту — он никогда не создает новую. Вашему клиенту нужна собственная интеграция E2B (SDK E2B или среда Claude с соответствующим доступом к выполнению кода), чтобы прочитать файлы обратно; см. Настройка песочницы E2B.

Быстрый старт

git clone https://github.com/ilia-inovaflow/s4hana-mcp-server.git
cd s4hana-mcp-server
npm install
npm run build
cp .env.example .env   # fill in your E2B sandbox + SAP connection details
npm start               # stdio transport (Claude Desktop, MCP Inspector, etc.)

Для локальной разработки без предварительной сборки: npm run dev.

Related MCP server: SAP OData MCP Server

Настройка песочницы E2B

Зарегистрируйтесь для получения бесплатного API-ключа на e2b.dev, затем запустите (или повторно используйте) песочницу, из которой ваш MCP-клиент может читать файлы, и установите:

E2B_API_KEY=<your E2B API key>
SANDBOX_ID=<an already-running sandbox ID>   # stdio only — HTTP takes this per-session

При использовании HTTP-транспорта SANDBOX_ID вместо этого передается для каждой сессии через заголовок запроса sandbox-id — это полезно, когда один работающий экземпляр сервера обслуживает несколько вызывающих, у каждого из которых своя песочница.

Это не связано с собственным пробным хостом SAP sandbox.api.sap.com ниже — «sandbox» в этом README означает две разные вещи.

Попробуйте без собственного тенанта SAP

SAP публикует бесплатную публичную песочницу API только для чтения на sandbox.api.sap.com, с которой этот сервер взаимодействует из коробки. Зарегистрируйтесь для получения бесплатного API-ключа на api.sap.com, затем установите:

SAP_HOST=https://sandbox.api.sap.com
SAP_CLIENT_ID=<your sandbox API key>

Не требуется имя пользователя, пароль или настройка OAuth — песочница аутентифицируется с помощью одного заголовка APIKey. Инструменты бизнес-партнеров, продуктов и ценообразования сразу работают с демонстрационными данными песочницы (вам все еще нужна песочница E2B выше, чтобы получать результаты инструментов чтения).

Подключение реального тенанта SAP

Установите SAP_HOST на URL вашего тенанта и выберите один из трех режимов аутентификации через SAP_AUTH_MODE:

Режим

Сценарий использования

Требуемые переменные

basic

Быстрое тестирование, локальные системы без настроенного OAuth

SAP_USERNAME, SAP_PASSWORD

cc

S/4HANA Cloud Public Edition, межсервисное взаимодействие (OAuth 2.0 Client Credentials)

SAP_TOKEN_URL, SAP_CLIENT_ID, SAP_CLIENT_SECRET

oauth

Делегированный пользователем OAuth Authorization Code — только HTTP-транспорт, вызывающий предоставляет свежий токен для каждого запроса через заголовок sap-access-token

нет (токен поступает от MCP-клиента)

SAP_CLIENT (номер клиента/манданта SAP, например 100) по умолчанию равен 100, если не задан.

Два семейства API по замыслу SAP требуют базовой или X.509-аутентификации и отклоняют OAuth: проводка журнальных записей (create_journal_entry, SOAP SAP_COM_0002) и детальные представления бухгалтерских документов (get_journal_entry, search_journal_entries с document_level=true). Все остальное работает в любом из трех режимов.

См. .env.example для полного списка переменных, включая необязательное переопределение SAP_JE_SOAP_PATH, которое требуется некоторым локальным конфигурациям SOAMANAGER.

Транспорты

stdio (по умолчанию, npm start / npm run dev) — одно подключение SAP и одна песочница E2B на процесс, полностью настраивается из .env. Именно это ожидают Claude Desktop и большинство локальных MCP-клиентов:

{
  "mcpServers": {
    "s4hana": {
      "command": "node",
      "args": ["/absolute/path/to/s4hana-mcp-server/dist/index.js"],
      "env": {
        "E2B_API_KEY": "...", "SANDBOX_ID": "...",
        "SAP_HOST": "...", "SAP_AUTH_MODE": "basic", "SAP_USERNAME": "...", "SAP_PASSWORD": "..."
      }
    }
  }
}

Streamable HTTP (npm run start:http / npm run dev:http) — для удаленного или мультитенантного развертывания. Подключение SAP для каждой сессии настраивается либо из значений по умолчанию .env, либо из заголовков запроса (sap-host, sap-auth-mode, sap-username, sap-password, sap-token-url, sap-client-id, sap-client-secret, sap-client, sap-je-soap-path), а песочница E2B — из заголовка sandbox-id (или переменной окружения SANDBOX_ID как запасного варианта) — что позволяет одному работающему серверу обрабатывать запросы к разным тенантам и песочницам. E2B_API_KEY всегда читается из собственного окружения сервера. PORT (по умолчанию 3000) и HOST (по умолчанию localhost) настраивают прослушиватель; конечная точка MCP — POST /mcp, а GET /health — для проверки работоспособности.

Если вы развертываете HTTP-транспорт в месте, доступном по сети, поместите его за собственную аутентификацию/сетевую границу — этот сервер сам не ограничивает доступ к конечной точке /mcp, только к нижестоящему подключению SAP.

Инструменты

  • search_business_partners — поиск клиентов, поставщиков, физических лиц, организаций

  • get_business_partner — полная информация об одном бизнес-партнере

  • query_business_partner_odata — универсальный запрос к любому набору сущностей API_BUSINESS_PARTNER

  • search_products — поиск материалов, готовой продукции, услуг, сырья

  • get_product — полная информация об одном продукте

  • query_product_odata — универсальный запрос к любому набору сущностей API_PRODUCT_SRV

  • get_product_pricing — комбинированный поиск цены для материала (начните здесь, чтобы узнать «сколько стоит X»)

  • search_pricing_conditions — просмотр записей условий по типу/ставке

  • get_pricing_condition — полная информация об одной записи условия

  • query_pricing_odata — универсальный запрос к любому набору сущностей ценообразования

  • list_warehouses

  • get_warehouse

  • search_purchase_orders — поиск заказов на закупку

  • get_purchase_order — полная информация о заказе на закупку

  • query_purchase_order_odata — универсальный запрос, включая уровень позиций/графика поставки

  • get_purchase_order_confirmations — подтверждения поставщика/отгрузки/поступления товара, массовый поиск

  • search_purchasing_info_records — поиск информационных записей закупок

  • get_purchasing_info_record — полная информация об информационной записи закупки

  • query_purchasing_info_record_odata — универсальный запрос

  • search_supplier_invoices — поиск счетов поставщиков

  • get_supplier_invoice — полная информация о счете поставщика

  • query_supplier_invoice_odata — универсальный запрос

  • create_supplier_invoice_po ⚠️ запись — счет со ссылкой на заказ на закупку, сверка по 3 позициям

  • create_supplier_invoice_gl ⚠️ запись — счет на расходы без заказа на закупку, прямые строки G/L

  • create_supplier_credit_memo ⚠️ запись — кредит-нота со ссылкой на заказ на закупку

  • cancel_supplier_invoice ⚠️ запись — отменяет проведенный счет или кредит-ноту

  • check_invoice_posting_readiness — предварительная проверка готовности к проводке (только чтение)

  • search_service_entry_sheets — поиск листов ввода услуг

  • get_service_entry_sheet — полная информация о листе ввода услуг

  • query_service_entry_sheet_odata — универсальный запрос

  • create_journal_entry ⚠️ запись — проводит документ G/L (SOAP, только базовая/X.509 аутентификация)

  • search_journal_entries — аналитическое (агрегированное) или бухгалтерское (построчное) представление

  • get_journal_entry — один бухгалтерский документ по номеру

  • search_gl_accounts — поиск счетов G/L

  • search_open_po_items — позиции заказа на закупку поставщика, которые все еще можно выставить счет, одним вызовом

  • search_cost_centers — поиск центров затрат

  • get_cost_center_hierarchy — стандартное дерево иерархии центров затрат

  • get_finance_structure — коды компаний, бухгалтерские книги, планы счетов, сегменты, сферы деятельности

Каждый инструмент записи выполняет серверные проверки защиты (существование, блокирующие флаги, обнаружение дубликатов, проверка баланса) перед проводкой и сообщает структурированный список причин — без отправки чего-либо в SAP — если какая-либо проверка не пройдена. Детерминированные отклонения SAP (закрытые периоды проводки, отсутствующая налоговая юрисдикция и т.д.) преобразуются в практические сообщения, а не в сырые коды ошибок.

Архитектура

src/
├── server.ts       # McpServer factory — tool registration, schemas, annotations
├── client.ts        # SapClient — OData V2/V4 requests, CSRF-protected writes, SOAP posts
├── auth.ts           # Auth strategies: Basic, OAuth Client Credentials, OAuth Authorization Code
├── config.ts          # Connection config + SAP public sandbox detection
├── index.ts             # stdio entry point
├── http.ts               # Streamable HTTP entry point (Express, per-session auth)
└── tools/
    ├── shared.ts          # OData/CSV/error-parsing + E2B sandbox file I/O, shared by every tool
    └── *.ts                # one file per tool (schema + handler)

Записи в конечные точки OData V2 следуют протоколу CSRF-токенов SAP: получите токен через GET с заголовком X-CSRF-Token: Fetch, отправьте его повторно с cookie сессии в POST, повторите один раз при 403. Проводка журнальных записей вместо этого формирует и отправляет сырой SOAP-конверт, поскольку у этого API нет эквивалента OData.

Разработка

npm run dev        # stdio, hot reload via tsx
npm run dev:http    # HTTP, hot reload via tsx
npm run typecheck    # tsc --noEmit
npm run build          # compile to dist/

Лицензия

MIT

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
3Releases (12mo)
Commit activity

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

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables interaction with SAP ABAP systems through ABAP Development Tools (ADT), providing access to repository objects, source code, where-used analysis, and SQL queries with support for both on-premise and BTP systems.
    2
  • F
    license
    A
    quality
    D
    maintenance
    Enables 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.
    11
    12
  • F
    license
    A
    quality
    C
    maintenance
    Enables interaction with SAP S/4HANA systems via OData, allowing service discovery, metadata exploration, field value retrieval, and CRUD operations through natural language.
    4
    5

View all related MCP servers

Related MCP Connectors

  • Search, document and execute authenticated API calls across 700+ apps via one MCP server

  • 34 production API tools over one hosted MCP endpoint.

  • Run SOQL queries to explore and retrieve Salesforce data. Access accounts, contacts, opportunities…

View all MCP Connectors

Latest Blog Posts

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/ilia-inovaflow/s4hana-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server