# 使用MCP服务扩展模型功能

## 概述

[MCP](https://modelcontextprotocol.io/introduction)(模型上下文协议，Model Context Protocol)是一套用于 AI 模型的接口协议，使得模型不仅能处理文本，还能连接数据库、本地文件、API等。

![](https://img.papergate.top:5000/i/2025/07/6866b0c2bbbd2.webp)

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

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

- [官方列表](https://github.com/modelcontextprotocol/servers) 
- [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)
- [mcp.so](https://mcp.so)
- [MCP Market](https://mcpmarket.cn)
- [smithery.ai](https://smithery.ai)

关于 MCP 的介绍，可以查看下面的这些视频进行学习：
- [基础篇](https://www.bilibili.com/video/BV1uronYREWR)
- [进阶篇](https://www.bilibili.com/video/BV1Y854zmEg9)
- [番外篇](https://www.bilibili.com/video/BV1v9V5zSEHA)

视频中有这样一副图：

![](https://img.papergate.top:5000/i/2025/07/6868fd516c61a.webp)

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

![](https://img.papergate.top:5000/i/2025/07/6868ffa33d34d.webp)

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

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

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

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

## 安装部署

### 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://github.com/modelcontextprotocol/servers/tree/main/src/filesystem)获取，安装方式如下：

```json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/「PATH」"
      ]
    }
  }
}
```

将信息填入凭证：

![](https://img.papergate.top:5000/i/2025/07/686908956f02e.webp)

![](https://img.papergate.top:5000/i/2025/07/686908c41bc7f.webp)

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

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

### 聚合器 MetaMCP

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

```text
┌─────────┐     ┌─────────┐     ┌─────────┐
│ Client  │────▶│ MetaMCP │────▶│MCP      │
│         │     │         │     │Server 1 │
└─────────┘     └─────────┘     └─────────┘
                     │
                     │          ┌─────────┐
                     └─────────▶│MCP      │
                                │Server 2 │
                                └─────────┘
```

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

通过 Docker 容器进行部署，可以访问[Github](https://github.com/metatool-ai/metamcp)，参考其`docker-compose.yml`进行部署：

```dockerfile
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
```

>[!info]  信息
>这里的`APP_URL`和`NEXT_PUBLIC_APP_URL`因为要提供 URL 给容器外的应用调用，所以填容器外的访问地址。
> 
> 

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

部署完成之后进入管理页面，依次设置`MCP Server`、`Namespace`和`Endpoints`，并且生成一条`API Key`，如下：

![](https://img.papergate.top:5000/i/2025/07/686910e54213e.webp)

返回`n8n`进行如下修改：

![](https://img.papergate.top:5000/i/2025/07/686910052711f.webp)

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

---

> 作者: Aphros  
> URL: https://blog.papergate.top/posts/%E4%BD%BF%E7%94%A8mcp%E6%9C%8D%E5%8A%A1%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9E%8B%E5%8A%9F%E8%83%BD/  

