Secrets: how I keep Stripe, Supabase and any other secrets out of Cursor's chat

Something I kept running into while building with Cursor’s agent: halfway through a task it needs a key, and the quickest path is to paste it into the chat. That works, but now the key lives in the conversation history and has been sent to the model provider.

At raycash.xyz (a small team building a confidential money app on Zama’s FHE stack) that’s not a habit I wanted us to have, so I built a small open-source MCP server called OffPrompt.

How it plays out in Cursor:

  1. The agent decides it needs STRIPE_SECRET_KEY and calls collect_secret.
  2. A page opens on 127.0.0.1. I paste the key there, not in the chat.
  3. offprompt writes it to .env.local and the agent carries on. It never sees the value.

To try it, add this to .cursor/mcp.json:

{"mcpServers":{"offprompt":{"command":"npx","args":["-y","offprompt","mcp"]}}}

The Stripe flow step by step: Take Stripe payments in test mode without your agent seeing the secret key

It’s MIT and free. I’d like to know how it behaves in your setup, especially if you run agents in remote or cloud environments.

Check it on offprompt.dev and share any feedback!