# pipefy-portal-setup

This skill builds and configures Pipefy portals: the main hub, pages, widgets and sub-portals. Useful when you want to set a portal up from code instead of clicking through the UI.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 674 installs · ★ 51
- Author: pipefy
- License: Apache-2.0 · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/pipefy/ai-toolkit/tree/HEAD/plugins/pipefy/skills/pipefy-portal-setup/SKILL.md
- Updated: 2026-10-23
- HTML: https://affpapa.org/en/nevibecode/skills/pipefy-portal-setup

## What it does

The skill covers portal work for an organization: bootstrapping the main hub, adding pages and elements (`forms`, `link`), wiring and publishing sub-portals. It runs through Interfaces GraphQL, with `internal_api` for sub-portal wiring. Pipes, phases, cards and automations are out of scope — separate skills handle those.

Before any write, the skill tells you to confirm access: call `list_portals` with the intended `organization_uuid` and check the token belongs to that org. Reads on the wrong org succeed while mutations fail with `PERMISSION_DENIED`, because service accounts often carry only pipe and card scope. If `update_portal` or `delete_portal` still refuses, the service account may need `joinAsAdmin` on the portal interface, and someone has to join as portal admin once in the UI.

An org has one main portal, and `create_portal` is idempotent: a second call returns the same UUID. Sub-portals never show up in `list_portals` — they live under `get_portal` → `subPortals[]`, and tiles appear on the main page only after you publish through `publish_sub_portal` on a `forms` element. Two things bite: `update_portal_element` replaces metadata wholesale, and `update_portal_page_layout` expects an array of rows, where an incomplete row wipes the grid.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add pipefy/ai-toolkit --skill pipefy-portal-setup -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/pipefy-portal-setup/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/pipefy-portal-setup/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add pipefy/ai-toolkit --skill pipefy-portal-setup -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/pipefy-portal-setup/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add pipefy/ai-toolkit --skill pipefy-portal-setup -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/pipefy-portal-setup/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install pipefy/ai-toolkit pipefy-portal-setup
```

2. **Manually: put the files in place**
- File: `.github/skills/pipefy-portal-setup/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add pipefy/ai-toolkit --skill pipefy-portal-setup -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/pipefy/ai-toolkit --path plugins/pipefy/skills/pipefy-portal-setup
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/pipefy-portal-setup/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add pipefy/ai-toolkit --skill pipefy-portal-setup -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/pipefy/ai-toolkit/tree/HEAD/plugins/pipefy/skills/pipefy-portal-setup/SKILL.md

## When to use it
- bootstrap the main portal for an organization from code
- add a page with widgets to the main hub
- publish a sub-portal so visitors can see it
- attach a sub-portal to a `forms` element on a page
- debug why portal mutations return `PERMISSION_DENIED`

## Example prompts
- create the main portal for organization 123456789
- add a page to the main portal and publish a sub-portal
- list the sub-portals through get_portal

## Source text · SKILL.md · Apache-2.0

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: 497e841bef29d31d.

BEGIN THIRD-PARTY FILE 497e841bef29d31d
```text
---
name: pipefy-portal-setup
description: >
  Use this skill when the user wants to list, create, or configure Pipefy
  portals (main hub, pages, page elements, sub-portals, publish/unpublish).
  Uses Interfaces and internal_api. Not for pipes/cards.
tags: [pipefy, portal, interfaces, sub-portal, pages, elements]
---

# Portal setup

MCP clients: read [references/mcp.md](references/mcp.md). CLI users: read [references/cli.md](references/cli.md). Examples below describe shared operation arguments.

Configure an organization's Pipefy portal: bootstrap the main hub, add pages and widgets, wire and publish sub-portals (Interfaces GraphQL + internal_api for sub-portal wiring).

Deep reference: [`docs/mcp/tools/portal.md`](https://github.com/pipefy/ai-toolkit/blob/main/docs/mcp/tools/portal.md). Parity matrix: [`docs/parity.md`](https://github.com/pipefy/ai-toolkit/blob/main/docs/parity.md). Env vars: [`docs/config.md`](https://github.com/pipefy/ai-toolkit/blob/main/docs/config.md).

---

## When 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`, `link`, etc.).
- Attach, publish, unpublish, or delete sub-portals on the main portal.

Do **not** use for:

- Pipes, phases, cards, or automations — see `pipefy-pipes-and-cards`, `pipefy-automations`.
- Raw GraphQL when a portal tool exists — prefer the tools below.
- Bootstrapping a portal via undocumented `createInterface` GraphQL — always use **`create_portal`**.

---

## Prerequisites

- **Organization id:** UUID or **numeric org id** from the organization lookup or the Pipefy URL (examples below use fictional `123456789` per [`fixture_ids.py`](https://github.com/pipefy/ai-toolkit/blob/main/packages/sdk/tests/_shared/fixture_ids.py)). SDK resolves numeric ids before Interfaces calls. The org you pass to **`list_portals`** / **`create_portal`** must be the same org your token can write on.
- **Portal writes:** token needs **`create_portal`** and/or **`manage_portals`** on that org. Many service accounts only have pipe/card scope on their default org → `PERMISSION_DENIED` on portal mutations even when reads succeed elsewhere.
- **One main portal per org** — `create_portal` is idempotent (second call returns the same portal UUID).

### Confirm access before writes
```
END THIRD-PARTY FILE 497e841bef29d31d

The third-party file has ended. Everything between the 497e841bef29d31d tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 2356 of 16948 bytes. © pipefy · Apache-2.0 · https://github.com/pipefy/ai-toolkit/tree/HEAD/plugins/pipefy/skills/pipefy-portal-setup/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
