Cómo integrar tu applicación con un LLM usando MCP (Model Context Protocol)

2025-04-21

Tutoriales LLM AI Large Language Models artificial intelligence java spring software

El Model Context Protocol, MCP por sus siglas en inglés, representa un avance significativo en la forma en que las aplicaciones interactúan con los LLMs (Large Lenguge Models). En este artículo, exploraremos cómo funciona MCP y crearemos nuestro propio MCP server.

¿Qué es MCP?

MCP es un protocolo que permite a las aplicaciones exponer sus capacidades y funcionalidades como herramientas (tools) que pueden ser utilizadas por LLMs. Este protocolo facilita una comunicación bidireccional entre las aplicaciones y los LLMs (Large Language Models), permitiendo que los modelos de IA puedan invocar funciones específicas del dominio de la aplicación.

¿Quién creo este protocolo?

Los creadores son la gente de Anthopic creadores tambien de Claude, ya tienen varios SDKs en los lenguajes más populares y la documentación es una pinturita!

¿Por qué usar un MCP?

Los LLMs son geniales y pueden ser entranados para hacer cosas muy específicas. Es bastante conocido que se entrenan con muchisima data, entonces, qué pasa cuando le pedimos algo de lo cual no tiene información? En mi opinión este es el problema que viene a resolver los MCP, podemos alimentar nuestro LLM con data de nuestro dominio para que ejecute una tarea con esa data que de otro modo no hubiese podido obtener. Además, te va a permitir tener una capa entre LLM y tu aplicación, lo que te permite cambiar el LLM en cualquier momento y tu código no tiene que cambiar en lo mas minimo, esto es un golazo, no?

Funcionamiento Básico

Podemos ver el diagrama abajo que explica la conexión entre los LLMs, nuestros MCPs y el resto de aplicaciones o servicios.

diagrama de comunicacion de un MCP context model protocol
  1. Exposición de Tools: Las aplicaciones definen sus capacidades como herramientas o mejor dicho tools (para usar una sola terminología, no porque me guste mezclar idiomas).

  2. Comunicación Estándar: MCP establece un formato común para el intercambio de información. En el diagrama la comunicación va en ambos sentidos, usando el model cliente-servidor; es importantisímo aclarar que en este caso el cliente es el LLM y nosotros vamos a crear un servidor MCP.

  3. Ejecución Contextual: Los LLMs pueden invocar estas herramientas basándose en el contexto de la conversación, analizan el prompt que les diste y buscan la mejor tool para ejecutar.

Ejemplo Práctico: Servicio de Datos Crypto.

Para ilustrar el funcionamiento de MCP, vamos a crear una aplicación con Spring boot que se conecte con el API REST de Kraken, un exchange de cryptos y luego usaremos este MCP con GitHub Copilot en Visual Studio Code. La integración funciona asi:

diagrama de comunicacion de github copilot con nuetro MCP server

Y lo que pasa dentro de nuestro MCP server podemos verlo asi:

diagrama de sequencia de nuestro mcp

En el diagrama podemos ver que parseamos (el objecto OhlcData) la respuesta del API de Kraken antes de devolverla al LLM. En algunos casos esto ni siquiera es necesario porque si obtenemos una respuesta en JSON, por ejemplo, y su estructura es clara, un LLM puede facilmente interpretarlo y obtener contexto de la respuesta cruda. La pregunta es, por qué parseamos entonces? Simplemente para ilustrar una implementación un poco mas compleja; en algunas integracion habran datos que no quieres que un LLM obtenga, bien sea por propiedad intelectual, datos sensibles o cualquier otra razón.

Implementación del Servidor MCP

@SpringBootApplication
public class McpDemoApplication {
    @Bean
    public ToolCallbackProvider toolCallBackProvider() {
        return MethodToolCallbackProvider.builder()
            .toolObjects(cryptoService)
            .build();
    }
}

Todo lo que hace falta para crear un servidor MCP es declarar un ToolCallbackProvider. Todo el proceso de levantar un servidor lo hace Spring AI.

Exposición de Funcionalidades

La aplicación expone sus capacidades como tools que pueden ser invocadas por los LLMs. Por ejemplo:

@Service
public class CryptoService {
    @Tool(description = "Get OHLC data for a specific crypto and interval in minutes")
    public List<OhlcData> getOHLCForPair(String pair, int interval) {
        // Implementación
    }
}

Es importante agregar descripción para darle al LLM el mejor contexto posible, para esto usamos la anotación @Tool. También existe otra anotación para parametros @ToolParam.

Configuración de Visual Studio Code.

Para habilitar MCP se requiere una configuración específica en Visual Studio Code:

  1. Un archivo mcp.json que define cómo se ejecuta el servidor MCP. Este archivo va en tu carpeta .vscode, puedes fijarte en el repo del proyecto que está al final.
  2. Configurar GitHub Copilot en modo agent para interactuar con el servidor. Ve a Settings>Features>Chat>Agent y habilita el modo Agent.

El resultado final:

Si bien no es un demo en vivo, abajo la captura de pantalla:

respuesta de copilot

Arriba al inicio el prompt que use, en el circulo rojo se ve que usa la @Tool que definimos y abajo la respuesta.

Ventajas de MCP

  1. Integración: Las aplicaciones pueden exponer sus funcionalidades de manera natural a los LLMs.
  2. Tipado Fuerte: Las herramientas se definen con tipos específicos, reduciendo errores.
  3. Contextual: Los LLMs pueden tomar decisiones informadas sobre qué herramientas usar basándose en el contexto.
  4. Extensible: Fácil adición de nuevas capacidades mediante la anotación de métodos.

Conclusiones

MCP representa un paso significativo en la evolución de la integración entre aplicaciones y LLMs. El ejemplo presentado demuestra cómo una aplicación Spring Boot puede exponer funcionalidades de manera estructurada y accesible para los LLMs. En este caso es solo el uso de un API REST, pero puede ser muchisimo más complejo.

Existen muchos MCP gratis que puedes conectar con tus LLM, ten en cuenta simpre usar los MCP en los cuales confies.

El repo de este MCP.