Gresces

基于n8n的MCP实用构建

Guo Yangfan

本文提供:

  • 在n8n中构建一个agent工作流
  • 在n8n中添加自定义mcp client
  • 使用python构建mcp server并在n8n工作流中连接

0. 背景

本文读者一般对MCP有一定了解,这里不进行解释。如果你需要知道背景知识,请看:

LastWhisper:MCP (Model Context Protocol),一篇就够了。

本文使用n8n构建一个完整的agent工作流,需要你在本机或服务器上部署一个n8n实例,当然如果你使用其他flow工具,可以参考本文章的mcp server构建部分。本文不提供n8n部署相关知识。

注意,最好使用高于1.88版本的n8n,否则使用deepseek作为LLM时可能会有422报错

GeGarron:n8n 全方位安装指南:从本地部署到云端运行

1. 在n8n中构建一个agent工作流

1.1 创建一个工作流

在n8n中通常是以工作流为单位进行工作的,在本例中,一个完整的聊天agent即为一个工作流。 在overview界面点击右上角的Create Workflow创建一个工作流。 在n8n中,一个工作流的开始一般是一个触发器,点击中间的 + 图标,有很多触发器可供选择,这里选择On chat message触发器即可,这个触发器在聊天框输入语句进行触发。

选择这个trigger

1.2 创建agent

在创建完一个最基础的工作流之后,需要丰富这个工作流的内容,特别是加入LLM进行工具调用指导。

点击第一个trigger节点的加号,创建第二个节点,输入agent,选择AI Agent,之后点击左上角退回画布,可以发现多了一个Agent节点。

选择AI Agent

可以发现,在Agent节点中,我们可以自定义的子节点(这玩意儿在n8n中叫sub-node)有:Chat Model、Memory和Tool。这几个子节点分别表示:

  • Chat Model 接入的大语言模型,输入用户输入后输出工具调用信息,输入工具返回信息输出加工后的信息
  • Memory 记录对话内容,提供上下文功能
  • Tool 工具,agent"调用"的过程(mcp client、n8n节点或者n8n工作流)

AI Agent节点的接口

下面我们将逐项配置这三项:

Chat Model

起手式点击 + 号,可以看到n8n提供了一系列的聊天模型节点供使用,比如DeepSeek和OpenAI。由于DeepSeek提供的API和OpenAI的API形式上相同,所以如果你选择DeepSeek模型,这两种节点都可以使用,本例使用OpenAI节点接入DeepSeek API。

国内使用"SuckDick"模型非常方便,在DeepSeek开放平台注册后获取一个API key即可。

双击加入的OpenAI节点,在Credential下拉菜单中选择创建新的凭证,填入获取到的API key,并按照DeepSeek文档中提示的修改Base URL即可。

点就完了

![](image-4.png “只需要修改API Key和Base URL,成功后会有绿色提示"Connection tested successfully”")

添加凭证后,在Open AI节点中可以选择聊天模型,选择deepseek-chat就OK,你也可以试试另一个是什么效果。

至此,一个最简单的没什么精用的Agent就整好了,你可以在聊天栏中愉快地和记忆为0的大模型聊天了。

一个聪明的大模型被玩坏了的样子

Memory

很显然,如果你用过deepseek官网“受过良好调教”的大模型的话,你的agent就像一个没有记忆的大傻子。

我们可以通过添加记忆模块为大模型添加上下文功能,这就是第二个子节点Memory的作用。

这里点击Memory相应的 + 号,选择Simple Memory节点即可,这个节点配置最简单,不需要额外的组件,而且效果还行,在配置中,你可以设置上下文长度。推荐玩一下,如果你很急,保持默认的5就行。

你也可以试一下没有Memory功能的Agent。

Tool

Tool用来实际执行一些准确性要求高、运算密集或者时效性强的操作。它被Agent节点由LLM指导调用。

Tool可以添加很多个,这里先添加一个简单的http请求节点试试水,想实现的最简单的从当前互联网获取信息的操作。思路是这样的,这个Tool可以通过必应搜索获取某个关键词的搜索结果,之后返回页面信息。LLM接收返回的页面信息,告诉我们页面上的内容有什么。

n8n中有个http请求节点,可以发送GET、POST等请求并获取返回数据(response data),可以使用这个东西来发送构造好的URL以及Query参数,并获取页面html。

思路成立,实验开始:在Tool子节点处添加HTTP Request Tool节点,并填入下面图片中的参数。

添加这个节点

参数可以照抄,可以点击Docs研究一下节点的花活儿

之后在聊天中发出请求,可以发现LLM被调用了两次,工具HTTP Request节点被调用了一次,而左侧的聊天框中实际上只显示了一次对话。

AI大人不要杀我🙌🙌🙌

数据是错误的

如果你尝试的次数很多,你会发现token消耗得挺快,效果还不好。这是因为HTTP Request返回的是一个HTML网页,很多没用的信息会输入给LLM。所以如果你需要一个高质量的Agent,一些数据处理是有必要的。

至此,一个勉强能用的Agent堂堂面世。回顾一下,我们首先添加了Agent节点,构成了Agent的骨架,之后添加了它的大脑让它产生思维,为了让它有记忆,又加入了Memory,最后让它有力量,添加了一个工具。

这个Agent长这样

2. 在n8n中添加自定义mcp client

Agent的智能来源于大语言模型,能力来源于提供的工具。通常为了完成一些特定的工作,需要自行编写工具。

自己编写的工具可以通过mcp协议作为mcp server提供,在n8n中通过mcp client连接它。

图源:https://modelcontextprotocol.io/introduction#general-architecture

上面的这个图估计都被复制烂了,但是很重要。client和server是两部分,server如何与数据资源交互与client无关,而且client和server可以不在一个设备上。

添加mcp client节点

n8n在1.88版本添加了官方的mcp client节点,在Agent节点的Tool子节点处点击加号(你可以把之前的HTTP请求节点删除掉),选择MCP Client Tool节点即可。

添加就完了

之后你可以点击这个节点的设置,可以发现三个选项,对于一个MCP Client来说,第一个SSE Endpoint是必填的,后面的取决于需求,SSE Endpoint告诉了MCP Client MCP Server在哪里。

将它们比作小人是这样的:

Agent是一个小组,LLM是指挥,它收到外部请求(人类的输入)后,思考了一阵得出了需要Client干活儿的结论,于是它说:“Client,你去做xxx”。Client收到消息后,将指挥提供的信息传给Server,之后等待Server的结果,有结果后把结果告诉指挥LLM。

这样看起来挺好的,但是LLM事先并不知道Client能干什么活儿,也不知到Client需要什么消息。这就需要MCP协议了,Server会告诉Client它能做什么工作,之后Client将这样的信息告诉LLM,已完成消息的传递。第3节将更清晰地看到这个过程。

这一节几乎没什么实质性地内容,但似乎是必不可少的。

3. 使用python构建mcp server并在n8n工作流中连接

根据前一节,我们要开发自己的特有Tool,关键在于给MCP Client提供MCP server。本节将通过Python实现。

MCP提供了很多个语言的SDK,这里选择Python,别问我为啥,我也不知道为啥啊!!!

3.1 环境配置

用uv管理环境就OK,主要用到的是mcp包

uv add mcp

3.2 开发简单的Server

之后写个这样的简单server脚本:

# server.py
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("test")
mcp.settings.port = 9000
mcp.settings.host = "0.0.0.0"

async def calculate(expression: str) -> float:
    """计算一个数学表达式
    Args:
        expression: 要计算的数学表达式

    Returns:
        float: 计算结果
    """
    try:
        return eval(expression)
    except Exception as e:
        return f"计算错误 {str(e)}"

mcp.add_tool(calculate, "Calculator", "Calculate an expression")

if __name__ == "__main__":
   mcp.run("sse")

大概是这样的:

  1. 导包起手式
  2. 定义一个mcp server并设置IP和端口
  3. 定义一个函数用于计算表达式,这个函数是脱裤子放屁:接收表达式,并传给eval函数,返回结果
  4. 在mcp中添加这个函数作为tool
  5. 使用sse方式运行mcp server

看起来挺简单的,对吧?大概要注意这么几点:

  1. 函数的名字要简明,行内的注释要尽量有
  2. 可以使用装饰器添加这个函数,效果和add_tool方法是一样的
  3. 这里的运行方式是sse,是因为n8n中的Client节点只认这个

3.3 测试一下

想要看看这个server在client眼里长什么样子,可以在vscode中加一个这个拓展,可以非常方便地测试自己的Server,你也可以使用Claude Desktop等其他Client。

vscode 拓展

首先将MCP Server运行起来

uv run server.py

在MCP Inspector窗口中填入Server URL即可点击Connect尝试连接。

连接成功,下面是Server运行log,上面是连接成功界面

可以看到可用的工具有之前定义的计算器,点击RUN,即可输入表达式:

计算2的10次方

至此,一个简单的server就创建并部署好了。

3.4 使用n8n中的Client连接它

最终目的是要将这个Server提供给n8n,所以需要在n8n的MCP Client节点上连接这个MCP Server,方法非常简单:在Client节点的SSE Endpoint一栏中填入Server URL(本例为http://0.0.0.0:9000/sse,实际地址和端口需要按需填写)即可。

退出编辑界面,Ctrl + S保存工作流,点击AI Agent的运行按钮,如果可以正常连接的话,不会产生提示,否则会有报错信息。报错大概率是网络连接问题。

点击运行进行测试

连接错误,可以排查连接问题

3.5 使用这个Server

本节使用python编写了MCP server 并使用n8n中的MCP Client节点连接,如果你有更加复杂的节点需求,只需要更改Server中的工具即可。


  1. Get started with the Model Context Protocol (MCP)
  2. n8n Docs