01 引言

上一节介绍了手搓MCP服务和客户端,并且采用了服务器发送事件(SSE)的形式调用,完成了基本调用。

当然客户端也可以使用Cherry Studio 客户端直接调用,输入服务端的IP和端口即可,按照下图配置,这里不在赘述!

为了更好理解本节内容,如果对上一节手搓MCP服务不清楚的,可以先了解一下,传送门:

https://blog.csdn.net/static_coder/article/details/147732655

02 打包自定义MCP服务

MCP服务既支持Stdio标准流也支持SSE,本次打包以Stdio为例,需要更改MCP服务xml依赖:

<!--  SSE
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
 -->

<!-- 标准Stdio -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server</artifactId>
</dependency>

Java 编写的MCP服务打包非常简单,不需要启动,直接打成jar包即可。

Maven命令:

mvn clean compile package -DskipTests

Idea 工具集:

最后打好的Jar包:

03 Cherry Studio配置MCP

3.1 MCP服务配置文件

jar包这里必须指定绝对路径。

"gzh-mcp-server": {
  "command": "java",
  "args": [
    "-Dspring.ai.mcp.server.stdio=true",
    "-Dspring.main.web-application-type=none",
    "-jar",
    "D://boot-mcp-server-0.0.1-SNAPSHOT.jar"
  ]
}

3.2 Cherry Studio配置MCP服务

按照如下图步骤:

3.3 开启MCP服务

配置的MCP服务默认是关闭的,需要手动开启。

3.4 开启会话,选择MCP服务

开启会话的时候,默认是不使用MCP服务的。当有多个MCP服务的时候,每次只能选择一个。

3.5 测试MCP相关话题

测试选择用的模型:qwq:latest | Ollama

从测试的结果来看:

【推荐一个学习公众号】的对话,明确调用了的MCP服务,且返回了MCP服务的信息。与预想的完全一致。

【推荐公众号的好文】这个对话,虽然也调用了MCP服务,但是最终返回的数据大模型经过了加工,返回的假数据。这个可能是大模型被污染导致的

3.6 测试非MCP服务话题

从测试的结果来看,选用了MCP之后,大模型回答的结果都是依据MCP服务的大致内容响应数据。MCP之外的话题,大模型可能无法给出结果。

这里反应了大模型使用的MCP之后,大模型的回答的系统框架就会被限制了。

04 自定义客户端配置MCP

我们能不能使用自定义的客户端模拟Cherry Studio直接配置MCP呢?当然可以。但是需要修改部分参数。

4.1 MCP 服务配置选择性修改

需要禁用启动banner的打印,否则客户端启动会出现json解析异常。

图中①断点进入,就会发现这里解析的内容是MCP服务启动的banner

# Stdio 标准配置
spring.ai.mcp.server.name=gzh-mcp-server
spring.ai.mcp.server.stdio=true
# 禁用banner
spring.main.banner-mode=off

这里的服务端的配置可以通过启动命令指定,所以服务端的配置可以选择性修改。

4.2 MCP客户端配置

spring.ai.mcp.client.name=mcp-client
spring.ai.mcp.client.toolcallback.enabled = true

# 配置server的json文件
spring.ai.mcp.client.stdio.servers-configuration=classpath:mcp-servers-config.json
# 强制文件编码,防止中文乱码
spring.mandatory-file-encoding=UTF-8

4.3 增加json配置文件

配置内容:

{
  "mcpServers": {
    "gzh-mcp-server": {
      "command": "java",
      "args": [
        "-Dspring.main.banner-mode=off",
        "-Dspring.ai.mcp.server.stdio=true",
        "-Dlogging.pattern.console=",
        "-Dfile.encoding=utf-8",
        "-jar",
        "D://boot-mcp-server-0.0.1-SNAPSHOT.jar"
      ]
    }
  }
}

命令详解:

command:MCP服务启动的命令类型,这里配置的java,所以会使用java -jar xx.jar方式启动。

-Dspring.main.banner-mode=off:禁用服务端启动打印banner ,可以不配置(因为4.1服务点已经配置)。

-Dspring.ai.mcp.server.stdio=true :指定Stdio类型,可以不配置(因为4.1服务点已经配置)。

-Dlogging.pattern.console=:控制太不打印日志。因为自定义的客户端启动时会获取控制台的信息。

-Dfile.encoding=utf-8:文件编码,控制太中文乱码。因为控制台不打印日志,所以可以不配置。

-jar:启动命令

D://boot-mcp-server-0.0.1-SNAPSHOT.jar:绝对路径,MCP服务的jar位置。

总之:

配置的目的就是启动MCP服务。这里的命令就是:

java -Dspring.main.banner-mode=off ... -jar D://boot-mcp-server-0.0.1-SNAPSHOT.jar

4.3 客户端启动测试

日志已经显示客户端连接到MCP服务了。测试结果如下:

大模型明显调用了MCP服务。

05 小结

MCP服务可以引导大模型精准的输出信息,就像MCP服务为大模型搭建一个框架一样,大模型在这个框架里利用资深自然语言的能力,整合内容输出内容。每一个大模型调用同一个MCP服务,输出的结果都有所不同。

如果想用自己的MCP服务被大家使用,可以将自己的服务上传到MCP服务的托管平台,如:https://mcp.so/

好了,今天的分享就到这里了。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐