Claude Code 里 MCP 的资源(Resources)是我最近才开始认真用的一块。以前总觉得"让模型读数据"最简单的方式就是开个工具函数直接返回,直到有一次我让 Agent 帮忙对比本地和线上的配置,它在工具列表里反复找 get_config、get_cache、get_secret,最后还把整份配置内容塞进上下文,又慢又占 token。后来我把这些只读数据从工具挪到了资源里,Claude Code 的上下文一下清爽了很多。这篇教程是这个系列的第 31 篇,核心就聊一件事:MCP 里面的资源到底怎么用,以及怎么在 Claude Code 里把它真正跑起来。
很多教程会把重点放在"MCP 是什么"和"怎么加 server"上,资源往往被一句话带过。但资源在协议里是一个非常独特的原语:它不像工具那样需要被"调用",更像一本书被"翻阅"。这篇文章我会从协议形态讲起,写一个实际的 FastMCP 资源服务,再展示它在 Claude Code 里的接入路径,最后分享一些我在真实项目里踩过的边界和坑。适合已经会装 MCP 工具、想让 Agent 更会"读书"的朋友。
1. MCP 资源:为什么它比"让模型读文件"更值得研究
1.1 一个让我重新认识资源的问题
Claude Code 用久了,你会很自然地把能做的事都包装成 Tool。查数据库用一个工具,读配置文件用一个工具,看文档再用一个工具。工具列表越来越长,模型选择工具时消耗的 token 和出错概率也同步上升。更麻烦的是,工具本质上是"操作",它适合被调用,但不适合承载大段上下文。
有一次我为了排查线上环境一个时区问题,让 Agent 读配置。因为配置是放在 MCP server 里的,我一开始做成 get_app_config() 工具。结果模型每次分析都先调用这个工具,把整份配置塞回对话,然后我再问它"时区字段是多少",它又要重新从上下文里找。配置不长还好,如果是一份 5000 行的配置文件,这种玩法会让上下文瞬间爆炸。
后来我把配置改成资源暴露,比如 config://app。模型在真正需要时才去读取,读取到的是"内容",不是"一次调用的返回结果"。这个区别听起来很小,实际体验差别巨大:Prompt 里不再堆满重复数据,模型也能在推理过程中把不同资源组合起来用。从这次之后,我开始认真研究 MCP 资源,而不是只把注意力放在工具上。
1.2 资源和工具的关系:书与开关的比喻
如果把 Claude Code 里的 Agent 想象成一个实习员工,MCP 里的 Tool 就是它手里的开关和按钮:按下搜索按钮能联网,按下数据库按钮能查数据,按下写文件按钮能改文件。这些操作有行为、有副作用,执行完会产生结果。Resources 则更像办公室里的书架和资料柜:资料放在那里,Agent 需要的时候自己去翻,翻到哪页读哪页。
这个比喻能帮你做第一轮判断
