---
title: "Connect the platform MCP server"
description: "Give your coding agent the Guuey platform as an MCP server — the same API the CLI uses, behind your own token — to create and update apps, deploy, set environment variables, read logs, and set the chat theme."
---

Guuey runs an MCP server over its own platform API. Connect it to the coding agent you already work in — Claude Code, Cursor, or any client that speaks MCP over HTTP — and that agent can do what `guuey` does from the terminal: list and create apps, deploy, manage environment variables and secrets, read logs, rotate widget keys, and write the [chat theme](/chat-theming/). Every tool call is the same authenticated request the CLI makes; nothing is cached, re-authorized or reshaped on the way, and an upstream `401`, `403` or `404` comes back as a tool error carrying that status.

## The endpoint

```
https://platform-mcp.guuey.com/mcp
```

Streamable HTTP, stateless — no session id to keep — on MCP protocol `2025-06-18`. The server identifies itself as `guuey-platform`.

## Authentication

The server takes your personal token — the same one the CLI uses — and forwards it verbatim:

- **Your personal access token** (`guuey_user_…`) — the key `guuey login` delivers. Mint one in the console under **Settings → API keys**; `guuey login --token guuey_user_…` accepts the same key, so it is the one credential for both doors.
- Service tokens (`guuey_svc_…`) and workspace keys (`guuey_wkz_…`) are **refused at this door** — it takes a personal token only. CI automation keeps using those through the [CLI](/cli/#deploying-from-ci-service-tokens), not through this server.

Send it as `Authorization: Bearer <token>`. An unauthenticated request answers `401` with a `WWW-Authenticate` header pointing at `https://platform-mcp.guuey.com/.well-known/oauth-protected-resource/mcp`; clients that implement MCP's OAuth discovery follow that document to Guuey's authorization server (`https://oauth.guuey.com`, which publishes registration, authorization and token endpoints with PKCE), register themselves, and sign you in with your Guuey account instead of a pasted token.

## Connect a client

Claude Code:

```bash
claude mcp add --transport http guuey-platform https://platform-mcp.guuey.com/mcp \
  --header "Authorization: Bearer guuey_user_…"
```

Any client that reads an `mcpServers` map (Cursor, Windsurf, the MCP inspector, and most others):

```json
{
  "mcpServers": {
    "guuey-platform": {
      "url": "https://platform-mcp.guuey.com/mcp",
      "headers": { "Authorization": "Bearer guuey_user_…" }
    }
  }
}
```

Keep the token in the client's secret store or an environment variable, never in a file you commit.

## What the agent can do

| Tool                                                      | What it is                                                                                                                                                                                                                                  |
| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `whoami`                                                  | Who the token belongs to — `{ userId, keyId? }`, nothing richer.                                                                                                                                                                            |
| `apps_list`, `apps_get`, `apps_create`, `apps_update`     | Your apps. The argument is **`id`** (not `appId`). `apps_update` also sets the look: `chatTheme` is the same document `guuey apps update --chat-theme-file` sends (`null` clears it; every hosted surface follows within minutes), `brandAccent` is a full replacement (`null` clears). |
| `deploy_upload`, `deploy_trigger`                         | A deploy. For **code** deploys, `deploy_upload` presigns the upload of the source tarball and comes first — its returned `s3Key` goes into `deploy_trigger` as `sourceTarballKey`; a declarative (no-code) deploy needs only `deploy_trigger`.                                                                                                             |
| `deployments_list`, `deployment_get`, `deployment_status` | Build history and the state of one build.                                                                                                                                                                                                   |
| `env_list`, `env_set`, `env_delete`                       | Environment variables. `env_list` returns **names only** — values never leave the platform. `env_delete` is destructive.                                                                                                                    |
| `secrets_set`, `secrets_list`, `secrets_unset`            | A hosted MCP server's secrets — again names only, never values. `secrets_unset` is destructive (and idempotent).                                                                                                                                             |
| `logs_fetch`                                              | The app's runtime logs.                                                                                                                                                                                                                     |
| `mcp_servers_list`, `mcp_server_get`                      | Your hosted MCP servers (`workspaceId` defaults to your personal workspace when omitted).                                                                                                                                                   |
| `widget_keys_create`, `widget_keys_rotate`, `widget_keys_revoke` | The widget signing keys. `widget_keys_revoke` is destructive; there is no list — the platform exposes none.                                                                                                                          |

Everything else the platform API can do — deleting or archiving an app, billing, membership, undeploy, deleting a hosted MCP server — is deliberately **not** on this server. Those stay with the [CLI](/cli/) and the console, where a person confirms them.

## The chat theme door

This is the door the console's **Copy prompt** on Design → Chat theme names: a coding agent with this server connected can read the theme it proposes back into the app with `apps_update { "id": "<appId>", "chatTheme": <the document> }` and verify it with `apps_get`. The document, its validation and its precedence over the brand accent are all on [Theming](/chat-theming/#theme-the-hosted-surfaces).