户端将每个 Function 的执行结果和用户的提问等信息,一起再次提交给 AI 模型服务器。

image-20250419174630396

由于高德接口并发限制,有部分接口调用失败,那么客户端可能会来回请求多次,最后输出 AI 的回答。

image-20250419174824315

到这里,读者应该明白 MCP Tool、Plugin、Function Call 的关系了吧!

实现 Mcp Server

前面笔者介绍了 MCP Tool,但是 MCP Server 还可以提供很多很有用的功能,MCP 协议定义了以下核心模块:

  • Core architecture
  • Resources
  • Prompts
  • Tools
  • Sampling
  • Roots
  • Transports

作为当前社区中最关注的 Tools,本文已经单独介绍,接下来将会以继续讲解其它功能模块。

实现 Resources

示例项目参考:ResourceServer、ResourceClient。

Resources 定义:Resources 是 Model Context Protocol (MCP) 中的一个核心原语,它允许服务器暴露可以被 clients 读取并用作 LLM 交互上下文的数据和内容。

Resources 代表 MCP server 想要提供给 clients 的任何类型的数据,在使用上,MCP Server 可以给每种资源定义一个 Uri,这个 Uri 的协议格式可以是虚拟的,这不重要,只要是能够定位资源的一段 Uri 字符串即可。

只看定义,读者可能不理解什么意思,没关系,等后面动手做的时候就知道了。


Resources 可以包括:

  • 文件内容
  • 数据库记录
  • API 响应
  • 实时系统数据
  • 屏幕截图和图像
  • 日志文件
  • 等等

每个 resource 都由一个唯一的 URI 标识,并且可以包含文本或二进制数据。

Resources 使用以下格式的 URIs 进行标识:

[protocol]://[host]/[path]


例如:

  • file:///home/user/documents/report.pdf
  • postgres://database/customers/schema
  • screen://localhost/display1

Resources 的文件类型,主要是文本资源和二进制资源。

文本资源

文本资源包含 UTF-8 编码的文本数据。这些适用于:

  • 源代码
  • 配置文件
  • 日志文件
  • JSON/XML 数据
  • 纯文本


二进制资源

二进制资源包含以 base64 编码的原始二进制数据。这些适用于:

  • 图像
  • PDFs
  • 音频文件
  • 视频文件
  • 其他非文本格式

Resources Server、Client 实现

客户端使用 Resources 服务时,有以下 Api,那么在本节的学习中,将会围绕这这些接口讲解如何在服务段实现对应的功能。

image-20250419194249066


实现 Resources 时,主要有两种提供 Resources 的方式,一种是通过模板动态提供 Resource Uri 的格式,一种是直接提供具体的 Resource Uri。

Resource Uri 格式示例:

"test://static/resource/{README.txt}"

MCP Server 提供的 Resource Uri 格式是可以随意自定义的,这些 Uri 并不是直接给 Client 读取的,Client 在需要读取 Resource 是,把 Uri 发送给 MCP Server,MCP Server 自行解析 Uri 并定位对应的资源,然后把资源内容返回给 Client。

也就是说,该 Uri 的协议其实就是字符串,只要在当前 MCP Server 和 Client 之间能用即可。

MCP Server 可以通过模板提供某类资源,这类资源的的地址是动态的,要根据 id 实时获取。

builder.Services.AddMcpServer()
        .WithListResourceTemplatesHandler(async (ctx, ct) =>
        {
            return new ListResourceTemplatesResult
            {
                ResourceTemplates =
                [
                    new ResourceTemplate { Name = "Static Resource", Description = "A static resource with a numeric ID", UriTemplate = "test://static/resource/{id}" }
                ]
            };
        });
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐