@centrali-io/centrali-mcp 4.2.11 → 4.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tools/describe.js +103 -142
- package/dist/tools/orchestrations.js +2 -2
- package/package.json +1 -1
- package/src/tools/describe.ts +119 -207
- package/src/tools/orchestrations.ts +2 -2
package/dist/tools/describe.js
CHANGED
|
@@ -633,7 +633,18 @@ function registerDescribeTools(server) {
|
|
|
633
633
|
onFailure: "{ nextStepId: string } | null — step to execute on failure",
|
|
634
634
|
retryConfig: "{ maxRetries, delayMs } | null — automatic retry on failure",
|
|
635
635
|
timeoutMs: "number | null — step execution timeout",
|
|
636
|
+
encryptedParams: "Record<string, { value: string, encrypt: true }> | null — secrets (API keys, tokens) encrypted at rest, decrypted into triggerParams at execution time",
|
|
636
637
|
},
|
|
638
|
+
encrypted_params_notes: [
|
|
639
|
+
"To add a secret: { KEY: { value: 'plaintext', encrypt: true } }",
|
|
640
|
+
"Values are encrypted before storage — never stored in plaintext",
|
|
641
|
+
"API responses mask values as '********'",
|
|
642
|
+
"At execution time, decrypted values are merged into triggerParams — the function sees them identically to trigger params",
|
|
643
|
+
"To update: send { KEY: { value: 'new-plaintext', encrypt: true } }",
|
|
644
|
+
"To preserve existing: send { KEY: { value: '********', encrypted: true, keyVersion: N } }",
|
|
645
|
+
"To remove: omit the key from encryptedParams",
|
|
646
|
+
"Only valid on compute steps — rejected on decision and delay steps",
|
|
647
|
+
],
|
|
637
648
|
},
|
|
638
649
|
decision: {
|
|
639
650
|
description: "Conditional branching based on input/output values",
|
|
@@ -705,6 +716,9 @@ function registerDescribeTools(server) {
|
|
|
705
716
|
type: "compute",
|
|
706
717
|
functionId: "func-uuid",
|
|
707
718
|
onSuccess: { nextStepId: "check-result" },
|
|
719
|
+
encryptedParams: {
|
|
720
|
+
API_KEY: { value: "sk_live_...", encrypt: true },
|
|
721
|
+
},
|
|
708
722
|
},
|
|
709
723
|
decision_step: {
|
|
710
724
|
id: "check-result",
|
|
@@ -752,6 +766,9 @@ function registerDescribeTools(server) {
|
|
|
752
766
|
"Use get_orchestration_run with includeSteps=true to see step-by-step execution details",
|
|
753
767
|
"Orchestrations must be 'active' to be triggered — draft orchestrations cannot run",
|
|
754
768
|
"Use correlationId when triggering to trace runs across systems",
|
|
769
|
+
"Terminal steps: a compute step with no onSuccess and no subsequent step in the array will complete the run. No special 'end' step type is needed.",
|
|
770
|
+
"Decision step conditions use 'path' (not 'field') and 'op' (not 'operator'). Paths use dot notation: 'input.fieldName' or 'steps.stepId.output.fieldName'.",
|
|
771
|
+
"Use encryptedParams on compute steps to pass secrets (API keys, tokens) — they're encrypted at rest and decrypted into triggerParams at execution time.",
|
|
755
772
|
],
|
|
756
773
|
}, null, 2),
|
|
757
774
|
},
|
|
@@ -869,7 +886,6 @@ function registerDescribeTools(server) {
|
|
|
869
886
|
description: "Single-record view — shows all fields of one record with optional related data and actions.",
|
|
870
887
|
typical_sections: ["hero", "content", "supporting"],
|
|
871
888
|
typical_blocks: [
|
|
872
|
-
"detail-fields",
|
|
873
889
|
"field-display",
|
|
874
890
|
"related-list",
|
|
875
891
|
"activity-feed",
|
|
@@ -880,18 +896,8 @@ function registerDescribeTools(server) {
|
|
|
880
896
|
form: {
|
|
881
897
|
description: "Data entry form — lets users create or update records with validation and submission actions.",
|
|
882
898
|
typical_sections: ["content", "actions"],
|
|
883
|
-
typical_blocks: [
|
|
884
|
-
|
|
885
|
-
"field-group",
|
|
886
|
-
"text-input",
|
|
887
|
-
"number-input",
|
|
888
|
-
"select",
|
|
889
|
-
"checkbox",
|
|
890
|
-
"date-picker",
|
|
891
|
-
"textarea",
|
|
892
|
-
"file-upload",
|
|
893
|
-
],
|
|
894
|
-
validation_requirement: "Form pages must have at least one field block (text-input, number-input, select, checkbox, date-picker, textarea, file-upload, field, field-group, or field-display) to pass publishing validation.",
|
|
899
|
+
typical_blocks: ["field-group", "markdown", "static-html"],
|
|
900
|
+
IMPORTANT: "Use 'field-group' blockType with a 'fields' array. Do NOT use individual field block types (text-input, select, etc.) — the runtime only renders fields from field-group's fields array.",
|
|
895
901
|
use_when: "You need users to input or edit data",
|
|
896
902
|
},
|
|
897
903
|
dashboard: {
|
|
@@ -1002,29 +1008,22 @@ function registerDescribeTools(server) {
|
|
|
1002
1008
|
filterableColumns: "string[] | null — which columns users can filter on (for data-table blocks)",
|
|
1003
1009
|
},
|
|
1004
1010
|
data_source_shape: {
|
|
1005
|
-
type: "'structure'
|
|
1006
|
-
ref: "string — the collection ID (UUID)
|
|
1007
|
-
|
|
1011
|
+
type: "'structure' — the data source type",
|
|
1012
|
+
ref: "string — the collection ID (UUID)",
|
|
1013
|
+
recordSlug: "string | undefined — the collection's record slug for direct resolution (avoids an extra lookup). Recommended.",
|
|
1008
1014
|
config: {
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
filters: "object | null — same filter syntax as query_records (data.field[operator]: value)",
|
|
1015
|
+
description: "Optional query configuration",
|
|
1016
|
+
filter: "object | null — same filter syntax as query_records",
|
|
1012
1017
|
sort: "SortConfig[] | null — array of { field, direction: 'asc' | 'desc' }",
|
|
1013
|
-
limit: "number | null — max records to fetch",
|
|
1014
1018
|
page: "number | null — for pagination",
|
|
1015
1019
|
pageSize: "number | null — records per page",
|
|
1016
1020
|
},
|
|
1017
1021
|
aggregation: {
|
|
1018
|
-
description: "
|
|
1022
|
+
description: "For metric/chart blocks. Defines computations over the data.",
|
|
1019
1023
|
operations: "Record<string, { count?: '*', sum?: 'fieldName', avg?: 'fieldName', min?: 'fieldName', max?: 'fieldName' }>",
|
|
1020
1024
|
groupBy: "string[] | null — fields to group by",
|
|
1021
1025
|
},
|
|
1022
|
-
|
|
1023
|
-
presentation_shape: {
|
|
1024
|
-
density: "'compact' | 'comfortable' | 'spacious' — controls spacing/padding",
|
|
1025
|
-
columns: "string[] — which columns to show (for table blocks)",
|
|
1026
|
-
chartType: "'bar' | 'line' | 'pie' — for chart blocks",
|
|
1027
|
-
emphasisRules: "EmphasisRule[] — conditional formatting rules: { field, operator, threshold, severity }",
|
|
1026
|
+
mode: "'list' | 'single' | 'aggregate' — optional. Set to 'aggregate' for metric-card and chart blocks that use aggregation. For list and detail pages, mode is inferred from context.",
|
|
1028
1027
|
},
|
|
1029
1028
|
narrative_shape: {
|
|
1030
1029
|
primaryQuestion: "string — the business question this block answers (e.g., 'How are sales trending?')",
|
|
@@ -1047,20 +1046,14 @@ function registerDescribeTools(server) {
|
|
|
1047
1046
|
dataSource: {
|
|
1048
1047
|
type: "structure",
|
|
1049
1048
|
ref: "<collection-uuid>",
|
|
1050
|
-
|
|
1051
|
-
config: {
|
|
1052
|
-
fields: [
|
|
1053
|
-
"name",
|
|
1054
|
-
"email",
|
|
1055
|
-
"status",
|
|
1056
|
-
"createdAt",
|
|
1057
|
-
],
|
|
1058
|
-
sort: [{ field: "createdAt", direction: "desc" }],
|
|
1059
|
-
pageSize: 25,
|
|
1060
|
-
},
|
|
1049
|
+
recordSlug: "customers",
|
|
1061
1050
|
},
|
|
1062
|
-
|
|
1063
|
-
|
|
1051
|
+
columns: [
|
|
1052
|
+
{ key: "name", label: "Name", filterable: true, sortable: true },
|
|
1053
|
+
{ key: "email", label: "Email", sortable: true },
|
|
1054
|
+
{ key: "status", label: "Status", filterable: true, sortable: true },
|
|
1055
|
+
{ key: "createdAt", label: "Created", sortable: true },
|
|
1056
|
+
],
|
|
1064
1057
|
},
|
|
1065
1058
|
],
|
|
1066
1059
|
},
|
|
@@ -1151,42 +1144,56 @@ function registerDescribeTools(server) {
|
|
|
1151
1144
|
text: JSON.stringify({
|
|
1152
1145
|
domain: "Page Block Types",
|
|
1153
1146
|
description: "Blocks are the UI components inside page sections. Each blockType has its own configuration requirements.",
|
|
1147
|
+
IMPORTANT_config_convention: "Block-type-specific config uses named properties on the block object (e.g., block.kanbanConfig, block.chartConfig), NOT a generic 'config' key. This is critical — using 'config' instead of the named property will silently fail.",
|
|
1154
1148
|
block_types: {
|
|
1155
1149
|
"data-table": {
|
|
1156
|
-
description: "Tabular data display with columns, sorting, filtering, and pagination. The primary block for list pages.",
|
|
1157
|
-
dataSource: "Required — type: 'structure'
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1150
|
+
description: "Tabular data display with columns, sorting, filtering, and pagination. The primary block for list and dashboard pages.",
|
|
1151
|
+
dataSource: "Required — type: 'structure'. Add recordSlug for direct resolution.",
|
|
1152
|
+
columns: "{ key: string, label: string, filterable?: boolean, sortable?: boolean }[] — column definitions on the block object. Used by both the publish validator and the runtime renderer.",
|
|
1153
|
+
example: {
|
|
1154
|
+
id: "<uuid>",
|
|
1155
|
+
blockType: "data-table",
|
|
1156
|
+
dataSource: { type: "structure", ref: "<collection-uuid>", recordSlug: "my-records" },
|
|
1157
|
+
columns: [
|
|
1158
|
+
{ key: "name", label: "Name", filterable: true, sortable: true },
|
|
1159
|
+
{ key: "status", label: "Status", filterable: true, sortable: true },
|
|
1160
|
+
{ key: "createdAt", label: "Created", sortable: true },
|
|
1161
|
+
],
|
|
1163
1162
|
},
|
|
1164
|
-
presentation: "density, columns, emphasisRules",
|
|
1165
|
-
filterableColumns: "string[] — columns users can filter on",
|
|
1166
1163
|
},
|
|
1167
1164
|
"metric-card": {
|
|
1168
1165
|
description: "Single KPI metric display — shows a number with label, optional trend, and thresholds.",
|
|
1169
|
-
dataSource: "Required — type: 'structure', mode: 'aggregate' with
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1166
|
+
dataSource: "Required — type: 'structure', mode: 'aggregate' with aggregation.operations in the dataSource",
|
|
1167
|
+
label: "string — display label for the metric, placed directly on the block object",
|
|
1168
|
+
metricConfig: {
|
|
1169
|
+
format: "'number' | 'currency' | 'percentage' — value formatting (optional)",
|
|
1170
|
+
thresholds: "{ green?: [min, max], amber?: [min, max], red?: [min, max] } — color-code the value (optional)",
|
|
1171
|
+
},
|
|
1172
|
+
example: {
|
|
1173
|
+
id: "<uuid>",
|
|
1174
|
+
blockType: "metric-card",
|
|
1175
|
+
label: "Pending Requests",
|
|
1176
|
+
dataSource: {
|
|
1177
|
+
ref: "<collection-uuid>",
|
|
1178
|
+
type: "structure",
|
|
1179
|
+
mode: "aggregate",
|
|
1180
|
+
recordSlug: "governance_requests",
|
|
1181
|
+
config: { filters: { "data.status": "pending_approval" } },
|
|
1182
|
+
aggregation: { operations: { count: { count: "*" } } },
|
|
1183
|
+
},
|
|
1177
1184
|
},
|
|
1178
1185
|
},
|
|
1179
1186
|
"stat-group": {
|
|
1180
1187
|
description: "Group of 2-5 related metrics displayed side by side. More compact than individual metric-cards.",
|
|
1181
1188
|
dataSource: "Not set at block level — each item has its own dataSource",
|
|
1182
|
-
|
|
1189
|
+
statGroupConfig: {
|
|
1183
1190
|
items: "StatGroupItem[] — array of { id, label, dataSource, aggregation, valueField, format, trend }",
|
|
1184
1191
|
},
|
|
1185
1192
|
},
|
|
1186
1193
|
chart: {
|
|
1187
1194
|
description: "Data visualization — bar, line, or pie chart.",
|
|
1188
|
-
dataSource: "Required — type: 'structure'
|
|
1189
|
-
|
|
1195
|
+
dataSource: "Required — type: 'structure' with aggregation and groupBy in the dataSource",
|
|
1196
|
+
chartConfig: {
|
|
1190
1197
|
chartType: "'bar' | 'line' | 'pie'",
|
|
1191
1198
|
categoryField: "string — field for x-axis / categories",
|
|
1192
1199
|
valueField: "string — field for y-axis / values",
|
|
@@ -1194,31 +1201,36 @@ function registerDescribeTools(server) {
|
|
|
1194
1201
|
colors: "string[] | null — custom color palette",
|
|
1195
1202
|
showLegend: "boolean (default: true)",
|
|
1196
1203
|
},
|
|
1197
|
-
presentation: "chartType",
|
|
1198
1204
|
},
|
|
1199
|
-
|
|
1200
|
-
description: "
|
|
1201
|
-
dataSource: "Optional —
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
},
|
|
1205
|
-
form_field_shape: {
|
|
1205
|
+
"field-group": {
|
|
1206
|
+
description: "Group of editable form fields. THE block type for form pages. Contains a 'fields' array directly on the block (not under config).",
|
|
1207
|
+
dataSource: "Optional — set with recordSlug to scope. For edit forms, include recordSlug to pre-populate.",
|
|
1208
|
+
fields: "FormFieldDef[] — array of field definitions directly on the block object",
|
|
1209
|
+
field_shape: {
|
|
1206
1210
|
key: "string — maps to the record's data field name",
|
|
1207
1211
|
label: "string — display label",
|
|
1208
1212
|
type: "'text' | 'number' | 'email' | 'date' | 'boolean' | 'select' | 'textarea'",
|
|
1209
1213
|
required: "boolean (default: false)",
|
|
1210
1214
|
placeholder: "string | null",
|
|
1211
|
-
|
|
1215
|
+
options: "For 'select' type: { label: string, value: string }[] — inline static options",
|
|
1216
|
+
optionSource: "For 'select' type (alternative): { type: 'static' | 'dynamic', staticOptions?: [{label, value}], dynamicRef?: 'collection-uuid', labelField?, valueField? }",
|
|
1212
1217
|
},
|
|
1218
|
+
allowed_actions: ["create-record", "update-record", "invoke-trigger"],
|
|
1219
|
+
default_activation: "form-submit",
|
|
1220
|
+
param_source: "form",
|
|
1213
1221
|
},
|
|
1214
|
-
"
|
|
1215
|
-
description: "Read-only display of
|
|
1216
|
-
dataSource: "Required — type: 'structure'
|
|
1222
|
+
"field-display": {
|
|
1223
|
+
description: "Read-only display of record fields with labels. THE block type for detail pages. Contains a 'fields' array directly on the block.",
|
|
1224
|
+
dataSource: "Required — type: 'structure'",
|
|
1225
|
+
fields: "{ key: string, label: string }[] — fields to display from the record",
|
|
1226
|
+
allowed_actions: ["invoke-trigger", "navigate-to-page"],
|
|
1227
|
+
default_activation: "button",
|
|
1228
|
+
param_source: "record",
|
|
1217
1229
|
},
|
|
1218
1230
|
"activity-feed": {
|
|
1219
1231
|
description: "Chronological list of recent items/events, showing title, description, and timestamp.",
|
|
1220
|
-
dataSource: "Required — type: 'structure'
|
|
1221
|
-
|
|
1232
|
+
dataSource: "Required — type: 'structure'",
|
|
1233
|
+
feedConfig: {
|
|
1222
1234
|
titleField: "string — field to use as item title",
|
|
1223
1235
|
descriptionField: "string | null — field for item description",
|
|
1224
1236
|
timestampField: "string — field for item timestamp",
|
|
@@ -1229,20 +1241,19 @@ function registerDescribeTools(server) {
|
|
|
1229
1241
|
"progress-indicator": {
|
|
1230
1242
|
description: "Visual progress display — bar, ring, or badge. Shows completion toward a target.",
|
|
1231
1243
|
dataSource: "Optional — can use static value or aggregate from data",
|
|
1232
|
-
|
|
1244
|
+
progressConfig: {
|
|
1233
1245
|
mode: "'bar' | 'ring' | 'badge'",
|
|
1234
1246
|
label: "string",
|
|
1235
1247
|
value: "number | null — static value (if no dataSource)",
|
|
1236
1248
|
valueField: "string | null — field to aggregate (if using dataSource)",
|
|
1237
|
-
aggregation: "'count' | 'sum' | 'average' | 'percentage'",
|
|
1238
1249
|
target: "number — the 100% target value",
|
|
1239
1250
|
thresholds: "{ green?: [min, max], amber?: [min, max], red?: [min, max] }",
|
|
1240
1251
|
},
|
|
1241
1252
|
},
|
|
1242
1253
|
kanban: {
|
|
1243
1254
|
description: "Kanban board — drag-and-drop cards grouped by a status/category field.",
|
|
1244
|
-
dataSource: "Required — type: 'structure'
|
|
1245
|
-
|
|
1255
|
+
dataSource: "Required — type: 'structure'",
|
|
1256
|
+
kanbanConfig: {
|
|
1246
1257
|
groupByField: "string — field to group cards by (e.g., 'status')",
|
|
1247
1258
|
columnOrder: "string[] | null — explicit column order (e.g., ['todo', 'in-progress', 'done'])",
|
|
1248
1259
|
cardTitleField: "string — field for card title",
|
|
@@ -1252,89 +1263,39 @@ function registerDescribeTools(server) {
|
|
|
1252
1263
|
},
|
|
1253
1264
|
calendar: {
|
|
1254
1265
|
description: "Calendar view — displays records as events on a month/week/day calendar.",
|
|
1255
|
-
dataSource: "Required — type: 'structure'
|
|
1256
|
-
|
|
1266
|
+
dataSource: "Required — type: 'structure'",
|
|
1267
|
+
calendarConfig: {
|
|
1257
1268
|
dateField: "string — field for event start date",
|
|
1258
1269
|
endDateField: "string | null — field for event end date (for multi-day events)",
|
|
1259
1270
|
titleField: "string — field for event title",
|
|
1260
1271
|
colorField: "string | null — field to determine event color",
|
|
1261
1272
|
defaultView: "'month' | 'week' | 'day' (default: 'month')",
|
|
1262
|
-
eventClickAction: "BlockAction | null — action when an event is clicked",
|
|
1263
1273
|
},
|
|
1264
1274
|
},
|
|
1265
1275
|
"filter-bar": {
|
|
1266
1276
|
description: "Global filter bar for dashboards — provides date range pickers and dropdown filters that control other blocks on the page.",
|
|
1267
1277
|
dataSource: "Not required",
|
|
1268
|
-
|
|
1278
|
+
filterBarConfig: {
|
|
1269
1279
|
dateField: "string | null — field to filter by date range",
|
|
1270
1280
|
datePresets: "('today' | '7d' | '30d' | '90d' | 'custom')[] — available date range presets",
|
|
1271
1281
|
dropdownFilters: "{ field: string, label: string }[] — dropdown filter options",
|
|
1272
1282
|
},
|
|
1273
1283
|
},
|
|
1274
1284
|
"related-list": {
|
|
1275
|
-
description: "Displays related records from another collection. Similar to data-table but used in detail pages to show linked data
|
|
1276
|
-
dataSource: "Required — type: 'structure'
|
|
1285
|
+
description: "Displays related records from another collection. Similar to data-table but used in detail pages to show linked data.",
|
|
1286
|
+
dataSource: "Required — type: 'structure'",
|
|
1287
|
+
columns: "{ key: string, label: string }[] — column definitions on the block object",
|
|
1277
1288
|
allowed_actions: ["navigate-to-page", "invoke-trigger"],
|
|
1278
1289
|
default_activation: "row-click",
|
|
1279
1290
|
param_source: "row",
|
|
1280
1291
|
},
|
|
1281
|
-
|
|
1282
|
-
description: "
|
|
1283
|
-
|
|
1284
|
-
allowed_actions: ["invoke-trigger", "navigate-to-page"],
|
|
1285
|
-
default_activation: "button",
|
|
1286
|
-
param_source: "record",
|
|
1287
|
-
},
|
|
1288
|
-
"field-group": {
|
|
1289
|
-
description: "Group of editable form fields. Used in form pages for structured data entry with multiple fields in a logical group.",
|
|
1290
|
-
dataSource: "Optional — if set with mode: 'single', pre-populates for editing",
|
|
1291
|
-
allowed_actions: [
|
|
1292
|
-
"create-record",
|
|
1293
|
-
"update-record",
|
|
1294
|
-
"invoke-trigger",
|
|
1295
|
-
],
|
|
1296
|
-
default_activation: "form-submit",
|
|
1297
|
-
param_source: "form",
|
|
1298
|
-
},
|
|
1299
|
-
"text-input": {
|
|
1300
|
-
description: "Single-line text input field for form pages.",
|
|
1301
|
-
dataSource: "Not required (value comes from user input)",
|
|
1302
|
-
category: "field-block",
|
|
1303
|
-
},
|
|
1304
|
-
"number-input": {
|
|
1305
|
-
description: "Numeric input field for form pages. Supports min/max constraints.",
|
|
1306
|
-
dataSource: "Not required",
|
|
1307
|
-
category: "field-block",
|
|
1308
|
-
},
|
|
1309
|
-
select: {
|
|
1310
|
-
description: "Dropdown select input for form pages. Options can be static or dynamically loaded from a collection.",
|
|
1311
|
-
dataSource: "Not required (static options) or optional (dynamic options from collection)",
|
|
1312
|
-
category: "field-block",
|
|
1313
|
-
},
|
|
1314
|
-
checkbox: {
|
|
1315
|
-
description: "Boolean checkbox input for form pages.",
|
|
1316
|
-
dataSource: "Not required",
|
|
1317
|
-
category: "field-block",
|
|
1318
|
-
},
|
|
1319
|
-
"date-picker": {
|
|
1320
|
-
description: "Date/datetime picker input for form pages.",
|
|
1321
|
-
dataSource: "Not required",
|
|
1322
|
-
category: "field-block",
|
|
1323
|
-
},
|
|
1324
|
-
textarea: {
|
|
1325
|
-
description: "Multi-line text input for form pages. Use for long text, descriptions, notes.",
|
|
1326
|
-
dataSource: "Not required",
|
|
1327
|
-
category: "field-block",
|
|
1328
|
-
},
|
|
1329
|
-
"file-upload": {
|
|
1330
|
-
description: "File upload input for form pages. Stores files in blob storage.",
|
|
1331
|
-
dataSource: "Not required",
|
|
1332
|
-
category: "field-block",
|
|
1292
|
+
form: {
|
|
1293
|
+
description: "DEPRECATED — use 'field-group' blockType instead. The runtime does not handle 'form' as a blockType.",
|
|
1294
|
+
IMPORTANT: "Do NOT use this. Use field-group with a fields array.",
|
|
1333
1295
|
},
|
|
1334
|
-
|
|
1335
|
-
description: "
|
|
1336
|
-
|
|
1337
|
-
category: "field-block",
|
|
1296
|
+
"detail-fields": {
|
|
1297
|
+
description: "DEPRECATED — use 'field-display' blockType instead. The runtime does not handle 'detail-fields'.",
|
|
1298
|
+
IMPORTANT: "Do NOT use this. Use field-display with a fields array.",
|
|
1338
1299
|
},
|
|
1339
1300
|
markdown: {
|
|
1340
1301
|
description: "Static markdown content block. Renders markdown text on the page. Must have non-empty content to pass publishing validation.",
|
|
@@ -1350,8 +1311,8 @@ function registerDescribeTools(server) {
|
|
|
1350
1311
|
},
|
|
1351
1312
|
},
|
|
1352
1313
|
block_categories: {
|
|
1353
|
-
"data-block": "Blocks that display data from collections (data-table, chart, metric-card, stat-group,
|
|
1354
|
-
"
|
|
1314
|
+
"data-block": "Blocks that display data from collections (data-table, chart, metric-card, stat-group, field-display, related-list, activity-feed, kanban, calendar, progress-indicator)",
|
|
1315
|
+
"form-block": "Use 'field-group' blockType with a 'fields' array for form pages. Do NOT use individual field block types (text-input, select, etc.) — the runtime renders field types from the field-group's fields array.",
|
|
1355
1316
|
"content-block": "Static content blocks (markdown, static-html). Must have non-empty 'content' property.",
|
|
1356
1317
|
"layout-block": "Blocks that control page-level behavior (filter-bar)",
|
|
1357
1318
|
},
|
|
@@ -188,7 +188,7 @@ function registerOrchestrationTools(server, sdk) {
|
|
|
188
188
|
.describe("Trigger configuration object. Must include 'type' (on-demand, event-driven, scheduled, webhook)"),
|
|
189
189
|
steps: zod_1.z
|
|
190
190
|
.array(zod_1.z.record(zod_1.z.string(), zod_1.z.any()))
|
|
191
|
-
.describe("Array of step definitions. Step types: 'compute' (functionId + onSuccess/onFailure), 'decision' (cases with conditions using path/op/value + defaultNextStepId), 'delay' (delayMs + nextStepId). Call describe_orchestrations for full schema."),
|
|
191
|
+
.describe("Array of step definitions. Step types: 'compute' (functionId + onSuccess/onFailure + optional encryptedParams), 'decision' (cases with conditions using path/op/value + defaultNextStepId), 'delay' (delayMs + nextStepId). Compute steps support encryptedParams: { KEY: { value: 'plaintext', encrypt: true } } for secrets like API keys — values are encrypted at rest and decrypted at execution time into triggerParams. Call describe_orchestrations for full schema."),
|
|
192
192
|
}, (_a) => __awaiter(this, [_a], void 0, function* ({ slug, name, description, trigger, steps }) {
|
|
193
193
|
try {
|
|
194
194
|
const input = { slug, name, trigger, steps };
|
|
@@ -226,7 +226,7 @@ function registerOrchestrationTools(server, sdk) {
|
|
|
226
226
|
steps: zod_1.z
|
|
227
227
|
.array(zod_1.z.record(zod_1.z.string(), zod_1.z.any()))
|
|
228
228
|
.optional()
|
|
229
|
-
.describe("Updated step definitions"),
|
|
229
|
+
.describe("Updated step definitions. Compute steps support encryptedParams: { KEY: { value: 'plaintext', encrypt: true } } for secrets. Existing encrypted params with { encrypted: true } are preserved as-is; omitted params are removed."),
|
|
230
230
|
}, (_a) => __awaiter(this, [_a], void 0, function* ({ orchestrationId, name, description, status, trigger, steps }) {
|
|
231
231
|
try {
|
|
232
232
|
const input = {};
|
package/package.json
CHANGED
package/src/tools/describe.ts
CHANGED
|
@@ -726,7 +726,18 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
726
726
|
onFailure: "{ nextStepId: string } | null — step to execute on failure",
|
|
727
727
|
retryConfig: "{ maxRetries, delayMs } | null — automatic retry on failure",
|
|
728
728
|
timeoutMs: "number | null — step execution timeout",
|
|
729
|
+
encryptedParams: "Record<string, { value: string, encrypt: true }> | null — secrets (API keys, tokens) encrypted at rest, decrypted into triggerParams at execution time",
|
|
729
730
|
},
|
|
731
|
+
encrypted_params_notes: [
|
|
732
|
+
"To add a secret: { KEY: { value: 'plaintext', encrypt: true } }",
|
|
733
|
+
"Values are encrypted before storage — never stored in plaintext",
|
|
734
|
+
"API responses mask values as '********'",
|
|
735
|
+
"At execution time, decrypted values are merged into triggerParams — the function sees them identically to trigger params",
|
|
736
|
+
"To update: send { KEY: { value: 'new-plaintext', encrypt: true } }",
|
|
737
|
+
"To preserve existing: send { KEY: { value: '********', encrypted: true, keyVersion: N } }",
|
|
738
|
+
"To remove: omit the key from encryptedParams",
|
|
739
|
+
"Only valid on compute steps — rejected on decision and delay steps",
|
|
740
|
+
],
|
|
730
741
|
},
|
|
731
742
|
decision: {
|
|
732
743
|
description: "Conditional branching based on input/output values",
|
|
@@ -798,6 +809,9 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
798
809
|
type: "compute",
|
|
799
810
|
functionId: "func-uuid",
|
|
800
811
|
onSuccess: { nextStepId: "check-result" },
|
|
812
|
+
encryptedParams: {
|
|
813
|
+
API_KEY: { value: "sk_live_...", encrypt: true },
|
|
814
|
+
},
|
|
801
815
|
},
|
|
802
816
|
decision_step: {
|
|
803
817
|
id: "check-result",
|
|
@@ -845,6 +859,9 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
845
859
|
"Use get_orchestration_run with includeSteps=true to see step-by-step execution details",
|
|
846
860
|
"Orchestrations must be 'active' to be triggered — draft orchestrations cannot run",
|
|
847
861
|
"Use correlationId when triggering to trace runs across systems",
|
|
862
|
+
"Terminal steps: a compute step with no onSuccess and no subsequent step in the array will complete the run. No special 'end' step type is needed.",
|
|
863
|
+
"Decision step conditions use 'path' (not 'field') and 'op' (not 'operator'). Paths use dot notation: 'input.fieldName' or 'steps.stepId.output.fieldName'.",
|
|
864
|
+
"Use encryptedParams on compute steps to pass secrets (API keys, tokens) — they're encrypted at rest and decrypted into triggerParams at execution time.",
|
|
848
865
|
],
|
|
849
866
|
},
|
|
850
867
|
null,
|
|
@@ -1004,7 +1021,6 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1004
1021
|
"Single-record view — shows all fields of one record with optional related data and actions.",
|
|
1005
1022
|
typical_sections: ["hero", "content", "supporting"],
|
|
1006
1023
|
typical_blocks: [
|
|
1007
|
-
"detail-fields",
|
|
1008
1024
|
"field-display",
|
|
1009
1025
|
"related-list",
|
|
1010
1026
|
"activity-feed",
|
|
@@ -1017,19 +1033,8 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1017
1033
|
description:
|
|
1018
1034
|
"Data entry form — lets users create or update records with validation and submission actions.",
|
|
1019
1035
|
typical_sections: ["content", "actions"],
|
|
1020
|
-
typical_blocks: [
|
|
1021
|
-
|
|
1022
|
-
"field-group",
|
|
1023
|
-
"text-input",
|
|
1024
|
-
"number-input",
|
|
1025
|
-
"select",
|
|
1026
|
-
"checkbox",
|
|
1027
|
-
"date-picker",
|
|
1028
|
-
"textarea",
|
|
1029
|
-
"file-upload",
|
|
1030
|
-
],
|
|
1031
|
-
validation_requirement:
|
|
1032
|
-
"Form pages must have at least one field block (text-input, number-input, select, checkbox, date-picker, textarea, file-upload, field, field-group, or field-display) to pass publishing validation.",
|
|
1036
|
+
typical_blocks: ["field-group", "markdown", "static-html"],
|
|
1037
|
+
IMPORTANT: "Use 'field-group' blockType with a 'fields' array. Do NOT use individual field block types (text-input, select, etc.) — the runtime only renders fields from field-group's fields array.",
|
|
1033
1038
|
use_when: "You need users to input or edit data",
|
|
1034
1039
|
},
|
|
1035
1040
|
dashboard: {
|
|
@@ -1175,36 +1180,24 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1175
1180
|
"string[] | null — which columns users can filter on (for data-table blocks)",
|
|
1176
1181
|
},
|
|
1177
1182
|
data_source_shape: {
|
|
1178
|
-
type: "'structure'
|
|
1179
|
-
ref: "string — the collection ID (UUID)
|
|
1180
|
-
|
|
1183
|
+
type: "'structure' — the data source type",
|
|
1184
|
+
ref: "string — the collection ID (UUID)",
|
|
1185
|
+
recordSlug: "string | undefined — the collection's record slug for direct resolution (avoids an extra lookup). Recommended.",
|
|
1181
1186
|
config: {
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
fieldOrder:
|
|
1185
|
-
"string[] | null — display order for fields",
|
|
1186
|
-
filters:
|
|
1187
|
-
"object | null — same filter syntax as query_records (data.field[operator]: value)",
|
|
1187
|
+
description: "Optional query configuration",
|
|
1188
|
+
filter: "object | null — same filter syntax as query_records",
|
|
1188
1189
|
sort: "SortConfig[] | null — array of { field, direction: 'asc' | 'desc' }",
|
|
1189
|
-
limit: "number | null — max records to fetch",
|
|
1190
1190
|
page: "number | null — for pagination",
|
|
1191
1191
|
pageSize: "number | null — records per page",
|
|
1192
1192
|
},
|
|
1193
1193
|
aggregation: {
|
|
1194
1194
|
description:
|
|
1195
|
-
"
|
|
1195
|
+
"For metric/chart blocks. Defines computations over the data.",
|
|
1196
1196
|
operations:
|
|
1197
1197
|
"Record<string, { count?: '*', sum?: 'fieldName', avg?: 'fieldName', min?: 'fieldName', max?: 'fieldName' }>",
|
|
1198
1198
|
groupBy: "string[] | null — fields to group by",
|
|
1199
1199
|
},
|
|
1200
|
-
|
|
1201
|
-
presentation_shape: {
|
|
1202
|
-
density:
|
|
1203
|
-
"'compact' | 'comfortable' | 'spacious' — controls spacing/padding",
|
|
1204
|
-
columns: "string[] — which columns to show (for table blocks)",
|
|
1205
|
-
chartType: "'bar' | 'line' | 'pie' — for chart blocks",
|
|
1206
|
-
emphasisRules:
|
|
1207
|
-
"EmphasisRule[] — conditional formatting rules: { field, operator, threshold, severity }",
|
|
1200
|
+
mode: "'list' | 'single' | 'aggregate' — optional. Set to 'aggregate' for metric-card and chart blocks that use aggregation. For list and detail pages, mode is inferred from context.",
|
|
1208
1201
|
},
|
|
1209
1202
|
narrative_shape: {
|
|
1210
1203
|
primaryQuestion:
|
|
@@ -1231,20 +1224,14 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1231
1224
|
dataSource: {
|
|
1232
1225
|
type: "structure",
|
|
1233
1226
|
ref: "<collection-uuid>",
|
|
1234
|
-
|
|
1235
|
-
config: {
|
|
1236
|
-
fields: [
|
|
1237
|
-
"name",
|
|
1238
|
-
"email",
|
|
1239
|
-
"status",
|
|
1240
|
-
"createdAt",
|
|
1241
|
-
],
|
|
1242
|
-
sort: [{ field: "createdAt", direction: "desc" }],
|
|
1243
|
-
pageSize: 25,
|
|
1244
|
-
},
|
|
1227
|
+
recordSlug: "customers",
|
|
1245
1228
|
},
|
|
1246
|
-
|
|
1247
|
-
|
|
1229
|
+
columns: [
|
|
1230
|
+
{ key: "name", label: "Name", filterable: true, sortable: true },
|
|
1231
|
+
{ key: "email", label: "Email", sortable: true },
|
|
1232
|
+
{ key: "status", label: "Status", filterable: true, sortable: true },
|
|
1233
|
+
{ key: "createdAt", label: "Created", sortable: true },
|
|
1234
|
+
],
|
|
1248
1235
|
},
|
|
1249
1236
|
],
|
|
1250
1237
|
},
|
|
@@ -1345,46 +1332,53 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1345
1332
|
domain: "Page Block Types",
|
|
1346
1333
|
description:
|
|
1347
1334
|
"Blocks are the UI components inside page sections. Each blockType has its own configuration requirements.",
|
|
1335
|
+
IMPORTANT_config_convention: "Block-type-specific config uses named properties on the block object (e.g., block.kanbanConfig, block.chartConfig), NOT a generic 'config' key. This is critical — using 'config' instead of the named property will silently fail.",
|
|
1348
1336
|
block_types: {
|
|
1349
1337
|
"data-table": {
|
|
1350
1338
|
description:
|
|
1351
|
-
"Tabular data display with columns, sorting, filtering, and pagination. The primary block for list pages.",
|
|
1352
|
-
dataSource: "Required — type: 'structure'
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1339
|
+
"Tabular data display with columns, sorting, filtering, and pagination. The primary block for list and dashboard pages.",
|
|
1340
|
+
dataSource: "Required — type: 'structure'. Add recordSlug for direct resolution.",
|
|
1341
|
+
columns: "{ key: string, label: string, filterable?: boolean, sortable?: boolean }[] — column definitions on the block object. Used by both the publish validator and the runtime renderer.",
|
|
1342
|
+
example: {
|
|
1343
|
+
id: "<uuid>",
|
|
1344
|
+
blockType: "data-table",
|
|
1345
|
+
dataSource: { type: "structure", ref: "<collection-uuid>", recordSlug: "my-records" },
|
|
1346
|
+
columns: [
|
|
1347
|
+
{ key: "name", label: "Name", filterable: true, sortable: true },
|
|
1348
|
+
{ key: "status", label: "Status", filterable: true, sortable: true },
|
|
1349
|
+
{ key: "createdAt", label: "Created", sortable: true },
|
|
1350
|
+
],
|
|
1361
1351
|
},
|
|
1362
|
-
presentation: "density, columns, emphasisRules",
|
|
1363
|
-
filterableColumns: "string[] — columns users can filter on",
|
|
1364
1352
|
},
|
|
1365
1353
|
"metric-card": {
|
|
1366
1354
|
description:
|
|
1367
1355
|
"Single KPI metric display — shows a number with label, optional trend, and thresholds.",
|
|
1368
1356
|
dataSource:
|
|
1369
|
-
"Required — type: 'structure', mode: 'aggregate' with
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
"
|
|
1357
|
+
"Required — type: 'structure', mode: 'aggregate' with aggregation.operations in the dataSource",
|
|
1358
|
+
label: "string — display label for the metric, placed directly on the block object",
|
|
1359
|
+
metricConfig: {
|
|
1360
|
+
format: "'number' | 'currency' | 'percentage' — value formatting (optional)",
|
|
1361
|
+
thresholds: "{ green?: [min, max], amber?: [min, max], red?: [min, max] } — color-code the value (optional)",
|
|
1362
|
+
},
|
|
1363
|
+
example: {
|
|
1364
|
+
id: "<uuid>",
|
|
1365
|
+
blockType: "metric-card",
|
|
1366
|
+
label: "Pending Requests",
|
|
1367
|
+
dataSource: {
|
|
1368
|
+
ref: "<collection-uuid>",
|
|
1369
|
+
type: "structure",
|
|
1370
|
+
mode: "aggregate",
|
|
1371
|
+
recordSlug: "governance_requests",
|
|
1372
|
+
config: { filters: { "data.status": "pending_approval" } },
|
|
1373
|
+
aggregation: { operations: { count: { count: "*" } } },
|
|
1374
|
+
},
|
|
1381
1375
|
},
|
|
1382
1376
|
},
|
|
1383
1377
|
"stat-group": {
|
|
1384
1378
|
description:
|
|
1385
1379
|
"Group of 2-5 related metrics displayed side by side. More compact than individual metric-cards.",
|
|
1386
1380
|
dataSource: "Not set at block level — each item has its own dataSource",
|
|
1387
|
-
|
|
1381
|
+
statGroupConfig: {
|
|
1388
1382
|
items:
|
|
1389
1383
|
"StatGroupItem[] — array of { id, label, dataSource, aggregation, valueField, format, trend }",
|
|
1390
1384
|
},
|
|
@@ -1393,52 +1387,51 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1393
1387
|
description:
|
|
1394
1388
|
"Data visualization — bar, line, or pie chart.",
|
|
1395
1389
|
dataSource:
|
|
1396
|
-
"Required — type: 'structure'
|
|
1397
|
-
|
|
1390
|
+
"Required — type: 'structure' with aggregation and groupBy in the dataSource",
|
|
1391
|
+
chartConfig: {
|
|
1398
1392
|
chartType: "'bar' | 'line' | 'pie'",
|
|
1399
1393
|
categoryField: "string — field for x-axis / categories",
|
|
1400
1394
|
valueField: "string — field for y-axis / values",
|
|
1401
|
-
groupByField:
|
|
1402
|
-
"string | null — optional field for series grouping",
|
|
1395
|
+
groupByField: "string | null — optional field for series grouping",
|
|
1403
1396
|
colors: "string[] | null — custom color palette",
|
|
1404
1397
|
showLegend: "boolean (default: true)",
|
|
1405
1398
|
},
|
|
1406
|
-
presentation: "chartType",
|
|
1407
1399
|
},
|
|
1408
|
-
|
|
1400
|
+
"field-group": {
|
|
1409
1401
|
description:
|
|
1410
|
-
"
|
|
1402
|
+
"Group of editable form fields. THE block type for form pages. Contains a 'fields' array directly on the block (not under config).",
|
|
1411
1403
|
dataSource:
|
|
1412
|
-
"Optional —
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
"FormFieldDef[] — array of field definitions (see below)",
|
|
1416
|
-
},
|
|
1417
|
-
form_field_shape: {
|
|
1404
|
+
"Optional — set with recordSlug to scope. For edit forms, include recordSlug to pre-populate.",
|
|
1405
|
+
fields: "FormFieldDef[] — array of field definitions directly on the block object",
|
|
1406
|
+
field_shape: {
|
|
1418
1407
|
key: "string — maps to the record's data field name",
|
|
1419
1408
|
label: "string — display label",
|
|
1420
1409
|
type: "'text' | 'number' | 'email' | 'date' | 'boolean' | 'select' | 'textarea'",
|
|
1421
1410
|
required: "boolean (default: false)",
|
|
1422
1411
|
placeholder: "string | null",
|
|
1423
|
-
|
|
1424
|
-
|
|
1412
|
+
options: "For 'select' type: { label: string, value: string }[] — inline static options",
|
|
1413
|
+
optionSource: "For 'select' type (alternative): { type: 'static' | 'dynamic', staticOptions?: [{label, value}], dynamicRef?: 'collection-uuid', labelField?, valueField? }",
|
|
1425
1414
|
},
|
|
1415
|
+
allowed_actions: ["create-record", "update-record", "invoke-trigger"],
|
|
1416
|
+
default_activation: "form-submit",
|
|
1417
|
+
param_source: "form",
|
|
1426
1418
|
},
|
|
1427
|
-
"
|
|
1419
|
+
"field-display": {
|
|
1428
1420
|
description:
|
|
1429
|
-
"Read-only display of
|
|
1430
|
-
dataSource:
|
|
1431
|
-
|
|
1421
|
+
"Read-only display of record fields with labels. THE block type for detail pages. Contains a 'fields' array directly on the block.",
|
|
1422
|
+
dataSource: "Required — type: 'structure'",
|
|
1423
|
+
fields: "{ key: string, label: string }[] — fields to display from the record",
|
|
1424
|
+
allowed_actions: ["invoke-trigger", "navigate-to-page"],
|
|
1425
|
+
default_activation: "button",
|
|
1426
|
+
param_source: "record",
|
|
1432
1427
|
},
|
|
1433
1428
|
"activity-feed": {
|
|
1434
1429
|
description:
|
|
1435
1430
|
"Chronological list of recent items/events, showing title, description, and timestamp.",
|
|
1436
|
-
dataSource:
|
|
1437
|
-
|
|
1438
|
-
config: {
|
|
1431
|
+
dataSource: "Required — type: 'structure'",
|
|
1432
|
+
feedConfig: {
|
|
1439
1433
|
titleField: "string — field to use as item title",
|
|
1440
|
-
descriptionField:
|
|
1441
|
-
"string | null — field for item description",
|
|
1434
|
+
descriptionField: "string | null — field for item description",
|
|
1442
1435
|
timestampField: "string — field for item timestamp",
|
|
1443
1436
|
iconField: "string | null — field for item icon",
|
|
1444
1437
|
maxItems: "number (default: 10)",
|
|
@@ -1447,147 +1440,66 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1447
1440
|
"progress-indicator": {
|
|
1448
1441
|
description:
|
|
1449
1442
|
"Visual progress display — bar, ring, or badge. Shows completion toward a target.",
|
|
1450
|
-
dataSource:
|
|
1451
|
-
|
|
1452
|
-
config: {
|
|
1443
|
+
dataSource: "Optional — can use static value or aggregate from data",
|
|
1444
|
+
progressConfig: {
|
|
1453
1445
|
mode: "'bar' | 'ring' | 'badge'",
|
|
1454
1446
|
label: "string",
|
|
1455
1447
|
value: "number | null — static value (if no dataSource)",
|
|
1456
|
-
valueField:
|
|
1457
|
-
"string | null — field to aggregate (if using dataSource)",
|
|
1458
|
-
aggregation:
|
|
1459
|
-
"'count' | 'sum' | 'average' | 'percentage'",
|
|
1448
|
+
valueField: "string | null — field to aggregate (if using dataSource)",
|
|
1460
1449
|
target: "number — the 100% target value",
|
|
1461
|
-
thresholds:
|
|
1462
|
-
"{ green?: [min, max], amber?: [min, max], red?: [min, max] }",
|
|
1450
|
+
thresholds: "{ green?: [min, max], amber?: [min, max], red?: [min, max] }",
|
|
1463
1451
|
},
|
|
1464
1452
|
},
|
|
1465
1453
|
kanban: {
|
|
1466
1454
|
description:
|
|
1467
1455
|
"Kanban board — drag-and-drop cards grouped by a status/category field.",
|
|
1468
|
-
dataSource:
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
"string — field to group cards by (e.g., 'status')",
|
|
1473
|
-
columnOrder:
|
|
1474
|
-
"string[] | null — explicit column order (e.g., ['todo', 'in-progress', 'done'])",
|
|
1456
|
+
dataSource: "Required — type: 'structure'",
|
|
1457
|
+
kanbanConfig: {
|
|
1458
|
+
groupByField: "string — field to group cards by (e.g., 'status')",
|
|
1459
|
+
columnOrder: "string[] | null — explicit column order (e.g., ['todo', 'in-progress', 'done'])",
|
|
1475
1460
|
cardTitleField: "string — field for card title",
|
|
1476
|
-
cardSubtitleField:
|
|
1477
|
-
|
|
1478
|
-
cardBadgeField:
|
|
1479
|
-
"string | null — field for a badge/tag on the card",
|
|
1461
|
+
cardSubtitleField: "string | null — field for card subtitle",
|
|
1462
|
+
cardBadgeField: "string | null — field for a badge/tag on the card",
|
|
1480
1463
|
},
|
|
1481
1464
|
},
|
|
1482
1465
|
calendar: {
|
|
1483
1466
|
description:
|
|
1484
1467
|
"Calendar view — displays records as events on a month/week/day calendar.",
|
|
1485
|
-
dataSource:
|
|
1486
|
-
|
|
1487
|
-
config: {
|
|
1468
|
+
dataSource: "Required — type: 'structure'",
|
|
1469
|
+
calendarConfig: {
|
|
1488
1470
|
dateField: "string — field for event start date",
|
|
1489
|
-
endDateField:
|
|
1490
|
-
"string | null — field for event end date (for multi-day events)",
|
|
1471
|
+
endDateField: "string | null — field for event end date (for multi-day events)",
|
|
1491
1472
|
titleField: "string — field for event title",
|
|
1492
|
-
colorField:
|
|
1493
|
-
|
|
1494
|
-
defaultView:
|
|
1495
|
-
"'month' | 'week' | 'day' (default: 'month')",
|
|
1496
|
-
eventClickAction:
|
|
1497
|
-
"BlockAction | null — action when an event is clicked",
|
|
1473
|
+
colorField: "string | null — field to determine event color",
|
|
1474
|
+
defaultView: "'month' | 'week' | 'day' (default: 'month')",
|
|
1498
1475
|
},
|
|
1499
1476
|
},
|
|
1500
1477
|
"filter-bar": {
|
|
1501
1478
|
description:
|
|
1502
1479
|
"Global filter bar for dashboards — provides date range pickers and dropdown filters that control other blocks on the page.",
|
|
1503
1480
|
dataSource: "Not required",
|
|
1504
|
-
|
|
1505
|
-
dateField:
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
"('today' | '7d' | '30d' | '90d' | 'custom')[] — available date range presets",
|
|
1509
|
-
dropdownFilters:
|
|
1510
|
-
"{ field: string, label: string }[] — dropdown filter options",
|
|
1481
|
+
filterBarConfig: {
|
|
1482
|
+
dateField: "string | null — field to filter by date range",
|
|
1483
|
+
datePresets: "('today' | '7d' | '30d' | '90d' | 'custom')[] — available date range presets",
|
|
1484
|
+
dropdownFilters: "{ field: string, label: string }[] — dropdown filter options",
|
|
1511
1485
|
},
|
|
1512
1486
|
},
|
|
1513
1487
|
"related-list": {
|
|
1514
1488
|
description:
|
|
1515
|
-
"Displays related records from another collection. Similar to data-table but used in detail pages to show linked data
|
|
1516
|
-
dataSource:
|
|
1517
|
-
|
|
1489
|
+
"Displays related records from another collection. Similar to data-table but used in detail pages to show linked data.",
|
|
1490
|
+
dataSource: "Required — type: 'structure'",
|
|
1491
|
+
columns: "{ key: string, label: string }[] — column definitions on the block object",
|
|
1518
1492
|
allowed_actions: ["navigate-to-page", "invoke-trigger"],
|
|
1519
1493
|
default_activation: "row-click",
|
|
1520
1494
|
param_source: "row",
|
|
1521
1495
|
},
|
|
1522
|
-
|
|
1523
|
-
description:
|
|
1524
|
-
|
|
1525
|
-
dataSource:
|
|
1526
|
-
"Required — type: 'structure', mode: 'single'",
|
|
1527
|
-
allowed_actions: ["invoke-trigger", "navigate-to-page"],
|
|
1528
|
-
default_activation: "button",
|
|
1529
|
-
param_source: "record",
|
|
1530
|
-
},
|
|
1531
|
-
"field-group": {
|
|
1532
|
-
description:
|
|
1533
|
-
"Group of editable form fields. Used in form pages for structured data entry with multiple fields in a logical group.",
|
|
1534
|
-
dataSource:
|
|
1535
|
-
"Optional — if set with mode: 'single', pre-populates for editing",
|
|
1536
|
-
allowed_actions: [
|
|
1537
|
-
"create-record",
|
|
1538
|
-
"update-record",
|
|
1539
|
-
"invoke-trigger",
|
|
1540
|
-
],
|
|
1541
|
-
default_activation: "form-submit",
|
|
1542
|
-
param_source: "form",
|
|
1543
|
-
},
|
|
1544
|
-
"text-input": {
|
|
1545
|
-
description:
|
|
1546
|
-
"Single-line text input field for form pages.",
|
|
1547
|
-
dataSource: "Not required (value comes from user input)",
|
|
1548
|
-
category: "field-block",
|
|
1549
|
-
},
|
|
1550
|
-
"number-input": {
|
|
1551
|
-
description:
|
|
1552
|
-
"Numeric input field for form pages. Supports min/max constraints.",
|
|
1553
|
-
dataSource: "Not required",
|
|
1554
|
-
category: "field-block",
|
|
1555
|
-
},
|
|
1556
|
-
select: {
|
|
1557
|
-
description:
|
|
1558
|
-
"Dropdown select input for form pages. Options can be static or dynamically loaded from a collection.",
|
|
1559
|
-
dataSource: "Not required (static options) or optional (dynamic options from collection)",
|
|
1560
|
-
category: "field-block",
|
|
1561
|
-
},
|
|
1562
|
-
checkbox: {
|
|
1563
|
-
description:
|
|
1564
|
-
"Boolean checkbox input for form pages.",
|
|
1565
|
-
dataSource: "Not required",
|
|
1566
|
-
category: "field-block",
|
|
1567
|
-
},
|
|
1568
|
-
"date-picker": {
|
|
1569
|
-
description:
|
|
1570
|
-
"Date/datetime picker input for form pages.",
|
|
1571
|
-
dataSource: "Not required",
|
|
1572
|
-
category: "field-block",
|
|
1573
|
-
},
|
|
1574
|
-
textarea: {
|
|
1575
|
-
description:
|
|
1576
|
-
"Multi-line text input for form pages. Use for long text, descriptions, notes.",
|
|
1577
|
-
dataSource: "Not required",
|
|
1578
|
-
category: "field-block",
|
|
1579
|
-
},
|
|
1580
|
-
"file-upload": {
|
|
1581
|
-
description:
|
|
1582
|
-
"File upload input for form pages. Stores files in blob storage.",
|
|
1583
|
-
dataSource: "Not required",
|
|
1584
|
-
category: "field-block",
|
|
1496
|
+
form: {
|
|
1497
|
+
description: "DEPRECATED — use 'field-group' blockType instead. The runtime does not handle 'form' as a blockType.",
|
|
1498
|
+
IMPORTANT: "Do NOT use this. Use field-group with a fields array.",
|
|
1585
1499
|
},
|
|
1586
|
-
|
|
1587
|
-
description:
|
|
1588
|
-
|
|
1589
|
-
dataSource: "Not required",
|
|
1590
|
-
category: "field-block",
|
|
1500
|
+
"detail-fields": {
|
|
1501
|
+
description: "DEPRECATED — use 'field-display' blockType instead. The runtime does not handle 'detail-fields'.",
|
|
1502
|
+
IMPORTANT: "Do NOT use this. Use field-display with a fields array.",
|
|
1591
1503
|
},
|
|
1592
1504
|
markdown: {
|
|
1593
1505
|
description:
|
|
@@ -1606,9 +1518,9 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1606
1518
|
},
|
|
1607
1519
|
block_categories: {
|
|
1608
1520
|
"data-block":
|
|
1609
|
-
"Blocks that display data from collections (data-table, chart, metric-card, stat-group,
|
|
1610
|
-
"
|
|
1611
|
-
"
|
|
1521
|
+
"Blocks that display data from collections (data-table, chart, metric-card, stat-group, field-display, related-list, activity-feed, kanban, calendar, progress-indicator)",
|
|
1522
|
+
"form-block":
|
|
1523
|
+
"Use 'field-group' blockType with a 'fields' array for form pages. Do NOT use individual field block types (text-input, select, etc.) — the runtime renders field types from the field-group's fields array.",
|
|
1612
1524
|
"content-block":
|
|
1613
1525
|
"Static content blocks (markdown, static-html). Must have non-empty 'content' property.",
|
|
1614
1526
|
"layout-block":
|
|
@@ -219,7 +219,7 @@ export function registerOrchestrationTools(server: McpServer, sdk: CentraliSDK)
|
|
|
219
219
|
.describe("Trigger configuration object. Must include 'type' (on-demand, event-driven, scheduled, webhook)"),
|
|
220
220
|
steps: z
|
|
221
221
|
.array(z.record(z.string(), z.any()))
|
|
222
|
-
.describe("Array of step definitions. Step types: 'compute' (functionId + onSuccess/onFailure), 'decision' (cases with conditions using path/op/value + defaultNextStepId), 'delay' (delayMs + nextStepId). Call describe_orchestrations for full schema."),
|
|
222
|
+
.describe("Array of step definitions. Step types: 'compute' (functionId + onSuccess/onFailure + optional encryptedParams), 'decision' (cases with conditions using path/op/value + defaultNextStepId), 'delay' (delayMs + nextStepId). Compute steps support encryptedParams: { KEY: { value: 'plaintext', encrypt: true } } for secrets like API keys — values are encrypted at rest and decrypted at execution time into triggerParams. Call describe_orchestrations for full schema."),
|
|
223
223
|
},
|
|
224
224
|
async ({ slug, name, description, trigger, steps }) => {
|
|
225
225
|
try {
|
|
@@ -262,7 +262,7 @@ export function registerOrchestrationTools(server: McpServer, sdk: CentraliSDK)
|
|
|
262
262
|
steps: z
|
|
263
263
|
.array(z.record(z.string(), z.any()))
|
|
264
264
|
.optional()
|
|
265
|
-
.describe("Updated step definitions"),
|
|
265
|
+
.describe("Updated step definitions. Compute steps support encryptedParams: { KEY: { value: 'plaintext', encrypt: true } } for secrets. Existing encrypted params with { encrypted: true } are preserved as-is; omitted params are removed."),
|
|
266
266
|
},
|
|
267
267
|
async ({ orchestrationId, name, description, status, trigger, steps }) => {
|
|
268
268
|
try {
|