|
| 1 | +# Arquitectura |
| 2 | + |
| 3 | +Tres partes móviles hacen funcionar la plataforma, el chat gateway, el LLM y el |
| 4 | +servidor MCP con sus herramientas de plugin, y un contrato las une. |
| 5 | + |
| 6 | +El **gateway es el único iniciador**: llama tanto al LLM como al servidor |
| 7 | +MCP y espera cada respuesta. El LLM y el servidor MCP nunca hablan entre |
| 8 | +sí, y el servidor MCP no puede interrumpir: solo habla cuando se le |
| 9 | +habla. |
| 10 | + |
| 11 | +```mermaid |
| 12 | +sequenceDiagram |
| 13 | + actor User as Usuario |
| 14 | + participant Gateway as Chat gateway |
| 15 | + participant LLM |
| 16 | + participant MCP as Servidor MCP |
| 17 | + participant Tool as Herramienta del plugin |
| 18 | + participant Data as Datasets |
| 19 | +
|
| 20 | + User->>Gateway: pregunta |
| 21 | + Gateway->>LLM: pregunta + catálogo de herramientas |
| 22 | + LLM-->>Gateway: llama esta herramienta, con estos argumentos |
| 23 | + Gateway->>MCP: ejecuta esa herramienta |
| 24 | + MCP->>Tool: despacha a la función del plugin |
| 25 | + Tool->>Data: lee |
| 26 | + Data-->>Tool: filas |
| 27 | + Tool-->>MCP: texto + tablas/gráficos/fuentes |
| 28 | + MCP-->>Gateway: ese resultado, sin cambios |
| 29 | + Gateway->>LLM: solo el texto de la herramienta |
| 30 | + LLM-->>Gateway: la respuesta, en palabras |
| 31 | + Gateway-->>User: esas palabras, más tablas/gráficos dibujados desde los datos |
| 32 | +``` |
| 33 | + |
| 34 | +Esa es toda la imagen en tiempo de ejecución, y el tiempo corre hacia |
| 35 | +abajo. El LLM le responde al gateway **dos veces, en dos momentos |
| 36 | +distintos**, y las dos respuestas no son la misma clase de cosa: |
| 37 | + |
| 38 | +- **La primera respuesta nombra una herramienta.** El modelo todavía no |
| 39 | + vio ningún dato. Está mirando el catálogo de herramientas y eligiendo |
| 40 | + una, así que esta respuesta es un pedido, no una respuesta. |
| 41 | +- **La última respuesta es la respuesta.** A esta altura la herramienta |
| 42 | + ya corrió y el gateway le entregó al modelo el texto de la |
| 43 | + herramienta, así que el modelo está escribiendo prosa sobre datos que |
| 44 | + realmente recibió. |
| 45 | + |
| 46 | +El medio del diagrama puede repetirse: si el modelo quiere una segunda |
| 47 | +herramienta, pide de nuevo y el ciclo corre una vez más antes de la |
| 48 | +respuesta final. |
| 49 | + |
| 50 | +Fíjate por dónde viajan los datos estructurados: al LLM se le entrega |
| 51 | +solo el texto de la herramienta, mientras que las tablas y los gráficos |
| 52 | +pasan de largo, directo a la pantalla del usuario, [sin pasar nunca por |
| 53 | +la IA](../overview/idea.md). |
| 54 | + |
| 55 | +## Dónde se ubica el plugin |
| 56 | + |
| 57 | +La **herramienta del plugin** es la única parte de esta imagen que sabe |
| 58 | +algo sobre un dataset específico. Todo lo que está arriba es genérico: |
| 59 | +el gateway, el LLM y el servidor MCP funcionarían igual sobre enmiendas |
| 60 | +parlamentarias o sobre un balance energético. Todo lo que está abajo es |
| 61 | +un archivo. |
| 62 | + |
| 63 | +El servidor MCP no lee datos. Recibe una llamada, despacha a la función |
| 64 | +del plugin registrada bajo ese nombre y pasa el resultado de vuelta |
| 65 | +**sin cambios**. Así que los números que ve un usuario fueron calculados |
| 66 | +por código del repo del plugin de un país, por gente que conoce esos |
| 67 | +datos, que es exactamente por qué los plugins están [acotados a un |
| 68 | +dominio que alguien entiende](../lessons/scope.md). |
| 69 | + |
| 70 | +## Lo que el diagrama deja afuera |
| 71 | + |
| 72 | +**El catálogo de herramientas llega primero.** Antes de todo esto, el |
| 73 | +gateway le pide al servidor MCP su lista de herramientas (`tools/list`) |
| 74 | +y la guarda en caché. Esa llamada es iniciativa propia del gateway y |
| 75 | +ocurre sin ninguna IA involucrada, así que para cuando al modelo se le |
| 76 | +pregunta algo, el catálogo del que elige ya está fijo. Ejecutar una |
| 77 | +herramienta es `tools/call`. |
| 78 | + |
| 79 | +**Una herramienta puede dirigirse al usuario directamente.** Además de |
| 80 | +tablas y gráficos, una herramienta puede devolver un mensaje `force`: |
| 81 | +texto que se muestra al usuario como un mensaje propio, que nunca se |
| 82 | +agrega a la conversación que lee el LLM. La herramienta le habla al |
| 83 | +humano por encima del modelo, por diseño. |
| 84 | + |
| 85 | +## El contrato |
| 86 | + |
| 87 | +Cada herramienta devuelve un texto para el LLM **y** un payload |
| 88 | +`structuredContent` para la interfaz, y ese payload debe declarar de |
| 89 | +dónde vinieron los datos. |
| 90 | + |
| 91 | +Las fuentes no son una convención. Una herramienta que no declara el |
| 92 | +contrato portador de fuentes es rechazada al arranque y nunca se vuelve |
| 93 | +invocable, lo cual es más estricto de lo que exige el estándar MCP. Mira |
| 94 | +[resultados de las herramientas](../plugins/tool-results.md) para la |
| 95 | +forma completa y cómo se hace cumplir. |
| 96 | + |
| 97 | +## Transportes |
| 98 | + |
| 99 | +El servidor MCP habla dos transportes: |
| 100 | + |
| 101 | +- **stdio**: para uso local, por ejemplo conectarlo a Claude Desktop. |
| 102 | +- **HTTP**: para despliegues reales, donde el gateway (o cualquier |
| 103 | + cliente) se conecta por la red. |
0 commit comments