Hello everyone! I just noticed an MCP call from Claude to Fibery, which made the view creation go so much more smoothly, given that our own local skill for Fibery-tool-calling does NOT have all the details, and of course can become outdated very easily and quickly.
Fibery MCP Remote Skills
get_fibery_skill — Loads the full reference guide for a Fibery skill domain. The reasoning behind each tool’s input, syntax, configuration shapes, and workflow for a group of related tools. Called when a task spans a whole domain, for example, views creation.
Well done, wise concept and amazing implementation.
I debated with myself if I should have paste the request and response in full here, and finally decided that to show how amazingly useful the response is, I will. Honestly, very well done.
Request:
{
"skill": "views"
}
Response:
create_view reference
config shape depends on viewType. This document covers all view types, the FilterNode operator matrix, shared building blocks, cross-field rules, and worked examples.
Common pattern: call schema and schema_detailed first to get database and field names. The agent should consult this reference for any non-trivial view (filters, ordering, hierarchy, multi-database, dependencies, milestones, defaults).
When to pick which view type
- grid — default for tabular data with many visible fields; supports hierarchical grouping (
items[].groupBy)
- list — simple linear list; prefer grid unless explicitly asked
- board — kanban/swimlane workflows; X axis is required (relation or enum field on each database)
- timeline — items with a time span; supports milestones and dependencies
- calendar — items with a single date; month/week display
- map — items with a geographic location field
- feed — items with a document field rendered as the post body
- gallery — items with cover images for visual scanning
- gantt — time spans + hierarchy + dependencies (grid + timeline combined)
- embed — displays an external URL (e.g., Google Doc) inside Fibery.
- form — data entry, not visualization; defines fields with defaults/required/hidden
- document — standalone markdown; pass content via
content param, omit config
Common Config Building Blocks
FieldUnit
{"field": "Space/FieldName", "showCount": true}
field — Field name in "Space/Field" format, or special value "db-badge"/"db-badge-abbr" (entity badge column)
showCount (optional) — For collection fields, show count instead of the expanded list
SortConfig
{"field": "Space/Priority", "direction": "desc", "dateRangeSortBy": "start"}
direction — "asc" (default) or "desc"
dateRangeSortBy — "start" or "end"; only for date-range fields
ItemConfig
Shared base for items[] entries:
{
"database": "Space/Database",
"fields": [{"field": "Space/Name"}, {"field": "Space/Status"}],
"filter": <FilterNode>,
"orderBy": [{"field": "Space/Priority", "direction": "desc"}]
}
AxisConfig (board x/y, gallery y, timeline y, gantt y)
Extends ItemConfig with:
forDatabase — Which items[].database this axis applies to. MUST match an items[].database. For multi-database views, provide one axisConfig per items.database.
field — Relation or enum field on forDatabase. MUST be relation or enum, not a primitive.
database — Lookup database queried for axis values:
- For workflow state:
"workflow/state_<Space>/<Database>", e.g. "workflow/state_Software Development/bug"
- For relations grouping (e.g. group by user via assignees): the target entity database, e.g.
"fibery/user"
- Multi-database enum axes: each axisConfig gets its own lookup DB (only board/gallery/gantt support merged-enums)
- Multi-database relation axes: all axisConfigs MUST share the same
database
hideEmptyLanes (optional, default false) — Hide columns/rows with no items
FilterNode
Filters use a discriminated union on nodeType. Pick nodeType matching the field’s type. value is omitted for is-empty / is-not-empty operators.
| nodeType |
operators |
value |
text |
contains, does-not-contain, is, is-not, starts-with, ends-with, is-empty, is-not-empty |
string |
number |
equals, does-not-equal, greater-than, greater-than-or-equal, less-than, less-than-or-equal, is-empty, is-not-empty |
number |
bool |
is |
boolean |
date |
is, is-before, is-after, is-on-or-before, is-on-or-after, is-empty, is-not-empty |
"YYYY-MM-DD" string OR {amount, unit, isBeforeNow} |
location |
contains, does-not-contain, is-empty, is-not-empty |
string |
reference |
is, is-not, is-any-of, is-none-of, is-empty, is-not-empty |
array of entity UUIDs |
collection |
is-empty, is-not-empty, contains-any-of, contains-none-of, contains, does-not-contain, contains-me, does-not-contain-me (last two only for user collections) |
array of entity UUIDs |
single-select |
is, is-not, is-any-of, is-none-of, is-empty, is-not-empty |
array of option UUIDs |
workflow |
is, is-not, is-any-of, is-none-of, is-empty, is-not-empty |
array of state UUIDs |
multi-select |
is-empty, is-not-empty, contains-any-of, contains-none-of, contains, does-not-contain |
array of option UUIDs |
logical |
and, or (combine other filters) |
— |
Shape:
{"nodeType": "<type>", "args": {"fieldPath": ["Space/Field"], "operator": "<op>", "value": <value>}}
For date-range fields, wrap fieldPath with q/start or q/end:
{"fieldPath": ["q/start", "Space/Dates"]}
Logical (AND/OR):
{
"nodeType": "logical",
"args": {
"operator": "and",
"filters": [
{"nodeType": "workflow", "args": {"fieldPath": ["workflow/state"], "operator": "is-not", "value": ["<done-uuid>"]}},
{"nodeType": "number", "args": {"fieldPath": ["Space/Priority"], "operator": "greater-than", "value": 3}}
]
}
}
Relative date value (relativeDateInfo):
{"amount": 7, "unit": "day", "isBeforeNow": true}
unit ∈ year, quarter, month, week, day, hour, minute, second. isBeforeNow=true means N units ago; false means N units from now.
Config by view type
grid
{
"items": [
{
"database": "Space/Task",
"fields": [{"field": "Space/Name"}, {"field": "Space/Status"}],
"orderBy": [{"field": "Space/Priority", "direction": "desc"}],
"groupBy": {"parentIndex": 0, "parentField": "Space/SubTasks"}
}
],
"rowHeight": "medium",
"hideEmptyParentGroups": false
}
items[].groupBy — hierarchical nesting; parentIndex is the parent item’s index, parentField is a collection field on parent’s database whose relation targets THIS item’s database (must be one-to-many or many-to-many)
rowHeight — "short", "medium", "tall", "extra-tall"
list
Same shape as grid (no rowHeight).
board
{
"x": [{"forDatabase": "Space/Task", "field": "workflow/state", "database": "workflow/state_Space/Task", "fields": []}],
"y": [],
"items": [{"database": "Space/Task", "fields": [{"field": "Space/Name"}]}],
"cardSize": "comfortable"
}
x — required; one axisConfig per items[].database
y — optional; same cardinality rule as x if present
cardSize — "compact", "comfortable", "spacious"
timeline
{
"items": [{
"database": "Space/Task",
"fields": [{"field": "Space/Name"}],
"startDate": "Space/Dates",
"endDate": "Space/Dates",
"secondaryStartDate": "Space/ActualDates",
"secondaryEndDate": "Space/ActualDates",
"dependencyField": "Space/BlockedBy"
}],
"y": [],
"milestones": [{"database": "Space/Milestone", "dateField": "Space/Date"}],
"oneItemPerLane": false,
"dependencyDateShiftingMode": "none",
"dependencyDateShiftingAvoidWeekends": true
}
startDate / endDate — date or date-range field name. For date-range, both can be the same field name.
secondaryStartDate / secondaryEndDate — optional second bar (e.g. planned vs actual)
dependencyField — relation marking predecessor → successor. Must be marked as Dependency in the workspace UI (Field Settings → Dependency); plain relations fail with “is not a dependency field”. Surface this and ask the user to mark it; do not retry.
dependencyDateShiftingMode — "none", "consume-gap" (tighten when predecessor moves), "preserve-gap"
y — optional axis; if present, one axisConfig per items database
calendar
{
"items": [{"database": "Space/Event", "fields": [{"field": "Space/Name"}], "startDate": "Space/Date", "endDate": "Space/Date"}]
}
map
{
"items": [{"database": "Space/Office", "fields": [{"field": "Space/Name"}], "location": "Space/Location"}],
"style": "default"
}
location — must be a fibery/location field
style — "default", "muted", "satellite"
feed
{
"items": [{"database": "Space/Post", "fields": [{"field": "Space/Name"}], "post": "Space/Content"}],
"postWidth": "medium"
}
post — must be a Collaboration~Documents/Document field
postWidth — "narrow", "medium", "full"
gallery
{
"items": [{"database": "Space/Item", "fields": [{"field": "Space/Name"}], "cover": "Space/Image", "fillCover": true}],
"y": [],
"cardSize": "medium"
}
cover — must be a fibery/file field
fillCover — stretch image to fill card (defaults true)
cardSize — "compact", "medium", "full"
gantt
{
"items": [{
"database": "Space/Task",
"fields": [{"field": "Space/Name"}],
"laneFields": [{"field": "db-badge-abbr"}],
"groupBy": {"parentIndex": 0, "parentField": "Space/SubTasks"},
"startDate": "Space/Dates",
"endDate": "Space/Dates",
"dependencyField": "Space/BlockedBy"
}],
"milestones": [],
"oneItemPerLane": true,
"dependencyDateShiftingMode": "consume-gap",
"dependencyDateShiftingAvoidWeekends": true
}
Combines grid hierarchy (groupBy) with timeline mechanics. Same dependency-field caveat as timeline.
embed
{
"url": "https://www.example.com",
"compatibleMode": true
}
url - URL of the external page to embed
compatibleMode - Compatible mode is used for sites that block iframe embedding. Defaults to true
form
{
"database": "Space/Task",
"fields": [
{"field": "Space/Name", "displayName": "Task Name", "required": true},
{"field": "Space/Description", "displayName": "Description", "description": "Enter details"},
{"field": "Space/Priority", "displayName": "Priority", "defaultValue": {"id": "<priority-uuid>"}, "hidden": false}
]
}
defaultValue format depends on field type:
- text → string
- number → number
- bool → boolean
- date / date-time → ISO string
- date-range →
{"start": "YYYY-MM-DD", "end": "YYYY-MM-DD"}
- single-relation / single-select / workflow →
{"id": "<uuid>"}
- multi-relation / multi-select / collections →
[{"id": "<uuid>"}, ...]
- location →
{longitude, latitude, fullAddress, addressParts: {...}}
document
No config. Pass markdown via the content param at the top level.
Cross-field rules
- Multi-database axes: for every
items[].database, the corresponding axis array (x and/or y) MUST contain exactly ONE entry with forDatabase = items[].database. Missing entries fail with “Unable to find axis config for X”.
- Single-axis vs merged-enums: multiple databases on one axis works only if (a) all axisConfigs are enums (merged-enums; only board/gallery/gantt support this) or (b) all axisConfigs are relations sharing the same
database. Mixing enum + relation axes within one axis is an error.
- Axis field type: must be relation or enum on
forDatabase. Primitive fields are rejected.
groupBy.parentField: must be a collection (one-to-many or many-to-many) on items[parentIndex].database, and the relation must target this item’s database.
- Form
defaultValue type must match the actual field type (see formats above).
- Date fields in
startDate / endDate / secondaryStartDate / secondaryEndDate / milestone dateField must be of type fibery/date, fibery/date-time, fibery/date-range, or fibery/date-time-range.
dependencyField (timeline / gantt) must be a relation explicitly marked as Dependency in the workspace UI. Plain relations fail.
- Map
location must be fibery/location. Feed post must be Collaboration~Documents/Document. Gallery cover must be fibery/file.
Idiomatic patterns
- Date-range filtering: wrap fieldPath with
q/start or q/end, e.g. {"fieldPath": ["q/start", "Space/Dates"], "operator": "is-after", ...}
- Relative dates: use
relativeDateInfo as the value: {"amount": 7, "unit": "day", "isBeforeNow": true}
- Hierarchical grid (N levels): items[0] is root; items[1..N-1] each set
groupBy.parentIndex and groupBy.parentField
- Workflow state filter:
{"nodeType": "workflow", "args": {"fieldPath": ["workflow/state"], "operator": "is-not", "value": ["<state-uuid>"]}} (use schema_detailed to fetch state IDs)
- Entity badge column: use
{"field": "db-badge"} or {"field": "db-badge-abbr"} inside fields/laneFields
Special field-path tokens
workflow/state — the workflow state field on any database that has one
assignments/assignees — the standard assignees collection field
fibery/id, fibery/public-id — entity identity fields
db-badge, db-badge-abbr — entity badge as a “field” in fieldUnit
Worked examples
grid (hierarchical)
{
"viewType": "grid",
"name": "Features by Area",
"config": {
"items": [
{"database": "Product/Area", "fields": [{"field": "Product/Name"}]},
{
"database": "Product/Feature",
"fields": [{"field": "Product/Name"}, {"field": "workflow/state"}, {"field": "Product/Priority"}],
"groupBy": {"parentIndex": 0, "parentField": "Product/Features"},
"orderBy": [{"field": "Product/Priority", "direction": "desc"}]
}
],
"rowHeight": "medium"
}
}
board (single database, workflow filter)
{
"viewType": "board",
"name": "Active Tasks",
"config": {
"x": [{"forDatabase": "Dev/Task", "field": "workflow/state", "database": "workflow/state_Dev/Task", "fields": []}],
"items": [{
"database": "Dev/Task",
"fields": [{"field": "Dev/Name"}, {"field": "Dev/Assignee"}],
"filter": {"nodeType": "workflow", "args": {"fieldPath": ["workflow/state"], "operator": "is-not", "value": ["<done-state-uuid>"]}}
}],
"cardSize": "comfortable"
}
}
board (multi-database — note one x entry per items database)
{
"viewType": "board",
"name": "Bugs and Stories by State",
"config": {
"x": [
{"forDatabase": "Dev/bug", "field": "workflow/state", "database": "workflow/state_Dev/bug", "fields": []},
{"forDatabase": "Dev/Story", "field": "workflow/state", "database": "workflow/state_Dev/Story", "fields": []}
],
"items": [
{"database": "Dev/bug", "fields": [{"field": "Dev/Name"}], "orderBy": [{"field": "Dev/Priority", "direction": "desc"}]},
{"database": "Dev/Story", "fields": [{"field": "Dev/Name"}], "orderBy": [{"field": "Dev/Priority", "direction": "desc"}]}
]
}
}
board (group by shared user — single relation axis across databases)
{
"viewType": "board",
"name": "Who Works on What",
"config": {
"x": [
{"forDatabase": "Dev/bug", "field": "workflow/state", "database": "workflow/state_Dev/bug", "fields": []},
{"forDatabase": "Dev/Story", "field": "workflow/state", "database": "workflow/state_Dev/Story", "fields": []}
],
"y": [
{"forDatabase": "Dev/bug", "field": "assignments/assignees", "database": "fibery/user", "fields": []},
{"forDatabase": "Dev/Story", "field": "assignments/assignees", "database": "fibery/user", "fields": []}
],
"items": [
{"database": "Dev/bug", "fields": [{"field": "Dev/Name"}]},
{"database": "Dev/Story", "fields": [{"field": "Dev/Name"}]}
]
}
}
timeline (planned vs actual + sprint lanes)
{
"viewType": "timeline",
"name": "Sprint Stories",
"config": {
"y": [{"forDatabase": "Dev/Story", "field": "Dev/Sprint", "database": "Dev/Sprint", "fields": []}],
"items": [{
"database": "Dev/Story",
"fields": [{"field": "Dev/Name"}],
"startDate": "Dev/PlannedDates",
"endDate": "Dev/PlannedDates",
"secondaryStartDate": "Dev/ActualDates",
"secondaryEndDate": "Dev/ActualDates"
}],
"oneItemPerLane": true
}
}
calendar (with filter)
{
"viewType": "calendar",
"name": "Releases In Progress",
"config": {
"items": [{
"database": "Dev/Release",
"fields": [{"field": "Dev/Name"}],
"startDate": "Dev/ReleaseDate",
"endDate": "Dev/ReleaseDate",
"filter": {"nodeType": "number", "args": {"fieldPath": ["Dev/Progress"], "operator": "less-than", "value": 1}}
}]
}
}
map (satellite + location filter)
{
"viewType": "map",
"name": "Seattle Releases",
"config": {
"items": [{
"database": "Dev/Release",
"fields": [{"field": "Dev/Name"}],
"location": "Dev/Location",
"filter": {"nodeType": "location", "args": {"fieldPath": ["Dev/Location"], "operator": "contains", "value": "Seattle"}}
}],
"style": "satellite"
}
}
feed
{
"viewType": "feed",
"name": "Release Notes",
"config": {
"items": [{
"database": "Dev/Release",
"fields": [{"field": "Dev/ReleaseDate"}, {"field": "Dev/Version"}],
"post": "Dev/ReleaseNotes",
"orderBy": [{"field": "Dev/ReleaseDate", "direction": "desc"}]
}],
"postWidth": "medium"
}
}
gallery
{
"viewType": "gallery",
"name": "Product Catalog",
"config": {
"items": [{
"database": "Shop/Item",
"fields": [{"field": "Shop/Name"}, {"field": "Shop/Price"}],
"cover": "Shop/Image",
"fillCover": true
}],
"cardSize": "medium"
}
}
gantt (hierarchy + dependencies + milestones)
{
"viewType": "gantt",
"name": "Sprint → Story",
"config": {
"items": [
{
"database": "Dev/Sprint",
"fields": [{"field": "Dev/Name"}],
"laneFields": [{"field": "db-badge-abbr"}],
"startDate": "Dev/Dates",
"endDate": "Dev/Dates",
"dependencyField": "Dev/BlockedBy"
},
{
"database": "Dev/Story",
"fields": [{"field": "Dev/Name"}],
"groupBy": {"parentIndex": 0, "parentField": "Dev/Stories"},
"startDate": "Dev/PlannedDates",
"endDate": "Dev/PlannedDates",
"secondaryStartDate": "Dev/ActualDates",
"secondaryEndDate": "Dev/ActualDates"
}
],
"milestones": [{"database": "Dev/Release", "dateField": "Dev/ReleaseDate"}],
"oneItemPerLane": true,
"dependencyDateShiftingMode": "consume-gap",
"dependencyDateShiftingAvoidWeekends": true
}
}
form (required + hidden + defaults)
{
"viewType": "form",
"name": "Bug Request",
"config": {
"database": "Dev/Bug",
"fields": [
{"field": "Dev/Name", "displayName": "Name", "required": true},
{"field": "Dev/StepsToReproduce", "displayName": "Steps to Reproduce", "required": true},
{"field": "workflow/state", "displayName": "State", "hidden": true, "defaultValue": {"id": "<to-do-state-uuid>"}},
{"field": "Dev/Priority", "displayName": "Priority", "defaultValue": {"id": "<low-priority-uuid>"}}
]
}
}
document
{
"viewType": "document",
"name": "Meeting Notes",
"content": "# Meeting Notes\n\nAgenda items here..."
}
compound filter (logical AND)
{
"filter": {
"nodeType": "logical",
"args": {
"operator": "and",
"filters": [
{"nodeType": "bool", "args": {"fieldPath": ["Dev/Urgent"], "operator": "is", "value": true}},
{"nodeType": "workflow", "args": {"fieldPath": ["workflow/state"], "operator": "is-not", "value": ["<done-state-uuid>"]}}
]
}
}
}