# Agrega Shager a Cursor con .cursor/mcp.json: de las notas de versión a borradores para cada cuenta de tus clientes

_2026-08-28 · Configura el servidor MCP de Shager en Cursor con una url y un encabezado Authorization desde una variable, y convierte un changelog en borradores por cuenta._

Para conectar Shager a Cursor, crea `.cursor/mcp.json` en tu proyecto (o `~/.cursor/mcp.json` para todos los proyectos) con una entrada `shager` cuya `url` sea `https://app.shager.ai/api/mcp` y cuyos `headers` definan `Authorization` como `Bearer ${env:SHAGER_API_KEY}`. Cursor toma la variable de tu entorno, se conecta por HTTP y el agente obtiene las herramientas de Shager. Sin servidor local y sin puentes.

Cursor es un lugar interesante para manejar la distribución porque el material de origen ya está en el repositorio: changelogs, documentación, notas de versión, borradores del blog. Esta guía configura bien la conexión y después la pone a trabajar justo en eso.

## ¿Cómo se ve la configuración MCP de Cursor para un servidor remoto?

La [documentación de MCP de Cursor](https://cursor.com/docs/context/mcp) muestra un servidor remoto como una `url` más un objeto `headers` opcional, y documenta la interpolación `${env:NAME}` en los campos `url` y `headers`. También indica dos ubicaciones: `.cursor/mcp.json` dentro de un proyecto, para herramientas específicas de ese proyecto, y `~/.cursor/mcp.json` en tu directorio personal, para herramientas disponibles en todas partes.

Para Shager:

```json
{
  "mcpServers": {
    "shager": {
      "url": "https://app.shager.ai/api/mcp",
      "headers": {
        "Authorization": "Bearer ${env:SHAGER_API_KEY}"
      }
    }
  }
}
```

Y en el perfil de tu shell:

```bash
export SHAGER_API_KEY="shgr_live_your_key_here"
```

Cursor lee las variables de entorno del proceso que lo abrió. En macOS, una app abierta desde el Dock puede no ver las variables que definiste en `~/.zshrc`. Si el servidor falla con un 401 aunque la clave sea correcta, cierra Cursor y ábrelo desde una terminal con `cursor .` para confirmar que esa es la causa.

## ¿Archivo del proyecto o archivo global?

| Ubicación | Ideal para | Ojo con |
|---|---|---|
| `.cursor/mcp.json` en el repositorio | El repositorio de un sitio de marketing o de documentación donde se trabaja el contenido | Súbelo solo con la forma `${env:...}`, nunca con una clave literal |
| `~/.cursor/mcp.json` | Quieres tener Shager disponible en todos los espacios de trabajo | El agente de cualquier proyecto puede llegar ahora a tus espacios de trabajo de Shager |

Para un desarrollador de agencia que mantiene los sitios de varios clientes, el archivo del proyecto suele ser la mejor opción. En el repositorio del cliente A no debería haber un agente capaz de crear borradores, como si nada, en el espacio de trabajo del cliente B. Combina el archivo del proyecto con una clave cuya organización solo tenga los espacios de trabajo que tienen sentido para ese repositorio o, como mínimo, nombra los espacios de trabajo de forma explícita en tus prompts.

## ¿De dónde sale la clave?

La crea una persona en https://app.shager.ai/dashboard/agents y elige los permisos. Para trabajar dentro de un editor, `read` más `write` es la opción predeterminada correcta: el agente puede subir archivos y crear borradores, pero Shager se niega a programar o publicar sin el permiso `publish`. Si estás haciendo un prototipo y todavía no tienes cuenta, un agente puede crear un entorno de prueba mediante el [registro autónomo](/en/blog/agent-self-signup-and-claim); la receta está publicada en shager.ai/auth.md.

## ¿Cómo compruebas que Cursor ve las herramientas?

Abre la configuración de MCP de Cursor y busca `shager` con estado conectado y su lista de herramientas: `whoami`, `list_workspaces`, `create_workspace`, `list_channels`, `create_connect_link`, `list_groups`, `create_group`, `upload_media_from_url`, `create_post`, `schedule_post`, `request_approval`, `get_post`, `list_posts`, `cancel_post` y `get_analytics`. Si el servidor muestra un error, las tres causas habituales son una variable de entorno que falta, que falte `Bearer` en el valor del encabezado o un error de sintaxis JSON en el archivo.

Después, en el chat del agente:

```text
Call shager whoami and tell me which scopes this key has.
```

## El flujo: un changelog se convierte en borradores por cuenta

Esta es una tarea concreta que encaja muy bien con Cursor. Imagina que mantienes el sitio de un revendedor de software con doce páginas de socios regionales en Facebook e Instagram. En cada versión, alguien reescribe a mano el changelog en publicaciones para redes. Con Shager conectado, el agente puede hacer la primera pasada.

```text
Read CHANGELOG.md and take the entry for v4.2 only.
In Shager workspace "Brightline Partners":
1. list_groups and use the group "Regional partners".
2. list_channels so you know each channel's name and network.
3. Write one short post about v4.2 for a non-technical audience.
4. Create a DRAFT with create_post (no schedule_at):
   group_ids: the "Regional partners" group
   per_channel: a caption per channel that names the region from the channel
   name and varies the opening line; keep facts identical
   cta_url: https://brightline.example/releases/4-2
   campaign: "release-4-2"
   first_comment: "Full notes: " followed by the link
5. Print the post id and a table of channel, caption first line, format.
```

Algunas decisiones de ese prompt son deliberadas.

Los datos no cambian, la redacción sí. `per_channel` reemplaza el texto de cada cuenta, que es el patrón recomendado. Doce copias del mismo texto en páginas relacionadas son justo el tipo de repetición sobre el que advierte nuestro artículo sobre [cómo evitar bloqueos por spam al publicar a escala](/en/blog/avoid-spam-blocks-when-posting-at-scale), y además se ven mal para cualquiera que siga dos de esas páginas.

El enlace se mide por cuenta. Al pasar `cta_url`, Shager crea un enlace corto y un conjunto de UTM distintos para cada cuenta, con `utm_content` identificándola. Después, `get_analytics` devuelve los clics por cuenta y por publicación, así que el socio de cada región puede ver cuánto tráfico generó su página.

El resultado es un borrador. Alguien lo sigue leyendo en Shager antes de que salga, ya sea un revisor interno o el cliente a través de un enlace de aprobación.

## ¿Y si prefieres llamar a la API desde código?

A veces conviene tener esto como un script en el repositorio en lugar de un chat. Un flujo de publicación de versiones en CI, por ejemplo, no debería depender de que alguien abra Cursor. Las mismas operaciones están disponibles por REST, descritas en el [documento OpenAPI](https://app.shager.ai/api/v1/openapi.json). El equivalente del paso 4 en TypeScript:

```typescript
const API = "https://app.shager.ai/api/v1";
const headers = {
  Authorization: `Bearer ${process.env.SHAGER_API_KEY}`,
  "Content-Type": "application/json",
};

const res = await fetch(`${API}/workspaces/${workspaceId}/posts`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    caption: defaultCaption,
    group_ids: [groupId],
    per_channel: captions.map((c) => ({ channel_id: c.channelId, caption: c.text })),
    cta_url: "https://brightline.example/releases/4-2",
    campaign: "release-4-2",
    first_comment: "Full notes: https://brightline.example/releases/4-2",
  }),
});

const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data.id, body.data.status); // a DRAFT post
```

Las respuestas vienen envueltas en `{ "data": ... }` y los errores en `{ "error": { "code", "message" } }`, así que el manejo de errores es igual en todas partes. La [guía rápida de REST](/en/blog/shager-rest-api-quickstart) cubre la secuencia completa.

## Reglas que vale la pena agregar al proyecto

Cursor admite reglas de proyecto, y una regla corta te evita repetir las mismas restricciones en cada prompt. Algo así:

```text
When using the shager MCP server:
Never pass schedule_at unless I explicitly give a date and time.
Always use per_channel captions when posting to more than one account.
Always pass cta_url for any link instead of pasting raw URLs into captions.
Use ISO 8601 with an offset for any time, in the workspace timezone.
```

Las reglas orientan al modelo, no lo obligan. Lo que obliga es el permiso de la clave. Deja `publish` fuera de la clave del editor y la primera regla no se podrá romper aunque el modelo la ignore.

## Preguntas frecuentes

### ¿Cursor funciona con Shager sin OAuth?

Sí. Cursor envía los encabezados que configures, así que la clave de API bearer funciona directamente. El servidor MCP de Shager también admite inicio de sesión con OAuth para los clientes que lo prefieren, pero en Cursor basta con la clave.

### ¿Puedo usar la misma clave en Cursor y en Claude Code?

Puedes, pero es mejor usar claves separadas. Cada llamada queda en el registro de auditoría de Shager bajo la clave que la hizo, y con claves separadas puedes revocar una herramienta sin romper la otra. La configuración de Claude Code tiene su propia guía en esta serie.

### ¿El agente va a publicar de inmediato si le digo “publica esto”?

Solo si la clave tiene el permiso `publish`, una persona reclamó la cuenta y el espacio de trabajo no exige antes la aprobación del cliente. Con una clave de lectura y escritura, la solicitud falla con un 403 claro y no sale nada.

## Siguiente paso

Una vez que la conexión funciona, lo que más rinde es un procedimiento repetible, no prompts ingeniosos. Lee [cómo crear una skill de Claude para Shager](/en/blog/build-a-claude-skill-for-shager) para ver la estructura, ya que esas mismas instrucciones se trasladan bien a reglas de Cursor, y ten a mano la [página para agentes](/en/agents) como referencia de cada herramienta y cada campo.

---
Source: https://shager.ai/es/blog/connect-shager-to-cursor
