MCP是一种协议,它标准化的客户端应用如何通过云桌面或任何你编写的程序发现和使用在服务器上定义的工具提示和资源。在某种程度上它标准化了,你如何自动为你的人工智能模型提供上下文?我无法告诉你它是否会成为构建智能体或向人工智能模型开放功能的主流协议,但这确实是一项很酷的技术,值得一试。首先是看是否适合你的工作流程。
今天我将为大家简要介绍一下MCP,我们将通过构建一个简单的SQL智能体来实现这些知识。它将在你的终端以聊天形式运行,并通过MCP库端连接到MCP服务器,从而访问一个可以访问SQLite数据库的工具。
之后你将能够与智能体进行聊天,要求它创建表格,执行复杂查询或插入记录。根据官方网站,MCP是一个开源协议。标准化的应用如何为大型语言模型提供上下文?把MCP想象成人工智能应用的USB接口,就像USB为你的设备与各种外设和配件提供了一种标准化的连接方式。MCP则为人工智能模型与不同的数据源和工具提供了标准化的连接方式。那么让我们通过查看这个图示,把它变得更加具体一些,这是其在宏观层面上的工作原理。你有一个客户端,它可以是任何应用程序、云服务,如windsurf或vs code的光标,或者你编写的工具或程序。现在你有一个或多个服务器,他们封装了你与数据源或其他API的交互方式。
你有服务器A/B/C,他们封装了你如何使用数据源,并提供的对互联网远程服务的访问。现在通过MCP协议,客户端将自动发现在MCP服务器上定义的所有工具和功能。你的客户端应用将能够自动使用这些工具,而无需为运行这些特定服务,定义任何具体的功能,为了使之更加具体,如果你习惯于使用,比如说FastAPI来构建API,那么定义一个MCP服务器就像是使用open api规范来定义一个API。所以当你在fastapi中定义路由时,使用pydantic来定义输入输出,并生成一个描述你服务器所有功能的openapi.json文件。在MCP中,你也可以使用装饰器做到这一点,直接进入代码。给你展示一个非常简单的例子,你可以使用fast m c p 应用,这类似于fastapi应用,然后你使用MCP工具装饰器来装饰这个函数。
它会自动将这个函数从服务器暴露出来。以便客户端可以发现这个函数在这里,这是一个用于查询数据的简单工具。它接收一个SQL的字符串,执行该字符串并返回结果。在你定义服务器之后,任何客户端都可以连接到你的服务器,发现你所暴露的资源。所以这里是一个典型的例子,非常简单,你导入客户端站和标准输入输出服务器参数。你创建一些服务器参数以定义服务器所在的位置,以及你如何连接到它。然后在创建连接之后,你在这里进行初始化。
接着你可以简单的通过调用section list获取工具列表。如果你想调用某个特定的工具,不需要任何具体的实现,只需调用section.code的call_tool方法,传入工具的名称和参数。如果你还记得的话,就是查询数据工具。所以它接受一个SQL的字符串。所以在这里我们传入一个选择所有用户的SQL语句。结果将返回这个查询的输出。最后在我们深入实现我们的智能体之前,我将迅速向你展示如何在真实事例中使用Entropic通过MCP服务器中定义的工具进行工具调用。首先是调用session.list_tools来获取工具列表,然后对于每个工具,你需要将其格式化为一个特定的字典,包含名称描述和输入模式,以确保与Anthropic兼容。
但你可以对任何模型执行相同的操作。MCP的一大亮点是它与模型无关。现在我们在这里创建一条消息,创建一个用户表。并且我们现在使用Entropic创建一个消息编译。提供消息和工具这一点非常重要。现在你可以接收到两种主要类型的消息,作为来自Anthropic的回应,它将包含文本块或工具使用情况。文本块只是一个简单的回答,但如果模型决定使用工具,那就会是工具使用。
因此我们对接收到的内容进行迭代。如果类型是工具使用,我们在这里提取参数和名称,最后创建一条消息,其中包含工具调用的输出,因此我们使用工具名称和字典调用session.callTool方法,我们将输出作为特定消息及工具结果返回,然后创建最后一个补全。当模型看到工具调用的结果后,它将生成最终的文本消息。因此在这里模型将生成类似于在SQL中创建表的内容返回输出,然后编写一条可以在聊天中显示的人类消息。好的,现在该构建智能体了让我给大家展示一个简短的演示。这样我们就能对我们要构建的内容和功能有一个共同的理解。
所以在这里我可以启动MCP客户端连接到服务器并启动智能体。所以通常情况下,你应该在这里看到一个查询框,你可以开始输入智能体会给出回答。现在我将在一旁创建一个数据库。我将连接到数据库database.db,目前它是空的。所以如果我查看表里面什么都没有,现在我将请我们的智能体创建一个用户表。你能创建一个包含电子邮件和姓名列的用户表吗?如你所见,服务器日志中记录了我们列出工具并进行工具调用的过程。我在服务器端也记录了我们使用的工具及其输入内容。
所以在这里你可以看到他写出了我要求创建的表的SQL流程,然后执行了它。所以现在如果我在这里输入.tables,我们应该能看到创建的表。但现在它是空的。现在我将请求创建十条随机记录,所以在用户表中创建十条随机记录。好的,再一次我们列出了工具,正如你所看到的这是生成的SQL,我们得到了输出列表。为了确保它正常工作,我可以在这里输入select * from users 就能看到创建的用户。现在为了让事情更有趣,我将创建另一个名为objects的表。
它包含对用户的引用,并且有一个用于对象名称的姓名列。我想创建另一个与用户相关联的表。这样我们就可以让人工智能生成一个连接请求,以验证它在处理更复杂寻找的有效性。那么我们来看一下我们有什么,我们有用户和对象。
现在在对向表中插入二到五条记录。针对每个用户。并在这个对象列表中进行选择。我们可以选择桌子、椅子、杯子、手机和叉子。我们有五个,让我们看看它的效果。
正如你所看到的,它首先执行一个SQL查询以获取所有用户的ID。现在我可以说完美,请执行对象的插入。如果我执行一个select * from objects,我们会得到什么?我们会得到所有插入的对象,但现在是时候进行一个更复杂的查询了。
在这里我们可以说请给我每个用户的对象数量。在这里它生成了正确的查询。正如你所看到的,它使用了左连接,这很好连接,在用户表上获取对象并返回技术。在这里你可以看到约翰史密斯有三个对象,艾玛约翰逊有四个对象,以此类推,这真是太酷了。现在我们也可以反过来做一下,纯粹是为了好玩。现在给我每个对象连接的用户数量。现在反过来做,每个对象它连接的用户数量。
所以椅子连接了八个用户,桌子连接了六个,电话连接了六个,以此类推,演示就到这里。现在你可以看到我们这里有一个智能体。它能够生成sql请求,并在m四服务器上执行这些请求,以执行语句并获取输出。你。good是我们的客户端并不知道sql表的存在,它并不需要能够连接到它。MCP服务器知道如何与其进行交互。我们的客户端只需具备调用函数的能力,而ms服务器则负责正确执行该函数。
现在是时候深入代码了,我们首先检查一下mcp服务器。这和我们之前做的非常相似。之前我们看过的内容。我们有SQL导入日志记录集合fastapi,它与fastapi一类似,这就是我们创建应用程序或者说MCP服务器的方式。现在真的很简单,你可以创建一个函数,使用工具对函数进行装饰。它会自动以工具的形式暴露给客户端供你调用供你调用。那么这里是查询数据。
如你所见,我们记录了客户端发送到服务器的查询。然后我们创建一个数据库连接,执行该连接,最后关闭它。那个那个。在这里我给你展示一个提示的简单示例,这也是你可以向客户端暴露的其他内容。所以这是一个你在服务器上格式化并发送回客户端的提示。如果你有经过特别调整,能够与工具良好配合的特定提示,并且想将它们暴露给客户端,那就非常有用那就非常有用。我在这个例子中没有使用它,但这里是你如何定义一个提示,并通过MCP服务器将其暴露的方法。
最后在主函数中使用标准输入输出作为传输方式运行MCP服务器,这样就能在同一台计算机上工作,客户端将能够使用这种传输方式连接到服务器。现在我们来看一下客户端代码,在这里我们创建一个商客户端。并定义我们的服务器参数。嗯。看到现在半个。在这里我们指定如何连接到服务器。在这里我们有命令派同以及参数,也就是服务器的地址。
这里的势力是本地的,但请记住,服务器可以通过互联网进行暴露。然后我们创建一个聊天类。这样,他将成为处理聊天和聊天交互的主要类。因此,我们在聊天中有消息列表和系统提示。所以你是一个SQL里的大师助手。你的工作是利用你手中的工具执行SQL查询,并将结果提供给用户。现在如果我们到那里,就有主函数来执行。
运行将初始化与MCP服务器的连接,然后通过提供会话开始聊天循环。所以你先。聊天循环只是一个循环不断处理用户查询,并利用绘画检索工具和执行函数调用。如你所见,这里有一个无限循环。我们将查询作为输入,然后将用户的消息添加到列表中,并调用处理查询的函数。所以处理查询的地方就是魔法发生的地方。和之前一样,我们获取所有可用的工具,并将它们格式化为商格式,然后我们生成第一条消息。
因此,结合消息列表和可用的工具。现在在这里对于n o p第一条响应的内容,如果它是一个文本块,我们只需将消息附加到入手块中。如果是工具使用,我们提取名称和输入,然后进行函数调用。然后,我们将函数调用的结果添加到消息列表中,并生成最终消息。最后我们打印最终消息的文本,以便向用户展示由a d格式化的最终输出。假设以聊天格式呈现。就是这样,所以这个函数只是创建一个聊天实例。
今天我们了解了什么是MCP,以及为什么大家对此如此兴奋。我们还看到如何通过构建一个简单的人工智能sq热智能体来使用它。