Btp Mcp Server

io.github.ABRANJAN07Published by GitHub account ABRANJAN07v1.0.0Updated Oct 24, 2026

Discover SAP BTP services, browse service catalog, check running instances, query dests, & more

VerifiedSTDIODesktop onlyCloud & InfrastructureDeveloper Tools

Overview

AI-generated overview

A local MCP server that connects an AI assistant to SAP BTP APIs so it can browse the service catalog, check running instances, and inspect destinations.

What you can do
Browse the global BTP service catalog and the plans each service offers, including free plans, and get a service recommendation for a described use case, such as async messaging in a CAP app or connecting to an on-premise SAP system. List the service instances running in a subaccount and check whether they are healthy. Read the destinations configured in the subaccount and the authentication they use. Responses are cached for five minutes by default, and list endpoints fetch every page rather than only the first results.
When to use it
Useful for SAP BTP developers who want to ask an assistant about their landscape instead of switching to BTP Cockpit: which services and plans exist, what is already running and healthy, which destinations are configured, and which service fits a given use case.
Requirements
Runs locally as a Python package installed with pip. Needs a Service Manager service key from the BTP subaccount, supplied through environment variables: BTP_CLIENT_ID, BTP_CLIENT_SECRET, BTP_TOKEN_URL, BTP_SM_URL, BTP_SUBACCOUNT_ID and BTP_DESTINATION_URL. Network access to the BTP APIs is required; CACHE_TTL_SECONDS is optional.
Before you install
The server holds BTP OAuth client credentials (BTP_CLIENT_ID and BTP_CLIENT_SECRET) and uses them to call Service Manager and Destination APIs on your behalf. Keep the .env file out of version control. The listed tools read catalog, instance and destination data; destination details can reveal how external systems are authenticated. The entitlements tool is disabled and would need a separate Cloud Management Service key.

Installation

In SourceWeft

  1. Open Btp Mcp Server in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

SAP BTP Services Discovery — MCP Server

A production-ready MCP (Model Context Protocol) server that exposes SAP BTP platform APIs as tools for any MCP-compatible AI agent — Claude Code, Cursor, Joule Studio, LangGraph agents, or any other MCP client.

[image]

Connect any AI agent to your SAP BTP landscape via the Model Context Protocol.

[PyPI version] [Python] [MCP] [License: MIT]


What is this?

The BTP MCP Server is an open-source Model Context Protocol server that connects AI agents to the SAP Business Technology Platform (BTP) APIs.

Instead of switching to BTP Cockpit to answer common developer questions, you can ask your AI agent directly:

  • "What BTP services are available in my account?"
  • "Is HANA Cloud already running in my subaccount?"
  • "I need async messaging in my CAP app — what should I use?"
  • "What destinations are configured and what authentication do they use?"

Works with Claude Code, Cursor, Joule Studio, LangGraph agents, and any other MCP-compatible AI client.


Tools

ToolWhat it answers
list_btp_servicesWhat BTP services exist in the global catalog?
get_btp_service_plansWhat plans does service X have? Are any free?
list_btp_instancesWhat is running in my subaccount? Is it healthy?
get_btp_destinationsWhat external connections are configured?
recommend_btp_serviceGiven a use case, what service should I use?

Installation

bash
pip install btp-mcp-server

Prerequisites

You need a Service Manager service key from your BTP subaccount.

Steps to get one:

  1. Go to BTP Cockpit → your subaccount → Services → Service Marketplace
  2. Search for Service Manager → Create instance with plan subaccount-admin
  3. Create a Service Key on the instance
  4. The key JSON contains your credentials — see Configuration below

Configuration

All configuration is via environment variables. Copy .env.example to .env and fill in the values from your Service Manager service key:

bash
# From your Service Manager service key JSONBTP_CLIENT_ID=your-client-id          # from "clientid"BTP_CLIENT_SECRET=your-client-secret  # from "clientsecret"BTP_TOKEN_URL=https://your-subdomain.authentication.us10.hana.ondemand.com/oauth/tokenBTP_SM_URL=https://service-manager.cfapps.us10.hana.ondemand.com  # from "sm_url"
# From BTP Cockpit → your subaccount → Overview → "Subaccount ID"BTP_SUBACCOUNT_ID=your-subaccount-guid
# Destination Service URL (region-specific — adjust region if needed)BTP_DESTINATION_URL=https://destination.cfapps.us10.hana.ondemand.com
# Optional: cache TTL in seconds (default: 300)# CACHE_TTL_SECONDS=300

Note: Never commit your .env file to GitHub. Use .env.example (with no real values) as a reference template.


Usage

With Claude Desktop

Add to your claude_desktop_config.json:

Mac: ~/.claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

json
{  "mcpServers": {    "sap-btp": {      "command": "btp-mcp-server",      "env": {        "BTP_CLIENT_ID": "your-client-id",        "BTP_CLIENT_SECRET": "your-client-secret",        "BTP_TOKEN_URL": "https://your-subdomain.authentication.us10.hana.ondemand.com/oauth/token",        "BTP_SM_URL": "https://service-manager.cfapps.us10.hana.ondemand.com",        "BTP_SUBACCOUNT_ID": "your-subaccount-guid",        "BTP_DESTINATION_URL": "https://destination.cfapps.us10.hana.ondemand.com"      }    }  }}

Restart Claude Desktop. Then ask:

  • "What BTP services do I have available?"
  • "Are there any failed service instances?"
  • "I need to connect to an on-premise SAP system — what BTP service handles that?"

With Claude Code / Cursor

json
{  "mcpServers": {    "sap-btp": {      "command": "btp-mcp-server",      "env": {        "BTP_CLIENT_ID": "...",        "BTP_CLIENT_SECRET": "...",        "BTP_TOKEN_URL": "...",        "BTP_SM_URL": "...",        "BTP_SUBACCOUNT_ID": "..."      }    }  }}

With a LangGraph agent

python
from langchain_mcp_adapters.client import MultiServerMCPClientfrom langgraph.prebuilt import create_react_agentfrom langchain_anthropic import ChatAnthropic
async with MultiServerMCPClient({    "btp": {        "command": "btp-mcp-server",        "transport": "stdio",        "env": {            "BTP_CLIENT_ID": "...",            "BTP_CLIENT_SECRET": "...",            "BTP_TOKEN_URL": "...",            "BTP_SM_URL": "...",            "BTP_SUBACCOUNT_ID": "...",        }    }}) as client:    tools = client.get_tools()    agent = create_react_agent(        ChatAnthropic(model="claude-sonnet-4-6"),        tools    )    result = await agent.ainvoke({        "messages": [{"role": "user", "content":            "What BTP services do I have? Is there anything I should use for messaging?"        }]    })

With Joule Studio (BTP)

Deploy in HTTP mode and register as a BTP Destination:

bash
MCP_TRANSPORT=http btp-mcp-server# Server starts at http://0.0.0.0:8080/mcp

Then in BTP Cockpit → Destinations → create a destination pointing to your server URL. In Joule Studio Agent Builder → Tools → Add MCP Server → select the destination.


Running locally from source

bash
git clone https://github.com/ABRANJAN07/btp-mcp-server.gitcd btp-mcp-server
pip install -r requirements.txtcp .env.example .env# fill in .env with your BTP credentials
# Test BTP connectivitypython test_connection.py
# Start the MCP serverpython server.py

Running tests

Tests use mocked BTP responses — no real credentials needed.

bash
pip install -r requirements.txtpytest tests/ -v

Expected output: 17 tests passed


Project structure

btp-mcp-server/├── server.py              ← MCP server entry point (5 tools)├── test_connection.py     ← Verify BTP connectivity├── requirements.txt├── .env.example           ← Configuration template├── btp_mcp/│   ├── config.py          ← Reads .env settings│   ├── auth.py            ← OAuth2 token management│   ├── btp_client.py      ← BTP API calls + caching│   ├── cache.py           ← TTL cache│   └── models.py          ← Pydantic response models└── tests/    └── test_tools.py      ← 17 tests with mocked responses

How it works

AI Agent (Claude / Cursor / LangGraph)    │    │  MCP Protocol (stdio)    ▼BTP MCP Server (this package)    │  OAuth2 client_credentials    │  + TTL cache (5 min)    ▼SAP BTP APIs  ├── Service Manager API  → service catalog, instances, plans  └── Destination API      → configured connections

Caching: BTP API responses are cached for 5 minutes by default. The service catalog and instance list change rarely — caching keeps responses fast without sacrificing data freshness.

Pagination: All list endpoints fetch every page from BTP, not just the first 50 results.


Roadmap

This is Phase 2 of a 6-phase project building toward a full AI-powered BTP operations platform.

PhaseStatusDescription
Phase 1✅ DoneBTP auth + 2 tools + local MCP server
Phase 2✅ Done5 tools + caching + pagination + tests + PyPI
Phase 3🔜 NextLangGraph agent + FastAPI streaming + memory
Phase 4📋 PlannedChainlit prototype → React + UI5 Web Components on BTP
Phase 5📋 PlannedMulti-agent supervisor + RAG + proactive alerts
Phase 6📋 PlannedProduction hardening + CI/CD + BTP marketplace

Coming soon (Phase 3)

  • LangGraph ReAct agent with multi-turn conversation memory
  • FastAPI SSE streaming endpoint
  • Code generation for recommended services (CAP binding config, CLI commands, YAML manifests)

Entitlements API (temporarily disabled)

The get_btp_entitlements tool requires a separate Cloud Management Service (CIS Central plan) service key. The code is fully written and commented out — see ENTITLEMENTS_SETUP.md to enable it when ready.


Contributing

Contributions are welcome! Please open an issue first to discuss what you'd like to change.

bash
git clone https://github.com/ABRANJAN07/btp-mcp-server.gitcd btp-mcp-serverpip install -r requirements.txtpytest tests/ -v   # make sure tests pass before submitting a PR

License

MIT — see LICENSE for details.


Author

Built by Abhijeet Ranjan as part of a series on AI + SAP BTP integration.

Follow the journey on LinkedIn for Phase 3 updates.

Source: README.md at commit d6753a8

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v1.0.0LatestSep 16, 2026

Score

40% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.