该项目演示了使用Kotlin中的模型上下文协议(MCP)实现的最小“Hello World”应用程序。它包括一个简单的MCP服务器,该服务器公开了一个“greet”工具,以及一个对应的MCP客户端,该客户端连接到服务器,发现该工具,并允许交互执行。
此示例旨在展示MCP的核心客户端-服务器通信,而不涉及任何外部AI模型或复杂的业务逻辑。
模型上下文协议(MCP)是一个开源标准,用于将AI应用程序连接到外部系统。它提供了一种标准化的方式,使AI应用程序(如LLMs)能够访问数据源、工具和工作流,从而使其能够检索信息并在外部世界中执行任务。
可以将MCP视为AI模型的通用适配器,允许它们扩展其能力,超越内部知识,与现实世界系统进行互动。
此项目具有多模块Gradle设置:
mcp-hello-world/
├── build.gradle.kts // 根Gradle配置
├── settings.gradle.kts // 多模块项目的Gradle设置
├── client/ // 客户端模块
│ ├── build.gradle.kts
│ └── src/main/kotlin/eu/torvian/mcp/helloworld/client/
│ ├── HelloWorldClient.kt // MCP客户端实现
│ └── main.kt // 客户端入口点
├── docs/MCP/ // MCP及相关SDK的文档
│ ├── Architecture-overview.md // MCP架构概述
│ ├── Clients.md // MCP客户端文档
│ ├── Servers.md // MCP服务器文档
│ ├── Specification.md // MCP详细规范
│ ├── Versioning.md // MCP版本策略
│ ├── What-is-MCP.md // MCP简介
│ └── Kotlin-SDK-0.7.3/ // MCP Kotlin SDK的源代码
├── gradle/
│ ├── libs.versions.toml // 依赖项版本目录
│ └── wrapper/ // Gradle包装程序文件
└── server // 服务器模块
├── build.gradle.kts
└── src/main/kotlin/eu/torvian/mcp/helloworld/server/
└── HelloWorldServer.kt // MCP服务器实现
该项目使用Gradle构建两个独立的“胖JAR”文件,一个用于服务器,一个用于客户端。这些JAR文件包含了所有必要的依赖项,以便独立运行。
克隆仓库:
git clone https://github.com/your-username/mcp-hello-world.git
cd mcp-hello-world
构建服务器JAR:
./gradlew :server:jar
这将生成server/build/libs/mcp-hello-world-server.jar。
构建客户端JAR:
./gradlew :client:jar
这将生成client/build/libs/mcp-hello-world-client.jar。
要查看MCP的实际操作,只需执行客户端应用程序即可。客户端被配置为启动服务器作为子进程,并通过标准I/O流直接与其通信。
确保客户端和服务器JAR均已构建(参见构建项目部分)。
从项目根目录执行客户端应用程序,并提供服务器JAR的路径作为参数:
java -jar client/build/libs/mcp-hello-world-client.jar server/build/libs/mcp-hello-world-server.jar
客户端将启动,作为子进程启动服务器,连接到它,然后进入交互循环。来自客户端及其服务器子进程的组合输出将出现在同一终端中:
正在启动Hello World MCP服务器...
客户端:正在启动服务器进程:java -jar server/build/libs/mcp-hello-world-server.jar
客户端:成功连接到MCP服务器。
客户端:从服务器发现工具:greet
--- 交互式工具调用器 ---
输入工具名称以调用它,或输入'quit'退出。
> 输入工具名称:greet
> 输入'name'值:Rogier
客户端:调用工具'greet',参数:{name=Rogier}
服务器:调用了'greet',name='Rogier'。响应:'Hello, Rogier!'
服务器响应:Hello, Rogier!
> 输入工具名称:quit
客户端:连接已关闭。
服务器已关闭。
HelloWorldServer.kt:
MCP Server实例。greet的Tool,带有name参数,使用MCP Kotlin SDK的模式定义。greet工具,该函数提取name参数,并返回一个包含"Hello, [name]!"的TextContent作为CallToolResult。StdioServerTransport,这允许它通过标准输入/输出流与客户端通信。HelloWorldClient.kt:
MCP Client实例。connectToServer()中,它启动mcp-hello-world-server.jar作为一个单独的子进程。StdioClientTransport来与服务器子进程的标准I/O流通信。mcp.listTools()来发现服务器提供的greet工具。interactiveToolLoop()允许用户输入greet,提示输入name参数,然后调用mcp.callTool()来执行服务器的greet工具。build.gradle.kts(胖JAR):
kotlin-stdlib、kotlinx-coroutines-core和MCP Kotlin SDK本身)都被直接打包到mcp-hello-world-client.jar和mcp-hello-world-server.jar文件中。这使得它们可以通过java -jar轻松运行。jar任务中应用特殊的exclude规则,以防止构建过程中出现Duplicate entry错误,特别是对于合并JAR时经常引起冲突的META-INF文件和module-info.class文件。NoClassDefFoundError:这通常意味着你的JAR不是一个“胖JAR”,并且缺少运行时依赖项。确保你在build.gradle.kts中使用了胖JAR配置,并使用./gradlew :<module>:jar进行构建。Duplicate entry:检查你的build.gradle.kts jar任务中的from(configurations.runtimeClasspath.get()...)块,并确保META-INF文件的exclude规则正确无误。java命令不在PATH中)。SLF4J(W): 没有找到SLF4J提供者。是一个常见的警告。SLF4J是一个日志门面。要消除警告,你可以添加一个日志实现,如slf4j-simple到你的依赖项中(例如,implementation("org.slf4j:slf4j-simple:2.0.13"))。这只是为了日志输出,不影响核心MCP功能。