Stripe MCP: @stripe/mcp is deprecated and sk_live keys stop working in December. How to migrate safely
By Pritesh Ghodge, Senior Solutions Engineer (cybersecurity) · Last updated 13 November 2026
Scan your app free — make sure no Stripe secret key ended up in your live site.
Abbi Labs looks at your live site from the outside: secret keys in the JavaScript (including Stripe sk_live_ and rk_live_ keys), Supabase tables readable with your public key, exposed .env and .git files, source maps, and security headers. No sign-up for the quick check.
No sign-up. Read-only public-resource and protocol metadata checks. No model prompts or tool execution. Scan only sites you own or are allowed to test.
Run on every deploy or use from Cursor / Claude Code via MCP →
Weekly AI-app security checklist
One short email a week: a practical check for apps built with Supabase, Next.js and AI tools (RLS, leaked keys, headers and more). Unsubscribe anytime.
A lot of AI-built apps got their Stripe setup the same way: someone pasted a snippet into mcp.json that runs npx -y @stripe/mcp with a secret key, and Cursor or Claude Code could suddenly create products, prices and payment links. That setup now has two problems. The local package is no longer maintained, and Stripe's hosted MCP server will stop accepting full-access secret keys in December. Here's what changed, how to find every place the old setup lives, and how to move without leaving a live key behind.
What changed (from Stripe's own pages)
- Packages frozen. On 4 November 2026 Stripe marked
@stripe/mcpand@stripe/agent-toolkiton npm as "No longer maintained; no further updates, including security fixes", pointing to the hosted server. - Key deadline. The Stripe MCP docs say: migrate by November 30, 2026. From December, Stripe MCP stops accepting full-access secret keys and restricted keys without the Agent tag, and returns a
401with an OAuth discovery challenge. - Recommended setup. Connect to
https://mcp.stripe.comwith OAuth for interactive tools, or an agent API key (Agent badge in the Dashboard) with only the permissions the agent needs.
The security side matters more than the deadline. An unmaintained package that holds a key able to move money won't get fixes, and a full sk_live_ sitting in a plain-text config file is one bad commit or one malicious extension away from leaking.
1. Find every old Stripe MCP config
Check the usual config locations on each machine you code on, and search your repos:
# global and project MCP configs (Cursor, Claude Code, VS Code, Claude Desktop, Codex)
ls ~/.cursor/mcp.json .cursor/mcp.json .mcp.json .vscode/mcp.json ~/.codex/config.toml 2>/dev/null
ls ~/Library/Application\ Support/Claude/claude_desktop_config.json 2>/dev/null
# anything still launching the local package or holding a Stripe key
grep -rnE "@stripe/(mcp|agent-toolkit)|sk_(live|test)_|rk_(live|test)_" \
~/.cursor .cursor .mcp.json .vscode ~/.codex 2>/dev/null
# did a key ever get committed?
git log -p --all -S "sk_live_" | head -50Also look for @stripe/agent-toolkit in package.json: if your app itself imports it (for example an in-app AI agent), that code is now on a frozen dependency too.
2. Switch to the hosted server
Cursor: replace the old entry in ~/.cursor/mcp.json with the hosted URL and sign in with OAuth when prompted:
{
"mcpServers": {
"stripe": { "url": "https://mcp.stripe.com" }
}
}Claude Code: claude mcp add --transport http stripe https://mcp.stripe.com/, then run /mcp inside Claude Code to authenticate with OAuth.
Agents that can't do OAuth: create an agent API key with the smallest set of permissions, keep it in an environment variable, and reference the variable in the config (Stripe's example for Claude Code's .mcp.json):
"headers": { "Authorization": "Bearer ${AGENT_API_KEY}" }Don't paste the key itself into the file, and don't pass it on the command line where it lands in shell history. Stripe suggests testing the new setup in a sandbox first.
3. Expire the old key
Once the new connection works, go to the Stripe Dashboard and expire (roll) the secret or restricted key the old config used. Do this even if you think it never left your laptop. If the git log -S search above found it in any commit, assume it's leaked and roll it now rather than waiting for December. Moving off the old key is a good moment to check that your app uses a restricted key with only what it needs: Does your app use a full Stripe secret key it doesn't need?.
4. Turn on approvals
Stripe's docs recommend turning on your MCP client's tool-approval setting so you review tool calls before they run, and warn about prompt injection when Stripe MCP runs alongside other MCP servers. A web page or issue your agent reads can contain instructions. For some actions, such as refunds, Stripe asks a human to confirm through a link. Keep auto-run off for anything that can change live data.
5. Make sure the key didn't ship in your app
The MCP config is dev tooling, but AI agents often copy the same key into .env while wiring up checkout. If it got a NEXT_PUBLIC_ or VITE_ prefix, or was imported into a client component, it's in the JavaScript every visitor downloads. Open your live site, DevTools, Sources, and search for sk_live_ and rk_live_, or run the free quick check above. Why this happens: NEXT_PUBLIC_ and VITE_ variables are shipped to every visitor.
What an outside scan adds, and what it can't do
Abbi Labs can't see your MCP config, your laptop or your repo, so steps 1 to 4 are on you. It checks what your live site serves: secret keys in the JavaScript (including sk_live_ and rk_live_), Supabase tables readable with your public key, exposed .env/.git files, source maps and security headers. If it finds a Stripe key, roll it in the Dashboard. Removing it from the code doesn't un-leak it.
FAQ
Is @stripe/mcp deprecated?
Yes. Since 4 November 2026 the npm packages @stripe/mcp and @stripe/agent-toolkit carry a deprecation notice: no longer maintained, no further updates including security fixes. Stripe points people to its hosted MCP server at https://mcp.stripe.com.
What is the November 30, 2026 Stripe MCP deadline?
Stripe's MCP docs say to migrate by November 30, 2026. Starting in December, Stripe MCP stops accepting full-access secret keys and restricted API keys without the Agent tag. Requests with an unsupported key get a 401 response with an OAuth discovery challenge. The fix is to reconnect with OAuth or create a new agent API key.
Does this break my app's normal Stripe integration?
This deadline is about the Stripe MCP server, the thing your AI coding agent uses. Stripe's MCP page doesn't say your app's own server-side Stripe API calls change. Your checkout and webhook code is a separate question; keep its key server-only and use a restricted key where you can.
What's an agent API key?
A Stripe API key created for an AI application, shown in the Dashboard with an Agent badge. Stripe recommends OAuth for interactive clients like Cursor or Claude Code, and an agent API key with only the permissions the client needs for autonomous agents that can't do OAuth.
My mcp.json with sk_live was committed to git. What now?
Treat the key as leaked: roll it in the Stripe Dashboard (Developers, API keys) and set up the replacement. Deleting the file or rewriting history doesn't un-leak a key someone may already have copied, especially if the repo was ever public.
Does Abbi Labs check my MCP config?
No. Your MCP config lives on your laptop or in your repo, not on your live site, so an outside scan can't see it. What the free quick check does see is the JavaScript your site serves: it looks for Stripe live secret and restricted keys (sk_live_, rk_live_) there, plus Supabase tables readable with your public key, exposed .env/.git files and security headers.
Related guides
- Stripe webhook signature verification for AI-built apps
- OpenAI, Claude or Gemini API key exposed in your frontend? What to do now
- NEXT_PUBLIC_ and VITE_ variables are shipped to every visitor
- API keys in mcp.json: keep secrets out of your Cursor MCP config
- Cursor-built app security checklist (from a security engineer)