ai-agentsagent-mdmcpclaude-codepatterns

El Patrón AGENT.md: Enseñando a los Agentes de IA a Usar Tus Herramientas

Michael San Martim · 2026-04-28

Le das a un agente de IA acceso a tu plataforma de datos. Tiene el CLI instalado. Tiene el SDK de Python disponible. ¿Qué hace?

Adivina. Alucina flags. Inventa métodos de API que no existen. Gasta 4 llamadas de herramientas averiguando el flujo de trabajo básico, quemando tokens y tu paciencia.

Hay una forma mejor. Un solo archivo Markdown que enseña a cualquier agente de IA exactamente cómo usar tus herramientas. Lo llamamos AGENT.md.

El Problema

Esto es lo que pasa cuando un agente de IA intenta usar una herramienta sin documentación:

Agent: I'll use the dataspoc CLI to ingest data.
Agent: Running: dataspoc ingest --from postgres --to s3://bucket
Error: No such command 'ingest'
Agent: Let me try: dataspoc pipe create --source postgres
Error: No such command 'pipe'
Agent: Maybe: dataspoc-pipe --help
[reads 50 lines of help text, burns 2000 tokens]
Agent: OK, I think it's: dataspoc-pipe run my-pipeline
Error: Pipeline 'my-pipeline' not found. Run 'dataspoc-pipe add' first.

Cuatro intentos, cuatro fallos. El agente eventualmente lo logra, pero tomó 8 llamadas de herramientas y 10,000 tokens de tanteo.

La Solución: AGENT.md

AGENT.md es un archivo Markdown diseñado específicamente para que los agentes de IA lo lean. No para humanos (ellos tienen README), no para código (eso son los docstrings). Para agentes.

Este es el AGENT.md de DataSpoc:

# AGENT.md — DataSpoc Platform
## Capabilities
| Action | Tool | Command |
|--------|------|---------|
| Ingest data | Pipe | `dataspoc-pipe run <pipeline>` |
| Add new source | Pipe | `dataspoc-pipe add <name> --source <type>` |
| Query data | Lens | `dataspoc-lens shell` then SQL |
| Ask questions | Lens | `dataspoc-lens ask "<question>"` |
| Train model | Lens | `dataspoc-lens ml train --table <t> --target <col>` |
| Predict | Lens | `dataspoc-lens ml predict --model <name> --input <table>` |
## Python SDK
```python
from dataspoc_pipe import PipeClient
from dataspoc_lens import LensClient
pipe = PipeClient(project_path="./my-project")
lens = LensClient(bucket_alias="company")
# Ingest
pipe.run("my-pipeline")
# Query
result = lens.sql("SELECT * FROM raw__postgres__orders LIMIT 10")
# AI Ask
answer = lens.ask("What is the total revenue this month?")
# Train
lens.ml_train(table="curated__sales__customers", target="churned", model_name="churn-v1")

Patterns

Ingest then Query

  1. pipe.run("pipeline-name")
  2. lens.sql("SELECT COUNT(*) FROM raw__source__table")

Explore then Model

  1. lens.tables() — see what is available
  2. lens.sql("SELECT * FROM table LIMIT 5") — understand the schema
  3. lens.ml_train(table=..., target=..., model_name=...) — train

Ask then Verify

  1. lens.ask("business question") — get SQL + result
  2. lens.sql(answer.sql) — re-run to verify

Constraints

  • Never modify bucket structure directly. Always use Pipe or Lens.
  • Table names follow: layer__source__tablename (double underscore).
  • Pipe writes raw/ and curated/. Lens writes gold/.
  • ML models go to ml/models/. Predictions go to ml/predictions/.
  • All credentials come from environment variables. Never hardcode.

Error Recovery

ErrorCauseFix
”Pipeline not found”Wrong nameRun pipe.list_pipelines()
”Table not found”Data not ingestedRun the pipeline first
”No manifest”Bucket not initializedRun dataspoc-pipe init
”Access denied”Missing AWS credsCheck AWS_* env vars
## Por Qué Funciona
Los agentes de IA (Claude, GPT-4, Gemini, modelos locales) comparten un comportamiento: leen contexto y siguen instrucciones. Cuando encuentran AGENT.md:
1. **Escanean la tabla de capacidades** — saben exactamente qué acciones son posibles
2. **Copian los ejemplos del SDK de Python** — usan la sintaxis correcta en el primer intento
3. **Siguen los patrónes** — ejecutan flujos de trabajo de múltiples pasos correctamente
4. **Respetan las restricciones** — evitan errores comunes
5. **Usan la recuperación de errores** — se autocorrigen sin ensayo y error
El resultado: una llamada de herramienta en lugar de ocho. Correcto en el primer intento.
## Comparación: Tres Enfoques
### Sin Documentación

Agent behavior:

  • Guesses command names (wrong 80% of the time)
  • Invents flags that don’t exist
  • Takes 5-10 attempts to complete a task
  • Burns 10,000+ tokens on exploration
  • May give up entirely
### README.md (Diseñado para Humanos)

Agent behavior:

  • Finds installation instructions (not useful, already installed)
  • Reads feature list (marketing language, not actionable)
  • Finds some code examples (buried in prose)
  • Takes 2-4 attempts to complete a task
  • Burns 5,000+ tokens parsing human-friendly text
### AGENT.md (Diseñado para Máquinas)

Agent behavior:

  • Finds exact command in capabilities table (1 lookup)
  • Copies Python SDK example (correct syntax)
  • Follows pattern for multi-step task (no guessing)
  • Completes task on first attempt
  • Burns <1,000 tokens on the documentation
## Cómo Escribir AGENT.md para Tus Propias Herramientas
### Paso 1: Tabla de Capacidades
Lista cada acción que tu herramienta puede hacer. Una fila por acción. Incluye el comando exacto o la llamada a función.
```markdown
## Capabilities
| Action | Command/Function |
|--------|-----------------|
| Create user | `api.create_user(email, name)` |
| List users | `api.list_users(filters={})` |
| Delete user | `api.delete_user(user_id)` |

Paso 2: Ejemplos de Código

Muestra el import exacto y la inicialización. Muestra las operaciónes más comunes con código real y ejecutable:

## SDK
```python
from myservice import Client
client = Client(api_key=os.environ["MY_API_KEY"])
# Create
user = client.create_user(email="test@example.com", name="Test")
# Read
users = client.list_users(filters={"active": True})
# Update
client.update_user(user.id, name="New Name")
### Paso 3: Patrones (Flujos de Trabajo de Múltiples Pasos)
Los agentes necesitan saber el orden de las operaciónes. Muestra flujos de trabajo comunes cómo pasos numerados:
```markdown
## Patterns
### Onboard a New Customer
1. `client.create_org(name="Acme")`
2. `client.create_user(email="admin@acme.com", org_id=org.id, role="admin")`
3. `client.send_invite(user.id)`
### Generate Monthly Report
1. `data = client.get_metrics(period="last_month")`
2. `report = client.generate_report(data, format="pdf")`
3. `client.email_report(report, recipients=["cfo@company.com"])`

Paso 4: Restricciones

¿Qué NO debe hacer nunca el agente? ¿Cuáles son las reglas firmes?

## Constraints
- Never delete production data without confirmation
- Always use pagination for list endpoints (max 100 per page)
- Rate limit: 60 requests per minute
- IDs are UUIDs, never integers
- Dates are always ISO 8601 with timezone

Paso 5: Tabla de Recuperación de Errores

Los agentes encuentran errores. Diles qué significa cada error y cómo soluciónarlo:

## Error Recovery
| Error | Fix |
|-------|-----|
| 401 Unauthorized | Re-check API_KEY env var |
| 404 Not Found | Verify resource ID with list endpoint |
| 429 Rate Limited | Wait 60 seconds, retry |
| 500 Server Error | Retry up to 3 times with backoff |

Plantilla Completa

Aquí hay una plantilla para copiar y pegar para tus propias herramientas:

# AGENT.md — [Your Tool Name]
## Capabilities
| Action | Command/Function | Returns |
|--------|-----------------|---------|
| ... | ... | ... |
## Setup
```python
from your_tool import Client
client = Client() # or however initialization works

Common Operations

# Operation 1
result = client.do_thing(param1, param2)
# Operation 2
items = client.list_things(filter="active")

Patterns

Pattern Name

  1. Step one
  2. Step two
  3. Step three

Constraints

  • Rule 1
  • Rule 2
  • Rule 3

Error Recovery

ErrorCauseFix
## Dónde Colocar AGENT.md
Colócalo donde los agentes de IA lo encontrarán:
- **Raíz del repositorio** — los agentes explorando tu código base lo encontrarán inmediatamente
- **Directorio del paquete** — los agentes usando tu paquete instalado pueden localizarlo
- **Sitio de documentación** — los agentes con acceso web pueden descargarlo
- **System prompt** — si controlas el agente, inyéctalo directamente
DataSpoc incluye AGENT.md en el paquete instalado:
```python
import importlib.resources
agent_instructions = importlib.resources.read_text("dataspoc_lens", "AGENT.md")

Los servidores MCP pueden exponerlo cómo un recurso:

@server.resource("dataspoc://agent-instructions")
def get_agent_instructions():
return read_file("AGENT.md")

Impacto en el Mundo Real

Probamos la misma tarea (“ingestar datos de Postgres y entrenar un modelo de churn”) con y sin AGENT.md en tres agentes de IA:

AgentSin AGENT.mdCon AGENT.md
Claude7 llamadas, 2 errores3 llamadas, 0 errores
GPT-49 llamadas, 4 errores3 llamadas, 0 errores
Gemini11 llamadas, 5 errores4 llamadas, 1 error

El patrón funcióna porque coincide con la forma en que los agentes procesan información: estructurada, escaneable, lista para copiar y pegar. Sin prosa que analizar, sin ambigüedad que resolver, sin contexto humano que inferir.

Escribe un AGENT.md para tus herramientas. Tus agentes de IA te lo agradecerán funciónando correctamente en el primer intento.

Recomendados