使用MCP服务扩展模型功能

第 1 节 概述

MCP(模型上下文协议,Model Context Protocol)是一套用于 AI 模型的接口协议,使得模型不仅能处理文本,还能连接数据库、本地文件、API等。

https://img.papergate.top:5000/i/2025/07/6866b0c2bbbd2.webp

MCP 服务器 :是一个轻量级程序,提供特定 MCP 服务。它能够安全访问本地数据源和远程服务,进行一定的程序处理,并通过标准化的模型上下文协议公开,供 MCP 客户端进行访问。

官方和社区开发了许多 MCP Server,如下网址列举出了一些 MCP Server:

关于 MCP 的介绍,可以查看下面的这些视频进行学习:

视频中有这样一副图:

https://img.papergate.top:5000/i/2025/07/6868fd516c61a.webp

当 MCP 服务器启动以后,会和客户端进行一次握手,然后 MCP 服务器会告诉客户端自己能够提供哪些工具(Tools)以及这些工具的作用,如下:

https://img.papergate.top:5000/i/2025/07/6868ffa33d34d.webp

信息

因为 MCP 服务器告诉了客户端自己可以执行的函数、函数的作用以及需要传入的参数,并且现在的大模型一般都有函数调用(Function Calling)能力,所以大模型结合这些信息可以自行决定调用函数的时机和顺序。

信息

MCP 服务其实就是一段普通的程序,不仅是大模型可以调用,其他的符合其调用方式的函数也可以对其进行调用,它与其他函数最大的不同在于提供了list_tools这一方法,使得大模型也可以理解如何调用它。

MCP 服务器有两种主要的通信协议:

  • 本地通信:通过 stdio 传输数据,适用于在同一台机器上运行的客户端和服务器之间的通信。
  • 远程通信:利用 SSE(服务器发送事件,Server-Sent Events)与 HTTP 结合,实现跨网络的实时数据传输,适用于需要访问远程资源或分布式部署的场景。

第 2 节 安装部署

2.1 n8n 上安装 MCP 插件

从上一节中可以知道,MCP 服务器使用前是需要启动,并且和客户端进行握手的,可以本地通信也可以远程通信。

n8n上默认的 MCP 工具只能接在 AI 上来使用,为了获得更多的灵活性,需要安装一个插件n8n-nodes-mcp,在社区节点里面安装一下即可。

https://img.papergate.top:5000/i/2025/07/6869057cac15d.webp

安装完成后就可以使用 stdio 协议的服务器了,比如我们使用@modelcontextprotocol/server-filesystem这款服务器来读取本地文件信息,可以通过Github获取,安装方式如下:

将信息填入凭证:

https://img.papergate.top:5000/i/2025/07/686908956f02e.webp

https://img.papergate.top:5000/i/2025/07/686908c41bc7f.webp

警告

不知道是不是为了解决资源占用问题,n8n 的这个插件以stdio方式运行时,每次执行前会创建 MCP 服务器并进行握手,执行结束后会释放这个服务器资源,所以会导致每次执行前都会有较长时间的加载。

为了解决这个问题,我们需要部署下一个软件。

2.2 聚合器 MetaMCP

聚合器是一类 MCP 服务器,这类服务器对其他的 MCP 服务进行代理,于是可以通过单个 MCP服务器访问多个应用程序和工具,方便对多个 MCP 服务器进行集中管理。

1
2
3
4
5
6
7
8
9
┌─────────┐     ┌─────────┐     ┌─────────┐
│ Client  │────▶│ MetaMCP │────▶│MCP      │
│         │     │         │     │Server 1 │
└─────────┘     └─────────┘     └─────────┘
                     │          ┌─────────┐
                     └─────────▶│MCP      │
                                │Server 2 │
                                └─────────┘

因为这个 MCP 服务器是单独部署的,里面包含的子 MCP 服务器也是一直启动的,每次调用前无需启动,因而速度更快。

通过 Docker 容器进行部署,可以访问Github,参考其docker-compose.yml进行部署:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
docker run -itd --name MetaMCP --restart always \
-u root \
-e POSTGRES_HOST=「HOST」 \
-e POSTGRES_PORT=「PORT」 \
-e POSTGRES_USER=「USER」 \
-e POSTGRES_PASSWORD=「PASSWORD」 \
-e POSTGRES_DB=metamcp \
-e DATABASE_URL=postgresql://「USER」:「PASSWORD」@「HOST」:「PORT」/metamcp \
-e BETTER_AUTH_SECRET=「SECRET」 \
-e APP_URL=http://「HOST2」:「PORT2」 \
-e NEXT_PUBLIC_APP_URL=「HOST2」:「PORT2」 \
-p 「PORT2」:12008 \
-v /「DATA」:/「DATA」 \
ghcr.io/metatool-ai/metamcp:latest
信息

这里的APP_URLNEXT_PUBLIC_APP_URL因为要提供 URL 给容器外的应用调用,所以填容器外的访问地址。

信息

这里使用root身份访问容器是因为默认容器不是以root身份运行的,而我希望在里面部署@modelcontextprotocol/server-filesystem进行文件的访问,文件在容器外也会使用到,无法随意修改读写权限和所有者信息,不使用root身份的话会有权限问题。

部署完成之后进入管理页面,依次设置MCP ServerNamespaceEndpoints,并且生成一条API Key,如下:

https://img.papergate.top:5000/i/2025/07/686910e54213e.webp

返回n8n进行如下修改:

https://img.papergate.top:5000/i/2025/07/686910052711f.webp

可以看到访问速度比之前会快上许多。