MCP serverMCP servertypeExposes tools to a coding agent over MCP.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

BTP MCP Server

BTP Core Services as MCP tools, and the only server in this corner that renders dashboards inside the chat — a subaccount overview with drill-down, a geomap of data-centre locations, consumption and users.

Two things declared in one JSON config and no application code whatsoever. The API half exposes BTP Core Services so an assistant can work through your landscape in natural language. The interesting half is the ui section: five extra UI_* tools where the proxy fetches the listed data sources concurrently through the same OData clients — forwarding the caller's JWT — inlines shared CSS and JS into a named HTML template, bakes the payload in, and returns it as an mcp-ui embedded resource, with the MCP Apps adapter on so it renders in both kinds of host. An answer you can look at rather than read.

Facts

Last pushLicenceMIT

Where it sits

Lives in
Provides
Agent access to your systemsBTPAgent access to your systemscapabilityGiving an AI agent access to the business data, configuration or operations of systems you run through an MCP server. [Serving your application over MCP](capability:mcp-servers) exposes your own service contract; system access reaches the systems behind it, and one implementation may do both. Development assistance belongs to [agent access to your code](capability:agent-code-access).Account provisioningBTPAccount provisioningcapabilitySetting up cloud accounts, their organisational structure, resource entitlements, subscriptions and access assignments so the setup can be repeated from code. [Deployment](capability:deployment) puts an application onto a runtime that this account structure makes available.
Requires
odata-mcp-proxyodata-mcp-proxyartifactThe repository is a configuration, not a server: npm start runs the proxy binary against its JSON config, and there is no application code to run without it.

Who is behind it

Wouter LemaireWouter LemairePersonMaintains this
In the atlas: maintains 25, contributes to 39, wrote 12
@lemaiwo
maintainer

Before choosing this

Conditions

PracticalFunctional boundary

It administers a real account through Core Services, so what it can change is what the caller can change. And the UI half depends on hosts that render mcp-ui or MCP Apps resources; elsewhere those five tools return markup nobody displays.

PolicySAP API Policy 4.2026a§ 1.1, 1.2, 2.2.2from Agent access to your systemsAn MCP server uses SAP APIs to supply tools, resources or data to an agent.
  • § 1.1 Published APIs. Published APIs are made available for the documented purposes identified by SAP, including integration, extensions and data exchange.
  • § 1.2 Non-Published APIs. Customer and third-party applications must not access non-published APIs except where documentation permits it or SAP otherwise authorizes it.
  • § 2.2.2 AI call sequences and data extraction. Outside SAP-endorsed architectures, data services or expressly identified pathways, the policy prohibits specified agentic API use and systematic or large-scale extraction.

MCP does not replace the API's documented-use boundary. Check that every endpoint is published for the intended use and whether the policy's AI-call or extraction provisions apply to the design.

SAP API Policy 4.2026a →

What it declares

Every artifact

Type
MCP server
Origin
Independently maintained

Connections3

Where BTP MCP Server runsBy its type: an MCP server is called by an MCP clientcallsdocumentedrequiresYour MCP client, actorYour MCP clientBTP MCP Server, moduleBTP MCP Serverodata-mcp-proxy, moduleodata-mcp-proxy
SAPnot SAP's, or the project's ownstated in the documentdocumented only

README

quoted from lemaiwo/btp-mcp-server under MIT, read
lemaiwo/btp-mcp-server/README.mdOn GitHub

BTP MCP Server

An MCP (Model Context Protocol) server for SAP BTP administration, powered by odata-mcp-proxy. It exposes BTP Core Services APIs as MCP tools, allowing AI assistants like Claude to manage your BTP landscape through natural language — and ships interactive MCP-UI dashboards (subaccount overview with drill-down, a geomap of data-center locations, consumption and users/roles dashboards) rendered directly in the chat.

There is no application code in this project. Both the API tools and the interactive views are declared in a single JSON config file (btp-admin-api-config.json) alongside self-contained HTML templates in ui/. npm start runs the odata-mcp-proxy binary against that config.

How It Works

This project uses the odata-mcp-proxy npm package, which maps OData/REST services to MCP tools based on a configuration file. You provide a config describing your APIs and entity sets, and the proxy generates the corresponding MCP tools automatically.

The config's ui section declares five additional UI_* tools. For each one the proxy fetches the listed data sources concurrently through the same OData clients (forwarding the caller's JWT), inlines the shared CSS/JS partials into the named template, bakes the payload in, and returns it as an mcp-ui embedded resource — with the MCP Apps adapter enabled, so it renders on both MCP Apps hosts like Claude and classic mcp-ui hosts.

AI Assistant (Claude, Cursor, etc.)
        |
        | MCP Protocol (HTTP or stdio)
        v
  odata-mcp-proxy ──[apis]──> entity tools (Subaccounts_list, …)
        |         └─[ui]────> UI_* tools + ui:// templates (ui/*.html)
        |
        | REST + OAuth2 (via BTP Destination Service)
        v
  BTP Core Services / Usage Data Management / XSUAA APIs

The server stays declarative: it fetches and injects, but does no aggregation. Rolling raw API responses up into charts and tables is each template's job.

Think of it like the SAP Application Router -- a ready-made runtime you configure, not code you write.

Interactive UI Tools (MCP-UI)

Five tools return interactive HTML views instead of raw JSON. Each result contains a short text summary for the model plus a ui:// embedded resource the host renders in an iframe; buttons and table rows inside the views call the next view's tool and swap it into the frame, so you can navigate between views without going back through the model.

ToolWhat it showsNavigation
UI_SubaccountsOverviewStat tiles, subaccounts-per-region chart, searchable/sortable table of all subaccountsRow click → UI_SubaccountDetails; header buttons → the dashboards
UI_SubaccountDetailsOne subaccount: state, region/location, labels, and its entitled services & plans (quotas)Back to overview / map
UI_GeomapDashboardWorld map with data-center locations sized by subaccount count, plus table view and unmapped-region listCircle/row click → subaccounts at that location → details
UI_ConsumptionDashboardMonthly usage trends per service/plan/metric (small multiples), service adoption, and cost-per-month stacked by subaccount when cost data is availableWindow presets (3/6/12 months) re-run the tool
UI_UsersRolesDashboardUsers per identity provider, role collections by assigned users, searchable users / role-collections tables—

Notes:

  • All views are self-contained (no CDN dependencies), respect light/dark mode, include tooltips, and every chart has a table twin.
  • The same templates are also registered as ui://btp-mcp-server/* resources with tool metadata (ui/resourceUri) for MCP Apps hosts that pre-fetch templates; tool results carry the data as structuredContent as well.
  • ui/_shared.js talks to the host itself rather than relying on the adapter @mcp-ui/server injects: it probes with a ui/initialize handshake and, on MCP Apps hosts (Claude), sends tools/call and size updates as JSON-RPC — the adapter bridges those by patching parent.postMessage, which throws in the cross-origin sandboxed frame those hosts use, so every click was dropped. Hosts that stay silent get classic mcp-ui tool messages instead and render the next view themselves. Because a view's script can run again in a frame that already ran it, injected partials must not declare top-level const/let.
  • UI_ConsumptionDashboard needs the BTP_USAGE_SERVICE destination (Usage Data Management API); cost data additionally requires a consumption-based contract. Its reporting window is derived in the config via {$monthsAgo(months-1):yyyymm} / {$now:yyyymm}, so the months input (1–24, default 6) needs no server-side date code.
  • UI_UsersRolesDashboard uses the XSUAA SCIM and Authorization APIs via BTP_XSUAA_SERVICE. The SCIM collection is paged by the proxy (paginate: 100 per request, capped at 500); when the cap is hit the view says so rather than under-reporting.
  • Geo coordinates for the map come from a BTP region table (ui/_regions.js), injected into the templates as a partial; unknown regions are listed under the map instead of being dropped.

Tool surface (progressive discovery)

Registering every operation of every entity set as its own tool produced 40 tools and ~8,600 tokens of tools/list — around 4% of a 200k context window before the user has said anything, and past the point where models start picking worse tools.

The config enables the proxy's hybrid discovery mode instead:

"discovery": {
  "mode": "hybrid",
  "alwaysRegister": ["Subaccounts"],
  "maxResults": 25,
  "maxFullResults": 5
}
Toolstools/list
One tool per operation (previous)40~8,600 tokens
hybrid, Subaccounts pinned (current)12~2,610 tokens
search (nothing pinned)7~1,441 tokens

What stays directly visible: the five Subaccounts_* tools (the hot path for mutations), the five UI_* views (the entry points the model should prefer), and two meta-tools — search_operations to find the right api/entitySet/operation, and execute_operation to run it. Everything else is reachable through those two, plus one odata://{api}/{entitySet} schema resource per entity set for hosts that pre-fetch resources.

Remove the discovery block and every entity set goes back to having its own tools; nothing else in the config changes.

Exposed BTP APIs

The config file (btp-admin-api-config.json) defines three BTP Core Services and the XSUAA Authorization API:

Account Management
ToolOperationsDescription
GlobalAccountlistView global account details
Subaccountslist, get, create, update, deleteManage subaccounts
Directorieslist, get, create, update, deleteOrganize subaccounts into directories
Entitlements
ToolOperationsDescription
Assignmentslist, updateManage service plan entitlement assignments
AllowedDataCenterslistView available data centers
Provisioning
ToolOperationsDescription
EnvironmentInstanceslist, get, create, deleteManage runtime environments (e.g. Cloud Foundry orgs)
AvailableEnvironmentslistView environment types available for provisioning
Consumption (Usage Data Management)
ToolOperationsDescription
MonthlyUsagelistMonthly service usage per subaccount/service/plan/metric (?fromDate=YYYYMM&toDate=YYYYMM)
MonthlySubaccountsCostlistMonthly cost per subaccount for consumption-based licenses
Authorization (XSUAA)
ToolOperationsDescription
Userslist, getSubaccount users via the XSUAA SCIM API (SCIM query params, not OData)
Applicationslist, getView XSUAA application registrations
RoleCollectionslist, get, create, update, deleteManage role collections
Roleslist, get, create, deleteManage roles derived from role templates
RoleTemplateslist, getView role templates defined by applications

All _list tools support OData query parameters: $filter, $select, $expand, $orderby, $top, $skip.

Claude Code Skill

The repository ships a Claude Code skill at .claude/skills/btp-admin/SKILL.md that teaches Claude how to use these tools efficiently:

  • Tool selection -- maps common admin tasks ("entitle a service", "create a CF org") to the right tool on the first try
  • Token discipline -- always use $select, $filter, and $top so verbose BTP list responses stay small
  • Payload shapes -- documents request bodies the JSON schemas can't fully express (entitlement amount vs enable, environment instance parameters, role keys)
  • Workflows and pitfalls -- multi-step recipes (subaccount onboarding) and async-operation handling

Skills use progressive disclosure: only the name and description are loaded into context until a BTP admin task triggers the full skill, so the standing cost is a few dozen tokens. Anyone cloning this repository and using Claude Code gets it automatically; it also works when the repo is added as a project in claude.ai.

Prerequisites

  • Node.js 18+ (20+ recommended)
  • SAP BTP account with a Cloud Foundry environment
  • BTP Destinations configured for the CIS APIs (Accounts, Entitlements, Provisioning) with OAuth2 authentication
  • Cloud Foundry CLI (cf) and MBT Build Tool (mbt) for deployment

Project Structure

btp-mcp-server/
├── package.json                # Start script + the single odata-mcp-proxy dependency
├── btp-admin-api-config.json   # Everything: `apis` (entity tools) + `ui` (view tools)
├── ui/                         # Self-contained HTML view templates
│   ├── subaccounts-overview.html
│   ├── subaccount-details.html
│   ├── dashboard-geomap.html
│   ├── dashboard-consumption.html
│   ├── dashboard-users-roles.html
│   ├── _shared.css / _shared.js#   chart chrome, palette, helpers (injected as partials)
│   ├── _regions.js             #   BTP region → city/coordinates table (injected)
│   └── _world-path.txt         #   world outline (Natural Earth 110m, public domain)
├── .claude/skills/btp-admin/   # Claude Code skill: tool selection + token-usage guidance
├── mta.yaml                    # BTP Cloud Foundry deployment descriptor
├── xs-security.json            # XSUAA OAuth2 configuration
├── default-env.json            # Local dev credentials (gitignored)
└── LICENSE

Getting Started

1. Install dependencies
npm install
2. Configure BTP destinations

Create BTP Destinations pointing to the CIS, Usage Data Management and XSUAA APIs:

DestinationURLUsed by
BTP_ACCOUNTS_SERVICEhttps://accounts-service.cfapps.<region>.hana.ondemand.comAccount tools, all UI views
BTP_ENTITLEMENTS_SERVICEhttps://entitlements-service.cfapps.<region>.hana.ondemand.comEntitlement tools, subaccount details UI
BTP_PROVISIONING_SERVICEhttps://provisioning-service.cfapps.<region>.hana.ondemand.comEnvironment tools
BTP_USAGE_SERVICEhttps://uas-reporting.cfapps.<region>.hana.ondemand.comConsumption tools + dashboard
BTP_XSUAA_SERVICEhttps://<subdomain>.authentication.<region>.hana.ondemand.comAuthorization tools, users & roles dashboard (XSUAA apiaccess service key)

Each destination should use OAuth2 client credentials authentication.

3. Local development

Create a default-env.json with your BTP service bindings (XSUAA, Destination, Connectivity) to run locally:

npm start

This runs odata-mcp-proxy --config btp-admin-api-config.json, which registers the entity tools from the config's apis section and the interactive views from its ui section.

4. Deploy to BTP
npm run build:btp     # Build MTA archive
npm run deploy:btp    # Deploy to Cloud Foundry

The MTA deployment provisions three service instances:

  • Destination (lite) -- resolves API endpoints and manages OAuth2 tokens
  • Connectivity (lite) -- enables secure backend connectivity
  • XSUAA (application) -- handles OAuth2 authentication with role-based access control

Security

The XSUAA configuration (xs-security.json) defines three role templates:

RoleScopesDescription
MCPViewerreadRead-only access
MCPEditorread, writeRead and write access
MCPAdminread, write, adminFull administrative access

OAuth2 redirect URIs are pre-configured for Claude.ai, Cursor, Microsoft Teams, and local development.

Creating Your Own MCP Server

This project demonstrates how easy it is to create a custom MCP server using odata-mcp-proxy. To build your own:

  1. Create a new project and install the dependency:

    mkdir my-mcp-server && cd my-mcp-server
    npm init -y
    npm install odata-mcp-proxy
  2. Add a start script to package.json:

    {
      "scripts": {
        "start": "odata-mcp-proxy --config my-api-config.json"
      }
    }
  3. Define your APIs in a config file (my-api-config.json):

    {
      "server": {
        "name": "my-mcp-server",
        "version": "1.0.0",
        "description": "My custom MCP server"
      },
      "apis": [
        {
          "name": "my-api",
          "destination": "MY_BTP_DESTINATION",
          "pathPrefix": "/api/v1",
          "csrfProtected": true,
          "entitySets": [
            {
              "entitySet": "Products",
              "description": "Product catalog",
              "category": "master-data",
              "keys": [{ "name": "Id", "type": "string" }],
              "operations": { "list": true, "get": true, "create": false, "update": false, "delete": false }
            }
          ]
        }
      ]
    }
  4. Add your mta.yaml, xs-security.json, and BTP Destinations, then deploy. That's it -- no code to write.

License

MIT

MIT, read

Others providing43

Agent access to your systems
  1. mcp-integration-suiteMCP server for the general Integration Suite functionsfrom BTP/BAIP
  2. mcp-is-tpmJava MCP server for Integration Suite Trading Partner Managementfrom BTP/BAIP
  3. @abap2ui5/mcp-serverMCP server for the abap2UI5 check, deploy and run loopfrom ABAP
  4. abap2UI5 for VS CodeVS Code extension to preview, activate and lint abap2UI5 appsfrom ABAP
  5. SF-MCPMCP server with 62 tools over SAP SuccessFactors OData APIsfrom SAP SuccessFactors
  6. hybris-mcp-liteRead-only MCP server over a local SAP Commerce Cloud's HACfrom SAP Commerce
  7. calmcpMCP server with read tools over the SAP Cloud ALM APIsfrom BTP/BAIP
  8. CostingGeek/sap-mcpPython MCP server fetching sales orders from SAP's business data graphfrom BTP/BAIP
  9. mcp-sap-focusedrunMCP tools over SAP Focused Run's Landscape Management Databasefrom BTP/BAIP
  10. abapsmithABAP MCP server over ADT with a local journal that can undo writesfrom ABAP
  11. cloud-alm-itsm-mcpMCP server querying installations via the SAP Cloud ALM ITSM APIfrom BTP/BAIP
  12. hana-mcp-serverMCP server for schema discovery and guarded SQL on SAP HANAfrom BTP/BAIP
  13. sap_analytics_cloud_mcpMCP server for the SAP Analytics Cloud REST APIfrom BTP/BAIP
  14. mcp-sap-cpiMCP server for Cloud Integration runtime: messages, logs, deploymentfrom BTP/BAIP
  15. AI Core MCP ServerSAP AI Core APIs as MCP tools from one JSON config filefrom BTP/BAIP
  16. BTP CF MCP ServerCloud Foundry V3 API on SAP BTP as MCP toolsfrom BTP/BAIP
  17. btp-sap-odata-to-mcp-serverExposes S/4HANA or ECC OData services as MCP toolsfrom BTP/BAIP
  18. CI MCP ServerSAP Cloud Integration OData APIs as MCP toolsfrom BTP/BAIP
  19. odata-mcp-proxyConfig-driven proxy turning OData and REST endpoints into MCP toolsfrom BTP/BAIP
  20. sap-pi-mcp-serverMCP server for SAP PI and PO monitoring and directory metadatafrom BTP/BAIP
  21. sap-bdc-mcp-serverMCP server managing Delta shares in SAP Business Data Cloudfrom BTP/BAIP
  22. @mariodefe/sap-datasphere-mcpMCP server with forty-five tools across a Datasphere tenantfrom BTP/BAIP
  23. midasol/sap-mcp-serverPython MCP server for SAP Gateway OData operationsfrom BTP/BAIP
  24. odata_mcp_goGo binary bridging any OData v2 or v4 service to MCPfrom BTP/BAIP
  25. odata_mcpPython bridge generating MCP tools from OData v2 metadatafrom BTP/BAIP
  26. sap-bdc-mcpMCP tooling for SAP Business Data Cloud discovery and contractsfrom BTP/BAIP
  27. mcp-sap-datasphere-serverRead-only MCP server for exploring SAP Dataspherefrom BTP/BAIP
  28. sap-mcp-serverReads SAP ECC and S/4HANA for an agent over Gateway OData and RFC, with a Node bridge that speaks the RFC protocol without the proprietary SAP NetWeaver RFC SDK.from ABAP
  29. cap-mcp-bridgeMCP server generating tools from a CAP or OData V4 service's metadatafrom CAP
  30. MCP Server for SAP BTP AdministrationSAP-hosted MCP endpoint for BTP account administrationfrom BTP/BAIP
  31. SAP LeanIX MCP ServerHosted MCP endpoint onto an SAP LeanIX instancefrom BTP/BAIP
  32. SAP-samples/hana-cli-claude-pluginClaude Code plugin registering hana-cli's MCP serverfrom BTP/BAIP
  33. SAP-samples/hana-developer-cli-tool-exampleDeveloper-centric command line for SAP HANAfrom BTP/BAIP
  34. Skybuffer AI MCP serverABAP add-on serving business data and transactions as MCP toolsfrom ABAP
  35. sap-security-mcpRead-only security analysis MCP server for SAP audits and SoD reviewfrom ABAP
  36. cpi-mcp-serverGo MCP server over Cloud Integration packages and integration flowsfrom BTP/BAIP
  37. KlystronMCP server in ABAP inside the application server, with agent skillsfrom ABAP
  38. pyrfc-mcpMCP server calling RFC-enabled function modules behind an allowlistfrom ABAP
Account provisioning
  1. SAP Cloud Management Service for SAP BTPREST APIs for administering a BTP accountfrom BTP/BAIP
  2. SAP Service ManagerRegistry for service brokers, instances and environments on SAP BTPfrom BTP/BAIP
  3. auth-transportUI5 app and CAP service copying role collections between subaccountsfrom BTP/BAIP
  4. MCP Server for SAP BTP AdministrationSAP-hosted MCP endpoint for BTP account administrationfrom BTP/BAIP
  5. btp-setup-automatorContainerised script setting up an SAP BTP account from JSON configfrom BTP/BAIP
  6. Terraform Provider for SAP BTPTerraform and OpenTofu provider for SAP BTP global accountsfrom BTP/BAIP

Details

Sources3
sap-ai-mcp-serversdiscovered herechecked
github.com/lemaiwo/btp-mcp-servertree, pushes, contributors, CIchecked
README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
discovered viasap-ai-mcp-servers
first seen in the atlas
ecosystem and domainbtp, ai-and-agents
History in the atlas5
  1. The tag came in with the entry on 2026-09-10 and nothing sourced it: the README names BTP Core Services and the proxy it runs on, never CAP. It read as a routing leftover from when the MCP servers capability lived on the CAP door; the entry stays on BTP, its home.
  2. The concern it answers is reaching into an SAP system from outside, split out of MCP servers on this day; the sentence on the edge is unchanged.
  3. The README lists create, update and delete on subaccounts and directories and entitlement assignment; the only edge was to the MCP-server capability, so the account-provisioning page did not list it.
  4. Triaged out of data/crawled/mcp-candidates.json, the sap-ai-mcp-servers sweep. Written from the repository's own README; the catalogue is credited as where it was found and its words are not reused.
  5. First seen.
For your agent
Ref
artifact:lemaiwo-btp-mcp-server
JSON
/artifacts/lemaiwo-btp-mcp-server.json
MCP
Connecting an agent