前言
之前的文章都是各種使用MCP,自從有了MCP我們立馬感受到大模型真的可以幫我們干活了,實際上當我們想把企業內部的業務向AI方向轉型的話主要就是實現MCP,另外加上多Agent在流程上的控制和自有的知識庫這就可以滿足企業80%的需求了,剩下的20%是大企業中不斷提升大模型的智能化水平和優化算法算力等基礎設施。這次我們自己體驗一下MCP技術,也是作為Java程序員在大模型等技術中找到自己的飯碗。
官網配置
SpringBoot中已經有了MCP的啟動器,AI技術很火,
官網地址:
https://docs.spring.io/spring-ai/reference/api/mcp/mcp-overview.html
找到MCP部分
我們先把骨架部分配置起來
https://start.spring.io/
客戶端和服務端都選上,主要還是MCP部分,當然JDBC,WEB也一起選上,方便測試
項目準備好了點擊下載就行,然后導入IDEA。
一點學習提示
注意啦,寫代碼這種事情光看是不會懂的,甚至很多概念都是云里霧里,我相信很多小伙伴一直對MCP是啥都不大了解,不是沒資料反而是網上抄概念的文章太多,這種感覺就是文字都認得就是不知道啥玩意。其實我也是跑通了幾個小代碼之后才清楚一些的。
其他不廢話,SpringMCP的代碼就是直接按照官網的例子先抄一抄,然后跑通,接下來自己改吧改吧定制一個自己的項目就行,大部分的技術都是這個套路。上鏈接
https://github.com/spring-projects/spring-ai-examples/tree/main
下面還是自己整點例子,不然顯得純COPY了。我們的目標是把前面文章中提到的mysql操作的工具給簡單實現一遍。
定義服務
這個是一個標準的SpringBoot的項目,按照約定第一優先的原則,我定義了如下結構:
首先定義了一個服務類,內容如下
@Service
public class JdbcQueryService {@Tool(description = "找出人群中最帥的人")public String shuaige(){return "敏叔最帥";}
}
接下來我們需要把服務暴露成MCP的規范類
@Configuration
public class McpConfig {@BeanToolCallbackProvider jdbcQueryTools(JdbcQueryService jdbcQueryService) {return MethodToolCallbackProvider.builder().toolObjects(jdbcQueryService).build();}
}
接下來追加配置文件
spring.application.name=mcp
spring.ai.mcp.server.name=jdbc-mcp-server
spring.ai.mcp.server.stdio=false
最后就是啟動類
@SpringBootApplication
public class McpApplication {public static void main(String[] args) {SpringApplication.run(McpApplication.class, args);}}
配置服務
打包
切換到我們的項目下面,把代碼進行打包
cd mcp
./mvnw clean install -DskipTests
cd target && ls -al
--得到jar包
mcp-0.0.1-SNAPSHOT.jar
定義mcp規范文件
稍微解讀一下,這個是表示mcp服務中通過jar命令的方式啟動我們的服務類,其實就是一個java程序啟動的過程,里面需要配置我們本機的jar包路徑。
{"mcpServers": {"jdbc-mcp-server": {"command": "java","args": ["-Dspring.ai.mcp.server.stdio=true","-Dspring.main.web-application-type=none","-Dlogging.pattern.console=","-jar","/Users/zhuxuemin/Downloads/mcp/target/mcp-0.0.1-SNAPSHOT.jar"]}}
}
注冊MCP
在trae中找到mcp服務,點擊手動添加
把JSON復制進去,確認即可
注意要服務打勾才算,如果有問題會出現紅色警示
跑起來
我們先看下沒有我們MCP的效果
問:找出人群中最帥的人
可以看到,大模型無法回答我的問題,還好沒有直接回答彭于晏,不然后面的事情有點不好推進啦。
“抱歉,我無法判斷人群中誰最帥”
接下來,讓智能體起用我們的MCP,需要勾選
再次問上面的問題,看情況
可以看到,大模型懂事的調用了我們提供的帥哥服務,而且給出的回答也讓人非常滿意!!
上難度
接下來上難度啦,我們一開始是要模擬那個mysql服務的,光叫人喊帥哥肯定不夠的。再次強調的是這個是一個標準的SpringBoot的服務,里面的內容完全是Spring的標準的,所以這樣一來可以無縫對接我們過去的技術棧。
我們到配置文件里面補充一下mysql的配置,還是以前的庫
spring.data.jdbc.dialect=mysql
spring.datasource.url=jdbc:mysql://198.19.249.220:3306/blog_publisher?useSSL=false&serverTimezone=UTC
spring.datasource.username=test
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
接下來引入JdbcTemplate,把我們的服務完善起來,完整代碼如下,只是追加了兩個查詢數據庫的類,因為mysql可以直接通過元數據訪問庫的信息,所以實現起來就是一個查詢元數據表的過程。
@Service
public class JdbcQueryService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Tool(description = "查詢數據庫中所有的表")public List<Map<String, Object>> queryAllTables(){String sql = "SELECT TABLE_NAME , TABLE_COMMENT FROM information_schema.tables WHERE TABLE_SCHEMA = DATABASE()";return jdbcTemplate.queryForList(sql);}@Tool(description = "查詢數據庫中的表的數據")public List<Map<String, Object>> queryTable(@ToolParam(description = "表名") String tableName){String sql = "SELECT * FROM " + tableName;return jdbcTemplate.queryForList(sql);}@Tool(description = "找出人群中最帥的人")public String shuaige(){return "敏叔最帥";}
}
重新發布
重新打包,部署,記得重啟mcp
重啟之后是可以看到服務注冊信息的
再次提問:
因為jdbc里面是配置的blog_publisher庫信息,所以返回了庫里面全部表的信息,符合預期。
后記
其實我沒有太強調MCP的概念,相信跑通了之后對MCP對認識是有新的維度上的認知的,另外來說大模型的技術是不斷發展的,而且學習成本也很低,在現有的工作內容做點擴展就行。最后,這份小代碼不復雜,需要源碼的話直接留言找我要就行。