当前位置: 首页 > news >正文

用一个实际例子快速理解MCP应用的工作步骤

已经有很多的文章介绍MCP server,MCP Client工作原理,这里不做太多介绍。但是很多介绍都只是侧重介绍概念,实际的工作原理理解起来对初学者还是不太友好。本文以一个智能旅游咨询系统为例,详细说明在利用 Model Context Protocol(MCP)应用时,从用户输入到给出最终结果,上下文信息的传递过程以及每一步的封装填充情况。能够让读者快速了解,所谓的model context protocol中上下文的含义,同一般的function call的差异。
在这里插入图片描述

工作过程与原理介绍

场景设定

用户希望了解北京故宫的开放时间和门票价格,系统利用 MCP 协调不同的工具(如开放时间查询工具、门票价格查询工具)来获取相关信息并给出回答。

整个系统的消息交互图如下:

用户 客户端 LLM MCP服务器 GET /tools HTTP/1.1 工具列表 缓存工具列表 输入"北京故宫的开放时间和门票价格是多少?" 封装请求 问题和工具列表 分析并生成工具调用指令 调用工具列表 确认操作 确认 查询开放时间 执行工具 结果 收集工具结果 确认操作 确认 结果 执行工具 返回结果 收集工具结果 发送结果 生成自然语言回答 返回结果 结果展示 用户 客户端 LLM MCP服务器

完整流程概述

  1. 客户端与MCP服务器建立连接,获取可用工具列表
  2. 用户输入问题,客户端封装请求
  3. 客户端调用LLM进行意图分析,生成工具调用指令
  4. 客户端向MCP服务器发起工具调用(需用户确认)
  5. MCP服务器执行工具并返回结果
  6. 客户端整合结果,调用LLM生成最终回答
  7. 客户端向用户展示最终结果

详细步骤说明

1. 客户端初始化 & 获取工具列表

客户端首次连接MCP服务器时,通过/tools端点获取注册的工具列表:

请求:

GET /tools HTTP/1.1
Host: mcp-server.example.com
Accept: application/json

响应:

{"tools": [{"name": "opening_hours_query","description": "景区开放时间查询工具","parameters": {"location": "string"}},{"name": "ticket_price_query","description": "景区门票价格查询工具","parameters": {"location": "string"}}]
}

说明:客户端需要缓存工具列表,用于后续LLM分析。


2. 用户输入 & 请求封装

用户在客户端界面输入问题:

“北京故宫的开放时间和门票价格是多少?”

客户端封装请求,包含用户问题、用户标识和时间戳:

{"user_id": "12345","timestamp": "2025-04-09 12:00:00","question": "北京故宫的开放时间和门票价格是多少?"
}

3. LLM分析 & 生成工具调用指令

客户端将用户问题+工具描述发送给LLM:

{"question": "北京故宫的开放时间和门票价格是多少?","available_tools": [{"name": "opening_hours_query","description": "景区开放时间查询工具"},{"name": "ticket_price_query","description": "景区门票价格查询工具"}]
}

LLM返回结构化工具调用指令:

{"request_id": "abcdef123456","llm_response": [{ "tool_call_id": "call_1","tool_name": "opening_hours_query","parameters": {"location": "北京故宫"}},{ "tool_call_id": "call_2","tool_name": "ticket_price_query","parameters": {"location": "北京故宫"}}]
}

4. 客户端发起工具调用(含用户确认)

客户端按照MCP协议(JSON-RPC)格式封装请求,并先向用户展示确认对话框:

用户确认界面:

即将执行以下操作:
1. 查询[北京故宫]的开放时间
2. 查询[北京故宫]的门票价格是否继续? [确认] [取消]

用户确认后,发送正式请求:

{"jsonrpc": "2.0","method": "tool/execute","params": {"tool": "opening_hours_query","arguments": {"location": "北京故宫"}},"id": "call_1"
}

5. MCP服务器执行工具

MCP服务器执行工具并返回结果:

{"jsonrpc": "2.0","result": {"status": "success","data": "旺季8:30-17:00,淡季8:30-16:30"},"id": "call_1"
}

6. 客户端整合结果 & 生成最终回答

客户端收集所有工具结果后,再次调用LLM:

{"request_id": "abcdef123456","question": "北京故宫的开放时间和门票价格是多少?","tool_results": [{"tool_call_id": "call_1","tool_name": "opening_hours_query","result": "旺季8:30-17:00,淡季8:30-16:30"},{"tool_call_id": "call_2","tool_name": "ticket_price_query","result": "旺季60元,淡季40元"}]
}

LLM生成自然语言回答:

{"final_answer": "北京故宫开放时间:旺季8:30-17:00,淡季8:30-16:30;门票价格:旺季60元,淡季40元。"
}

7. 客户端展示最终结果

将LLM生成的回答呈现给用户:

“北京故宫开放时间:旺季8:30-17:00,淡季8:30-16:30;门票价格:旺季60元,淡季40元。”


这个流程确保了系统的安全性、可扩展性和协议合规性。

相关文章:

用一个实际例子快速理解MCP应用的工作步骤

已经有很多的文章介绍MCP server,MCP Client工作原理,这里不做太多介绍。但是很多介绍都只是侧重介绍概念,实际的工作原理理解起来对初学者还是不太友好。本文以一个智能旅游咨询系统为例,详细说明在利用 Model Context Protocol&…...

Element Plus 图标使用方式整理

Element Plus 图标使用方式整理 以下是 Element Plus 图标的所有使用方式&#xff0c;包含完整代码示例和总结表格&#xff1a; 1. 按需引入图标组件 适用场景&#xff1a;仅需少量图标时&#xff0c;按需导入减少打包体积 示例代码&#xff1a; <template><div>…...

力扣题解:142. 环形链表 II

在链表学习中&#xff0c;我们已经了解了单链表和双链表&#xff0c;两者的最后一个结点都会指向NULL&#xff1b;今天我们介绍的循环列表则不同&#xff0c;其末尾结点指向的这是链表中的一个结点。 循环链表是一种特殊类型的链表&#xff0c;其尾节点的指针指向头节点&#…...

图灵逆向——题七-千山鸟飞绝

目录列表 过程分析headers头部M参数分析载荷x参数分析响应数据解密分析 代码实现 一进来还是一个无限debugger&#xff0c;前面有讲怎么过&#xff0c;这里直接过掉~ 老规矩&#xff0c;养成习惯&#xff0c;先看请求头里有没有加密参数发现好像是有个M&#xff0c;它是个32位…...

双相机结合halcon的条码检测

以下是针对提供的C#代码的详细注释和解释&#xff0c;结合Halcon库的功能和代码结构进行说明&#xff1a; --- ### **代码整体结构** 该代码是一个基于Halcon库的条码扫描类GeneralBarcodeScan&#xff0c;支持单台或双台相机的条码检测&#xff0c;并通过回调接口返回结果。…...

Transformer Decoder Block的几个优化方案

写在前面 在大型语言模型(LLM)的演进浪潮中,Transformer 架构凭借其强大的并行计算能力和对长距离依赖的出色捕捉,奠定了核心地位。然而,标准的 Transformer Decoder Block 遵循着一种相对固定的模式:先进行自注意力(Self-Attention)捕捉上下文信息,再通过前馈神经网…...

工业科学级天文相机:跨界融合的高精密成像解决方案

随着国内科技的快速发展&#xff0c;工业相机领域正悄然兴起一场"天文级"的技术革命。这类兼具工业设备可靠性与天文观测精度的特殊相机&#xff0c;正在半导体制造、天文观测、空间探测等领域开辟新的应用疆域。其核心技术突破不仅体现在传感器性能的提升&#xff0…...

颠覆传统!复旦微软联合研发MagicMotion,重新定义图生视频可能性

导读简介&#xff1a; 尽管基于DiT的模型在生成高质量和长视频方面表现出色&#xff0c;但许多文本到视频的方法在精确控制物体运动和相机运动等属性方面存在不足。因此&#xff0c;细粒度轨迹可控的视频生成技术应运而生&#xff0c;这对于在现实场景中生成可控视频至关重要。…...

华为数字芯片机考2025合集5已校正

1. 题目内容 下列选项中&#xff08;&#xff09;不是 Verilog HDL 的关键字。&#xff08;&#xff09; A. tri B. for C. force D. edge 解析 1. Verilog 关键字分类 Verilog 关键字是语言预定义的保留字&#xff0c;用于语法结构或特定功能。 2. 选项分析 选项类型说明…...

QML Loader:延迟加载与动态切换

目录 引言相关阅读工程结构LoaderDelay.qml - 延迟加载实现完整代码HeavyComponent.qml代码解析运行效果 LoaderSwitch.qml - 动态切换组件完整代码代码解析运行效果 Main.qml - 主界面实现完整代码主界面结构代码解析 总结下载链接 引言 QML的Loader组件提供了一种强大的机制…...

C语言--常用的链表操作

利用C语言实现链表&#xff0c;并定义一些常用的操作 文章目录 链表定义新建一个链表结点打印链表插入结点头插法&#xff08;常用&#xff09;运行 尾插法&#xff08;使用较少&#xff09;运行 返回链表长度链表转置运行 合并两个有序的链表运行 删除最小结点运行 打印倒数第…...

ngx_conf_param

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_param-CSDN博客 定义在 src\core\ngx_conf_file.c char * ngx_conf_param(ngx_conf_t *cf) {char *rv;ngx_str_t *param;ngx_buf_t b;ngx_conf_file_t conf_file;param &cf->cycle->conf…...

C++day9

思维导图 牛客练习 练习&#xff1a; 将我们写的 myList 迭代器里面 operator[] 和 operator 配合异常再写一遍 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector>…...

算法题:两数相加

题目&#xff1a;2. 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&a…...

SCI科学论文的重要组成部分

科学论文的核心结构 科学论文通常遵循IMRAD结构&#xff0c;即&#xff1a; 引言(Introduction)方法(Methods)结果(Results)讨论(Discussion) 除此之外&#xff0c;还包括其他几个关键部分。让我为您详细介绍每个部分的作用和重要性&#xff1a; 1. 标题(Title) 标题是论文…...

Go 微服务框架 | 路由实现

文章目录 不用框架实现web接口实现简单的路由实现分组路由支持不同的请求方式支持同一个路径的不同请求方式前缀树应用前缀树完善路由代码 不用框架实现web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…...

2025年AI开发学习路线

目录 一、基础阶段&#xff08;2-3个月&#xff09; 1. 数学与编程基础 2. 机器学习入门 二、核心技能&#xff08;3-4个月&#xff09; 1. 深度学习与框架 2. 大模型开发&#xff08;重点&#xff09; 三、进阶方向&#xff08;3-6个月&#xff09; 1. 多模态与智能体…...

TimescaleDB 2.19.2 发布

TimescaleDB 2.19.2 已于 2025 年 4 月 7 日发布2。此次发布是基于 PostgreSQL 的开源时序数据库 TimescaleDB 的一次更新。 从 GitHub 上的 Pull Request 信息可知,此次发布主要是将相关更改合并到 2.19.x 分支,涉及到一系列的测试和构建配置,包括不同版本 PostgreSQL(如 …...

「Unity3D」TextMeshPro中的TMP_InputField,用来实现输入框的几个小问题

第一&#xff0c;正确设置Scrollbar。 设置Scrollbar之后&#xff0c;不能设置Text Component的Font Size为Auto Size&#xff0c;否则Scrollbar无法正确计算显示。 那么&#xff0c;要想自动适配字体大小&#xff0c;可以让Placeholder中的Font Size设置为Auto&#xff0c;这…...

HTML 是什么?网页创建的核心标记语言

原文&#xff1a;HTML 是什么&#xff1f;网页创建的核心标记语言 | w3cschool笔记 HTML 是什么&#xff1f; HTML 是一种标记语言&#xff0c;用于创建网页。简单来说&#xff0c;HTML 就像一本魔法书&#xff0c;它告诉电脑如何展示网页上的内容&#xff0c;比如文字、图片…...

考研单词笔记 2025.04.09

act v表现&#xff0c;行动&#xff0c;做事&#xff0c;扮演&#xff0c;充当&#xff0c;担任&#xff0c;起作用n行为&#xff0c;行动&#xff0c;法案&#xff0c;法令 action n行为&#xff0c;行动 behave v表现&#xff0c;行事&#xff0c;守规矩&#xff0c;举止端…...

map/multimap

1.概念 map中所有元素都是pair<key,value>&#xff0c;key 是map的键&#xff0c;value 是map的值 所有元素都会根据key自动排序 map/multimap属于关联式容器&#xff0c;底层结构是用二叉树实现。 map和multimap区别&#xff1a; map不允许容器中有重复key值元素 m…...

CSS 定位属性的生动比喻:以排队为例理解 relative 与 absolute

目录 一、理解标准流与队伍的类比 二、relative 定位&#xff1a;队伍中 “小范围活动” 的人 三、absolute 定位&#xff1a;队伍中 “彻底离队” 的人 在学习 CSS 的过程中&#xff0c;定位属性relative和absolute常常让初学者感到困惑。它们的行为方式和对页面布局的影响较…...

基于二叉堆实现的 PriorityQueue

基于二叉堆实现的 PriorityQueue 是一种常见的数据结构&#xff0c;广泛用于任务调度、路径搜索、事件模拟等场景。下面我将用 Java 语言实现一个简单的基于最小堆的 PriorityQueue&#xff0c;即优先级最小的元素先出队。 ✅ 实现目标 使用数组实现二叉最小堆&#xff08;即父…...

大模型分布式推理和量化部署

一、小常识 1、计算大模型占用多少显存 对于一个7B&#xff08;70亿&#xff09;参数的模型&#xff0c;每个参数使用16位浮点数&#xff08;等于 2个 Byte&#xff09;表示&#xff0c;则模型的权重大小约为&#xff1a; 7010^9 parameters2 Bytes/parameter14GB 70亿个参数…...

循环神经网络 - 长程依赖问题及改进方案

循环神经网络在学习过程中的主要问题是由于梯度消失或爆炸问题&#xff0c;很难建模长时间间隔(Long Range)的状态之间的依赖关系。 本文我们来学习长程依赖问题及其对应的改进方案&#xff0c;在这部分知识的学习过程中&#xff0c;我建议大家着重理解&#xff0c;对于数学公…...

点击抽奖功能总结

首先用户打开网页&#xff0c;映入眼帘的是一个输入框和一个提交按钮。当用户在输入框中输入自己的年龄并点击提交后&#xff0c;系统会根据输入的年龄给出相应提示。若年龄达到 60 岁&#xff0c;页面将显示一个新的抽奖区域&#xff0c;用户可以点击 “抽奖” 按钮开始抽奖。…...

AWS Bedrock生成视频详解:AI视频创作新时代已来临

💡 TL;DR: AWS Bedrock现已支持AI视频生成功能,让企业无需深厚AI专业知识即可创建高质量视频内容。本文详解Bedrock视频生成能力的工作原理、应用场景和实操指南,助你快速掌握这一革命性技术。 🎬 AWS Bedrock视频生成:改变内容创作的游戏规则 还记得几年前,制作一个专…...

理解 TOGAF®标准中的架构原则

原则是帮助组织实现其使命的基本规则和指南。它们旨在长期稳定且很少修改&#xff0c;在各个领域中充当决策和行动的指南针。在企业架构&#xff08;EA&#xff09;的背景下&#xff0c;原则在指导架构框架的开发和应用方面发挥着至关重要的作用。本文将探讨企业原则和架构原则…...

基于视觉密码的加密二值图像可逆数据隐藏

接下来&#xff0c;分享一篇论文&#xff0c;标题为《Multi-Party Reversible Data Hiding in Ciphertext Binary Images Based on Visual Cryptography》&#xff0c;由Bing Chen等人发表在《IEEE Signal Processing Letters》上。该论文提出了一种基于视觉密码学的多方可逆数…...

ubuntu22.04 中 No module named ‘_bz2‘问题解决方案

前言 本篇是介绍ubuntu22.04中 No module named ‘_bz2‘问题解决方案 网上版本很多&#xff0c;比如安装libbz库什么的&#xff0c;可能别人有用&#xff0c;但是我自己这边出了一堆问题 一、流程 1.1 查看bz2.xx.so文件 看自己的python版本&#xff0c;我新安装了个pyth…...

什么是声波,声波的传播距离受哪些因素影响?

一、声波的定义&#xff1a; 声波是一种机械波&#xff0c;它是通过介质&#xff08;如空气、水、固体等&#xff09;传播的振动。以下是关于声波的详细介绍&#xff1a; 1、声波的产生 声波是由物体的振动产生的。例如&#xff0c;人说话时&#xff0c;声带振动产生声波&…...

用PHPExcel 封装的导出方法,支持导出无限列

用PHPExcel 封装的导出方法&#xff0c;支持导出无限列 避免PHPExcel_Exception Invalid cell coordinate [1 异常错误 /*** EXCEL导出* param [string] $file_name 保存的文件名及表格工作区名&#xff0c;不加excel后缀名* param [array] $fields 二维数组* param [array] $…...

STL-stack栈和queue队列

stack栈和queue队列 在STL中 stack 和 queue 设计为容器适配器,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一组特定的成员函数来访问其元素。 在我的STL系列中之前的容器 vector、list、deque 都是从底层类型一步步封装而来的,但是 stack 和 queue 没有…...

AI 提示词不会写?试试 PromptIDE

这段时间&#xff0c;AI 技术大爆炸 已经改变了我们的工作方式&#xff0c;而 会不会用 AI&#xff0c;已经成为区分工作能力的关键&#xff01; &#x1f4a1; 在这个AI重构工作方式的时代&#xff0c;会用和不会用AI的人正在拉开巨大差距&#xff1a; √ 高手用AI——效率飙…...

【python读取并显示遥感影像】

在Python中读取并显示遥感影像&#xff0c;可以使用rasterio库读取影像数据&#xff0c;并结合matplotlib进行可视化。以下是一个完整的示例代码&#xff1a; import rasterio import matplotlib.pyplot as plt import numpy as np# 打开遥感影像文件 with rasterio.open(path…...

代码随想录算法训练营第十三天

LeetCode题目: 110. 平衡二叉树257. 二叉树的所有路径404. 左叶子之和222. 完全二叉树的节点个数3375. 使数组的值全部为 K 的最少操作次数(每日一题) 其他: 今日总结 往期打卡 110. 平衡二叉树 跳转: 110. 平衡二叉树 学习: 代码随想录公开讲解 问题: 给定一个二叉树&#…...

TQTT_KU5P开发板教程---高速收发器之XDMA实现PCIE

文档功能介绍 本文档主要实现了通过一个叫做XDMA的IP&#xff0c;实现PCIE的测试例子。工程新建方法请参考文档《流水灯》。 Vivado创建项目 起始页&#xff08;或 file-->Project-->New 创建新工程(Create New Project) 向导起始页面 点击 Next--> Project Name(…...

蓝桥杯速成刷题清单(上)

一、1.排序 - 蓝桥云课 &#xff08;快速排序&#xff09;算法代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 5e5 10; int a[N];int main() {int n;cin >> n;for (int i 0; i < n; i) {cin >> a[i];}sort(a, a n);for …...

【FreeRTOS】二值信号量 是 消息队列 吗

在读FreeRTOS内核实现与应用开发实战指南的时候&#xff0c;书中第16章有这么一句话&#xff1a;可以将二值信号量看作只有一个消息的队列&#xff0c;incident这个队列只能为空或满&#xff08;因此称为二值&#xff09;&#xff0c;在运用时只需要之傲队列中是否由消息即可&a…...

BOTA六维力矩传感器在三层AI架构中的集成实践:从数据采集到力控闭环

随着机器人技术的迅猛发展&#xff0c;Bota六维力矩传感器成为三层AI架构中的核心组件。它通过高精度的力与力矩感知能力&#xff0c;为感知层提供实时数据支持&#xff0c;优化了决策层的判断效率&#xff0c;并确保执行层操作的精确性和安全性。 Bota贯通式力矩传感器PixOne&…...

UE5 matcap学习笔记

没难度节点&#xff0c;但是要记住这种思维&#xff0c;移动端常用&#xff1a; 原视频&#xff1a;(美学阿姨)MatCap材质原理讲解与UE5中的实现方法_哔哩哔哩_bilibili...

神经网络 - 关于简单的激活函数的思考总结

最近一直在学习神经网络&#xff0c;有一些收获&#xff0c;也有一些迷惑&#xff0c;所以驻足思考&#xff1a;为什么简单的激活函数如sigmoid函数、ReLU函数&#xff0c;当应用在神经网络的模型中&#xff0c;却可以实现对现实世界复杂的非线性关系的模拟呢&#xff1f;本文我…...

pig 权限管理开源项目学习

pig 源码 https://github.com/pig-mesh/pig 文档在其中&#xff0c;前端在文档中&#xff0c;官方视频教学也在文档中有。 第一次搭建&#xff0c;建议直接去看单体视频&#xff0c;照着做即可。 文章目录 项目结构Maven 多模块项目pig-boot 启动核心模块pig-auth 实现认证和…...

excel中的VBA指令示例(二)

。。。接上篇。 Range("D1").Select ’选择D1单元格 ActiveCell.FormulaR1C1 "装配数量" ‘单元格内容为装配数量 Range("D1").Select Selection.AutoFilter …...

基于vue3与supabase系统认证机制

1. 认证框架概述 系统采用 Supabase 作为认证和数据服务提供商&#xff0c;实现了完整的用户身份验证流程。系统使用基于 JWT (JSON Web Token) 的认证方式&#xff0c;提供了安全可靠的用户身份管理机制。 1.1 技术栈 前端: Vue 3 TypeScript状态管理: Pinia认证服务: Sup…...

【算法笔记】并查集详解

&#x1f680; 并查集&#xff08;Union-Find&#xff09;详解&#xff1a;原理、实现与优化 并查集&#xff08;Union-Find&#xff09;是一种非常高效的数据结构&#xff0c;用于处理动态连通性问题&#xff0c;即判断若干个元素是否属于同一个集合&#xff0c;并支持集合合…...

基于Redis实现短信防轰炸的Java解决方案

基于Redis实现短信防轰炸的Java解决方案 前言 在当今互联网应用中&#xff0c;短信验证码已成为身份验证的重要手段。然而&#xff0c;这也带来了"短信轰炸"的安全风险 - 恶意用户利用程序自动化发送大量短信请求&#xff0c;导致用户被骚扰和企业短信成本激增。本…...

编程中,!! 双感叹号的理解

在编程中&#xff0c;!! 双感叹号的含义取决于上下文。通常情况下&#xff0c;!! 是逻辑非操作符的双重使用&#xff0c;用来将一个值强制转换为布尔类型。 1. 逻辑非操作符 在 JavaScript 中&#xff0c;! 是逻辑非操作符&#xff0c;它会将一个值转换为布尔类型&#xff1a…...

ARM内核与寄存器

ARM内核与寄存器详解 目录 ARM架构概述ARM处理器模式 Cortex-M3内核的处理器模式Cortex-A系列处理器模式 ARM寄存器集 通用寄存器程序计数器(PC)链接寄存器(LR)堆栈指针(SP)状态寄存器(CPSR/SPSR) 协处理器寄存器NEON和VFP寄存器寄存器使用规范常见ARM指令与寄存器操作 ARM架…...