前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库MCP 服务端 capabilities listChanged subscribe 区别
AIAI AgentMCP 协议

MCP 服务端 capabilities 中 listChanged 和 subscribe 有什么区别?

支持资源读取、支持资源目录变化通知、支持单个资源更新订阅,是三个不同承诺。

前端进阶之旅 · 一题精讲更新于 2026.09.06
AI Agent#MCP 协议#MCP#Prompt#缓存
先看核心答案读代码示例
理解线索

从功能发现到缓存更新

  1. 声明能力说明支持哪类操作和可选通知
  2. 读取目录通过各自的 list 请求发现具体条目
  3. 更新缓存区分重拉目录和重新读取某个资源

示例支持资源读取与目录变化,但没有承诺单个资源订阅;省略 subscribe 不能按 true 处理。

核心回答

先记住这个答案

服务端在 initialize 响应的 capabilities 中声明可提供的功能。tools 与 prompts 可用 listChanged 表示目录变化通知;resources 除 listChanged 外,还能用 subscribe 表示支持订阅单个资源变化。logging 的空对象表示日志能力存在,没有由这四类字段共同继承的 subscribe 开关。以下按 2025-11-25 讨论这四项,它们不是该版本全部服务端能力。能力声明描述功能范围,实际工具、提示模板和资源条目还需分别发现,并受当前访问策略约束。

  • 能力对象存在与内部布尔值分别判断
  • listChanged 关注目录,subscribe 关注资源更新
  • 能力声明不直接携带完整工具和资源列表

空能力对象并不表示这个功能不可用

tools: {} 表示工具功能存在,只是没有声明工具目录变化通知。客户端可以调用 tools/list 发现工具,不能因为对象里没有 listChanged 就把整个工具面板关闭。resources: {} 也不能被误判为没有资源读取能力。

下面将四个能力放在同一对象中便于比较。它是初始化结果中 capabilities 的值,不是独立的协议请求。实现时应读取每一项自己的结构,不要遍历全部字段后自动拼出并不存在的通用订阅方法。

目录变化与资源订阅分别声明JSON
{
  "tools": { "listChanged": true },
  "resources": { "listChanged": true, "subscribe": false },
  "prompts": {},
  "logging": {}
}

工具与资源目录变化可产生相应通知,资源订阅未启用;提示模板可被发现,但未声明目录变化通知。日志能力也不代表服务端会自动发送所有级别的全部内部日志。

文件索引场景中两种变化需要不同处理

文件服务新增一个可发现的资源条目,会影响资源目录;原有资源 URI 不变但文件正文更新,则影响该资源内容。前者适合使目录缓存失效并重新列举,后者在已订阅时通过资源更新通知触发重新读取。

通知通常提供变更信号而不是完整新正文,也不能据此假定所有分页缓存已经自动更新。客户端应把同一轮密集通知合并处理,重新读取后确认最新状态。即使目录条目没有变化,用户当前权限仍可能让下一次读取失败。

声明与实现不一致时怎样定位问题

若服务端声明订阅但没有实现 resources/subscribe,客户端会在连接看似正常后才遇到方法错误。应将能力声明纳入集成测试:每个已开启选项都要有处理路径,每个未开启选项都不能成为客户端流程的隐含依赖。

日志功能可以帮助查看这些交互,但应按协议级别选择和数据清理策略发送,不能泄露请求中的凭证。遇到未声明的扩展能力时先保持兼容,是否启用由明确的扩展契约决定;不能因为字段名字看起来熟悉就自行推断语义。

回答前,多想一步

容易答错的地方

有 listChanged 就能订阅每个资源的内容
目录变化和单项更新是不同信号,单项订阅还需要 resources.subscribe;不能把目录通知当作对每个 URI 都建立了监听。
capabilities 里没有实际条目就代表列表为空
初始化声明与具体目录发现分开,必须调用对应列表接口并处理分页;能力存在不说明条目数量,也不代表当前身份能访问全部内容。
试着用自己的话回答

面试官还会怎么问?

资源内容更新后一定要重新读取整个资源目录吗?

不一定,如果只是已知 URI 的内容变化,通常重新读取该资源即可。目录变化通知才说明需要检查条目集合,具体缓存策略应按信号分别设计。

listChanged 没声明就意味着目录永远不变吗?

不能这样推断,它只表示没有承诺相应通知。客户端仍可在重新连接、用户刷新或应用定义的时机重新发现目录,避免长期依赖旧缓存。

同一个资源同时改变内容和展示名称怎么办?

这可能同时影响资源内容与目录元数据,应按服务端提供的信号更新相应缓存。客户端可以合并重复读取,但不能忽略其中一类变化。

从一道题,走向一组知识

把知识连起来

MCP 协议

MCP 客户端的 roots、sampling、elicitation 分别允许服务端请求什么?

对照客户端根列表变化通知与服务端资源能力

MCP 协议

MCP 工具 inputSchema 为什么要求对象,客户端和服务端各校验什么?

发现工具后还需要读取并检查每个工具的参数契约

参考资料

  • MCP 2025-11-25:Resources
  • MCP 2025-11-25:Prompts
  • MCP 2025-11-25:Logging
  • MCP 2025-11-25:Tools

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 空能力对象并不表示这个功能不可用
  3. 文件索引场景中两种变化需要不同处理
  4. 声明与实现不一致时怎样定位问题
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑