Meta Ads Mcp Server
Servidor MCP (Protocolo de Contexto del Modelo) para la API de Meta (Facebook) Ads.
Documentación
Servidor MCP de Meta Ads
Un servidor Protocolo de Contexto de Modelo para la API de Anuncios de Meta (Facebook), escrito en TypeScript.
54 herramientas — 35 herramientas de lectura (siempre activas) más 19 herramientas de escritura/ciclo de vida opcionales — que cubren cuentas publicitarias, campañas, conjuntos de anuncios, anuncios, creatividades, medios, estadísticas, catálogo de segmentación, páginas de Facebook, programaciones de presupuesto y registros de actividad a través de la API Graph de Meta v22.0.
Funciona con Cursor, Claude Desktop (stdio) y conectores personalizados de Claude.ai (HTTP).
Aviso legal: Esta es una herramienta no oficial de terceros y no está asociada, respaldada ni afiliada con Meta de ninguna manera. Este proyecto se mantiene de forma independiente y utiliza las API públicas de Meta de acuerdo con sus Términos de Servicio. Meta, Facebook, Instagram y otros nombres de marca de Meta son marcas comerciales de sus respectivos propietarios.
Tabla de Contenidos
- Características
- Requisitos
- Instalación
- Obtención de un Token de Acceso de Meta
- Autenticación
- Habilitación de Herramientas de Escritura
- Modos de Transporte
- Configuración para Cursor / Claude Desktop
- Servidor HTTP Remoto
- Herramientas Disponibles
- De Principio a Fin: Crear un Anuncio desde Cero
- Paginación
- Desarrollo
- Estructura del Proyecto
- Licencia
Características
| Categoría | Qué hace |
|---|---|
| Cuentas | Listar cuentas publicitarias, obtener detalles de la cuenta |
| Campañas | Obtener / listar / crear / actualizar / pausar / reanudar / eliminar |
| Conjuntos de Anuncios | Obtener / listar / obtener en lote / crear / actualizar / pausar / reanudar / eliminar |
| Anuncios | Obtener / listar / crear / actualizar / pausar / reanudar / eliminar |
| Creatividades | Obtener / listar, crear + actualizar, calcular recortes de imagen |
| Medios | Listar imágenes de anuncios, subir imágenes, buscar por hash, obtener vistas previas de anuncios y videos |
| Estadísticas | Analíticas de rendimiento a nivel de cuenta, campaña, conjunto de anuncios y anuncio |
| Segmentación | Buscar intereses / comportamientos / datos demográficos / geográficos, estimación del tamaño de audiencia |
| Páginas | Listar páginas de Facebook accesibles desde el token, buscar por nombre |
| Programaciones de Presupuesto | Programar aumentos temporales de presupuesto en un período de tiempo |
| Actividades | Historial de cambios para cuentas publicitarias y conjuntos de anuncios |
| Paginación | Herramienta de utilidad para obtener páginas posteriores de resultados |
Todas las herramientas de mutación (crear / actualizar / eliminar / pausar / reanudar / subir / programación de presupuesto) están desactivadas por defecto y solo se registran cuando se opta por ellas — consulte Habilitación de Herramientas de Escritura.
Requisitos
- Node.js >= 18
- Un Token de Acceso de Usuario de Meta con los permisos adecuados para lo que planea hacer — consulte a continuación.
Instalación
# From npm
npx meta-ads-mcp-server --access-token YOUR_META_ACCESS_TOKEN
# From source
git clone https://github.com/hashcott/meta-ads-mcp.git
cd meta-ads-mcp
npm install
npm run build
node dist/index.js --access-token YOUR_META_ACCESS_TOKEN
Obtención de un Token de Acceso de Meta
Este servidor utiliza la API de Marketing de Meta. Necesita un token de acceso vinculado a una Aplicación de Meta que tenga los permisos adecuados.
Opción rápida — Explorador de API Graph (experimentos de solo lectura)
- Abra el Explorador de API Graph.
- Elija su Aplicación de Meta en el menú desplegable superior derecho (cree una en developers.facebook.com/apps si no tiene ninguna — elija el tipo "Negocio").
- Haga clic en Generar Token de Acceso, luego en Permisos agregue como mínimo:
ads_read— para todas las herramientas de lectura.ads_management— requerido para cualquier herramienta de escritura (crear / actualizar / eliminar / pausar / reanudar / subir / programación de presupuesto).business_management— recomendado si opera a través de Business Manager.pages_show_list,pages_read_engagement— requeridos para las herramientas de Páginas.
- Copie el token generado. Este es un token de corta duración (~1 hora) — suficiente para pruebas.
Opción de producción — Token de Usuario de larga duración
Los tokens de corta duración del Explorador caducan en aproximadamente una hora. Cambie el suyo por un token de 60 días:
curl -G "https://graph.facebook.com/v22.0/oauth/access_token" \
--data-urlencode "grant_type=fb_exchange_token" \
--data-urlencode "client_id=YOUR_APP_ID" \
--data-urlencode "client_secret=YOUR_APP_SECRET" \
--data-urlencode "fb_exchange_token=YOUR_SHORT_LIVED_TOKEN"
La respuesta contiene "access_token": "..." — ese token es válido por ~60 días. Refrésquelo de la misma manera antes de que caduque, o construya un flujo OAuth completo si necesita acceso permanente.
Opción de producción — Token de Usuario de Sistema (recomendado para servidores)
Para uso de producción sin supervisión (sin caducidad), genere un token de Usuario de Sistema en Business Manager:
- Vaya a Business Manager → Configuración de la Empresa → Usuarios → Usuarios de Sistema.
- Cree un usuario de sistema (o use uno existente), asigne la cuenta publicitaria correspondiente y otorgue
ads_read/ads_management. - Haga clic en Generar Nuevo Token → elija su Aplicación de Meta → seleccione los mismos permisos → Nunca para la caducidad.
Los tokens de Usuario de Sistema no caducan y son ideales para implementaciones de backend.
Verificación de su token
curl "https://graph.facebook.com/v22.0/me?access_token=YOUR_TOKEN"
Debería devolver su objeto de usuario/usuario de sistema. Si devuelve un error, verifique los permisos y que el token no haya caducado.
Autenticación
Pase su token de acceso de Meta usando cualquiera de estos métodos:
Argumento de línea de comandos (recomendado para Cursor / Claude Desktop):
node dist/index.js --access-token YOUR_META_ACCESS_TOKEN
Variable de entorno:
export META_ADS_ACCESS_TOKEN=YOUR_META_ACCESS_TOKEN
node dist/index.js
El token se mantiene solo en la memoria del proceso en ejecución — este servidor nunca lo escribe en disco.
Habilitación de Herramientas de Escritura
Por defecto, el servidor registra solo las 35 herramientas de lectura — las herramientas de crear / actualizar / eliminar / pausar / reanudar / subir / programación de presupuesto no están expuestas. Esto es intencional: un meta_ads_delete_campaign emitido por error puede eliminar permanentemente campañas y sus anuncios.
Para optar por ellas, configure:
META_ADS_ENABLE_WRITE_TOOLS=true
Valores verdaderos aceptados: true, 1, yes, on (sin distinción de mayúsculas/minúsculas). Cualquier otro valor (o sin configurar) mantiene las escrituras desactivadas.
Cuando está habilitado, el servidor registra una advertencia de una línea en stderr al inicio:
[meta-ads-mcp] WARNING: META_ADS_ENABLE_WRITE_TOOLS is on — create/update/delete/pause/resume tools are EXPOSED. These can permanently delete campaigns/ad sets/ads or change live delivery.
Su token de acceso también necesita el permiso ads_management para que las escrituras tengan éxito.
Ejemplo de configuración de Cursor / Claude Desktop con escrituras habilitadas:
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server"],
"env": {
"META_ADS_ACCESS_TOKEN": "YOUR_META_ACCESS_TOKEN",
"META_ADS_ENABLE_WRITE_TOOLS": "true"
}
}
}
}
Modos de Transporte
| Modo | Caso de uso | Cómo habilitarlo |
|---|---|---|
stdio (predeterminado) | Cursor, Claude Desktop, herramientas locales | No se necesita configuración |
http | Conectores remotos de Claude.ai, configuraciones de múltiples clientes | Configure TRANSPORT=http |
Configuración para Cursor / Claude Desktop
Agregue una de las siguientes opciones a su archivo de configuración del cliente MCP:
Mediante npx (recomendado — no requiere instalación local):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server", "--access-token", "YOUR_META_ACCESS_TOKEN"]
}
}
}
Mediante compilación local:
{
"mcpServers": {
"meta-ads": {
"command": "node",
"args": ["/path/to/meta-ads-mcp/dist/index.js", "--access-token", "YOUR_META_ACCESS_TOKEN"]
}
}
}
Mediante variable de entorno (y escrituras opcionales):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server"],
"env": {
"META_ADS_ACCESS_TOKEN": "YOUR_META_ACCESS_TOKEN",
"META_ADS_ENABLE_WRITE_TOOLS": "true"
}
}
}
}
Servidor HTTP Remoto
Ejecute como un servidor HTTP persistente para usar con conectores personalizados de Claude.ai o cualquier cliente MCP remoto.
# Start on default port 3000
TRANSPORT=http META_ADS_ACCESS_TOKEN=YOUR_TOKEN node dist/index.js
# Start on a custom port, writes enabled
TRANSPORT=http \
META_ADS_ACCESS_TOKEN=YOUR_TOKEN \
META_ADS_ENABLE_WRITE_TOOLS=true \
PORT=8080 \
node dist/index.js
Puntos finales:
POST /mcp— punto final del protocolo MCPGET /health— verificación de estado ({"status":"ok"})
Agregar a Claude.ai
- Vaya a Configuración → Conectores → Agregar conector personalizado
- Ingrese la URL de su servidor:
https://your-domain.com/mcp - Haga clic en Agregar
Pruebas locales con ngrok
# Terminal 1 — start the server
TRANSPORT=http META_ADS_ACCESS_TOKEN=YOUR_TOKEN PORT=8080 node dist/index.js
# Terminal 2 — expose publicly
ngrok http 8080
Use la URL HTTPS generada (por ejemplo, https://xxxx.ngrok-free.app/mcp) como la URL de su conector.
Implementación en plataformas en la nube
Configure las siguientes variables de entorno en su proveedor de alojamiento (Railway, Render, Fly.io, etc.):
| Variable | Valor |
|---|---|
TRANSPORT | http |
META_ADS_ACCESS_TOKEN | Su token de acceso de Meta |
META_ADS_ENABLE_WRITE_TOOLS | true para también exponer herramientas de mutación (desactivado por defecto) |
PORT | Asignado automáticamente por la plataforma |
Herramientas Disponibles
Leyenda: 🔍 lectura • ✏️ escritura (restringida por META_ADS_ENABLE_WRITE_TOOLS) • 🛠️ utilidad pura (sin llamada a API).
Cuentas
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_list_ad_accounts | 🔍 | Listar todas las cuentas publicitarias accesibles con su token |
meta_ads_get_ad_account_details | 🔍 | Obtener información detallada de una cuenta publicitaria específica |
Campañas
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_get_campaign_by_id | 🔍 | Obtener una campaña específica por su ID |
meta_ads_get_campaigns_by_adaccount | 🔍 | Listar campañas dentro de una cuenta publicitaria, con filtros y paginación |
meta_ads_create_campaign | ✏️ | Crear una nueva campaña ODAX (CBO o ABO) |
meta_ads_update_campaign | ✏️ | Actualizar nombre/estado/presupuesto/oferta; admite migración CBO → ABO mediante adset_budgets |
meta_ads_delete_campaign | ✏️ | Eliminar permanentemente una campaña y sus conjuntos de anuncios/anuncios |
meta_ads_pause_campaign | ✏️ | Conveniencia: establecer estado en PAUSED |
meta_ads_resume_campaign | ✏️ | Conveniencia: establecer estado en ACTIVE |
Entradas de meta_ads_create_campaign:
act_id(cadena) — ID de cuenta publicitaria, formatoact_XXXXXXXXX.name(cadena) — Nombre de la campaña.objective(enumeración) — Objetivo basado en resultados ODAX:OUTCOME_AWARENESS,OUTCOME_TRAFFIC,OUTCOME_ENGAGEMENT,OUTCOME_LEADS,OUTCOME_SALES,OUTCOME_APP_PROMOTION.- Los objetivos heredados (
BRAND_AWARENESS,LINK_CLICKS,CONVERSIONS,APP_INSTALLS, …) no son aceptados por Meta v22+ y devolverán HTTP 400.
status(predeterminadoPAUSED),special_ad_categories(predeterminado[])daily_budget/lifetime_budget(centavos) — omita ambos cuandouse_adset_level_budgets=true.bid_strategy—LOWEST_COST_WITHOUT_CAP(predeterminado),LOWEST_COST_WITH_BID_CAP,COST_CAP,LOWEST_COST_WITH_MIN_ROAS. Las estrategias de límite de oferta requierenbid_amounten cada conjunto de anuncios secundario.bid_cap,spend_cap,campaign_budget_optimization,use_adset_level_budgets,ab_test_control_setups,buying_type.
{
"act_id": "act_123456789012345",
"name": "2026 - Spring Sale - Awareness",
"objective": "OUTCOME_AWARENESS",
"special_ad_categories": [],
"status": "PAUSED",
"bid_strategy": "LOWEST_COST_WITHOUT_CAP",
"daily_budget": 10000
}
Conjuntos de Anuncios
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_get_adset_by_id | 🔍 | Obtener un solo conjunto de anuncios por su ID |
meta_ads_get_adsets_by_ids | 🔍 | Obtener en lote múltiples conjuntos de anuncios |
meta_ads_get_adsets_by_adaccount | 🔍 | Listar conjuntos de anuncios en una cuenta publicitaria |
meta_ads_get_adsets_by_campaign | 🔍 | Listar conjuntos de anuncios dentro de una campaña |
meta_ads_create_adset | ✏️ | Crear un nuevo conjunto de anuncios bajo una campaña |
meta_ads_update_adset | ✏️ | Actualizar los campos de un conjunto de anuncios (nota: frequency_control_specs es inmutable después de la creación) |
meta_ads_delete_adset | ✏️ | Eliminar permanentemente un conjunto de anuncios |
meta_ads_pause_adset | ✏️ | Establecer estado en PAUSED |
meta_ads_resume_adset | ✏️ | Establecer estado en ACTIVE |
Aspectos destacados de meta_ads_create_adset:
- Requeridos:
act_id,campaign_id,name,optimization_goal,billing_event. targeting(objeto) — especificación completa de segmentación; recuerde quetargeting_automation.advantage_audiencetiene como predeterminado0en Meta v24+ — configúrelo explícitamente si desea Audiencia Advantage+.bid_amount— requerido paraLOWEST_COST_WITH_BID_CAP/COST_CAP.bid_constraints— requerido paraLOWEST_COST_WITH_MIN_ROAS, por ejemplo,{"roas_average_floor": 20000}para un piso de ROAS de 2.0×.dsa_beneficiary/dsa_payor— requeridos para conjuntos de anuncios dirigidos a la UE.promoted_object— requerido paraAPP_INSTALLS.frequency_control_specs— DEBE configurarse en la creación; Meta lo hace inmutable después.regional_regulated_categories/regional_regulation_identities— verticales regulados de Taiwán / Australia / Singapur / India.
Anuncios
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_get_ad_by_id | 🔍 | Obtener un anuncio individual por ID |
meta_ads_get_ads_by_adaccount | 🔍 | Listar anuncios en una cuenta publicitaria |
meta_ads_get_ads_by_campaign | 🔍 | Listar anuncios dentro de una campaña |
meta_ads_get_ads_by_adset | 🔍 | Listar anuncios dentro de un conjunto de anuncios |
meta_ads_create_ad | ✏️ | Crear un nuevo anuncio que haga referencia a un creativo existente |
meta_ads_update_ad | ✏️ | Actualizar nombre / estado / oferta / especificaciones de seguimiento / referencia de creativo |
meta_ads_delete_ad | ✏️ | Eliminar permanentemente un anuncio |
meta_ads_pause_ad | ✏️ | Establecer estado a PAUSED |
meta_ads_resume_ad | ✏️ | Establecer estado a ACTIVE |
ℹ️ Intercambiar
creative_iden un anuncio FLEX puede fallar conerror_subcode 3858355si las imágenesasset_feed_specdel nuevo creativo no coinciden con suobject_story_spec. En ese caso, crea un nuevo anuncio con el nuevo creativo y pausa el anterior (pierdes prueba social pero el anuncio se ejecuta).
Creativos
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_get_ad_creative_by_id | 🔍 | Obtener un creativo |
meta_ads_get_ad_creatives_by_ad_id | 🔍 | Listar creativos adjuntos a un anuncio |
meta_ads_get_adcreatives_by_adaccount | 🔍 | Listar creativos en una cuenta publicitaria |
meta_ads_compute_image_crops | 🛠️ | Calcular recuadros de recorte centrados para las 6 relaciones de aspecto aceptadas por Meta (sin llamada a API) |
meta_ads_create_ad_creative | ✏️ | Crear un creativo — 3 modos simples más la vía de escape completa de object_story_spec |
meta_ads_update_ad_creative | ✏️ | Actualizar name / asset_feed_spec (Meta restringe la mayoría de las otras actualizaciones de contenido) |
meta_ads_create_ad_creative — tres modos comunes:
- Promocionar una publicación existente: pasa solo
object_story_iden el formulario{page_id}_{post_id}. - Anuncio de enlace con una sola imagen:
page_id+image_hash+link_url+message+ opcionalheadline,description,call_to_action_type. - Anuncio de video único:
page_id+video_id+link_url+message+ opcionalheadline,call_to_action_type,thumbnail_url.
Para diseños avanzados (FLEX/DOF, Personalización de activos de ubicación, Creativo dinámico, múltiples titulares, formularios de generación de clientes potenciales, contenido de marca, recortes de imagen), pasa un object_story_spec y/o asset_feed_spec completamente compuestos — estos tienen prioridad sobre la auto-construcción en modo simple.
Medios
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_get_ad_images | 🔍 | Listar activos de imagen en una cuenta publicitaria |
meta_ads_get_image_by_hash | 🔍 | Búsqueda de imagen individual por hash (URL + dimensiones) |
meta_ads_get_ad_previews | 🔍 | Generar vistas previas renderizadas de un anuncio en todas las ubicaciones |
meta_ads_get_ad_video | 🔍 | Detalles del video (URL de origen, miniaturas, duración) por ad_id o video_id |
meta_ads_upload_ad_image | ✏️ | Subir una imagen a la biblioteca de imágenes de anuncios de una cuenta y obtener su image_hash |
meta_ads_upload_ad_image acepta exactamente uno de:
file— una URL de datos (data:image/png;base64,iVBORw0KG...) o una cadena base64 sin procesar.image_url— una URL pública; el servidor descarga los bytes y los sube.
Devuelve el image_hash que luego pasas a meta_ads_create_ad_creative.
Información
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_get_adaccount_insights | 🔍 | Métricas de rendimiento a nivel de cuenta |
meta_ads_get_campaign_insights | 🔍 | Métricas de rendimiento para una campaña específica |
meta_ads_get_adset_insights | 🔍 | Métricas de rendimiento para un conjunto de anuncios específico |
meta_ads_get_ad_insights | 🔍 | Métricas de rendimiento para un anuncio específico |
Los cuatro aceptan la misma superficie de opciones: fields, date_preset, time_range, time_ranges, time_increment, level, action_attribution_windows, action_breakdowns, breakdowns, filtering, sort, paginación y configuración regional.
Precedencia del rango de tiempo: time_ranges > time_range > since/until > date_preset.
Catálogo de segmentación
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_search_interests | 🔍 | Buscar en el catálogo de intereses de Meta por palabra clave |
meta_ads_get_interest_suggestions | 🔍 | Obtener intereses relacionados de una lista semilla |
meta_ads_search_behaviors | 🔍 | Listar opciones de segmentación por comportamiento disponibles |
meta_ads_search_demographics | 🔍 | Listar opciones demográficas (demographics / life_events / industries / income / family_statuses / user_device / user_os) |
meta_ads_search_geo_locations | 🔍 | Buscar países / regiones / ciudades / códigos postales / geo_markets / electoral_districts |
meta_ads_estimate_audience_size | 🔍 | Estimar alcance para una especificación de segmentación mediante /act_X/delivery_estimate |
Páginas
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_get_account_pages | 🔍 | Listar páginas de Facebook accesibles desde el token de acceso (/me/accounts) |
meta_ads_search_pages_by_name | 🔍 | Filtro de subcadena sobre las páginas del token (lado del cliente — Meta no expone un filtro de nombre del lado del servidor) |
Los valores page_id devueltos son los que pasas a meta_ads_create_ad_creative.
Programaciones de presupuesto
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_create_budget_schedule | ✏️ | Programar un aumento temporal de presupuesto para una campaña en una ventana de marca de tiempo Unix |
Entradas:
campaign_id(string)budget_value(int, positivo)budget_value_type—ABSOLUTE(centavos en la moneda de la cuenta) oMULTIPLIER(por ejemplo,2duplica el presupuesto)time_start,time_end(marcas de tiempo Unix en segundos) —time_end > time_start
Actividades
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_get_activities_by_adaccount | 🔍 | Recuperar el registro de historial de cambios de una cuenta publicitaria |
meta_ads_get_activities_by_adset | 🔍 | Recuperar el registro de historial de cambios de un conjunto de anuncios |
Herramienta de paginación
| Herramienta | Tipo | Descripción |
|---|---|---|
meta_ads_fetch_pagination_url | 🛠️ | Seguir URLs de paging.next / paging.previous desde la respuesta de cualquier otra herramienta |
De extremo a extremo: Crear un anuncio desde cero
Un flujo de trabajo típico de "crear un nuevo anuncio" utiliza herramientas de varias categorías. Con META_ADS_ENABLE_WRITE_TOOLS=true:
1. meta_ads_list_ad_accounts → pick an act_id
2. meta_ads_get_account_pages → pick a page_id
3. meta_ads_search_geo_locations(q="Vietnam") → grab the country/region keys
4. meta_ads_search_interests(q="cooking") → grab interest IDs
5. meta_ads_estimate_audience_size(act_id, targeting) → sanity-check reach
6. meta_ads_upload_ad_image(act_id, image_url) → returns image_hash
7. meta_ads_create_campaign(act_id, ...) → returns campaign_id
8. meta_ads_create_adset(act_id, campaign_id, targeting, ...) → returns adset_id
9. meta_ads_create_ad_creative(act_id, page_id, image_hash, link_url, message, ...) → returns creative_id
10. meta_ads_create_ad(act_id, name, adset_id, creative_id, status="PAUSED") → returns ad_id
11. (Optional) meta_ads_get_ad_previews(ad_id, ...) → render placements before going live
12. meta_ads_resume_ad(ad_id) → flip to ACTIVE when ready
Todos los pasos que mutan el estado tienen como valor predeterminado status: "PAUSED" para que nada se publique hasta que llames explícitamente a una herramienta de reanudación.
Paginación
Muchas herramientas de listado devuelven resultados paginados. Cuando una respuesta contiene una URL paging.next, usa meta_ads_fetch_pagination_url para recuperar páginas posteriores:
1. Call meta_ads_get_campaigns_by_adaccount → receive first page
2. Check if response.paging.next exists
3. Call meta_ads_fetch_pagination_url(url=response.paging.next) → receive next page
4. Repeat until paging.next is absent
Desarrollo
npm run dev # Watch mode — auto-recompile on change
npm run build # Compile TypeScript to dist/
npm run clean # Remove dist/
npm run clean && npm run build # Full rebuild from scratch
Prueba rápida de humo:
# Default (read-only)
META_ADS_ACCESS_TOKEN=dummy node dist/index.js
# → "Meta Ads MCP server running via stdio"
# With writes enabled
META_ADS_ACCESS_TOKEN=dummy META_ADS_ENABLE_WRITE_TOOLS=true node dist/index.js
# → WARNING line + "Meta Ads MCP server running via stdio"
Estructura del Proyecto
meta-ads-mcp/
├── src/
│ ├── index.ts # Entry point, server setup, transport selection, write-tools warning
│ ├── constants.ts # API version, base URLs, isWriteToolsEnabled() flag
│ ├── types.ts # Shared TypeScript interfaces
│ ├── services/
│ │ └── graph-api.ts # HTTP client (GET/POST/DELETE), auth, error handling, param builders
│ ├── schemas/
│ │ ├── common.ts # Shared Zod schemas (pagination, date ranges, filters)
│ │ └── insights.ts # Insights-specific Zod schemas
│ └── tools/
│ ├── accounts.ts # Account tools
│ ├── insights.ts # Insights tools (account/campaign/adset/ad level)
│ ├── campaigns.ts # Campaign read + write/lifecycle tools
│ ├── adsets.ts # Ad set read + write/lifecycle tools
│ ├── ads.ts # Ad read + write/lifecycle tools
│ ├── creatives.ts # Creative read tools, image crops utility, create/update creative
│ ├── media.ts # Image list / upload / hash lookup / video / preview
│ ├── activities.ts # Activity log tools
│ ├── pagination.ts # Pagination utility tool
│ ├── targeting.ts # Interest/behavior/demographic/geo search + audience-size estimate
│ ├── pages.ts # Facebook Pages list and name search
│ └── budget-schedules.ts # Campaign budget schedule create
├── dist/ # Compiled JavaScript output (generated)
├── package.json
└── tsconfig.json