Scouttlo
Todas las ideas/devtools/A unified credential management and AI orchestration platform that securely connects AI coding assistants to multiple cloud platforms with fine-grained permissions and approval workflows.
GitHubB2Bdevtools

A unified credential management and AI orchestration platform that securely connects AI coding assistants to multiple cloud platforms with fine-grained permissions and approval workflows.

Detectado hace 5 horas

7.0/ 10
Puntaje general

Convierte esta senal en ventaja

Te ayudamos a construirla, validarla y llegar primero.

Pasamos de la idea al plan: quien compra, que MVP lanzar, como validarlo y que medir antes de invertir meses.

Contexto extra

Ver mas sobre la idea

Te contamos que significa realmente la oportunidad, que problema existe hoy, como esta idea lo resolveria y los conceptos clave detras de ella.

Comparte tu correo para ver este analisis ampliado.

Desglose del puntaje

Urgencia7.0
Tamano de mercado6.0
Viabilidad7.0
Competencia8.0
Dolor

Solo developers need complex multi-platform credential management and orchestration across GCP, Supabase, Vercel, and GitHub through AI tools like Cursor.

Quien pagaria por esto

Solo developers and small development teams using AI coding assistants

Senal de origen

"complete, secure blueprint for enabling Cursor (via MCP servers) to perform 100% of administrative tasks across your four platforms as a solo developer"

Publicacion original

feat(cursor): AI Administrator / Orchestration

Repository: Columbia-Cloudworks-LLC/EquipQR Author: viralarchitect <html> <body> <!--StartFragment--><html><head></head><body><div data-renderer="lm"><h1 class="font-editorial font-bold first:mt-xs mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg leading-[1.5em] lg:text-xl" id="cursor-full-admin-setup-for-gcp-supabase-vercel-an">Cursor Full-Admin Setup for GCP, Supabase, Vercel, and GitHub</h1><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Below is a complete, secure blueprint for enabling Cursor (via MCP servers) to perform 100% of administrative tasks across your four platforms as a solo developer. The core pattern: install the official MCP server for each provider, authenticate with the <strong>narrowest credential that still permits admin actions</strong>, store those credentials in a local OS keychain (never in repos or <code>.env</code>), and gate destructive actions behind Cursor's approval prompts.</p><h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;]:mt-4" id="architecture-overview">Architecture Overview</h2><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Cursor connects to each platform through Model Context Protocol (MCP) servers configured in <code>~/.cursor/mcp.json</code> (global) or <code>.cursor/mcp.json</code> (per project). Each MCP server runs locally on your machine, authenticates to the provider with a token/key, and exposes tools Cursor can call. For a solo developer wanting full admin, you'll use <strong>one high-privilege credential per platform</strong>, isolated per-provider so a leak in one doesn't cascade.</p><div class="group relative my-[1em]"><div class="sticky top-0 z-10 h-0" aria-hidden="true" style="overflow: hidden; visibility: hidden;"><div class="w-full overflow-hidden bg-raised border-x md:max-w-[90vw] border-subtlest ring-subtlest divide-subtlest"></div></div><div class="w-full overflow-auto scrollbar-subtle rounded-lg border md:max-w-[90vw] border-subtlest ring-subtlest divide-subtlest bg-raised"> Platform | MCP Server | Credential Type | Storage -- | -- | -- | -- GitHub | Official github-mcp-server (remote or Docker) | Fine-grained PAT or OAuth | macOS Keychain / Windows Credential Manager Google Cloud | gcp-mcp (community) or gemini-cli MCP | Service Account JSON + ADC | gcloud ADC file (chmod 600) Supabase | Official @supabase/mcp-server-supabase | Personal Access Token | OS keychain via env var injection Vercel | Official Vercel MCP (remote, OAuth) | OAuth token (preferred) or API token | Vercel-managed OAuth session </div></div><h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;]:mt-4" id="1-github--full-repo--secrets-admin">1. GitHub — Full Repo + Secrets Admin</h2><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Use GitHub's <strong>official remote MCP server</strong> (<code>https://api.githubcopilot.com/mcp/</code>) with OAuth — this is the most secure because tokens are short-lived and scoped by GitHub's OAuth flow, and it supports full repo settings, Actions secrets, Dependabot secrets, environments, and Copilot coding agent delegation.</p><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Setup steps:</strong></p><ol class="marker:text-quiet list-decimal pl-8"><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">In Cursor → Settings → MCP → Add new server.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Choose the remote GitHub MCP URL and authenticate via OAuth in the browser. If you prefer a PAT, create a <strong>fine-grained PAT</strong> at github.com/settings/personal-access-tokens with these scopes: <code>repo</code> (full), <code>admin:repo_hook</code>, <code>admin:org</code> (if you have orgs), <code>workflow</code>, <code>secrets:write</code>, <code>actions:write</code>, and set an expiration ≤ 90 days.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">For secret management specifically, the MCP server exposes <code>create_or_update_file</code>, and you'll pair this with the GitHub REST API tool calls it wraps for <code>/repos/{owner}/{repo}/actions/secrets</code> — Cursor can create, rotate, and delete Actions/Codespaces/Dependabot secrets directly.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Enable <strong>Cursor's "require approval for destructive actions"</strong> toggle so deletes and secret rotations prompt you.</p></li></ol><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Store the PAT in your OS keychain and reference it via env var in <code>mcp.json</code>:</p><div class="w-full md:max-w-[90vw]"><pre class="not-prose w-full rounded font-mono text-sm font-extralight"><div class="codeWrapper bg-subtle text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-medium"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden border-subtlest ring-subtlest divide-subtlest bg-base rounded-full"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtle"><button data-testid="copy-code-button" aria-label="Copy code" type="button" class="focus-visible:bg-quiet hover:bg-quiet text-quiet hover:text-foreground font-sans focus:outline-none outline-none outline-transparent transition duration-300 ease-out select-none items-center relative group/button font-semimedium justify-center text-center items-center rounded-full cursor-pointer active:scale-[0.97] active:duration-150 active:ease-outExpo origin-center whitespace-nowrap inline-flex text-sm h-8 aspect-square" data-state="closed"><div class="flex items-center min-w-0 gap-two justify-center"><div class="flex shrink-0 items-center justify-center size-4"><svg role="img" class="inline-flex fill-current shrink-0" width="16" height="16" stroke-width="1.75"><use xlink:href="#pplx-icon-copy"></use></svg></div></div></button></div></div></div><div class="-mt-xl"><div><div data-testid="code-language-indicator" class="text-quiet bg-quiet py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin">json</div></div><div><span style="font-size: inherit; font-family: inherit; background: transparent; color: rgb(197, 200, 198); border-radius: 3px; display: flex; line-height: 1.42857; overflow-x: auto; white-space: pre; --scrollbar-thumb: oklch(var(--foreground-color) / 0.15); --scrollbar-track: transparent; scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);"><code style="white-space: pre-wrap; font-size: inherit; font-family: inherit; line-height: 1.66667; padding: 8px;"><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"mcpServers"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"github"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"url"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"https://api.githubcopilot.com/mcp/"</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"headers"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span><span class="token token property">"Authorization"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"Bearer ${env:GITHUB_MCP_PAT}"</span><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span></span><span class="token token punctuation">}</span></span></code></span></div></div></div></pre></div><h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;]:mt-4" id="2-google-cloud--all-projects-admin">2. Google Cloud — All Projects Admin</h2><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Google does not yet publish a first-party MCP, but the <strong>Gemini CLI's built-in MCP mode</strong> and the community <code>gcp-mcp</code> server both work well and use Application Default Credentials (ADC), which is the Google-recommended auth path.</p><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Secure setup:</strong></p><ol class="marker:text-quiet list-decimal pl-8"><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Run <code>gcloud auth application-default login</code> — this writes a short-lived user credential to <code>~/.config/gcloud/application_default_credentials.json</code>. This is safer than a long-lived service account key for a solo dev because it tied to your Google identity and MFA.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">If you need non-interactive/background agent use, create <strong>one service account</strong> named <code>cursor-admin@&lt;project&gt;.iam.gserviceaccount.com</code> per project, grant it <code>roles/owner</code> at the project level, and download the JSON key. Chmod it <code>600</code> and reference via <code>GOOGLE_APPLICATION_CREDENTIALS</code>.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Install: <code>npm install -g gcp-mcp</code> (or use Gemini CLI's MCP server).</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Add to <code>mcp.json</code>:</p></li></ol><div class="w-full md:max-w-[90vw]"><pre class="not-prose w-full rounded font-mono text-sm font-extralight"><div class="codeWrapper bg-subtle text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-medium"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden border-subtlest ring-subtlest divide-subtlest bg-base rounded-full"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtle"><button data-testid="copy-code-button" aria-label="Copy code" type="button" class="focus-visible:bg-quiet hover:bg-quiet text-quiet hover:text-foreground font-sans focus:outline-none outline-none outline-transparent transition duration-300 ease-out select-none items-center relative group/button font-semimedium justify-center text-center items-center rounded-full cursor-pointer active:scale-[0.97] active:duration-150 active:ease-outExpo origin-center whitespace-nowrap inline-flex text-sm h-8 aspect-square" data-state="closed"><div class="flex items-center min-w-0 gap-two justify-center"><div class="flex shrink-0 items-center justify-center size-4"><svg role="img" class="inline-flex fill-current shrink-0" width="16" height="16" stroke-width="1.75"><use xlink:href="#pplx-icon-copy"></use></svg></div></div></button></div></div></div><div class="-mt-xl"><div><div data-testid="code-language-indicator" class="text-quiet bg-quiet py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin">json</div></div><div><span style="font-size: inherit; font-family: inherit; background: transparent; color: rgb(197, 200, 198); border-radius: 3px; display: flex; line-height: 1.42857; overflow-x: auto; white-space: pre; --scrollbar-thumb: oklch(var(--foreground-color) / 0.15); --scrollbar-track: transparent; scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);"><code style="white-space: pre-wrap; font-size: inherit; font-family: inherit; line-height: 1.66667; padding: 8px;"><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span class="token token property">"gcp"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"command"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"npx"</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"args"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">[</span><span class="token token" style="color: rgb(181, 189, 104);">"-y"</span><span class="token token punctuation">,</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"gcp-mcp"</span><span class="token token punctuation">]</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"env"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span><span class="token token property">"GOOGLE_APPLICATION_CREDENTIALS"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"/Users/you/.gcp/cursor-admin-key.json"</span><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span></span><span class="token token punctuation">}</span></span></code></span></div></div></div></pre></div><ol class="marker:text-quiet list-decimal pl-8"><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Hardening:</strong> enable Cloud Audit Logs on all projects so every Cursor-initiated API call is logged, and set up a budget alert in Billing so a runaway agent can't rack up surprise charges.</p></li></ol><h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;]:mt-4" id="3-supabase--full-org-admin">3. Supabase — Full Org Admin</h2><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Supabase ships an <strong>official MCP server</strong> (<code>@supabase/mcp-server-supabase</code>) that covers database schema, migrations, edge functions, auth config, storage, and project creation/deletion across all projects in your org.</p><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Setup:</strong></p><ol class="marker:text-quiet list-decimal pl-8"><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">In Supabase Dashboard → Account → Access Tokens → generate a Personal Access Token named "Cursor MCP". This inherits all permissions of your user account, which is what you want for solo full admin.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Add to <code>mcp.json</code>:</p></li></ol><div class="w-full md:max-w-[90vw]"><pre class="not-prose w-full rounded font-mono text-sm font-extralight"><div class="codeWrapper bg-subtle text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-medium"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden border-subtlest ring-subtlest divide-subtlest bg-base rounded-full"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtle"><button data-testid="copy-code-button" aria-label="Copy code" type="button" class="focus-visible:bg-quiet hover:bg-quiet text-quiet hover:text-foreground font-sans focus:outline-none outline-none outline-transparent transition duration-300 ease-out select-none items-center relative group/button font-semimedium justify-center text-center items-center rounded-full cursor-pointer active:scale-[0.97] active:duration-150 active:ease-outExpo origin-center whitespace-nowrap inline-flex text-sm h-8 aspect-square" data-state="closed"><div class="flex items-center min-w-0 gap-two justify-center"><div class="flex shrink-0 items-center justify-center size-4"><svg role="img" class="inline-flex fill-current shrink-0" width="16" height="16" stroke-width="1.75"><use xlink:href="#pplx-icon-copy"></use></svg></div></div></button></div></div></div><div class="-mt-xl"><div><div data-testid="code-language-indicator" class="text-quiet bg-quiet py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin">json</div></div><div><span style="font-size: inherit; font-family: inherit; background: transparent; color: rgb(197, 200, 198); border-radius: 3px; display: flex; line-height: 1.42857; overflow-x: auto; white-space: pre; --scrollbar-thumb: oklch(var(--foreground-color) / 0.15); --scrollbar-track: transparent; scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);"><code style="white-space: pre-wrap; font-size: inherit; font-family: inherit; line-height: 1.66667; padding: 8px;"><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span class="token token property">"supabase"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"command"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"npx"</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"args"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">[</span><span class="token token" style="color: rgb(181, 189, 104);">"-y"</span><span class="token token punctuation">,</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"@supabase/mcp-server-supabase@latest"</span><span class="token token punctuation">,</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"--access-token"</span><span class="token token punctuation">,</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"${env:SUPABASE_PAT}"</span><span class="token token punctuation">]</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span></span><span class="token token punctuation">}</span></span></code></span></div></div></div></pre></div><ol class="marker:text-quiet list-decimal pl-8"><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Critical safety flag:</strong> append <code>--read-only</code> when you're doing exploratory/research work, and only remove it for explicit migration or admin sessions. The Supabase MCP docs explicitly call out prompt-injection risk from untrusted data in DB rows, so keep the read-only default on.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">For secrets: the MCP can read/write edge function secrets via <code>supabase.secrets.set</code>, solving your secret-management pain on that platform.</p></li></ol><h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;]:mt-4" id="4-vercel--all-deployments-admin">4. Vercel — All Deployments Admin</h2><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Vercel offers an <strong>official hosted MCP server</strong> at <code>https://mcp.vercel.com/</code> with OAuth — this is the most secure option because no long-lived token is stored locally.</p><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Setup:</strong></p><ol class="marker:text-quiet list-decimal pl-8"><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">In Cursor → MCP → Add remote server → URL <code>https://mcp.vercel.com/</code>.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Authenticate via OAuth; Cursor stores only a refresh token in its own secure store.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">If you need a fallback (CLI/background), generate a <strong>team-scoped access token</strong> at vercel.com/account/tokens with full scope and an expiration ≤ 90 days. Store in OS keychain.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">The Vercel MCP exposes project management, environment variable CRUD (your secret-management need), deployment triggers, domain management, and log access.</p></li></ol><h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;]:mt-4" id="unified-secret-management-strategy">Unified Secret Management Strategy</h2><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Since secret management is your biggest headache, standardize on this flow: <strong>never commit secrets, never paste them into chat, let Cursor rotate them via MCP</strong>.</p><ul class="marker:text-quiet list-disc pl-8"><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Source of truth:</strong> treat GitHub Actions secrets (for CI) and Vercel env vars (for runtime) as the canonical stores. Supabase edge function secrets and GCP Secret Manager handle platform-specific runtime secrets.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Rotation workflow:</strong> ask Cursor: <em>"Rotate <code>STRIPE_SECRET_KEY</code> across all four platforms."</em> It will generate the new key (or prompt you to paste from Stripe), then call the four MCPs to update GitHub → Vercel → Supabase → GCP Secret Manager in one pass.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Local dev:</strong> use <code>direnv</code> with <code>.envrc</code> files that pull from your OS keychain via <code>security find-generic-password</code> (macOS) or <code>secret-tool</code> (Linux). Add <code>.envrc</code> to global gitignore.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Audit:</strong> enable audit logs on all four platforms (GitHub org audit log, GCP Cloud Audit, Supabase Advisors, Vercel audit log — the latter two require paid plans for full audit retention) so you can review every Cursor-initiated change.</p></li></ul><h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;]:mt-4" id="security-guardrails-solo-dev-tuned">Security Guardrails (Solo-Dev Tuned)</h2><ul class="marker:text-quiet list-disc pl-8"><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Keep MCP servers local-only</strong> except for the official GitHub and Vercel remote ones — community MCP servers can exfiltrate tokens, so vet the source and prefer official/first-party.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Enable Cursor's "Ask before running tools"</strong> for at least the first two weeks, then selectively whitelist read-only tools once you trust the pattern.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Scope tokens per platform</strong> — do not reuse a token across providers. A leaked Supabase PAT should not touch GitHub.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Rotate the four tokens quarterly</strong> using Cursor itself (meta-rotation via the GitHub MCP for the GitHub PAT, etc.).</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Disable Cursor's Privacy Mode "off"</strong> — keep it on so your token values aren't included in telemetry.</p></li><li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;&gt;p]:pt-0 [&amp;&gt;p]:mb-2 [&amp;&gt;p]:my-0"><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2"><strong>Back up <code>mcp.json</code></strong> (without secrets; use env var references) to a private gist so you can re-bootstrap a new machine in minutes.</p></li></ul><h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;]:mt-4" id="example-consolidated-mcpjson">Example Consolidated <code>mcp.json</code></h2><div class="w-full md:max-w-[90vw]"><pre class="not-prose w-full rounded font-mono text-sm font-extralight"><div class="codeWrapper bg-subtle text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-medium"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden border-subtlest ring-subtlest divide-subtlest bg-base rounded-full"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtle"><button data-testid="copy-code-button" aria-label="Copy code" type="button" class="focus-visible:bg-quiet hover:bg-quiet text-quiet hover:text-foreground font-sans focus:outline-none outline-none outline-transparent transition duration-300 ease-out select-none items-center relative group/button font-semimedium justify-center text-center items-center rounded-full cursor-pointer active:scale-[0.97] active:duration-150 active:ease-outExpo origin-center whitespace-nowrap inline-flex text-sm h-8 aspect-square" data-state="closed"><div class="flex items-center min-w-0 gap-two justify-center"><div class="flex shrink-0 items-center justify-center size-4"><svg role="img" class="inline-flex fill-current shrink-0" width="16" height="16" stroke-width="1.75"><use xlink:href="#pplx-icon-copy"></use></svg></div></div></button></div></div></div><div class="-mt-xl"><div><div data-testid="code-language-indicator" class="text-quiet bg-quiet py-xs px-sm inline-block rounded-br rounded-tl-lg text-xs font-thin">json</div></div><div><span style="font-size: inherit; font-family: inherit; background: transparent; color: rgb(197, 200, 198); border-radius: 3px; display: flex; line-height: 1.42857; overflow-x: auto; white-space: pre; --scrollbar-thumb: oklch(var(--foreground-color) / 0.15); --scrollbar-track: transparent; scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);"><code style="white-space: pre-wrap; font-size: inherit; font-family: inherit; line-height: 1.66667; padding: 8px;"><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"mcpServers"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"github"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"url"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"https://api.githubcopilot.com/mcp/"</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"headers"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span><span class="token token property">"Authorization"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"Bearer ${env:GITHUB_MCP_PAT}"</span><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token punctuation">}</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"vercel"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span><span class="token token property">"url"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"https://mcp.vercel.com/"</span><span> </span><span class="token token punctuation">}</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"supabase"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"command"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"npx"</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"args"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">[</span><span class="token token" style="color: rgb(181, 189, 104);">"-y"</span><span class="token token punctuation">,</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"@supabase/mcp-server-supabase@latest"</span><span class="token token punctuation">]</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"env"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span><span class="token token property">"SUPABASE_ACCESS_TOKEN"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"${env:SUPABASE_PAT}"</span><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token punctuation">}</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"gcp"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"command"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"npx"</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"args"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">[</span><span class="token token" style="color: rgb(181, 189, 104);">"-y"</span><span class="token token punctuation">,</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"gcp-mcp"</span><span class="token token punctuation">]</span><span class="token token punctuation">,</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token property">"env"</span><span class="token token operator">:</span><span> </span><span class="token token punctuation">{</span><span> </span><span class="token token property">"GOOGLE_APPLICATION_CREDENTIALS"</span><span class="token token operator">:</span><span> </span><span class="token token" style="color: rgb(181, 189, 104);">"${env:GCP_ADC_PATH}"</span><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span> </span><span class="token token punctuation">}</span><span> </span></span><span style="opacity: 1; font-size: inherit; line-height: 1.42857; color: rgb(197, 200, 198); background-color: transparent; flex-shrink: 0; padding: 8px; text-align: right; user-select: none;"><span></span><span class="token token punctuation">}</span></span></code></span></div></div></div></pre></div><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">Load the four env vars from your shell's keychain integration at session start, not from a dotfile.</p><p class="my-2 [&amp;+p]:mt-4 [&amp;_strong:has(+br)]:inline-block [&amp;_strong:has(+br)]:pb-2">I'll save this as a reference document you can keep alongside your projects.</p></div></body></html><!--EndFragment--> </body> </html>