You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
[0.3.0-beta.1] - 2026-07-20
Added
MCP: hosted structured logging on the HTTP transport (#373). Each HTTP request and each tool call emits one JSON line on stderr (event: http_request / tool_call) for hosted debugging, with a privacy allowlist (method, path, status, duration, caller identity, per-tool arg_keys (key names only, never argument values)). Request logging uses pure-ASGI middleware; tool logging uses the #378 tool-call middleware chain via the same structured emitter. The dedicated structured logger is pinned at INFO independently of PIPEFY_MCP_LOG_LEVEL (which governs FastMCP/root text only). Stdio is unchanged: stdout remains the JSON-RPC wire. HTTP is served via uvicorn with access_log=False so structured request lines replace uvicorn's text access log.
CLI: pipefy relation table list --ids <id,...> mirrors MCP get_table_relations (table-relation IDs, not database table IDs).
CLI: pipefy card fill <card_id> --phase <phase_id> --fields '{"…"}' fills phase fields non-interactively; filters to editable phase field IDs before update_card. Optional --required-only limits the phase field lookup to required fields. JSON responses may include skipped_field_ids when --fields keys are dropped by the filter.
SDK: pipefy_sdk.field_filters exports filter_editable_field_definitions, filter_fields_by_definitions, and skipped_field_ids for shared MCP/CLI field filtering.
MCP: the HTTP transport derives a configurable DNS-rebinding Host/Origin allowlist. FastMCP auto-enables a loopback-only allowlist on its 127.0.0.1 construction host, so behind a proxy that forwards the public Host the server answered 421 Misdirected Request before any handler ran; setting resource_server_url now widens the allowlist to that public host (plus loopback) and keeps DNS-rebinding protection on. PIPEFY_MCP_ALLOWED_HOSTS and PIPEFY_MCP_ALLOWED_ORIGINS (JSON) extend it for extra hostnames or a stricter Origin posture; an empty PIPEFY_MCP_ALLOWED_ORIGINS is the strictest form, rejecting any request that sends an Origin. Unset (no resource-server URL and no override) leaves FastMCP's loopback-only default in force, so the installed local subprocess case is unchanged. Closes #303.
Changed
MCP: the HTTP bind-safety guard now keys on auth posture, not bind interface. The old _assert_safe_http_bind refused any non-loopback HTTP bind, which false-positived on the entire hosted deployment (a container binds 0.0.0.0 and is still private) and lived in the run path, so a caller building the ASGI app directly bypassed it. It is replaced by McpSettings._enforce_bind_safety, a cross-field validator at the settings boundary that every serving path inherits: the unauthenticated local profile still refuses a non-loopback HTTP bind unless PIPEFY_MCP_ALLOW_INSECURE_HTTP_BIND is set, while the remote profile (which always carries inbound auth) binds any host without a bind-host check. Loopback detection moves to pipefy_infra.security.is_loopback_host, covering all of 127.0.0.0/8 and ::1 rather than three hardcoded string literals. Closes #379.
CLI / Plugin (Claude Code): the CLI install path now installs pipefy-cli from PyPI instead of a git+…#subdirectory=packages/cli reference with --with sibling pins. The /pipefy:install slash command runs uv tool install --force pipefy-cli, and the documented snippets (root README.md, packages/cli/README.md, docs/MIGRATION.md) use uvx --from pipefy-cli pipefy … / uv tool install pipefy-cli. PyPI resolves pipefy and pipefy-auth transitively, so the explicit --with flags are gone and installs no longer pay a git clone plus build. This matches the MCP server's PyPI install (#368); do not pass a global --prerelease allow, which would let transitive dependencies jump to their own pre-releases. RELEASE.md verification snippets move to PyPI accordingly, and the now-unused latest moving-tag release step is removed. Closes #234.