MCP连接器-PrivateGPT服务器
一种服务器实现,允许 MCP 客户端与 privateGPT 之间进行安全通信,使用户能够使用知识库与 privateGPT 聊天,并通过标准化的模型上下文协议(Model Context Protocol)管理来源、分组和用户。
服务介绍

目录
- privateGPT MCP Server
- What is MCP?
- Interaction Between Agents, LLMs, and MCP Servers
- Advantages of Using Agents in This Context
- Overview
- Security Features Overview
- 1. Transport Layer Security (TLS)
- 2. Password Encryption
- 3. Key Management
- 4. Decryption on the Server
- 5. Authorization Tokens
- 6. Restriction of Key Generation (Keygen)
- 7. Certificate-Based Access Control (CBAC)
- 8. Secure Configuration
- 9. Logging and Monitoring
- Summary
- Encrypted Password Generation Tool
- Encrypted Password Decryption Tool
- Feature Overview for privateGPT Server
- Installation
- Configuration Description
- Proxy Configuration
- Server Configuration
- Restrictions
- Logging
- Feature Activation/Deactivation
- ENABLE_LOGIN
- ENABLE_LOGOUT
- ENABLE_CHAT
- ENABLE_CONTINUE_CHAT
- ENABLE_GET_CHAT_INFO
- ENABLE_DELETE_ALL_CHATS
- ENABLE_DELETE_CHAT
- ENABLE_LIST_GROUPS
- ENABLE_STORE_GROUP
- ENABLE_DELETE_GROUP
- ENABLE_CREATE_SOURCE
- ENABLE_EDIT_SOURCE
- ENABLE_DELETE_SOURCE
- ENABLE_GET_SOURCE
- ENABLE_LIST_SOURCES
- ENABLE_STORE_USER
- ENABLE_EDIT_USER
- ENABLE_DELETE_USER
- ENABLE_REACTIVATE_USER
- Usage
- Project Structure
- License
privateGPT MCP 服务器
这是一个 Model Context Protocol (MCP) 服务器实现,允许你将 privateGPT 作为你首选的 MCP 客户端的代理使用。这使得 privateGPT 的强大功能能够与任何兼容 MCP 的应用程序无缝集成。
什么是 MCP?
MCP 是一个开放协议,它标准化了应用程序如何向 LLM 提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。就像 USB-C 提供了一种标准化的方式来连接你的设备到各种外围设备和配件一样,MCP 提供了一种标准化的方式将 AI 模型连接到不同的数据源和工具。
为什么选择 MCP?
MCP 帮助你在 LLM 上构建代理和复杂的工作流。LLM 经常需要与数据和工具集成,而 MCP 提供了:
- 一个不断增长的预构建集成列表,你的 LLM 可以直接接入
- 在不同 LLM 提供商和供应商之间切换的灵活性
- 在你的基础设施中保护数据的最佳实践
工作原理
在核心上,MCP 遵循客户端-服务器架构,其中主机应用程序可以连接到多个服务器:

- MCP 主机:希望通过 MCP 访问数据的应用程序、Claude Desktop、IDE 或 AI 工具
- MCP 客户端:与服务器保持 1:1 连接的协议客户端
- MCP 服务器:轻量级程序,每个都通过标准化的 Model Context Protocol 暴露特定功能
- 本地数据源:MCP 服务器可以安全访问的你的计算机文件、数据库和服务
- 远程服务:可以通过互联网(例如,通过 API)访问的外部系统,MCP 服务器可以连接到这些系统
概述
此服务器提供了 MCP 客户端和 privateGPT API 之间的桥梁,允许你:
- 使用公共和私有知识库与 privateGPT 聊天
- 创建和管理知识来源
- 将来源组织成组
- 通过基于组的权限控制访问
为什么需要代理
在 LLMs(大型语言模型)和 MCP 服务器 中,代理是一个专门的软件组件,充当语言模型和应用程序之间的中介。它处理诸如请求处理、通过 MCP 与 LLM 交互、管理工作流、确保整个系统的安全性和效率等任务。通过利用代理,可以设计出高效、安全且可扩展的基于 AI 的复杂应用程序。
此仓库中的代理代码可用于将其实施到自己的解决方案/应用程序中。
代理、LLMs 和 MCP 服务器之间的交互
这些组件的交互使开发强大、可扩展和安全的 AI 应用成为可能。以下是一个简化的场景,说明了这种交互:
graph TD;
A[应用] -->|请求| B(代理)
B -->|调用| C{MCP 服务器}
C -->|访问| D[本地数据源]
C -->|访问| E[远程服务]
C -->|响应| B
B -->|响应| A
在这个简化的情景中,应用程序通过代理发送请求,代理再通过 MCP 服务器与 LLM 或数据源进行交互,最后将结果返回给应用程序。
- 用户输入: 用户通过托管在MCP服务器上的用户界面发送请求。
- 代理处理: MCP服务器上的代理接收请求,验证它,并为LLM准备请求。
- LLM交互: 代理将请求转发给LLM,LLM生成响应。
- 响应处理: 代理从LLM接收响应,如果需要进一步处理(例如格式化、与其他数据源集成),然后将其发送回用户。
- 安全性和日志记录: 在此过程中,代理监控交互,确保遵守安全策略,并记录相关信息以供后续分析。
在此上下文中使用代理的优势
- 模块化: 代理允许职责的明确分离,使系统更易于维护和扩展。
- 安全性: 集中管理访问和监控活动有助于最小化安全风险。
- 效率: 自动化代理可以比手动流程更快、更一致地执行任务。
- 灵活性: 代理可以轻松适应或扩展以支持新功能或业务需求的变化。
加密密码的重要性
在任何处理敏感数据的应用程序中,安全性是至关重要的。该服务器管理两组关键凭据:
- 代理头: 例如,HAProxy用于身份验证和管理流量。
- LLM访问密码: 用于保护对大型语言模型的访问。
以明文形式存储这些密码存在重大安全风险,包括未经授权的访问和潜在的数据泄露。
为了缓解这些风险,必须加密这些密码,并且仅在系统内处理其密文。
仅使用密文的好处
- 增强的安全性: 即使攻击者获得了配置文件或环境变量的访问权限,没有相应的解密密钥,加密的密码仍然不可读。
- 合规性: 加密有助于遵守要求保护敏感信息的安全标准和法规。
- 完整性: 确保密码不会被篡改,保持认证机制的完整性。
安全
以下安全特性已实现,以确保数据保护和客户端应用程序与服务器之间的安全通信。这些特性涵盖加密、解密、密钥管理和传输安全。
1. 传输层安全 (TLS)
- 为了确保客户端和服务器之间的通信安全,可以激活TLS。所有在客户端和服务器之间传输的数据都使用TLS(最低版本1.2)进行加密。
为什么应该在客户端和服务器之间启用TLS?
a. 通信加密
- TLS(传输层安全协议)确保客户端和服务器之间传输的所有数据都是加密的。这可以保护诸如密码、信用卡详细信息和个人数据等敏感信息免受窃听攻击(中间人攻击)。
b. 数据完整性
- TLS 保证传输的数据保持不变且未被篡改。完整性检查确保接收到的数据与发送时完全一致。
c. 身份验证
- TLS 通过数字证书实现服务器(以及可选的客户端)的安全身份验证。这可以防止用户成为假冒网站的钓鱼攻击的受害者。
d. 防止中间人攻击
- TLS 对连接进行加密,使得攻击者几乎不可能拦截或操纵流量。如果没有 TLS,攻击者可以捕获并修改数据包。
e. 符合安全标准和法规
- 许多监管要求(例如 GDPR、PCI-DSS)强制要求安全的数据传输。TLS 是这些安全要求的基本组成部分。
f. 防止降级攻击和重放攻击
- TLS 可以防止攻击者试图将连接降级到不安全版本(降级攻击)或重放之前有效的请求(重放攻击)。
结论
在客户端和服务器之间启用 TLS 是确保数据隐私、安全性和通信完整性的关键。它不仅保护敏感信息,还有助于满足合规性要求并增加用户的信任。
2. 密码加密
可以使用 RSA(Rivest–Shamir–Adleman)公钥加密来加密密码。这样可以确保像用户密码这样的敏感数据永远不会以明文形式传输。
方法
- 公钥加密,密钥长度为 2048 位。
- 填充:
RSA_PKCS1_PADDING以增强安全性并防止已知的填充攻击。
过程
- 服务器管理员使用服务器的公钥 (
id_rsa_public.pem) 通过执行node security/generate_encrypted_password.js ~/.ssh/id_rsa_public.pem来加密客户端的密码,并将加密后的密码交给客户端。 - 或者:客户端使用服务器的公钥 (
id_rsa_public.pem) 通过keygen函数来加密密码。因此需要在服务器的配置文件 (privateGPT.env.json) 中启用该函数。重要提示:使用此功能也意味着通过网络传输数据。因此,请确保数据流量是安全的并且不能被截获。 - 最后,将加密后的密码发送到服务器,在服务器上使用私钥进行解密。
优点
- 非对称加密 确保只有服务器才能解密密码。
- 即使通信信道被破坏,加密数据仍然保持安全。
3. 密钥管理
为了确保数据通信和加密过程的安全,遵循以下密钥管理原则:
公钥
- 安全地存储在服务器上 (
id_rsa.pub)。 - 仅用于加密,即使泄露也不会构成安全风险。
PEM 密钥
- 安全地存储在服务器上 (
id_rsa_public.pem)。 - 必须使用公钥证书创建(参见:服务器配置)
私钥
- 安全地存储在服务器上 (
id_rsa)。 - 通过适当的文件权限限制访问 (
chmod 600)。 - 仅用于解密操作。
密钥轮换
- 密钥可以定期轮换或在检测到安全事件时轮换。重要提示:如果这些密钥被重新签发,客户端或AI代理将立即失去对MCP服务器的访问权限,并需要新的RSA密钥(加密密码)!
- 旧密钥被安全地失效。
4. 服务器上的解密
解密仅在服务器上使用私钥进行:
流程
- 服务器从客户端接收加密后的密码。
- 使用私钥解密密码以获取原始明文。
- 解密后的密码仅在内部使用(例如,认证),且永远不会以明文形式存储。
安全处理
- 解密后的密码仅在处理过程中存在于内存中。
- 通过安全的内存管理实践确保敏感数据在使用后立即清除。
证书验证
- 双方都验证证书以确保服务器和客户端的真实性。
- 可选地,可以启用双向TLS以增强安全性。
5. 授权令牌
令牌用于验证请求并确保只有授权用户才能访问系统:
令牌管理
- 成功登录后生成令牌。
- 令牌有效期短,在预定义时间后自动过期。
- 令牌使用HMAC或RSA签名,使其防篡改。
6. 限制密钥生成 (Keygen)
为防止系统被滥用,密钥生成 (keygen) 被限制:
配置
- 服务器有一个配置选项 (
ALLOW_KEYGEN) 来启用或禁用密钥生成。 - 当禁用时尝试调用keygen函数会导致错误消息。
审计日志
- 所有keygen操作都被记录下来用于审计和监控目的。
7. 基于证书的访问控制 (CBAC)
- 当激活证书认证并且代理使用密钥登录到服务器时,它会自动锁定到该服务器。如果试图登录另一个MCP privateGPT服务器,此登录尝试将被拒绝,因为密钥会与服务器的私有证书进行核对。
功能
- 诸如
keygen、store_user和edit_source等功能仅限授权角色访问。 - 未经授权的访问尝试将被拒绝,并附带详细的错误消息。
配置
- 可以在服务器的配置中指定启用或禁用的功能(
Functions对象)。
8. 安全配置
服务器配置包含几个与安全相关的选项:
SSL_VALIDATE
- 验证 SSL/TLS 证书以确保安全通信。
- 可以根据环境要求(例如测试与生产)启用或禁用。
PW_ENCRYPTION
- 启用或禁用密码加密。
- 确保在无法进行加密的环境中保持兼容性。
9. 日志记录和监控
所有与安全相关的事件都会被记录下来,以便于监控和故障排除:
记录的事件
- 登录失败尝试。
- 密钥生成请求。
- 未授权访问尝试。
- 加密和解密错误。
摘要
已实现的安全功能确保了:
- 通过加密和安全传输保护敏感数据的 机密性。
- 使用强大的密钥管理和令牌验证来保证操作的 完整性。
- 基于角色和可配置的访问控制 来管理系统功能。
- 全面的监控 以主动检测和响应安全威胁。
这些措施共同为客户端-服务器通信和数据处理提供了一个安全的环境。
privateGPT 服务器功能概述
privateGPT 服务器提供了一组强大而高效、灵活且安全的功能,旨在通过模型上下文协议 (MCP) 实现高效的通信。以下是服务器中可用的关键特性和功能的概述。
关键特性
1. 认证和授权
- 登录功能:通过电子邮件和密码对用户进行身份验证,生成访问令牌。
- 注销功能:安全地使用户令牌失效以结束会话。
2. 聊天管理
- 开始聊天:与服务器发起对话,可以选择使用公共知识库或特定群组上下文。
- 继续聊天:通过提供聊天 ID 和后续消息恢复正在进行的对话。
- 检索聊天信息:通过聊天 ID 获取特定聊天的元数据和消息。
- 删除所有聊天:删除执行用户的先前聊天历史记录(聊天历史)。
- 删除聊天:删除执行用户的当前聊天。
3. 群组管理
- 列出群组:查看用户可用的个人和可分配群组。
- 创建群组:为组织目的添加带有名称和描述的新群组。
- 删除群组:移除现有群组(如果在配置中启用)。
4. 源管理
- 创建源:添加带有内容的新源,并将其分配给特定群组。
- 编辑源:使用新内容或元数据更新现有源。
- 删除源:移除不再需要的源。
- 检索源:通过其 ID 获取特定源的信息。
- 列出源:查看分配给特定群组的所有源。
5. 用户管理
- 创建用户: 注册具有可自定义角色、组和设置的新用户。
- 编辑用户: 更新用户信息,包括姓名、电子邮件、密码和角色。
- 删除用户: 从系统中移除用户(如果在配置中启用)。
- 重新激活用户: 重新激活先前被停用的用户。
6. 配置灵活性
- 功能启用/禁用: 通过
.env配置文件启用或禁用单个服务器功能。 - 语言支持: 将服务器的系统消息自定义为您首选的语言(例如,英语或德语)。
- SSL 验证: 为与服务器的安全连接切换 SSL 验证。
7. 错误处理和日志记录
- 详细的错误消息和日志记录:
- 无效请求
- 身份验证失败
- API 通信问题
- 当访问已禁用的功能时,可配置响应。
8. 安全特性
- 基于令牌的身份验证: 确保对服务器功能的安全且受控的访问。
- 受限组访问: 选项限制
assignableGroups的访问以增强隐私。
示例用例
- 客户支持: 使用聊天功能构建智能对话代理。
- 知识管理: 管理并检索带有来源和组的结构化数据。
- 多用户协作: 创建、编辑并将用户分配到组以进行协作工作流。
- 可自定义的功能: 仅激活您的应用程序所需的功能。
如何使用
- 将
privateGPT.env.json.example文件复制到privateGPT.env.json,例如使用cp .\privateGPT.env.json.example .\privateGPT.env.json - 通过编辑
privateGPT.env.json文件来配置服务器。 - 使用提供的脚本启动服务器。
- 通过 API 调用来与服务器交互以利用其功能。
请参阅 API 文档 以获取每个端点的详细使用说明和示例。
PrivateGPT 服务器是一个强大的工具,用于在可自定义环境中管理和结构化通信及数据。根据您的需求定制其功能,以实现最大效率和控制。
安装
- 克隆仓库:
git clone https://github.com/privateGPT-dev/MCP-Server-for-MAS-Developments.git
cd MCP-Server-for-MAS-Developments
现在您需要选择:手动安装还是自动安装。
手动逐步安装
- 安装
npm,例如:
sudo apt install npm
- 安装依赖项
npm install
- 构建项目:
npm run build
或者自动安装
- 使
InstallMPCServer.sh可执行(Linux):
sudo chmod +x InstallMPCServer.sh
- 运行脚本即可完成。注意错误消息并确保一切正常。
./InstallMPCServer.sh
配置说明
代理配置
本节提供了系统中使用的 Proxy_Config 设置的详细解释。
使用代理
如果使用代理,则必须为代理身份验证定义一个头信息。
| 键 | 描述 | 示例值 |
|---|---|---|
| USE_PROXY | 决定应用程序是否应通过代理服务器路由请求。 | true |
HAProxy 后端的示例配置。只有包含 1234567890ABCDEFHIJ 的头部请求才会被接受:
backend mcpserver.mydomain.com
acl valid_header req.hdr(X-Custom-Header) -m str "1234567890ABCDEFHIJ"
http-request deny unless valid_header
http-request del-header X-Custom-Header
server stable 172.16.123.4:443 ssl verify none
头部加密
| 键 | 描述 | 示例值 |
|---|---|---|
| HEADER_ENCRYPTED | 指示自定义代理访问头部是否加密。 | true |
"true": 访问头部已加密。请使用服务器安全文件夹中的加密工具对头部进行加密。"false": 访问头部是明文。
访问头部
用于代理身份验证或访问控制的自定义头部值。如果 HEADER_ENCRYPTED 为 "true",则在使用前必须解密此值。
| 键 | 描述 | 示例值 |
|---|---|---|
| ACCESS_HEADER | 用于代理身份验证或访问控制。 | 123abc.. |
注意事项
- 如果
HEADER_ENCRYPTED设置为"true",请确保ACCESS_HEADER得到适当保护。 - 仔细检查代理服务器设置以避免连接问题。
服务器配置
为了实现安全证书认证,请创建一个包含您的 privateGPT 凭证的 .env 文件,例如 privateGTP.env.json。可以在 .env 文件中调整设置来自定义服务器及其功能。
生成证书(如果您还没有 SSH 证书,请使用 ssh-keygen -t rsa),需要 .pem 文件:
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM > ~/.ssh/id_rsa_public.pem
完成此过程后,您可以使用加密密码加密工具从密码生成密文,并使用加密密码解密工具测试该密文。您可以在本文档的“安全性”部分找到其工作原理的描述。
接下来,您应该提供 SSL/TLS 证书 server.crt 和 server.key 以确保与客户端和代理的通信是加密的。如果您想使用自签名证书,可以通过执行例如以下命令来生成它们:
openssl req -x509 -newkey rsa:2048 -nodes -keyout server.key -out server.crt -days 365 -subj "/CN=localhost"
注意:客户端和代理可以检测到服务器使用的是自签名证书,因为这些证书相比经过组织验证等步骤的官方证书来说可能存在不安全因素。但是,客户端和代理可以通过适当的参数接受与这些证书的通信(请参阅相关客户端和代理参数的说明)。
下面是 privateGPT 服务器的示例 .env 配置文件,包括每个设置的描述。请根据您的环境和需求自定义这些值。
服务器端口
| 键 | 描述 | 示例值 |
|---|---|---|
| PORT | MCP 服务器运行的端口。 | 5000 |
语言
系统开箱即支持以下语言:de, en, pt, es, nl, fr。
通过修改 privateGTP-messages.js 文件可以轻松添加其他语言。修改后的文件应同时存储在 /src 和 /dist 目录下。
| 键 | 描述 | 示例值 |
|---|---|---|
| LANGUAGE | 服务器系统消息的语言(en 或 de)。 |
"de" |
SSL 验证
| 键 | 描述 | 示例值 |
|---|---|---|
| SSL_VALIDATE | 仅当客户端无法验证服务器证书时使用 "false"。 |
"false" |
加密
| 键 | 描述 | 示例值 |
|---|---|---|
| PW_ENCRYPTION | 如果设置为 "true",则服务器只接受密文形式的密码。 |
"false" |
| PUBLIC_KEY | 指定用于 RSA 的服务器公钥 PEM 文件的文件系统路径。 | "~/.ssh/id_rsa_public.pem" |
| PRIVATE_KEY | 指定用于 RSA 的服务器私钥文件的文件系统路径。 | "~/.ssh/id_rsa_public.pem" |
SSL/TLS
| 键 | 描述 | 示例值 |
|---|---|---|
| ENABLE_TLS | 如果设置为 "true",则服务器仅提供与客户端和代理之间的 TLS 加密通信。 |
"true" |
| SSL_KEY_PATH | 指定用于 SSL/TLS 的服务器 SSL/TLS 密钥文件的文件系统路径。 | "~/.ssh/certs/server.key" |
| SSL_CERT_PATH | 指定用于 SSL/TLS 的服务器证书的文件系统路径。 | "~/.ssh/certs/server.crt" |
限制
| Key | 描述 | 示例值 |
|---|---|---|
| RESTRICTED_GROUPS | 设置为 true 时,阻止客户端访问 assignableGroups。 |
true |
| ENABLE_OPEN_AI_COMP_API | 设置为 true 时,允许 OpenAI API 的兼容模式。 |
false |
日志记录
| Key | 描述 | 示例值 |
|---|---|---|
| WRITTEN_LOGFILE | 启用日志文件。如果设置为 false,则不会写入日志文件 logs/server.log。如果此选项设置为 true,可以通过服务器的 http://<ip>:3000 获取日志。 |
true |
| LOG_IPs | 记录客户端/代理的 IP 地址。如果设置为 false,这些信息将被替换为 ***** 并且无法恢复。 |
false |
| ANONYMOUS_MODE | 停用所有与日志记录相关的内容。不写入、保存或显示任何通信、错误等信息。 | false |
功能启用/禁用
控制各个服务器功能的可用性。将相应的值设置为 true 以启用该功能,或设置为 false 以禁用它。禁用的功能将返回一条消息,指示它们不可用。
| 键 | 描述 | 示例值 |
|---|---|---|
| ENABLE_LOGIN | 启用或禁用登录功能。 | true |
| ENABLE_LOGOUT | 启用或禁用登出功能。 | true |
| ENABLE_CHAT | 启用或禁用聊天功能。 | true |
| ENABLE_CONTINUE_CHAT | 启用或禁用继续聊天。 | true |
| ENABLE_GET_CHAT_INFO | 启用或禁用检索聊天信息。 | true |
| ENABLE_DELETE_ALL_CHATS | 启用或禁用删除所有聊天记录。 | true |
| ENABLE_DELETE_CHAT | 启用或禁用删除聊天记录。 | true |
| ENABLE_LIST_GROUPS | 启用或禁用列出群组。 | true |
| ENABLE_STORE_GROUP | 启用或禁用创建群组。 | true |
| ENABLE_DELETE_GROUP | 启用或禁用删除群组。 | false |
| ENABLE_CREATE_SOURCE | 启用或禁用创建来源。 | true |
| ENABLE_EDIT_SOURCE | 启用或禁用编辑来源。 | true |
| ENABLE_DELETE_SOURCE | 启用或禁用删除来源。 | true |
| ENABLE_GET_SOURCE | 启用或禁用检索来源。 | true |
| ENABLE_LIST_SOURCES | 启用或禁用列出来源。 | true |
| ENABLE_STORE_USER | 启用或禁用创建用户。 | true |
| ENABLE_EDIT_USER | 启用或禁用编辑用户。 | false |
| ENABLE_DELETE_USER | 启用或禁用删除用户。 |