关于 MCP(Model Context Protocol) minimal Kotlin client server sample
一个简化的 Kotlin 示例,演示天气工具及 MCP 客户端与服务端的交互。项目用于演示,客户端可调用返回东京晴天天气的服务端。
主要功能
- 01Kotlin 客户端与服务端示例
- 02天气工具示例
- 03客户端与服务端交互演示
适用场景
- 01学习 MCP 客户端与服务端交互
- 02试用天气工具调用流程
MCP 相关
该示例演示 MCP 客户端发现并调用 MCP 服务上的天气工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
暂未收录安装方式
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
还没有获取到工具列表
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
MCP(Model Context Protocol)最小化 Kotlin 客户端-服务端示例
一个简单的天气工具,演示如何使用 Model Context Protocol(MCP)进行服务端与客户端交互。仅供演示。
用户:“东京的天气怎么样?”
响应:“东京的天气晴朗。”
这是 mcp-minimal-client-weather-server-sample 的 Kotlin 版本。
客户端:src/main/kotlin/Client.kt 服务端:server.main.kts
图 1:初始化与工具发现
sequenceDiagram
autonumber
participant User
participant ClientApp as ClientApp (Host)<br>on Local PC
participant LLM as LLM (e.g., Claude)<br>Remote Service
participant MCPClient as MCPClient (Internal Component)<br>in ClientApp on Local PC
participant MCPServer as MCPServer (e.g., Tool Server)<br>on Local PC
Note over User, MCPServer: User starts ClientApp, initiating connection to MCPServer
ClientApp->>+MCPClient: Instruct preparation to connect to a specific MCPServer
Note right of ClientApp: Host manages MCPClient instances per server
MCPClient->>+MCPServer: 1. initialize (Request)<br>[protocol_version, client_capabilities]
Note over MCPClient, MCPServer: Start connection establishment and capability exchange (JSON-RPC)
MCPServer-->>-MCPClient: 2. initialize (Response)<br>[selected_protocol_version, server_capabilities (tools, resources, etc.)]
Note over MCPClient, MCPServer: Server notifies its available capabilities
MCPClient->>MCPServer: 3. notifications/initialized (Initialization Complete Notification)
Note over MCPClient, MCPServer: Handshake complete, normal communication possible
MCPClient-->>-ClientApp: Initialization Success & Server Capabilities notified (implicitly via successful initialize await)
Note right of ClientApp: Host (ClientApp) now knows the server is ready
ClientApp->>MCPClient: 4. Instruct to get the list of tools provided by the server (session.list_tools())
MCPClient->>+MCPServer: 5. tools/list (Request)
Note over MCPClient, MCPServer: Request the list of tools defined on the server
MCPServer-->>-MCPClient: 6. tools/list (Response)<br>[{"name": "get_weather", "description": "...", "inputSchema": {...}}]
Note over MCPClient, MCPServer: Example: Returns the definition of the 'get_weather' tool
MCPClient-->>ClientApp: 7. Notify Tool List (containing 'get_weather', etc.) via tools_response object
Note right of ClientApp: Host stores/processes the retrieved tool information (format_tools_for_llm)
ClientApp->>LLM: 8. Send available tool information to LLM<br>(e.g., via system prompt using formatted tools_prompt)
Note over ClientApp, LLM: Host informs LLM that 'get_weather' is available<br>LLM can now decide to use the tool based on this info
图 2:工具执行流程
sequenceDiagram
autonumber
participant User
participant ClientApp as ClientApp (Host)<br>on Local PC
participant LLM as LLM (e.g., Claude)<br>Remote Service
participant MCPClient as MCPClient (Internal Component)<br>in ClientApp on Local PC
participant MCPServer as MCPServer (e.g., Tool Server)<br>on Local PC
User->>ClientApp: 1. "What's the weather in Tokyo?"
Note right of User: User asks a question that might require a tool
ClientApp->>LLM: 2. Forward user's question with context<br>[System Prompt (with tool info) + User Question]
Note over ClientApp, LLM: Host sends the question and formatted tool info ('get_weather') to the LLM
LLM->>ClientApp: 3. LLM responds, requesting tool usage<br>Response: `{"tool_name": "get_weather", "arguments": {"location": "Tokyo"}}`
Note over ClientApp, LLM: Based on provided tool info, LLM decides to use the weather tool<br>and generates the required JSON structure with arguments
ClientApp->>User: (Optional) 4. Confirm tool execution<br>"Execute 'get_weather' on Tool Server?"
User->>ClientApp: (Optional) 5. "Yes"
Note over ClientApp, User: For security/transparency, host might seek user permission (Not implemented in the sample code)
ClientApp->>+MCPClient: 6. Instruct execution of 'get_weather' tool (session.call_tool())<br>Arguments: {"location": "Tokyo"}
Note right of ClientApp: Host instructs the MCP server via MCPClient
MCPClient->>+MCPServer: 7. tools/call (Request)<br>[name: "get_weather", arguments: {"location": "Tokyo"}]
Note over MCPClient, MCPServer: Invoke server function with specified tool name and arguments (JSON-RPC)
MCPServer->>MCPServer: Internal processing (executes get_weather function)
Note over MCPServer: Logs execution, returns result (e.g., "Sunny")
MCPServer-->>-MCPClient: 8. tools/call (Response)<br>[result: {content: [{type: "text", text: "Sunny"}]}]
Note over MCPClient, MCPServer: Server returns the processing result (weather info) in structured format
MCPClient-->>-ClientApp: 9. Notify Tool Execution Result<br>Result object contains: "Sunny" (extracted from tool_result_obj.content[0].text)
ClientApp->>LLM: 10. Send tool execution result back to LLM<br>New User Message: "Tool 'get_weather' returned: 'Sunny'. Answer the original question based on this."
Note over ClientApp, LLM: Host feeds back the information obtained from the server to the LLM
LLM->>ClientApp: 11. Generate final response (as text)<br>"The weather in Tokyo is Sunny."
ClientApp->>User: 12. Display the final response generated by LLM
Note right of ClientApp: Present the final answer to the user
评论
支持 Markdown
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。