SnapContext implementa un cliente MCP estándar que le permite conectarse a servidores MCP externos (como los que usan Claude Code, Cline o OpenCode) y exponer sus herramientas al agente ReAct como si fueran nativas.
El Model Context Protocol es un estándar abierto que define cómo un cliente (IDE, agente, CLI) se comunica con servidores de herramientas mediante JSON-RPC 2.0 sobre stdin/stdout.
SnapContext actúa como cliente MCP: lanza los servidores configurados,
negocia el protocolo y traduce las llamadas del agente en peticiones
tools/list y tools/call.
Se soporta la versión 2024-11-05 del protocolo MCP. El código está
preparado para actualizarse cuando el estándar evolucione (la versión se
define en la constante PROTOCOLO_MCP de mcp_client.py).
Los servidores MCP se configuran en un fichero mcp_servers.json:
./mcp_servers.json (tiene precedencia).~/.snapcontext/mcp_servers.json.{
"servers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/ruta/al/proyecto"],
"env": {},
"enabled": true
},
"git": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "/ruta/al/proyecto"],
"env": {},
"enabled": true
}
}
}
Cada servidor requiere:
| Campo | Tipo | Descripción |
|---|---|---|
command |
string | Comando ejecutable (en PATH o ruta absoluta). |
args |
list | Argumentos que se pasan al comando. |
env |
dict | Variables de entorno adicionales (opcional). |
enabled |
bool | false desactiva el servidor sin borrarlo. |
Seguridad: los comandos se ejecutan con
subprocess.Popenusando lista de argumentos (shell=False). Nunca se interpola en un string de shell.
Algunos servidores MCP conocidos que puedes configurar:
| Servidor | Comando |
|---|---|
| Filesystem | npx -y @modelcontextprotocol/server-filesystem /ruta |
| Git | uvx mcp-server-git --repository /ruta |
| GitHub | npx -y @modelcontextprotocol/server-github |
| Postgres | npx -y @modelcontextprotocol/server-postgres URL |
| SQLite | uvx mcp-server-sqlite --db-path /ruta/db.sqlite |
| Puppeteer | npx -y @modelcontextprotocol/server-puppeteer |
snapcontext mcp list # Lista servidores y herramientas
snapcontext mcp add <nombre> <comando> [args...]
# Añade un servidor a la configuración
snapcontext mcp remove <nombre> # Elimina un servidor
snapcontext mcp help # Muestra ayuda
snapcontext mcp add filesystem \
npx -y @modelcontextprotocol/server-filesystem /home/user/proyecto
Tras añadirlo, snapcontext mcp list muestra las herramientas expuestas
(read_file, write_file, list_directory, …) y el agente ReAct puede
usarlas automáticamente con el prefijo mcp_filesystem_.
Las herramientas de servidores MCP externos se registran en el catálogo de
herramientas con el prefijo mcp_<servidor>_<herramienta> para evitar
colisiones con las nativas (grep, read_file, git_status, …).
El dispatcher _ejecutar_herramienta_mcp reconoce automáticamente las
herramientas externas y las enrutan al cliente MCP correspondiente.
Si un servidor MCP no arranca (comando inexistente, handshake fallido, timeout), SnapContext muestra un aviso y continúa: el servidor queda marcado como caído para no reintentarlo en la misma sesión, y el resto del sistema sigue funcionando sin interrupción.
┌──────────────────────────────────────────────────────────┐
│ Agente ReAct │
│ "lee el archivo src/main.py" │
└──────────────┬───────────────────────────────────────────┘
│ _ejecutar_herramienta_mcp("mcp_fs_read_file", ...)
▼
┌──────────────────────────────────────────────────────────┐
│ mcp_tools.py — dispatcher │
│ detecta prefijo mcp_ → enruta al cliente │
└──────────────┬───────────────────────────────────────────┘
│ cliente.call_tool("fs", "read_file", {...})
▼
┌──────────────────────────────────────────────────────────┐
│ mcp_client.py — MCPClient │
│ JSON-RPC 2.0 sobre stdin/stdout │
│ initialize → tools/list → tools/call │
└──────────────┬───────────────────────────────────────────┘
│ subprocess.Popen (shell=False)
▼
┌──────────────────────────────────────────────────────────┐
│ Servidor MCP externo (filesystem, git, github, ...) │
└──────────────────────────────────────────────────────────┘
Los tests de tests/test_mcp_client.py verifican el handshake JSON-RPC,
list_tools, call_tool y la degradación elegante usando mocks de
subprocess.Popen (no requieren servidores externos instalados).
Para ejecutar solo los tests de MCP:
pytest tests/test_mcp_client.py -v
Incluye un test de integración opcional (test_integracion_server_filesystem_real)
que se marca skip por defecto porque requiere npx y descargar el paquete
@modelcontextprotocol/server-filesystem. Desmárcalo para probar con un
servidor real.