# Un servidor MCP sobre tu CMS con Payload

> Cómo exponer tu contenido de Payload CMS por MCP para que un asistente como Claude lo lea y lo cree, con claves de API y permisos por colección.

URL: https://codegea.com/servidor-mcp-sobre-tu-cms-con-payload
CMS · 2026-10-18 · Derian Pinto

MCP (Model Context Protocol) es un estándar para que un asistente de IA pueda usar herramientas externas. Si tu CMS lo habla, el asistente puede **leer tus artículos, crear uno nuevo o corregir un campo** sin que copies y pegues nada. Payload tiene un plugin oficial para esto. Así lo usamos en este sitio.

## Qué consigues

Con el servidor MCP activo, desde un asistente puedes pedir cosas como «lista los artículos de la categoría CMS» o «crea un borrador con este texto». El asistente llama al CMS por el protocolo, con permisos que tú defines, no por la pantalla del panel.

## Paso 1: instala el plugin

```bash
pnpm add @payloadcms/plugin-mcp
```

## Paso 2: elige qué se expone

Lo importante del plugin es lo que **no** activas. En `plugins/index.ts`:

```ts
mcpPlugin({
  userCollection: 'users',
  collections: {
    posts: {
      enabled: true,
      description: 'Artículos del blog, localizados en es y en.',
    },
    projects: {
      enabled: true,
      description: 'Casos y proyectos entregados, localizados en es y en.',
    },
    categories: { enabled: true },
    authors: { enabled: true },
    media: { enabled: { find: true, create: true, update: true } },
  },
  globals: {
    'site-settings': { enabled: true, description: 'Contacto, redes y clientes.' },
    header: { enabled: true, description: 'Menú principal y megamenú.' },
    footer: { enabled: true, description: 'Pie de página.' },
  },
}),
```

Fíjate en tres cosas:

- Solo expones lo que el asistente necesita. Nuestras colecciones de usuarios o de envíos de formularios no aparecen.
- La `description` de cada colección ayuda al asistente a saber para qué sirve. Escríbela como se la explicarías a una persona nueva.
- En `media` se activan solo `find`, `create` y `update`. No hay `delete`.

## Paso 3: controla quién puede entrar

Las claves de API viven en su propia colección. Nosotros ajustamos su control de acceso para que solo usuarios autenticados las gestionen:

```ts
overrideApiKeyCollection: (collection) => ({
  ...collection,
  access: {
    admin: ({ req }) => Boolean(req.user),
    read: authenticated,
    create: authenticated,
    update: authenticated,
    delete: authenticated,
  },
}),
```

## Paso 4: crea una clave y conecta el asistente

En el panel de administración, en la sección **MCP → API Keys**, crea una clave y revisa los permisos que el plugin te deja asignar. Luego, con Claude Code:

```bash
claude mcp add --transport http codegea http://localhost:4000/api/mcp \
  --header "Authorization: Bearer <API_KEY>"
```

El servidor responde en `/api/mcp` de tu propia aplicación. En producción, cambia la URL por la de tu dominio.

## Buenas prácticas

- **Una clave por persona o herramienta**, con los permisos mínimos. Así revocas una sin afectar al resto.
- **No subas la clave al repositorio.** Se guarda en la configuración del asistente, no en el código.
- **Empieza con permisos de lectura** y añade escritura cuando sepas qué necesitas.
- **Revisa lo que crea.** Un asistente puede publicar texto sin revisar. Deja las escrituras en borrador si tu flujo lo permite.
- **Ten en cuenta el contenido que lee.** Lo que está en tu CMS pasa al asistente como contexto; si hay datos privados, no habilites esa colección.

## Cuándo no vale la pena

Si editas contenido unas pocas veces al mes, el panel de siempre es más simple. MCP se paga solo cuando haces tareas repetitivas o por lotes: migrar cien artículos, traducir, revisar campos SEO, subir imágenes con su texto alternativo.

Más sobre el CMS que usamos en [Payload vs Strapi vs Directus](/payload-cms-vs-strapi-vs-directus-en-2026).
