Quarkus MCP服务器
模型上下文协议(MCP)服务器的Java+Quarkus实现,通过与OpenAI兼容的API,使用vLLM服务的LumiOpen/Lama-Poro-2-70B-Instruction模型提供高质量的芬兰文本生成。
特性
- MCP协议:完整的JSON-RPC 2.0实现,支持SSE流
- 工具:
draft_finnish-从结构化笔记中撰写高质量的芬兰语文本 - Quarkus命令模式:不需要HTTP服务器,纯stdio通信
- OpenAI兼容的API:适用于vLLM和任何与OpenAI兼容的端点
先决条件
- Java 21
- Maven 3.9+
- 使用与OpenAI兼容的API(或任何兼容的端点)运行的vLLM服务器
环境变量
必修的:
VLLM_BASE_URLvLLM服务器的基本URL(例如。,http://vllm:8000)PORO2_MODEL_NAME:型号名称(例如。,LumiOpen/Llama-Poro-2-70B-Instruct)
可选:
VLLM_API_KEY:用于身份验证的API密钥(如果需要)DEFAULT_TEMPERATURE:文本生成温度(默认值:0.7)DEFAULT_MAX_TOKENS:要生成的最大令牌数(默认值:800)
本地运行
发展模式
export VLLM_BASE_URL=http://localhost:8000
export PORO2_MODEL_NAME="LumiOpen/Llama-Poro-2-70B-Instruct"
./mvnw quarkus:dev构建并运行
# Build
./mvnw clean package
# Run
export VLLM_BASE_URL=http://localhost:8000
export PORO2_MODEL_NAME="LumiOpen/Llama-Poro-2-70B-Instruct"
java -jar target/quarkus-mcp-1.0.0-SNAPSHOT.jar测试
单元测试
./mvnw testHTTP端点
该应用程序公开了HTTP端点,以便从容器外部更容易访问:
GET /mcp/health-健康检查端点POST /mcp/initialize?id=-初始化MCP连接POST /mcp/tools/list?id=-列出可用工具POST /mcp/tools/call?id=-调用工具(需要JSON正文)POST /mcp/ping?id=-Ping端点
HTTP请求示例:
# Health check
curl http://localhost:8080/mcp/health
# Initialize
curl -X POST http://localhost:8080/mcp/initialize?id=1 \
-H "Content-Type: application/json"
# List tools
curl -X POST http://localhost:8080/mcp/tools/list?id=2 \
-H "Content-Type: application/json"
# Call tool
curl -X POST http://localhost:8080/mcp/tools/call?id=3 \
-H "Content-Type: application/json" \
-d '{
"name": "draft_finnish",
"arguments": {
"brief": "Test task",
"key_points": ["Point 1", "Point 2"]
}
}'SSE流媒体接口
应用程序通过服务器发送事件(SSE)实现MCP协议:
# Terminal 1: connect to the SSE stream
curl -N http://localhost:8080/mcp/stream?clientId=demo
# Terminal 2: send an MCP request
curl -X POST http://localhost:8080/mcp/request?clientId=demo \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "req-1",
"method": "tools/list",
"params": {}
}'
# The response appears in Terminal 1 as a streamed SSE event您可以通过以下方式发送额外的JSON-RPC请求(初始化、工具/调用、ping) /mcp/request 端点,并通过SSE流实时接收响应。
拼
echo '{"jsonrpc":"2.0","id":4,"method":"ping","params":{}}' | java -jar target/quarkus-mcp-1.0.0-SNAPSHOT.jar工具:draft_finnish
描述
根据给定的笔记撰写高质量的芬兰语文本。
输入架构
{
"type": "object",
"properties": {
"brief": {
"type": "string",
"description": "Short task summary in English or Finnish"
},
"key_points": {
"type": "array",
"items": {
"type": "string"
},
"description": "Bullet points to cover"
},
"tone": {
"type": "string",
"enum": ["neutral", "friendly", "professional", "persuasive", "concise"],
"default": "professional"
},
"length": {
"type": "string",
"enum": ["short", "medium", "long"],
"default": "medium"
},
"audience": {
"type": "string",
"description": "Intended audience (e.g., executives, developers, general)"
}
},
"required": ["brief", "key_points"],
"additionalProperties": false
}响应格式
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": ""
}
],
"isError": false
}
}码头工人
JVM映像
docker build -t quarkus-mcp:latest .
docker run -e VLLM_BASE_URL=http://vllm:8000 \
-e PORO2_MODEL_NAME="LumiOpen/Llama-Poro-2-70B-Instruct" \
-i quarkus-mcp:latest本机映像
docker build -f Dockerfile.native -t quarkus-mcp:native .
docker run -e VLLM_BASE_URL=http://vllm:8000 \
-e PORO2_MODEL_NAME="LumiOpen/Llama-Poro-2-70B-Instruct" \
-i quarkus-mcp:nativeOpenShift/Kubernetes
部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: quarkus-mcp
spec:
replicas: 1
selector:
matchLabels:
app: quarkus-mcp
template:
metadata:
labels:
app: quarkus-mcp
spec:
containers:
- name: quarkus-mcp
image: quarkus-mcp:latest
env:
- name: VLLM_BASE_URL
valueFrom:
configMapKeyRef:
name: quarkus-mcp-config
key: vllm-base-url
- name: PORO2_MODEL_NAME
valueFrom:
configMapKeyRef:
name: quarkus-mcp-config
key: poro2-model-name
- name: VLLM_API_KEY
valueFrom:
secretKeyRef:
name: quarkus-mcp-secret
key: api-key
stdin: true
tty: true康福特地图
apiVersion: v1
kind: ConfigMap
metadata:
name: quarkus-mcp-config
data:
vllm-base-url: "http://vllm:8000"
poro2-model-name: "LumiOpen/Llama-Poro-2-70B-Instruct"秘密
apiVersion: v1
kind: Secret
metadata:
name: quarkus-mcp-secret
type: Opaque
stringData:
api-key: "your-api-key-here"建筑
- 主指挥部:从stdin读取JSON-RPC并写入stdout的入口点
- McpService:处理MCP协议方法(初始化、工具/列表、工具/调用、ping)
- DraftFinnishTool:构建提示并调用vLLM API的工具实现
- OpenAiClientService:OpenAI兼容REST客户端的服务包装器
- OpenAIClient:vLLM API的Quarkus REST客户端接口
日志记录
所有日志都写入stderr,以避免损坏stdout上的JSON-RPC流。配置登录 application.properties 或通过系统属性。
错误处理
服务器实现了正确的JSON-RPC 2.0错误代码:
-32700:分析错误-32600:无效请求-32601:未找到方法-32602:无效参数-32603:内部错误
许可证
Apache许可证2.0
