pipefy-portal-setup
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePortal setup
门户设置
Configure an organization's Pipefy portal: bootstrap the main hub, add pages and widgets, wire and publish sub-portals. 20 MCP tools (Interfaces GraphQL + internal_api for sub-portal wiring).
Deep reference: . Parity matrix: . Env vars: .
docs/mcp/tools/portal.mddocs/parity.mddocs/config.md配置组织的Pipefy门户:初始化主枢纽、添加页面和小部件、连接并发布子门户。20个MCP工具(使用Interfaces GraphQL + internal_api进行子门户连接)。
深度参考:。Parity矩阵:。环境变量:。
docs/mcp/tools/portal.mddocs/parity.mddocs/config.mdWhen to use
适用场景
- "Create our company portal", "list portals for org X", "publish a sub-portal".
- Add or change portal pages, layout, or page elements (,
forms, etc.).link - Attach, publish, unpublish, or delete sub-portals on the main portal.
Do not use for:
- Pipes, phases, cards, or automations — see ,
skills/pipes-and-cards/.skills/automations/ - Raw GraphQL when a portal tool exists — prefer the tools below.
- Bootstrapping a portal via undocumented GraphQL — always use
createInterface/create_portal.pipefy portal create
- "创建我们公司的门户"、"列出组织X的门户"、"发布子门户"。
- 添加或修改门户页面、布局或页面元素(、
forms等)。link - 在主门户上附加、发布、取消发布或删除子门户。
请勿用于:
- 管道、阶段、卡片或自动化操作 — 请查看、
skills/pipes-and-cards/。skills/automations/ - 当已有门户工具时使用原生GraphQL — 优先使用下方的工具。
- 通过未公开的GraphQL初始化门户 — 务必使用**
createInterface** /create_portal。pipefy portal create
Prerequisites
前提条件
- Organization id: UUID or numeric org id from / the Pipefy URL (examples below use fictional
pipefy org getper123456789). SDK resolves numeric ids before Interfaces calls. The org you pass tofixture_ids.py/list_portalsmust be the same org your token can write on.create_portal - Portal writes: token needs and/or
create_portalon that org. Many service accounts only have pipe/card scope on their default org →manage_portalson portal mutations even when reads succeed elsewhere.PERMISSION_DENIED - One main portal per org — is idempotent (second call returns the same portal UUID).
create_portal - Cursor MCP: after changing in
PIPEFY_*, restart the MCP server so tools pick up the new credentials..env
- 组织ID:UUID或从/ Pipefy URL获取的数字组织ID(以下示例使用虚构的
pipefy org get,来自123456789)。SDK会在调用Interfaces前解析数字ID。传递给**fixture_ids.py** / **list_portals**的组织必须与你的令牌具有写入权限的组织一致。create_portal - 门户写入权限:令牌需要在该组织拥有**和/或
create_portal**权限。许多服务帐户在默认组织仅拥有管道/卡片范围的权限 → 即使在其他地方读取成功,门户变更操作仍会返回manage_portals。PERMISSION_DENIED - 每个组织最多一个主门户 — 是幂等的(第二次调用会返回相同的门户UUID)。
create_portal - Cursor MCP:在中修改
.env后,重启MCP服务器以使工具加载新的凭据。PIPEFY_*
Confirm access before writes
写入前确认权限
Reads on the wrong org can succeed while Interfaces writes fail. Before page/element/sub-portal mutations:
- Call with the intended
list_portals.organization_uuid - Ensure the token is meant for that org (service account email vs human user on a different org is a common mismatch).
- Prefer an org where the account has and portal admin in Pipefy (not only
manage_portalson a read query from another org).canManagePortals
If or returns but the user insists the org role is correct: Pipefy may require on that portal interface for service accounts (Interfaces mutation, not shipped as MCP/CLI). The user must join as portal admin once in the UI (or via GraphQL) per portal UUID before SA writes succeed.
update_portaldelete_portalPERMISSION_DENIEDjoinAsAdmin在错误的组织上读取可能成功,但Interfaces写入可能失败。在进行页面/元素/子门户变更前:
- 使用目标调用**
organization_uuid**。list_portals - 确保令牌适用于该组织(服务帐户邮箱与其他组织的人类用户不匹配是常见问题)。
- 优先选择帐户拥有****权限且在Pipefy中是门户管理员的组织(不仅仅是在其他组织的读取查询中拥有
manage_portals权限)。canManagePortals
如果**或返回但用户坚持组织角色正确:Pipefy可能要求服务帐户在该门户接口上执行**(Interfaces变更操作,未作为MCP/CLI工具提供)。用户必须在UI中(或通过GraphQL)以门户管理员身份加入一次该门户UUID,服务帐户才能成功写入。
update_portaldelete_portalPERMISSION_DENIEDjoinAsAdminHow portals are organized
门户组织结构
| Concept | What to expect |
|---|---|
| Main portal | At most one per org ( |
| Usually one row — the main portal only (filter |
| Sub-portals | Separate entities ( |
| UI on the main hub | Creating sub-portals does not add tiles to the main page. You must publish (or attach) on a |
| End-user visibility | Sub-portals with |
| Public main hub | Main portal |
| 概念 | 说明 |
|---|---|
| 主门户 | 每个组织最多一个( |
| 通常返回一行 — 仅主门户(过滤条件 |
| 子门户 | 独立实体(通过 |
| 主枢纽UI | 创建子门户不会在主页面添加磁贴。你必须通过** |
| 终端用户可见性 | |
| 公开主枢纽 | 在 |
Main portal lifecycle
主门户生命周期
- Prefer on an existing main portal over delete +
update_portalon orgs you reuse for testing.create_portal - on the main removes one interface UUID; orphan sub-portals can remain unless deleted first.
delete_portal - After deleting the main, may fail with
create_portal(org menu state persists whileMenu already createdis null). Recovery: delete orphan sub-portals, use Pipefy admin/support, or bootstrap content on the surviving UUID — do not switch to rawmainPortal, which leaves a skeleton main page (createInterface, 0 elements) and a broken builder; idempotent"Page"will keep returning that UUID.create_portal
- 优先使用更新现有主门户,而非在重复用于测试的组织上执行删除 +
update_portal。create_portal - 删除主门户的****操作会移除一个接口UUID;孤立子门户可能会保留,除非先删除它们。
delete_portal - 删除主门户后,可能会因
create_portal失败(当Menu already created为null时,组织菜单状态仍会保留)。恢复方法:删除孤立子门户、联系Pipefy管理员/支持、或在剩余的UUID上初始化内容 — 请勿切换到原生mainPortal,这会留下一个骨架主页面("Page",0个元素)和损坏的构建器;幂等的**createInterface**会持续返回该UUID。create_portal
Empty main page
空主页面
If shows a main page with no elements, call with only (no in the request). The API typically returns a page with ~14 templated widgets (text, forms, links, etc.). Use that page for publish slots and element tests. Do not pass inside — validation fails at create time.
get_portalcreate_portal_pagetitleelementstype: subPortalcreate_portal_page如果**显示主页面无元素**,仅传递**(请求中不包含)调用。API通常会返回一个包含约14个模板化小部件**(文本、表单、链接等)的页面。使用该页面进行发布槽和元素测试。请勿在****中传递 — 创建时会验证失败。
get_portaltitleelementscreate_portal_pagecreate_portal_pagetype: subPortalSchema notes
架构说明
| Topic | Rule |
|---|---|
| Response ids | GraphQL field is |
| |
| Sub-portal in layout | Tiles may appear under |
| Publish wire | Use |
| Element metadata | |
| Metadata keys | |
| Layout JSON | |
| Page grid vs elements | |
| 主题 | 规则 |
|---|---|
| 响应ID | GraphQL字段为 |
列表中的 | |
| 布局中的子门户 | 磁贴可能出现在** |
| 发布连接 | 在现有** |
| 元素元数据 | |
| 元数据键 | |
| 布局JSON | |
| 页面网格与元素 | ** |
Tools needed
所需工具
| Tool (MCP) | CLI equivalent | Read-only |
|---|---|---|
| | Yes |
| | Yes |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
| | No |
Element values (15): , , , , , , , , , , , , , , .
typetexttablefieldembedLinkembedVideoembedImagebuttondividerlinkformspagessubPortalautomationButtoncontentBlockdocument| 工具(MCP) | CLI等效命令 | 只读 |
|---|---|---|
| | 是 |
| | 是 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
| | 否 |
元素值(15种):、、、、、、、、、、、、、、。
typetexttablefieldembedLinkembedVideoembedImagebuttondividerlinkformspagessubPortalautomationButtoncontentBlockdocumentSteps — happy path (main portal + sub-portal publish)
步骤 — 常规流程(主门户 + 子门户发布)
-
List or bootstrap the main portalMCP:
list_portals organization_uuid="123456789"Expect at most one main portal row. If none:MCP:create_portal organization_uuid="123456789"CLI:bashpipefy portal list --organization-uuid 123456789 pipefy portal create --organization-uuid 123456789Capturewhereuuidis the main portal.subType -
Inspect structureMCP:
get_portal portal_uuid="<MAIN_PORTAL_UUID>"CLI:bashpipefy portal get <MAIN_PORTAL_UUID>Note,pages[], andelements[]element ids. If the main page has zero elements, runforms(title only) on that portal before adding widgets.create_portal_page -
Optional — add aelement (if no templated
formsslot exists)formsMCP:create_portal_element page_id="<PAGE_ID>" type="forms" metadata={"name": "Request access", "gridMap": {"height": 66, "columns": 4, "minColumns": 4}}Ifreturns an opaque orcreate_portal_elementfrom Interfaces,INTERNAL_SERVER_ERRORfrom an existing link on the sameduplicate_portal_elementandportal_uuidinstead of retrying create blindly.page_idCLI:bashpipefy portal element create --page-id <PAGE_ID> --type forms \ --metadata '{"name":"Request access","gridMap":{"height":66,"columns":4,"minColumns":4}}' -
Create a sub-portalMCP:
create_sub_portal main_portal_uuid="<MAIN_PORTAL_UUID>" name="Partner hub"CLI:bashpipefy portal sub-portal create --main-portal-uuid <MAIN_PORTAL_UUID> --name "Partner hub"Capture the sub-portal.uuidwill list it underget_portalwithsubPortals[]— the main hub UI is unchanged until step 5.published: false -
Publish on aelement
formsMCP:publish_sub_portal portal_uuid="<MAIN_PORTAL_UUID>" element_id="<FORMS_ELEMENT_ID>" sub_portal_uuid="<SUB_PORTAL_UUID>"CLI:bashpipefy portal sub-portal publish <MAIN_PORTAL_UUID> <FORMS_ELEMENT_ID> <SUB_PORTAL_UUID> -
Verify publish stateMCP:
get_portal portal_uuid="<MAIN_PORTAL_UUID>"Success: targetissubPortals[].published. End users can see the sub-portal only after this (and hub visibility rules).true -
Optional — make the main hub publicMCP:
update_portal portal_uuid="<MAIN_PORTAL_UUID>" visibility="public"CLI:bashpipefy portal update <MAIN_PORTAL_UUID> --visibility public
-
列出或初始化主门户MCP命令:
list_portals organization_uuid="123456789"预期返回最多一个主门户行。如果没有:MCP命令:create_portal organization_uuid="123456789"CLI命令:bashpipefy portal list --organization-uuid 123456789 pipefy portal create --organization-uuid 123456789记录为主门户的subType。uuid -
检查结构MCP命令:
get_portal portal_uuid="<MAIN_PORTAL_UUID>"CLI命令:bashpipefy portal get <MAIN_PORTAL_UUID>记录、pages[]以及**elements[]元素ID。如果主页面无元素**,在添加小部件前对该门户运行**forms**(仅传递标题)。create_portal_page -
可选 — 添加元素(如果没有模板化的
forms槽)formsMCP命令:create_portal_element page_id="<PAGE_ID>" type="forms" metadata={"name": "Request access", "gridMap": {"height": 66, "columns": 4, "minColumns": 4}}如果**返回模糊错误或来自Interfaces的create_portal_element,从同一**INTERNAL_SERVER_ERROR和portal_uuid上的现有链接执行**page_id**,而非盲目重试创建。duplicate_portal_elementCLI命令:bashpipefy portal element create --page-id <PAGE_ID> --type forms \ --metadata '{"name":"Request access","gridMap":{"height":66,"columns":4,"minColumns":4}}' -
创建子门户MCP命令:
create_sub_portal main_portal_uuid="<MAIN_PORTAL_UUID>" name="Partner hub"CLI命令:bashpipefy portal sub-portal create --main-portal-uuid <MAIN_PORTAL_UUID> --name "Partner hub"记录子门户的。uuid会在get_portal下列出它,且subPortals[]— 直到步骤5,主枢纽UI才会变化。published: false -
在元素上发布
formsMCP命令:publish_sub_portal portal_uuid="<MAIN_PORTAL_UUID>" element_id="<FORMS_ELEMENT_ID>" sub_portal_uuid="<SUB_PORTAL_UUID>"CLI命令:bashpipefy portal sub-portal publish <MAIN_PORTAL_UUID> <FORMS_ELEMENT_ID> <SUB_PORTAL_UUID> -
验证发布状态MCP命令:
get_portal portal_uuid="<MAIN_PORTAL_UUID>"成功标志:目标**为subPortals[].published**。终端用户只有在此之后(且符合枢纽可见性规则)才能看到子门户。true -
可选 — 将主枢纽设为公开MCP命令:
update_portal portal_uuid="<MAIN_PORTAL_UUID>" visibility="public"CLI命令:bashpipefy portal update <MAIN_PORTAL_UUID> --visibility public
Steps — pages, layout, and safe edits
步骤 — 页面、布局与安全编辑
Use a disposable page for element/layout experiments on a shared org main portal:
- with a unique title (e.g.
create_portal_page).Agent smoke 2026-06-01 - Run ,
create_portal_element,update_portal_element,duplicate_portal_elementon that page only.update_portal_page_layout - with MCP preview then
delete_portal_page, or CLIconfirm=true.--yes
duplicate_portal_elementelement_idportal_uuidpage_idupdate_portal_page_layoutlayoutget_portal{ "rows": [ ... ] }sort_portal_pagespage_idssuccess: falseLink element metadata (create/update, full replace):
json
{
"gridMap": { "height": 64, "columns": 4, "minColumns": 4 },
"linkUrl": "https://example.com",
"linkName": "Example link"
}在共享组织主门户上使用一次性页面进行元素/布局实验:
- ****创建一个唯一标题的页面(例如
create_portal_page)。Agent smoke 2026-06-01 - 仅在该页面上执行**、
create_portal_element、update_portal_element、duplicate_portal_element**操作。update_portal_page_layout - 使用MCP预览后执行**并设置
delete_portal_page,或使用CLI的confirm=true**参数。--yes
duplicate_portal_elementelement_idportal_uuidpage_idupdate_portal_page_layoutget_portallayout{ "rows": [ ... ] }sort_portal_pagespage_idssuccess: false链接元素元数据(创建/更新,全量替换):
json
{
"gridMap": { "height": 64, "columns": 4, "minColumns": 4 },
"linkUrl": "https://example.com",
"linkName": "Example link"
}Steps — unpublish or remove sub-portal
步骤 — 取消发布或移除子门户
Unpublish (keeps sub-portal entity; visitors lose access):
MCP:
unpublish_sub_portal portal_uuid="<MAIN_PORTAL_UUID>" element_id="<FORMS_ELEMENT_ID>"CLI:
bash
pipefy portal sub-portal unpublish <MAIN_PORTAL_UUID> <FORMS_ELEMENT_ID>Detach element wiring (destructive — preview/confirm on MCP, on CLI):
--yesMCP:
delete_sub_portal_element portal_uuid="<MAIN_PORTAL_UUID>" element_id="<FORMS_ELEMENT_ID>" confirm=falseThen after approval: .
confirm=trueCLI:
bash
pipefy portal sub-portal detach <MAIN_PORTAL_UUID> <FORMS_ELEMENT_ID> --yesDelete sub-portal interface (irreversible):
MCP two-step / CLI:
delete_sub_portalbash
pipefy portal sub-portal delete <SUB_PORTAL_UUID> --yes取消发布(保留子门户实体;访客失去访问权限):
MCP命令:
unpublish_sub_portal portal_uuid="<MAIN_PORTAL_UUID>" element_id="<FORMS_ELEMENT_ID>"CLI命令:
bash
pipefy portal sub-portal unpublish <MAIN_PORTAL_UUID> <FORMS_ELEMENT_ID>断开元素连接(破坏性操作;在MCP上预览/确认,在CLI上使用):
--yesMCP命令:
delete_sub_portal_element portal_uuid="<MAIN_PORTAL_UUID>" element_id="<FORMS_ELEMENT_ID>" confirm=false然后在确认后执行:。
confirm=trueCLI命令:
bash
pipefy portal sub-portal detach <MAIN_PORTAL_UUID> <FORMS_ELEMENT_ID> --yes删除子门户接口(不可逆):
MCP两步操作 / CLI命令:
delete_sub_portalbash
pipefy portal sub-portal delete <SUB_PORTAL_UUID> --yesMCP response shape
MCP响应格式
- Read tools return when
{ success: true, data: { ... } }is enabled (default). ParsePIPEFY_MCP_UNIFIED_ENVELOPEfordata,portals,pages, etc.subPortals - GraphQL/transport failures → — do not treat transport errors as success.
{ success: false, error: { message: "..." } } - on portal tools usually names
PERMISSION_DENIEDorcreate_portal. Re-check org id, token, and SAmanage_portals(see Confirm access).joinAsAdmin - Only is rewritten to the portal permission hint; other GraphQL codes surface as generic errors with the API message.
PERMISSION_DENIED - Destructive deletes: default returns a preview (
confirm=false); call again withrequires_confirmation: trueonly after explicit human approval.confirm=true
CLI prints the raw SDK payload (no wrapper).
--jsonsuccess- 当启用(默认)时,只读工具返回
PIPEFY_MCP_UNIFIED_ENVELOPE。解析**{ success: true, data: { ... } }**获取data、portals、pages等内容。subPortals - GraphQL/传输失败 → — 不要将传输错误视为成功。
{ success: false, error: { message: "..." } } - 门户工具上的**通常会指定
PERMISSION_DENIED或create_portal权限。重新检查组织ID、令牌和服务帐户的manage_portals**状态(查看写入前确认权限)。joinAsAdmin - 只有****会重写为门户权限提示;其他GraphQL代码会以包含API消息的通用错误形式显示。
PERMISSION_DENIED - 破坏性删除操作:默认**会返回预览(
confirm=false);仅在获得明确人工批准后再次调用并设置requires_confirmation: true**。confirm=true
CLI的参数会打印原始SDK负载(无包装)。
--jsonsuccessSuccess criteria
成功标准
- returns the org main portal (typically one row);
list_portalsreturns the same UUID on repeat.create_portal - shows expected
get_portal/pagesafter writes.elements - After , sub-portal exists in API but
create_sub_portaluntil publish.published: false - After publish: is
subPortals[].publishedand the main page shows the wiredtrueslot.forms - After unpublish: is
publishedwithout deleting the sub-portal entity (unless you calledfalse).delete_sub_portal - After layout/element edits on a disposable page, main portal pages used in production still open in the builder (no HTTP 500).
- 返回组织的主门户(通常一行);重复调用
list_portals返回相同的UUID。create_portal - 写入后,显示预期的
get_portal/pages。elements - 后,子门户存在于API中但
create_sub_portal,直到发布。published: false - 发布后:**为
subPortals[].published,且主页面显示已连接的true**槽。forms - 取消发布后:****为
published,且未删除子门户实体(除非调用了false)。delete_sub_portal - 在一次性页面上进行布局/元素编辑后,生产环境中使用的主门户页面仍能在构建器中打开(无HTTP 500错误)。
Failure modes
故障模式
| Symptom | Likely cause | Recovery |
|---|---|---|
| Wrong org, missing | Same org as |
Reads OK, writes fail on | Token is human on org A, numeric id is org B | Align |
| Main deleted but org menu state remains | Delete orphan sub-portals; avoid raw |
| Main page empty in builder | Portal created outside | |
| Expected | |
Many subs in | Sub-portals not published to | |
| Publish no effect | Wrong element type or skipped internal_api wire | |
| Linked under | Inspect |
| Interfaces instability on some orgs | |
| Portal viewer HTTP 500 | Orphan | Copy/fix layout from |
Nested | API rejected mutation | Read |
| Validation on element | Wrong metadata keys or partial update | Full metadata blob; |
| 症状 | 可能原因 | 恢复方法 |
|---|---|---|
写入时返回 | 错误的组织、缺少 | 使用与 |
读取正常,但在 | 令牌属于组织A的人类用户,数字ID是组织B的 | 将 |
| 主门户已删除但组织菜单状态仍保留 | 删除孤立子门户;避免使用原生 |
| 构建器中主页面为空 | 通过 | 使用 |
列表中缺少 | 预期行为 | 调用 |
| 子门户未发布到 | 为每个子门户 + |
| 发布操作无效果 | 错误的元素类型或跳过了internal_api连接 | 调用 |
| 在 | 检查 |
| 部分组织的Interfaces不稳定 | 从同一页面的现有小部件执行 |
| 门户查看器返回HTTP 500 | 孤立的 | 从 |
嵌套的 | API拒绝了变更操作 | 读取 |
| 元素验证失败 | 错误的元数据键或部分更新 | 发送完整的元数据Blob;根据类型使用 |
See also
另请参阅
- — endpoints, wire naming, maintainer introspection
docs/mcp/tools/portal.md - — verify Interfaces / internal_api mutations before changing tools
skills/introspection/pipefy-introspection/SKILL.md
- — 端点、连接命名、维护者自省
docs/mcp/tools/portal.md - — 在修改工具前验证Interfaces / internal_api变更操作
skills/introspection/pipefy-introspection/SKILL.md