MCP服务介绍
MCP服务(Model Context Protocol,模型上下文协议) 是Anthropic公司2024年底开源的开放标准,用来标准化大模型(LLM)与外部工具、数据、API的连接,被称为"AI界的USB‑C接口"。
一、核心定位
- 解决痛点:大模型"知识过时、拿不到私有数据、对接工具成本高"。
- 类比:像USB‑C统一外设连接,MCP统一AI与外部世界的交互规范。
- 架构 :客户端(Client)↔服务端(Server),基于JSON‑RPC 2.0通信,支持本地(stdio)、远程HTTP/WebSocket传输。
二、MCP服务端能提供什么能力
MCP服务端向外暴露三类核心能力,供大模型调用:
- 工具(Tools):可执行函数(如查数据库、调用API、发邮件)
- 资源(Resources):只读上下文数据(文件、数据库表、实时接口数据)
- 提示词(Prompts):预定义模板/工作流(如"写周报""生成工单")
三、工作流程(极简版)
- 握手协商:客户端与服务端协商协议版本、权限与能力清单。
- 能力发现:大模型(客户端)查询服务端有哪些工具/资源可用。
- 调用执行:大模型按标准格式调用工具→服务端执行→返回结果给模型。
- 多轮交互:支持递归调用、多轮推理,完成复杂任务。
四、关键优势
- 标准化:一套协议对接所有工具,不用为每个API单独开发适配代码。
- 安全可控:细粒度权限、操作审计,数据可留在本地,降低泄露风险。
- 跨模型兼容:Claude、GPT、 Llama等只要支持MCP,就能无缝对接同一套服务。
- 生态丰富:已有数据库、文件系统、云服务、支付、文档处理等成熟MCP服务。
五、常见MCP服务场景
- 企业数据查询:自然语言查MySQL/PostgreSQL,生成报表
- 文件管理:AI直接读写本地/云端文档、代码仓库
- 支付与财务:自然语言发起支付、查账单、流水分析(如支付宝MCP)
- RAG知识库:连接私有文档库,精准检索并生成回答
- 智能体开发:快速构建能"看、查、算、操作"的AI助手
六、MCP vs 传统API调用
- 传统API:每个接口自定义参数、鉴权、错误处理,集成成本高、无统一上下文管理。
- MCP :统一协议+能力发现+标准化调用+上下文管理,一次适配,多模型复用。
一句话总结:MCP服务就是AI的万能适配器,让大模型安全、高效地连接一切外部能力。
MCP服务Python样例(极简版)
一、先记核心
MCP = Model Context Protocol
分为:
- MCP Server(MCP服务):提供工具、文件、数据库等能力
- MCP Client:AI 客户端(Claude、各类AI客户端)调用服务
二、快速安装依赖
bash
pip install mcp
三、最小 MCP 服务端(MCP服务)
保存为 server.py
python
from mcp.server import Server
from mcp.types import Tool, TextContent
app = Server("demo-mcp-service")
# 注册一个简单工具
@app.tool()
async def hello(name: str) -> str:
"""打招呼工具"""
return f"Hello {name},这是你的MCP服务已正常运行!"
if __name__ == "__main__":
import asyncio
asyncio.run(app.run_stdio_async())
四、客户端调用测试 client.py
python
from mcp.client.stdio import stdio_client
from mcp import ClientSession
async def main():
async with stdio_client(["python","server.py"]) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# 调用服务端工具
res = await session.call_tool("hello", {"name":"用户"})
print(res.content[0].text)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
五、运行
bash
python client.py
输出:
Hello 用户,这是你的MCP服务已正常运行!
MCP服务Java样例(极简版)
Java 有完整的 MCP 服务实现 ,官方有 MCP Java SDK,Spring AI 也做了成熟的集成(生产可用)。下面可用的结论 + 最简可运行代码。
一、Java MCP 现状(一句话)
- 官方 SDK :
io.modelcontextprotocol.sdk:mcp,纯 Java,无框架依赖,支持 STDIO/SSE/HTTP 传输。 - Spring AI 集成(最常用) :
spring-ai-mcp-server,注解驱动、自动配置,和 Spring Boot 无缝整合。 - 版本:Java 11+;Spring AI 1.1.x / 2.0+ 均支持。
二、最简 Spring Boot MCP 服务(可直接跑)
1)pom.xml(Maven 依赖)
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.4</version>
</parent>
<dependencies>
<!-- Spring Boot Web(可选,HTTP 传输用) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI MCP Server(核心) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
2)启动类 + 工具(MCP Service)
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.ai.mcp.server.annotation.McpTool;
import org.springframework.stereotype.Service;
@SpringBootApplication
public class DemoMcpApplication {
public static void main(String[] args) {
SpringApplication.run(DemoMcpApplication.class, args);
}
}
// MCP 服务(工具)
@Service
class HelloMcpService {
// 暴露为 MCP 工具
@McpTool(description = "打招呼工具")
public String hello(String name) {
return "Hello " + name + ",Java MCP 服务正常!";
}
}
3)配置 application.yml
yaml
spring:
ai:
mcp:
server:
enabled: true
transport: http # 可选:http / sse / stdio
endpoint: /mcp # MCP 端点
server:
port: 8080
4)运行 & 调用
- 启动后:
http://localhost:8080/mcp - 客户端(如 Claude Desktop、MCP Client)可发现并调用
hello工具。
三、两种 Java MCP 服务选型
- 纯 Java(无框架) :用官方
mcpSDK,适合轻量/独立服务。 - Spring Boot(推荐) :用
spring-ai-mcp-server,注解驱动、生态好、企业级安全/监控易加。
四、和 Python 版对比
- Python:生态快、脚本化、适合快速原型。
- Java:稳定、高性能、长连接可靠、企业集成强(数据库/中间件/安全体系),生产环境首选。
需要我把上面改成 纯 Java(无 Spring)的极简 MCP 服务,并给一个本地客户端调用示例吗?
前端和MCP
✅ 纯前端(浏览器/JS/Vue/React)不能直接原生调用标准 MCP 服务
✅ 但可以「间接调用」,完全能用,项目里正常落地
一、为什么前端不能直接调 MCP?
-
MCP 底层协议限制
标准 MCP 两种主流传输:
stdio:进程标准输入输出 → 浏览器完全用不了SSE / HTTP Stream:虽然是网络协议,但MCP 是 JSON-RPC 长连接二进制流式协议,不是普通 HTTP 接口
-
浏览器跨域 + 安全沙箱
MCP 握手、双向流、会话协商,前端裸 JS 很难处理,且跨域、权限、鉴权极难控制。
-
MCP 设计初衷
本来就是:
AI客户端/后端服务 ↔ MCP服务端不是给浏览器前端设计的。
二、前端想要调用 MCP,正确 3 种方案(企业常用)
方案1:【最简单】后端做代理(推荐🔥)
架构:
前端Vue/React → 自己的Java后端接口 → MCP服务
流程:
- 前端调你 Java 后端普通 HTTP 接口
- Java 后端(Spring AI)作为 MCP Client
- 后端去请求 MCP 服务、执行工具、拿结果
- 返回普通 JSON 给前端
👉 优点:
- 前端零改造,只调普通接口
- 跨域、鉴权、权限、参数校验全在后端控制
- 生产最稳、最常用
方案2:MCP 开启 HTTP/SSE 模式,前端用 SSE 长连接硬接
MCP 服务改成 transport: sse/http
前端用 EventSource / 流式 fetch 手写 JSON-RPC 协议。
👉 缺点:
- 写法巨复杂,要自己实现 MCP 握手、会话、工具调用协议
- 兼容性、跨域、异常处理麻烦
- 不推荐业务项目用
方案3:WebAssembly 封装 MCP 客户端
把 MCP 客户端编译成 WASM 跑在浏览器。
👉 缺点:太重、调试难,几乎没人用。
三、总结一句话
- 前台(浏览器)不能直接原生调用 MCP 服务
- 必须经过后端中转(Java 后端充当 MCP 客户端)
- 你现在是 Java 技术栈,直接用「Java后端代理」是最优解
全套可直接运行:Java后端代理MCP + 前端直接调用
整体架构
前端(Vue/JS) → 普通HTTP接口(Java) → Java作为MCP客户端 → 你的MCP服务端
一、Java 核心改造(SpringBoot)
1. 依赖不变
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
<version>1.1.0</version>
</dependency>
2. 配置文件 application.yml
yaml
spring:
ai:
mcp:
client:
transport: http
base-url: http://127.0.0.1:8081/mcp # 你的MCP服务地址
server:
port: 8080
3. 写接口 + MCP调用代码
java
import org.springframework.ai.mcp.client.McpClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import java.util.Map;
@RestController
public class McpProxyController {
// 前端直接访问这个接口
@GetMapping("/api/mcp/call")
public Mono<String> callMcp(@RequestParam String name) {
// 1. 创建MCP客户端,连接MCP服务
return McpClient.builder()
.http()
.baseUrl("http://127.0.0.1:8081/mcp")
.build()
.flatMap(client -> client.initialize()
// 2. 调用MCP服务里的工具 hello
.then(client.callTool("hello", Map.of("name", name)))
.doFinally(signalType -> client.close()));
}
}
二、MCP服务端(独立服务,端口8081)
就是你之前的Java MCP服务,改端口即可:
yaml
server:
port: 8081
spring:
ai:
mcp:
server:
transport: http
endpoint: /mcp
三、前端调用(纯JS / Vue / React 通用)
原生JS 直接请求
javascript
// 前端完全不用管MCP协议,只调普通后端接口
async function callMcp() {
const res = await fetch("http://127.0.0.1:8080/api/mcp/call?name=前端用户");
const data = await res.text();
console.log(data);
}
callMcp();
Vue 用法
vue
<script setup>
const getMcpData = async () => {
let res = await fetch("/api/mcp/call?name=Vue用户");
alert(await res.text());
};
</script>
四、调用流程
- 启动 MCP服务端:8081
- 启动 Java代理后端:8080
- 前端访问:
http://127.0.0.1:8080/api/mcp/call?name=test - 正常拿到 MCP 工具返回结果
关键结论
- 前端永远不直接连MCP,完全无感知;
- 所有MCP复杂协议、长连接、JSON-RPC 全部交给 Java 后端处理;
- 前端只需要调普通 HTTP 接口,零成本接入。