Database Tables
Tables, records (rows), schema columns (table fields), and attachments for Pipefy Database Tables. 17 MCP tools.
Cross-cutting patterns
- Same conventions as pipe building:
introspect_typeon inputs such asCreateTableFieldInput/UpdateTableFieldInput,debug=trueon mutations. - Pagination:
get_table_recordsandfind_recordssupportfirst/after. With the unified MCP envelope, read top-levelpagination.has_moreandpagination.end_cursor(andpagination.page_size) and passafter=end_cursorfor the next page (default page size is 50). find_recordsover paginatedget_table_recordswhen you know the field value. Onefind_recordscall with acolumn_id/search_valuefilter beats N pages ofget_table_records.- Legacy mutation envelope. Several table mutation tools still return the GraphQL operation name as a nested key under
result(for exampleresult.createTableRecord). Read the payload inside that key; shape may differ from tools that already use the unified envelope.
Table operations
| Tool (MCP) | CLI | Read-only | Purpose |
|---|---|---|---|
get_tables |
pipefy table list |
Yes | List database tables by org. |
search_tables |
pipefy table list --search |
Yes | Search tables by name. |
get_table |
pipefy table get <id> |
Yes | Table metadata and field schema. |
create_table |
pipefy table create |
No | Create a new database table. |
update_table |
pipefy table update <id> |
No | Rename or change settings. |
delete_table |
pipefy table delete <id> |
No | Two-step destructive. |
Table field (schema column) operations
| Tool (MCP) | CLI | Purpose |
|---|---|---|
create_table_field |
pipefy table field create <table_id> --label <name> --type <type> |
Add a column to a table schema. |
update_table_field |
pipefy table field update <field_id> --table <table_id> --label <name> |
Rename or change column settings (--description, --required, --options). |
delete_table_field |
pipefy table field delete <field_id> --table <table_id> |
Two-step destructive. Requires table_id. |
Record operations
| Tool (MCP) | CLI | Read-only | Purpose |
|---|---|---|---|
get_table_records |
pipefy record find --table <id> |
Yes | Paginated list of all records in a table. |
find_records |
pipefy record find --filter |
Yes | Filter records by field value (JSON filter) — preferred over paginating get_table_records. |
get_table_record |
pipefy record get <id> |
Yes | Single record with all populated field values. |
create_table_record |
pipefy record create |
No | Add a row to a table. |
update_table_record |
pipefy record update <id> --fields ... |
No | Update one or more field values on a row. |
set_table_record_field_value |
pipefy record update <id> --field-id <slug> --value <json> |
No | More targeted single-field update than update_table_record. |
delete_table_record |
pipefy record delete <id> |
No | Two-step destructive. |
Attachment uploads
| Tool (MCP) | CLI | Purpose |
|---|---|---|
upload_attachment_to_table_record |
pipefy attachment upload --record <id> --field <slug> --file <path> --organization <id> |
Attach a file to a table record. Exactly one source: file_path (local; local profile only) or file_url (downloaded, SSRF-guarded; any profile — required on the hosted server). CLI is --file only. See pipefy-attachments. |
Steps — find and update a record
Get table ID (if not known):
MCP:
get_tables organization_id=123CLI:
pipefy table listFind the record (use
find_records, not pagination):MCP:
find_records table_id=456 filter='{"column_id":"email","search_value":"user@example.com"}'CLI:
pipefy record find --table 456 --filter '{"column_id":"email","search_value":"user@example.com"}'Update one field (targeted):
MCP:
set_table_record_field_value record_id=789 field_id="status" value="Active"CLI:
pipefy record update 789 --field-id status --value '"Active"'Update multiple fields:
MCP:
update_table_record record_id=789 node_fields='[{"field_id":"status","field_value":"Active"}]'CLI:
pipefy record update 789 --fields '{"status":"Active"}'
Two-step destructive previews
Always call without confirm=true first, surface the preview (including confirmation_token) to the user, then call again with confirm=true and that token after explicit approval. CLI uses --yes (no token). Preview content per tool:
delete_table— show table name, field count, and record count. Deleting a table destroys all rows and schema.delete_table_record— show record title and key field values so the user can identify which row will vanish.delete_table_field— show field name and type; warn explicitly that all column data will be permanently lost.
Never delete in a single call.
Success criteria
get_table_recordsreturns the created/updated records with correct field values.- Schema changes reflect immediately in
get_table.
Failure modes
get_table_record/get_table_recordsomit empty fields. Records only return populated fields, so you cannot tell "field unset" from "field doesn't exist" without callingget_tablefor the full schema.create_table_recordtitle silently overridden. When the first table field is a start-form-style label column, Pipefy uses that field's value as the recordtitle, ignoring thetitleparameter. Don't rely ontitleif the first field auto-populates a label-like column.create_table_fieldrejects type: callintrospect_type type_name="CreateTableFieldInput"for valid field types.find_recordsreturns empty: check thatcolumn_idmatches a field's ID (not label) fromget_table.- Pagination cursor expired: re-fetch from the beginning; cursors are short-lived.
See also
- skills/relations/pipefy-relations/SKILL.md — connect tables to pipes (and the table-relation ID namespace gotcha).
- skills/introspection/pipefy-introspection/SKILL.md — discover field input schemas.