MCP协议

原理讲解

基础概念

Introduction - Model Context Protocol

  • MCP Host:想要通过 MCP 访问数据的程序,例如 Claude Desktop、IDE 或 AI 工具
  • MCP Clients:与服务器保持 1:1 连接的协议客户端
  • MCP Servers:轻量级程序,每个程序通过标准化模型上下文协议公开特定功能
  • Local Data Sources: MCP 服务器可以安全访问的计算机文件、数据库和服务
  • Remote Services: MCP 服务器可以通过互联网(例如,通过 API)连接的外部系统

核心组件

协议层

协议层处理消息框架,请求/响应链接和高级通信模式。

class Protocol<Request, Notification, Result> {// Handle incoming requests, 处理请求setRequestHandler<T>(schema: T, handler: (request: T, extra: RequestHandlerExtra) => Promise<Result>): void// Handle incoming notifications, 处理通知, 不需要对方响应的请求setNotificationHandler<T>(schema: T, handler: (notification: T) => Promise<void>): void// Send requests and await responses, 请求request<T>(request: Request, schema: T, options?: RequestOptions): Promise<T>// Send one-way notifications, 通知notification(notification: Notification): Promise<void>
}

传输层

运输层处理客户与服务器之间的实际通信。 MCP支持多种运输机制:

  1. Stdio transport
    • 使用标准输入/输出进行通信
    • 适用于本地流程的处理
  1. HTTP with SSE transport
    • 使用服务器范围的事件进行服务器到客户消息
    • 使用 http POST方式发送消息,用于客户到服务器消息

所有运输都使用JSON-RPC 2.0交换消息。有关模型上下文协议消息格式的详细信息,请参见规格。

消息类型

MCP具有这些主要消息类型:

  1. 请求期望对方有回应:
interface Request {method: string;params?: { ... };
}
  1. 结果是对请求的成功响应:
interface Result {[key: string]: unknown;
}
  1. 错误表明请求失败:
interface Error {code: number;message: string;data?: unknown;
}
  1. 通知是单向消息,不会期望回复:
interface Notification {method: string;params?: { ... };
}

生命周期

初始化

  1. 客户以协议版本和功能发送initialize请求
  2. 服务器响应其协议版本和功能
  3. 客户将initialized通知发送为确认
  4. 正常消息交换开始

  1. init client, connect server
  2. init model, get tools, query, tool call
  3. tool result -> model
  4. model summary

尝试使用

通过mcp工具读取本地文件内容

  1. clone 官方提供的mcp服务项目:
git clone git@github.com:modelcontextprotocol/servers.git
  1. 构建本地服务:
docker build -t mcp/filesystem -f src/filesystem/Dockerfile .

  1. 镜像构建完成后, 采用LangChain4j进行测试用例构建:
package dev.langchain4j.example.mcp;import dev.langchain4j.mcp.McpToolProvider;
import dev.langchain4j.mcp.client.DefaultMcpClient;
import dev.langchain4j.mcp.client.McpClient;
import dev.langchain4j.mcp.client.transport.McpTransport;
import dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.tool.ToolProvider;import java.io.File;
import java.util.List;public class McpToolsExampleOverStdio {// We will let the AI read the contents of this file/*** This example uses the `server-filesystem` MCP server to showcase how* to allow an LLM to interact with the local filesystem.* <p>* Running this example requires npm to be installed on your machine,* because it spawns the `server-filesystem` as a subprocess via npm:* `npm exec @modelcontextprotocol/server-filesystem@0.6.2`.* <p>* Of course, feel free to swap out the server with any other MCP server.* <p>* The communication with the server is done directly via stdin/stdout.* <p>* IMPORTANT: when executing this, make sure that the working directory is* equal to the root directory of the project* (`langchain4j-examples/mcp-example`), otherwise the program won't be able to find* the proper file to read. If you're working from another directory,* adjust the path inside the StdioMcpTransport.Builder() usage in the main method.*/public static void main(String[] args) throws Exception {ChatLanguageModel model = OpenAiChatModel.builder().apiKey(System.getenv("OPENAI_API_KEY")).baseUrl(System.getenv("OPENAI_API_URL")).modelName("gpt-4o-mini").logRequests(true).logResponses(true).build();McpTransport transport = new StdioMcpTransport.Builder().command(List.of("docker", "run", "-i", "--rm","--mount", "type=bind,src=/Users/louye/fun-project/langchain4j-examples/mcp-example/src/main/resources,dst=/projects","mcp/filesystem","/projects")).logEvents(true).build();McpClient mcpClient = new DefaultMcpClient.Builder().transport(transport).build();ToolProvider toolProvider = McpToolProvider.builder().mcpClients(List.of(mcpClient)).build();Bot bot = AiServices.builder(Bot.class).chatLanguageModel(model).toolProvider(toolProvider).build();try {String response = bot.chat("修改文件 /projects/file.txt 的内容, 将内容修改为: Hello, world!");System.out.println("RESPONSE: " + response);} finally {mcpClient.close();}}
}

参考文档: https://github.com/modelcontextprotocol/servers/blob/main/src/filesystem/README.md

实际上McpTransport 就是帮用户通过特定的命令进行启动MCP的server服务器

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

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

相关文章

Maven环境搭建

Maven 1. 概述 ApacheMaven是一个软件项目管理和构建工具。基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;Maven可以从中心信息中管理项目的构建、报告和文档 理解: maven构建项目&#xff08;100%&#xff09;而且帮你完成jar的统一管理。 思考: 原来的jar—…

llaMa模型的创新

LLaMa介绍 LLaMa是基于transformer encoder的生成式模型。 目前有&#xff1a;LLAMA, LLAMA2, LLAMA3 三个大的版本 论文 LLAMA 2: Open Foundation and Fine-Tuned Chat Models&#xff1a; https://arxiv.org/pdf/2307.09288 LLAMA 3: The Llama 3 Herd of Models https…

渗透测试实验

1、seacmsv9注入管理员密码 获取管理员账号&#xff08;name&#xff09; http://www.test2.com/comment/api/index.php?gid1&page2&rlist[]%27,%20extractvalue(1,%20concat_ws(0x20,%200x5c,(select%20(name)from%20sea_admin))),%27 2、获取管理员密码 http://www…

文心一言AI创意画

介绍 文心一言是百度推出的新一代知识增强大语言模型&#xff0c;属于文心大模型家族的新成员。‌它能够与人对话互动、回答问题、协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。‌ 特点 文心一言基于数万亿数据和数千亿知识进行融合学习&#xff0c;采用预训…

安装VM和Centos

安装VM 一、打开虚拟机 二、选择典型 三、选择光盘 四、指定虚拟机位置 五、设置磁盘大小并拆分为多个文件 六、完成 安装Centos 一、上述过程完成后我们直接打开虚拟机 二、语言选择中文 三、默认安装位置并点击完成 四、点击开始安装 五、点击设置密码 设置完密码后点击完成…

优选算法大集合(待更新)

1.双指针 1.1.移动零 leetcode链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09;​​​​​​ 移动零的问题我们可以将它归类为数组划分的问题&#xff0c;我们将数组划分为非零部分和零部分。我们会使用到双指针的算法&#xff0c;在这里&#xff0c;我…

微信小程序面试题

微信小程序面试题 微信小程序页面的生命周期函数主要包括哪些&#xff1f; onLoad: 页面加载时触发。一个页面只会调用一次&#xff0c;可以在onLoad的参数中获取打开当前页面路径中的参数。 onShow: 页面显示时触发调用。 onReady: 页面初次渲染完成时触发,一个页面只会调…

Git详解及常用命令

一、Git概述 官网&#xff1a;https://git-scm.com/ 安装&#xff1a;安装适合自己的版本&#xff0c;默认安装即可 使用&#xff1a;选择一个文件夹&#xff0c;右键&#xff0c;当出现&#xff1a;Git Bash后说明安装成功&#xff0c;后续使用都是基于Git Bash Git简介 G…

MongoDB 面试题目

一、基础概念 MongoDB 的特点是什么&#xff1f; MongoDB是一种NoSQL数据库&#xff0c;具有以下特点&#xff1a; 文档存储模型 MongoDB 使用 BSON&#xff08;Binary JSON&#xff09; 格式存储数据&#xff0c;数据以文档的形式组织&#xff0c;类似于JSON对象。文档可以包…

路由追踪核心技术深度解析:Traceroute与Tracert命令实战指南(跨平台/抓包/网络安全防护)

目录 路由器是什么&#xff1f; 路由器的基本功能&#xff1a; 路由追踪技术&#xff08;Traceroute&#xff09; 路由追踪的工作原理 实现技术 路由追踪的输出示例 路由追踪的用途 traceroute 命令&#xff08;Linux 和 macOS&#xff09; 基本语法 常用选项 示例 …

4部署kibana:5601

kibana 是一个基于浏览器页面的Elasticsearch前端展示工具&#xff0c;, 是一个开源和免费的工具 Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面, 可以帮你汇总、分析和搜索重要数据日志 1.安装-所有的es节点 # tar xf kibana-6.4.1-linux-x86_64.t…

数据结构与算法-图论-最短路和其他的结合

介绍 最短路算法常与深度优先搜索&#xff08;DFS&#xff09;、动态规划&#xff08;DP&#xff09;、二分答案、拓扑排序等算法结合使用&#xff1a; - 最短路与DFS结合&#xff1a;在一些图的路径问题中&#xff0c;当需要访问特定的多个结点&#xff0c;且数据范围较小时…

AOP基础-01.快速入门

一.AOP 对于统计每一个业务方法的耗时这一操作&#xff0c;如果再业务层的每一个方法前获取方法运行的开始时间&#xff0c;方法结束获取结束时间&#xff0c;然后计算执行耗时&#xff0c;那这样就太繁琐了。能不能定义一个模板方法&#xff0c;使得该方法能够在业务层的方法执…

【笔记】redis回忆录(未完 重头过一遍)

了解 redis在linux上运行 没有window版本 有也是微软自己搞的 &#xff08;一&#xff09;安装与修改配置 1.在linux虚拟机上 安装gcc依赖 然后再usr/local/src解压在官网下载好的redis安装包 直接拖进去 tar -zxvf 安装包名字 tab键补齐 解压成功 进入软件 并执行编译命令…

Android OpenGLES2.0开发(十一):渲染YUV

人生如逆旅&#xff0c;我亦是行人 Android OpenGLES开发&#xff1a;EGL环境搭建Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始Android OpenGLES2.0开发&#xff08;二&#xff09;&#xff1a;环境搭建Android OpenGLES2.0开发&#xff08;三&am…

deep-research 专用评测数据集

Deep Research自2025年2月初由OpenAI推出后迅速引发全球关注&#xff0c;其通过端到端强化学习技术实现多步骤研究任务自动化&#xff0c;能在数十分钟内生成分析师水平报告&#xff0c;效率远超人类&#xff08;耗时从30分钟到30天不等&#xff09;&#xff0c;被学者评价为“…

SQL之order by盲注

目录 一.order by盲注的原理 二.注入方式 a.布尔盲注 b.时间盲注 三.防御 一.order by盲注的原理 order by子句是用于按指定列排序查询结果&#xff0c;列名或列序号皆可。 order by 后面接的字段或者数字不一样&#xff0c;那么这个数据表的排序就会不同。 order by 盲…

基于javaweb的SSM+Maven疫情物业系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

提升数据洞察力:五款报表软件助力企业智能决策

概述 随着数据量的激增和企业对决策支持需求的提升&#xff0c;报表软件已经成为现代企业管理中不可或缺的工具。这些软件能够帮助企业高效处理数据、生成报告&#xff0c;并将数据可视化&#xff0c;从而推动更智能的决策过程。 1. 山海鲸报表 概述&#xff1a; 山海鲸报表…