Connettere server MCP
MCP (Model Context Protocol) è il modo standard per collegare tool esterni a un agente — GitHub, filesystem, Notion, database, e centinaia di altri server lo parlano. Chimera ha un client MCP di prima classe: i tool di qualsiasi server diventano ordinari tool di Chimera, sedendo nello stesso registro di quelli built-in, governati dagli stessi livelli di allowlist/kernel/ledger.
Installa l'extra del client
Il client MCP vive dietro un extra opzionale così il nucleo resta leggero:
uv sync --extra mcp
La maggior parte dei server sono pacchetti Node, quindi ti serve anche npx (incluso con
Node.js).
Smoke test di 60 secondi (senza credenziali)
Il server filesystem di riferimento non richiede alcun token — espone semplicemente tool di lettura/scrittura su una directory che scegli tu:
from chimera.integrations import connect_stdio
from chimera.tools import default_registry
connector = connect_stdio(
"fs",
"npx", ["-y", "@modelcontextprotocol/server-filesystem", "./sandbox_dir"],
name_prefix="fs_", # avoid clashes with built-in tool names
)
registry = default_registry()
for tool in connector.tools():
registry.register(tool)
print(registry.names()) # built-ins + fs_read_file, fs_write_file, fs_list_directory...
Passa quel registro a un Agent (o guarda examples/mcp_github.py per il loop completo) e il
modello può ora chiamare i tool del server come qualsiasi altro.
Un server vero: GitHub
import os
from chimera.integrations import connect_stdio
connector = connect_stdio(
"github",
"npx", ["-y", "@modelcontextprotocol/server-github"],
env={"GITHUB_PERSONAL_ACCESS_TOKEN": os.environ["GITHUB_PERSONAL_ACCESS_TOKEN"]},
name_prefix="gh_",
)
Questa è l'intera integrazione: ~26 tool GitHub (cercare repository, leggere file, elencare
issue, creare PR, ...) compaiono nel registro. Versione eseguibile end-to-end:
examples/mcp_github.py.
Come si incastra nei livelli di sicurezza
I tool MCP sono ordinari oggetti Tool, quindi tutto si compone:
- Allowlist per sessione —
restrict_registry(registry, allow=["gh_search_repositories", ...])concede solo i tool MCP di cui questa esecuzione ha bisogno; quelli non concessi non raggiungono mai il modello. - Kernel di governance —
govern_registry(...)regola le chiamate MCP con allow/warn/review/block come qualsiasi comando shell. - Ledger di taint — avvolgi con
ledger_registry(...)e i fetch MCP vengono registrati; nota che oggi solo i tool nominati inFETCH_TOOLSsono auto-classificati, quindi tratta il contenuto MCP come non fidato e preferisci girare con la semantica--taint --guardquando il server recupera dati esterni.
Chimera come server MCP
Il client sopra permette a Chimera di chiamare altri tool. Vale anche il contrario: esegui Chimera come un server MCP così qualsiasi client MCP — Claude Desktop, un IDE, un altro agente — può chiamare l'intero motore come tre tool.
uv sync --extra mcp
chimera serve --mcp # speaks MCP over stdio
Espone:
| Tool | Cosa fa |
|---|---|
chimera_solve |
Risolve un task in autonomia con piano + verifica-o-ripristina; restituisce la risposta. |
chimera_fuse |
Risponde a un prompt attraverso il motore LLM-Fusion (panel → giudice → sintetizzatore). |
chimera_memory_search |
Cerca nella memoria a lungo termine di Chimera e restituisce i fatti principali. |
Punta un client MCP verso di esso come server stdio. Per Claude Desktop, aggiungi alla sua configurazione:
{
"mcpServers": {
"chimera": { "command": "chimera", "args": ["serve", "--mcp"] }
}
}
--mcp richiede una chiave provider per chimera_solve/chimera_fuse (la ricerca in memoria
funziona senza). Aggiungi --fuse per instradare i turni profondi del solver attraverso la
fusione, --no-memory per saltare il recall. Poiché stdio è il canale, tutti i log vanno su
stderr — stdout trasporta solo il protocollo.
Parlare A2A (agente → agente)
MCP connette gli agenti a dei tool; A2A (Agent2Agent, Linux Foundation) connette gli agenti tra loro — è nativo in LangGraph, CrewAI e AutoGen. Chimera lo parla anch'esso, così un orchestratore LangGraph/CrewAI può delegare un task a Chimera e ricevere indietro un risultato completato.
chimera a2a-card # print the Agent Card JSON
chimera serve --a2a # HTTP gateway + A2A endpoint
serve --a2a aggiunge due rotte al server HTTP:
| Rotta | Scopo |
|---|---|
GET /.well-known/agent.json |
L'Agent Card — identità + skill pubblicizzate (solve, fuse). |
POST /a2a |
Ciclo di vita del task JSON-RPC 2.0: message/send, message/stream, tasks/get, tasks/cancel. |
Un client invia message/send con una parte testuale; Chimera esegue l'agente autonomo e
restituisce un task completed (o failed) che trasporta la risposta come messaggio
dell'agente. Oppure invia message/stream e ottiene uno stream di Server-Sent Events: prima
il task in stato working, poi il task completed/failed una volta terminata l'esecuzione —
così un orchestratore vede il progresso senza fare polling. L'agent card pubblicizza
capabilities.streaming: true.
Ambito, onestamente: lo stream attualmente emette due eventi (working → final), non delta di token per singolo passo, e le push notification non sono implementate. È uno stream conforme, privo di necessità di polling — sufficiente per essere un nodo streamabile di prima classe in un'app LangGraph/CrewAI.
Risoluzione dei problemi
TimeoutError: MCP server ... did not become ready— il comando non è partito. Esegui la stessa riganpx ...manualmente in un terminale per vedere il suo errore (token mancante, Node mancante, download del pacchetto al primo avvio lento — aumentaconnect_timeout).ModuleNotFoundError: mcp— installa l'extra:uv sync --extra mcp.- Collisioni di nomi di tool — passa sempre un
name_prefix. - La sessione esegue il server come sottoprocesso per tutta la vita del tuo script; chiama il
close()della sessione delconnector(o lascia semplicemente terminare il processo) per smontarlo.