> ## Documentation Index
> Fetch the complete documentation index at: https://docs.utmkit.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Servidor MCP

> Apunta Claude Desktop, Claude Code o Cursor a tu espacio de trabajo: veintiocho herramientas, cada una detrás de un permiso de token.

Hay dos servidores MCP que te vas a encontrar alrededor de UTMKit, y hacen trabajos distintos. **`https://docs.utmkit.co/mcp`** pertenece a este sitio de documentación: busca y lee estas páginas, y nada más — apunta un asistente a él para preguntar cómo funciona el producto. **`https://app.utmkit.co/mcp`** pertenece al producto: opera tu espacio de trabajo — lista, crea, edita y retira enlaces, gestiona campañas y reglas, lee el informe — y necesita un token. Mismo protocolo, misma ruta, dos hosts. Esta página es sobre el segundo.

## Qué es

Un servidor MCP (Model Context Protocol), hablado sobre el transporte Streamable HTTP del
protocolo, dentro del producto mismo. Cada herramienta llama a la misma operación que llaman
la consola y la API, así que las reglas del espacio de trabajo aplican sin cambios: un
enlace que la convención rechazaría en la consola se rechaza aquí, con la misma frase, como
un resultado de herramienta que tu asistente puede leer y transmitir o reparar.

Cada solicitud lleva el mismo encabezado que la API:

```text theme={null}
Authorization: Bearer utmk_…
```

Emite el token en la página Tokens de la consola con los permisos que el asistente debería
tener, como se describe en [Autenticación y tokens](/es/developers/authentication). El token
fija el espacio de trabajo; ninguna herramienta toma un argumento de espacio de trabajo,
organización o usuario, y nada que diga un asistente puede mover una llamada a otro.

## Conectar un cliente

<Tabs>
  <Tab title="Claude Code">
    Un comando, ejecutado en cualquier terminal:

    ```bash theme={null}
    claude mcp add --transport http utmkit https://app.utmkit.co/mcp \
      --header "Authorization: Bearer utmk_…"
    ```

    Luego `/mcp` en una sesión lista el servidor y las herramientas que tu token permite.
    Para mantener el token fuera de la línea de comandos, ponlo en una variable de entorno y
    referéncialo desde `.mcp.json` como `"Authorization": "Bearer ${UTMKIT_TOKEN}"`.
  </Tab>

  <Tab title="Cursor">
    En `~/.cursor/mcp.json` (cada proyecto) o `.cursor/mcp.json` (un proyecto):

    ```json theme={null}
    {
      "mcpServers": {
        "utmkit": {
          "url": "https://app.utmkit.co/mcp",
          "headers": {
            "Authorization": "Bearer ${env:UTMKIT_TOKEN}"
          }
        }
      }
    }
    ```

    Pon `UTMKIT_TOKEN` en tu entorno; Cursor lo resuelve cuando se conecta.
  </Tab>

  <Tab title="Claude Desktop">
    Los propios conectores de Claude Desktop se autentican con OAuth, que este servidor no
    ofrece hoy, así que la conexión pasa por el puente `mcp-remote` en
    `claude_desktop_config.json`:

    ```json theme={null}
    {
      "mcpServers": {
        "utmkit": {
          "command": "npx",
          "args": [
            "mcp-remote",
            "https://app.utmkit.co/mcp",
            "--header",
            "Authorization:${AUTH_HEADER}"
          ],
          "env": {
            "AUTH_HEADER": "Bearer utmk_…"
          }
        }
      }
    }
    ```

    El encabezado se divide entre `args` y `env` a propósito: Claude Desktop estropea los
    espacios dentro de un argumento, y la variable de entorno mantiene intacto el espacio
    después de `Bearer`. Reinicia Claude Desktop después de guardar.
  </Tab>
</Tabs>

Cualquier otro cliente MCP que hable Streamable HTTP y pueda enviar un encabezado funciona
de la misma manera.

## Las herramientas

Veintiocho herramientas, cada una detrás de exactamente un permiso de token. Las lecturas
solo necesitan el permiso; las escrituras también necesitan que tu rol en el espacio de
trabajo las permita, verificado en vivo en cada llamada. Cada herramienta bajo `rules:write`
también necesita un rol de administrador o propietario.

| Tool | Permission | What it does |
| - | - | - |
| `list_links` | `links:read` | The workspace's links, newest first, with the same search string the console's box takes |
| `get_link` | `links:read` | One link by id: destination, UTMs, state, short URL, QR URL |
| `create_link` | `links:write` | A governed short link, with or without UTMs; returns the short URL and the QR URL, plus a warning when the convention is in warn mode |
| `update_link` | `links:write` | Change destination, UTMs, campaign, expiry, tags or note; send only what changes |
| `withdraw_link` | `links:write` | Take a link down; it stops resolving at the edge |
| `list_tags` | `links:read` | The workspace's tags with how many links carry each |
| `create_tag` | `links:write` | Reserve a tag name, optionally with a colour, before any link uses it |
| `list_campaigns` | `campaigns:read` | Campaigns with their link counts |
| `get_campaign` | `campaigns:read` | One campaign by id |
| `create_campaign` | `campaigns:write` | A campaign; a name that already exists returns the existing one |
| `get_report` | `analytics:read` | The click report, scans reported apart, with the console's filters and grouping |
| `get_convention` | `rules:read` | Casing, separator, required parameters and mode |
| `list_approved_values` | `rules:read` | The approved values per parameter; an empty list means the parameter is open |
| `list_dependency_rules` | `rules:read` | The "when source is X, medium may be…" rules |
| `set_convention` | `rules:write` | Change the convention, partially |
| `approve_values` | `rules:write` | Approve values for one parameter; repeats are no-ops |
| `retire_value` | `rules:write` | Retire one approved value; retiring a parameter's last value opens it |
| `add_dependency_rule` | `rules:write` | Allow values for a target parameter under a driving pair |
| `remove_dependency_rule` | `rules:write` | Remove one dependency rule |
| `get_qr_code` | `links:read` | A link's QR code in the workspace's design, shown as an image, with PNG and SVG download links that work for an hour |
| `update_campaign` | `campaigns:write` | Rename a campaign or change its description; links keep their `utm_campaign` |
| `update_tag` | `links:write` | Rename or recolour a tag; every link keeps it |
| `delete_tag` | `links:write` | Delete a tag; it comes off every link, the links are untouched |
| `tag_links` | `links:write` | Add a tag to up to 500 links at once, or take it off them |
| `assign_campaign` | `links:write` | Move up to 500 links into a campaign, or out of any |
| `get_workspace` | `links:read` | The workspace, its plan, the period's usage, the domains a link can use, your role and the token's permissions |
| `list_broken_links` | `links:read` | Links whose destination page stopped answering, newest failure first |
| `create_report_link` | `reports:write` | A link to the workspace's live report, to send to a client; anyone holding it can read it. Admin or owner only |

**Una herramienta que le falta al token se oculta, y se rechaza por nombre si se llama de
todos modos.** La lista de herramientas que recibe un cliente se filtra a lo que permiten los
permisos del token y tu rol, y se recalcula en cada solicitud de lista. Una herramienta
oculta sigue estando ahí: un asistente que llama a `create_campaign` con un token de solo
enlaces obtiene un resultado de herramienta que dice
`This token does not carry campaigns:write.` en vez de "herramienta desconocida", así que
puede decirte exactamente qué casilla marcar en el siguiente token.

No hay herramienta de conversiones. Una conversión es un resultado que **tu servidor**
reporta contra un enlace — una venta, un registro — y un servidor hace eso a través de la
API con el permiso `conversions:write`, no a través de un asistente. Ver
[Conversiones](/es/analytics/conversions).

## Qué esperar

* **Cada escritura se atribuye** a ti y al token, y aparece en el
  [registro de actividad](/es/workspaces/activity-log) como un cambio hecho en la consola.
* **Los rechazos son resultados de herramienta**, marcados como errores, una frase cada uno:
  el rechazo de la convención, un valor no aprobado, un destino que el escáner rechazó, una
  asignación agotada. Un error de protocolo, en cambio, significa que el cliente habló mal.
* **La puerta es la puerta de la API.** Un token revocado o vencido falla la conexión con
  401; una organización sin suscripción vigente con 402; aplica el
  [límite de solicitudes](/es/developers/rate-limits) por token, con `Retry-After`. Ninguna
  sesión sobrevive a su token.
* **La degradación toma efecto en la siguiente llamada.** Si tu rol cambia, las herramientas
  de escritura desaparecen de la lista en la siguiente solicitud de lista, y una llamada
  hecha antes de eso se rechaza por el rol.

## El otro servidor, una vez más

Si tu asistente responde una solicitud de crear un enlace con un resultado de búsqueda, está
hablando con `docs.utmkit.co/mcp`, el servidor de la documentación. Reconéctalo a
`app.utmkit.co/mcp` con un token.
