Claude SAP連携ガイド — BTP MCP ServerでBTPサービスを操作する
SAP連携の目的が開発支援かBTPの状態確認か業務データかで選ぶMCPサーバーが変わります。コミュニティ製btp-mcp-serverの設定手順と注意点を扱います。
ClaudeとSAPを連携させるとき、最初に決めるのは「何をさせたいか」です。目的は大きく3つあります。SAP製品のアプリを開発したい、BTP(Business Technology Platform)の稼働状況を聞きたい、ERPの業務データを読みたい。どれかで、選ぶMCPサーバーがまったく変わります。この記事では、BTPの状態を調べるbtp-mcp-serverを実際に設定する手順を軸に、他の目的に向くサーバーとの切り分けまでを扱います。
目的別に見る「Claude SAP連携」の選び方
「SAPのMCPサーバー」という単一の窓口はありません。目的ごとに、運営元の違うサーバーが別々に存在します。
SAPが運営するGitHub組織には、開発支援用のMCPサーバーがあります。CAP(Cloud Application Programming Model)向けの@cap-js/mcp-serverと、UI5向けの@ui5/mcp-serverがあります。モバイル開発キット(MDK)向けには@sap/mdk-mcp-serverがあります。UI5の組織にはUI5/webcomponents-mcp-serverもあります。
CAP向けのREADMEには、Claude Codeへの登録コマンドが載っています。ユーザースコープで登録する例はclaude mcp add --scope user cds-mcp -- npx -y @cap-js/mcp-serverです。これらはいずれも「アプリを開発するAIを助ける」道具で、稼働中のBTPやERPのデータを読む道具ではありません。
一方、BTPの稼働状況やABAP開発環境に触れるサーバーは、個人やコミュニティが公開しているものが中心です。GitHubのSAP組織(github.com/SAP)で「mcp」を含むリポジトリを検索しても、BTPのサービス一覧やOData経由の業務データを対象にしたものは見つかりませんでした。代表格がこの記事で扱うbtp-mcp-serverです。ほかにOData経由のSAPデータを扱うbtp-sap-odata-to-mcp-serverや、ABAP開発環境向けのmcp-abap-adtがあります。
業務データ側には、SAP製品の経路もあります。SAP Integration Suiteには、組み合わせた業務APIをMCPツールとして公開するMCP Gateway機能があります。SAPのサンプルリポジトリ(SAP-samples/integration-mcp-gateway)が、その手順を示しています。提供状態(一般提供かどうか)はサンプルからは確認できていません。CAPのプラグインcap-js/mcpも、CAPのサービスをMCPで公開する仕組みです。
目的別のMCPサーバー
SAP製品のアプリを開発したい
CAP・UI5・MDKなど、SAPが運営する組織のサーバーが候補です。READMEにClaude Code向けの登録手順があります。
BTPの稼働状況を聞きたい
コミュニティ製の
btp-mcp-serverが候補です。サービスカタログ・プラン・インスタンス・Destinationを読み取ります。ERPの業務データを読みたい
Integration SuiteのMCP Gateway、またはODataを公開するコミュニティ製の
btp-sap-odata-to-mcp-serverのような別系統を選びます。btp-mcp-serverでは届きません。ABAPを開発したい
mcp-abap-adtが対象です。ABAP Development Tools(ADT)経由でソースなどを読む16の読み取り専用ツールを持ちます。接続先のSAPシステムでADTのサービス(/sap/bc/adt)が有効である必要があります。
運営元で分けると、btp-mcp-server・btp-sap-odata-to-mcp-server・mcp-abap-adtは個人のOSSで、@cap-js/mcp-serverはSAPの組織が運営しています。btp-mcp-serverを試して欲しい情報が出てこないときは、対象範囲が違う可能性をまず疑います。サーバーの選び方を横断的に比べたい場合はおすすめMCPサーバー10選が参考になります。
btp-mcp-serverの素性と評価の前提
PyPIのbtp-mcp-serverは、個人開発者が「AI + SAP BTP連携」の連載の一部として公開しているオープンソースです。PyPIのメタデータとREADMEはMITライセンスを示しており、SAP社が保守に関与する記載はありません。
btp-mcp-serverの現状
PyPIのリリース
1.0.0のみ
2026-04-25に公開
公開ツール
5つ
すべて読み取り系
ロードマップ
Phase 2 / 6
READMEの自己申告
READMEのロードマップでは、現在がPhase 2で、LangGraphエージェントやFastAPIのストリーミングはこれから(Phase 3)とされています。実験的な導入や社内検証には使えても、継続的な保守を前提にした本番運用の部品としては、更新が止まったときの代替を用意しておく必要があります。
btp-mcp-serverでできること
公開されているツールは5つで、すべてBTPプラットフォームの状態を調べる読み取り操作です。
| ツール | できること |
|---|---|
list_btp_services | できることグローバルカタログに存在するBTPサービスの一覧取得 |
get_btp_service_plans | できること特定サービスが持つプラン(無料枠の有無を含む)の確認 |
list_btp_instances | できることサブアカウント内で稼働中のインスタンスと状態の確認 |
get_btp_destinations | できること設定済みのDestination(外部接続)と認証方式の確認 |
recommend_btp_service | できることユースケースに合ったBTPサービスの推薦 |
対象はBTPというプラットフォーム自体で、S/4HANAの受注データや在庫情報のような業務データには、このサーバー単体では届きません。「BTPには繋がったのに欲しいデータが出てこない」という状況は、ほとんどがこの対象範囲の違いから起きます。
READMEには、エンタイトルメント(利用権)を返すget_btp_entitlementsも触れられています。ただしこれは一時的に無効化されており、有効にするには別途Cloud Management Service(CISのCentralプラン)のサービスキーが必要です。ツール一覧に出てこない理由はここにあります。
一覧系のツールは、BTPから返る全ページを取得する作りだとREADMEに書かれています。先頭の50件だけで打ち切られる実装ではありません。
接続の準備から確認まで
導入から疎通確認までの流れ
- 1
BTP CockpitでService Managerのサービスキーを作る
サブアカウントのService Marketplaceで「Service Manager」を検索し、
subaccount-adminプランでインスタンスを作成します。そのインスタンスにService Keyを発行すると、clientid・clientsecret・トークンURL・sm_urlを含むJSONが得られます。 - 2
パッケージを入れ、環境変数に転記する
pip install btp-mcp-serverで入れ、キーの値を環境変数へ手作業で転記します。PythonはPyPI上で3.11以上が必要です。 - 3
Claude Codeにstdioサーバーとして登録する
claude mcp addで登録します。書き方と保存先の選び方は次の節で扱います。 - 4
Claudeに聞いてみる
「BTPで失敗しているサービスインスタンスはあるか」「オンプレミスのSAPに接続するにはどのBTPサービスを使うか」のような質問が、READMEにも例として載っています。
環境変数の一覧
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
CACHE_TTL_SECONDS=300BTP_SUBACCOUNT_IDはBTP CockpitのサブアカウントのOverviewにある「Subaccount ID」です。BTP_DESTINATION_URLとBTP_SM_URLのリージョンコード(例のus10)はサブアカウントごとに変わるため、Service Keyの値をそのまま写すのが確実です。
READMEのClaude Code向けの設定例にはBTP_DESTINATION_URLが入っていません。get_btp_destinationsでDestinationを読みたい場合は、この変数も渡しておきます。CACHE_TTL_SECONDSは省略でき、既定は300秒です。
認証はOAuth 2.0のクライアントクレデンシャルフローです。キャッシュされるのはトークンではなく、BTP APIの応答です。カタログやインスタンス一覧は頻繁に変わらないので、5分間は同じ応答を返す設計です(README)。
Claude Codeに登録する
Claude Codeではローカルのstdioサーバーとして追加します。
claude mcp add --transport stdio sap-btp \
--env BTP_CLIENT_ID=your-client-id \
--env BTP_CLIENT_SECRET=your-client-secret \
--env BTP_TOKEN_URL=your-token-url \
--env BTP_SM_URL=your-sm-url \
--env BTP_SUBACCOUNT_ID=your-subaccount-guid \
--env BTP_DESTINATION_URL=your-destination-url \
-- btp-mcp-serverclaude mcp add --help(v2.1.287)の使用法は<name> <commandOrUrl> [args...]です。環境変数は-e, --env <env...>で、複数の値を続けて渡せます。サーバー名を先に書き、起動コマンドの前に--を置く形が、ヘルプの例とも合っています。claude mcp addの細かいオプションはClaude Code MCP設定ガイドで扱っています。
Claude Desktopでは、claude_desktop_config.jsonのmcpServersに同じ環境変数を持つエントリーを足してアプリを再起動します。
クライアントシークレットをどこに置くか
claude mcp addの保存先は--scopeで決まり、既定はlocalです。projectを選ぶと、プロジェクト直下の.mcp.jsonに書き込まれます。v2.1.287で、作業用の空ディレクトリに次のコマンドを実行すると、結果はこうなります(値はダミーです)。
claude mcp add --scope project --transport stdio sap-btp \
--env BTP_CLIENT_ID=your-client-id \
--env BTP_SUBACCOUNT_ID=your-subaccount-guid -- btp-mcp-server
cat .mcp.json
claude mcp get sap-btpAdded stdio MCP server sap-btp with command: btp-mcp-server to project config
{
"mcpServers": {
"sap-btp": {
"type": "stdio",
"command": "btp-mcp-server",
"args": [],
"env": {
"BTP_CLIENT_ID": "your-client-id",
"BTP_SUBACCOUNT_ID": "your-subaccount-guid"
}
}
}
}
sap-btp:
Scope: Project config (shared via .mcp.json)
Status: ⏸ Pending approval (run `claude` to approve)
Type: stdio
Command: btp-mcp-server
Environment:
BTP_CLIENT_ID=your-client-id
BTP_SUBACCOUNT_ID=your-subaccount-guid環境変数の値は平文のまま.mcp.jsonに入ります。公式ドキュメントはこのファイルをバージョン管理に入れて共有する前提で説明しているので、BTP_CLIENT_SECRETを直接書くと、シークレットがリポジトリに入る経路になります。READMEが.envのコミットを禁じているのと同じ問題です。
避ける方法は2つあります。1つ目は、既定のlocalスコープで登録することです。.mcp.jsonを作らず、コミット対象にもなりません。2つ目は、.mcp.jsonのenvに"BTP_CLIENT_SECRET": "${BTP_CLIENT_SECRET}"と書き、実際の値をシェルの環境変数から渡すことです。.mcp.jsonのcommand・args・env・url・headersでは${VAR}と${VAR:-default}の展開が使えます。
もう1つ、projectスコープのサーバーは追加直後には動きません。claude mcp getのStatusがPending approvalのとおり、claudeを対話で起動して承認するまで接続されません。承認の選択を戻したいときはclaude mcp reset-project-choicesを使います。
疎通確認とテストの違い
接続前に確かめる手段は2つあり、役割が違います。READMEのソース実行手順は次のとおりです。
git clone https://github.com/ABRANJAN07/btp-mcp-server.git
cd btp-mcp-server
pip install -r requirements.txt
pytest tests/ -v # モック応答。認証情報は不要
cp .env.example .env # 認証情報を記入してから
python test_connection.py # 実際のBTPに接続して疎通確認pytest tests/ -vは、BTPのレスポンスをモックで差し替えて動かす17件のテストです。READMEは「17 tests passed」を期待値としています。通れば、サーバーのコードと依存関係がその環境で動くことまでは確かめられます。
python test_connection.pyはBTPへの接続そのものを確認するスクリプトで、.envの認証情報が必要です。こちらが失敗してpytestが通っているなら、疑うのは環境変数の転記ミスやリージョンコードの取り違えのほうです。サーバー自体の不具合と自分の設定ミスを切り分けるときは、この順番が使えます。
BTP側のコストとアクセス権
recommend_btp_serviceが勧めるサービスの中には、有料プランしか持たないものも含まれ得ます。get_btp_service_plansで無料枠の有無を確かめてからインスタンスを作る、という使い方ができます。サブアカウント全体のコスト管理はこのサーバーの範囲外なので、BTP Cockpitのコスト管理画面と併用する前提になります。
Service Keyの権限は、READMEの手順ではsubaccount-adminプランのService Managerインスタンスから発行されます。別のプランを選ぶ場合は、必要なAPIにアクセスできる権限が揃っているかを自分で確かめる必要があります。専用のインテグレーションユーザーを用意し、使うAPIだけに権限を絞る運用が最小構成です。コミュニティ製サーバー全般のリスクの見極め方はMCPセキュリティガイドで扱っています。
よくあるつまずき
- BTPの情報とERPの業務データを混同する:
btp-mcp-serverが返すのはBTPサービスやインスタンスの一覧です。S/4HANAの伝票やマスタデータは返りません - Service Managerのプランを取り違える: READMEは
subaccount-adminプランを前提にしています - Destinationが空になる: READMEのClaude Code向け設定例には
BTP_DESTINATION_URLが入っていません。get_btp_destinationsを使うなら自分で足します projectスコープで登録したのに動かない:Pending approvalのまま承認されていません。claudeを対話で起動して承認します- シークレットがリポジトリに入る:
.envの他に、projectスコープの.mcp.jsonも同じ経路になります
まとめ
SAP連携の出発点は、開発支援・BTPの状態確認・業務データの読み取りのどれを目的にするかを決めることです。BTPの状態確認ならbtp-mcp-serverを試せますが、1.0.0のみのコミュニティ製であることと、シークレットを.mcp.jsonに平文で置かないことは、導入前に済ませておく点です。
よくある質問
複数のBTPサブアカウントを同時に扱えますか
READMEの設定項目はBTP_SUBACCOUNT_IDが1つだけで、複数のサブアカウントを1つのサーバーで切り替える記述はありません。横断したい場合は、サブアカウントごとに別のサーバー名でclaude mcp addを実行し、環境変数の組を分けて登録する形が考えられます。
Joule StudioやLangGraphからも同じサーバーを使えますか
READMEには、Claude Code・Cursorに加えて、LangGraphとJoule Studioからの利用例が載っています。Joule Studioでは、MCP_TRANSPORT=http btp-mcp-serverで起動するとhttp://0.0.0.0:8080/mcpで待ち受けるとされています。BTP CockpitでこのURLを指すDestinationを作り、Agent BuilderのToolsからMCPサーバーとして追加する手順です。0.0.0.0はすべてのネットワークインターフェースで待ち受ける指定なので、公開範囲は自分で絞る必要があります。