CLI + MCP · 100% open source · MIT

Conectores simples para tu agente. Desde la terminal.

Una colección open source de conectores: una CLI y un MCP para que Claude, Cursor, n8n o tu shell usen Search Console, GA4, Google Ads y Workspace. Empezamos por Google; vienen más. Solo lectura y errores que dicen cómo arreglarse.

Ejemplo de sesión de terminal con la CLI de CONCAT: npx @lucasleguizamo/concat login / sesión iniciada · ana@ejemplo.com / concat connect gsc / autorizando webmasters.readonly ... / probe sites.list → 3 propiedades · connected / concat gsc striking-distance --site onconcat.com / QUERY POS IMPR +CLK / facturas con n8n 11.4 1.840 ~96 / bot whatsapp pyme 9.7 920 ~61 / n8n vs make 14.2 2.310 ~48 / 3 de 41 · pos 8-20 · 28 d · sin marca

Datos de ejemplo

demo / misma pregunta, dos gateways

Qué cambia cuando el gateway piensa en tareas.

A la izquierda, lo que suele pasar con un wrapper MCP genérico. A la derecha, CONCAT. La sesión es ilustrativa.

wrapper MCP típico

tools/list
43 tools registradas (get_*, list_*, batch_* ...)
gsc_query {"rowLimit": 25000}
[{"keys":["facturas con n8n"],"clicks":4,"impressions":1840,"ctr":0.0021,"position":11.4},
{"keys":["bot whatsapp pyme"],"clicks":2,"impressions":920,"ctr":0.0022, ...
... 24.998 filas más
status
connected
gsc_query
Error 403: The caller does not have permission
  • 40+ tools
  • Dump crudo
  • "connected" falso
  • 403 opaco

CONCAT

concat tools
striking_distance · cannibalization · content_decay · ctr_gaps · gsc_ga4_join
concat gsc striking-distance --site onconcat.com
3 oportunidades · +205 clics potenciales / 28 d
concat calendar events
exit 5 · scope_lost
{ "error": "scope_lost", "module": "calendar",
"message": "Calendar perdió el permiso de lectura.",
"fix": "Reconecta solo ese módulo; los demás siguen vivos.",
"next_action": "reconnect_module",
"url": "https://gw.onconcat.com/connect/calendar" }
  • 5 tools de tarea
  • Salida compacta
  • Conectado = el probe devolvió datos
  • Error con next_action y URL

Las tools de tarea (striking distance, canibalización, content decay, CTR gaps, join GSC↔GA4) llegan en v1.1 sobre los módulos GSC y GA4. Hoy el gateway ya expone las herramientas base de lectura.

01 / problema

Conectar un agente a Google hoy sale caro y a ciegas.

  1. Cuarenta tools, cero criterio

    Los wrappers registran una herramienta por cada método de la API. El agente gasta el contexto eligiendo en vez de resolver.

  2. Dumps crudos

    Miles de filas JSON sin resumir. El modelo se ahoga en datos y tú pagas los tokens.

  3. Un "conectado" que miente

    El login termina y el panel dice OK. La primera consulta vuelve vacía y nadie sabe por qué.

  4. 403 sin salida

    Forbidden. Ni tú ni el agente saben qué permiso falta, ni en qué pantalla de Google se arregla.

  5. Permisos de más

    Scopes de escritura desde el primer día y refresh tokens en un .env que el propio agente puede leer.

02 / solución

Un gateway entre tu agente y Google.

Inicias sesión una vez. El gateway guarda el refresh token cifrado y el agente solo recibe un token del gateway. Cada servicio es un módulo con sus scopes, su probe y sus herramientas.

Agente → Gateway → Google. OAuth 2.1 hacia el agente, OAuth de Google hacia el servicio.

Fase A

Primera en verificarse

Módulos nativos. Los primeros que pasan la verificación de Google.

  • Search Console

    Tu correo debe ser usuario de la propiedad.

    scope webmasters.readonly

    • gsc_list_sites
    • gsc_performance
    • gsc_list_sitemaps
  • Google Analytics 4

    Rol Viewer en la propiedad.

    scope analytics.readonly

    • ga4_list_properties
    • ga4_daily_report
  • Google Ads

    Acceso a la cuenta, o login-customer-id del MCC.

    scope adwords

    • ads_list_customers
    • ads_search
  • People

    Perfil y contactos.

    scope userinfo.profile

Beta

Scopes sensibles

Funcionan en pruebas con lista de invitados. Requieren demo y justificación por scope.

  • Calendar

    Calendarios y eventos.

    scope calendar.events.readonly

  • Docs

    Lectura de documentos.

    scope documents.readonly

  • Sheets

    Valores y metadatos.

    scope spreadsheets.readonly

  • Slides

    Lectura de presentaciones.

    scope presentations.readonly

Beta cerrada

Scopes restringidos

Exigen evaluación de seguridad CASA, renovada cada 12 meses. Solo lista de prueba.

  • Gmail

    Scope restringido.

    scope gmail.readonly

  • Drive

    Scope restringido.

    scope drive.readonly

  • Chat

    Scope restringido.

    scope chat.messages.readonly

v1.1 · tools de tarea

Cinco preguntas, cinco tools. No cuarenta wrappers.

  • striking_distanceQueries en posición 8-20 con clics por ganar.
  • cannibalizationPáginas que compiten entre sí por la misma query.
  • content_decayQué páginas pierden tráfico y por qué.
  • ctr_gapsCTR por debajo de la curva propia del sitio.
  • gsc_ga4_joinJoin GSC↔GA4 con match_rate reportado.

03 / cómo funciona

De cero a datos en cuatro pasos.

  1. Login

    Una sola vez. Navegador con PKCE; en una máquina sin navegador, device code. El token queda en el keychain del sistema.

    shell
    npx -y @lucasleguizamo/concat@1 login
  2. Conecta un módulo

    Autorización incremental: cada módulo pide solo sus scopes de lectura, cuando lo conectas.

    shell
    concat connect gsc ga4
  3. Probe

    "Conectado" significa que la llamada de lista devolvió datos. Si viene vacía, el estado dice exactamente qué hacer.

    concat status
    gsc connected sites.list → 3
    ga4 no_resources accountSummaries → 0
    fix: GA4 → Admin → Gestión de acceso → agregar tu correo como Viewer
  4. Úsalo en tu agente

    Dos puertas, un mismo catálogo. El host MCP hace el OAuth; la CLI sirve a n8n, CI o a un agente con shell.

    Claude Code
    claude mcp add --transport http concat https://gw.onconcat.com/mcp
    Cursor · mcp.json
    {
      "mcpServers": {
        "concat": { "url": "https://gw.onconcat.com/mcp" }
      }
    }
    CLI
    concat gsc performance --site sc-domain:onconcat.com --by query

04 / por qué concat

Cuatro decisiones que no se negocian.

  • Solo lectura, y tokens que el agente nunca ve

    La v1 pide únicamente scopes de lectura. Los refresh tokens se cifran con AES-256-GCM. Escribir será un permiso por módulo, auditado y revocable.

    readOnlyHint: true
  • Open source y self-host

    Licencia MIT. Levanta tu propio gateway con tu proyecto de Google Cloud, o usa la instancia que opera CONCAT.

    LICENSE: MIT
  • Errores accionables

    Cada fallo trae message, fix y next_action. Dice en qué pantalla de Google arreglar el permiso y, cuando aplica, la URL para reconectar.

    next_action: "reconnect_module"
  • MCP y CLI, una sola superficie

    La CLI es un cliente MCP delgado. Sus subcomandos se generan desde tools/list: una tool nueva aparece en las dos puertas sin publicar versión.

    gsc_performance → concat gsc performance

05 / precios

Gratis si lo alojas tú. Hosted, en beta.

Self-host

Gratis

Licencia MIT

  • Todos los módulos y herramientas
  • Tu proyecto de Google Cloud y tu verificación
  • Tu Postgres y tu clave del vault
  • Las cuotas son las de tu proyecto
Ver en GitHub

Hosted

Beta

Lista de espera

  • Instancia operada por CONCAT en gw.onconcat.com
  • Sin proyecto de Google ni infraestructura propios
  • Módulos por fase, a medida que Google los verifica
  • Precio por definir; entrar a la lista no cuesta nada
Unirme a la lista de espera

06 / siguiente paso

Conecta tu primer módulo desde una terminal.

Open source, MIT. Prueba la CLI o apunta tu host MCP a la instancia de CONCAT.