KeelFramework

Keel Framework / Keel/MCP / Java

Quickstart

Keel/MCP Framework ofrece dos formas de empezar a desarrollar un nuevo MCP Server, según el nivel de personalización requerido:

  • 🚀 MCP Keel/Installer - JAR: genera rápidamente un nuevo MCP Server/scaffolding a partir de la arquitectura estándar de Keel, sin necesidad de clonar ni compilar el código fuente del framework. Recomendado
  • 🏗️ MCP Keel/Framework - Codigo fuente: permite clonar el código fuente de Keel/framework MCP, estudiar la arquitectura y adaptar o extender sus módulos según las necesidades específicas de tu proyecto. Uso Avanzado

Opción A — Generar un MCP Server mediante el Installer JAR

Esta es la opción recomendada para equipos de desarrollo que quieren usar la arquitectura estándar de Keel y empezar rápidamente a implementar las capacidades funcionales del MCP Server.

El instalador keel-mcp-archetype-installer-X.X.X.jar agrupa los componentes necesarios para generar automáticamente el scaffolding inicial del proyecto.

(1-2) Obtener el Installer JAR

Descarga el artefacto:

keel-mcp-archetype-installer-X.X.X.jar

(2-2) Generar el scaffolding

Ejecuta el instalador, indicando el nombre, versión y dominio del nuevo MCP Server:

java -jar keel-mcp-archetype-installer-X.X.X.jar <mcpName> <mcpVersion> <projectDomain> <groupId>

Por ejemplo:

$ java -jar keel-mcp-archetype-installer-1.0.0.jar mcp-petstore-sample 1.0.0 petstore io.keelframework.sample
Parámetro Descripción
mcpName Nombre del proyecto MCP que se generará.
mcpVersion Versión inicial del proyecto generado.
projectDomain Dominio o área funcional a la que pertenece el MCP Server.
groupId groupId Maven del proyecto generado (tu propio namespace en dominio inverso).

El instalador genera automáticamente la estructura base del MCP Server, incluyendo los módulos _boot, _mcp y _model, junto con la configuración necesaria para empezar a desarrollar.

El Installer JAR está diseñado como un mecanismo de scaffolding. Su objetivo es ofrecer una forma rápida y estandarizada de iniciar nuevos proyectos de MCP Server basados en la arquitectura Keel.

Opción B — Clonar y adaptar el Framework Keel

Esta opción está pensada para arquitectos y equipos que necesitan entender, personalizar o extender la arquitectura Keel.

El código fuente del framework da acceso directo a los módulos que componen la arquitectura, incluyendo:

  • common-*
  • adapter-*
  • transport-*
  • observability-*

(1-2) Clonar / compilar el framework

# Clonar
git clone https://github.com/Keel-Framework/keel-mcp-java.git
# Ir al framework y compilar sus modulos:
cd keel-mcp-java/
# Compilar:
mvn clean install

(2-2) Generar el scaffolding

Para generar un nuevo scaffolding Keel para un MCP Server, primero se necesita el siguiente artefacto: keel-mcp-archetype-installer-X.X.X.jar

# Ejecutar el instalador 
java -jar keel-mcp-archetype-installer-1.0.0.jar <mcpName> <mcpVersion> <projectDomain> <groupId>

Por ejemplo:

java -jar keel-mcp-archetype-installer-1.0.0.jar  mcp-petstore-sample 1.0.0 petstore io.keelframework.samples

Resultado de la generación del scaffolding

Una vez ejecutado el Installer de Keel, el proceso de generación finaliza y crea el nuevo MCP Server en el directorio indicado.

La siguiente salida muestra un ejemplo de ejecución del Maven Archetype, incluyendo los parámetros usados durante la generación y la confirmación de la creación del proyecto con BUILD SUCCESS.


[INFO] --- maven-archetype-plugin:3.4.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] Archetype repository not defined. Using the one from [io.keelframework.mcp:keel-mcp-archetype:1.0.0] found in catalog local
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: keel-mcp-archetype:1.0.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: io.keelframework.samples
[INFO] Parameter: artifactId, Value: mcp-petstore-sample
[INFO] Parameter: version, Value: 1.0.0
[INFO] Parameter: package, Value: io.keelframework.samples
[INFO] Parameter: packageInPathFormat, Value: io/keelframework/samples
[INFO] Parameter: package, Value: io.keelframework.samples
[INFO] Parameter: micro, Value: mcppetstoresample
[INFO] Parameter: domain, Value: petstore
[INFO] Parameter: domainName, Value: petstore
[INFO] Parameter: groupId, Value: io.keelframework.samples
[INFO] Parameter: artifactId, Value: mcp-petstore-sample
[INFO] Parameter: transport, Value: mvc
[INFO] Parameter: version, Value: 1.0.0
[INFO] Parameter: microName, Value: mcp-petstore-sample
[INFO] Parameter: architectureVersion, Value: 1.0.0
[INFO] Project created from Archetype in dir: \mcp-petstore-sample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.554 s
[INFO] ------------------------------------------------------------------------

El resultado es un nuevo proyecto de MCP Server basado en la arquitectura Keel, listo para continuar con la configuración y el desarrollo de sus capacidades MCP.

Ejecución del MCP Server

Independientemente de la opción usada para obtener el scaffolding, una vez generado el proyecto:

# Navega al directorio raíz del proyecto
cd <directory-root-install-project-mcp>

# Compila el proyecto
mvn clean install

Ejemplo práctico:

# Navega al directorio raíz del proyecto
C:\mcp-petstore-sample>
# Build the project
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for mcp-petstore-sample 1.0.0:
[INFO]
[INFO] mcp-petstore-sample ................................ SUCCESS [  1.496 s]
[INFO] mcp-petstore-sample-model .......................... SUCCESS [  6.400 s]
[INFO] mcp-petstore-sample-mcp ............................ SUCCESS [  6.397 s]
[INFO] mcp-petstore-sample-boot ........................... SUCCESS [ 11.801 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  26.490 s
[INFO] ------------------------------------------------------------------------

# Navega al modulo de Spring Boot
cd <project-boot>
# Ejecuta la aplicacion
mvn spring-boot:run
# Navega al modulo de Spring Boot
\mcp-petstore-sample\mcp-petstore-sample-boot>
# Ejecuta la aplicacion
mvn spring-boot:run

Ejemplo práctico:

[INFO] Attaching agents: []

   .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v4.0.6)
2026-09-21 19:35:53.756 INFO  [main] org.springframework.boot.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http)
2026-09-21 19:35:53.771 INFO  [main] org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
2026-09-21 19:35:53.773 INFO  [main] org.apache.catalina.core.StandardService - Starting service [Tomcat]
2026-09-21 19:35:53.774 INFO  [main] org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/11.0.21]
2026-09-21 19:35:53.844 INFO  [main] org.springframework.boot.web.context.servlet.WebApplicationContextInitializer - Root WebApplicationContext: initialization completed in 1401 ms
2026-09-21 19:35:54.176 INFO  [main] io.keelframework.mcp.adapters.rest.client.McpRestClientFactory - REST CLIENT FACTORY initialized socketTimeout=60000ms connectTimeout=60000ms requestTimeout=60000ms maxTotal=200 maxPerRoute=20 keepAlive=10000ms ssl=disabled
2026-09-21 19:35:54.728 INFO  [main] org.springframework.ai.mcp.server.common.autoconfigure.McpServerAutoConfiguration - Enable tools capabilities, notification: true
2026-09-21 19:35:54.797 WARN  [main] org.springframework.ai.mcp.annotation.provider.tool.SyncMcpToolProvider - No tool methods found in the provided tool objects: []
2026-09-21 19:35:54.798 INFO  [main] org.springframework.ai.mcp.server.common.autoconfigure.McpServerAutoConfiguration - Registered tools: 1
2026-09-21 19:35:54.798 INFO  [main] org.springframework.ai.mcp.server.common.autoconfigure.McpServerAutoConfiguration - Enable resources capabilities, notification: true
2026-09-21 19:35:54.801 INFO  [main] org.springframework.ai.mcp.server.common.autoconfigure.McpServerAutoConfiguration - Enable resources templates capabilities, notification: true
2026-09-21 19:35:54.802 INFO  [main] org.springframework.ai.mcp.server.common.autoconfigure.McpServerAutoConfiguration - Enable prompts capabilities, notification: true
2026-09-21 19:35:54.805 INFO  [main] org.springframework.ai.mcp.server.common.autoconfigure.McpServerAutoConfiguration - Enable completions capabilities
2026-09-21 19:35:55.015 WARN  [main] org.springframework.boot.security.autoconfigure.UserDetailsServiceAutoConfiguration -

Using generated security password: 6eb261f0-afa2-4562-a234-3425de350b66

This generated password is for development use only. Your security configuration must be updated before running your application in production.

2026-09-21 19:35:55.042 INFO  [main] org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer - Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
2026-09-21 19:35:55.142 INFO  [main] org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 3 endpoints beneath base path '/actuator'
2026-09-21 19:35:55.258 INFO  [main] org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
2026-09-21 19:35:55.291 INFO  [main] org.springframework.boot.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/'
2026-09-21 19:35:55.304 INFO  [main] io.keelframework.samples.Application - Started Application in 3.865 seconds (process running for 4.761)

Resumen del proceso de arranque

La aplicación debe arrancar correctamente y mostrar en los logs la inicialización exitosa del Spring Boot Application Context y de los componentes base de Keel/MCP, sin errores relacionados con la configuración, la resolución de dependencias o la inicialización de los módulos del framework.

A modo de referencia, durante el arranque deberían verse las siguientes evidencias:

Comprobación Evidencia esperada
✅ Perfil local de Spring profile is active: "local"
✅ JKS / SSL Truststore SSL TRUSTSTORE loading path=classpath:user-truststore.jks type=JKS
✅ Instancia de Tomcat Tomcat initialized with port 8080 (http)
✅ Inicialización del REST Client REST CLIENT FACTORY initialized socketTimeout=60000ms connectTimeout=60000ms requestTimeout=60000ms maxTotal=200 maxPerRoute=20 keepAlive=10000ms ssl=enabled
✅ Actuator Exposing 3 endpoints beneath base path '/actuator'
✅ Capacidades MCP Enable tools capabilities, notification: true
✅ Registro de Tools Registered tools: 1
✅ Aplicación iniciada Started Application in 12.536 seconds

El endpoint del servidor MCP está disponible en http://localhost:8080/mcp

Métodos e interacción con el MCP Server

Un servidor MCP basado en Keel proporciona los mecanismos necesarios para interactuar con las capacidades estándar del protocolo MCP, desde la inicialización de la conexión hasta el descubrimiento de Tools, Resources y Prompts.

Esta sección describe los principales métodos MCP, su propósito y los ejemplos de invocación correspondientes.

Método MCP Propósito Invocación
❤️ health Comprobar la disponibilidad y el estado del MCP Server. GET /health
🚀 initialize Inicializar la sesión MCP y negociar las capacidades soportadas por cliente y servidor. POST /mcp
🧩 tools/list Obtener la lista de Tools disponibles en el MCP Server. POST /mcp
⚙️ tools/call Invocar una Tool concreta en el MCP Server. POST /mcp
📚 resources/list Obtener la lista de Resources disponibles. POST /mcp
📖 resources/read Leer el contenido de un Resource concreto. POST /mcp
💬 prompts/list Obtener la lista de Prompts disponibles. POST /mcp
📝 prompts/get Obtener un Prompt concreto y sus mensajes asociados. POST /mcp
---

Health / Info

Propósito: comprobar el estado y la disponibilidad del MCP Server, proporcionando información básica sobre la aplicación y su ejecución.

Método Endpoint
GET http://localhost:8080/actuator/health
GET http://localhost:8080/actuator/info

initialize

Propósito: inicializar la sesión MCP, permitiendo que cliente y servidor intercambien información sobre sus capacidades, versión del protocolo e identificación antes de que comience la interacción.

Método Endpoint
POST http://localhost:8080/mcp

Cabeceras:

Cabecera Valor
Content-Type application/json
Accept text/event-stream, application/json
Authorization Bearer <jwt>

Cuerpo de la petición:

{
  "jsonrpc": "2.0",
  "method": "initialize",
  "id": 1,
  "params": {
    "protocolVersion": "2025-03-26",
    "capabilities": {},
    "clientInfo": {
      "name": "test",
      "version": "1.0"
    }
  }
}

Header de la respuesta:

mcp-session-id  : 6ad4267c-1694-4718-9ebe-828d18b7076a

Cuerpo de la respuesta:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-03-26",
    "capabilities": {
      "completions": {},
      "logging": {},
      "prompts": {
        "listChanged": true
      },
      "resources": {
        "subscribe": false,
        "listChanged": true
      },
      "tools": {
        "listChanged": true
      }
    },
    "serverInfo": {
      "name": "mcp-poc",
      "version": "1.0.0"
    }
  }
}

tools/list

Propósito: obtener la lista de Tools disponibles en el MCP Server, incluyendo su nombre, descripción y esquema de entrada, para que el cliente sepa qué capacidades puede invocar.

Método Endpoint
POST http://localhost:8080/mcp

Cabeceras:

Cabecera Valor
Content-Type application/json
Accept text/event-stream, application/json
Authorization Bearer <jwt>
Mcp-Session-Id <session-id>

Cuerpo de la petición:

{
  "jsonrpc": "2.0",
  "method": "tools/list",
  "id": 2
}

Cuerpo de la respuesta:

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "tools": [
    ]
  }
}

tools/call

Propósito: invocar una Tool concreta en el MCP Server, proporcionando los parámetros de entrada necesarios para ejecutar la operación solicitada.

Método Endpoint
POST http://localhost:8080/mcp

Cabeceras:

Cabecera Valor
Content-Type application/json
Accept text/event-stream, application/json
Authorization Bearer <jwt>
Mcp-Session-Id <session-id>

Cuerpo de la petición:

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "id": 6,
  "params": {
    "name": "suma",
    "arguments": {
      "a": 1,
      "b": 1
    }
  }
}

Cuerpo de la respuesta:

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "id": 6,
  "params": {
    "name": "suma",
    "arguments": {
      "a": 1,
      "b": 1
    }
  }
}

resources/list

Propósito: obtener la lista de Resources disponibles en el MCP Server, para que el cliente pueda descubrir los recursos que puede leer.

Método Endpoint
POST http://localhost:8080/mcp

Cabeceras:

Cabecera Valor
Content-Type application/json
Accept text/event-stream, application/json
Authorization Bearer <jwt>
Mcp-Session-Id <session-id>

Cuerpo de la petición:

{
  "jsonrpc": "2.0",
  "method": "resources/list",
  "id": 1
}

Cuerpo de la respuesta:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resources": [
    ]
  }
}

prompts/list

Propósito: obtener la lista de Prompts disponibles en el MCP Server, para que el cliente pueda descubrir los prompts que puede usar.

Método Endpoint
POST http://localhost:8080/mcp

Cabeceras:

Cabecera Valor
Content-Type application/json
Accept text/event-stream, application/json
Authorization Bearer <jwt>
Mcp-Session-Id <session-id>

Cuerpo de la petición:

{
  "jsonrpc": "2.0",
  "method": "prompts/list",
  "id": 1
}

Cuerpo de la respuesta:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "prompts": []
  }
}