# CMS Bridge > Pasá tu sitio de WordPress a Medios CMS. **Publicá con tu propio agente.** Conectá tu agente de IA a CMS Bridge y queda vinculado a tus sitios de Medios CMS. Después solo le pedís lo que necesitás: que escriba una nota, que reescriba una noticia a partir de un enlace, que suba las fotos o que actualice algo ya publicado. El agente lo carga directo en tu sitio. Vos decidís si queda en borrador para revisarlo o si sale publicado. Funciona con uno o varios sitios, y la clave de Medios nunca pasa por el agente. ## Docs - [Inicio](https://cmsbridge.dev/): Pasá todas tus notas, imágenes y categorías de WordPress a Medios CMS sin perder nada. Y automatizá tus publicaciones con tu propio agente. - [Ayuda](https://cmsbridge.dev/ayuda): Guías simples para migrar tu sitio a Medios CMS y publicar con tu agente. - [Migrar](https://cmsbridge.dev/migrar): Pasá notas, imágenes y categorías sin copiarlas a mano. Antes de mover nada ves qué pasa y qué se adapta. Tu sitio sigue en línea y hoy es gratis. - [Publicar con un agente](https://cmsbridge.dev/publicar-con-ia): Conectá tu agente por MCP. Escribí una nota, reescribí desde un enlace, subí las fotos y actualizá lo publicado. - [Publicar con tu agente](https://cmsbridge.dev/ayuda/mcp.md): La dirección del servidor, el token, qué puede hacer el agente y los límites. - [Cómo migrar de WordPress a Medios CMS](https://cmsbridge.dev/ayuda/migrar-de-wordpress-a-medios.md): Los siete pasos del asistente, desde la dirección del sitio hasta el resultado. - [Conectar uno o varios sitios](https://cmsbridge.dev/ayuda/mcp/conectar-sitios.md): En Agentes, la caja Conectar otro sitio está arriba. El dominio y una clave que empieza con medios_. - [Preguntas frecuentes](https://cmsbridge.dev/ayuda/preguntas-frecuentes.md): Respuestas cortas sobre la cuenta, la migración, la clave de API y el agente. - [Qué es CMS Bridge](https://cmsbridge.dev/ayuda/que-es-cms-bridge.md): Pasa las notas publicadas de un WordPress a Medios CMS, y deja que tu agente publique en el sitio. - [Seguridad de tus accesos](https://cmsbridge.dev/ayuda/seguridad-de-tus-accesos.md): La clave de API de Medios no se muestra de nuevo. La de una migración se borra al terminar. La de Agentes se queda hasta que la cambies. - [Si el sitio frena la migración](https://cmsbridge.dev/ayuda/migrar-sin-bloqueos.md): Qué hacer cuando WordPress o un filtro de seguridad no deja leer las notas. - [Subir un archivo de Medios](https://cmsbridge.dev/ayuda/subir-un-archivo.md): El zip de un sitio que ya es de Medios. Hasta 4 GB, en partes, y se puede retomar si se corta. - [Cómo crear una cuenta](https://cmsbridge.dev/ayuda/crear-una-cuenta.md): Email, una contraseña de al menos 8 caracteres, y entrás. Cada persona ve solo lo suyo. - [Crear y revocar un token](https://cmsbridge.dev/ayuda/mcp/token.md): El token se muestra completo una sola vez. Empieza con cmsb_. Revocarlo corta el acceso al toque. - [Límites](https://cmsbridge.dev/ayuda/limites.md): El detector permite 10 consultas por hora. Medios admite 2 pedidos por segundo por sitio. El zip llega hasta 4 GB. - [Qué significa el informe de compatibilidad](https://cmsbridge.dev/ayuda/informe-de-compatibilidad.md): Pasa perfecto, se adapta y se pierde. El informe no mueve nada. - [Conectar un agente](https://cmsbridge.dev/ayuda/mcp/conectar.md): Servidor remoto en https://app.cmsbridge.dev/mcp. Entrá con tu sesión o con un token que empieza con cmsb_. - [Pausar, retomar y reiniciar](https://cmsbridge.dev/ayuda/pausar-retomar-y-reiniciar.md): Pausar guarda el punto. Retomar no vuelve a subir lo ya pasado. Reiniciar puede repetir imágenes, no las notas. - [El archivo de redirecciones](https://cmsbridge.dev/ayuda/redirecciones.md): Medios no carga solo las direcciones viejas. Al terminar bajás un archivo y se lo mandás a soporte. - [Buenas prácticas](https://cmsbridge.dev/ayuda/mcp/seguridad.md): El token se muestra una vez, el agente no ve la clave de API de Medios, y revocar corta el acceso al toque. - [Texto completo](https://cmsbridge.dev/llms-full.txt): La ayuda pública y el MCP, en un solo archivo. ## MCP **Publicá con tu propio agente.** Conectá tu agente de IA a CMS Bridge y queda vinculado a tus sitios de Medios CMS. Después solo le pedís lo que necesitás: que escriba una nota, que reescriba una noticia a partir de un enlace, que suba las fotos o que actualice algo ya publicado. El agente lo carga directo en tu sitio. Vos decidís si queda en borrador para revisarlo o si sale publicado. Funciona con uno o varios sitios, y la clave de Medios nunca pasa por el agente. - [Servidor MCP](https://app.cmsbridge.dev/mcp): remoto, Streamable HTTP. OAuth 2.1 con PKCE S256 (registro dinámico en /oauth/register) o Authorization: Bearer cmsb_.... El token se crea en https://app.cmsbridge.dev/agentes. Herramientas: list_sites, publish_article, upload_image, get_publish_status, update_article, request_upload_link, get_upload_status. Límite: 2 solicitudes por segundo por sitio, con reintento automático. Códigos: missing_token, invalid_token, medios_credentials_rejected, rate_limited, site_unknown, invalid_field, busy, internal_error, idempotent_replay. La primera imagen del cuerpo es la principal. En un sitio por API, cover_image llena la portada y también la imagen al compartir, salvo que venga og_image. - [Ayuda de agentes](https://cmsbridge.dev/ayuda/mcp.md): Cómo conectar el sitio, crear el token y publicar. ## Cómo conectar tu agente El servidor MCP es remoto: https://app.cmsbridge.dev/mcp. El transporte es Streamable HTTP. La clave de API de Medios no va en el cliente. El cliente tiene que cumplir dos cosas: hablar MCP remoto por HTTP (Streamable HTTP) y permitir herramientas de escritura. Publicar, actualizar y subir un archivo escriben. Si el cliente solo deja tools de lectura, no puede publicar. Elegí una sola forma de autenticación. No mezcles las dos en el mismo cliente. ### OAuth 2.1 con PKCE S256 PKCE S256 es obligatorio. El cliente descubre los endpoints en estos documentos: - Recurso protegido: https://app.cmsbridge.dev/.well-known/oauth-protected-resource - El mismo documento, con la ruta del servidor: https://app.cmsbridge.dev/.well-known/oauth-protected-resource/mcp - Servidor de autorización: https://app.cmsbridge.dev/.well-known/oauth-authorization-server Ese metadata publica authorization_endpoint https://app.cmsbridge.dev/oauth/authorize, token_endpoint https://app.cmsbridge.dev/oauth/token, registration_endpoint https://app.cmsbridge.dev/oauth/register y revocation_endpoint https://app.cmsbridge.dev/oauth/revoke. code_challenge_methods_supported es solo S256. grant_types_supported son authorization_code y refresh_token. response_types_supported es code. token_endpoint_auth_methods_supported es none: el cliente es público y no usa client_secret. scopes_supported son mcp y offline_access. El alcance tiene que incluir mcp. client_id_metadata_document_supported es verdadero: también se acepta un documento de metadatos del cliente servido por HTTPS. Dynamic Client Registration está soportado. POST https://app.cmsbridge.dev/oauth/register con redirect_uris, de 1 a 8. Tienen que ser https, o http solo en localhost, 127.0.0.1 o ::1. No mandes client_secret. La respuesta es 201 y el client_id empieza con cid_. Desde una misma red entran como máximo 20 clientes en 24 horas. En el cliente, agregá el servidor remoto y elegí OAuth. La persona inicia sesión en CMS Bridge, ve qué aplicación pide acceso y en qué sitios, y autoriza. El redirect_uri tiene que coincidir con el registrado. En localhost y 127.0.0.1 el puerto puede cambiar. El access token dura una hora. El refresh dura 30 días, rota en cada uso y, si se reutiliza, se revoca toda la conexión. ### Token Bearer cmsb_ 1. Entrá a https://app.cmsbridge.dev/agentes. 2. En Token del agente, el nombre es opcional. Si lo dejás vacío, queda como Agente. 3. Pulsá Crear token. Se muestra una sola vez y empieza con cmsb_. No es la clave de API de Medios ni la de la cuenta. 4. El cliente lo manda en cada pedido: `Authorization: Bearer cmsb_...`. Guardalo en una variable de entorno. No lo pegues en el chat. En la base queda solo una huella sha256. Revocarlo en Agentes corta el acceso al toque. Si se perdió, creá otro. Conviene un token por agente. ### Las herramientas Son siete y llegan solas por el protocolo: list_sites, publish_article, upload_image, get_publish_status, update_article, request_upload_link, get_upload_status. list_sites lista los sitios de la cuenta. publish_article publica. update_article reemplaza una nota por su medios_id. upload_image sube un archivo y devuelve su id. get_publish_status consulta por idempotency_key o por medios_id. request_upload_link abre un enlace para que la persona suba una foto desde el navegador. get_upload_status dice si ya está y devuelve el id. ### El límite Medios acepta 2 solicitudes por segundo por sitio. CMS Bridge espera ese cupo antes de cada pedido y, si Medios responde 429, reintenta solo hasta 4 veces mientras alcance el plazo de la operación. Si igual no entra, la tool responde rate_limited con retry_after: el agente espera esos segundos y vuelve a llamar. No reintentes upload_image si el resultado es incierto: la subida no es idempotente. ### Errores - missing_token: el pedido no trae acceso. Con OAuth, que vuelva a autorizar. Con token, que cree uno en Agentes. - invalid_token: el acceso no entra o fue revocado. Autorizar de nuevo, o crear otro token y revocar el viejo. - site_unknown: ese sitio no está conectado en Agentes. - medios_credentials_rejected: la clave de la API no entra, o el complemento está apagado. Que la cargue de nuevo en Agentes. No pidas la clave. - rate_limited: se pasó el cupo de 2 solicitudes por segundo. Usá retry_after y reintentá. - invalid_field: el mensaje dice qué campo falló. - busy: el servidor está ocupado. Reintentá en unos segundos. - internal_error: no trae detalles internos. Que pruebe de nuevo. - idempotent_replay: la misma idempotency_key devuelve la nota que ya estaba, sin duplicarla. - Si la clave no empieza con medios_, no es la de la API. Hay que generarla en Complementos, API. - Si OAuth no vuelve al programa, el redirect_uri no es el registrado. En el loopback el puerto puede ser otro. ## Instrucciones para la IA CMS Bridge pasa un sitio de WordPress a Medios CMS y, después, deja que un agente publique en ese sitio. Seguí este orden. No saltees un paso y no pidas la clave de API de Medios: la persona la pega en Agentes, no en el chat. ### 1. Crear la cuenta Si no tiene cuenta, que se registre en https://app.cmsbridge.dev/register. Si ya tiene, que entre en https://app.cmsbridge.dev/login. Pide un usuario o un email, y una contraseña de 8 a 72 caracteres escrita dos veces. Si aparece una verificación de que no es un robot, que la complete. Al terminar ve Migraciones y Agentes. ### 2. Sacar la clave de API en Medios CMS En el panel del sitio de Medios, en este orden: Panel Principal, Complementos, API. 1. Pulsar Activar. Si el plan no incluye la API, el complemento no se activa: hay que ampliar el plan en Medios. 2. Con el complemento activo, pulsar Generar clave. 3. Ponerle un nombre, por ejemplo CMS Bridge. 4. Elegir una persona del plantel con permiso de administración de artículos y sin rol de moderador. 5. Copiar la clave en ese momento. Se muestra una sola vez y empieza con medios_. Hay hasta 5 claves. Revocar una corta a quien la usaba. La ayuda de Medios está en https://ayuda.medios.io/es-LA/support/solutions/articles/14000168540-api-de-medios-cms. ### 3. Conectar el sitio En https://app.cmsbridge.dev/agentes, caja Conectar otro sitio: el dominio (misitio.com, sin https) y la clave. CMS Bridge la prueba antes de guardarla. Si no entra, no se guarda nada. ### 4. Conectar esta IA al MCP Servidor remoto: https://app.cmsbridge.dev/mcp. Transporte: Streamable HTTP. El cliente tiene que hablar MCP remoto por HTTP y permitir herramientas de escritura. OAuth 2.1 con PKCE S256. Discovery: https://app.cmsbridge.dev/.well-known/oauth-protected-resource y https://app.cmsbridge.dev/.well-known/oauth-authorization-server. Dynamic Client Registration está soportado en POST https://app.cmsbridge.dev/oauth/register. La persona inicia sesión en CMS Bridge y autoriza. Token Bearer: en https://app.cmsbridge.dev/agentes, sección Token del agente, botón Crear token. Empieza con cmsb_, se muestra una sola vez, y va en Authorization: Bearer. No es la clave de Medios. Elegí una sola forma. No las mezcles en el mismo cliente. ### 5. Publicar y programar Pedile el dominio del sitio, por ejemplo misitio.com. No inventes la clave. status published sale en el momento. status draft queda en borrador para revisarla. Para programar, publish_at en publish_article o update_article, en ISO 8601, y status published. Con zona (2026-11-02T09:30:00-03:00 o Z) se respeta. Sin zona, se toma America/Argentina/Buenos_Aires. Solo en un sitio conectado por API. Un borrador no se programa: publish_at con status draft es invalid_field. No puede estar en el pasado (unos minutos de tolerancia) ni a más de un año. La respuesta trae programado y fecha_hora. En un sitio por API, cover_image llena la portada y también la imagen al compartir. Si hace falta otra para compartir, og_image lleva ese id. La primera imagen del cuerpo es la principal. Audio y video MP4, WebM u OGG se suben por la API con upload_image. El tope de 8 MB es solo para imágenes JPEG, PNG, GIF o WebP. Audio y video (MP4, WebM u OGG, y también audio MP3, FLAC o WAV) llegan a 32 MB y se suben con upload_image, solo en un sitio conectado por API. En publish_article, image_url e image_base64 siguen siendo solo imágenes. La extensión sale del tipo real. Si los bytes no se reconocen, la respuesta es 415 y no se usa la extensión del nombre. En el cuerpo, {{multimedia:ID}} inserta el archivo subido. Ejemplo: {{multimedia:4812}}. image_base64 es el archivo directo (base64 crudo o data URI). image_url es un enlace público. Una foto adjunta en el chat no se puede mandar por image_base64: el asistente no tiene el archivo. No lo intentes. Usá request_upload_link, o pedí un enlace público para image_url. El pedido MCP tiene un tope de 12 MB: un archivo de más de unos 9 MB va por image_url, no por base64. body_html admite hasta 500000 caracteres. meta_title llega a 60 y meta_description a 300 (se recomiendan 120 a 160). tags admite como máximo 3. image_caption es el epígrafe de la imagen principal. idempotency_key evita duplicar la nota. get_publish_status consulta por idempotency_key o por medios_id. Estados: published, draft, in_progress, failed, not_found. Medios acepta 2 solicitudes por segundo por sitio. CMS Bridge espera ese cupo y, si Medios responde 429, reintenta solo hasta 4 veces. Si igual vuelve rate_limited, esperá los segundos de retry_after y reintentá. No reintentes upload_image si el resultado es incierto: la subida no es idempotente. No hay tools para listar ni borrar multimedia. Para reusar un archivo hace falta su id. En body_html se conservan iframes https de YouTube (youtube.com y m.youtube.com), youtube-nocookie.com, Vimeo (player.vimeo.com), Facebook (www.facebook.com y web.facebook.com), TikTok (www.tiktok.com) y los widgets de X (platform.twitter.com y platform.x.com), más los blockquote de esas redes. script, object, embed y los iframes de otros hosts se descartan. Ejemplo: . Programar, og_image, audio y video usan la API del sitio conectado. Herramientas: list_sites, publish_article, upload_image, get_publish_status, update_article, request_upload_link, get_upload_status. ### 6. Migrar Una migración nueva de WordPress empieza en https://app.cmsbridge.dev/wizard?nueva=1. Orden: dirección pública del WordPress, detección, destino Medios CMS, informe (todavía no se mueve nada), accesos, migración, resultado. En accesos, el dominio y la clave de API. Si el sitio ya está conectado por API en Agentes, se reutiliza y no hace falta reescribir la clave. Un borrador de origen queda borrador. Lo eliminado no se importa. No se migran eventos, páginas, farmacias, encuestas, publicidades ni suscriptores. Sí se migran audios, videos e iframes. Si la migración se corta y se retoma por el mismo medio, Medios actualiza la nota y no crea otra. Un zip de exportación de Medios se reimporta en https://app.cmsbridge.dev/reimportar, eligiendo un sitio conectado por API. Un backup de WordPress en el asistente todavía no mueve nada. Errores típicos: - missing_token o invalid_token: falta el acceso o se revocó. En OAuth, que vuelva a autorizar. Con token, que cree otro en Agentes. - site_unknown: ese sitio no está conectado en Agentes. - medios_credentials_rejected: la clave de la API no entra, o el complemento está apagado. Que la cargue de nuevo en Agentes. No pidas la clave. - rate_limited: Medios admite 2 solicitudes por segundo por sitio. Usá retry_after y reintentá. - invalid_field: el mensaje dice qué campo falló. - La clave no empieza con medios_: no es la de la API. Hay que generarla en Complementos, API. - Si OAuth no vuelve a la app, el redirect no es el que registró el cliente. Tiene que coincidir exactamente. Imágenes: la imagen principal es la primera del cuerpo. En un sitio por API, cover_image llena la portada y también la imagen al compartir, salvo que venga og_image. La primera imagen del cuerpo es la principal. En un sitio por API, cover_image llena la portada y también la imagen al compartir, salvo que venga og_image. ## Fotos que el usuario adjunta en el chat Esta sección es para el asistente que lee este archivo. La persona adjuntó una foto y la quiere en la nota. ### La forma más simple Llamá a `request_upload_link` con el sitio. Pasale a la persona la URL que devuelve y decile: abrí el enlace, subí la foto y avisame. El enlace dura 15 minutos y sirve una sola vez. Cuando te avise, llamá a `get_upload_status` con el token o el id del enlace. Si está listo, usá el id en `{{multimedia:ID}}` o como portada en `publish_article`. Si te pasa un enlace público de la foto (por ejemplo, el de una imagen de su Centro Multimedia de Medios CMS), mandalo en `image_url` de `publish_article` o `upload_image`. Funciona en todos los asistentes conectados. Con `image_url` la imagen se vuelve a subir, así que queda duplicada en el multimedia. ### Por qué no se puede mandar directo Una foto adjunta en el chat no se puede mandar por image_base64: no tenés el archivo. No lo intentes. Una foto adjunta en el chat no se puede mandar directo: el asistente la ve, pero no recibe el archivo. La única forma de pasarla sería escribir la foto entera como texto dentro de la llamada, y una foto normal son cientos de miles de caracteres. Ningún asistente puede hacerlo. No intentarlo. ### Si podés ejecutar un comando Si podés correr un comando y la foto está guardada como archivo, mandala con ese comando (curl o python) directo a la herramienta, sin escribir la foto. Explicale al usuario estas tres condiciones: 1. La foto tiene que estar guardada como archivo (arrastrarla o darle la ruta). Una imagen pegada del portapapeles no queda como archivo. 2. Hace falta un token cmsb_ creado en https://app.cmsbridge.dev/agentes al alcance de la terminal. El inicio de sesión por OAuth no sirve para el comando. 3. Hay que aprobar el comando o la salida de red. Algunos clientes bloquean la red hasta que la persona lo permite. ### Si no podés Pedile el enlace público de la foto y mandalo en `image_url`. ### Qué decirle al usuario Si podés subir la foto adjunta, explicale las tres condiciones y ofrecé hacerlo. Si no podés, pedile el enlace público de la foto. ## Roadmap CMS Bridge es gratis por ahora. Es un producto de Medios CMS para migrar de WordPress a Medios CMS y conectar agentes que publican directo. Puede sumar servicios. Con la API de Medios se suben imágenes, audios y videos MP4, WebM u OGG. ## Ecosistema Medios CMS es el sistema al que CMS Bridge pasa un sitio de WordPress y en el que el agente publica. El sitio se conecta por la API, que se activa en Panel Principal, Complementos, API. - [llms.txt de Medios CMS](https://medios.io/llms.txt) Snaas es el muro de la comunidad de un medio. Cada muro se inserta en un sitio de Medios CMS con un script embed, en un bloque HTML, para que el medio promueva su comunidad y sus lectores se registren en su Snaas. - [llms.txt de Snaas](https://snaas.ar/llms.txt) ## Contacto El contacto de CMS Bridge es solo por email: hola@cmsbridge.dev. ## In English > CMS Bridge moves a WordPress site to Medios CMS. **Publish with your own agent.** Connect your AI agent to CMS Bridge and it's linked to your Medios CMS sites. Then just ask: write an article, rewrite a story from a link, upload photos or update a published post. It goes straight to your site, as a draft or live, your call. - [Home](https://cmsbridge.dev/): Migrate WordPress content to Medios CMS and publish with your own agent. - [Help](https://cmsbridge.dev/ayuda): Guides for the migration and the agent. - [Migrate](https://cmsbridge.dev/migrar): Move a news site off WordPress without copying articles, images or categories by hand. You see what carries over before anything moves. The site stays online, and it is free today. - [Publish with your agent](https://cmsbridge.dev/publicar-con-ia): Publish with your own AI agent. Write, rewrite from a link, upload photos and update what is already published. - [MCP server](https://app.cmsbridge.dev/mcp): remote, Streamable HTTP. OAuth 2.1 with PKCE S256 (dynamic registration at /oauth/register) or Authorization: Bearer cmsb_.... Create the token at https://app.cmsbridge.dev/agentes. Tools: list_sites, publish_article, upload_image, get_publish_status, update_article, request_upload_link, get_upload_status. 2 requests per second per site, with automatic retry. - [Agents](https://cmsbridge.dev/ayuda/mcp.md): How to connect a site, create a token and publish. - [Full text](https://cmsbridge.dev/llms-full.txt): The public help and the MCP, in one file. ## How to connect your agent The MCP server is remote: https://app.cmsbridge.dev/mcp. The transport is Streamable HTTP. The Medios API key does not go in the client. The client has to do two things: speak remote MCP over HTTP (Streamable HTTP) and allow write tools. Publishing, updating and uploading are writes. A client that only allows read tools cannot publish. Pick one authentication method. Do not mix the two in the same client. ### OAuth 2.1 with PKCE S256 PKCE S256 is required. The client discovers the endpoints in these documents: - Protected resource: https://app.cmsbridge.dev/.well-known/oauth-protected-resource - The same document, at the server path: https://app.cmsbridge.dev/.well-known/oauth-protected-resource/mcp - Authorization server: https://app.cmsbridge.dev/.well-known/oauth-authorization-server That metadata publishes authorization_endpoint https://app.cmsbridge.dev/oauth/authorize, token_endpoint https://app.cmsbridge.dev/oauth/token, registration_endpoint https://app.cmsbridge.dev/oauth/register and revocation_endpoint https://app.cmsbridge.dev/oauth/revoke. code_challenge_methods_supported is only S256. grant_types_supported are authorization_code and refresh_token. response_types_supported is code. token_endpoint_auth_methods_supported is none: the client is public and does not use a client_secret. scopes_supported are mcp and offline_access. The scope has to include mcp. client_id_metadata_document_supported is true: an HTTPS client metadata document is also accepted. Dynamic Client Registration is supported. POST https://app.cmsbridge.dev/oauth/register with redirect_uris, from 1 to 8. They must be https, or http only on localhost, 127.0.0.1 or ::1. Do not send a client_secret. The response is 201 and the client_id starts with cid_. One network can register at most 20 clients in 24 hours. In the client, add the remote server and choose OAuth. The person signs in to CMS Bridge, sees which app is asking and which sites, and approves. The redirect_uri has to match the registered one. On localhost and 127.0.0.1 the port may differ. The access token lasts one hour. The refresh token lasts 30 days, rotates on each use, and reusing it revokes the whole connection. ### Bearer token cmsb_ 1. Open https://app.cmsbridge.dev/agentes. 2. Under Token del agente, the name is optional. If it is left empty, it is stored as Agente. 3. Press Crear token. It is shown once and starts with cmsb_. It is not the Medios API key and it is not the account password. 4. The client sends it on every request: `Authorization: Bearer cmsb_...`. Keep it in an environment variable. Do not paste it in the chat. The database stores only a sha256 fingerprint. Revoking it in Agents cuts access immediately. If it was lost, create another one. One token per agent is the useful split. ### The tools There are seven, and the protocol delivers them: list_sites, publish_article, upload_image, get_publish_status, update_article, request_upload_link, get_upload_status. list_sites lists the account's sites. publish_article publishes. update_article replaces a note by its medios_id. upload_image uploads a file and returns its id. get_publish_status looks up an idempotency_key or a medios_id. request_upload_link opens a link so the person uploads a photo from the browser. get_upload_status says whether it is ready and returns the id. ### The limit Medios accepts 2 requests per second per site. CMS Bridge waits for that quota before each request and, if Medios responds 429, retries on its own up to 4 times while the operation budget allows. If it still cannot, the tool returns rate_limited with retry_after: the agent waits those seconds and calls again. Do not retry upload_image when the result is uncertain: the upload is not idempotent. ### Errors - missing_token: the request has no access. On OAuth, they approve again. With a token, they create one in Agents. - invalid_token: the access was rejected or revoked. Approve again, or create a new token and revoke the old one. - site_unknown: that site is not connected in Agents. - medios_credentials_rejected: the API key was rejected, or the add-on is off. They enter it again in Agents. Do not ask for the key. - rate_limited: the 2-requests-per-second quota was exceeded. Use retry_after and try again. - invalid_field: the message names the field. - busy: the server is busy. Try again in a few seconds. - internal_error: it carries no internal detail. They try again. - idempotent_replay: the same idempotency_key returns the note that already exists, without a duplicate. - If the key does not start with medios_, it is not the API key. Generate it under Complementos, API. - If OAuth does not return to the program, the redirect_uri is not the registered one. On loopback the port may differ. ## Instructions for the AI CMS Bridge moves a WordPress site to Medios CMS and then lets an agent publish on that site. Follow this order. Do not skip a step and do not ask for the Medios API key: the person pastes it in Agents, not in the chat. ### 1. Create the account If they have no account, they register at https://app.cmsbridge.dev/register. If they already have one, they sign in at https://app.cmsbridge.dev/login. It asks for a username or an email, and a password of 8 to 72 characters typed twice. ### 2. Create the API key in Medios CMS In the site panel, in this order: Panel Principal, Complementos, API. Turn the add-on on. If the plan does not include the API, it cannot be turned on. Generate a key, name it, and choose a staff member who can administer articles and is not a moderator. The key is shown once and starts with medios_. There can be up to 5 keys. ### 3. Connect the site At https://app.cmsbridge.dev/agentes, connect the domain (misitio.com, no https) and the key. CMS Bridge tests it before saving it. ### 4. Connect this AI to the MCP Remote server: https://app.cmsbridge.dev/mcp. Transport: Streamable HTTP. The client has to speak remote MCP over HTTP and allow write tools. OAuth 2.1 with PKCE S256. Discovery: https://app.cmsbridge.dev/.well-known/oauth-protected-resource and https://app.cmsbridge.dev/.well-known/oauth-authorization-server. Dynamic Client Registration is supported at POST https://app.cmsbridge.dev/oauth/register. The person signs in to CMS Bridge and approves. Bearer token: at https://app.cmsbridge.dev/agentes, section Token del agente, button Crear token. It starts with cmsb_, is shown once, and goes in Authorization: Bearer. It is not the Medios key. Pick one method. Do not mix them in the same client. ### 5. Publish and schedule Ask for the site domain. Do not invent the key. status published goes live now. status draft stays a draft. To schedule, pass publish_at on publish_article or update_article as ISO 8601, with status published. A timezone (2026-11-02T09:30:00-03:00 or Z) is kept. Without one, it is read as America/Argentina/Buenos_Aires. It only works on a site connected by API. A draft is not scheduled: publish_at with status draft is invalid_field. The date cannot be in the past (a few minutes of tolerance) or more than a year ahead. The tool returns programado and fecha_hora. On an API site, cover_image fills the cover and also the image used when sharing. If another image should be used when sharing, og_image carries that id. The 8 MB cap is only for JPEG, PNG, GIF or WebP images. Audio and video (MP4, WebM or OGG, and also MP3, FLAC or WAV audio) go up to 32 MB through upload_image, only on a site connected by API. On publish_article, image_url and image_base64 stay images. The extension comes from the real type. If the bytes are not recognized, the response is 415 and the name's extension is not kept. In the body, {{multimedia:ID}} inserts the uploaded file. Example: {{multimedia:4812}}. image_base64 is the file itself (raw base64 or a data URI). image_url is a public link. A photo attached in the chat cannot be sent with image_base64: the assistant does not have the file. Do not try. Use request_upload_link, or ask for a public link for image_url. The MCP request caps at 12 MB: a file over about 9 MB goes by image_url, not base64. body_html allows up to 500000 characters. meta_title is up to 60 and meta_description up to 300 (120 to 160 is the useful range). tags takes at most 3. image_caption is the caption of the main image. idempotency_key keeps the note from being duplicated. get_publish_status looks up an idempotency_key or a medios_id. States: published, draft, in_progress, failed, not_found. Medios accepts 2 requests per second per site. CMS Bridge waits for that quota and, if Medios responds 429, retries on its own up to 4 times. If the tool still returns rate_limited, wait the retry_after seconds and try again. Do not retry upload_image when the result is uncertain: the upload is not idempotent. There is no tool to list or delete multimedia. Reusing a file takes its id. body_html keeps https iframes from YouTube (youtube.com and m.youtube.com), youtube-nocookie.com, Vimeo (player.vimeo.com), Facebook (www.facebook.com and web.facebook.com), TikTok (www.tiktok.com) and the X widgets (platform.twitter.com and platform.x.com), plus blockquotes from those networks. script, object, embed and iframes from other hosts are dropped. Example: . Scheduling, og_image, audio and video use the API of the connected site. ### 6. Migrate A new WordPress migration starts at https://app.cmsbridge.dev/wizard?nueva=1. Order: public WordPress URL, detection, Medios CMS as the destination, the report, access (domain and API key, or a site already connected by API), migration, result. Origin drafts stay drafts. Deleted items are not imported. Events, pages, pharmacies, polls, ads and subscribers are not migrated. Audio, video and iframes are. If the migration stops and is resumed on the same site, Medios updates the note and does not create another. A Medios export zip is reimported at https://app.cmsbridge.dev/reimportar, on a site connected by API. Typical errors: - missing_token or invalid_token: access is missing or was revoked. On OAuth, approve again. With a token, create a new one. - site_unknown: that site is not connected in Agents. - medios_credentials_rejected: the API key was rejected, or the add-on is off. They enter it again in Agents. Do not ask for the key. - rate_limited: Medios allows 2 requests per second per site. Wait for retry_after and try again. - invalid_field: the message names the field. - If OAuth does not return to the app, the redirect URI is not the registered one. It has to match exactly. Images: the main image is the first one in the body. On an API site, cover_image fills the cover and also the image used when sharing, unless og_image is set. ## Photos the user attaches in the chat This section is for the assistant reading this file. The person attached a photo and wants it in the article. ### The simplest way Call `request_upload_link` with the site. Give the person the URL it returns and say: open the link, upload the photo and tell me. The link lasts 15 minutes and works once. When they say it is done, call `get_upload_status` with the token or the link id. If it is ready, use the id in `{{multimedia:ID}}` or as the cover in `publish_article`. If they give you a public link of the photo (for example, the one for an image in their Centro Multimedia de Medios CMS), send it in `image_url` of `publish_article` or `upload_image`. It works in every connected assistant. With `image_url` the image is uploaded again, so it ends up duplicated in the multimedia. ### Why it cannot be sent directly A photo attached in the chat cannot be sent with image_base64: you do not have the file. Do not try. A photo attached in the chat cannot be sent directly: the assistant sees it, but does not receive the file. The only way to pass it would be to write the whole photo as text inside the call, and a normal photo is hundreds of thousands of characters. No assistant can do that. Do not try. ### If you can run a command If you can run a command and the photo is saved as a file, send it with that command (curl or python) straight to the tool, without writing the photo. Explain these three conditions to the user: 1. The photo has to be saved as a file (drag it in or give the path). An image pasted from the clipboard is not saved as a file. 2. A cmsb_ token created at https://app.cmsbridge.dev/agentes has to be available to the terminal. Signing in with OAuth does not work for the command. 3. The command or the outbound network has to be approved. Some clients block the network until the person allows it. ### If you cannot Ask for the public link of the photo and send it in `image_url`. ### What to tell the user If you can upload the attached photo, explain the three conditions and offer to do it. If you cannot, ask for the public link of the photo. ## Roadmap CMS Bridge is free for now. It is a Medios CMS product for moving a site from WordPress to Medios CMS and for connecting agents that publish straight to the site. It may add services. Images, audio and MP4, WebM or OGG video go up through the Medios API. ## Ecosystem Medios CMS is the system CMS Bridge moves a WordPress site to, and the system the agent publishes on. The site connects through the API, turned on under Panel Principal, Complementos, API. - [Medios CMS llms.txt](https://medios.io/llms.txt) Snaas is a news outlet's community wall. Each wall is inserted into a Medios CMS site with an embed script, in an HTML block, so the outlet can promote its community and its readers can register on its Snaas. - [Snaas llms.txt](https://snaas.ar/llms.txt) ## Contact CMS Bridge can be reached only by email: hola@cmsbridge.dev.