mcpField
P
Pure Java 21 MCP Server

Pure Java 21 MCP Server

本地服务
github.com/aliaksandr-haurylau-godel开发工具073 周前更新

关于 Pure Java 21 MCP Server

Pure Java 21 MCP Server 是一个从头实现的 Java 21 MCP 服务,适合研究 MCP 协议实现的开发者。它不依赖专用 MCP SDK,通过 STDIO 传输并提供 echoTool 示例。

主要功能

  1. 01纯 Java 21 实现
  2. 02支持 JSON-RPC 2.0 消息
  3. 03通过 STDIO 传输消息
  4. 04实现 MCP 初始化与关闭流程
  5. 05提供 echoTool 工具

适用场景

  1. 01研究 Java 中的 MCP 服务实现
  2. 02测试基于 STDIO 的 MCP 通信
  3. 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 位于此位置。

项目结构

  • 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:本文件。

编译

  1. 创建目录:

    • 确保项目根目录中有一个 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/
      
  2. 编译服务: 在项目根目录中打开终端或命令提示符。 如果使用不同版本的 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":{}}

(随后服务端终止,不会响应。)

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。