- 后端
- 前端
- 企业应用
- MCP 服务
【免费下载链接】ever-gauzy
Ever® Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co
本篇技术指南以 integration-activepieces/README.md 为骨架,深入剖析 Ever Gauzy 与 ActivePieces 自动化平台之间的官方集成插件@gauzy/plugin-integration-activepieces。文章覆盖插件的安装、构建、测试与发布流程,并基于仓库源码逐项拆解「连接管理」与「MCP Server 管理」两大核心能力对应的 REST 接口、配置项与底层实现原理。读完本文,你将能够在自己的 NestJS / Ever Gauzy 应用中完成 ActivePieces 集成配置、连接资源的增删查改,以及 MCP Server 的更新与令牌轮换。
一、插件概览:为 Ever Gauzy 接入 ActivePieces 自动化平台
ActivePieces 是一个开源的 AI 自动化平台,允许用户通过可视化流程(Flows)把各类应用与 AI Agent 串联起来。Ever Gauzy(开源商业管理平台,覆盖 ERP/CRM/HRM/ATS/PM 等模块)通过本插件以租户(Tenant)维度管理 ActivePieces 上的资源,所有 API 调用统一使用 ActivePieces 平台的 API Key 进行鉴权——该能力按官方说明需要ActivePieces Platform / Enterprise 版本才能使用。
插件在 activepieces.module.ts 中声明为标准的 NestJS 模块,并对外提供两类能力:
| 能力域 | 服务 | 控制器 | 功能 |
|---|---|---|---|
| 连接管理(Connection Management) | activepieces.service.ts | activepieces.controller.ts | 为 Ever-gauzy piece 创建、列出、查询、删除 ActivePieces 应用连接 |
| MCP Server 管理 | activepieces-mcp.service.ts | activepieces-mcp.controller.ts | 列出、更新、轮换 ActivePieces MCP Server 的令牌 |
模块依赖方面,插件同时引入了@gauzy/core中的集成基础设施(IntegrationModule、IntegrationTenantModule、IntegrationSettingModule、IntegrationMapModule等)以及RoleModule/RolePermissionModule/UserModule等核心模块,并通过HttpModule.register({ baseURL: ACTIVEPIECES_API_URL })统一向 ActivePieces API 发起 HTTP 请求。
作为 Gauzy 插件体系的成员,integration-activepieces.plugin.ts 使用@Plugin()装饰器注册,实现IOnPluginBootstrap与IOnPluginDestroy生命周期接口,在插件启动与销毁时输出日志;同时暴露configuration回调,允许对主插件配置对象进行自定义修改后再返回。
二、环境变量与全局配置
插件运行依赖两类全局配置,均在 activepieces.config.ts 与 config/activepieces.ts 中定义:
| 配置项 | 环境变量 | 默认值 | 说明 |
|---|---|---|---|
ACTIVEPIECES_BASE_URL | ACTIVEPIECES_BASE_URL | https://cloud.activepieces.com | ActivePieces 平台根地址,自托管部署时可替换 |
apiKey | GAUZY_ACTIVEPIECES_API_KEY | 空字符串 | 全局 API Key,作为租户级 Key 缺失时的兜底 |
由默认值推导出的 API 路径如下:
- API 根地址:
{ACTIVEPIECES_BASE_URL}/api/v1 - 连接端点:
{API}/app-connections - MCP Server 端点:
{API}/mcp-servers - Piece 名称常量:
Ever-gauzy(连接创建时使用的 pieceName)
环境变量GAUZY_ACTIVEPIECES_API_KEY同时在 environment.ts 与 environment.prod.ts 中被读取,并通过registerAs('activepieces')注册到 NestJS Config 体系,供服务层以this.configService.get('activepieces')?.apiKey的方式访问。
三、安装、注册与集成初始化
3.1 安装插件
使用你偏好的包管理器安装:
npm install @gauzy/plugin-integration-activepieces # 或 yarn add @gauzy/plugin-integration-activepieces从 package.json 可以看出该包的运行时约束:Node.js>=22、Yarn>=1.22,peerDependencies 为@nestjs/common与@nestjs/core(^11.1.26),内部依赖@gauzy/common、@gauzy/config、@gauzy/contracts、@gauzy/core、@gauzy/plugin、@gauzy/utils等平台包,并以@nestjs/axios+axios作为 HTTP 客户端,rxjs处理异步请求流。
3.2 在应用中注册
插件对外导出IntegrationActivepiecesPlugin(见 src/index.ts),将其加入应用的插件集合即可完成挂载:
import { IntegrationActivepiecesPlugin } from '@gauzy/plugin-integration-activepieces'; // 应用配置 plugins 数组中追加 plugins: [ IntegrationActivepiecesPlugin ]3.3 通过 REST 接口初始化集成
注册完成后,调用POST /api/integration/activepieces/setup并携带 API Key 完成租户级初始化(需要INTEGRATION_ADD权限):
{ "apiKey": "sk-...", "organizationId": "可选,不传则按租户维度保存" }请求体由 SetupActivepiecesIntegrationDto 校验,apiKey为必填字符串。服务端在 activepieces.service.ts 的setupIntegration()中完成三件事:
- 按
provider = ACTIVE_PIECES查找或创建全局集成记录(Integration); - 在当前租户下查找或创建「集成租户」(
IntegrationTenant),并写入api_key与is_enabled=true两个设置项; - 若租户已存在集成记录,则对既有设置做原地合并更新(保留数据库主键),而非重复插入。
成功后返回{ "integrationTenantId": "..." },该 ID 是后续所有连接与 MCP 管理接口的入参。
四、连接管理(Connection Management)详解
连接管理的所有接口都挂在@Controller('/integration/activepieces')下(见 activepieces.controller.ts),并统一受TenantPermissionGuard与Permissions装饰器双重保护。
4.1 创建 / 更新连接(Upsert)
POST /api/integration/activepieces/connection请求体由 CreateActivepiecesIntegrationDto 定义:
| 字段 | 必填 | 说明 |
|---|---|---|
accessToken | 是 | ActivePieces 访问令牌,示例ap_1234567890abcdef |
projectId | 是 | 连接将被创建到的 ActivePieces 项目 ID,示例proj_1234567890abcdef |
connectionName | 否 | 连接显示名,缺省时使用Ever Gauzy - {tenantId} |
服务端upsertConnection()(activepieces.service.ts)会构造标准 upsert 请求体并 POST 到/app-connections:
- externalId:
gauzy-tenant-{tenantId},若传了organizationId则追加-org-{organizationId},作为当前租户的唯一外部标识; - pieceName:固定为
Ever-gauzy; - type:
SECRET_TEXT,value.secret_text承载 accessToken; - metadata:写入
tenantId、organizationId(缺省为'default')、createdAt(ISO 时间戳)与gauzyVersion: '1.0.0',供后续按租户过滤使用。
成功后,插件会把access_token、connection_id、project_id(JSON 数组序列化)与is_enabled=true持久化到当前租户的集成设置中,并返回 ActivePieces 的连接对象(额外附带integrationId)。
4.2 列出连接
GET /api/integration/activepieces/connections/:integrationId查询参数由 ActivepiecesConnectionsListQueryDto 校验:
| 参数 | 必填 | 约束 / 默认值 | 说明 |
|---|---|---|---|
projectId | 是 | 非空字符串 | 目标项目 ID |
cursor | 否 | 字符串 | 分页游标 |
scope | 否 | 枚举ActivepiecesConnectionScope(当前仅PROJECT) | 连接范围 |
pieceName | 否 | 字符串 | 按 piece 名过滤 |
displayName | 否 | 字符串 | 按显示名过滤 |
status | 否 | 枚举ActivepiecesConnectionStatus(ACTIVE/ERROR) | 按状态过滤 |
limit | 否 | 整数,1–100,默认 10 | 返回条数 |
4.3 查询与删除
| 接口 | 说明 |
|---|---|
GET /integration/activepieces/connections/tenant/:integrationId/:projectId | 获取当前租户自己的连接列表:服务端拉取项目连接后,用metadata.tenantId === 当前租户ID二次过滤 |
GET /integration/activepieces/connection/:integrationId | 读取集成租户设置中的connection_id,随后向 ActivePieces 拉取单条连接详情 |
DELETE /integration/activepieces/connection/:integrationId | 删除连接(需要INTEGRATION_DELETE权限),返回 204;未找到连接记录时返回 404 |
4.4 状态查询与集成信息
GET /integration/activepieces/status/:integrationId:读取is_enabled设置(兼容布尔与 JSON 字符串两种存储形态),返回{ "enabled": true | false };GET /integration/activepieces/integration-tenant/:integrationId:返回包含integration与settings关联关系的集成租户完整信息。
五、MCP Server 管理详解
MCP(Model Context Protocol)Server 管理接口挂在@Controller('/integration/activepieces/mcp')下(见 activepieces-mcp.controller.ts),核心服务实现位于 activepieces-mcp.service.ts。
| 方法 | 路径 | 权限 | 说明 |
|---|---|---|---|
| GET | /integration/activepieces/mcp?projectId=... | INTEGRATION_VIEW | 按项目列出 MCP Server,支持limit、cursor、name过滤 |
| GET | /integration/activepieces/mcp/tenant?projectId=... | INTEGRATION_VIEW | 返回当前租户的 MCP Server(按名称包含租户 ID 或gauzy过滤) |
| GET | /integration/activepieces/mcp/:serverId | INTEGRATION_VIEW | 查询单个 Server,serverId缺失或为空时返回 400 |
| PATCH | /integration/activepieces/mcp/:serverId | INTEGRATION_EDIT | 更新 Server 名称与工具列表 |
| POST | /integration/activepieces/mcp/:serverId/rotate | INTEGRATION_EDIT | 轮换 Server 令牌,请求体为空 |
更新请求体由 ActivepiecesMcpUpdateDto 定义:name(非空字符串)与tools(非空数组)均可选;每个 tool 项支持id、type、pieceMetadata(对象)与flowId字段,且字符串字段会先trim再校验。服务端通过POST请求${MCP_SERVERS_URL}/{serverId}与${MCP_SERVERS_URL}/{serverId}/rotate完成更新与令牌轮换。
安全细节:所有 MCP 相关响应在返回前都会经过sanitizeMcpServer()处理——用解构方式剔除token字段,只把公开数据(id、name、projectId、tools等)暴露给调用方。该脱敏逻辑与 contracts 中定义的IActivepiecesMcpServerPublic类型(Omit<IActivepiecesMcpServer, 'token'>)一一对应。
MCP 服务在底层封装了统一的request()帮助方法(activepieces-mcp.service.ts):统一注入Authorization: Bearer {apiKey}请求头、设置8 秒超时,并把 Axios 错误统一转换为HttpException。
六、API Key 解析顺序与错误处理
两个服务都实现了「租户优先、全局兜底」的 API Key 解析策略(见 activepieces.service.ts):
- 若传入
integrationTenantId,先查询当前租户下该集成租户的设置,命中api_key则直接使用; - 未命中时回退读取全局配置
configService.get('activepieces')?.apiKey(即GAUZY_ACTIVEPIECES_API_KEY); - 两者皆无则抛出
InternalServerErrorException,提示设置环境变量或先执行setupIntegration。
值得一提的容错逻辑:在upsertConnection()中,即使当前租户尚未执行过setupIntegration(找不到集成租户),插件也不会中断,而是记录 warning 并回退到全局GAUZY_ACTIVEPIECES_API_KEY继续调用 ActivePieces API。
错误处理上,服务层对 HTTP 调用使用 RxJS 的catchError管道:401 响应映射为UnauthorizedException,其他响应包装为InternalServerErrorException/HttpException,并保留原始状态码与错误消息(来自error.response.data.error.message)。
七、数据模型与设置项(Contracts 层)
插件依赖的 ActivePieces 数据模型集中在 packages/contracts/src/lib/activepieces-integration-config.model.ts,主要包括:
连接类型ActivepiecesConnectionType:SECRET_TEXT、OAUTH2、CLOUD_OAUTH2、PLATFORM_OAUTH2、BASIC_AUTH、CUSTOM_AUTH。本插件创建连接时固定使用SECRET_TEXT。
连接范围ActivepiecesConnectionScope:当前仅PROJECT。
连接状态ActivepiecesConnectionStatus:ACTIVE、ERROR。
持久化设置名ActivepiecesSettingName:插件在集成租户的settings表中使用以下键名:
| 设置名 | 枚举值 | 用途 |
|---|---|---|
API_KEY | api_key | 租户级 API Key |
ACCESS_TOKEN | access_token | 连接访问令牌 |
REFRESH_TOKEN | refresh_token | 刷新令牌(预留) |
TOKEN_TYPE/EXPIRES_IN/EXPIRES_AT | 同名 | 令牌元数据(预留) |
CONNECTION_ID | connection_id | ActivePieces 连接 ID |
PROJECT_ID | project_id | 项目 ID 数组(JSON 序列化) |
IS_ENABLED | is_enabled | 集成启用标记 |
CLIENT_ID/CLIENT_SECRET/CALLBACK_URL/POST_INSTALL_URL/STATE_SECRET | 同名 | OAuth 流程预留字段 |
连接对象IActivepiecesConnection完整字段包括:id、created、updated、externalId、displayName、type、pieceName、projectIds、platformId、scope、status、ownerId、owner、metadata、flowIds、integrationId。MCP Server 对象IActivepiecesMcpServer则包含id、created、updated、name、projectId、token、agentId、tools(每个 tool 带pieceMetadata与flow信息)。
八、构建、测试与发布
该插件在 Nx 工作区中注册为库项目plugin-integration-activepieces(见 project.json),构建产物输出到dist/packages/plugins/integration-activepieces。
8.1 构建
yarn nx build plugin-integration-activepieces构建使用@nx/js:tscexecutor,main指向 src/index.ts,并把包内*.md作为资产一并拷贝到产物目录。
8.2 运行单元测试
yarn nx test plugin-integration-activepieces测试由@nx/jest:jestexecutor 驱动,使用仓库统一的 jest.config.ts 配置。
8.3 发布
构建完成后进入产物目录执行 npm 发布:
cd dist/packages/plugins/integration-activepieces npm publish该包以@gauzy/plugin-integration-activepieces(当前版本0.1.0)命名,遵循 AGPL-3.0 许可协议。
九、从源码结构看实现要点与使用限制
- 租户隔离是设计主线:从 externalId 命名规则(
gauzy-tenant-{tenantId})、连接的 metadata 租户标记,到getTenantConnections()/getTenantMcpServers()的二次过滤,插件的所有资源操作都以当前请求上下文(RequestContext.currentTenantId())为边界,可安全运行在多租户部署中。 - 双重鉴权:HTTP 层使用 ActivePieces API Key(
Bearer头)调用外部平台;Ever Gauzy 侧则依赖TenantPermissionGuard与INTEGRATION_ADD/INTEGRATION_VIEW/INTEGRATION_EDIT/INTEGRATION_DELETE权限控制接口访问。 - 面向自托管可配置:通过
ACTIVEPIECES_BASE_URL环境变量即可指向私有部署的 ActivePieces 实例,GAUZY_ACTIVEPIECES_API_KEY则用于提供全局兜底密钥。 - 使用前提:按照 README 说明,平台级 API Key 仅在 ActivePieces 的 Platform / Enterprise 版本中可用,社区自托管部署是否支持取决于你所使用的 ActivePieces 版本能力。
十、快速验证流程(实战清单)
- 安装插件包并在 Ever Gauzy 应用中注册
IntegrationActivepiecesPlugin; - 设置环境变量
GAUZY_ACTIVEPIECES_API_KEY,或调用POST /integration/activepieces/setup保存租户级 Key; - 调用
POST /integration/activepieces/connection创建 Ever-gauzy piece 的连接(SECRET_TEXT类型),保存返回的integrationId; - 通过
GET /integration/activepieces/connections/:integrationId?projectId=...核对连接列表; - 通过
GET /integration/activepieces/mcp?projectId=...查看 MCP Server,用PATCH /:serverId更新配置,用POST /:serverId/rotate轮换令牌; - 运行
yarn nx test plugin-integration-activepieces验证插件行为,再按需执行构建与发布流程。
- 后端
- 前端
- 企业应用
- MCP 服务
【免费下载链接】ever-gauzy
Ever® Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co
相关推荐
在 Ever Gauzy 中集成 Activepieces:@gauzy/plugin-integration-activepieces-ui 插件深度解析
在 Ever Gauzy 中集成 Activepieces:@gauzy/plugin integration activepieces ui 插件深度解析 导
后端前端企业应用MCP 服务Cog 机器学习模型容器化实战:从 cog.yaml 到生产级 HTTP 推理服务
Cog 机器学习模型容器化实战:从 cog.yaml 到生产级 HTTP 推理服务 Cog 是一个面向机器学习模型的开源容器化工具,让你用一份 cog.yaml
后端前端企业应用MCP 服务在 Modal 无服务器 GPU 上按需部署 Tabby:完整实操指南
在 Modal 无服务器 GPU 上按需部署 Tabby:完整实操指南 Modal 是一个 serverless GPU 平台,通过它运行 Tabby 可以实现
后端前端企业应用MCP 服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考