MCP是什么?
MCP 服务 = 代理服务(Proxy) + 标准化接口 + 自动化适配
MCP 的目的,就是让 AI 应用不再“为每个工具定制对接 ”,而是像使用 USB-C 一样,“插上即用”任何外部工具。
没mcp之前不同的工具入参和出参千奇百怪,需要程序员针对不同工具接口,输入不同形式的入参,出参也要进行特殊的解析处理。有了mcp服务,AI应用就能遵循统一标准入参,统一标准回参。
更加通俗说明:MCP服务作用,它好比一个可插拔多功能的螺丝刀,想用那个刀头如十字的,一字的,六角的,梅花的,而各种不同的刀头就代表着不同的工具或服务。当需要使用某个特定的工具时,只需要将对应的“刀头”插入MCP这个“螺丝刀柄”中,就可以开始工作了,这种设计使得切换不同的工具变得非常简单和快捷,不需要为每种工具准备一个单独的螺丝刀,而且,这个多功能螺丝刀还很智能,它知道每个刀头的用途和使用方法(就像MCP了解每个服务的接口和参数一样),所以你不需要成为工具专家,也能轻松完成任务。
对应到 AI 应用调用工具:
MCP 服务会通过标准接口(/tools
)告诉 AI:
“我支持这些工具:
read_file(path: string):读文件,需要传一个路径
send_email(to: string, subject: string, body: string):发邮件,需要收件人、主题、内容
这个描述是用 JSON Schema 写的,AI 能“看懂”。
{"tool": "send_email","input": {"to": "zhangsan@company.com","subject": "会议纪要","body": "这是重点内容..."}
}
AI 应用 MCP 服务(本地/远程)│ ││ 第一次调用:发现能力 ││──────────────────────────────────▶││ GET /mcp/v1/tools ││ ││ 返回:我支持哪些工具 ││◀──────────────────────────────────││ [ ││ { ││ "name": "read_file", ││ "inputSchema": { ... } ││ }, ││ { ││ "name": "send_email", ││ "inputSchema": { ... } ││ } ││ ] ││ ││ 第二次调用:执行操作 ││──────────────────────────────────▶││ POST /mcp/v1/invoke ││ { ││ "tool": "send_email", ││ "input": { ││ "to": "zhangsan@...", ││ "subject": "..." ││ } ││ } ││ ││ 返回执行结果 ││◀──────────────────────────────────││ { "result": "success" } │
SpringAI:
@Tool:“这个方法是一个可被 AI应用 调用的工具’”
@ToolInput: 可以描述参数用途
// 2. 在 @Tool 方法中使用对象
@Component
public class WeatherTools {@Tool(description = "根据城市查询天气")public String getWeatherHistory(WeatherRequest request) {return weatherService.fetchHistory(request.getCity(), request.getDate(), request.isIncludeTempDetail());}
}
// 1. 定义请求对象
public class WeatherRequest {@ToolInput(description = "城市名称,例如:北京、上海")private String city;@ToolInput(description = "查询日期,格式:yyyy-MM-dd")private String date;@ToolInput(description = "是否包含气温详情,true 或 false")private boolean includeTempDetail;// 必须提供 getter 方法,Spring AI 需要通过它读取字段public String getCity() { return city; }public String getDate() { return date; }public boolean isIncludeTempDetail() { return includeTempDetail; }// 可选:提供 setter 或构造函数public void setCity(String city) { this.city = city; }public void setDate(String date) { this.date = date; }public void setIncludeTempDetail(boolean includeTempDetail) { this.includeTempDetail = includeTempDetail; }
}
Spring AI工作流程:
第一步:Spring启动时,扫描所有被 @Component
、@Service
等注解标记的 Bean,查找带有 @Tool
的方法
第二步:提取元数据,生成 MCP 工具描述(Tool Schema)
{"name": "getWeather","description": "根据城市查询天气","inputSchema": {"type": "object","properties": {"city": {"type": "string","description": "城市名称"}},"required": ["city"]}
}
第三步:暴露标准 MCP 接口
pring AI 会自动为你启动一个 MCP Server,并提供两个标准 HTTP 接口:
1. GET /mcp/v1/tools
—— 返回所有 @Tool
方法的描述
[{"name": "getWeather","description": "根据城市查询天气","inputSchema": { ... }}
]
2. POST /mcp/v1/invoke
—— 接收 AI 的调用请求
当 AI 应用想调用 getWeather
时,会发:
{"tool": "getWeather","input": {"city": "北京"}
}
第四步:MCP Server 调用对应的方法 getWeather
把返回结果包装成标准格式返回给 AI
{ "result": "北京:晴,28°C" }