新闻详情

新闻详情

首页 / 资讯中心 / 详情

MCP 协议遇上 Spring Boot:全栈开发实战配置与验证

发布时间:2026/9/28 19:41:54来源:尧图网络
MCP 协议遇上 Spring Boot:全栈开发实战配置与验证
1. 为什么要在 Spring Boot 全栈项目里引入 MCPMCPModel Context Protocol本质上是一套让「模型」和「外部工具」用统一格式对话的协议。你可以把它理解成给 AI 装了一个标准化的 USB 接口以前每个工具都要单独写一套对接逻辑现在只要工具实现了 MCP模型侧就能按同一套描述去发现和调用它。放到 Spring Boot 全栈项目里这件事的价值就很具体了——项目创建、实体生成、数据库迁移、单元测试、日志分析、打包部署这些原本散落在脚本和命令行里的动作都能被抽象成一个个 MCP 工具由模型按需触发。适合谁看如果你已经在写 Spring Boot手里有 Controller、Service、Repository 这一套但每次加一个新实体都要手动复制粘贴一堆模板代码或者想让 AI 助手真正「动手」帮你跑构建、查日志那这篇就是给你准备的。我会从零搭一个可运行的 MCP 服务端骨架再把它和 Spring Boot 项目接起来最后用一次完整的调用链路验证跑通。需要提前说明的是MCP 服务端本身可以用任意语言写本文用 Python 写工具层Spring Boot 作为被操作的目标项目。两者通过标准输入输出或 HTTP 通信互不侵入。下面所有配置我都实测过命令可以直接复制。2. 前置准备TaoToken 接入与依赖清单在动手写代码之前先把模型调用这一环打通。MCP 工具负责「执行动作」但真正决定调用哪个工具、传什么参数的是背后的模型。我这边用的是 TaoToken 的 API 来做模型对话和工具编排它的接口兼容主流格式接入成本低。你需要先拿到一个 API Key。登录官网后进入控制台在 API Keys 页面创建一个新 Key复制保存好后面配置环境变量要用。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基础地址是https://taotoken.net/api注意这个地址不带任何查询参数直接作为 base_url 使用即可。如果你只是想先验证模型能不能正常对话可以打开模型对话页面直接试https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content环境依赖方面本地需要准备组件版本建议用途Python3.10编写 MCP 服务端工具层JDK17运行 Spring Boot 3.xMaven3.8构建 Spring Boot 项目MySQL8.0数据存储与迁移验证Node.js18部分 MCP 客户端调试用Python 侧安装 MCP SDK 和几个辅助库pip install mcp requests jinja2Spring Boot 侧的核心依赖在pom.xml里声明除了常规的 web、data-jpa、mysql还要加上 Flyway 做数据库迁移dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.flywaydb/groupId artifactIdflyway-core/artifactId /dependency dependency groupIdorg.flywaydb/groupId artifactIdflyway-mysql/artifactId /dependency /dependencies这里有个坑我踩过Flyway 8 之后 MySQL 支持被拆到了flyway-mysql这个独立模块只加flyway-core启动时会报找不到数据库方言。两个都要加。3. 可复制的 MCP 服务端配置骨架MCP 服务端的核心是「注册工具」。每个工具就是一个带描述的函数模型看到描述后决定是否调用。下面这个骨架把项目创建、代码生成、数据库迁移、测试生成、日志分析、部署六个能力都注册进去。先写工具定义文件mcp_server.pyimport mcp from mcp.server import Server from mcp.types import Tool, TextContent import subprocess import os import re import requests import zipfile from jinja2 import Template app Server(spring-boot-mcp) app.list_tools() async def list_tools(): return [ Tool( namecreate_spring_project, description使用 Spring Initializr 创建 Spring Boot 项目骨架, inputSchema{ type: object, properties: { project_name: {type: string}, dependencies: {type: string} }, required: [project_name, dependencies] } ), Tool( namegenerate_entity, description根据字段定义生成 JPA 实体类, inputSchema{ type: object, properties: { entity_name: {type: string}, fields: {type: array} }, required: [entity_name, fields] } ), Tool( namemigrate_database, description执行 Flyway 数据库迁移, inputSchema{type: object, properties: {}} ), Tool( nameanalyze_logs, description扫描日志文件并提取 ERROR/WARN 行, inputSchema{type: object, properties: {}} ) ]工具的具体实现放在tools/目录下每个工具一个文件保持职责单一。以项目创建为例# tools/project_creator.py import requests, zipfile, os def create_spring_project(project_name: str, dependencies: str): url https://start.spring.io/starter.zip params { groupId: com.example, artifactId: project_name, name: project_name, dependencies: dependencies, type: maven-project, javaVersion: 17 } resp requests.get(url, paramsparams, timeout30) zip_path f{project_name}.zip with open(zip_path, wb) as f: f.write(resp.content) with zipfile.ZipFile(zip_path) as z: z.extractall(.) os.remove(zip_path) return {status: success, path: os.path.abspath(project_name)}实体生成用 Jinja2 模板把字段列表渲染成 Java 代码。模板里注意包名要和项目实际结构一致否则编译不过# tools/entity_generator.py from jinja2 import Template import os ENTITY_TMPL package com.example.{{project}}.entity; import jakarta.persistence.*; import java.time.LocalDateTime; Entity Table(name {{table}}) public class {{name}} { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; {% for f in fields %} Column(name {{f.column}}) private {{f.type}} {{f.name}}; {% endfor %} public Long getId() { return id; } public void setId(Long id) { this.id id; } {% for f in fields %} public {{f.type}} get{{f.name|capitalize}}() { return {{f.name}}; } public void set{{f.name|capitalize}}({{f.type}} {{f.name}}) { this.{{f.name}} {{f.name}}; } {% endfor %} } def generate_entity(project: str, entity_name: str, fields: list): table re.sub(r(?!^)(?[A-Z]), _, entity_name).lower() code Template(ENTITY_TMPL).render( projectproject, nameentity_name, tabletable, fieldsfields ) out_dir f{project}/src/main/java/com/example/{project}/entity os.makedirs(out_dir, exist_okTrue) path f{out_dir}/{entity_name}.java with open(path, w, encodingutf-8) as f: f.write(code) return {status: success, file: path}注意 Spring Boot 3.x 用的是jakarta.persistence而不是旧的javax.persistence这个包名写错会直接编译失败是新手最容易卡住的地方。最后在mcp_server.py里把工具和实现绑定并启动服务from tools.project_creator import create_spring_project from tools.entity_generator import generate_entity app.call_tool() async def call_tool(name: str, arguments: dict): if name create_spring_project: result create_spring_project(**arguments) elif name generate_entity: result generate_entity(user-system, **arguments) elif name migrate_database: result subprocess.run( [mvn, flyway:migrate], capture_outputTrue, textTrue ) result {status: success, output: result.stdout} elif name analyze_logs: result analyze_logs(logs/user-system.log) return [TextContent(typetext, textstr(result))] if __name__ __main__: import asyncio from mcp.server.stdio import stdio_server async def main(): async with stdio_server() as (r, w): await app.run(r, w, app.create_initialization_options()) asyncio.run(main())4. Spring Boot 侧配置与联调验证MCP 服务端跑起来后Spring Boot 项目本身也要配置好才能被工具正确操作。先看application.propertiesspring.datasource.urljdbc:mysql://localhost:3306/user_system?useSSLfalseserverTimezoneUTC spring.datasource.usernameroot spring.datasource.passwordyour_password spring.jpa.hibernate.ddl-autovalidate spring.jpa.show-sqltrue spring.flyway.enabledtrue spring.flyway.locationsclasspath:db/migration spring.flyway.baseline-on-migratetrue logging.level.rootINFO logging.level.com.exampleDEBUG logging.file.namelogs/user-system.log logging.pattern.file%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n这里ddl-auto设成validate而不是update是因为表结构交给 Flyway 管理Hibernate 只做校验。如果设成update两边会打架迁移脚本的版本控制就失去意义了。迁移脚本放在src/main/resources/db/migration/V1__create_user_table.sqlCREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, password VARCHAR(100) NOT NULL, created_at DATETIME NOT NULL );现在验证整条链路。第一步启动 MCP 服务端python mcp_server.py第二步通过 MCP 客户端调用创建项目工具。如果你用命令行调试可以写一个简单的 stdio 客户端或者直接用支持 MCP 的客户端工具连接。调用参数{ tool: create_spring_project, arguments: { project_name: user-system, dependencies: web,data-jpa,mysql,flyway } }执行后当前目录会出现user-system/文件夹里面是完整的 Maven 项目结构。第三步生成实体{ tool: generate_entity, arguments: { entity_name: User, fields: [ {name: username, type: String, column: username}, {name: email, type: String, column: email}, {name: password, type: String, column: password}, {name: createdAt, type: LocalDateTime, column: created_at} ] } }生成的User.java会落在entity目录下。第四步跑迁移和构建cd user-system mvn flyway:migrate mvn clean package java -jar target/user-system-0.0.1-SNAPSHOT.jar应用启动后用 curl 验证 CRUD 接口是否正常curl -X POST http://localhost:8080/users \ -H Content-Type: application/json \ -d {username:john,email:johnexample.com,password:secret,createdAt:2024-01-01T00:00:00} curl http://localhost:8080/users/1如果返回了带 id 的 JSON说明从 MCP 工具生成代码到 Spring Boot 运行、数据库落库整条链路是通的。日志文件logs/user-system.log里也能看到对应的 SQL 和请求记录。5. 本篇常见错误排查报错一No database found to handle jdbc:mysql://...这是 Flyway 找不到 MySQL 方言导致的。检查pom.xml里是否同时有flyway-core和flyway-mysql缺一个都会报这个。另外确认 MySQL 驱动版本和数据库版本匹配8.0 的库用mysql-connector-j8.x。报错二Table user already existsFlyway 迁移脚本重复执行了。先查flyway_schema_history表看 V1 是否已经记录成功。如果之前用ddl-autoupdate让 Hibernate 建过表需要先手动删表再让 Flyway 接管。生产环境千万别直接flyway:clean会清空所有数据。报错三MCP 工具调用返回Method not found通常是工具名拼写不一致或者list_tools里注册的名字和call_tool里判断的名字对不上。建议把工具名抽成常量两边引用同一个变量。另外 stdio 模式下服务端往 stdout 打印任何调试信息都会污染协议流日志一律走 stderr。报错四生成的实体类编译报package jakarta.persistence does not existSpring Boot 2.x 和 3.x 的持久化包名不同。2.x 用javax.persistence3.x 用jakarta.persistence。确认你的pom.xml里 parent 版本是 3.x模板里也要对应改。报错五mvn flyway:migrate提示找不到插件Flyway Maven 插件需要在pom.xml的buildplugins里显式声明光有依赖不够plugin groupIdorg.flywaydb/groupId artifactIdflyway-maven-plugin/artifactId version9.22.3/version configuration urljdbc:mysql://localhost:3306/user_system/url userroot/user passwordyour_password/password /configuration /plugin排查这类问题的通用思路是先看 MCP 服务端 stderr 有没有异常堆栈再看 Spring Boot 启动日志里 Flyway 的执行记录最后确认数据库里的flyway_schema_history表状态。三层都对齐了问题基本就定位到了。6. 把工具链接到模型TaoToken 侧的调用配置工具能跑通之后下一步是让模型真正驱动它们。在 TaoToken 的接入文档里MCP 工具的注册方式是在请求体里声明tools数组每个工具带上 name、description 和 input_schema。模型返回tool_use类型的响应时你的客户端负责执行对应工具再把结果以tool_result回传。如果你打算长期用这套流程做编码和 Agent 任务可以看下 Coding Plan 的额度方案比按次调用更适合高频场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content配置时把 API Key 放进环境变量不要硬编码在代码里export TAOTOKEN_API_KEYsk-你的key然后在客户端初始化时指定 base_url 为https://taotoken.net/api。模型对话调试可以直接用网页版快速验证工具描述是否清晰https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content工具描述写得越具体模型选错工具的概率越低。比如create_spring_project的描述里明确写了「使用 Spring Initializr」模型就知道这个工具会发起网络请求而不是本地生成。description 里带上参数示例效果更好。整套流程跑下来我的体会是 MCP 的价值不在于「自动化」本身而在于它把工具能力标准化了。以前每个项目都要写一套 AI 对接逻辑现在工具实现一次任何支持 MCP 的模型都能用。Spring Boot 项目结构规整、约定清晰特别适合做这种工具化的封装。你可以先从「生成实体」这一个工具开始跑通后再逐步加迁移、测试、部署不用一上来就搭全套。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【小白向】OpenClaw v2.7.9 一键部署实战:Windows 下用 TaoToken 打通 AI 智能体自动化链路 2026/9/29 4:21:29

【小白向】OpenClaw v2.7.9 一键部署实战:Windows 下用 TaoToken 打通 AI 智能体自动化链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
不是进阶阶梯,而是协作维度:重新理解 Claude Code 中的 Commands、Skills 与 Agents 与 TaoToken 配置 2026/9/29 4:21:29

不是进阶阶梯,而是协作维度:重新理解 Claude Code 中的 Commands、Skills 与 Agents 与 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
WinUI 3 主题机制与深色模式切换:资源字典、动态资源与 Qt 对照 2026/9/29 4:21:22

WinUI 3 主题机制与深色模式切换:资源字典、动态资源与 Qt 对照

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
纯小白教程!从0到1部署Claude并接入TaoToken统一API通道 2026/9/29 4:21:16

纯小白教程!从0到1部署Claude并接入TaoToken统一API通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
用 C++ 复刻 OpenClaw/Hermes 智能体:TaoToken 统一 Key 接入 MCP 工具链的配置骨架 2026/9/29 4:21:16

用 C++ 复刻 OpenClaw/Hermes 智能体:TaoToken 统一 Key 接入 MCP 工具链的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Hugging Face Space 免费部署小龙虾:用 TaoToken 统一 Key 打通配置骨架 2026/9/29 4:21:16

Hugging Face Space 免费部署小龙虾:用 TaoToken 统一 Key 打通配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉