update_view_filters
Update the filter configuration of an Airtable view. Supports AND/OR conjunctions, nested filter groups, and Airtable's internal filter operators for precise record filtering.
Instructions
Update the filter configuration of a view. Supports AND/OR conjunctions, nested filter groups, and Airtable's internal filter operators.
FILTER FORMAT: Leaf filter: { columnId: "fldXXX", operator: "", value: } Nested group: { type: "nested", conjunction: "and"|"or", filterSet: [...] } Clear filters: { filterSet: [], conjunction: "and" } (or pass filters: null)
Filter IDs (flt-prefixed) are auto-generated — do NOT include them.
OPERATORS by field type — verified against Airtable's internal API (2026-04-17 capture; user report 2026-04-30):
Text / URL / Email / Phone:
"=" (exact match — value: string)
"!=" (not equal)
"contains" (value: string)
"doesNotContain"
"isEmpty" / "isNotEmpty" — input-side; auto-rewritten to "=" / "!=" "" before sending (the internal API rejects them on text fields with FAILED_STATE_CHECK)
Number / Percent / Currency:
"=", "!=", "<", ">", "<=", ">=", "isEmpty", "isNotEmpty"
Single select:
"=" (value: "selXXX" — the choice ID, NOT the choice name)
"!="
"isAnyOf" / "isNoneOf" (value: ["selXXX", "selYYY"] — array of choice IDs)
"isEmpty" / "isNotEmpty"
Multiple select:
"hasAnyOf", "hasAllOf", "hasNoneOf", "isExactly", "isEmpty", "isNotEmpty"
Checkbox:
"=" (value: true|false)
Date (absolute):
"is", "isBefore", "isAfter", "isOnOrBefore", "isOnOrAfter", "isEmpty", "isNotEmpty"
value: ISO date string e.g. "2026-01-15"
Date (relative) — "isWithin":
value: { "mode": "", "timeZone": "", "shouldUseCorrectTimeZoneForFormulaicColumn": true }
timeZone: IANA string e.g. "Europe/Istanbul", "America/New_York", "UTC"
Modes (no numberOfDays): "pastWeek", "pastMonth", "pastYear",
"nextWeek", "nextMonth", "nextYear",
"thisCalendarMonth", "thisCalendarYear"
Modes (add numberOfDays key): "pastNumberOfDays", "nextNumberOfDays"
Example — past week: { "operator": "isWithin", "value": { "mode": "pastWeek", "timeZone": "UTC", "shouldUseCorrectTimeZoneForFormulaicColumn": true } }
Example — past N days: { "operator": "isWithin", "value": { "mode": "pastNumberOfDays", "numberOfDays": 7, "timeZone": "UTC", "shouldUseCorrectTimeZoneForFormulaicColumn": true } }
Example — this month: { "operator": "isWithin", "value": { "mode": "thisCalendarMonth", "timeZone": "UTC", "shouldUseCorrectTimeZoneForFormulaicColumn": true } }
Formula / Lookup / Rollup (text result type):
Same as Text. "isEmpty" / "isNotEmpty" are auto-rewritten to "=" / "!=" "".
Linked record (foreignKey):
"contains" (value: linked record name) works.
"isEmpty" / "isNotEmpty" do NOT work — the call throws a clear error directing
you to a helper formula like IF(LEN({Linked} & "")>0,"yes","") and a "=" / "!=" filter on that helper.
AUTO-NORMALIZATION (applied client-side before the request):
"is" → "=" (the internal API does not recognize "is")
"isNot" → "!="
"isAnyOf" with a single-element array or scalar value → "=" with scalar value
"isEmpty" → "=" "" on text / formula(text) / lookup(text) / rollup(text) fields
"isNotEmpty" → "!=" "" on text / formula(text) / lookup(text) / rollup(text) fields For single-select, value must be the choice ID (selXXX) — use get_base_schema to find IDs.
NESTING LIMIT:
The internal API accepts at most 2 levels of nesting (top conjunction + one
layer of nested groups). Deeper trees are rejected with FAILED_STATE_CHECK.
Workaround: flatten by repeating shared conditions inside each leaf group,
e.g. (A AND B) OR (A AND C) instead of A AND (B OR C) if you need
another nested AND inside the OR. The error message returned by this tool
flags depth-related failures explicitly.
EXAMPLES: Text equals: { filterSet: [{ columnId: "fldXXX", operator: "=", value: "Prime" }], conjunction: "and" } SingleSelect equals: { filterSet: [{ columnId: "fldXXX", operator: "=", value: "selABC123" }], conjunction: "and" } Text contains: { filterSet: [{ columnId: "fldXXX", operator: "contains", value: "hello" }], conjunction: "and" } Number range: { filterSet: [{ columnId: "fldX", operator: ">=", value: 10 }, { columnId: "fldX", operator: "<=", value: 100 }], conjunction: "and" } Nested (a AND (b OR c)): { filterSet: [{ columnId: "fldA", operator: "contains", value: "x" }, { type: "nested", conjunction: "or", filterSet: [{ columnId: "fldB", operator: "=", value: 1 }] }], conjunction: "and" }
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | The Airtable base/application ID | |
| viewId | Yes | The view ID to update filters on (e.g. "viwXXX") | |
| filters | Yes | Filter configuration object with filterSet array and conjunction. See tool description for format and examples. | |
| operation | No | How the given filters interact with existing filters. "replace" (default) overwrites; "append" adds the provided filterSet entries to the existing top-level filterSet (useful when you only want to add conditions without rewriting the whole filter payload). | |
| debug | No | When true, include raw Airtable response in output for diagnostics |