我看目前网上的 MCP 相关教程,主要是教的写 MCP Server 的,很少讲到 MCP Client 。即使有,也只使用 call_tool 来做演示。甚至 claude 官方文档都对如何正确使用 resource 语焉不详:
https://modelcontextprotocol.io/quickstart/client
但其实 MCP 能够使用的除了 tools 还有 resourc/prompts 。分别需要使用下面的调用来获取。
session.list_resource_templates()
session.list_resources()
session.list_prompts()
请大家分享一下你是怎么使用 resource 的。
如果你要实现一个全自动的通用 client ,这个 client 事先不知道 server 的任何信息,只能通过先调用list_xx
来获取。那么,tools 可以通过 tool calling 让大模型选择使用哪个工具,但怎么让大模型告诉你应该使用哪个 resource 呢?难道从返回的正文里面解析?
注意前提是你提前不知道这个 MCP server 有什么功能。https://github.com/stuzero/pg-mcp-server/blob/main/example-clients/claude_cli.py 这个示例代码,明显是在写 client 的时候,已经知道 server 是一个数据库的服务了,所以几乎是 hardcode 来利用 resource ,这样并不通用。
我能想到的方法,是自己再定义几个读取 resource 的函数,把他一起加到 tool call 里面:
例如:
def read_resource(uri):
xxx = session.read_resource(uri)
...
把这个 read_resource 加到 tool call 里面。
但感觉这种方法有点笨,不知道大家有没有什么好办法。
![]() |
1
hohoho 15 天前
我没有开发过,只是前天把协议粗略读了一遍,所以下面的回复有可能有误。
狭义的 client 是 host 和 server 之间的一个桥梁,通过 jsonrpc 与 server 通信,获取到 server 的 tools/resources/prompts 列表,然后可以通过 client 调用。一个 client 只能根据配置和一个 server 建立连接,具体这个 server 是啥跟 client 没关系。 广义的 client 其实是 host + clients ,类似于 cursor 、clients ,通过一堆 clients 获取各个 mcp 服务端的资源或工具列表,然后把获取到的 list 让 llm 根据输入自动选择对应的项及相关参数,然后再找到这个项对应的 client 调用,这个过程是一个循环迭代的过程,如果不设置上限,大模型可能会陷入一个死循环。 我觉得 op 的困惑其实是 host 的开发。比如 `明显是在写 client 的时候,已经知道 server 是一个数据库的服务了`,实际场景应该是大模型根据 list 里的描述和用户的输入决定是否调用这个数据库 mcp server 。 |
![]() |
3
stormtrooperx5 14 天前
hardcode 只是为了给你展示,如何使用取决于 llm 自身的能力
|