Releases: pipefy/ai-toolkit
Release list
v0.3.0-alpha.1
[0.3.0-alpha.1] - 2026-07-04
Added
- MCP: opt-in OAuth 2.0 resource-server profile for the
remoteHTTP profile. SettingPIPEFY_MCP_RS_RESOURCE_SERVER_URLactivates it (no separate enable flag): the server validates an inboundAuthorization: Beareron every request (RS256 against the issuer's JWKS, issuer and expiry, optional audience), serves RFC 9728 protected-resource metadata, and returns401with aWWW-Authenticatechallenge on a missing or invalid token. Token-validation knobs live inpipefy_auth.JwtValidationSettings(PIPEFY_JWT_ISSUER_URL, which defaults to the login issuer, plusPIPEFY_JWT_AUDIENCE/PIPEFY_JWT_VERIFY_AUDIENCE/PIPEFY_JWT_JWKS_URI); resource identity (PIPEFY_MCP_RS_RESOURCE_SERVER_URL,PIPEFY_MCP_RS_REQUIRED_SCOPES) stays inpipefy_mcp.ResourceServerSettings;PIPEFY_ALLOW_INSECURE_URLScovers both. The stdio profile is unchanged. Closes #301. - MCP: the
remoteresource-server profile now acts on behalf of the validated caller (#302). An app-scoped runtime owns one shared client, and each request resolves its identity from its own inbound bearer (read from the request context), so one server serves concurrent callers as themselves rather than as a single startup identity. Credential resolution and its fail-fast move to the composition root (McpRuntime.for_profile/StartupIdentity.from_configured_credential); the stdio profile still runs as the one credential resolved at startup. Closes #302. - SDK / MCP / CLI / auth: outbound Pipefy requests now carry client-identifying telemetry headers so the API can attribute traffic by surface and version. The GraphQL path (public, Interfaces, and Internal API endpoints) sends
User-Agent: pipefy-sdk/<version> (<surface>),X-Client-Name: <surface>, andX-Client-Version: <version>, where<surface>ismcp,cli, orsdk. The surface is stamped programmatically at each entry point's composition root: the MCP server passesmcp, the CLIcli, and direct SDK use keeps thesdkdefault. It is aPipefyClientconstructor argument rather than configuration, so it is never read from env or TOML and a caller cannot forge it. OAuth requests to the sign-in host carryUser-Agent: pipefy-auth/<version>,X-Client-Name: auth, andX-Client-Version, identifying the auth component rather than an API surface. The header builder lives inpipefy_infra.telemetryso the SDK and auth packages share oneUser-Agentformat. Closes #336.
Changed
- SDK: PyPI distribution renamed from
pipefy-sdktopipefy(the previous name is refused by PyPI as too similar to the unrelatedpipefysdk). The import package is unchanged (pipefy_sdk); update installs and--with/uv add/pip installreferences accordingly. The distribution now builds aspipefy-<version>-*.whl. - MCP (breaking): replaced the
--remotelaunch flag with two explicit, orthogonal flags:--profile {local|remote}(envPIPEFY_MCP_PROFILE) and--transport {stdio|http}(envPIPEFY_MCP_TRANSPORT). ThePIPEFY_MCP_REMOTE_MODEenv var and theMcpSettings.remote_modefield are removed; the default-deny remote-safe tool surface now followsprofile == "remote".local(default) registers every tool;remoteexposes only the remote-safe surface and validates an inbound bearer per request when a resource-server URL is set. Transport defaults from the profile (local->stdio,remote->http) and can be set explicitly to runlocalover loopback HTTP;remoteover stdio is rejected (a per-request bearer has no stdio equivalent). The launch flags are resolved and validated once at startup by the newresolve_mcp_settingscomposition root, so argv outranksPIPEFY_MCP_*. Theremoteprofile acts on behalf of the validated caller (see the request-scoped identity entry under Added);localruns as the one credential resolved at startup. - SDK: services now receive GraphQL execution through their constructor instead of inheriting it. A narrow
GraphQLExecutorprotocol is the seam;HttpxGraphQLExecutor(formerlyBasePipefyClient) is the only httpx/gql adapter, andPipefyClientbuilds one executor per endpoint viabuild_executorsand injects them. Tests inject a fake executor rather than monkeypatchingexecute_query. - SDK (breaking): the
InternalApiClientclass and itspipefy_sdkexport are removed; the internal endpoint is now anHttpxGraphQLExecutorconfigured withinternal_api_urland the[code=…][correlation_id=…]error formatter (build it viabuild_executors(settings, auth).internal). Service constructors no longer takeauth, andRelationService/PortalService/MemberService/WebhookService/PipeConfigServicenow require their collaborators (no self-construct fallbacks). - SDK:
PipefyClientnow constructs its internal API client during__init__(built from the samesettingsandauthas every other endpoint client), soPipefyClient(settings, auth=...)is fully wired after construction. Theset_internal_api_clientmethods onPipefyClientandPortalServiceare removed; pass the internal API client through thePortalServiceconstructor when composing it directly. ThePipefyClient.internal_api_availableproperty is also removed: the internal API client is always present, so the property was alwaysTrue. - Auth (breaking):
resolve_pipefy_authnow returns aResolvedAuthsum type (StaticTokenAuth | ServiceAccountAuth | StoredSessionAuth) instead of anhttpx.Auth. It parses the credential precedence chain into the tier that won, carrying that decision in the returned type: pattern-match orisinstanceon the variant to branch on the tier and reach its fields. The newbuild_httpx_auth(resolved)constructs the transporthttpx.Authand is total over the sum. Callers that want the auth object in one step composebuild_httpx_auth(resolve_pipefy_auth(...)). - Plugin (Claude Code): renamed the OAuth slash command from
/loginto/pipefy-login(commands/login.md→commands/pipefy-login.md, frontmattername: pipefy-login). The oldname: loginclaimed the/logintrigger and shadowed Claude Code's built-in/login(Claude account sign-in): selecting the built-in entry in the command picker still ran the Pipefy command, so Claude login was unreachable via/loginwhile the plugin was installed. Closes #331.
Removed
- Auth (breaking): removed the unused
CallableBearerAuthhttpx adapter and itspipefy_authexport. It had no production construction site;RefreshableBearerAuthalready covers the per-request-provider behaviour (re-calling the token provider each request) plus the 401 refresh-and-retry the stored-session path needs. - Auth (breaking): removed
pipefy_auth.tier_forand the internal_TIER_BY_AUTH_TYPEreverse-lookup table. They recovered a tier name from a builthttpx.Authbyisinstance; theResolvedAuthvariants returned byresolve_pipefy_authnow carry the tier in their type, so branch on the variant (isinstance/match) instead. - SDK / MCP / CLI (breaking): retired the
PIPEFY_SERVICE_ACCOUNT_IDSenv var and theservice_account_idssetting (and its TOML key). This drops the advisory features it fed: the guard that blockedremove_member_from_pipefrom removing a configured service account, theset_rolewrite-permission warning, and the proactive cross-pipe membership check invalidate_ai_agent_behaviors. The Pipefy API still authorizes every mutation, so removing a service account is recoverable via the Pipefy UI, and the cross-pipe membership requirement now surfaces as a barePERMISSION_DENIEDat call time (recover withget_pipe_members+invite_members). The field was an advisory, single-tenant shadow of a missing platform attribute and had no place in the remote multi-user profile.
v0.2.0-beta.4
[0.2.0-beta.4] - 2026-06-19
Added
- SDK / MCP / CLI:
create_cardaccepts optionalphase_idand passestitleon GraphQLCreateCardInput(mutationcreateCard(input: $input)). MCP: interactivephase_idelicits start-form fields; non-emptyfieldsare filtered againstget_phase_fields(phase_id)andget_start_form_fields(pipe_id); agent seeding should setskip_elicitation=true. CLI:pipefy card create <pipe_id> --phase-id <id>(optional--title; emitstitle_warningwhen the API overrides the requested title). - MCP / CLI:
get_phase_allowed_move_targetslists valid destination phases formove_card_to_phase(GraphQLphase.cards_can_be_moved_to_phases). MCP returns normalized{phase_id, phase_name, allowed_phases}; CLI:pipefy phase targets <phase_id>. - SDK / MCP / CLI:
get_phase_cards_countreads nativePhase.cards_count(MCP/CLI return{phase_id, phase_name, cards_count}viaget_phase).get_phase_cardslists cards in a phase viaPhase.cardspagination (firstdefault 50,after, optional fields). CLI:pipefy phase count <phase_id>,pipefy phase cards <phase_id> --first --after. - SDK / MCP / CLI:
get_pipeselectscards_counton each workflow phase inphases[](start-form intake stays onstart_form_fields). - SDK / MCP / CLI: report create/update/export paths preflight
filteras nestedReportCardsFilter(operator+queries) in the SDK before GraphQL; reject naive top-level keys such ascurrent_phase; coerce integervaluescalars to strings. MCP and CLI surface the same error; CLI rejects invalid filters before auth.
Changed
- SDK / MCP / CLI (label color):
create_labelandupdate_labelvalidatecoloras hex#RGBor#RRGGBBin the SDK before GraphQL (e.g.redis rejected withexpected #RGB or #RRGGBB hex color, received 'red'). CLI rejects invalid color before auth. - Docs / install: canonical GitHub repository is
pipefy/ai-toolkit. Install snippets,install.sh, MCP setup links, Claude plugin metadata, and.mcp.jsonnow point atgithub.com/pipefy/ai-toolkit(GitHub may still redirect older URLs). - SDK: GraphQL
HTTPXAsyncTransportnow setsverify=Trueexplicitly to pin TLS verification on, independent of httpx's default. - Deps: upgraded
pydanticto 2.13.4 (pydantic-core2.46.4,pydantic-settings2.14.1) across workspace packages. - Deps: upgraded
gql[httpx]to 4.0.0;gql()constants areGraphQLRequestobjects (use.documentfor AST introspection in tests).
v0.2.0-beta.3
[0.2.0-beta.3] - 2026-06-03
Fixed
- SDK / MCP / CLI: AI automation create and update no longer require service-account credentials.
generate_with_aicreate/update were routed through the/internal_apiendpoint and gated behind a service-account check, so a normal user session (stored session frompipefy auth login, or a--tokenbearer) could not create or update an AI automation, which broke install flows that provision an AI triage automation. Both now go through the publiccreateAutomation/updateAutomationmutations under the caller's normal auth, matching the read, list, and delete paths. Closes #272.
Changed
- SDK: the AI automation surface moved from
AiAutomationServicetoAutomationService.create_ai_automation/update_ai_automation, mirroring the existingcreate_send_task_automationpattern.AiAutomationService,ai_automation_queries.py, theai_automation_availableproperty, andset_ai_automation_serviceare removed;PipefyClientdelegates toAutomationService.InternalApiClientstays (still used bydelete_card_relation).
v0.2.0-beta.2.dev1
[0.2.0-beta.2.dev1] - 2026-06-02
Snapshot of dev HEAD ahead of v0.2.0-beta.2. See [Unreleased] above for the cumulative change list.
v0.2.0-beta.2
[0.2.0-beta.2] - 2026-06-02
Added
- MCP / CLI / SDK:
get_automation_event_attributeslists officialfield_map.valuetokens;create_automationpreflightsfield_mapdestinationfieldIdvalues (numericinternal_idonaction_repo_id) andcard_moved+move_single_cardtransitions before GraphQL. Skill anddocs/mcp/tools/automations-and-ai.mddocument create-only preflight and text-only move-transition errors (recovery via error message orget_phase_allowed_move_targets, not avalid_destinationsenvelope field). - Installer: new POSIX
install.shat the repo root. One command installs the CLI + MCP server viauv tool install(resolving the latest GitHub Release tag via the GitHub API and discovering the wheel assets directly, no hardcoded package list), optionally adds skills vianpx skills add, and writes the MCP server registration into the user's chosen client config (Cursor / Claude Desktop / Codex / Claude Code / none-mode print). Flags:--yes,--no-skills,--client <id>,--version <tag>,--prefix <dir>,--allow-root,--dry-run,--help. After install,pipefy-mcp-serveris on PATH so client configs collapse to{"command": "pipefy-mcp-server"}. shellcheck-clean. Closes #231. - SDK / Auth: shared filesystem-backed configuration via
~/.config/pipefy/config.toml(%APPDATA%\pipefy\config.tomlon Windows; honoursXDG_CONFIG_HOMEand aPIPEFY_CONFIG_FILE=<path>override). Top-level TOML keys map to pydantic field names onAuthSettingsandPipefySettings; precedence isinit kwargs > env > .env > config.toml > defaults. The newpipefy-infraworkspace package owns the loader (a schema-agnosticPydanticBaseSettingsSourcesubclass) and the path-discovery helpers; SDK and Auth depend on it symmetrically — neither imports the other. Seedocs/config.mdfor the schema. - CLI:
pipefy auth status [--json|-j]— reports auth source, identity, session expiry, and exit codes. - CLI:
pipefy auth logout— revokes the refresh token at the IdP and clears the stored session. - Auth:
AuthSettings.auth_urlnow defaults to the Pipefy production IdP whenPIPEFY_AUTH_URLis unset — removes the previousPIPEFY_AUTH_URL is requiredexit-2 friction onpipefy auth login/pipefy auth logoutand wires the MCP stored-session tier automatically afterpipefy auth login. Override by settingPIPEFY_AUTH_URL=<url>to a non-prod IdP. Closes #233. - Auth / CLI / MCP: opt-out for the keychain-backed stored-session tier.
PIPEFY_DISABLE_STORED_SESSION=1(ordisable_stored_session=trueinconfig.toml) makesAuthSettings.to_oidc_client()returnNone: tier resolution skips the keychain entirely (no backend discovery, noload_sessionprobe), andpipefy auth login/pipefy auth logoutrefuse with exit code 2.PIPEFY_KEYCHAIN_BACKEND=file(orkeychain_backend = "file") swaps the activekeyringbackend tokeyrings.alt.file.PlaintextKeyringwriting under~/.config/pipefy/keyring.cfg(%APPDATA%\pipefy\keyring.cfgon Windows). Unblocks headless Linux without Secret Service and CI runners; the file stores credentials in plaintext on disk, so it's opt-in only. Closes #237. - SDK / Auth: introduced
PIPEFY_BASE_URL(defaulthttps://app.pipefy.com) that drives the four API endpoints (graphql_url,internal_api_url,interfaces_graphql_url,service_account_url) as pydantic@computed_fieldproperties. Operators on non-prod environments setPIPEFY_BASE_URL=<host>once and all four endpoints follow. The OIDC issuer (PIPEFY_AUTH_URL, defaulthttps://signin.pipefy.com/realms/pipefy) remains a separate full-URL field because non-prod realm names don't follow a derivable convention. Closes #238. - MCP: stored-session tier wired into
ServicesContainer; settingPIPEFY_AUTH_URLafterpipefy auth loginnow lets the MCP server reuse the keychain-backed session, with the refresh pre-warmed at startup so a stale or revoked session surfaces before the first tool call. - Auth: reactive refresh-on-401 for the stored-session tier (
RefreshableBearerAuth). When an API call returns 401, the SDK transport forces a refresh viaensure_fresh_session(force=True), persists any rotated tokens, and retries the request once before surfacing the error. Complements the eager refresh path for IdP-side revocation and mid-process token expiry. Closes #137.
Changed
- SDK / MCP / CLI: renamed the two service-account credential env vars for clarity and to remove the one-letter footgun against
PIPEFY_AUTH_URL(interactive user-login issuer):PIPEFY_OAUTH_CLIENT→PIPEFY_SERVICE_ACCOUNT_CLIENT_ID,PIPEFY_OAUTH_SECRET→PIPEFY_SERVICE_ACCOUNT_CLIENT_SECRET.PIPEFY_OAUTH_URLis dropped without a renamed counterpart — the OAuth token endpoint now derives fromPIPEFY_BASE_URL(see the Removed section). Closes #127. - MCP / CLI: attachment uploads accept
file_pathonly (local filesystem path, with~expansion).file_urlandfile_content_base64are both gone — the MCP server runs as a local subprocess of the user's agent runtime, so any path the user can read is a valid source, and agents that hold generated bytes write them to a temp file and pass the path.file_nameis optional (basename inferred from the path). The SDK exposes a singleclient.upload_attachment(attachment, organization_id=..., target=...)method backed byAttachmentService.upload_attachment, which owns the full choreography (file read → presigned URL → S3 PUT → field update) and enforces the 100 MiB cap as part of its internalLocalFile.read. Per-step wire helpers (create_presigned_url,upload_file_to_s3,extract_storage_path) are private toAttachmentService; the S3 PUT step is dispatched via an injectableS3Uploaderprotocol (HttpxS3Uploaderis the default). Domain types:pipefy_sdk.Attachment(path-based, no upload methods),CardTarget/TableRecordTargetvalue objects, plus theAttachmentUploadError/AttachmentUploadResult/AttachmentUploadSteptypes previously inattachment_upload. Seepackages/mcp/AGENTS.mdfor theGATED:SELF_HOSTEDconvention that marks where URL ingestion would return under a future self-hosted profile. - Infra:
pipefy_infra.securitywidens the literal-IP / DNS-result blocklist to include multicast (224.0.0.0/4), reserved (240.0.0.0/4), and unspecified (0.0.0.0,::) ranges in addition to the prior private / loopback / link-local set. Error messages updated to enumerate the blocked categories explicitly. The widening relies on stdlibipaddress.IPv4Address.is_*/IPv6Address.is_*properties so IPv4-mapped IPv6 literals (::ffff:127.0.0.1) are also covered. - Infra:
security.validate_https_urlandsecurity.assert_url_is_host_rootno longer take aderived_paths_hintparameter. Callers wrap theValueErrorwith their own caller-specific context if needed; the helpers stay caller-agnostic. - Auth:
PIPEFY_KEYCHAIN_BACKENDenv / TOML values are now normalized with.strip().lower()soAUTO,File, etc. match theLiteral["auto", "file"]constraint instead of failing with a cryptic Literal-validation error. Previous behavior accepted only the exact lower-case spelling. - Auth:
PIPEFY_AUTH_URLnow rejects query strings and fragments (path is allowed for Keycloak-style realm URLs). Previously, onlyvalidate_https_url's scheme + literal-IP check ran onauth_url, so a stray?or#from operator copy-paste would pass settings construction and corrupt the downstream.well-known/openid-configurationconcatenation. - Infra:
security.assert_url_is_host_rootrejects repeated-slash paths (//,///) that the previous inlinepath.strip('/')check accepted. Deploy configs withPIPEFY_BASE_URL=https://app.pipefy.com//(extra slash) now fail at startup; trim to a single trailing slash or none. - Infra:
security.assert_hostname_resolves_to_public_ipsraisesValueErrorinstead of silently passing whensocket.getaddrinforeturns an empty address list.UnicodeErrorfrom IDN encoding (e.g. labels > 63 chars) is now caught alongsidesocket.gaierrorand surfaced as aValueErrorwith the sameCould not resolve hostnameshape. - Auth / SDK: every
PIPEFY_*env var is validated against a semantically meaningful pattern at settings construction. URL env vars (PIPEFY_BASE_URL,PIPEFY_AUTH_URL) requirehttps?://plus non-whitespace; credential fields (PIPEFY_TOKEN,PIPEFY_SERVICE_ACCOUNT_CLIENT_ID,PIPEFY_SERVICE_ACCOUNT_CLIENT_SECRET,PIPEFY_AUTH_CLIENT_ID) reject leading / trailing whitespace;PIPEFY_ORG_IDmust be an ASCII numeric string. There is no longer an empty-string opt-out for any tier — unset the variable to fall back to the default, or usePIPEFY_DISABLE_STORED_SESSION=1to turn the stored-session tier off explicitly (see the Added entry above). - SDK / MCP / CLI: renamed
--graphql-urlCLI flag to--base-urlto match the new env-var shape. - Install snippets: every
git+https://github.com/gbrlcustodio/pipefy-mcp-serverURL in the rootREADME.md,packages/mcp/README.md,packages/cli/README.md, the shipping.mcp.json, andcommands/install.mdnow pins@latest— a moving git tag the release flow updates to point at the most recent release. Users get release-stable installs by default;@v0.2.0-beta.1-style pins remain available for reproducibility. The release process documented inRELEASE.mdnow includesgit tag -f latest <version> && git push --force-with-lease origin latestas the step that rolls new installs forward.
Deprecated
- SDK: legacy
PIPEFY_OAUTH_*env vars still resolve to the newservice_account_*fields via an alias shim, with a one-shot stderr deprecation warning per legacy key. The aliases will be removed in a later0.2.0-beta.xrelease (carrying an explicit breaking-change callout). See [`...
v0.2.0-beta.1
[0.2.0-beta.1] - 2026-05-18
Monorepo Pipefy Labs public beta on the v0.2.0-beta.* line (GitHub Release + wheels only; no PyPI until v1.*). Tag v0.2.0-beta.1 matches __version__ in all workspace packages per RELEASE.md.
Added
- CLI: added MCP-parity commands for core workflow domains:
pipe,phase,
field,table,record,label,webhook,relation, andmember. - CLI: added post-v0.1 parity domains:
attachment,field-condition,
email,audit,automation,introspect,graphql,agent,
ai-automation,usage,report-pipe,report-org,export, andorg. - MCP / CLI: shared SDK facade covers attachment upload, automation
preflight, field-condition normalization, AI prompt and behavior validation,
report export streaming, and service-account guard helpers. - CLI:
pipefy skills listandpipefy skills show <name>for browsing the bundled
starter pack (8 high-impact Pipefy workflows), with YAML frontmatter parsing for
descriptions. - Skills:
skills/catalog with authoring guide, contributing rules, and
skills-lint.ymlCI (frontmatter, starter-pack bundle drift, MCP/CLI reference lint,
andpipefy skills listsmoke). - Docs:
docs/MIGRATION.mdcutover guide for existingpipefy-mcp-serverusers. - Tooling:
scripts/sync_starter_pack.pycopies canonical starter-packSKILL.md
files intopackages/cli/src/pipefy_cli/skills/; use--checkin CI or before release. - CLI: introduce
pipefy-cliworkspace package withpipefyentry point. - CLI:
pipefy card get <id>(mirrors MCPget_card) with--json/ Rich rendering. - CLI: OAuth client-credentials auth (
PIPEFY_OAUTH_*) and--token/PIPEFY_TOKENstatic bearer override; auth precedence flag > env >~/.config/pipefy/config.toml. - CLI:
--graphql-urland--allow-insecure-urlsglobal flags; same SSRF policy as MCP. - CLI: shell completion via
pipefy --install-completion bash|zsh. - SDK: optional
bearer_token=constructor onPipefyClientandStaticBearerAuthinbase_client(transport auth path used by the CLI--token/PIPEFY_TOKEN).
Changed
- Docs: MCP tool reference moved to
docs/mcp/tools/; addeddocs/README.md,docs/mcp/README.md,docs/cli/README.md, anddocs/sdk/README.mdas surface-oriented entry points.docs/setup.mdanddocs/parity.mdpaths unchanged for stable links. - SDK: PyPI distribution renamed from
pipefy-ai-sdktopipefy-sdk(import package remainspipefy_sdk). Update installs anduv add/pip installreferences accordingly. - CLI / MCP: Creating a traditional automation with
card_moved+move_single_cardruns SDK move-transition preflight first, returning a clear validation error when the destination phase is unreachable from the source phase (instead of opaque GraphQL failures). - Internal: repository reorganized as a uv workspace;
pipefy-mcp-serverdistribution and runtime behavior unchanged.
Fixed
- CLI:
pipefy agent updateresolves slug-stylefieldIdvalues in behaviors for error-path enrichment the same way as the happy path (viaPipefyClient.update_ai_agent), soRECORD_NOT_SAVEDdiagnostics do not falsely blame slug tokens as unknown pipe fields. - CLI / MCP:
field-condition create/updateaccept legacyactionId: "hidden"on condition actions; the SDK normalizes tohidebefore mutations. - SDK:
PipeConfigService.update_phase_fieldaccepts optionalphase_id/pipe_idand resolves a slug-likefield_idto the field'suuid(injected asinput.uuidwhile the slug stays asinput.id, matching Pipefy'sUpdatePhaseFieldInputcontract). The pipe-wide lookup runs phase fetches concurrently viaasyncio.gather; partial phase-fetch failures raise an actionableValueErrorinstead of returning an ambiguous match. Surfaced through MCPupdate_phase_field(phase_id=…, pipe_id=…)and CLIpipefy field update --extra '{"phase_id":"…"}'. - MCP:
delete_phase_fieldpreview now enumeratesdependents.field_conditionseven when the rule only references the field in expressionfield_address(not justactions[].phaseFieldId); the condition tree walker has a defensive depth cap of 16. - SDK / MCP:
PipefyClient.get_automation_logs_by_reposhort-circuits to an empty page when the pipe has no automations (was returningMULTIPLE_INVALID_INPUT: Automation_ids can't be blankfrom the API). - SDK / MCP:
invite_membersvalidates each row with a newMemberInvitePydantic model (EmailStr+ non-blankrole_name, lowercase normalization,extra="forbid") and raises a single-lineValueErrorpointing at the offending field. MCP surfaces it asINVALID_ARGUMENTS. - SDK:
ai_preflight.validate_ai_automation_prompt_sdkflags overlap when the same%{internal_id}appears both in the prompt and infield_ids, in English, citing the API rejection message. - MCP:
find_recordsreturns the unified envelopepagination={has_more, end_cursor, page_size}(snake_case) when the unified envelope flag is on, matchingget_table_records. - MCP / CLI docs:
create_card,create_table_record,clone_pipe, andcreate_field_conditiondocstrings clarify title-derivation quirks, async clone phases, and thephaseFieldIddiscovery path. - SDK:
MemberInvitelives atpipefy_sdk.MemberInvite(re-exported in the top-level__all__);slug_like_field_token/looks_like_uuid_tokenextracted topipefy_sdk.utils.field_tokensfor reuse across services.
Removed
Public beta: 128 MCP tools for Pipefy
Public beta of the Pipefy MCP server — an open-source Model Context Protocol server that lets AI agents drive end-to-end Pipefy workflows (pipes, cards, tables, relations, reports, automations, AI agents, observability, and more).
🧪 Beta · pre-release, built in public. Community project for developer workflows — not Pipefy's official or supported integration for external enterprise use. The tool surface is feature-complete for this milestone, but names/arguments/response shapes may still change before the stable
v0.1.0.
Feedback & issues: https://github.com/gbrlcustodio/pipefy-mcp-server/issues · dev@pipefy.com
Highlights
- 128 MCP tools across nine surface areas (canonical names in
PIPEFY_TOOL_NAMES,src/pipefy_mcp/tools/registry.py): - Pipes & cards (37) · Database tables (17) · Relations (8) · Reports (17)
- Automations & AI (22) · Observability (10) · Members, email & webhooks (11)
- Organization (1) · Introspection (5)
- Agent-friendly responses: unified success envelope and shared pagination bounds on list/search tools; structured error envelopes (
INVALID_ARGUMENTS, enriched GraphQL errors) across domains. - Safer writes: destructive-action previews with dependents (labels, phases, phase fields), two-step deletes, and MCP elicitation for confirmation flows.
- Schema introspection tools with depth control and raw GraphQL execution for advanced agent reasoning.
- Attachment uploads for cards and table records via presigned S3.
- Field slug → numeric ID resolution for AI agent behaviors, so agents can author behavior metadata using human-readable slugs.
- Authentication via Pipefy Service Account OAuth2 (httpx-auth), shared across GraphQL and direct HTTP clients.
- Parallel-safe transport: per-request GraphQL transport so concurrent tool calls don't share a single connection.
- Configurable client timeout on the Pipefy HTTP client.
find_cardstool plusinclude_fieldsonget_card/get_cardsfor field-rich reads when agents need them.update_comment/delete_commentcard-comment tools.
Getting started
- Python 3.11+ and a Pipefy Service Account Token (Admin Panel → Service Accounts)
uv sync·cp .env.example .env· or run./bootstrap.sh- MCP client setup (Cursor / Claude Desktop / Claude Code): see
docs/setup.md - Tool reference: per-category docs under
docs/tools/and cross-cutting rules indocs/tools/cross-cutting.md
Known limitations
- Beta surface — tool names, arguments, and response shapes may still receive breaking changes before the stable
v0.1.0cut. Pin the tag if you need stability while we collect feedback. - Complex Pipefy field types may need agent-side mapping help; please open an issue with the field type and pipe context if you hit one.
Contributing
We're building this in public and beta feedback is exactly what we need — new-tool requests, field-mapping reports, and bug reports very welcome. See the "Contributing" section in the README.
Full changelog: https://github.com/gbrlcustodio/pipefy-mcp-server/commits/v0.1.0-beta