El Orquestador IA de Marketing: cinco fuentes vía MCP, decisiones técnicas y roadmap de closed-loop attribution
Alumno: Antonio Rodríguez de Tembleque Fuentes
Tutor: Cristian Betancort Niz
Máster: IA Aplicada al Marketing (KSchool)
Caso práctico: FactuFicticia (SaaS B2B de facturación electrónica CFDI 4.0 · México)
Las calculadoras fiscales en producción referenciadas en la demo están publicadas en un dominio real (facturama.mx) como prueba directa del MVP. El resto del documento mantiene el pseudónimo FactuFicticia por coherencia con E1/E2.
En el Entregable 2 se consolidó el pivot a un Orquestador IA de Marketing propio basado en MCPs. Este Entregable 3 baja al detalle técnico: arquitectura, código, OAuth y decisiones de ingeniería.
GA4, Search Console, Google Ads (servidor custom propio), DataForSEO y skill propia SEO/GEO. Integradas en sólo dos sesiones de trabajo.
Resultado real ya medido aplicando 4 negativas de competencia vía API a 8 campañas. 100% reversible con un único comando.
Líneas de código del servidor MCP de Google Ads en FastMCP 3.2. Stdio, sin red expuesta, con OAuth desktop + refresh token.
Claude Code como cliente MCP. Descubre tools vía tools/list, invoca con JSON-RPC 2.0. Memoria persistente entre sesiones en sistema de archivos local.
5 servidores: GSC, GA4, Google Ads custom (FastMCP), DataForSEO skill, facturama-seo-content skill. Sin red expuesta.
Self-hosted. Pipeline diario closed-loop attribution: Openpay → HubSpot (gclid) → Google Ads UploadClickConversion. Reintentos + logs.
Marketing (análisis NL), Ventas (Lead Scoring HubSpot), B2B (calculadoras web) y Developers externos (servidor MCP FactuFicticia).
El operador habla con Claude, Claude invoca tools de los 5 MCPs en paralelo, n8n cierra el ciclo de atribución en background.
| Fuente | Tipo | Acceso | Tools / Cobertura |
|---|---|---|---|
| Google Search Console | MCP comunitario | Service account JSON | 24 tools (search_analytics, URL inspection, sitemaps) |
| Google Analytics 4 | MCP comunitario | Service account JSON | get_ga4_data + search_schema + anti-explosión de filas |
| Google Ads | MCP custom (FastMCP) | OAuth desktop + refresh token | 6 tools: list_accounts, account_summary, campaign_performance, top_keywords, top_search_terms, search (GAQL) |
| DataForSEO | Skill con scripts Python | API key Basic Auth | keyword_ideas, serp_organic, keyword_difficulty, search_volume |
| facturama-seo-content | Skill propia | Triggers internos | Framework GEO/AEO de 8 bloques + orquesta DataForSEO |
Roadmap: HubSpot (Fase 3) y Openpay (Fase 1) cerrarán el ciclo de closed-loop attribution.
FastMCP 3.2.4 + SDK oficial google-ads-python 30.1.0 + transporte stdio. Total: 200 LOC en scripts/google_ads_mcp_local.py.
Configurado en .mcp.json del proyecto. Tras reiniciar Claude Code, las tools quedan disponibles como mcp__google-ads__*.
Credenciales (4 piezas):
InstalledAppFlow)list_accounts — cuentas accesibles desde el MCCaccount_summary — KPIs agregados por rangocampaign_performance — desglose por campañatop_keywords — orden por cost/clicks/conv/imptop_search_terms — search terms realessearch — GAQL libre de sólo lecturaAplanado de protobuf: con use_proto_plus=True los objetos no exponen DESCRIPTOR.fields. Solución: MessageToDict(row._pb, preserving_proto_field_name=True). cost_micros → / 1_000_000.
facturama-seo-contentAdapta los hallazgos de Princeton 2024 (Aggarwal et al., "GEO") al contexto fiscal mexicano. Triggers automáticos: "redacta artículo sobre [tema fiscal]", "auditemos post X", "mejora este artículo".
.claude/skills/facturama-seo-content/
├── SKILL.md (descripción + triggers)
├── scripts/
│ ├── keyword_research.py
│ ├── serp_analysis.py
│ ├── keyword_difficulty.py
│ └── .env (gitignored)
└── references/
└── frameworks-seo.md
3 scripts en secuencia: keyword_research (seed → ideas) → serp_analysis (top 10) → kd_priorización (volumen vs KD). Output: brief editorial con outline, schema, internal links y checklist GEO/AEO.
El primer intento usó el servidor MCP oficial de Google Ads (HTTP streamable con OAuth 2.1 + DCR). Falló con MCP error -32000: Connection closed porque el cliente no completa el OAuth dance. Esa decisión técnica obligó a un cambio de rumbo:
resource_metadata, registrarse, autorizar, reintentarInstalledAppFlowLección general: stdio > HTTP para MCPs locales · Custom > oficial cuando el oficial falla por incompatibilidad de transporte · Skill > MCP cuando lo que integras es una metodología, no una fuente de datos.
Constraint del negocio: el trial de 30 días en FactuFicticia hace que la primera compra (Openpay, 85% del volumen) ocurra al día 31-32, fuera de la ventana default de Google Ads. Resultado: las compras reales NO se atribuyen.
REST API expone customer.email, amount, creation_date por cada cargo. n8n self-hosted pollea diariamente con HTTP Request node.
HubSpot Starter guarda el gclid del clic Google Ads como property en el contact al registro. Match por email garantizado (login obligatorio).
Subir conversión offline con (gclid, conversion_action, value, time). Conversion action específica: "Compra Openpay (offline)" con valor dinámico = importe del cargo.
Extender click_through_lookback_window_days de 30 → 90. Activar GA4 User-ID para stitching cross-session. BigQuery export de GA4 para análisis SQL.
ROAS real por keyword medido sobre ingreso Openpay (no proxy). LTV por canal segmentado (API enterprise vs autoservicio vs nóminas). Validación/invalidación de hipótesis con datos económicos reales.
Una de las aportaciones del TFM es el catálogo de pitfalls reales al integrar APIs Google + Python en Windows. Cada uno con su workaround:
pipx falla con username El minador. Fix: python -m pip install directo. pip del PATH puede apuntar a otro Python distinto del python del PATH.
Refresh token con \r final causa invalid_grant: Bad Request. Fix: verificar bytes raw. Nunca copiar tokens desde editores con EOL Windows.
use_proto_plus=TrueNo expone DESCRIPTOR.fields. Fix: MessageToDict(row._pb, preserving_proto_field_name=True). Convertir cost_micros ÷ 1,000,000.
FastMCP con GoogleProvider espera Web con redirect URI. Para stdio con refresh token, usar Desktop + InstalledAppFlow + port=0.
Demasiado corta para SaaS con trial de 30d. Fix: extender click_through_lookback_window_days a 90 + subir conversiones offline vía OCI.
Una query GAQL puede devolver >59K caracteres. Fix: procesar con script Python externo (filtrar, top N) antes de pasar al modelo.
Con la arquitectura del Orquestador IA ya en operación y el primer resultado real medido, el MVP restante hasta la defensa de junio 2026 se centra en tres piezas:
Calculadora de aguinaldo o ISR generada con Cursor + Claude. Sprint: 2 semanas. Incluye lógica fiscal validada, UI responsive, eventos GA4 y formulario de captación de leads. Indexada y generando tráfico orgánico.
Outputs: URL pública + código fuente + prompts documentados (metodología Vibe Coding).
Pipeline n8n diaria Openpay → HubSpot → Google Ads OCI. Sprint: 4-6 semanas. Conversion action "Compra Openpay" creada, ventana extendida a 90d, GA4 User-ID activo. Reintentos automáticos + logs persistidos.
Outputs: ROAS real por keyword + LTV por canal + invalidación/validación de hipótesis API enterprise.
Documento técnico (Prueba de Concepto) para presentar al departamento IT. Sprint: 3 semanas. Incluye arquitectura del servidor, endpoints CFDI propuestos, esquema de autenticación y ejemplos de prompts para Cursor/Windsurf/Codex.
Outputs: documento PoC + diagrama de implementación + estimación de esfuerzo IT.
Hitos de cierre: calculadora indexada en Google · pipeline n8n diaria operativa · documento PoC del MCP entregado a IT · resultados medidos para la defensa de junio 2026.
SaaS B2B CFDI 4.0 (FactuFicticia · México). 55K+ clientes, 400-500K visitas/mes. Gasto Ads ~$89K MXN/sem. Trial 30d → primera compra día 31-32.
Pregunta en lenguaje natural del Head of Marketing al Orquestador IA. Ej: "dame search terms con coste y cero conversiones de los últimos 30 días".
Claude Code: descubre tools, invoca los 5 MCPs en paralelo (GSC, GA4, Ads, DataForSEO, skill SEO/GEO), procesa volúmenes grandes con scripts Python externos para no saturar el contexto, cruza datos y aplica reglas aprendidas en memoria.
Tabla de insights + propuesta de acción reversible. Ej: identifica 4 competidores en negativas (Sinube, AGSA, Facturación Elite, Facturify).
Head of Marketing valida la propuesta o pide más contexto. Confirma la acción en lenguaje natural. El humano siempre aprueba antes de cualquier cambio.
Acción ejecutada vía API. −$6,613 MXN/mes (−$79,356 MXN/año). 100% reversible con un único comando. Regla aprendida queda en memoria.
El operador habla al Orquestador IA en lenguaje natural. El agente cruza datos de cinco fuentes vía MCP, propone una acción reversible y la ejecuta vía API tras validación humana. La regla aprendida se persiste para futuras sesiones — el sistema mejora con el uso.
1. ¿Qué construyo sí o sí?
El Orquestador IA de Marketing: Claude Code como cliente MCP, cinco servidores operativos (GSC + GA4 + Google Ads custom en FastMCP + DataForSEO + skill facturama-seo-content), con OAuth/credenciales reales y memoria persistente.
2. ¿Qué enseño funcionando?
El caso real de negativas vía API ejecutado en vivo desde Claude Code: query GAQL → tabla de search terms → identificación de competencia → aplicación de la SharedSet → rollback. Resultado verificable: ~$6,613 MXN/mes.
3. ¿Qué es lo mínimo que demuestra valor?
Un ciclo completo análisis → acción → impacto medible ejecutado en una sola sesión de Claude Code, con todas las acciones reversibles. Sin presentaciones precocinadas: si el agente falla en vivo, se ve. Si funciona, el ahorro queda medido.
4. ¿Qué queda fuera del MVP?
Roadmap, no MVP demostrable: las calculadoras fiscales en producción (facturama.mx/calculadoras), el servidor MCP de FactuFicticia para Vibe Coding externo y el closed-loop attribution Openpay→HubSpot→Ads OCI en n8n.
Criterio de éxito: el tribunal ve la acción ejecutarse en vivo, la cifra de ahorro queda en el log, el rollback funciona delante de ellos.
Guión propuesto para la sesión de defensa final, entregado ahora en el E3 para validación del tutor. La ejecución en vivo ocurre en la defensa, no en este entregable.
tools/list.search) con GAQL; recibe respuesta vía MessageToDict.SharedSet + vincular a 8 campañas vía API.facturama-seo-content: framework GEO/AEO de 8 bloques sobre el blog.Una sola pantalla con el log de la acción que el tribunal acaba de ver ejecutarse:
El número no es proyección: es la ejecución que acaban de presenciar.
| Herramienta | Función | Por qué ésta y no otra | Auto/Manual | Coste (aprox.) |
|---|---|---|---|---|
| Claude Code | Cliente MCP y orquestador conversacional; memoria persistente | Único cliente con soporte MCP nativo + 1M de contexto + acceso al ecosistema Anthropic | Manual asistido | ~$200 / mes (Max) |
| FastMCP 3.2 | Framework para construir el servidor MCP custom de Google Ads | Mismo framework que usa el server oficial Google; permite stdio sin OAuth runtime | Automatizado | $0 (open source) |
| Python + httpx | Scripts auxiliares para procesar tablas grandes fuera del contexto LLM | httpx async permite paralelizar llamadas HTTP; Python ya parte del stack del autor | Automatizado | $0 (open source) |
| google-ads-python | SDK oficial para la API de Google Ads (queries GAQL, mutaciones) | SDK oficial = compatibilidad garantizada; alternativa REST manual descartada por verbosidad | Automatizado | $0 (open source) |
| n8n self-hosted | Orquestación del closed-loop attribution diaria (roadmap) | Self-hosted en infra propia del autor; nodos nativos HubSpot + HTTP Request | Automatizado | ~$10 / mes (VPS) |
| DataForSEO | Keyword research, SERP scraping, keyword difficulty MX | Mejor cobertura MX + pricing pay-as-you-go vs Semrush/Ahrefs por suscripción fija | Automatizado | ~$50-100 / mes |
| HubSpot Starter | CRM; almacena gclid del clic Ads en cada contact | Ya en stack de FactuFicticia; Private App token con scopes mínimos | Manual + API | ~$20 / mes |
| Openpay API | Pasarela de pagos; 85% del ingreso de FactuFicticia | Pasarela ya operativa; REST API estándar con auth merchant_id + private_key | Automatizado | % por transacción |
| Cursor IDE | Desarrollo de calculadoras fiscales y skill SEO/GEO con IA | Único IDE con context-aware en proyecto + integración Claude/GPT en una sola UI | Manual asistido | ~$20 / mes (Pro) |
Coste total estimado: ~$300-350 USD/mes (vs ~$1,500+ USD/mes del plan Connectif que cubría las mismas fuentes). Costes aproximados; ajustar al cierre de la implementación.
FactuFicticia gasta ~$90K MXN/semana en Google Ads pero no sabe qué keyword genera clientes que pagan: el trial es de 30 días y la compra real ocurre al día 31-32, fuera de la ventana de atribución. Decisiones a ciegas con presupuesto real.
Un Orquestador IA de Marketing: Claude Code conecta cinco fuentes vía MCP (GA4, Search Console, Google Ads con servidor custom propio en FastMCP, DataForSEO y skill SEO/GEO). El operador pregunta en lenguaje natural, el agente cruza fuentes, propone acciones y las ejecuta reversiblemente tras validación humana. Memoria persistente entre sesiones para reglas de negocio.
−$6,613 MXN/mes recuperados en sólo dos sesiones de trabajo, aplicando cuatro negativas de competencia vía API a 8 campañas. Sin pérdida de tráfico cualificado. 100% reversible. Equivalente anual: −$79,356 MXN.
Aquí mismo, en vivo: abro Claude Code, le pido los search terms con coste y cero conversiones de los últimos 30 días, identifico la competencia, aplico la SharedSet de negativas a las 8 campañas y la elimino con un comando. El log enseña el número y el rollback.
Cierre del pitch: esto no es un piloto de laboratorio — es una arquitectura ya operativa en una empresa B2B con 55 000+ clientes, montada en sólo dos sesiones de trabajo, y replicable a cualquier negocio con paid media + analytics + CRM.
Este Entregable 3 documenta el stack técnico definitivo del Orquestador IA de Marketing: arquitectura en 4 capas, 5 fuentes integradas vía MCP, servidor custom en FastMCP con OAuth desktop, skill propia con framework GEO/AEO de 8 bloques y roadmap detallado de closed-loop attribution.
Cierra con un catálogo de pitfalls reales y la planificación del MVP restante en tres sprints:
Defensa final: junio 2026.