MCP 很火,来看看我们直接给后台管理系统上一个 MCP?

一、什么是MCP

引用一些官方的介绍吧:

Model Context Protocol(MCP) 是一个开放协议,它使LLM应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互,还是构建自定义的 AI 工作流,MCP 提供了一种标准化的方式,将 LLM 与它们所需的上下文连接起来。

大白话就是一个数据通信的应用协议,约定了应用和大模型之间如何传递数据进行无缝连接。

本文主要讲的是MCPSSE+HTTP方式的使用。

先举个荔枝吧:)

二、当下背景

  1. 服务器通过Ollama部署了一些乱七八糟的模型,用于提供给公司内部的朋友们使用。
  2. 另一台服务器上有一个公司内部的ERP系统,管理着公司大量的数据信息。
  3. 你从隔壁社区听到了MCP的概念。

那我们能在这个背景下玩一些什么事情呢?

先看截图:

我们使用的客户端是CherryStudio,左边是我们的ERP系统,右边是Ollama跑的一个小7B的通义千问开源模型。

我们直接通过CherryStudioMCP协议接入功能,直接和ERP系统进行通信,实现ERP系统的数据查询和操作。

如果我们把CherryStudio换成手机上的Siri,身边的小爱同学呢?

Siri 可以通过快捷指令来完成,小爱同学可以通过小爱技能来完成,当然,体验肯定没有直接内置 MCP 来得快体验好。

三、着手分析

首先,我们先了解一下MCP的架构设计时序图:

UserCherryStudioServerOllama打开软件**SSE** 兄弟,我们聊会**SSE** 好,你有事的话 POST 这个地址(endpoint)**POST** 兄弟,自我介绍一下(initalize)**SSE** 好,这是我的基本信息(serverInfo)**POST** 兄弟,我收到了,我准备好了(initialized)POST: 兄弟,你有MCP的工具吗(tools/list)**SSE** 我提供了几个工具(tools)输入: 禁用张三的账号POST: 带工具调用 `禁用张三的账号`意图识别: {工具:禁用账号,参数:张三}**POST** 请求发送 {工具:禁用账号,参数:张三}执行工具并 **SSE** 推送结果整理下收到的结果返回处理后的结果显示给用户看UserCherryStudioServerOllama

四、开始开发

有了架构图了,那开发起来倒是没有什么难事了:

当然,你可以使用官网提供的一些SDK来做,不过吧,很多问题,你可以先试试了来评论区讨论~。。。

我们就不考虑上SDK啦,直接在项目里生撸!

4.1 项目技术栈

  • 运行时:Java17
  • 框架:SpringBoot
  • ORM:JPA

来吧,直接开始。

4.2MCP的基础数据结构

4.2.1 基础结构

json

体验AI代码助手

代码解读

复制代码

{ "id": 0, "jsonrpc": "2.0" }

4.2.2 请求结构

所有发送给MCP服务器的请求都是这个结构:

ts

体验AI代码助手

代码解读

复制代码

interface Request { // 请求的ID id: number // 请求的协议 固定2.0 jsonrpc: "2.0"; // 请求的方法 method: string; // 请求的参数 params?: { ... }; }

例如 方法initalize的请求结构:

json

体验AI代码助手

代码解读

复制代码

{ "id": 0, "jsonrpc": "2.0", "method": "initalize", "params": { // 客户端的一些能力 "capabilities": {}, "clientInfo": { // 一些客户端信息,比如名称、版本等 } } }

又例如 函数调用的 请求结构

json

体验AI代码助手

代码解读

复制代码

{ "id": 1, "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "disableUserByName", "arguments": { "name": "张三" } } }

4.2.3 响应结构

所有通过SSE推送给客户端的响应都是这个结构:

ts

体验AI代码助手

代码解读

复制代码

interface Response { id: 0; jsonrpc: "2.0"; result: { // 一些数据信息 }; error: { // 一些错误信息 }; }

4.3 SSE 服务

SpringBoot 下开启一个SSE服务简单得不要不要的:

java

体验AI代码助手

代码解读

复制代码

public final static ConcurrentHashMap<String, SseEmitter> EMITTERS = new ConcurrentHashMap<>(); @GetMapping(value = "sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter connect() throws IOException { String uuid = UUID.randomUUID().toString(); SseEmitter emitter = new SseEmitter(); sseEmitter.send(SseEmitter.event() .name("endpoint") .data("/mcp/messages?sessionId=" + uuid) .build() ); EMITTERS.put(uuid, emitter); // 可以加点心跳 emitter.onCompletion(() -> EMITTERS.remove(uuid)); emitter.onTimeout(() -> EMITTERS.remove(uuid)); return emitter; return sseEmitter; }

这里需要注意的是,MCP要求连接上后必须发送一次消息,内容是MCP服务用于接受POST请求的 URL。

好,这个服务有了,客户端就可以通过这个服务来收我们要下发的消息了。

4.4 Message POST API

接下来,我们来实现这个复杂一点的POST请求:

java

体验AI代码助手

代码解读

复制代码

@PostMapping("messages") public Json messages(HttpServletRequest request, @RequestBody McpRequest mcpRequest) { String uuid = request.getParameter("sessionId"); if (Objects.isNull(uuid)) { return Json.error("sessionId is required"); } String method = mcpRequest.getMethod(); switch(method){ case "initalize": // 这个请求是初始化请求,需要返回一些服务器信息给客户端 break; case "tools/call": // 这个请求是工具调用请求,需要返回执行结果给客户端 break; case "tools/list": // 这个请求是工具列表请求,需要返回一些工具列表给客户端 break; default: } }

请注意,所有请求都不是 HTTP 直接响应,而是通过刚才的SSE通道推送回去。

4.4.1 initalize 初始化

初始化请求需要响应给客户端的是服务器的一些基本信息:

json

体验AI代码助手

代码解读

复制代码

{ id: id, jsonrpc: "2.0", result: { // 一些服务能力 capabilities: {}, serverInfo: { name: "服务器名称", version: "1.0.0" } } }

这时候,客户端已经可以显示服务器的基本信息了。

4.4.2 请求工具列表

SSE服务器收到到请求后,需要响应给客户端的是工具列表:

json

体验AI代码助手

代码解读

复制代码

{ "id": 0, "jsonrpc": "2.0", "result": { "tools": [ { "name": "disableUserByName", "description": "禁用一个用户的账号", "inputSchema": { "type": "object", "properties": { "nickname": { "type": "string", "description": "名称" } }, "required": ["nickname"] } } ] } }

4.4.3 执行工具

SSE服务器需要执行工具时,会得到这个结构体:

json

体验AI代码助手

代码解读

复制代码

{ "id": 1, "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "disableUserByName", "arguments": { "name": "张三" } } }

你可以在执行一些代码后,返回下面的结构体:

json

体验AI代码助手

代码解读

复制代码

{ "id": 1, "jsonrpc": "2.0", "result": { "content": [ { "type": "text", "text": "好,张三被我干掉了" } ] } }

到这里,几乎完成了整个流程。

4.5 基于注解的封装

我们因为使用的JavaSpringBoot, 所以我们使用了@McpMethod注解配合Reflections来实现自动注册工具。

java

体验AI代码助手

代码解读

复制代码

@McpMethod("modifyEmailByName") @Description("modify user new email by name") public String modifyEmailByName( @Description("the name of user, e.g. 凌小云") String name, @Description("the new email of user, e.g. example@domain.com") String email ) { List<UserEntity> userList = filter(new UserEntity().setNickname(name)); DATA_NOT_FOUND.when(userList.isEmpty(), "没有叫 " + name + " 的用户"); userList.forEach(user -> { updateToDatabase(get(user.getId()).setEmail(email)); }); return "已经将 " + userList.size() + " 个叫 " + name + " 的用户邮箱修改为 " + email; }

只要标记了@McpMethod注解,MCP服务器就会自动注册这个方法。

然后你就可以通过CherryStudio等工具来调用这个方法了。

动动嘴的事情~

五、总结

我们通过上述的方式完成了一个的MCP服务, 并且也可以为我们的一些其他系统进行扩展,用大模型来改造这些系统的使用方式,美滋滋。

当然,这里还有很多问题需要我们解决,比如权限控制。

完整的代码我们放在了我们的SPMS_Server项目以及AirPower4J基础库里了:

  • SPMS-Server: github.com/s-pms/SPMS-…
  • AirPower4J: github.com/HammCn/AirP…

六、展望

我倒是很悲观,现在满脑子都是小爱同学,把张三的辞职报告审核通过一下

等各种终端设备都支持MCP协议了,我们再来玩更多的事情吧。

各位周末愉快,Bye.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据领域Doris与MongoDB的集成方案

大数据领域Doris与MongoDB的集成方案&#xff1a;从业务痛点到实时分析的完美闭环 1. 引入&#xff1a;当“灵活存储”遇到“实时分析”的两难 凌晨2点&#xff0c;电商运营小李盯着电脑屏幕皱起眉头——他要统计“618大促期间&#xff0c;华南地区18-25岁用户的商品浏览→加购…

美团Java后端Java面试被问:Kafka的零拷贝技术和PageCache优化

1. 零拷贝技术&#xff08;Zero-Copy&#xff09; 传统数据拷贝流程&#xff08;4次拷贝&#xff0c;4次上下文切换&#xff09; java 复制 下载 // 传统文件读取发送流程&#xff08;非零拷贝&#xff09; 1. 磁盘 → 内核缓冲区&#xff08;DMA拷贝&#xff09; 2. 内核缓…

导师严选10个AI论文写作软件,专科生轻松搞定毕业论文!

导师严选10个AI论文写作软件&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何让论文写作变得轻松高效 在当前的学术环境中&#xff0c;越来越多的学生开始借助 AI 工具来辅助论文写作。尤其是对于专科生而言&#xff0c;面对繁重的论文任务&#xff0c;传统的写作方…

HeiXi 配置 Metahuman

效果&#xff1a;PlayerStart(实例) 配置&#xff1a;位置 (0,149,120)角度&#xff1a;(0,-10,-90)

导师严选10个一键生成论文工具,本科生毕业论文必备!

导师严选10个一键生成论文工具&#xff0c;本科生毕业论文必备&#xff01; 论文写作的“救星”来了&#xff0c;AI 工具如何帮你轻松应对毕业压力&#xff1f; 对于本科生来说&#xff0c;撰写毕业论文不仅是学术能力的考验&#xff0c;更是时间与精力的双重挑战。而随着 AI 技…

高德扫街榜2026发布:首个全季节、全品类、全人群和全球化的真实榜单

2026年1月7日&#xff0c;阿里巴巴集团旗下高德正式发布高德扫街榜2026——在原有的“真实”核心理念基础上&#xff0c;围绕数字、信任与科技三大核心力量全面升级&#xff0c;发布了飞行街景、时令榜单、AR实景、好友动态等一系列新功能&#xff0c;推动生活服务榜单进入“比…

The following modules are missing or built with a different engine version:

The following modules are missing or built with a different engine version:我把 插件ACEUnrealPlugin-5.3 放到一个ue5.6项目的Plugins中&#xff0c;打开ue5.6项目然后5.6再打开就报异常&#xff1a;The following modules are missing or built with a different engine…

优雅阅读实时热闻,畅享新闻新体验✨

Elegant阅读&#xff1a;实时热点新闻的优雅呈现 在信息瞬息万变的时代&#xff0c;获取最新、最热门的新闻已经成为我们生活中不可或缺的一部分。为此&#xff0c;Elegant阅读项目应运而生&#xff0c;它旨在为用户提供一个简洁优雅的界面&#xff0c;让用户随时随地都能轻松…

命令替换(Command Substitution)详解

命令替换&#xff08;Command Substitution&#xff09;详解 &#x1f3af; 一句话概括 命令替换 把一个命令的输出作为另一个命令的参数或变量值。这是Shell编程中最强大、最常用的功能之一&#xff01; &#x1f4a1; 核心概念 基本语法 # 两种语法都有效 command # 反引…

[特殊字符] Pathway:高效的Python ETL框架,助力实时数据处理与分析

Pathway 实时数据处理框架介绍 在当今数据驱动的时代&#xff0c;能够有效处理实时数据流与批量数据的工具愈加重要。Pathway是一个用于流处理、实时分析、LLM&#xff08;大语言模型&#xff09;管道和RAG&#xff08;实时生成&#xff09;应用的Python ETL框架。它为用户提供…

星空计划亮相2026年CES,全球化战略进程加速

今年的CES又添新秀。1月6日&#xff0c;星空计划首次登陆CES&#xff0c;携概念车Nebula Next 01 Concept正式亮相&#xff0c;展示了其先锋设计语言以及对高性能新能源架构的前瞻性探索。作为一家以技术研发与产品探索为核心的创新型科技公司&#xff0c;此次亮相意味着星空计…

MybatisPlus-快速入门

介绍 官网介绍&#xff1a;简介 | MyBatis-Plus 作用&#xff1a;提高单表CRUD操作的效率 快速开始 实现下列功能&#xff1a; 新增用户功能根据id查询用户根据id批量查询用户根据id更新用户根据id删除用户 引入MybatisPlus的起步依赖 MyBatisPlus官方提供了starter&…

高德扫街榜100天全新升级:从美食到吃喝玩乐,全球首次实现飞行实景探店

1月7日&#xff0c;上线100天的高德扫街榜宣布三大重磅升级&#xff1a;依托世界模型发布全球首个“飞行街景”&#xff0c;实现从街景一路俯瞰至店内实景&#xff1b;推出全球首个应季、应时、应地的生活服务动态榜单&#xff1b;引入好友关系&#xff0c;新增好友动态和个人榜…

论文67分神话创造者:7000篇论文实战淬炼,金老师带你锁定2026年高项通关“生死关”

如果说软考高项是一场战役&#xff0c;那么论文就是决定最终胜负的“天王山之战”无数考生折戟于此——背熟了知识&#xff0c;练会了计算&#xff0c;却倒在了最后这3000字的“纸面上”。然而&#xff0c;有这样一位老师&#xff0c;他让论文从“拦路虎”变成了学员的“提分利…

2026年入局AI行业:普通人的机会在哪里?

作为一个在AI领域摸爬滚打一年多的年轻人&#xff0c;我亲身体验了普通人如何通过AI实现经济独立。在我还未毕业的情况下&#xff0c;通过自学AI技术和应用&#xff0c;已经实现了完全的经济自由。今天&#xff0c;我想分享我的观察和思考&#xff0c;希望能为同样想抓住AI浪潮…

操作系统期末复习——第5章:输入/输出

目录5.2 I/O软件原理5.2.1 I/O软件的目标5.2.2 程序控制I/O5.2.3 中断驱动I/O5.2.4 使用DMA的I/O5.3 ⭐I/O软件层次5.3.1 中断处理程序5.3.2 ⭐设备驱动程序&#xff08;Device Driver&#xff09;5.3.3 ⭐Device-Independent的OS软件5.3.4 功能5.3.5 总结5.4 Disks5.4.1 盘硬件…

Claude Code 国内使用2026年最新完整教程分享

适用 Windows / macOS / Linux&#xff0c;并包含 国内网络环境可用方案与常见问题排查。Claude Code 是 Anthropic 官方的终端 AI 编程助手&#xff0c;可用于&#xff1a;写代码、解释代码、重构、生成脚本、审查 PR、运行测试、维护项目记忆&#xff08;CLAUDE.md&#xff0…

Mosaic:面向超长序列的多GPU注意力分片方案

Transformer的"二次方注意力瓶颈"的问题是老生常谈了。这个瓶颈到底卡在哪实际工程里怎么绕过去&#xff1f;本文从一个具体问题出发&#xff0c;介绍Mosaic这套多轴注意力分片方案的设计思路。 注意力的内存困境 注意力机制的计算公式&#xff1a; Attention(Q, …

2026马斯克《Moonshots》播客独家访谈全记录与深度解析

一、访谈基础信息全景 本次访谈是马斯克2026年首份重磅公开对话,录制于2025年12月22日美国得克萨斯州奥斯汀特斯拉超级工厂(Cybertruck与Optimus机器人核心生产基地),于2026年1月6日通过《Moonshots》播客正式上线,全时长近3小时。访谈由“零重力”公司创始人、奇点大学执…

操作系统期末复习——第4章:文件系统

目录第4章&#xff1a;文件系统概述4.1 文件4.1.1 文件命名4.1.2 文件结构4.1.3 文件类型4.1.4 文件访问4.2 目录4.2.1 一级目录系统4.2.2 二级目录系统4.2.3 层次目录系统4.2.4 路径名4.3文件系统的实现4.3.1 文件系统布局4.3.2 文件与磁盘4.3.3 ⭐文件的实现4.3.4 ⭐目录的实…