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

用一个实际例子快速理解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&…...

TCP 和 UDP 可以使用同一个端口吗?

TCP 和 UDP 可以使用同一个端口吗? 前言 在深入探讨 TCP 和 UDP 是否可以使用同一个端口之前,我们首先需要理解网络通信的基本原理。网络通信是一个复杂的过程,涉及到多个层次的协议和机制。在 OSI 模型中,传输层是负责端到端数…...

探索原生JS的力量:自定义实现类似于React的useState功能

1.写在前面 本方案特别适合希望在历史遗留的原生JavaScript项目中实现简单轻量级数据驱动机制的开发者。无需引入任何框架或第三方库,即可按照此方法封装出类似于React中useState的功能,轻松为项目添加状态管理能力,既保持了项目的轻量性&am…...

探索 Shell 中的扩展通配符:从 Bash 到 Zsh

在 Unix 系统中,通配符(globbing)是 shell 的核心功能,用于快速匹配文件或目录。基础通配符(如 *、?、[])虽简单实用,但在复杂场景下往往力不从心。为此,许多现代 shell 提供了“扩…...

封装方法的辨析

equals //字符串 str1.equals(str2); //list的两个实现类 list1.equals(list2); //map的两个实现类 //比较所有的键值对是否相同 map1.equals(map2); //数组(包括string类型) //比较内容是否相同 Arrays.equals(array1, array2); contains 基本都有…...

[leetcode]判断质数

一.判断质数 1.1 什么是质数 质数&#xff08;素数&#xff09;就是只可以被自己和1整除的数叫做素数/质数 1.2判断方法 #include<bits/stdc.h> using namespace std; bool isPrime(int num) { if(num < 1) { return false;//a number less of …...

在Flutter中使用BottomNavigationBar和IndexedStack可以实现一个功能完整的底部导航栏

在Flutter中&#xff0c;使用BottomNavigationBar和IndexedStack可以实现一个功能完整的底部导航栏。BottomNavigationBar用于显示底部的导航按钮&#xff0c;而IndexedStack则用于管理页面的切换&#xff0c;确保每个页面的状态得以保留&#xff08;即页面不会因为切换而重新构…...

HBuilder运行uni-app程序报错【Error: listen EACCES: permission denied 0.0.0.0:5173】

一、错误提示&#xff1a; 当使用HBuilder运行uni-app项目的时候提示了如下错误❌ 15:11:03.089 项目 project 开始编译 15:11:04.404 请注意运行模式下&#xff0c;因日志输出、sourcemap 以及未压缩源码等原因&#xff0c;性能和包体积&#xff0c;均不及发行模式。 15:11:04…...

聊透多线程编程-线程基础-3.C# Thread 如何从非UI线程直接更新UI元素

目录 1. 使用 Control.Invoke 或 Control.BeginInvoke&#xff08;Windows Forms&#xff09; 2. 使用 Dispatcher.Invoke 或 Dispatcher.BeginInvoke&#xff08;WPF&#xff09; 3. 使用 SynchronizationContext 桌面应用程序&#xff08;如 Windows Forms 或 WPF&#xf…...

VMware Fusion Pro 13 for Mac虚拟机

VMware Fusion Pro 13 for Mac虚拟机 文章目录 VMware Fusion Pro 13 for Mac虚拟机一、介绍二、效果下载 一、介绍 VMware Fusion Pro for Mac&#xff0c;是一款mac虚拟机软件&#xff0c;跟Parallels Desktop一样&#xff0c;都可以让你的 Mac 同时运行一个或多个不同的操作…...

7.第二阶段x64游戏实战-string类

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;7.第二阶段x64游戏实战-分析人物属性 string类是字符串类&#xff0c;在计算机中…...

【debug莫名其妙跑飞了】

现象&#xff1a;就是在初始化汇编里跑飞了&#xff0c;也可能运行起来时钟不对 原因&#xff1a;调试器调试程序时会执行reset复位&#xff0c;reset没有正确执行。 细节决定成败&#xff0c;事出反常必有妖&#xff0c;忽略的小卡拉米最后能玩死你啊...

【Git 常用操作指令指南】

一、初始化与配置 1. 设置全局账户信息 git config --global user.name "用户名" # 设置全局用户名 git config --global user.email "邮箱" # 设置全局邮箱 --global 表示全局生效&#xff0c;若需针对单个仓库配置&#xff0c;可省略该参数 2.…...

基础知识补充篇:什么是DAPP前端连接中的provider

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读352次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...

openssl源码分析之加密模式(modes)

openssl实现分组加密模式&#xff08;例如AES128-CBC的CBC部分&#xff09;的模块名字叫做modes&#xff0c;源代码位于 https://gitee.com/gh_mirrors/openssl/tree/master/crypto/modes 博主又打不开github了TT&#xff0c;只能找个gitee镜像 头文件是modes.h。 该模块目前…...

【PVR】《Palm Vein Recognition and Large-scale Research based on Deep Learning》

邬晓毅. 基于深度学习的掌静脉识别及规模化研究[D]. 四川:电子科技大学,2024. 文章目录 1、背景2、相关工作3、创新点和贡献4、方法和实验4.1、知识介绍4.2、基于自适应损失函数的掌静脉识别算法研究4.3、退化图像的掌静脉识别鲁棒性提升研究4.4、掌静脉识别系统规模化 5、总结…...

ES6规范新特性总结

ES6新特性 var、let和const不存在变量提升暂时性死区不允许重复声明 解构赋值用途&#xff1a;交换变量的值从函数返回多个值提取JSON数据遍历map结构输入模块的制定方法 字符串的扩展codePointAt()String.fromCharCode()at()includes(),startsWith(),endsWith()repeat()padSta…...

PyQt学习记录

PyQt学习记录 要在界面上 创建一个控件&#xff0c;就需要在程序代码中 创建 这个 控件对应类 地一个 实例对象。 在Qt系统中&#xff0c;控件&#xff08;widget&#xff09;是 层层嵌套 的&#xff0c;除了最顶层的控件&#xff0c;其他的控件都有父控件。 几个函数 函数mo…...

嵌入式硬件篇---Uart和Zigbee

文章目录 前言一、UART&#xff08;通用异步收发传输器&#xff09;1. 基本概念2. 工作原理帧结构起始位数据位校验位停止位 异步通信波特率 3. 特点优点缺点 4. 典型应用 二、ZigBee1. 基本概念2. 技术细节工作频段2.4GHz868MHz 网络拓扑星型网络网状网络簇状网络 协议栈物理层…...

代码随想录算法训练营--打卡day8

一.反转字符串II 1.题目链接 541. 反转字符串 II - 力扣&#xff08;LeetCode&#xff09; 2.思路 循环分组定位&#xff1a;使用 for 循环&#xff0c;每2k为一组。i 每次增加 2k &#xff0c;就相当于定位到下一组字符的起始位置。在每次循环中&#xff0c;确定当前组需要…...

Linux 学习笔记(5)路径知识详解:绝对路径、相对路径与特殊路径符(期末、期中复习必备)

前言 一、相对路径与绝对路径 1、概念阐述 2、实际示例 二、特殊路径符 1.特殊路径符介绍 2.应用场景 三、总结 四、结语 前言 在 Linux 系统的学习过程中&#xff0c;路径的概念至关重要&#xff0c;它是我们在文件系统中定位文件和目录的关键。今天&#xff0c;我们就…...

Trae + LangGPT 生成结构化 Prompt

Trae LangGPT 生成结构化 Prompt 0. 引言1. 安装 Trae2. 克隆 LangGPT3. Trae 和 LangGPT 联动4. 集成到 Dify 中 0. 引言 Github 上 LangGPT 这个项目&#xff0c;主要向我们介绍了写结构化Prompt的一些方法和示例&#xff0c;我们怎么直接使用这个项目&#xff0c;辅助我们…...

【ida】ida笔记

1 ida下载 IDA Pro 7.0 Windows 和 macOS 版本&#xff0c;包含全部 F5 插件 - 资源分享 - iOS 安全论坛 - 专注于研究 iOS 安全 - iOS Hacker 2 IDA基操 1 shiftF12 查看string信息 (通常可以看到重要的信息 ) 2 Alt T 查找带有目标字符串的函数 3 F5 查看C代码 4 Ctrl F…...

动态规划——两个数组的dp问题

目录 1. 最长公共子序列 2. 不相交的线 3. 不同的子序列 4. 通配符匹配 5. 正则表达式匹配 6. 交错字符串 7. 两个字符串的最小ASCII删除和 8. 最长重复子数组 1. 最长公共子序列 题目链接&#xff1a;1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff0…...

stream流Collectors.toMap(),key值重复问题

文章目录 一、问题二、问题示例三、原因四、解决方法4.1、方案一 一、问题 发现Collectors.toMap的一个坑&#xff0c;若key值重复的时候会抛异常。如&#xff1a; IllegalStateException: Duplicate key 男 二、问题示例 报错示例如下&#xff1a; import lombok.AllArgsC…...

机器学习 Day10 逻辑回归

1.简介 流程就是&#xff1a; 就是我们希望回归后激活函数给出的概率越是1和0. 2.API介绍 sklearn.linear_model.LogisticRegression 是 scikit-learn 库中用于实现逻辑回归算法的类&#xff0c;主要用于二分类或多分类问题。以下是对其重要参数的详细介绍&#xff1a; 2.1.…...

即时通讯软件BeeWorks,企业如何实现细粒度的权限控制?

BeeWorks作为一款专为企业设计的即时通讯平台&#xff0c;高度重视用户隐私安全&#xff0c;采取了多种措施来保障数据的保密性、完整性和可用性。 首先&#xff0c;BeeWorks采用私有化部署模式&#xff0c;企业可以将服务器架设在自己的网络环境中&#xff0c;所有通讯数据&a…...

Seq2Seq - Dataset 类

本节代码定义了一个 CMN 类&#xff0c;它继承自 PyTorch 的 Dataset 类&#xff0c;用于处理英文和中文的平行语料库。这个类的主要作用是将文本数据转换为模型可以处理的格式&#xff0c;并进行必要的填充操作&#xff0c;以确保所有序列的长度一致。 ⭐重写Dataset类是模型训…...

学习OpenCV C++版

OpenCV C 1 数据载入、显示与保存1.1 概念1.2 Mat 类构造与赋值1.3 Mat 类的赋值1.4 Mat 类支持的运算1.5 图像的读取与显示1.6 视频加载与摄像头调用1.7 数据保存 参考&#xff1a;《OpenCV4快速入门》作者冯 振 郭延宁 吕跃勇 1 数据载入、显示与保存 1.1 概念 Mat 类 : Ma…...

echarts图表相关

echarts图表相关 echarts官网折线图实际开发场景一&#xff1a; echarts官网 echarts官网 折线图 实际开发场景一&#xff1a; 只有一条折线&#xff0c;一半实线&#xff0c;一半虚线。 option {tooltip: {trigger: "axis",formatter: (params: any) > {const …...