Makers Page MCP
Consigue que tu producto sea visto sin el trabajo de marketing.
Documentación
Makers Page MCP
El servidor Model Context Protocol del stack indie — una sola conexión para tus herramientas de fundador, en lugar de conectar un centenar por separado.
Los fundadores independientes ya tienen que lidiar con redes sociales, Stripe, analíticas, GitHub y una base de datos. Cada una suele significar otro MCP, otro bloque de configuración, otro contexto que el agente no comparte. Makers Page MCP agrega esas superficies en un único servidor local que tu agente de código ya entiende, para que pueda redactar un post de lanzamiento con contexto de ingresos, revisar un despliegue o consultar métricas de producto sin saltar de herramienta en herramienta.
makers-page-mcp se ejecuta localmente junto a Cursor, Claude Code, Codex o cualquier otro cliente MCP. La v1 trae X primero: tu agente redacta un post nativo del canal sobre lo que acabas de construir, tú lo apruebas, y sale a través de la API real de X v2. Nada se publica sin un humano en el circuito. Más conectores (pagos, analíticas, GitHub, bases de datos y más) están en el roadmap.
makers.page — el MCP del stack indie que ya conoce tus herramientas.
Tabla de contenidos
Por qué existe esto
La mayoría de los agentes terminan con un montón de servidores MCP — uno para GitHub, uno para Stripe, uno para analíticas, uno para redes sociales — cada uno con su propia autenticación y ninguno comparte contexto. Makers Page MCP es la apuesta contraria: una única conexión de stack indie que ya conoce las herramientas que los fundadores usan de verdad, para que el agente pueda actuar en todo el stack en lugar de gestionar integraciones sueltas.
Hoy eso significa publicación en X con aprobación previa. Después: el resto del stack (ver Roadmap).
- Un solo MCP, no un centenar. Agrega el stack indie (redes sociales, pagos, analíticas, GitHub, bases de datos) detrás de un único servidor local en lugar de un archivo de configuración lleno de conectores sueltos.
- Contexto compartido por diseño. El agente no debería tener que reaprender quién eres y qué has lanzado cada vez que cambia de herramienta.
- Nativo de agentes, no otro panel. Mismo protocolo, mismo archivo de configuración que tus otros servidores MCP. Sin nueva app a la que iniciar sesión.
- Aprobación obligatoria por defecto. Cada post es un
drafthasta que llamas explícitamente aapprove_draft.publish_draftse niega a publicar nada que no haya sido aprobado, a menos que tú mismo lo desactives. El mismo patrón se aplicará a cualquier cosa que gaste dinero o publique contenido públicamente. - Construido para llamadas API reales de pago. La API de escritura de X cuesta dinero por post (ver abajo). La separación borrador/aprobación/publicación existe para que un agente nunca pueda hacer spam a tu cuenta ni a tu cartera.
- A prueba de caídas por diseño. La publicación usa escrituras atómicas de archivos, bloqueos con llave alrededor de operaciones concurrentes sobre el mismo borrador, y una división de errores en tres vías (fallo definitivo, fallo de red ambiguo, error inesperado) para que una conexión caída nunca se convierta en un post duplicado silencioso.
- Local primero. Los borradores y las credenciales viven en tu máquina (
~/.local/share/makers-page-mcp,~/.config/makers-page-mcp), escritos con permisos0600, no en la nube de otra persona. - Cero dependencia de proveedor. Es un servidor MCP stdio distribuido en npm bajo licencia MIT. Lee el código fuente, haz un fork, haz self-hosting.
Cómo se compara
| Manual / saltando entre navegadores | Un MCP por herramienta | Zapier / Make | Makers Page MCP | |
|---|---|---|---|---|
| Vive dentro de tu agente de código | No | Sí | No | Sí |
| Una conexión para el stack indie | No | No (N configs) | Parcial (N apps) | Sí (agrega) |
| Contexto compartido entre redes, dinero, código, datos | No | No | Solo con pegamento | Sí (destino) |
| Aprobación humana antes de publicar o gastar | Depende de ti | Depende de cada servidor | No (auto-triggered) | Sí, por defecto |
| Código abierto / self-hostable | (n/d) | Varía | No | Sí (MIT) |
| Dónde viven los datos | En ti | Mixto | Sus servidores | Tu máquina |
La v1 cubre la publicación en X hoy; las columnas del agregador describen hacia dónde se dirige este MCP del stack indie.
Costo por post
A partir de 2026, la API de X es de pago por uso para cuentas de desarrollador de autoservicio: crear un post cuesta $0.015 (texto plano) o $0.20 (si el post contiene una URL), cargado contra créditos que preparas en la consola de desarrollador de X. Ya no hay nivel de escritura gratuito. Cada llamada a publish_draft es un cargo real: trátala como tal (aprueba deliberadamente, no automatices publicaciones de prueba en masa).
Inicio rápido
1. Crea una app de desarrollador de X
- Ve al portal de desarrolladores de X y crea (o abre) un proyecto + app.
- En User authentication settings, habilita OAuth 2.0.
- Configura App permissions a Read and write.
- Configura el Type of App a Web App, Automated App or Bot (esto te da un Client ID, y un Client Secret si es confidencial).
- Añade un Callback URI / Redirect URL de coincidencia exacta:
http://127.0.0.1:8879/callback(debe ser un host loopback:127.0.0.1,localhosto::1— los URI que no sean loopback se rechazan en el momento de la autenticación). - Copia el Client ID (y el Client Secret, si se muestra).
2. Instalación
Elige una:
Opción A: npm (recomendada, sin necesidad de clonar)
npx -y makers-page-mcp-auth # run once to authorize, see step 3
npx/bunx descargan y almacenan en caché el paquete en la primera ejecución; no hay nada que compilar tú mismo.
Opción B: desde el código fuente
git clone https://github.com/alexcloudstar/makers.page-mcp.git
cd makers.page-mcp/mcp
bun install
bun run build
3. Configura credenciales y autoriza
Configura estas variables de entorno (de tu app de desarrollador de X, paso 1):
export TWITTER_CLIENT_ID=your-client-id
export TWITTER_CLIENT_SECRET=your-client-secret # omit if your app is a public client
export TWITTER_REDIRECT_URI=http://127.0.0.1:8879/callback # must match the portal exactly
Si estás compilando desde el código fuente, puedes copiar .env.example a .env y completar los mismos valores. Bun carga .env automáticamente para cualquier cosa ejecutada con bun (bun run auth, bun run dev, bun dist/index.js). .env está en gitignore, así que tus claves nunca se commitean.
Ejecuta el flujo de autorización de una sola vez:
npx -y makers-page-mcp-auth # npm install
bun run auth # from source
Esto imprime una URL de autorización: ábrela, inicia sesión con la cuenta de X desde la que quieres publicar y aprueba. El servidor captura la redirección localmente y almacena un token de acceso + actualización en ~/.config/makers-page-mcp/credentials.json. Los tokens se renuevan automáticamente en usos futuros; vuelve a ejecutar la autenticación si revocas el acceso, o después de actualizar a una versión que añada scopes (p. ej. media.write para subidas de imágenes/GIFs/videos).
4. Conéctalo a tu agente de código
Añádelo a tu mcp.json de Cursor (Settings → MCP, o ~/.cursor/mcp.json). La misma forma funciona con Claude Desktop/Code, Codex, GitHub Copilot y otros clientes MCP, solo que en el archivo de configuración propio de cada herramienta:
Si lo instalaste vía npm:
{
"mcpServers": {
"makers-page": {
"command": "npx",
"args": ["-y", "makers-page-mcp"],
"env": {
"TWITTER_CLIENT_ID": "your-client-id",
"TWITTER_CLIENT_SECRET": "your-client-secret",
"TWITTER_REDIRECT_URI": "http://127.0.0.1:8879/callback"
}
}
}
}
(bunx funciona igual si prefieres usar Bun: "command": "bunx", "args": ["-y", "makers-page-mcp"].)
Si lo compilaste desde el código fuente:
{
"mcpServers": {
"makers-page": {
"command": "bun",
"args": ["--env-file=/absolute/path/to/mcp/.env", "/absolute/path/to/mcp/dist/index.js"]
}
}
}
La carga automática de .env de Bun es relativa al directorio de trabajo del proceso, que la mayoría de los clientes MCP no garantizan que sea mcp/. La bandera explícita --env-file de arriba apunta directamente a tu .env sin importar desde dónde se lance el servidor, para que no tengas que duplicar credenciales dentro de mcp.json.
Funciona con cualquier cliente MCP
Este servidor solo usa el transporte estándar MCP stdio: sin extensiones específicas de cliente, sin requisito remoto/HTTP. Eso significa que el mismo bloque command/args/env de arriba funciona en todas partes, solo que en el archivo de configuración propio de cada cliente:
| Cliente | Archivo de configuración |
|---|---|
| Cursor | ~/.cursor/mcp.json (o Settings → MCP) |
| Claude Desktop | claude_desktop_config.json |
| Claude Code | .mcp.json (proyecto) o ~/.claude.json (usuario) |
| OpenAI Codex (CLI, Desktop, extensión IDE) | ~/.codex/config.toml, o ejecuta codex mcp add makers-page -- npx -y makers-page-mcp |
| Google Gemini CLI | ~/.gemini/settings.json (global) o .gemini/settings.json (proyecto), o gemini mcp add |
| GitHub Copilot (VS Code, Copilot SDK) | .vscode/mcp.json o mcp.json |
| Windsurf (Cascade) | ~/.codeium/windsurf/mcp_config.json, misma forma command/args que Cursor |
| Cline (extensión VS Code / JetBrains) | su panel de configuración de MCP, o el cline_mcp_settings.json subyacente |
| Zed | settings.json → context_servers |
| JetBrains AI Assistant (IntelliJ, PyCharm, WebStorm, ...) | Settings → Tools → AI Assistant → MCP Servers → Add (stdio) |
Todos estos leen el mismo JSON de estilo mcpServers (Gemini CLI y JetBrains usan claves de nivel superior ligeramente diferentes, mcpServers y un formulario de UI respectivamente, pero los mismos campos command/args/env debajo). Si tu herramienta de preferencia no está en la lista pero soporta MCP sobre stdio, la configuración de arriba debería funcionar sin cambios.
Herramientas
| Herramienta | Qué hace |
|---|---|
create_draft | Guardar una nueva publicación en borrador para X. Obligatorio: { channel: "x", text }. Opcional: parts (hilo), poll, mediaPaths (rutas locales absolutas, máx. 4), quoteTweetId, communityId, shareWithFollowers, paidPartnership, allowLinksInMainPost. No se permiten enlaces http(s) en la publicación principal — coloca las URLs en parts[1+] a menos que el usuario fuerce explícitamente allowLinksInMainPost. |
list_drafts | Listar borradores, opcionalmente filtrados por estado (draft, approved, rejected, publishing, published, deleted). |
get_draft | Obtener un borrador individual por id. |
update_draft | Editar el contenido de un borrador (mismos campos que en crear; pasa null para limpiar un campo opcional). Restablece un borrador aprobado o rechazado a draft para que pueda volver a aprobarse. |
approve_draft | Marcar un borrador como aprobado. Obligatorio antes de publicar (salvo que las aprobaciones estén desactivadas). |
reject_draft | Marcar un borrador como rechazado. También reconcilia un borrador atascado en publishing cuando no se publicó nada (sin ids en vivo registrados). Si se registraron ids en vivo, usa delete_published_draft en su lugar. |
publish_draft | Publicar un borrador aprobado en X mediante POST /2/tweets (sube los medios primero cuando sea necesario; los hilos responden a la parte anterior). Devuelve la(s) URL en vivo. Si la solicitud falla de forma ambigua (p. ej., un timeout) o un hilo falla a mitad de camino, el borrador queda en publishing en lugar de reintentarse automáticamente. |
edit_published_draft | Editar la publicación raíz de un borrador publicado (edit_options.previous_post_id). Vuelve a adjuntar medios/cita cuando estén presentes. Cada edición crea un nuevo id de publicación, que se almacena localmente. Rechaza encuestas y publicaciones de comunidades. |
delete_published_draft | Eliminar cada id de publicación almacenado en X siempre que haya ids en vivo registrados (publicados, publishing parcial o registros heredados/corruptos), y luego marcar el borrador local como deleted. |
get_x_account | Comprobar el estado de la conexión y mostrar el @handle conectado. |
lookup_x_user | Resolver un @handle a un id de usuario (y elegibilidad para MD). |
get_dm_rate_limit | Mostrar los límites locales de envío de MD y el uso actual. |
create_dm_draft | Guardar un borrador de MD. Obligatorio: text más un destinatario: recipientId/recipientUsername (1:1), participantIds/participantUsernames con conversationType: "group" (grupo nuevo) o conversationId (respuesta). Opcional: una entrada de mediaPaths. |
list_dm_drafts | Listar borradores de MD, opcionalmente filtrados por estado (draft, approved, rejected, sending, sent, deleted). |
get_dm_draft | Obtener un borrador de MD individual por id. |
update_dm_draft | Editar un borrador de MD (pasa null para limpiar campos opcionales). Restablece los borradores aprobados a draft. |
approve_dm_draft | Marcar un borrador de MD como aprobado. Obligatorio antes de enviar (salvo que las aprobaciones estén desactivadas). |
reject_dm_draft | Marcar un borrador de MD como rechazado, o reconciliar uno atascado en sending. |
send_dm_draft | Enviar un MD aprobado mediante la API de X. Aplica los límites locales de tasa. |
list_dm_events | Leer eventos recientes en un hilo de MD 1:1 (participantId o username). |
list_dm_inbox | Leer eventos de MD recientes en todas las conversaciones (vista de bandeja de entrada para el contexto del agente). |
list_dm_conversation_events | Leer eventos recientes en una conversación por conversationId (hilo 1:1 o de grupo). |
get_x_post_metrics | Obtener impresiones, me gusta, reposts, respuestas, citas y marcadores de hasta 100 ids de publicación. |
get_x_account_summary | Impresiones y participación por día calendario mediante GET /2/tweets/analytics (alineado con la analítica de la cuenta x.com). Totales del período y publicaciones principales de la ventana. |
analyze_x_posting_times | Análisis por hora del día: impresiones promedio y tasa de participación según cuándo publicaste. |
get_top_engagers | Clasificar quién comentó más en tus publicaciones X de nivel superior para un día calendario determinado (por defecto ayer, con reconocimiento de zona horaria). Encuentra las publicaciones de nivel superior que iniciaste ese día mediante GET /2/users/:id/tweets y, para cada una, extrae cada respuesta en la conversación de esa publicación mediante GET /2/tweets/search/recent (barre todas las respuestas en cualquier parte de un hilo, no solo la raíz), excluyéndote a ti mismo. Clasifica a los comentaristas por número de comentarios y luego por me gusta en sus comentarios. Solo lectura; sin borradores. Se aplica el mismo límite de Búsqueda Reciente de 7 días que en be_trendy para fechas más antiguas. |
be_trendy | Descubrir qué está en tendencia ahora mismo en X dentro de un nicho de producto específico, mediante Búsqueda Reciente de X limitada al nicho/palabras clave, no a la lista global genérica de tendencias de X. Obligatorio: productName, productDescription, niche, targetAudience. Opcional: keywords, language. Filtra spam y casi duplicados, y luego devuelve trendingTopics puntuados (con tweets de muestra y cifras de participación), painPointSignals (publicaciones con señales de demanda que piden recomendaciones/alternativas) y un recommendation de sincronización de publicación. No genera contenido por sí mismo: usa los datos devueltos más el contexto del producto para redactar la publicación real. |
create_retweet_draft | Guardar un borrador de retweet o deshacer-retweet para un id de publicación. No se ejecuta hasta que se apruebe. |
list_retweet_drafts | Listar borradores de retweet/deshacer, opcionalmente filtrados por estado. |
get_retweet_draft | Obtener un borrador individual de retweet/deshacer por id. |
approve_retweet_draft | Marcar un borrador de retweet/deshacer como aprobado (obligatorio antes de la ejecución salvo que las aprobaciones estén desactivadas). |
reject_retweet_draft | Marcar un borrador de retweet/deshacer como rechazado; también reconcilia borradores atascados en ejecución. |
retweet_post | Retweetear un borrador aprobado inmediatamente mediante POST /2/users/:id/retweets. |
undo_retweet | Deshacer un borrador de retweet aprobado mediante DELETE /2/users/:id/retweets/:tweet_id. |
Flujo típico del agente: create_draft → mostrar el borrador al usuario → el usuario dice "aprobar" → approve_draft → publish_draft. |
Flujo típico de retweet: create_retweet_draft → el usuario aprueba → approve_retweet_draft → retweet_post (o undo_retweet para borradores de deshacer).
Flujo típico de MD: lookup_x_user (opcional) → create_dm_draft → el usuario aprueba → approve_dm_draft → send_dm_draft.
Para responder en contexto: list_dm_inbox o list_dm_conversation_events → redactar con conversationId → aprobar → enviar.
Flujo típico de descubrimiento de tendencias: be_trendy → el agente redacta una publicación a partir de los trendingTopics/painPointSignals devueltos → create_draft → el usuario aprueba → publish_draft.
Campos de creación/actualización de X
| Campo | Notas |
|---|---|
text | Texto principal de la publicación. Debe ser igual a parts[0] cuando parts está definido. En update_draft, si se envían tanto text como parts y discrepan, text gana y se convierte en parts[0]. Sin URLs http(s) a menos que allowLinksInMainPost sea verdadero. |
parts | Hilo de 2 o más publicaciones. Cada parte posterior a la primera responde a la anterior (cadena de hilo estándar de X). Coloca todos los enlaces en parts[1+], nunca en la publicación principal. No se permiten encuestas en los hilos. |
poll | { options: string[2..4], durationMinutes: 5..10080 }. Mutuamente excluyente con mediaPaths y quoteTweetId. |
mediaPaths | Rutas locales absolutas (.jpg/.jpeg/.png/.webp/.gif/.mp4), 1–4 archivos. Hasta 4 imágenes, o un GIF, o un video (sin mezclar). Los enlaces simbólicos se rechazan; el MIME/categoría se elige según la extensión del archivo y se verifica con detección de bytes mágicos antes de subir. Requiere reautenticación con media.write (ver más abajo). |
quoteTweetId | Citar otra publicación. Solo para empresas en los niveles de API de X de autoservicio / pago por uso; la herramienta igual lo envía; X puede rechazarlo. |
communityId / shareWithFollowers | Publicar en una Comunidad; shareWithFollowers requiere communityId. |
paidPartnership | Define paid_partnership: true al crear (y al editar si se proporciona). |
allowLinksInMainPost | Optar por no aplicar la prohibición predeterminada de enlaces en la publicación principal. Solo cuando el usuario lo exige explícitamente. |
Advertencias (límites del producto X)
- Enlaces en comentarios, no en la publicación principal: Por defecto,
create_draft/update_draft/edit_published_draftrechazan URLs dehttp://ohttps://entext/parts[0]. Coloca los enlaces en partes posteriores del hilo (parts[1],parts[2], …). Anula solo conallowLinksInMainPost: truecuando el usuario lo fuerce. - Reautenticación para medios: Los alcances de OAuth ahora incluyen
media.write. Si autorizaste antes de este cambio, ejecutamakers-page-mcp-auth/bun run authuna vez más. - Reautenticación para MD: Los alcances de OAuth ahora incluyen
dm.readydm.write. Vuelve a ejecutar la autenticación después de actualizar para enviar o leer MD. - Citas: Los documentos de OpenAPI describen las citas como solo para empresas en autoservicio; espera errores de API en niveles inferiores.
- Edición: Requiere X Premium, aproximadamente una ventana de 30 minutos y hasta 5 ediciones desde la publicación original. Cada edición devuelve un nuevo id de publicación (actualizamos el borrador local). Las encuestas y las publicaciones de comunidades no se pueden editar.
- Respuestas: Las aplicaciones de autoservicio pueden crear auto-hilos (responder a su propia parte anterior). Las respuestas a cuentas de otros están bloqueadas salvo invocación explícita.
- Cashtags: El autoservicio permite como máximo un cashtag (
$TICKER) por publicación. be_trendyrequiere un nivel de API de pago: llama al endpoint de Búsqueda Reciente de X, que necesita al menos un nivel de acceso de API de X Basic de pago. Una aplicación de nivel gratuito recibirá errores 403/429.get_top_engagerstambién usa Búsqueda Reciente, por lo que necesita el mismo nivel de pago y solo ve comentarios de los últimos 7 días, sin importar la antigüedad de la publicación que se esté revisando.
Si un intento de publicación falla de forma ambigua
publish_draft marca un borrador como publishing antes de llamar a la API de X, y solo lo limpia si la API da una respuesta definitiva (una respuesta HTTP real o un error claro de "no autenticado"). Si la solicitud falla de una manera que podría significar que X la recibió de todos modos (un timeout o una caída de red), el borrador se deja deliberadamente en publishing y no se revierte automáticamente, para que un agente no pueda reintentar y arriesgar una segunda publicación real de pago.
Reconciliación:
- No se publicó nada (sin ids en vivo registrados): llama a
reject_draftoupdate_draftpara restablecer. - Hilo parcial (algunos ids registrados): no reintentes
publish_draft. Llama adelete_published_draftpara eliminar las publicaciones en vivo, o completa el resto manualmente en X. - Publicación única ambigua (pudo haberse publicado o no, sin ids registrados): verifica en X tú mismo; si no se publicó, restablece con
reject_draft/update_draft; si se publicó, deja el borrador tal cual y anota la URL.
Configuración
Variables de entorno:
| Variable | Predeterminado | Propósito |
|---|---|---|
TWITTER_CLIENT_ID | (ninguno) | Obligatorio. ID de Cliente OAuth 2.0 de X/Twitter. |
TWITTER_CLIENT_SECRET | (ninguno) | Se define si tu aplicación de X es un cliente confidencial. |
TWITTER_REDIRECT_URI | http://127.0.0.1:8879/callback | Debe coincidir con el callback registrado en el portal de desarrolladores de X y usar un host de loopback (127.0.0.1, localhost o ::1). |
MAKERS_PAGE_CONFIG_DIR | ~/.config/makers-page-mcp | Dónde se almacenan las credenciales. |
MAKERS_PAGE_DATA_DIR | ~/.local/share/makers-page-mcp | Dónde se almacenan los borradores. |
MAKERS_PAGE_REQUIRE_APPROVAL | true | Se establece en false para permitir que los agentes publiquen borradores sin un paso de aprobación separado. |
MAKERS_PAGE_MAX_POST_LENGTH | 280 | Máximo de caracteres por publicación (recuento ponderado de X: las URLs cuentan como 23, los emojis cuentan una vez); auméntalo si estás en X Premium. |
MAKERS_PAGE_MAX_DM_LENGTH | 10000 | Máximo de caracteres por MD. |
MAKERS_PAGE_DM_MAX_PER_HOUR | 10 | Límite local de envíos de MD por hora móvil (antes de llamar a X). |
MAKERS_PAGE_DM_MAX_PER_DAY | 50 | Límite local de envíos de MD por 24 horas móviles. |
MAKERS_PAGE_DM_MIN_INTERVAL_MS | 3000 | Mínimo de milisegundos entre envíos consecutivos de MD. |
Hoja de ruta
Destino: un MCP local de stack indie que ya conoce las herramientas del fundador — redes sociales, pagos, analíticas, GitHub, bases de datos — para que no mantengas cien conexiones separadas. v1 incluye solo X, a propósito: probar el bucle de escritura con aprobación antes de añadir más superficies que gasten dinero o publiquen públicamente.
Lanzado
- X gestionar publicaciones: texto, hilos, encuestas, medios (subida por partes), cita, comunidad +
share_with_followers, asociación de pago, editar y eliminar — aún detrás de borrador → aprobar → publicar con semántica segura ante fallos / sin reintento automático. - X mensajes directos: borrador → aprobar → enviar (texto 1:1, adjunto multimedia, conversaciones de grupo) con límites de velocidad locales; leer bandeja de entrada y eventos de hilo; búsqueda de
@handle. - X analíticas (solo lectura): métricas de publicaciones, resumen de cuenta (hoy + publicaciones principales), análisis de tiempo de publicación. Sin base de datos local; obtiene datos de la API de X bajo demanda.
- X retweets: borrador → aprobar →
retweet_post/undo_retweet(inmediato; sin programar). be_trendy: descubrimiento de tendencias de X por nicho mediante Recent Search, filtrado de spam/duplicados, y temas de tendencia puntuados + señales de demanda para fundamentar el contenido que escribe el agente (sin llamada LLM dentro de la propia herramienta).
Siguiente
- Más redes sociales — LinkedIn, Reddit, Threads, Bluesky; mismo borrador adaptado al tono y longitud nativos del canal.
- Pagos y código — Stripe (Lemon Squeezy como vía secundaria), GitHub.
- Analíticas y datos — PostHog / Plausible, Postgres vía Supabase / Neon.
- Extras operativos — Resend, Sentry, a medida que se estabiliza el conjunto central.
- Directorios de lanzamiento — investigar lanzamientos y redactar copia de listados donde sea útil; enviar solo donde exista una API estable o una ruta de escritura MCP de primera clase. Hoy eso es escaso: los MCP comunitarios de Product Hunt son de solo lectura (la API de PH no tiene mutación de crear publicación), los MCP de escritura de Hacker News hacen scraping del inicio de sesión del navegador (sin API de escritura pública), y Peerlist / BetaList / Uneed / Fazier / Microlaunch / Dev Hunt / Tiny Launch no tienen MCP para envíos. Los registros de MCP (registro oficial, Smithery, PulseMCP, Glama, mcp.so) sirven para listar este servidor, no para enviar tu producto a plataformas de lanzamiento.
Siempre
- Borradores y credenciales solo locales, sin importar qué conectores lleguen.
- Puertas de aprobación para cualquier cosa que publique públicamente o gaste dinero.
¿Quieres que un conector tenga prioridad? Abre un issue.
Desarrollo
bun test # run the unit test suite
bun run typecheck
FAQ
¿Esto publica automáticamente, sin que yo lo vea primero?
No, no por defecto. Cada borrador comienza en estado draft, y publish_draft se niega a ejecutarse a menos que el borrador haya pasado por approve_draft primero. Puedes desactivar esa puerta con MAKERS_PAGE_REQUIRE_APPROVAL=false si confías completamente en el flujo, pero es optativo.
¿Es un servicio alojado? ¿A dónde van mis datos?
Es un proceso local. Los borradores, borradores de DM, borradores de retweet y el estado de límite de velocidad se almacenan como archivos bajo MAKERS_PAGE_DATA_DIR (por defecto ~/.local/share/makers-page-mcp); tus tokens OAuth de X viven bajo MAKERS_PAGE_CONFIG_DIR (por defecto ~/.config/makers-page-mcp/credentials.json). Todos estos archivos se escriben con permisos 0600. Nada pasa por un servidor de terceros; el servidor habla directamente con api.x.com.
¿Por qué crear una publicación cuesta dinero?
Es una decisión de precios de la API de X, no de este proyecto. Desde 2026 no hay un nivel de escritura gratuito para la API de X; consulta Costo por publicación arriba para las tarifas actuales. La puerta de aprobación existe precisamente para que un agente no pueda acumular una factura por accidente.
¿Qué pasa si la publicación falla a mitad de camino?
Consulta Si un intento de publicación falla de forma ambigua. Versión corta: los fallos definitivos revierten el borrador automáticamente; cualquier cosa ambigua (tiempos de espera, conexiones caídas) se deja en publishing para que la revises y reconcilies manualmente, así nunca obtienes una doble publicación silenciosa.
¿Esto funciona con agentes distintos de Cursor?
Sí. Es un servidor MCP stdio estándar sin extensiones específicas de cliente, así que funciona en cualquier lugar donde se soporte MCP: Claude Desktop/Code, OpenAI Codex, Gemini CLI, GitHub Copilot, Windsurf, Cline, Zed, JetBrains AI Assistant y más. Consulta Funciona con cualquier cliente MCP.
¿Puedo autoalojar o bifurcar esto en lugar de usar el paquete npm?
Sí, tiene licencia MIT. Consulta Opción B: desde el código fuente para compilarlo tú mismo, y CONTRIBUTING.md si quieres enviar cambios de vuelta al proyecto original.
Contribuciones
Las contribuciones son bienvenidas. Consulta CONTRIBUTING.md para la configuración, pruebas y pautas de PR.
Seguridad
¿Encontraste una vulnerabilidad? Por favor no abras un issue público: consulta SECURITY.md para saber cómo reportarla de forma privada.
Licencia
MIT. Consulta el changelog para notas de versión.
Construido por @alexcloudstar para makers.page — el MCP de stack indie.