MCP en Java, paso a paso (+Inspector & VsCode)
Creamos un servidor MCP con Spring AI para conectar la IA con tu negocio y lo probamos con MCP Inspector y VSCode
MCP es la joya de la corona en la expansión de la IA, teóricamente permite conectar la IA con cualquier sistema, la idea resumida es bastante simple, ejecutas un prompt en una IA y en dependencia de las herramientas que exponga to servicio MCP y la descripción que tengan el LLM ejecutará una función en la herramienta. Se pasarán los parámetros que exija la función llamada y el resultado de la función nuevamente es “moderado“ por el modelo, creando una mejora en la respuesta; es un enfoque para mejorar la calidad de las respuestas con valores actualizados (un tipo de RAG y forma de “disminuir“ la posibilidad de alucionaciones).
Vamos por el principio.
Conceptualmente Model Context Protocol (MCP) es un estándar abierto desarrollado por Anthropic que busca estandarizar la forma en que las aplicaciones de inteligencia artificial, especialmente aquellas basadas en modelos de lenguaje grandes (LLMs), interactúan con fuentes de datos y herramientas externas.
Si te gusta y ves útil el contenido considera apoyar mi trabajo con una contribución en Patreon.
MCP funciona bajo un esquema de arquitectura Cliente/Servidor.
Cliente MCP: Es el componente dentro del host que se encarga de la comunicación con los servidores. Cada cliente mantiene una conexión 1:1 con un servidor MCP específico.
Servidor MCP: Es un programa que expone una fuente de datos o servicio externo a través del protocolo MCP. Actúa como adaptador, conectando con una fuente (como un sistema de archivos local, una API web, una base de datos, etc.) y presentándola de forma estandarizada al cliente MCP.
A nivel de transporte existen dos mecanismos principales para la comunicación entre el cliente y el servidor:
stdio (entrada/salida estándar): Este método utiliza los flujos estándar de entrada y salida del sistema operativo para la comunicación. Es especialmente útil en entornos donde el cliente y el servidor se ejecutan en el mismo proceso o en procesos estrechamente acoplados.
HTTP con Server-Sent Events (SSE): Este enfoque emplea HTTP junto con SSE para permitir una comunicación unidireccional desde el servidor al cliente. En este enfoque el cliente inicia la solicitud y luego el servidor puede enviar multiples solicitudes.
¿Cómo crear un servidor MCP?
Aunque en el artículo anterior hablamos un poco del tema, en este vamos a ir mas en profundidad en el tema.
Como es costumbre, usaremos Spring AI; a diferencia del artículo anterior en este caso usaremos como sistema de transporte stdio
, después de crear el servidor vamos a conectarlo con MCP Inspector y con VisualStudio Code (luego hablamos más de esto, pero es super importante).
Crear un servidor MCP es básicamente exponer Tools que “hacen cosas“, lo que van a hacer estas herramientas es cualquier cosa que se te puedo ocurrir … llamar a una API externa, leer un fichero, enviar un email … cualquier cosa.
Paso 1: Crear un proyecto Spring y agregar dependencias.
La forma rápida es entrar a Spring Starter y agregar la dependencia de Model Context Protocol Server:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
Paso 2: Crear las herramientas que queremos exponer en un servicio común de Spring.
En este ejemplo creamos 2 herramientas, una que devuelve la cantidad de libros para niños y otra que dado un título devuelve la descripción del libro correspondiente.
@Tool(name = "get_books", description = "Get the total of books for children")
public int countBooks() {
return books.size();
}
@Tool(name = "get_books_by_title", description = "Get the total of books for children")
public String getDescription(@ToolParam(description = "the book title") String title) {
return books.getOrDefault(title, "The book was not found");
}
Paso 3: Exponer las herramientas
Para esto solo creamos un Bean de Spring con la lista de herramientas que queremos exponer:
@Bean
public List<ToolCallback> toolCallbackProvider(BookService bookService){
return List.of(ToolCallbacks.from(bookService));
}
Paso 4: Definir la configuración correcta
spring.ai.mcp.server.name=mcp-server-example
spring.ai.mcp.server.version=0.0.1
spring.ai.mcp.server.stdio=true
spring.main.web-application-type=none
spring.main.banner-mode=off
logging.pattern.console=
Es fundamental habilitar el modo stdio en el servidor, deshabilitar los logs y el banner de Spring; sin esto no va a funcionar el servidor en el modo stdio, para usar SSE no importa el tema de los logs.
Una vez terminado el desarrollo del servidor MCP pasamos a construir el jar.
mvn package
El jar quedará en la carpeta target/. Desde ahí lo referenciaremos para ejecutarlo con java -jar path. También puedes mover el jar a otro lugar.
¿Cómo probar un servidor MCP?
Para probar un servidor MCP podemos hacerlo de varias formas, IDEs como VisualStudio Code con Github Copilot en modo agente incorporan un mecanismo para comunicarse con los servidores MCP. También existe MCP Inspector, una UI para probar.
MCP con VisualStudio Code
La combinación de MCP con VisualStudio code además de servir para poder probar los servidores es poderosa, pues permite agregar herramientas para elevar nuestra productividad como desarrolladores.
Para configurar el servidor MCP es importante tener VisualStudio code con Copilot (en la capa gratuita funciona esto) en modo agente:
Luego pulsar en el icono de Select Tools en la imagen (Ctrl + Shift + /, en Linux).
Saltará un diálogo que nos guiará para asociar el servidor MCP a VisualStudio, al final de proceso se generará un JSON de config, similar al siguiente:
{
"mcp": {
"servers": {
"example-mcp-server": {
"type": "stdio",
"command": "java",
"args": [
"-jar",
"/home/yoandypv/mcp-server-example/target/mcp-server-example-0.0.1-SNAPSHOT.jar"
]
}
}
}
}
Saldrá además un pequeño menú contextual para iniciar el servidor MCP configurado.
Una vez se esta ejecutando el servidor MCP, ya podemos interactuar con el chat de Copilot y el modelo seleccionado (en esta oportunidad estoy usando Claude 3.5 Sonnet) decidirá como usar nuestras herramientas, por ejemplo:
La magia de la IA, ahora se puede poner uno creativo con las herramientas y hacerlas productivas, no como esta que es solo un ejemplo básico. Si te fijas bien ejecutó “get_books“
, que es el @Tool name que especificamos en el método.
MCP Inspector
Esta es una utilidad para probar servidores MCP, que funciona igual tanto con stdio como con SSE. Esta solución permite explorar las herramientas disponibles, revisar variables de entorno, invocar las herramientas, etc.
Es una utilidad desarrollada en node. Acá puedes consultar más información de la misma.
Una vez instalada (en el link está como hacerlo) debemos ejecutarla apuntando al servidor creado, por ejemplo:
npx @modelcontextprotocol/inspector java -jar /home/yoandypv/mcp-server-example/target/mcp-server-example-0.0.1-SNAPSHOT.jar
Esto disponibilizará una interfaz web en el puerto 6274.
Solo queda abrir el enlace y tendremos acceso a todo para probar nuestro servidor MCP.
Bueno, hasta acá el artículo de hoy, espero te sea útil, el código como siempre está disponible en Github.
Si te gusta y ves útil el contenido considera apoyar mi trabajo con una contribución en Patreon.