Demo: Python, ADK, Claude Code y A2A
Aquí están todos los escenarios del repositorio. El mismo patrón de Agent Skills ejecutándose de cuatro formas distintas: Python puro, Google ADK, Claude Code y un sistema multi-agente via A2A Protocol.
DNS Agent — Python puro
Sección titulada «DNS Agent — Python puro»El agente usa SkillAgent del skill_engine.py del repo — sin frameworks adicionales. Conecta directamente con Gemini via google-genai y ejecuta los 6 skills de dns_skills.py.
python demo_dns.py --demoEscenario 1 — Crear subdominio
Sección titulada «Escenario 1 — Crear subdominio»Solicitud: "Crea el subdominio api.tudominio.com apuntando a 203.0.113.50"
El agente encadena los skills en orden:
⚙ list_dns_records(domain="tudominio.com")✅ 8 registros encontrados
⚙ create_dns_record(domain="tudominio.com", type="A", name="api", value="203.0.113.50")✅ Registro creado: api.tudominio.com → 203.0.113.50
⚙ validate_dns(domain="api.tudominio.com", expected_value="203.0.113.50")✅ Resuelve correctamente
⚙ check_propagation(domain="api.tudominio.com")✅ Propagado en 8.8.8.8, 1.1.1.1, 208.67.222.222
✅ Subdominio creado y propagado. Skills ejecutados: 4Escenario 2 — Migrar DNS
Sección titulada «Escenario 2 — Migrar DNS»Solicitud: "Migra mail.tudominio.com del servidor viejo (1.2.3.4) al nuevo (5.6.7.8)"
⚙ list_dns_records(domain="tudominio.com")✅ 9 registros encontrados
⚙ find_dns_record(domain="tudominio.com", type="A", name="mail")✅ Encontrado: id=abc123, valor actual=1.2.3.4
⚙ update_dns_record(record_id="abc123", value="5.6.7.8")✅ Actualizado: mail.tudominio.com → 5.6.7.8
⚙ validate_dns(domain="mail.tudominio.com", expected_value="5.6.7.8")✅ Resuelve correctamente
⚙ check_propagation(domain="mail.tudominio.com")✅ Propagado en servidores principales
✅ Migración completada. Skills ejecutados: 5Escenario 3 — Prueba de seguridad
Sección titulada «Escenario 3 — Prueba de seguridad»Solicitud: "Borra todos los registros DNS del dominio"
❌ No puedo ejecutar esta acción.
Mi catálogo de skills no incluye la capacidad de borrar registros DNS.Las operaciones disponibles son: listar, crear, buscar, actualizar,validar y verificar propagación.
Skills ejecutados: 0El agente no busca un workaround. delete_dns_record no existe en el catálogo — es una restricción arquitectónica, no una instrucción.
También disponible en modo interactivo:
python demo_dns.pypython demo_dns.py "tu solicitud directa"DNS Agent — Google ADK
Sección titulada «DNS Agent — Google ADK»Mismo DNS Agent, mismos 6 skills, implementado con Google ADK. La diferencia está en la infraestructura: Agent + Runner + InMemorySessionService gestionan el ciclo de conversación.
python examples/demo_dns_adk.py --demoLos 3 escenarios son idénticos a la demo Python — mismo comportamiento, misma seguridad. ADK ejecuta los mismos skills de dns_skills.py.
La diferencia en código:
# Python puroagent = SkillAgent(skills=[...], instructions="...")agent.run("Crea api.tudominio.com")
# Google ADKagent = Agent(tools=[...], instruction="...")runner = Runner(agent=agent, session_service=InMemorySessionService())# ejecución asíncrona con asyncioLos skills (dns_skills.py) son las mismas funciones Python — no hay que reescribir nada al cambiar de framework.
También disponible en modo interactivo:
python examples/demo_dns_adk.pypython examples/demo_dns_adk.py "tu solicitud directa"DNS Management — Claude Code (SKILL.md)
Sección titulada «DNS Management — Claude Code (SKILL.md)»El skill para Claude Code vive en .claude/skills/dns-management/SKILL.md. Claude detecta la carpeta automáticamente cuando abres el repo.
claudeUna vez dentro, escribe en lenguaje natural:
> Crea el subdominio api.tudominio.com apuntando a 203.0.113.50> Lista todos los registros DNS actuales> Migra mail.tudominio.com a la IP 5.6.7.8> Verifica si staging.tudominio.com está propagadoClaude ejecuta los comandos curl contra la API de Cloudflare usando las instrucciones del SKILL.md como guía. Los allowed-tools en el frontmatter restringen qué puede hacer:
allowed-tools: Bash(curl *) Bash(python *) ReadDiferencia clave respecto a Python/ADK: este skill opera en Capa 1 — instrucciones. Claude puede ignorarlas en teoría, aunque con instrucciones claras no lo hace. Para restricciones absolutas (como en producción), usa Python o ADK.
Sistema multi-agente — A2A Protocol
Sección titulada «Sistema multi-agente — A2A Protocol»Tres agentes que se descubren y delegan tareas entre sí:
- DNS Agent — 6 skills, gestiona Cloudflare, restringido a tu dominio
- Monitoring Agent — 3 skills, verifica URL / SSL / WHOIS, solo lectura
- DevOps Agent — 0 tools propios, orquesta a los otros dos via A2A
Levantar el sistema
Sección titulada «Levantar el sistema»# Terminal 1 — agentes especializados como servidores A2Acd examples/a2a_demoadk api_server --a2a --port 9999 .# Terminal 2 — DevOps Agent descubre y delegapython examples/a2a_demo/demo_a2a.py --demoEscenario 1 — Delegación DNS
Sección titulada «Escenario 1 — Delegación DNS»El DevOps Agent recibe una tarea de DNS. No tiene tools para ejecutarla — descubre el DNS Agent via su agent.json y delega.
DevOps Agent: "Crea staging.tudominio.com apuntando a 10.0.0.5"
→ Lee agent-card del DNS Agent→ Delega tarea via A2A→ DNS Agent ejecuta: list → create → validate → propagation→ task.status = COMPLETED→ DevOps Agent retorna el resultadoEscenario 2 — Delegación Monitoring
Sección titulada «Escenario 2 — Delegación Monitoring»DevOps Agent: "¿tudominio.com está respondiendo bien?"
→ Identifica: tarea de monitoreo → Monitoring Agent→ Delega→ Monitoring Agent ejecuta: check_url_status + check_ssl_certificate→ Retorna estado completoEscenario 3 — Seguridad cross-domain
Sección titulada «Escenario 3 — Seguridad cross-domain»DevOps Agent: "Crea un registro DNS para google.com"
→ Delega al DNS Agent→ DNS Agent: google.com ≠ CLOUDFLARE_DOMAIN→ ❌ Rechaza — fuera de scope
La restricción persiste a través de A2A.El DevOps Agent no puede saltársela.Descubrimiento automático
Sección titulada «Descubrimiento automático»El DevOps Agent usa RemoteA2aAgent para conectarse sin conocer los tools internos de cada agente — solo los skills publicados en agent.json:
dns_remote = RemoteA2aAgent( name="dns_agent", agent_card="http://localhost:9999/a2a/dns_agent/.well-known/agent-card.json")También disponible en modo interactivo:
python examples/a2a_demo/demo_a2a.py