关于 Pure Java 21 MCP Server
Pure Java 21 MCP Server 是一个从头实现的 Java 21 MCP 服务,适合研究 MCP 协议实现的开发者。它不依赖专用 MCP SDK,通过 STDIO 传输并提供 echoTool 示例。
主要功能
- 01纯 Java 21 实现
- 02支持 JSON-RPC 2.0 消息
- 03通过 STDIO 传输消息
- 04实现 MCP 初始化与关闭流程
- 05提供 echoTool 工具
适用场景
- 01研究 Java 中的 MCP 服务实现
- 02测试基于 STDIO 的 MCP 通信
- 03参考工具定义与调用处理
MCP 相关
它实现 MCP 服务端核心流程,通过 STDIO 接收客户端消息,并提供 echoTool。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
纯 Java 21 MCP 服务
本项目使用纯 Java 21 实现了一个 Model Context Protocol(MCP)服务,严格遵循(概念上的)2025-03-26 MCP 规范。本项目从零开始构建,未使用外部 MCP 专用 SDK。
前置条件
- Java 21 SDK: 确保已安装并配置 Java 21(或更高版本)。
- Gson 库: 此服务使用 Gson 库解析和序列化 JSON。你需要下载 Gson JAR 文件。
- 通常可以从 Maven Central 下载。搜索“Gson”或
com.google.code.gson:gson,然后下载 JAR(例如,gson-2.10.1.jar或更高版本)。 - 将下载的 Gson JAR(例如,
gson-2.10.1.jar)放在已知位置,例如本项目中的lib目录(lib/gson-2.10.1.jar)。以下编译和运行命令假设 JAR 位于此位置。
- 通常可以从 Maven Central 下载。搜索“Gson”或
项目结构
src/:包含 Java 源代码。main/java/io/modelcontextprotocol/server/:根包。jsonrpc/:用于 JSON-RPC 消息结构、解析和错误处理的类。messages/:用于 MCP 专用消息负载的类(初始化、工具定义等)。tools/:工具的实现(例如,EchoTool)。transport/:传输层处理(例如,StdioTransport)。McpServer.java:服务的核心逻辑。Main.java:应用程序入口点。
lib/:(推荐)创建此目录以存放 Gson JAR。mcp-server.log:服务运行期间生成的日志文件。.gitignore:指定 Git 应忽略的未跟踪文件。README.md:本文件。
编译
-
创建目录:
- 确保项目根目录中有一个
lib目录,并将 Gson JAR 文件(例如,gson-2.10.1.jar)放在其中。 - 在项目根目录中创建一个
bin目录,用于存放编译后的类文件:mkdir lib mkdir bin # Download Gson JAR and place it in lib/ # For example: wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar -P lib/
- 确保项目根目录中有一个
-
编译服务: 在项目根目录中打开终端或命令提示符。 如果使用不同版本的 Gson 或不同的路径,请调整
lib/gson-2.10.1.jar。Nix(Linux/macOS):
javac -d bin -cp "lib/gson-2.10.1.jar:src/main/java" $(find src/main/java -name "*.java")Windows(命令提示符):
javac -d bin -cp "lib\gson-2.10.1.jar;src\main\java" $(powershell -Command "(Get-ChildItem -Recurse -Filter *.java src\main\java | Select-Object -ExpandProperty FullName) -join ';' ")如果
$(powershell ...)命令无法直接在cmd.exe中运行,你可能需要手动列出文件,或采用其他方法:javac -d bin -cp "lib\gson-2.10.1.jar;src\main\java" src\main\java\io\modelcontextprotocol\server\*.java src\main\java\io\modelcontextprotocol\server\jsonrpc\*.java src\main\java\io\modelcontextprotocol\server\messages\*.java src\main\java\io\modelcontextprotocol\server ools\*.java src\main\java\io\modelcontextprotocol\server ransport\*.java(手动列出文件时,请确保包含所有包路径。)
运行服务
成功编译后,在项目根目录中运行服务:
Nix(Linux/macOS):
java -cp "bin:lib/gson-2.10.1.jar" io.modelcontextprotocol.server.Main
Windows(命令提示符):
java -cp "bin;lib\gson-2.10.1.jar" io.modelcontextprotocol.server.Main
服务将启动,并在标准输入(STDIO)上监听 JSON-RPC 消息。
已实现的功能
- 传输方式: STDIO(使用 Content-Length 标头对消息进行帧封装)。
- JSON-RPC: 解析和序列化 Version 2.0 消息。
- MCP 核心:
initialize请求:服务端响应其功能。initialized通知:客户端确认初始化。shutdown请求:服务端确认并准备退出。exit通知:服务端终止。
- 工具:
- 基本的“工具”功能。
- 对
echoTool的tool/call请求。 echoTool:一个回显消息的简单工具。- 输入架构:
{ "type": "object", "properties": { "message": { "type": "string" } } } - 输出架构:
{ "type": "object", "properties": { "response": { "type": "string" } } }
- 输入架构:
- 日志记录: 服务端活动会记录到
mcp-server.log(FINE 级别及以上)和控制台(INFO 级别及以上)。
交互示例(通过 STDIO)
消息以 Content-Length 和 \r\n\r\n 为帧头,后接 JSON 正文。
1. 客户端 -> 服务端:initialize 请求
Content-Length: 123
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"processId":1234,"capabilities":{}}}
(注意:params 中的 processId 和 capabilities 等内容仅为 initialize 的示例,目前会被此服务端忽略。)
2. 服务端 -> 客户端:initialize 响应
Content-Length: 297
{"jsonrpc":"2.0","id":1,"result":{"capabilities":{"tools":[{"name":"echoTool","description":"A simple tool that takes a 'message' string and returns it prefixed with 'Echo: '.","inputSchema":{"type":"object","properties":{"message":"string"}},"outputSchema":{"type":"object","properties":{"response":"string"}}}]}}}
(实际的 Content-Length 会根据具体格式而变化。服务端会计算该值。)
3. 客户端 -> 服务端:initialized 通知
Content-Length: 40
{"jsonrpc":"2.0","method":"initialized"}
(通知没有 id。服务端不会响应。)
4. 客户端 -> 服务端:针对 echoTool 的 tool/call 请求
Content-Length: 107
{"jsonrpc":"2.0","id":2,"method":"tool/call","params":{"toolName":"echoTool","params":{"message":"Hello MCP!"}}}
5. 服务端 -> 客户端:tool/result 响应
Content-Length: 74
{"jsonrpc":"2.0","id":2,"result":{"response":"Echo: Hello MCP!"}}
6. 客户端 -> 服务端:shutdown 请求
Content-Length: 49
{"jsonrpc":"2.0","id":3,"method":"shutdown","params":{}}
7. 服务端 -> 客户端:shutdown 响应
Content-Length: 34
{"jsonrpc":"2.0","id":3,"result":null}
8. 客户端 -> 服务端:exit 通知
Content-Length: 36
{"jsonrpc":"2.0","method":"exit","params":{}}
(随后服务端终止,不会响应。)
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。