当前位置: 首页 > news >正文

知识体系——MCP(四)demo(2)开发mcp client

下面使用io.modelcontextprotocol.sdk自定义开发mcp client。

一、demo

1、pom

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>security-ai-mcp-client-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>security-ai-mcp-client-demo</name> <description>MCP Client demo: call security-ai-mcp-demo server via io.modelcontextprotocol.sdk</description> <properties> <java.version>17</java.version> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <mcp.version>0.12.1</mcp.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>io.modelcontextprotocol.sdk</groupId> <artifactId>mcp-bom</artifactId> <version>${mcp.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>io.modelcontextprotocol.sdk</groupId> <artifactId>mcp</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>2.0.9</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.demo.mcp.client.SecurityAiMcpClientDemo</mainClass> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>

2、实现

package com.demo.mcp.client; import io.modelcontextprotocol.client.McpClient; import io.modelcontextprotocol.client.McpSyncClient; import io.modelcontextprotocol.client.transport.ServerParameters; import io.modelcontextprotocol.client.transport.StdioClientTransport; import io.modelcontextprotocol.spec.McpSchema; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; import java.util.List; import java.util.Map; /** * MCP Client 示例:使用 io.modelcontextprotocol.sdk 调用 security-ai-mcp-demo(stdio 模式)。 * 先 initialize,再 listTools,最后 callTool(school_list) 并打印结果。 */ public class SecurityAiMcpClientDemo { /** Server jar 路径,可通过 -Dmcp.server.jar=... 覆盖 */ private static final String DEFAULT_SERVER_JAR = "../security-ai-mcp-demo/target/security-ai-mcp-demo-1.0-SNAPSHOT.jar"; public static void main(String[] args) throws Exception { String serverJar = System.getProperty("mcp.server.jar", DEFAULT_SERVER_JAR); Path jarPath = Paths.get(serverJar).toAbsolutePath().normalize(); if (!jarPath.toFile().exists()) { System.err.println("Server jar 不存在: " + jarPath); System.err.println("请先构建 security-ai-mcp-demo 或设置 -Dmcp.server.jar=绝对路径"); System.exit(1); } ServerParameters params = ServerParameters.builder("java") .args("-jar", jarPath.toString()) .build(); McpSyncClient client = McpClient.sync(new StdioClientTransport(params)) .requestTimeout(Duration.ofSeconds(30)) .build(); client.initialize(); System.out.println("已连接 MCP Server,协议已初始化。\n"); // 列出工具 McpSchema.ListToolsResult listResult = client.listTools(); List<McpSchema.Tool> tools = listResult != null && listResult.tools() != null ? listResult.tools() : List.of(); System.out.println("工具数量: " + tools.size()); tools.forEach(t -> System.out.println(" - " + t.name() + ": " + t.description())); System.out.println(); // 调用 school_list(必带 appKey) McpSchema.CallToolRequest callReq = McpSchema.CallToolRequest.builder() .name("school_list") .arguments(Map.<String, Object>of( "appKey", "demo-key-001", "pageNum", 1, "pageSize", 5)) .build(); McpSchema.CallToolResult callResult = client.callTool(callReq); System.out.println("school_list 调用结果:"); System.out.println(" isError: " + callResult.isError()); if (callResult.content() != null && !callResult.content().isEmpty()) { callResult.content().forEach(c -> { if (c instanceof McpSchema.TextContent) { McpSchema.TextContent tc = (McpSchema.TextContent) c; System.out.println(" content: " + tc.text()); } }); } else if (callResult.isError()) { System.out.println(" error: " + callResult); } } }

3、测试

执行main方法,控制台打印:

[boundedElastic-1] INFO io.modelcontextprotocol.client.transport.StdioClientTransport - MCP server starting. [boundedElastic-1] INFO io.modelcontextprotocol.client.transport.StdioClientTransport - MCP server started [pool-4-thread-1] INFO io.modelcontextprotocol.client.transport.StdioClientTransport - STDERR Message received: 2026-03-11 11:04:11.187 [main] INFO c.demo.mcp.SecurityAiMcpApplication - Starting SecurityAiMcpApplication v1.0-SNAPSHOT using Java 21.0.8 with PID 26324 (C:\mydemo\security-ai-mcp-demo\target\security-ai-mcp-demo-1.0-SNAPSHOT.jar started by Tina.Zhang in C:\mydemo\ai-demo) [pool-4-thread-1] INFO io.modelcontextprotocol.client.transport.StdioClientTransport - STDERR Message received: 2026-03-11 11:04:11.189 [main] INFO c.demo.mcp.SecurityAiMcpApplication - No active profile set, falling back to 1 default profile: "default" [pool-4-thread-1] INFO io.modelcontextprotocol.client.transport.StdioClientTransport - STDERR Message received: 2026-03-11 11:04:12.107 [pool-2-thread-1] INFO i.m.server.McpAsyncServer - Client initialize request - Protocol: 2024-11-05, Capabilities: ClientCapabilities[experimental=null, roots=null, sampling=null, elicitation=null], Info: Implementation[name=Java SDK MCP Client, title=null, version=1.0.0] [pool-1-thread-1] INFO io.modelcontextprotocol.client.LifecycleInitializer - Server response with Protocol: 2024-11-05, Capabilities: ServerCapabilities[completions=null, experimental=null, logging=LoggingCapabilities[], prompts=null, resources=null, tools=ToolCapabilities[listChanged=true]], Info: Implementation[name=security-ai-mcp, title=null, version=1.0.0] and Instructions null 已连接 MCP Server,协议已初始化。 工具数量: 15 - user_list: 分页查询用户列表,支持按 account 模糊查询 - user_get: 根据 ID 获取用户 - user_save: 新增用户,body 为 UserEntity 的 JSON - user_update: 更新用户,body 为 UserEntity 的 JSON - user_delete: 根据 ID 删除用户 - school_list: 分页查询学校列表 - school_get: 根据 ID 获取学校 - school_save: 新增学校 - school_update: 更新学校 - school_delete: 根据 ID 删除学校 - role_list: 分页查询角色列表 - role_get: 根据 ID 获取角色 - role_save: 新增角色 - role_update: 更新角色 - role_delete: 根据 ID 删除角色 [pool-4-thread-1] INFO io.modelcontextprotocol.client.transport.StdioClientTransport - STDERR Message received: 2026-03-11 11:04:12.299 [main] INFO c.demo.mcp.SecurityAiMcpApplication - Started SecurityAiMcpApplication in 1.644 seconds (process running for 2.232) [pool-4-thread-1] INFO io.modelcontextprotocol.client.transport.StdioClientTransport - STDERR Message received: 2026-03-11 11:04:12.303 [main] INFO com.demo.mcp.config.StdioMcpConfig - Server is ready. Waiting for JSON-RPC requests on stdin... school_list 调用结果: isError: false content: {"data":{"records":[{"id":1,"name":"第一中学","address":"北京市海淀区中关村大街1号"},{"id":2,"name":"第二中学","address":"北京市西城区西单北大街2号"},{"id":3,"name":"第三中学","address":"上海市浦东新区陆家嘴路3号"},{"id":4,"name":"实验小学","address":"广州市天河区体育西路4号"},{"id":5,"name":"育才中学","address":"深圳市南山区科技园路5号"}],"total":11,"size":5,"current":1,"pages":3},"code":200,"success":false}
http://www.jsqmd.com/news/466393/

相关文章:

  • OWASP Top10 2021 完整版:与 SAST 适配的深度解析
  • Rocky Linux 10 上搭建 社区版 GitLab CE
  • 2026年 智能制造实训设备厂家推荐排行榜:高校教学、模拟药厂、生产线实训平台与系统装置一站式解决方案 - 品牌企业推荐师(官方)
  • g更改linux root密码
  • LeetCode 76. 最小覆盖子串(详细技术解析)
  • 虚拟同步发电机(VSG)孤岛与并网的Simulink(2019a)仿真模型搭建与探索
  • 对于【LSTM与GRU在水文预测中的对比分析】的未来改进和建议
  • 工业清洁设备优质品牌推荐榜:驾驶式洗地机/1000公斤高压清洗机/商用洗地机/工业吸尘器/工业洗地机/工业清洗机厂家/选择指南 - 优质品牌商家
  • 2026年比较好的西安租赁洗地机工厂推荐:西安洗地机租赁稳定供应商推荐 - 行业平台推荐
  • visual studio编译wxWidgets
  • 防疫站疫苗预约管理系统_Python django flask
  • 2026宁波好用的芯轴品牌生产厂盘点,如何选择靠谱厂家 - 工业推荐榜
  • 2026河北新河优质MC浇筑尼龙加工件推荐榜:pa66尼龙棒/pp尼龙棒/尼龙加工件源头厂家/浇筑尼龙棒/玻纤mc尼龙浇铸棒/选择指南 - 优质品牌商家
  • Django + Vue3 + YOLO 实现车辆检测、测速预警与违章分析平台
  • 互联网大厂Java面试:谢飞机与严肃面试官的搞笑对决
  • 救命神器! 降AIGC工具 千笔·降AIGC助手 VS WPS AI 专科生专属
  • Gemini认证工具创意开发(技术深度解析)
  • 探讨江苏地区井口装置涂装厂家排名,江苏万和涂装排第几? - myqiye
  • 论文查重「避坑」全攻略:Paperxie 四大检测体系如何守住你的毕业「生命线」
  • 2026年胰岛素泵市场盘点:哪款专业品牌更胜一筹?
  • leetcode 3600. 升级后最大生成树稳定性 困难
  • 北京/上海/深圳/杭州/南京/无锡高端腕表维修指南:豪爵/库尔沃/蕾蒙威/播威故障养护与维修全解析 - 时光修表匠
  • 收藏备用!程序员转型AI的三个核心赛道(小白/进阶通用)
  • 产品推荐|八戒光度成像系统全新小型化款来了!
  • word打字输入及删除 很卡,延迟几秒钟
  • 《OpenClaw 实战:从 0 到 1 快速入门到进阶实战》一本全面掌握 OpenClaw 云桌面助理的实战指南:第二部分《进阶篇》
  • 《投资-407》长期价值投资考验的是眼光与格局, 考验的是战略方向的能力,其难度远大于战术上勤奋的能力,如何提升这方面的能力?
  • 高分子电气绝缘自粘胶带
  • 《OpenClaw 实战:从 0 到 1 快速入门到进阶实战》一本全面掌握 OpenClaw 云桌面助理的实战指南:第一部分 入门篇
  • 见面三分情:为什么当面沟通是最强大的沟通方式