「読み取り=無料 / 書き込み=Pro」というプランをテスト環境に作ろうとして、Claude Code から Stripe MCP に「Pro プランを月額◯◯円で作って」と頼んだら、Product と Price はあっさり通りました。ところが Entitlements(Feature)の段で MCP が止まります。この記事は、MCP がどこまでやってくれて、どこで止まり、その先を Stripe Shell でどう埋めたか、という実機の記録です。ローカルには何も入れていません。すべてブラウザの中で終わっています。
検証環境
検証日は 2026-06-21、参照した Stripe MCP の API スペックは 2026-06-10.preview です。後述の「MCP に未収録」はこの版での結果で、Entitlements が MCP に入っているかは時点依存なので、結論を読むときはこの 2 つを併せて見てください。
TL;DR
- Product / Price の作成は Stripe MCP で完結します。
2026-06-10.previewのスペックでは、Entitlements(Feature)と ProductFeature の作成オペレーションが MCP に収録されていません。止まるのはここです。- 回避策は Stripe Shell(Workbench またはローカル CLI)で、
stripe entitlements features createとstripe product_features createを使います。 - ブラウザ版 Shell では
stripe post/stripe get(生リクエスト)が使えないので、リソースコマンドで代替します。 - 結果として、ローカル環境ゼロ・全部ブラウザでプラン構築が終わります。
作りたかったもの
サブスクの状態に応じて機能アクセスを出し分ける構成です。Feature(capability)を lookup_key でコード参照し、Product に紐付けます。Free は ¥0 / 月の Price に Feature read(読み取りのみ)、Pro は有料 Price に read + wp_write + content_insights を additive で同梱します。
1. できること:Stripe MCP で Product / Price を作る
Claude Code に Stripe MCP を繋いでおけば、自然言語で頼むだけで作成できます。裏側では POST /v1/products と POST /v1/prices が呼ばれます。
「テストアカウントに、SaaS の料金プランを作って。
- Product『Free』: ¥0/月(JPY)の月額 Price、metadata に plan=free
- Product『Pro』: ¥1,500/月(JPY)の月額 Price、metadata に plan=pro
それぞれの default_price も設定して」
ここで効いてくるのが JPY の扱いです。JPY はゼロ十進通貨なので、unit_amount は ¥1,500 なら 1500(×100 しない)、¥0 なら 0 を渡します。あわせて Price に lookup_key(例 sitesensei_pro_monthly)を付けておくと、あとでコードから静的文字列で引けます。明細に出る statement_descriptor は Product 側に置きますが、5〜22 文字という制限があるので長い名前はそのままでは入りません。最後に Product の default_price を作った Price に更新すれば、骨格は完成です。ここまでは MCP だけで終わり、Claude が返す prod_xxx / price_xxx をそのまま次へ渡せます。
2. 止まる場所:Entitlements(Feature)が MCP に無い
ここが本題です。Entitlements の中核は Feature の作成(POST /v1/entitlements/features)と Product への付与(POST /v1/products/{id}/features)ですが、2026-06-10.preview のスペックではこの 2 つが MCP に収録されていません。entitlements でオペレーションを検索しても返るのは Product 系だけで、Feature も ProductFeature も出てきません。該当オペレーションを直接引くと、こう返ります。
Operation 'PostEntitlementsFeatures' is not available.
Use stripe_api_search to find available operations.
Product と Price は MCP で作れるのに、Feature と ProductFeature だけが守備範囲の外にあります。Entitlements で機能ゲートを設計していると、MCP だけではこの行で進めなくなります。なお Product の marketing_features は料金表に並べる箇条書きで、Entitlements の Feature とは別系統です。機能ゲートの代わりにはなりません。
3. 回避策:Stripe Shell を使う
回避策は Stripe Shell です。Dashboard 内の Workbench → Shell(ブラウザ)でも、ローカルの Stripe CLI でも、どちらもログイン中のモード(テスト / 本番)にそのまま流れます。
まず Feature を 3 つ作ります。
stripe entitlements features create --name="Read access" --lookup-key=read
stripe entitlements features create --name="WordPress write" --lookup-key=wp_write
stripe entitlements features create --name="Content insights" --lookup-key=content_insights
返ってきた feat_... を控えたら(stripe entitlements features list でも確認できます)、Product に付与します。Free には read だけ、Pro には 3 つを additive で重ねます。
stripe product_features create prod_FREE_ID --entitlement-feature=feat_READ_ID
stripe product_features create prod_PRO_ID --entitlement-feature=feat_READ_ID
stripe product_features create prod_PRO_ID --entitlement-feature=feat_WP_WRITE_ID
stripe product_features create prod_PRO_ID --entitlement-feature=feat_CONTENT_INSIGHTS_ID
stripe product_features list で確認すると、Free は 1 件、Pro は 3 件を返しました。これで付与は完了です。
ブラウザ版 Shell で踏んだところ
Workbench の Shell はローカル CLI と挙動が違う箇所があり、2 回つまずきました。ひとつは生リクエストで、stripe post や stripe get を実行すると This command is only supported by the locally installed Stripe CLI. と出て弾かれます。もうひとつはサブコマンド名で、stripe products create_feature ... は command not found になり、正しくは stripe product_features create <product> --entitlement-feature=... でした。生リクエストが封じられている点さえ押さえれば、あとはリソースコマンドで素直に通ります。ローカル CLI なら stripe post /v1/products/{id}/features -d entitlement_feature=feat_xxx も使えますが、ブラウザ完結を優先するならリソースコマンド一択です。
4. 全部ブラウザで完結する
今回ローカルに入れたものはゼロでした。
| 工程 | 使ったもの | 場所 |
|---|---|---|
| Product / Price 作成 | Claude Code + Stripe MCP | ブラウザ |
| Feature 作成・付与 | Stripe Shell(Workbench) | ブラウザ |
| 確認・記録 | Claude Code(ドキュメント追記) | ブラウザ |
brew install stripe も stripe login も要らず、Dashboard にログインしていれば Workbench Shell が即使えるので、セットアップとローカルへの秘密鍵配置がまるごと不要です。しかも Claude Code が作った prod_xxx / feat_xxx を同じブラウザの Shell にそのまま貼って続けられるため、文脈が地続きのまま進みます。出先のブラウザからでも、同じ手順で再現できます。
まとめと申し送り
料金プランの骨格(Product / Price)は MCP で完結し、Entitlements だけ Stripe Shell で補う、という役割分担に落ち着きました。コード側は Feature を ID 直書きせず lookup_key で参照します。テストの feat_test_... は本番とは別物になるので、本番移行時は live モードで同じ lookup_key の Feature / Product / Price を作り直します。多通貨は Price を増やすより、Checkout の Adaptive Pricing に寄せると単一通貨ベースのまま自動換算できます。
Entitlements が MCP に入っていないのは 2026-06-10.preview 時点の話で、今後取り込まれる可能性があります。現時点では「MCP で Product / Price、Shell で Entitlements」を知っていれば、SaaS の料金登録はブラウザだけで終わります。