# Vercel create-project / MCP auth research (2026-09-25)

**Audience:** VercelResearcher / Karolis / Manager  
**Research date:** 2026-09-25 (Europe/Vilnius, UTC+3)  
**Scope:** Fresh Grok bots (Infrastructor, Droplet) stuck in access/auth loops; cannot create/deploy via MCP; older bots (Experimenter, MCPator) historically worked. Prefer durable MCP write grant **or** `VERCEL_TOKEN` path over one-off dashboard imports.

---

## Confirmed incident symptoms (this org)

1. **CallDynamicTool:** `MCP server "user-Vercel" / "user-Vercel--infrastructor" requires authentication. Please authorize this server in cursor.com/agents and retry.` — even when `GetMcpServerStatus` showed **Connected + 46 tools**.
2. **AuthenticateMcpServer:** already authenticated / connected; `force_reauth` returned **`no_auth_link`**.
3. Sessions later flipped to **`needsAuth`, tools=0**. Catalog thinner (missing write-ish tools such as `add_project_domain` / create-git-project).
4. **`list_projects` required `teamId`**; teamId `team_Xo6grVYYjwjtGm0gLG59yOos` historically **403** for scope `karolisvalickas-5148`.
5. **Droplet:** list projects OK; create / deploy / get → **HTTP 403** team-scope / re-auth required.
6. **CLI:** `vercel whoami` → Logged out; **no `VERCEL_TOKEN`** on the box.
7. **Workaround that already worked (one-off):** box browser Vercel dashboard import → project `tiesa-assistant-reports` live at https://reports.tiesa.tech/

**Still needed:** durable MCP write grant **or** team/full-account `VERCEL_TOKEN` so agents do not need the dashboard.

---

## 1) Top findings

### F1 — Cursor Cloud Agents OAuth callback is often not allowlisted on Vercel MCP (systemic)
**Claim:** Authenticating official Vercel MCP from Cursor Cloud Agents / `cursor.com/agents` fails (or flaps) because Cloud uses `https://www.cursor.com/agents/mcp/oauth/callback`, which Vercel’s MCP OAuth client frequently rejects as an invalid redirect — desktop grants do **not** carry over.  
**Source:** Vercel Community — “Vercel MCP OAuth fails from Cursor cloud-agents dashboard” (2026-07-20, confirmed 2026-08-15)  
**URL:** https://community.vercel.com/t/vercel-mcp-oauth-fails-from-cursor-cloud-agents-dashboard/46285  
**Also:** https://github.com/vercel/vercel-plugin/issues/127 (open as of 2026-09-19)  
**Why it matters:** Matches symptom (1)/(2)/(3): status can look Connected while tool calls demand re-auth; `force_reauth` yielding `no_auth_link` is consistent with a broken/blocked authorize URL path rather than a missing “Connect” UI.

### F2 — Grok Bot / Cursor Vercel plugin OAuth is a known broken path (Aug–Sep 2026)
**Claim:** Official Vercel marketplace plugin (id 649) for Grok Bot repeatedly hits “App configuration error – redirect URL is invalid” or “OAuth callback failed”; Cursor staff said (2026-09-21) the cause is identified and **retry/reinstall will not fix** until provider-side fix.  
**Source:** Cursor Forum — “Grok Bot: Vercel plugin (649) OAuth fails…”  
**URL:** https://forum.cursor.com/t/grok-bot-vercel-plugin-649-oauth-fails-with-app-configuration-error-redirect-url-is-invalid/168499  
**Related desktop thread:** https://forum.cursor.com/t/vercel-mcp-oauth-fails-app-configuration-error-redirect-url-is-invalid/159005  
**Why it matters:** Explains why **new** bots (fresh OAuth) fail while **old** bots with stale working grants still succeed — classic shared-token / per-agent OAuth skew.

### F3 — “Connected” + tools listed ≠ usable authenticated session
**Claim:** Cursor MCP OAuth bugs show servers stored as connected while offerings stay **0 tools**, or status flickers after an incomplete PKCE/callback; workarounds include opening the authorize URL from MCP logs / clicking “Needs authentication” text — and Cloud Agents still need a valid HTTPS redirect.  
**Source:** Cursor Forum — “MCP Servers with auth do not open browser anymore” (2026-02; staff: known issue)  
**URL:** https://forum.cursor.com/t/mcp-servers-with-auth-do-not-open-browser-anymore/150862  
**Also:** https://forum.cursor.com/t/mcp-http-sse-oauth-sdk-silently-fails-to-open-browser-after-mcp-oauth-redirect-to-authorization-3-2-11-latest/160328  
**Why it matters:** Directly maps to CallDynamicTool “requires authentication” while GetMcpServerStatus reported Connected + 46 tools, and to `no_auth_link` on force_reauth.

### F4 — Official Vercel MCP now can create projects via `deploy_to_vercel` (write path exists)
**Claim:** As of 2026-07-23, Vercel MCP `deploy_to_vercel` deploys files and **creates the project if needed**; `teamId` is optional but required when targeting a team. `list_projects` / `get_project` / deploy tools all document **required `teamId`**.  
**Source:** Vercel Changelog — “Vercel MCP can now deploy code” (2026-07-23)  
**URL:** https://vercel.com/changelog/vercel-mcp-can-now-deploy-code  
**Tools reference:** https://vercel.com/docs/agent-resources/vercel-mcp/tools  
**Why it matters:** Writes are possible once OAuth is healthy — but creation still inherits the user’s team RBAC and the OAuth grant’s team scoping. Absence of `deploy_to_vercel` / thinner catalogs signals a degraded or read-partial session.

### F5 — MCP OAuth can succeed yet return empty teams / 403 on team projects (Sep 2026)
**Claim:** Multiple users (team Owners) report Vercel MCP OAuth completes, but `list_teams` returns `[]`, `list_projects` empty, and `list_deployments` / `get_project` return **403** — dashboard access still works. Reconnect does not fix.  
**Sources:**  
- https://community.vercel.com/t/vercel-mcp-returns-empty-projects-and-403-for-team-owned-project/49232 (2026-09-14)  
- https://community.vercel.com/t/vercel-mcp-returns-0-teams-and-403-for-valid-team-project/48813 (2026-09-03)  
- https://community.vercel.com/t/chatgpt-vercel-mcp-returns-empty-teams-and-403-after-authorization/49271 (2026-09-15)  
**Why it matters:** Matches Droplet “list OK / create-deploy-get 403” and historical 403 on `team_Xo6grVYYjwjtGm0gLG59yOos` for scope `karolisvalickas-5148` — OAuth team-scoping bug, not app code.

### F6 — Create-project RBAC: Owner/Member yes; Developer needs “Create Project”; Viewer/Billing/Contributor generally no
**Claim:** Official docs: to create a project you need **Owner or Member**; **Developer** needs the **Create Project** extended permission. Viewer / Billing / Contributor do not get create by default.  
**Source:** Managing projects  
**URL:** https://vercel.com/docs/projects/managing-projects  
**Extended permissions:** https://vercel.com/docs/rbac/access-roles/extended-permissions  
**Why it matters:** If the OAuth identity / token user is Viewer, Contributor, or Developer without Create Project on that team, POST create and MCP deploy-create will 403 even with a “valid” login.

### F7 — Access token scopes: Full Account / Team can create; Project-scoped tokens cannot create new projects
**Claim:** Tokens are Full Account, Team, or Project. Project-scoped tokens only act on one existing project and deny team-level resources. Full-account tokens need `?teamId=` / `slug` when targeting a team; team-scoped tokens infer the team.  
**Source:** Access tokens  
**URL:** https://vercel.com/docs/accounts/access-tokens  
**Getting started (401/403 table):** https://vercel.com/docs/rest-api/getting-started  
**Why it matters:** A project-scoped or wrong-team token explains list-works / create-fails. Durable agent path = **Team-scoped or Full Account** token for the correct team, not OIDC project tokens.

### F8 — REST create endpoint is POST `/v11/projects` (docs also show `/v10` in CLI helpers); auth is Bearer access token + team query when needed
**Claim:** Create project via `POST https://api.vercel.com/v11/projects` with `Authorization: Bearer $VERCEL_TOKEN`; optional `teamId` / `slug` query params. CLI: `vercel project add <name>` and `vercel api /v10/projects -X POST -F name=...` require a logged-in session or `--token`.  
**Sources:**  
- https://vercel.com/docs/rest-api/projects/create-a-new-project  
- https://vercel.com/docs/projects/managing-projects  
- https://vercel.com/docs/cli/project  
- https://vercel.com/docs/cli/api  
**Why it matters:** Confirms CLI “Logged out / no VERCEL_TOKEN” is a hard blocker for non-MCP create; installing a Team/Full Account token unblocks agents independently of MCP OAuth.

### F9 — Sign-in-with-Vercel / generic OAuth resource permissions are private beta; “OAuth token cannot create project” is documented product gap
**Claim:** Community report (2026-02): OAuth flow returns `{"error":{"code":"forbidden","message":"You don't have permission to create the project."}}`. Vercel staff: resource-management permissions after Sign in with Vercel are **not public**. Docs: Permissions for API/team resources via Sign in with Vercel are **private beta**.  
**Sources:**  
- https://community.vercel.com/t/can-not-create-project-via-oauth-token/32951  
- https://vercel.com/docs/sign-in-with-vercel/scopes-and-permissions  
**Why it matters:** Do not expect arbitrary OAuth apps / SiwV tokens to create projects. Prefer classic **account access tokens** or the official MCP grant once healthy.

### F10 — MCP grants the AI the same access as the Vercel user; wrong browser account on consent = wrong team
**Claim:** Official MCP docs: connecting grants the AI system the **same access as your Vercel user**; consent is required per client; confused-deputy protection forces explicit consent (desktop grant ≠ Cloud Agents grant).  
**Source:** https://vercel.com/docs/agent-resources/vercel-mcp  
**Launch post (initially read-only, Aug 2025):** https://vercel.com/blog/introducing-vercel-mcp-connect-vercel-to-your-ai-tools  
**Why it matters:** Multi-account connectors (`user-Vercel` vs `user-Vercel--infrastructor`) can bind different users/teams; consent under the wrong Google/GitHub session explains 403 on `team_Xo6…` while personal listing works.

### F11 — Project limits are unlikely the primary failure mode here
**Claim:** Hobby ≤ 200 projects; Pro unlimited. Limits docs: https://vercel.com/docs/limits  
**Why it matters:** Only check after auth/RBAC; 403 “permission” / “requires authentication” is not a limit error.

### F12 — Durable CLI token minting requires a classic Full Account token
**Claim:** `vercel tokens add` rejects OAuth login sessions and team/project-only tokens with guidance to create a classic personal access token at Account Tokens, set `VERCEL_TOKEN`, then mint narrower tokens.  
**Source:** https://vercel.com/docs/cli/tokens  
**Why it matters:** For agent automation: create one Full Account (or Team) token in the dashboard once, inject into box/agent env — that is the systemic path when MCP OAuth is flaky.

### F13 — Deployment Protection / Vercel Authentication is mostly irrelevant to *creating* projects
**Claim:** SSO/password/deployment protection gates accessing deployments URLs, not `POST /projects`. Docs mention `ssoProtection` as optional project config on create, not as a create gate.  
**Why it matters:** Do not chase Deployment Protection for this symptom.

### F14 — Reddit deep-dive blocked from this environment
**Claim:** Direct Reddit fetches returned network policy blocks; search snippets only (e.g. r/mcp Vercel MCP token advice: use account-level token). Treat Reddit as low-weight pending manual review.  
**Search hits (titles only):** r/mcp “I get this error when adding vercel mcp”; r/FactoryAi “cant auth in Vercel MCP”.

---

## 2) Most likely causes ranked (for THIS symptom: new agents fail, old succeed)

| Rank | Cause | Confidence | Evidence |
| --- | --- | --- | --- |
| **1** | **Per-agent / Cloud Agents MCP OAuth broken or stale** — Connected UI with dead refresh token; `CallDynamicTool` demands auth; `AuthenticateMcpServer` returns `no_auth_link` because authorize/redirect cannot be offered; sessions flip to `needsAuth tools=0` | **High (~85%)** | Confirmed strings (1)(2)(3); F1, F2, F3; Cloud callback not allowlisted (community + GH #127); Grok Bot plugin known broken Sep 2026 |
| **2** | **OAuth grant missing team write scope / MCP team-scoping bug** — list may work; create/deploy/get 403 on team `team_Xo6…`; multi-server `user-Vercel` vs `user-Vercel--infrastructor` | **High (~75%)** | Confirmed (4)(5); F5 community 403/empty teams for Owners; F10 same-access-as-user + wrong consent account |
| **3** | **No CLI / REST fallback credential** — `vercel whoami` logged out; no `VERCEL_TOKEN` → agents have zero durable write path when MCP flaps | **High (~90% as amplifier)** | Confirmed (6); F8, F12 |
| **4** | **Wrong token/user RBAC** — Developer without Create Project, Viewer, Contributor, or project-scoped token used for create | **Medium (~40%)** | F6, F7; would produce 403 even with healthy auth; less explanatory of auth-loop / `no_auth_link` |
| **5** | **Thinner tool catalog / older MCP surface** — missing deploy/create tools on some connections | **Medium-low (~30%)** | Confirmed (3) catalog thinner; F4 write tools exist when fully authenticated — more likely a symptom of degraded auth than a separate root cause |
| **6** | **Hobby project limit** | **Low (~5%)** | F11; error shape does not match |
| **7** | **Deployment Protection** | **Very low** | F13 |

**Why old bots still work:** They likely hold an older successful OAuth refresh grant (or shared connector session) minted when redirect URIs / scopes still worked for that client id; new bots must complete a fresh Cloud/Grok OAuth round-trip that currently fails or grants incomplete team scopes.

---

## 3) Step-by-step unblock checklist (ordered, durable-first)

### Path A — Systemic durable fix (preferred): Team/Full Account `VERCEL_TOKEN` for agents

1. **Human (Karolis)** opens https://vercel.com/account/tokens while signed into the account that owns/is Owner|Member of the target team (confirm team switcher: the team for `team_Xo6grVYYjwjtGm0gLG59yOos`, not a personal hobby slug alone).
2. Create token:
   - **Scope:** prefer **that Team** (All Projects), or **Full Account** if agents must touch multiple teams.
   - **Not** a single-project scope if the goal is *creating* new projects.
   - Expiration: set intentionally (e.g. 90d) and calendar a rotation.
3. Copy token once (`vcp_…`). Store in the agent secret store / box env as `VERCEL_TOKEN` (and optionally `VERCEL_TEAM_ID=team_Xo6grVYYjwjtGm0gLG59yOos`).
4. On the box / agent runtime verify:
   ```bash
   export VERCEL_TOKEN='…'
   export VERCEL_TEAM_ID='team_Xo6grVYYjwjtGm0gLG59yOos'
   curl -sS -o /dev/null -w "%{http_code}\n" \
     -H "Authorization: Bearer $VERCEL_TOKEN" \
     "https://api.vercel.com/v10/projects?teamId=$VERCEL_TEAM_ID&limit=1"
   # expect 200
   curl -sS -H "Authorization: Bearer $VERCEL_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"name":"agent-auth-probe-'$(date +%s)'"}' \
     "https://api.vercel.com/v11/projects?teamId=$VERCEL_TEAM_ID"
   # expect 200 with project JSON; delete probe after
   vercel whoami --token "$VERCEL_TOKEN"
   vercel project add agent-cli-probe --token "$VERCEL_TOKEN" --scope <team-slug>
   ```
5. Teach Infrastructor/Droplet playbooks: **prefer REST/CLI with `VERCEL_TOKEN` for create/deploy** when MCP status ≠ ready; do not block on MCP auth loops.
6. Optional: mint narrower project tokens later with `vercel tokens add … --project prj_…` **using** the classic Full Account token (OAuth login alone cannot mint).

### Path B — Repair MCP write grant (parallel; may be blocked by Vercel/Cursor until redirect fix)

1. In **cursor.com/agents** (Cloud) and each bot’s MCP panel, identify **all** Vercel servers: `user-Vercel`, `user-Vercel--infrastructor`, etc.
2. For each: Disconnect / remove grant; in Vercel Account → **Sign in with Vercel** / connected apps, revoke Cursor/Grok/Vercel MCP authorizations.
3. Re-auth **only** while the browser is logged into the correct Vercel user (Owner/Member of target team). Complete consent selecting that team if prompted.
4. If authorize page shows **“redirect URL is invalid”** or AuthenticateMcpServer returns **`no_auth_link`**: stop retrying — this is the known Cloud/Grok OAuth defect (F1/F2). Escalate to Cursor + Vercel MCP; **do not** burn cycles on reconnect loops. Fall back to Path A.
5. After a healthy connect, verify tool catalog includes **`deploy_to_vercel`**, `list_teams`, `list_projects`. Call `list_teams`; confirm target team appears. Call `list_projects` with that `teamId`. Probe `deploy_to_vercel` to a throwaway name with `teamId` set.
6. If OAuth “succeeds” but `list_teams` is `[]` or team calls 403 (F5): treat as MCP OAuth team-scoping bug — Path A remains the unblock.

### Path C — Immediate operational (already proven once)

- Dashboard import / deploy (as done for https://reports.tiesa.tech/) for urgent ships only. Document project name/IDs so agents can attach via token later.

### Hygiene for future agents

- Standardize **one** Vercel connector identity per org team; avoid proliferating `user-Vercel--*` without documenting which account each binds.
- Bootstrap checklist for new bots: (1) `VERCEL_TOKEN` present, (2) MCP ready **or** explicitly optional, (3) `teamId` constant in agent config, (4) smoke POST `/v11/projects`.
- Never rely on project OIDC (`vercel project token`) for create-project — OIDC is project-bound and not a general create credential.

---

## 4) What to verify on the Vercel side

| Check | Where | Pass criteria |
| --- | --- | --- |
| Which account the connector is logged into | Browser session during MCP consent; Vercel avatar | Same user that owns older working bots’ projects |
| Team membership + role for that user on `team_Xo6grVYYjwjtGm0gLG59yOos` | Team Settings → Members | **Owner** or **Member** (or Developer **+ Create Project** extended permission) |
| Personal vs team slug | Team switcher / Settings | Agents pass `teamId`/`slug` for the **team**, not only personal `karolisvalickas-5148` hobby scope |
| Token scope if using API | Account Tokens list | Team All-Projects or Full Account — **not** single-project — for create |
| Connected apps / SiwV grants | Account settings → Sign in with Vercel / apps | Revoke stale Cursor/Grok grants; note dates vs working old bots |
| MCP tool surface after auth | Agent MCP status | Includes `deploy_to_vercel`; not tools=0; not “Connected but CallDynamicTool requires auth” |
| Project count vs plan | Limits / dashboard | Hobby &lt; 200; unlikely root cause |
| CLI auth on box | `vercel whoami`, env | Not “Logged out”; `VERCEL_TOKEN` set for automation |
| Multi-connector map | Cursor agents MCP list | Document `user-Vercel` vs `user-Vercel--infrastructor` account/team each maps to |

**API smoke (after token):**

```bash
# List teams for token identity
curl -sS -H "Authorization: Bearer $VERCEL_TOKEN" https://api.vercel.com/v2/teams

# Create (team)
curl -sS -H "Authorization: Bearer $VERCEL_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"probe-…"}' \
  "https://api.vercel.com/v11/projects?teamId=team_Xo6grVYYjwjtGm0gLG59yOos"
```

---

## 5) Gaps — still need from the incident

1. **Exact JSON bodies** for Droplet create/deploy 403 (code/message/action/resource fields).
2. **Which MCP tools** Infrastructor/Droplet actually invoke (`deploy_to_vercel` vs custom create vs CLI).
3. **Whether `list_teams` returns** `team_Xo6…` for working vs failing bots.
4. **Account email / user id** bound to `user-Vercel` vs `user-Vercel--infrastructor` vs Experimenter/MCPator.
5. **Whether Cloud Agents redirect** `https://www.cursor.com/agents/mcp/oauth/callback` is now allowlisted on Vercel client ids (`cl_eD921…` / plugin 649) — open issue as of 2026-09-19.
6. **Team role** of Karolis on `team_Xo6…` (Owner/Member/Developer/…).
7. Reddit thread bodies (network-blocked here) — optional manual read of r/mcp and r/FactoryAi MCP auth posts.
8. Confirmation whether older bots use **shared** MCP OAuth or a long-lived **VERCEL_TOKEN** already present in their runtime.

---

## Recommended Manager decision

1. **Immediate:** Issue a **Team-scoped (All Projects) or Full Account** access token for the correct team; inject as `VERCEL_TOKEN` (+ `VERCEL_TEAM_ID`) into Infrastructor, Droplet, and future bots. Validate with POST `/v11/projects`.  
2. **Parallel:** File/track Cursor+Vercel on Cloud Agents / Grok Bot redirect allowlist (cite GH `vercel/vercel-plugin#127` and community 46285); treat MCP write as best-effort until fixed.  
3. **Do not** keep forcing `AuthenticateMcpServer` when it returns `no_auth_link` — that loop wastes time and matches known product breakage.  
4. **Keep** dashboard import only as emergency (already used for tiesa-assistant-reports).

---

## Key URLs (quick index)

| Topic | URL |
| --- | --- |
| Vercel MCP setup | https://vercel.com/docs/agent-resources/vercel-mcp |
| Vercel MCP tools (`deploy_to_vercel`, `list_projects`) | https://vercel.com/docs/agent-resources/vercel-mcp/tools |
| MCP deploy changelog | https://vercel.com/changelog/vercel-mcp-can-now-deploy-code |
| Access tokens / scopes | https://vercel.com/docs/accounts/access-tokens |
| Create project (dashboard/API) | https://vercel.com/docs/projects/managing-projects |
| POST create project API | https://vercel.com/docs/rest-api/projects/create-a-new-project |
| RBAC + Create Project permission | https://vercel.com/docs/rbac/access-roles/extended-permissions |
| CLI project add | https://vercel.com/docs/cli/project |
| CLI tokens | https://vercel.com/docs/cli/tokens |
| Limits | https://vercel.com/docs/limits |
| Cloud Agents OAuth fail (community) | https://community.vercel.com/t/vercel-mcp-oauth-fails-from-cursor-cloud-agents-dashboard/46285 |
| Cloud Agents OAuth fail (GitHub) | https://github.com/vercel/vercel-plugin/issues/127 |
| Grok Bot Vercel plugin OAuth | https://forum.cursor.com/t/grok-bot-vercel-plugin-649-oauth-fails-with-app-configuration-error-redirect-url-is-invalid/168499 |
| MCP 403 empty teams | https://community.vercel.com/t/vercel-mcp-returns-0-teams-and-403-for-valid-team-project/48813 |
| OAuth cannot create project | https://community.vercel.com/t/can-not-create-project-via-oauth-token/32951 |
| SiwV permissions private beta | https://vercel.com/docs/sign-in-with-vercel/scopes-and-permissions |

---

*Report generated live 2026-09-25 from WebSearch/WebFetch/curl. Reddit full text unavailable (egress blocked). Training knowledge not used as evidence.*
