MCP服务

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服务端向外暴露三类核心能力,供大模型调用:

  1. 工具(Tools):可执行函数(如查数据库、调用API、发邮件)
  2. 资源(Resources):只读上下文数据(文件、数据库表、实时接口数据)
  3. 提示词(Prompts):预定义模板/工作流(如"写周报""生成工单")

三、工作流程(极简版)

  1. 握手协商:客户端与服务端协商协议版本、权限与能力清单。
  2. 能力发现:大模型(客户端)查询服务端有哪些工具/资源可用。
  3. 调用执行:大模型按标准格式调用工具→服务端执行→返回结果给模型。
  4. 多轮交互:支持递归调用、多轮推理,完成复杂任务。

四、关键优势

  • 标准化:一套协议对接所有工具,不用为每个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 现状(一句话)

  • 官方 SDKio.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 服务选型

  1. 纯 Java(无框架) :用官方 mcp SDK,适合轻量/独立服务。
  2. Spring Boot(推荐) :用 spring-ai-mcp-server,注解驱动、生态好、企业级安全/监控易加。

四、和 Python 版对比

  • Python:生态快、脚本化、适合快速原型。
  • Java:稳定、高性能、长连接可靠、企业集成强(数据库/中间件/安全体系),生产环境首选。

需要我把上面改成 纯 Java(无 Spring)的极简 MCP 服务,并给一个本地客户端调用示例吗?

前端和MCP

纯前端(浏览器/JS/Vue/React)不能直接原生调用标准 MCP 服务

但可以「间接调用」,完全能用,项目里正常落地


一、为什么前端不能直接调 MCP?

  1. MCP 底层协议限制

    标准 MCP 两种主流传输:

    • stdio:进程标准输入输出 → 浏览器完全用不了
    • SSE / HTTP Stream:虽然是网络协议,但MCP 是 JSON-RPC 长连接二进制流式协议,不是普通 HTTP 接口
  2. 浏览器跨域 + 安全沙箱

    MCP 握手、双向流、会话协商,前端裸 JS 很难处理,且跨域、权限、鉴权极难控制。

  3. MCP 设计初衷

    本来就是:
    AI客户端/后端服务 ↔ MCP服务端

    不是给浏览器前端设计的。


二、前端想要调用 MCP,正确 3 种方案(企业常用)

方案1:【最简单】后端做代理(推荐🔥)

架构:

复制代码
前端Vue/React  →  自己的Java后端接口  →  MCP服务

流程:

  1. 前端调你 Java 后端普通 HTTP 接口
  2. Java 后端(Spring AI)作为 MCP Client
  3. 后端去请求 MCP 服务、执行工具、拿结果
  4. 返回普通 JSON 给前端

👉 优点:

  • 前端零改造,只调普通接口
  • 跨域、鉴权、权限、参数校验全在后端控制
  • 生产最稳、最常用

方案2:MCP 开启 HTTP/SSE 模式,前端用 SSE 长连接硬接

MCP 服务改成 transport: sse/http

前端用 EventSource / 流式 fetch 手写 JSON-RPC 协议。

👉 缺点:

  • 写法巨复杂,要自己实现 MCP 握手、会话、工具调用协议
  • 兼容性、跨域、异常处理麻烦
  • 不推荐业务项目用

方案3:WebAssembly 封装 MCP 客户端

把 MCP 客户端编译成 WASM 跑在浏览器。

👉 缺点:太重、调试难,几乎没人用。


三、总结一句话

  1. 前台(浏览器)不能直接原生调用 MCP 服务
  2. 必须经过后端中转(Java 后端充当 MCP 客户端)
  3. 你现在是 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>

四、调用流程

  1. 启动 MCP服务端:8081
  2. 启动 Java代理后端:8080
  3. 前端访问:
    http://127.0.0.1:8080/api/mcp/call?name=test
  4. 正常拿到 MCP 工具返回结果

关键结论

  1. 前端永远不直接连MCP,完全无感知;
  2. 所有MCP复杂协议、长连接、JSON-RPC 全部交给 Java 后端处理;
  3. 前端只需要调普通 HTTP 接口,零成本接入。
相关推荐
CodingPioneer2 小时前
AICoding基础资料
ai编程
Irissgwe3 小时前
LangChain快速上手
ai·langchain·llm·ai编程
程序员Better3 小时前
前端成功转型AI全栈,我踩过的坑都替你填上了
前端·后端·ai编程
飞坦3 小时前
failed to set model 和 GatewayRequestError 怎么解决?排查了一整天,总结 4 种修法
ai编程·claude
C澒4 小时前
AI 生码 - D2C:Figma to Code 全流程实现
前端·低代码·ai编程·figma
带娃的IT创业者4 小时前
Claude Code Routines 深度解析:重新定义 AI 辅助编程的工作流自动化
运维·人工智能·自动化·ai编程·工作流·anthropic·claude code
wsjsf5 小时前
智能代码审查助手的搭建
java·学习·ai编程
sunneo5 小时前
专栏A-AI原生产品设计-06-AI原生产品的未来展望(专栏A终篇)
人工智能·产品运营·产品经理·ai编程·ai-native
AI砖家5 小时前
解剖 Claude Code:如何搭建一个企业级的私有化 AI 编程助手
前端·人工智能·ai编程