Conectar WordPress a ChatGPT y Claude: puente OAuth
ChatGPT y claude.ai solo conectan servidores MCP con OAuth y WordPress no lo trae. Así lo resolvimos con un Worker que usa contraseñas de aplicación.
Datos a 9 de noviembre de 2026 · especificación MCP 2026-07-28
¿Empiezas con MCP? La lección 1 del curso se lee gratis, sin registro.
Para conectar WordPress a ChatGPT y a Claude hace falta un servidor OAuth, y el MCP Adapter, el plugin oficial que convierte WordPress en servidor MCP, no lo trae. Nosotros lo resolvimos con un puente fino en un Worker de Cloudflare, que usa tu usuario y una contraseña de aplicación de WordPress como inicio de sesión, sin secretos guardados en el Worker.
MCP (Model Context Protocol) es el protocolo con el que un asistente de IA llama a herramientas externas. El cliente es la app del asistente y el servidor es el programa que le ofrece esas herramientas. ChatGPT, claude.ai y los conectores de la app de Claude solo se conectan a servidores MCP remotos con OAuth 2.1. Un Worker es un programa que corre en la red de Cloudflare.
Esto vale a 9 de noviembre de 2026 y puede cambiar pronto. El MCP Adapter sigue en la versión 0.7.1, del 16 de octubre, y hay una propuesta abierta para que traiga su propio servidor OAuth, aún sin fusionar. Si llega, el puente dejará de hacer falta en los sitios que actualicen. Si tarda o cambia, el puente seguirá sirviendo a cualquier WordPress con el adaptador actual.
Es la segunda parte del caso del Ayuntamiento de San Román de los Montes (Toledo). En MCP en WordPress: la web de un ayuntamiento al día con la IA contamos cómo su web se actualiza con frases como «pon un aviso del corte de agua» desde Claude Code. Aquí contamos cómo llegamos también a ChatGPT y a claude.ai. El código del puente es público, con licencia MIT, en mcp-bridge-wordpress.
Vas a ver por qué no conectan, qué opciones miramos, cómo funciona el puente paso a paso y qué falló al montarlo. Te ayuda haber leído el primer artículo y tener a mano el glosario de MCP. OAuth en MCP lo explicamos de principio a fin en la lección APIs externas y autorización, y las cabeceras de cada petición en Cómo viaja una petición.
¿Por qué ChatGPT y claude.ai no se conectan a mi WordPress?
Porque esas apps solo añaden conectores con OAuth, y el MCP Adapter solo entiende usuario y contraseña de aplicación. No tienen ningún campo donde escribir esa contraseña ni forma de enviarla en una cabecera, que es cada uno de los datos de control que viajan con una petición HTTP.
OAuth es el mecanismo de «iniciar sesión con…». La app te manda a una página de inicio de sesión y recibe un token, un permiso temporal, sin ver tu contraseña. Una contraseña de aplicación es otra cosa: una contraseña aparte que creas en tu perfil de WordPress para un programa concreto y que puedes borrar sin cambiar la tuya.
Lo reconocen la propia guía del adaptador para propietarios de sitios y el issue #436, abierto el 3 de noviembre de 2026. La guía propone un cliente de escritorio o un plugin que añada OAuth.
Claude Code, el asistente de Anthropic para la terminal, no tiene ese problema, porque acepta una cabecera Authorization con la contraseña. Así lo conectamos el primer día. ChatGPT y claude.ai, en cambio, llaman a tu web desde los servidores de OpenAI y de Anthropic, y ahí solo cabe OAuth.
¿Qué hay a 9 de noviembre de 2026?
Hay una propuesta oficial seria, pero aún sin fusionar, es decir, sin incluir en el plugin. También hay plugins de terceros con OAuth propio, que no hemos probado, y el servidor MCP de WordPress.com para sitios alojados allí o conectados con Jetpack.
El PR #437, una propuesta de cambio abierta el 4 de noviembre, añade un servidor OAuth 2.1 dentro del adaptador, con clientes registrados a mano y tokens ligados a una contraseña de aplicación. El PR #448, un borrador del 9 de noviembre, se propone añadir CIMD y registro dinámico, dos formas de que el cliente se dé de alta que explicamos más abajo, además de caducidad y renovación de tokens. Su autor lo ha probado con claude.ai y ChatGPT web, entre otros clientes. Para usarlo tendrás que actualizar el plugin y tener HTTPS, enlaces permanentes «bonitos» y el sitio en la raíz del dominio.
La diferencia de diseño está en dónde vive OAuth. En la propuesta vive dentro de WordPress. En el puente vive fuera, en un Worker, y la web no se toca. El precio del puente es un servicio más que mantener, y que la contraseña de aplicación pasa una vez por su formulario.
¿Qué opciones hay y por qué no las elegimos?
El 21 de octubre, antes de escribir el puente, miramos tres caminos: un plugin de OAuth, el proxy local y WebMCP. Hoy hay dos más, y ninguno de los cinco nos daba ChatGPT y claude.ai sin tocar la web del ayuntamiento.
| Opción | Qué resuelve | Clientes | Por qué no nos sirve aquí |
|---|---|---|---|
| Plugin de terceros con OAuth dentro de WordPress | Añade OAuth en la propia web | ChatGPT y claude.ai | Más código en una web pública, que además convive con su plugin de seguridad (opinión nuestra, no los hemos probado) |
Proxy local @automattic/mcp-wordpress-remote |
Traduce stdio (la entrada y salida de un programa local) a HTTP en tu ordenador | Clientes de escritorio | Solo funciona en el ordenador donde lo configuras |
| WebMCP | Herramientas de la página para un agente que navega | Navegador | Sirve para la web pública, no para administrar el contenido |
| WordPress.com o Jetpack | Servidor MCP oficial con OAuth 2.1 | Claude y ChatGPT | El sitio no usa Jetpack; no lo hemos probado |
| Propuesta oficial (#437 y #448) | OAuth dentro del adaptador | Claude, ChatGPT y otros | Sin fusionar a 9 de noviembre de 2026 |
El README del proxy local, en su versión 0.5.5, anuncia OAuth 2.1. Pero se lanza con npx en tu ordenador, así que no llega a ChatGPT ni a claude.ai, y su modo OAuth necesita que WordPress lo ofrezca. No hemos probado ese modo.
La idea: tu contraseña de aplicación como inicio de sesión
El puente no tiene usuarios propios. Cuando ChatGPT o Claude te mandan a iniciar sesión, escribes tu usuario de WordPress y una contraseña de aplicación, el puente pregunta a tu propia web si valen y, si valen, emite el token OAuth.
Eso tiene cuatro consecuencias que nos gustaron:
- No hay ningún secreto fijo en el Worker. La credencial viaja cifrada dentro de los datos del token.
- El asistente tiene los permisos de tu cuenta de WordPress, y ninguno más.
- Revocar el acceso es borrar la contraseña de aplicación en tu perfil.
- Sirve para cualquier WordPress con el adaptador, porque la dirección de la web es una variable.
Lo llamamos fino porque no traduce MCP. Salvo la subida de imágenes, que veremos luego, cada llamada del cliente sale hacia el adaptador tal cual, con la credencial de WordPress en lugar del token.
sequenceDiagram participant C as ChatGPT o Claude participant P as Puente (Worker) participant T as Tú, en el navegador participant W as WordPress C->>P: petición MCP sin token P-->>C: 401 + WWW-Authenticate C->>P: registro (DCR) y /authorize con PKCE P->>T: página «Conectar con WordPress» T->>P: usuario + contraseña de aplicación P->>W: GET /wp-json/wp/v2/users/me (Basic) W-->>P: 200, con permiso edit_posts P-->>C: código de autorización C->>P: POST /token P-->>C: token de acceso (1 h) y de renovación Note over P: la credencial va cifrada en el token C->>P: tools/call con el token P->>W: la misma llamada, con la credencial W-->>P: resultado P-->>C: resultado
Para comprobar la contraseña, el puente hace una sola petición, GET {WP_URL}/wp-json/wp/v2/users/me?context=edit&_fields=id,username,name,capabilities, con la cabecera Authorization: Basic <usuario:contraseña en base64>. Si WordPress responde 200 y la cuenta tiene el permiso edit_posts, el puente aprueba. El token de acceso dura una hora y el de renovación, 30 días.
Las piezas
El puente es un solo Worker con la librería @cloudflare/workers-oauth-provider 1.2.4 y un KV propio. Dentro de WordPress no hace falta nada además del MCP Adapter.
Un KV es el almacén de clave y valor de Cloudflare. El README actual de la librería recomienda dos Workers, uno para autorizar y otro para servir, pero sigue soportando OAuthProvider para uno solo, que es lo que usa el puente. El KV tiene que estar enlazado con el nombre OAUTH_KV. Cómo se despliega un servidor así lo explicamos en Despliegue con Cloudflare.
Según su README, la librería guarda tokens, códigos y secretos solo como hash. Los datos asociados al token, que en el puente incluyen la credencial de WordPress, van cifrados con una clave que solo puede abrir quien tiene el token.
El puente acepta clientes por registro dinámico (DCR), en el que el cliente se da de alta solo. Pero solo admite las direcciones de vuelta de Claude, de ChatGPT y de clientes locales, y cualquier otra recibe invalid_redirect_uri. La documentación de Claude cita https://claude.ai/api/mcp/auth_callback, y el puente admite también la de claude.com por precaución.
¿Cómo añado el conector en ChatGPT y en claude.ai?
Con el puente desplegado, añades su dirección MCP como conector y la app te lleva a su página de inicio de sesión. Allí escribes el usuario y la contraseña de aplicación.
En Claude, ve a Settings > Connectors > Add > Add custom connector y pega la dirección. En ChatGPT, activa antes el modo desarrollador en Settings > Security and login > Developer mode, y después añade el servidor en chatgpt.com/plugins con nombre, descripción y la dirección completa. Para Claude Desktop o Claude Code con un servidor local, mira conectar un servidor MCP a Claude.
El orden de la pantalla de consentimiento
El puente comprueba la contraseña con WordPress antes de aprobar el consentimiento, nunca después. El identificador de cada consentimiento sirve una sola vez, y si lo gastas antes de comprobar, un error al teclear obliga a empezar de cero.
Al abrir la página (GET), el puente prepara el consentimiento con beginConsent, que le da un handle, y guarda los datos de la página en el KV durante 10 minutos. Al enviar el formulario (POST), primero pregunta a WordPress. Solo si la contraseña vale llama a approveConsent y completeAuthorization. Si no vale, el handle sigue sin gastar y puedes volver a intentarlo. Que sea de un solo uso lo aprendimos al montarlo, no en la documentación de la librería.
Un freno a los intentos
El puente admite 5 intentos fallidos cada 15 minutos por dirección IP. Los cuenta en el KV y, al pasar el límite, responde 429. La página de inicio de sesión es pública, y no queríamos dejarla sin límite.
Lo que falló al montarlo
Fueron tropiezos pequeños de despliegue, y te los contamos tal como nos pasaron.
- La página de autorización salía con las cabeceras anti-marco duplicadas. Ahora el puente las fija una sola vez.
- Al principio el puente usaba un KV que ya existía, de otro proyecto. Creamos uno propio.
- El primer
wrangler deployfalló con el error 10007, «This Worker does not exist». Al repetirlo funcionó. - Dejamos desactivadas las URL de vista previa del Worker.
Mcp-Method: el fallo que no vimos con Claude Code
ChatGPT llegó con la versión 2026-07-28 del protocolo y WordPress le respondió 400 «Header mismatch». El puente filtraba las cabeceras con una lista blanca y no reenviaba Mcp-Method, que esa versión exige en todas las peticiones.
La especificación 2026-07-28 añade cabeceras que repiten datos del cuerpo. Mcp-Method lleva el método, como server/discover, y Mcp-Name el nombre de la herramienta en tools/call. server/discover es la llamada con la que el cliente pregunta qué ofrece el servidor, y tools/call la que ejecuta una herramienta. Si no coinciden con el cuerpo, el servidor responde HTTP 400 con el error -32020. Los cambios de cabeceras de esta versión los repasamos en migrar un servidor MCP a 2026-07-28.
Nuestras pruebas no lo detectaron. Claude Code hablaba la versión 2025-11-25, y nuestro script de prueba tampoco dio con el fallo. ChatGPT sí usaba 2026-07-28, y entró con server/discover.
El arreglo fue reenviar todas las cabeceras que empiezan por Mcp-, a la ida y a la vuelta. Así pasa también MCP-Protocol-Version, que el adaptador exige después de initialize y sin la que responde 400. El comentario del código cita el error que vimos: «Header mismatch: Mcp-Method is missing».
Lo encontramos con un registro mínimo por petición, leído con wrangler tail, el comando que muestra en directo los registros del Worker. Anota el método, la versión, las cabeceras mcp-*, el estado que devuelve WordPress y los milisegundos, además del nombre de usuario de WordPress. No guarda tokens, credenciales ni argumentos. Si escribes un proxy MCP, nuestra recomendación es no filtrar las cabeceras con una lista cerrada.
¿Por qué Claude dice que mi cuenta se ha autorizado pero no encuentra el servidor?
Ese mensaje aparece en el issue #361 del adaptador, de gente que pone OAuth delante de WordPress. En los comentarios aparecen dos explicaciones. Una es que WordPress no reconoce el token como un usuario conectado en las peticiones REST y sigue devolviendo 401. La otra es que la primera respuesta sin credenciales no es un 401 con la cabecera WWW-Authenticate.
La documentación de Claude lo confirma. Claude solo empieza el inicio de sesión ante un 401 y no hace caso de WWW-Authenticate si llega en un 200. Además, usa solo el primer servidor de authorization_servers.
Los comentarios del issue, de usuarios y no de documentación, añaden dos detalles. Claude Desktop sondea con server/discover antes de initialize, y ese sondeo debe recibir el mismo 401. El campo resource de los metadatos debe ser la URL completa del endpoint.
El puente cuida también el caso contrario. Si borras la contraseña de aplicación, WordPress responde 401 y el puente devuelve otro 401 con WWW-Authenticate: Bearer error="invalid_token" y la dirección de sus metadatos. Así el cliente te pide volver a conectar.
Subir imágenes desde ChatGPT
ChatGPT solo entrega un archivo adjunto a una herramienta que lo pide en _meta["openai/fileParams"], una extensión de OpenAI que no forma parte de MCP. Las tres herramientas genéricas del adaptador no lo piden, así que el puente añade una propia, subir_imagen.
Con esa declaración, ChatGPT pasa el archivo como un objeto con download_url, file_id, mime_type y file_name (los dos últimos pueden faltar), según su referencia. La download_url es temporal.
El puente hace el resto. Si defines la variable UPLOAD_ABILITY, añade subir_imagen a la respuesta de tools/list, con las carpetas de UPLOAD_FOLDERS. Cuando el cliente llama a esa herramienta, el puente reescribe la petición como una llamada a la capacidad de WordPress que sube imágenes y cambia Mcp-Name a mcp-adapter-execute-ability. Sin esas variables, el puente no añade nada.
Claude, en cambio, puede pasar la imagen como URL o en base64. La capacidad de WordPress que la recibe la contamos en el primer artículo.
Qué escala
Lo que crece está en WordPress, no en el puente. Cuando el ayuntamiento añadió Instalaciones y Asociaciones, en el puente solo cambió una palabra más en la lista de carpetas de imágenes.
Las capacidades nuevas las descubre el cliente solo, a través de las herramientas del adaptador. Lo que no escala igual es el registro dinámico, porque crea un cliente nuevo en cada conexión nueva. La documentación de Claude recomienda CIMD para tráfico alto.
Seguridad: qué te recomendamos
El asistente puede hacer lo mismo que la cuenta de WordPress con la que inicias sesión. Por eso conviene una cuenta propia y con pocos permisos.
- Crea un usuario de WordPress solo para el asistente, con el rol más bajo que le deje hacer el trabajo. El puente exige al menos el permiso
edit_posts. - Usa una contraseña de aplicación por cliente. Si borras una, la siguiente llamada de ese cliente recibe 401 y deja de funcionar.
- No publiques la dirección de tu puente ni el nombre de usuario.
- Revisa quién puede leer el registro del Worker, porque incluye el nombre de usuario.
La página de autorización lleva una política de seguridad de contenido con frame-ancestors 'none', que impide meterla dentro de otra web para engañarte. Los riesgos de dar herramientas a un modelo los repasamos en seguridad en servidores MCP, y el paso de tokens entre servicios en Seguridad avanzada.
¿Cuándo no te hace falta el puente?
Si tu web está en WordPress.com o conectada con Jetpack, puedes usar el servidor MCP de WordPress.com, que trae OAuth 2.1 según su página de soporte. La vía Jetpack no la hemos probado. Y si solo usas Claude Code u otro cliente de escritorio, te basta la contraseña de aplicación en una cabecera o el proxy local. También dejará de hacerte falta si la propuesta oficial se fusiona y actualizas el adaptador.
Si quieres ver un servidor MCP que ya conecta con ChatGPT y Claude, el de este curso sirve de ejemplo: usa el curso desde Claude y ChatGPT. Y si lo que buscas es que los agentes lean tu web pública, es otro tema, que tratamos en web lista para agentes de IA.
Aprende esto en el curso
- Avanzado 10 € APIs externas y autorización · REST, GraphQL y OAuth 2.1 de extremo a extremo
- Básico Gratis Cómo viaja una petición · El protocolo sin estado: qué lleva cada petición y qué vuelve
- Avanzado 10 € Despliegue con Cloudflare · Un servidor remoto en Workers, de despliegue a observabilidad
- Experto 25 € Seguridad avanzada · Modelo de amenazas de MCP y defensas en profundidad
«Cómo viaja una petición» es gratis con una cuenta, igual que el resto del Básico. Sin tarjeta. Si prefieres mirar antes, la lección 1 se lee sin registro.
Crear cuenta y leerla Ir a la lecciónFuentes
- MCP Adapter: guía para propietarios de sitios
- MCP Adapter: versiones publicadas
- MCP Adapter en el directorio de WordPress.org (API de plugins) (2026-10-16)
- MCP Adapter, issue #436: Add support for OAuth2 for MCP Clients (2026-11-03)
- MCP Adapter, PR #437: Add OAuth 2.1 Server (2026-11-04)
- MCP Adapter, PR #448 (borrador): inicio de sesión OAuth sin registro manual (2026-11-09)
- MCP Adapter, issue #361: Your account was authorized, but no MCP server was found (2026-10-01)
- @automattic/mcp-wordpress-remote
- @cloudflare/workers-oauth-provider
- Claude: autenticación de conectores (2026-11-09)
- OpenAI Apps SDK: autenticación (2026-11-09)
- OpenAI Apps SDK: referencia (openai/fileParams) (2026-11-09)
- Especificación MCP 2026-07-28: transportes
- WordPress.com: MCP (2026-11-09)
- mcp-bridge-wordpress (código de referencia del puente, MIT)