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

news2025/4/18 11:19:37

已经有很多的文章介绍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元。”


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

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

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

相关文章

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

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

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

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

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

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

VMware Fusion Pro 13 for Mac虚拟机

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

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

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

【debug莫名其妙跑飞了】

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

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

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

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

openssl实现分组加密模式(例如AES128-CBC的CBC部分)的模块名字叫做modes,源代码位于 https://gitee.com/gh_mirrors/openssl/tree/master/crypto/modes 博主又打不开github了TT,只能找个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、总结…

PyQt学习记录

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

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

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

Trae + LangGPT 生成结构化 Prompt

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

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

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

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

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

机器学习 Day10 逻辑回归

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

Seq2Seq - Dataset 类

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

echarts图表相关

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

idea自动部署jar包到服务器Alibaba Cloud Toolkit

安装插件:Alibaba Cloud Toolkit 配置服务器: 服务器配置: 项目启动Shell脚本命令: projectpd-otb.jar echo 根据项目名称查询对应的pid pid$(pgrep -f $project); echo $pid echo 杀掉对应的进程,如果pid不存在,则不执行 if [ …

Element Plus 图标使用方式整理

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

链路聚合+vrrp

1.链路聚合 作用注意事项将多个物理接口&#xff08;线路&#xff09;逻辑上绑定在一起形成一条逻辑链路&#xff0c;起到叠加带宽的作用1.聚合接口必须转发速率一致。2.聚合设备两端必须一致 配置命令 方法一 [Huawei]interface Eth-Trunk 0----先创建聚合接口&#xff0c;…