从零到 MCP:构建 LLM 工具我学到的三件事

在 2025 年 Gradio Agents & MCP 黑客松期间,我决定探索一些我尚不了解的东西:Anthropic 的模型上下文协议 (MCP)。我最初只是出于好奇,最终却学到了大量关于 LLM 如何使用外部工具的知识。
MCP 简单来说是什么?
LLM 擅长推理和生成文本,但它们无法执行计算两座城市之间的实际距离、获取实时数据或生成图像等操作。MCP 是一种标准方式,可让 LLM 访问外部工具。
就我而言,我构建了用于地理计算的工具。当你问 LLM “从马德里到巴塞罗那开车需要多长时间?”时,LLM 可以使用我的工具来:
- 将城市名称转换为坐标
- 计算最佳路线
- 获取预计旅行时间
所有这些都无需 LLM “了解”地理知识,它只需使用我提供的工具即可。
发现其简易性
我构建了一个地理计算 MCP。我原以为会很复杂,但它的简单性让我大吃一惊。我用很少的代码就使其运行起来了。
demo.launch(mcp_server=True)
Gradio 在这方面非常简单。只需一行代码,它就能将你的 Python 函数转换为任何兼容的 LLM 都可以使用的工具。Gradio 简化了过程:它将函数转换为工具,无需复杂的设置。
第一课:你的 Docstring 就是你的 API
这让我重新思考了如何编写代码。我过去认为文档字符串只是为了其他开发者,但事实证明它们远不止如此。
def get_coords_from_address(address: str) -> str:
"""
Converts a street address into latitude and longitude coordinates.
Args:
address (str): The address to search for (e.g., "Eiffel Tower, Paris")
Returns:
str: Formatted coordinates "Lat: XX.XXXX, Lon: YY.YYYY"
"""
LLM 读取此文档字符串并理解函数的作用、所需的参数、预期的响应类型,甚至使用示例。
我学到的:编写好的文档字符串不再仅仅是一种好的实践——它实际上是你设计 AI 理解你的工具界面的方式。基本上,你的文档字符串是 AI 的用户手册,就像 OpenAPI 规范一样。如果你的函数仅凭文档字符串无法被理解,LLM 将会失败。
第二课:注意 LLM 的上下文
我一开始犯了一个错误。我的路线返回了巨大的 JSON 文件(约 5KB),其中包含数千个完整路线的坐标。问题是 LLM 对它们可以处理的文本量有限制,我却白白浪费了大量空间。
解决方案非常简单:在我的服务器上生成地图图像,只返回文件的引用。
# Before: Massive JSON with coordinates
{"coordinates": [[lat1,lon1], [lat2,lon2], ...]} // ~5KB
# After: Compact JSON with pre-generated image
{"map_image_path": "/tmp/route_12345.webp"} // ~200 bytes
我学到的:为 LLM 构建工具时,优化响应大小与优化速度同样重要。
第三课:LLM 会自动组合工具
我完全没想到 LLM 会在您无需解释如何操作的情况下,按顺序使用多个工具。
用户:“从埃菲尔铁塔到卢浮宫需要多长时间?”
LLM 执行的操作(无需您告诉它如何操作):
- 使用
get_coords_from_address("Eiffel Tower, Paris")
- 使用
get_coords_from_address("Louvre, Paris")
- 使用这些坐标调用
get_route_data()
- 使用
extract_route_time()
获取最终答案
所有这些都是自动发生的。LLM 理解它需要先进行地理编码,然后规划路线,最后提取时间。LLM 通过使用文档字符串中的描述(例如,如果一个函数说它“需要坐标”,LLM 就会知道它必须首先调用地理编码器)来找出这些工具之间的依赖关系。
我学到的:你不是在创建一个孤立的工具,你正在创建一个可以与其他工具巧妙组合的东西。
最棒的是,通过创建原子函数(只做一件非常明确的事情),LLM 可以以我从未想象过的方式组合它们。例如,我从未想过有人会问“在我去办公室的路线上的每个点 500 米半径内有多少家咖啡馆?”,但 LLM 可以完美地将我的地理编码 + 路线规划 + 地点搜索工具连接起来解决这个问题。这种灵活性开辟了我从未考虑过的用例。
我为何觉得这很有趣
MCP 使构建 LLM 工具变得触手可及。任何开发者都可以编写带有良好文档字符串的 Python 函数,将其放入 Gradio 应用程序中,并设置 `mcp_server=True`,这样他们就拥有了任何兼容 LLM 都可以使用的工具。
想象一下它的潜力:科学计算器、图表生成器、数据分析器、API 连接器……MCP 为 LLM 提供了访问所有这些的标准方式。
最后思考
最终,我觉得我不仅仅是在编写一个地图 MCP。这就像是教 LLM 一项新技能,几乎就像是给了它一双眼睛去看真实世界。
你还能想到其他哪些工具?我很乐意在评论区听到你的想法。
总结:
- 清晰的文档字符串 = 愉快的 LLM
- 紧凑的响应 > 巨大的 JSON
- 如果文档字符串良好,LLM 会自行链接工具
- 开始使用:一个函数 + 良好的文档字符串 +
gradio.launch(mcp_server=True)
如果你想尝试,你所需要的就这些。