在这篇文章中,我们将讨论模型上下文协议,为什么它可能很重要,并逐步构建 MCP 服务器来帮助我们与 Jina.ai 对话,并能够在 Claude 中添加网络搜索和事实检查功能使用 Python 和 FastMCP 的桌面。
Anthropic于去年感恩节前后宣布。尽管它引起了一些关注,但考虑到它可能是开发下一层人工智能软件堆栈的关键垫脚石,它所获得的认可可能还不够。
模型上下文协议(MCP)是专为大型语言模型(LLM)设计的标准化通信协议。
将其视为“AI 的 HTTP”——就像 HTTP 标准化了 Web 浏览器与 Web 服务器的通信方式一样,MCP 标准化了 LLM 应用程序与工具和数据源的通信方式。
目前LLM的发展面临着几个障碍:
工具集成复杂度:每个LLM服务(如OpenAI、Anthropic等)都有其实现工具调用和函数调用的方式,使得构建可移植工具变得复杂。
上下文管理:法学硕士需要访问各种数据源和工具,但安全有效地管理此访问权限一直具有挑战性。
标准化:如果没有标准协议,开发人员必须为他们想要支持的每个 LLM 平台重建集成层。
MCP 通过提供以下功能来解决这些挑战:
MCP 遵循客户端-服务器架构,具有三个主要组件:
MCP 服务器:公开的服务:
MCP 客户端:应用程序连接到 MCP 服务器并管理 LLM 和服务器之间的通信。客户端支持还处于早期阶段,到目前为止,只有少数工具可以实现协议规范的任何部分,并且尚无客户端支持一些功能。
当然还有法学硕士...
工作流程很简单:
安全局势更加微妙。虽然使用 stdio 传输的服务器通常与客户端位于同一位置,因此 API 密钥不一定会暴露在互联网上。在我看来,它们确实似乎相当随意地被传播。
这些密钥需要在服务器启动时加载到客户端,以便将它们传递给子进程,它们甚至出现在桌面应用程序日志中,这是……令人担忧的。
API 密钥的广泛使用是影响 Gen AI 服务、平台和工具的更广泛问题。 Okta 和 Auth0 等公司正在开发一种无需依赖密钥即可管理和授权 Gen AI 的解决方案。
Anthropic 官方支持 TypeScript、Python 和 Kotlin 的低级 SDK。最近创建的一些样板包装器已经涵盖了一些样板文件,并具有其他不错的功能,例如用于调试、检查和在客户端上安装服务器的 CLI,以使开发 MCP 服务器变得更容易。
构建 MCP 服务器的快速、Python 方式。
模型上下文协议 (MCP) 服务器是一种为 LLM 提供上下文和工具的全新标准化方式,FastMCP 使构建 MCP 服务器变得简单直观。使用干净的 Python 代码创建工具、公开资源并定义提示:
# demo.py from fastmcp import FastMCP mcp = FastMCP("Demo ?") @<span>mcp.tool()</span> def add(a: int, b: int) -> int: """Add two numbers""" return a + b
就是这样!通过运行以下命令授予 Claude 访问服务器的权限:
fastmcp install demo.py
FastMCP 处理所有复杂的协议细节和服务器管理,因此您可以专注于构建出色的工具。它被设计为高级且Pythonic - 在大多数情况下,装饰一个函数就足够了。
FastMCP 就是这样一个框架。我们现在将探讨如何创建一个几乎实用的工具来阅读网站、通过网络回答搜索查询以及事实检查信息。我们将使用 Jina.ai。
这是一项非常巧妙的服务,提供了一个结合了“嵌入、重新排名和小语言模型”的“搜索基础平台”,以帮助企业构建 Gen AI 和多模式搜索体验。
您需要安装 uv。这是创建和管理 Python 项目的推荐方法。它是一个相对较新但令人兴奋的 Python 工具链 astral.sh 的一部分。我建议你检查一下。
它的目标是成为管理项目、依赖项、虚拟环境、版本、linting 以及执行 Python 脚本和模块的一站式商店。它是用 Rust 编写的。你会用这些信息做什么?
您还需要安装 Claude 桌面应用程序。就我们的目的而言,Claude 桌面应用程序将充当 MCP 客户端,并且是 Anthropic 的关键目标客户端。
完整演练在这里:
https://dev.to/asragab/building-a-model-context-protocol-server-using-jinaai-and-fastmcp-in-python-1od8
使用 uv 您可以使用以下方式初始化项目:
# demo.py from fastmcp import FastMCP mcp = FastMCP("Demo ?") @<span>mcp.tool()</span> def add(a: int, b: int) -> int: """Add two numbers""" return a + b
这将创建一个名为 mcp-jinaai-reader 的文件夹和一个 .python-version 以及 pyproject.toml。
fastmcp install demo.py
这将创建一个与我们选择的 python 版本相对应的虚拟环境。
创建环境后,它将提供有关如何为会话激活它的说明。
uv init mcp-jinaai-reader --python 3.11
添加一个 src 目录并安装我们需要的一个依赖
cd mcp-jinaai-reader uv venv
在项目根目录创建一个 .env 文件并将您的 JINAAI_API_KEY 添加到该文件中。您可以通过在 Jina 注册来免费获得一份。一般来说,您的服务器需要运行的任何 API 密钥或其他环境变量都将放入此文件中。
source .venv/bin/activate
在 src 目录中,创建一个 server.py 文件...我们应该能够获取代码。
uv add fastmcp
从导入开始:httpx,将是我们在这里用来发出 http 请求的库;我们需要 urlparse 方法来帮助我们确定字符串是否可能是有效的 URL。
JINAAI_API_KEY=jina_*************
这会初始化服务器;第一个参数是工具的名称。我不是 100% 确定为什么 uvicorn 需要在这里显式添加为依赖项,因为它是 FastMCP 的传递依赖项,但它似乎确实是必需的。
这可能是由于 fastmcp cli(稍后会详细介绍)安装服务器的方式造成的。如果您还有其他依赖项,则必须在此处添加它们,以便客户端知道您需要在运行客户端之前安装它们;我们稍后会看到它是如何工作的。
from fastmcp import FastMCP import httpx from urllib.parse import urlparse import os
您可能可以在这里找出模式,但 Jina 使用不同的子域来路由特定请求。搜索端点需要一个查询,读取器端点需要一个 URL,而接地端点可以向 llm 提供特定的响应或答案。
接地是一个更大的主题,与 RAG 和微调等其他技术一起使用,以帮助法学硕士减少幻觉并改进决策。
# Initialize the MCP server mcp = FastMCP("search", dependencies=["uvicorn"])
注释@mcp.tool 完成了很多繁重的工作。库中存在类似的资源和提示注释。该注释提取函数签名和返回类型的详细信息,以创建供 llm 调用该工具的输入和输出架构。它配置该工具,以便客户端了解服务器的功能。它还将函数调用注册为已配置工具的处理程序。
接下来,您会注意到该函数是异步的。不需要运行时配置,也不需要 asyncio.run 的东西。如果出于某种原因您需要将服务器作为独立服务运行,您确实需要自己处理其中的一些问题。 FastMCP 存储库中有一个示例说明如何执行此操作。
函数体相当无趣;它验证是否正在接收 URL、设置适当的标头、调用 Jina 端点并返回文本。
# demo.py from fastmcp import FastMCP mcp = FastMCP("Demo ?") @<span>mcp.tool()</span> def add(a: int, b: int) -> int: """Add two numbers""" return a + b
fastmcp install demo.py
就是这样...
uv init mcp-jinaai-reader --python 3.11
运行上述命令将启动 mcp 检查器,它是 sdk 提供的一个工具,用于测试和调试服务器响应。 --with-editable 标志允许您对服务器进行更改,而无需重新启动检查器(强烈推荐)
你应该看到:
cd mcp-jinaai-reader uv venv
默认情况下,检查器在端口 5173 上运行,而服务器(您刚刚编写的代码)将在端口 3000 上运行,您可以通过在调用前设置 SERVER_PORT 和 CLIENT_PORT 来更改此设置。
source .venv/bin/activate
如果一切顺利你应该看到类似下面的内容,在左侧你可以添加你需要的环境变量,这里 JINAAI_API_KEY 是唯一的。
如果您单击顶部菜单栏上的“工具”,然后单击“列出工具”,您应该列出我们创建的工具,请注意文档字符串作为该工具的描述。
单击特定工具将弹出文本框,供您输入调用该工具所需的参数。
当您对一切按预期工作感到满意后,您现在就可以在 Claude 桌面应用程序客户端上安装服务器了。
uv add fastmcp
会这样做,我相信将来它会支持其他客户端,但现在,这就是你需要做的。 -f .env 会将环境变量传递给应用程序客户端。
这在幕后的作用是更新 claude_desktop_config.json 并提供运行服务器所需的命令和参数。默认情况下,这使用 uv ,它必须在您的 PATH 上可用。
如果您现在打开 Claude 桌面应用程序,然后转到菜单栏并单击 Claude >设置,然后单击开发人员,您应该会看到初始化服务器时设置的工具的名称。
点击它应该会显示它的配置。您不仅可以了解它是如何执行的,而且在“高级选项”中您将看到已设置的环境变量。
你也可以直接编辑这个配置,但我不一定在这里推荐它。
如果一切顺利,当您进入桌面应用程序时,您应该不会看到任何错误(如果出现错误,则转到“设置”应该会为您提供一个按钮来检查日志并从那里进行调查)。
此外,您应该会看到一个锤子符号,其中包含您可以使用的单个工具的数量(注意:除非您安装了其他 MCP 服务器,否则您的工具可能应该是两个)
您不像平常那样直接调用该工具,而是与应用程序聊天,当它遇到推断该工具有帮助的情况时,它会询问您是否要使用它。这里不需要额外的代码或配置。
我认为它依赖于工具名称和描述来决定它是否合适,因此值得为该工具的功能制作一个清晰简单的描述。
您将收到如下提示:
你可以与它“聊天”,不可否认,编写的工具有时会遇到问题。有时它会决定无法访问互联网,有时无法检索结果,但有时您会得到以下结果:
这有一种自然的流程,它读取页面,提供摘要,然后你要求它转到一篇特定的文章并阅读该文章。
希望这能让您对 MCP 服务器有一些了解。有很多内容可供阅读和观看,但我推荐的另一个网站是 glama.ai,他们保留了一份相当全面的可用 MCP 服务器列表供下载和试用,其中包括比我们的玩具示例更可靠的其他网络搜索工具。看看吧,感谢您的关注。
以上是在 Python 中使用 Jina.ai 和 FastMCP 构建模型上下文协议服务器的详细内容。更多信息请关注PHP中文网其他相关文章!