Social Broadcast MCP
Allows publishing posts with images or videos to Facebook Pages or profiles via the Meta Graph API, using your own OAuth credentials and the pages_manage_posts permission.
Allows publishing images, videos, Reels, and Stories to Instagram Business or Creator accounts linked to a Facebook Page via the Meta Graph API.
Allows uploading videos to YouTube with configurable visibility (private, unlisted, or public) via the YouTube Data API v3.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Social Broadcast MCPPost this video to my YouTube channel and Instagram Reels"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Social Broadcast MCP
MCP server open source (MIT) for publishing to social media (Facebook, Instagram, YouTube) using the official APIs of each platform, with your own OAuth credentials.
No central service. No plans. No artificial limits. No payment middlemen.
Why does it exist?
SaaS tools (SocialCannon, PostFast, Buffer...) charge a monthly subscription and impose limits (accounts, posts, media uploads). This project does the same thing —posting from an AI agent (Hermes, Claude, etc.)— but each user connects their own accounts with their own developer apps. Free forever.
⚠️ Key difference vs SaaS: they already have apps approved by Meta/Google with full review. Here you create your own app (for free) and use it for your own accounts. That is valid for personal/own business use, and it avoids Meta App Review, which is only required for public access to third-party accounts.
Related MCP server: Meta Social MCP
Platforms
Platform | Status | API | Media | Notes |
✅ | Meta Graph API | image, video | Page or profile with | |
✅ | Meta Graph API | image, video, Reels, Stories | Requires a Business/Creator account linked to a FB page | |
YouTube | ✅ | Meta Graha API | video | Uploads with |
TikTok | 🔜 | API de Contenido Público de TikTok | video | Requires TikTok audit (2–6 weeks); pattern documented in |
X/Twitter | ⚠️ | API v2 | image, video | X's free tier is very limited; documented in |
Installation
git clone https://github.com/tu-usuario/social-broadcast-mcp.git
cd social-broadcast-mcp
npm install
npm run buildConfiguration in Hermes (or any MCP client)
# ~/.hermes/config.yaml (o config del perfil)
mcp_servers:
social-broadcast:
command: "node"
args: ["/ruta/a/social-broadcast-mcp/dist/index.js"]Or in any compatible MCP client:
{
"mcpServers": {
"social-broadcast": {
"command": "node",
"args": ["/ruta/a/social-broadcast-mcp/dist/index.js"]
}
}
}Usage
1. Connect Facebook and Instagram
You need to create an app at developers.facebook.com (see docs/SETUP_META.md) and get:
App ID (clientId)
App Secret (clientSecret, only needed in development)
Then, from the agent:
connect_meta(clientId: "TU_APP_ID", clientSecret: "TU_APP_SECRET")The browser opens → you authorize with your account → the accounts will be saved locally in the process.
2. Connect YouTube
Create a project in Google Cloud Console with the YouTube Data API v3 (see docs/SETUP_YOUTUBE.md):
connect_youtube(clientId: "TU_CLIENT_ID", clientSecret: "TU_CLIENT_SECRET")3. See connected accounts
list_accounts()4. Publish
publish_post(
accountId: "fb:533433607139839",
content: "🌀 CREA TU PROPIO GONG 🌀\nUn gong hecho por ti, para ti, como tú.",
mediaUrls: ["https://tudominio.com/imagen.jpg"],
platformOptions: { "mediaType": "REELS" } // para Reels de IG
)To schedule it instead of publishing right away, add scheduledAt: "2026-09-01T18:00:00+01:00".
Note about media: the API accepts public URLs. For local files, host them somewhere reachable (an S3/GCS bucket, your website, or an exposed local server) and use that URL. A direct-upload helper is on the roadmap.
Documentation
docs/SETUP_META.md— create the Meta app step by stepdocs/SETUP_YOUTUBE.md— Google Cloud project + OAuthdocs/TIKTOK.md— what the TikTok integration would look like (audit required)docs/SECURITY.md— local token management and best practices
Security
Tokens are stored locally in
~/.social-broadcast-mcp/with0600permissions.They are never sent to any external server.
No reducing telemetry. No analytics. Nothing that calls home.
Check
src/auth/store.tsto see exactly what gets stored.
License
MIT — free to use, copy, modify, and redistribute. Made for the community, out of the real experience of posting the Templo del Gong calendar (Vilagarcía de Ars) news.
Disclaimer
This project is not affiliated with Meta, Google, TikTok, or X Corp. The names belong to their respective owners. Use of the APIs is subject to each platform's terms of service.
Available Tools
6 toolsconnect_metaA
Inicia el flujo OAuth para conectar Facebook e Instagram. Requiere clientId (y clientSecret opcional) de tu app en developers.facebook.com. Abre el navegador para autorizar.
| Name | Required | Description | Default |
|---|---|---|---|
| scopes | No | Permisos solicitados (default: pages_show_list, pages_manage_posts, instagram_content_publish) | |
| clientId | Yes | App ID de tu app en developers.facebook.com | |
| clientSecret | No | App Secret (solo si la app está en modo desarrollo) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose an important, non-obvious action: 'Abre el navegador para autorizar', indicating an interactive flow. However, it does not explain what happens after authorization (success/failure, token storage, output, or side effects), so transparency is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no redundant details: purpose, prerequisites, and behavior. The most important information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for selecting the tool, but because there is neither an output schema nor annotations, it leaves unclear what the tool returns and how the agent can tell the OAuth flow succeeded after opening the browser. This is a noticeable gap for an OAuth operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents 100% of the parameters, including default scopes and the exact meaning of clientId/clientSecret. The description adds no significant semantic value beyond repeating that clientId is required and clientSecret is optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb and resource: 'Inicia el flujo OAuth para conectar Facebook e Instagram'. This clearly separates the tool from siblings such as connect_youtube, and the platform scope is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the purpose of the tool and the main prerequisite: need a Facebook app with clientId and optional clientSecret. It does not explicitly exclude alternatives like connect_youtube or mention when not to use the tool, but the platform distinction is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_youtubeB
Inicia el flujo OAuth para conectar YouTube. Requiere clientId y clientSecret de tu proyecto en Google Cloud Console.
| Name | Required | Description | Default |
|---|---|---|---|
| scopes | No | ||
| clientId | Yes | OAuth Client ID de Google Cloud | |
| clientSecret | Yes | OAuth Client Secret de Google Cloud |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
La descripción comunica que se trata de un flujo OAuth y que requiere credenciales de Google Cloud, lo cual es contexto de comportamiento relevante. Sin embargo, no se dice qué devuelve la herramienta ni se describe el flujo posterior (URL de autorización, interacción del usuario, finalización), y no hay annotations que compensen.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Es concisa: dos oraciones, con la acción al frente y el requisito principal inmediatamente después. No incluye relleno ni información redundante.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Una herramienta con un flujo OAuth debería indicar qué ocurre después de invocarla, pero la descripción solo menciona 'inicia el flujo' y sus credenciales. No hay output schema, así que la descripción debería compensar esa falta, explicando por ejemplo si devuelve una URL de autorización o un estado.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
El schema ya documenta clientId y clientSecret; la descripción agrega la procedencia ('tu proyecto en Google Cloud Console'). El parámetro 'scopes' no tiene descripción en el schema y la descripción no aporta ninguna orientación sobre él, dejando un vacío en la cobertura semántica.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
La descripción usa un verbo claro ('Inicia el flujo OAuth') y un recurso específico ('conectar YouTube'), por lo que se entiende bien qué hace la herramienta. No diferencia explícitamente de conect_meta o refresh_accounts, pero el nombre de la plataforma YouTube lo distingue parcialmente de los hermanos.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No se indica cuándo usar esta herramienta frente a alternativas como refresh_accounts o connect_meta. Se menciona únicamente el requisito de credenciales, pero no hay criterios para elegir entre herramientas ni advertencias de uso.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsB
Lista las cuentas de redes sociales conectadas
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden of behavioral disclosure. 'Lista' implies a read-only operation, but the description does not mention that the `platform` parameter filters results, nor any authentication/refresh behavior. It adds minimal behavioral context beyond the literal meaning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundancy. It is appropriately concise for its simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but the description is complete only at a high level. It lacks parameter filtering details, return expectations (no output schema), and explicit alternative routing, leaving a partially adequate but not fully self-sufficient description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention the optional `platform` parameter at all, and the schema provides no parameter descriptions (0% coverage). The enum values improve clarity, but the tool description itself fails to explain that the list can be filtered by platform.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Lista') and resource ('cuentas de redes sociales conectadas'), clearly indicating it returns connected social media accounts. It also places a scope—'conectadas'—which helps distinguish it from list_platforms and connect_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance about when to use this tool versus the sibling tools such as list_platforms, connect_meta, or refresh_accounts. An agent must infer the intended use from the tool name and the minimal description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_platformsA
Lista las plataformas soportadas y sus capacidades
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No hay anotaciones, por lo que la descripción asume toda la carga. 'Lista' implica una operación de solo lectura sin efectos secundarios, pero no se declara explícitamente ni se detalla el formato o alcance de la respuesta. Es suficiente para una herramienta lista muy simple, pero no aporta transparencia rica.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
La descripción es una sola oración completa y sin relleno. Cada palabra aporta información sobre el resultado que el agente obtendrá al llamar a la herramienta.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Para una herramienta de listado sin parámetros y sin esquema de salida, la descripción es suficientemente completa: indica qué recursos devuelve (plataformas soportadas y sus capacidades). No hay prerrequisitos ni configuraciones adicionales que deban documentarse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
La herramienta no tiene parámetros, por lo que aplica el punto de referencia 4. La descripción no necesita explicar semántica de parámetros y el esquema vacío ya comunica que la invocación requiere argumentos.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
La descripción identifica un verbo específico ('Lista') y el recurso ('las plataformas soportadas'), además del alcance ('sus capacidades'). Distingue claramente esta herramienta de la hermana list_accounts, que opera sobre cuentas y no sobre plataformas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
El contexto de uso está implícito: llamar a esta herramienta para obtener plataformas y capacidades. Sin embargo, no se mencionan alternativas ni condiciones de exclusión, como en qué casos convendría usar list_accounts o refresh_accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_postB
Publica o programa un post en una cuenta conectada
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Texto del post | |
| accountId | Yes | ID de la cuenta (de list_accounts) | |
| mediaUrls | No | URLs públicas de medios (imagen/video) | |
| scheduledAt | No | Fecha ISO para programar (omitir para publicar ya) | |
| platformOptions | No | Opciones específicas de plataforma (mediaType, title, privacyStatus...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It does disclose the essential behavior: publishing or scheduling a post on a connected account, and it implies side effects such as content becoming visible. It does not mention irreversibility, rate limits, or what happens for invalid/expired accounts, but the core behavior is not hidden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and has no filler sentences, which is good for efficiency. However, the phrasing 'Publica el programa un post' appears malformed and may confuse an agent despite the short length, so it cannot be considered a polished, high-quality description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema gives strong parameter coverage and references list_accounts for accountId, which helps. But there is no output schema, no annotations, and the description does not address the workflow around connected accounts, scheduling, or platform-specific options. It is adequate for a straightforward call but leaves gaps for more complex use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters, so the baseline is 3. The description does not add parameter-level meaning beyond what the schema provides, but that is acceptable because the schema already documents content, accountId, mediaUrls, scheduledAt, and platformOptions adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the core action: publishing/scheduling a post on a connected account, using a specific verb and resource. It is distinguishable from the sibling tools, which handle listing, connecting, and refreshing accounts, although the wording 'Publica el programa un post' has a grammatical issue that slightly muddies the intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'en una cuenta conectada' implies the tool should only be used after an account is connected, which gives some contextual guidance. However, it does not explicitly mention when to use this over alternatives, nor does it point to prerequisites like list_accounts for obtaining the correct accountId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_accountsB
Refresca la lista de cuentas de una plataforma ya conectada
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavioral traits. It only states that it refreshes an account list, without saying whether it overwrites local data, requires a valid token, performs a network call, or is safe to invoke repeatedly. This is a noticeable gap for a tool that likely synchronizes external account state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short, front-loaded sentence with no filler or redundant information. Every word earns its place, and the important verb and resource appear at the start.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity—one parameter, no output schema, no annotations—the description covers the core purpose and precondition. However, it leaves unspecified the actual effect on existing account data and does not clarify how this differs from 'list_accounts' in practice, so completeness is adequate but not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, 'platform', and it has an enum that constrains valid values. Schema description coverage is 0%, but the description adds the key semantic that the platform must already be connected. This is minimally sufficient, though it does not explain each enum value semantically beyond their literal names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('refresca') and a clear resource ('la lista de cuentas'), and it adds a platform-scoping condition ('ya conectada'). It does not explicitly contrast itself with the sibling 'list_accounts', which could be confused with listing versus refreshing, so it falls just short of a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'ya conectada' implies the tool should be used only after a connection has already been established, which gives some usage context. However, it does not mention alternatives, such as when to use 'list_accounts' instead, nor does it state any exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
connect_meta - First observed
connect_youtube - First observed
list_accounts - First observed
list_platforms - First observed
publish_post - First observed
refresh_accounts
TDQS
Scored across 6 tools
The tool purposes are mostly distinct: platform listing, account listing, platform connection, refresh, and publishing are separate workflows. The only mild overlap is between list_accounts and refresh_accounts, but their descriptions make the difference understandable.
All tool names are in snake_case and follow a verb_noun pattern, which is consistent. Minor deviation is that connect_meta and connect_youtube use platform/brand fragments rather than the generic verb_noun style, but the overall pattern remains clear.
Six tools is well-scoped for a social broadcast server focused on connecting platforms and publishing posts. Every tool covers a meaningful action without unnecessary redundancy.
The core lifecycle is mostly covered: list platforms, connect accounts, list/refresh accounts, and publish or schedule posts. Missing disconnect functionality and scheduled-post management are noticeable gaps, but they do not block the primary broadcasting workflow.
Maintenance
Related MCP Connectors
Schedule and publish social posts with OAuth, drafts, media, workspaces, and brand memory.
Create, schedule and publish social posts to TikTok, Instagram, Facebook and YouTube.
- RavenpostOAuthst.ravenpo
Schedule and publish posts to Instagram, TikTok, X, LinkedIn, YouTube, Pinterest, Facebook & more.
Schedule and post to Instagram, TikTok, YouTube, X, Facebook, LinkedIn, Pinterest, Threads, Bluesky.
Related MCP Servers
- FlicenseAqualityCmaintenanceEnables posting and managing Instagram content (photos, reels, stories, carousels) and interacting with media and comments via Instagram Graph API.1026 npm-
- FlicenseNot gradedqualityBmaintenanceEnables publishing and managing organic Facebook Page and Instagram content directly through Meta's Graph API without paid third-party services.-
- AlicenseNot gradedqualityCmaintenanceLets you publish photos, videos, carousels, Reels, and Stories via the official API, manage comments and DMs, and pull profile and media insights. The Advanced plan also enables following, unfollowing, liking, and viewing stories.8MIT
- AlicenseAqualityCmaintenanceEnables publishing photos, reels, and stories to Instagram, reading and moderating comments, fetching performance insights, drafting captions via MCP sampling, and scheduling reels for later.1320 npmMIT