@centrali-io/centrali-mcp 4.2.12 → 4.2.14
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 +107 -145
- package/dist/tools/orchestrations.js +2 -2
- package/package.json +1 -1
- package/src/tools/describe.ts +123 -210
- 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",
|
|
@@ -754,6 +768,7 @@ function registerDescribeTools(server) {
|
|
|
754
768
|
"Use correlationId when triggering to trace runs across systems",
|
|
755
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.",
|
|
756
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.",
|
|
757
772
|
],
|
|
758
773
|
}, null, 2),
|
|
759
774
|
},
|
|
@@ -871,7 +886,6 @@ function registerDescribeTools(server) {
|
|
|
871
886
|
description: "Single-record view — shows all fields of one record with optional related data and actions.",
|
|
872
887
|
typical_sections: ["hero", "content", "supporting"],
|
|
873
888
|
typical_blocks: [
|
|
874
|
-
"detail-fields",
|
|
875
889
|
"field-display",
|
|
876
890
|
"related-list",
|
|
877
891
|
"activity-feed",
|
|
@@ -882,18 +896,8 @@ function registerDescribeTools(server) {
|
|
|
882
896
|
form: {
|
|
883
897
|
description: "Data entry form — lets users create or update records with validation and submission actions.",
|
|
884
898
|
typical_sections: ["content", "actions"],
|
|
885
|
-
typical_blocks: [
|
|
886
|
-
|
|
887
|
-
"field-group",
|
|
888
|
-
"text-input",
|
|
889
|
-
"number-input",
|
|
890
|
-
"select",
|
|
891
|
-
"checkbox",
|
|
892
|
-
"date-picker",
|
|
893
|
-
"textarea",
|
|
894
|
-
"file-upload",
|
|
895
|
-
],
|
|
896
|
-
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.",
|
|
897
901
|
use_when: "You need users to input or edit data",
|
|
898
902
|
},
|
|
899
903
|
dashboard: {
|
|
@@ -1004,29 +1008,22 @@ function registerDescribeTools(server) {
|
|
|
1004
1008
|
filterableColumns: "string[] | null — which columns users can filter on (for data-table blocks)",
|
|
1005
1009
|
},
|
|
1006
1010
|
data_source_shape: {
|
|
1007
|
-
type: "'structure'
|
|
1008
|
-
ref: "string — the collection ID (UUID)
|
|
1009
|
-
|
|
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.",
|
|
1010
1014
|
config: {
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
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",
|
|
1014
1017
|
sort: "SortConfig[] | null — array of { field, direction: 'asc' | 'desc' }",
|
|
1015
|
-
limit: "number | null — max records to fetch",
|
|
1016
1018
|
page: "number | null — for pagination",
|
|
1017
1019
|
pageSize: "number | null — records per page",
|
|
1018
1020
|
},
|
|
1019
1021
|
aggregation: {
|
|
1020
|
-
description: "
|
|
1022
|
+
description: "For metric/chart blocks. Defines computations over the data.",
|
|
1021
1023
|
operations: "Record<string, { count?: '*', sum?: 'fieldName', avg?: 'fieldName', min?: 'fieldName', max?: 'fieldName' }>",
|
|
1022
1024
|
groupBy: "string[] | null — fields to group by",
|
|
1023
1025
|
},
|
|
1024
|
-
|
|
1025
|
-
presentation_shape: {
|
|
1026
|
-
density: "'compact' | 'comfortable' | 'spacious' — controls spacing/padding",
|
|
1027
|
-
columns: "string[] — which columns to show (for table blocks)",
|
|
1028
|
-
chartType: "'bar' | 'line' | 'pie' — for chart blocks",
|
|
1029
|
-
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.",
|
|
1030
1027
|
},
|
|
1031
1028
|
narrative_shape: {
|
|
1032
1029
|
primaryQuestion: "string — the business question this block answers (e.g., 'How are sales trending?')",
|
|
@@ -1049,20 +1046,14 @@ function registerDescribeTools(server) {
|
|
|
1049
1046
|
dataSource: {
|
|
1050
1047
|
type: "structure",
|
|
1051
1048
|
ref: "<collection-uuid>",
|
|
1052
|
-
|
|
1053
|
-
config: {
|
|
1054
|
-
fields: [
|
|
1055
|
-
"name",
|
|
1056
|
-
"email",
|
|
1057
|
-
"status",
|
|
1058
|
-
"createdAt",
|
|
1059
|
-
],
|
|
1060
|
-
sort: [{ field: "createdAt", direction: "desc" }],
|
|
1061
|
-
pageSize: 25,
|
|
1062
|
-
},
|
|
1049
|
+
recordSlug: "customers",
|
|
1063
1050
|
},
|
|
1064
|
-
|
|
1065
|
-
|
|
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
|
+
],
|
|
1066
1057
|
},
|
|
1067
1058
|
],
|
|
1068
1059
|
},
|
|
@@ -1153,42 +1144,56 @@ function registerDescribeTools(server) {
|
|
|
1153
1144
|
text: JSON.stringify({
|
|
1154
1145
|
domain: "Page Block Types",
|
|
1155
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.",
|
|
1156
1148
|
block_types: {
|
|
1157
1149
|
"data-table": {
|
|
1158
|
-
description: "Tabular data display with columns, sorting, filtering, and pagination. The primary block for list pages.",
|
|
1159
|
-
dataSource: "Required — type: 'structure'
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
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
|
+
],
|
|
1165
1162
|
},
|
|
1166
|
-
presentation: "density, columns, emphasisRules",
|
|
1167
|
-
filterableColumns: "string[] — columns users can filter on",
|
|
1168
1163
|
},
|
|
1169
1164
|
"metric-card": {
|
|
1170
1165
|
description: "Single KPI metric display — shows a number with label, optional trend, and thresholds.",
|
|
1171
|
-
dataSource: "Required — type: 'structure', mode: 'aggregate' with
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
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
|
+
},
|
|
1179
1184
|
},
|
|
1180
1185
|
},
|
|
1181
1186
|
"stat-group": {
|
|
1182
1187
|
description: "Group of 2-5 related metrics displayed side by side. More compact than individual metric-cards.",
|
|
1183
1188
|
dataSource: "Not set at block level — each item has its own dataSource",
|
|
1184
|
-
|
|
1189
|
+
statGroupConfig: {
|
|
1185
1190
|
items: "StatGroupItem[] — array of { id, label, dataSource, aggregation, valueField, format, trend }",
|
|
1186
1191
|
},
|
|
1187
1192
|
},
|
|
1188
1193
|
chart: {
|
|
1189
1194
|
description: "Data visualization — bar, line, or pie chart.",
|
|
1190
|
-
dataSource: "Required — type: 'structure'
|
|
1191
|
-
|
|
1195
|
+
dataSource: "Required — type: 'structure' with aggregation and groupBy in the dataSource",
|
|
1196
|
+
chartConfig: {
|
|
1192
1197
|
chartType: "'bar' | 'line' | 'pie'",
|
|
1193
1198
|
categoryField: "string — field for x-axis / categories",
|
|
1194
1199
|
valueField: "string — field for y-axis / values",
|
|
@@ -1196,31 +1201,39 @@ function registerDescribeTools(server) {
|
|
|
1196
1201
|
colors: "string[] | null — custom color palette",
|
|
1197
1202
|
showLegend: "boolean (default: true)",
|
|
1198
1203
|
},
|
|
1199
|
-
presentation: "chartType",
|
|
1200
1204
|
},
|
|
1201
|
-
|
|
1202
|
-
description: "
|
|
1203
|
-
dataSource: "Optional —
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
},
|
|
1207
|
-
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: {
|
|
1208
1210
|
key: "string — maps to the record's data field name",
|
|
1209
|
-
label: "string — display label",
|
|
1210
|
-
type: "'text' | 'number' | 'email' | 'date' | 'boolean' | 'select' | 'textarea'",
|
|
1211
|
-
required: "boolean (default: false)",
|
|
1211
|
+
label: "string — display label (unused for hidden fields)",
|
|
1212
|
+
type: "'text' | 'number' | 'email' | 'date' | 'boolean' | 'select' | 'textarea' | 'hidden'",
|
|
1213
|
+
required: "boolean (default: false) — ignored for hidden fields",
|
|
1212
1214
|
placeholder: "string | null",
|
|
1213
|
-
|
|
1215
|
+
defaultValue: "string | number | boolean | { source: 'auth' | 'system', field: string } — static value or derived default. For hidden fields, this is the value injected at submit time. For visible fields, this pre-populates the input. Derived sources: auth.userId, auth.email, auth.name (from logged-in user), system.now (server timestamp). Derived defaults are resolved server-side.",
|
|
1216
|
+
resolveErrorMessage: "string | null — custom error message shown when a derived defaultValue cannot be resolved (e.g. user not signed in). Defaults to 'This form requires you to be signed in' for auth source.",
|
|
1217
|
+
options: "For 'select' type: { label: string, value: string }[] — inline static options",
|
|
1218
|
+
optionSource: "For 'select' type (alternative): { type: 'static' | 'dynamic', staticOptions?: [{label, value}], dynamicRef?: 'collection-uuid', labelField?, valueField? }",
|
|
1214
1219
|
},
|
|
1220
|
+
HIDDEN_FIELDS: "Fields with type 'hidden' are NOT rendered to end users but their defaultValue is included in the form submission payload. Use for auto-populated values like status, provider, userId, timestamps. Static defaults are injected directly; derived defaults (auth/system) are resolved securely on the server.",
|
|
1221
|
+
allowed_actions: ["create-record", "update-record", "invoke-trigger"],
|
|
1222
|
+
default_activation: "form-submit",
|
|
1223
|
+
param_source: "form",
|
|
1215
1224
|
},
|
|
1216
|
-
"
|
|
1217
|
-
description: "Read-only display of
|
|
1218
|
-
dataSource: "Required — type: 'structure'
|
|
1225
|
+
"field-display": {
|
|
1226
|
+
description: "Read-only display of record fields with labels. THE block type for detail pages. Contains a 'fields' array directly on the block.",
|
|
1227
|
+
dataSource: "Required — type: 'structure'",
|
|
1228
|
+
fields: "{ key: string, label: string }[] — fields to display from the record",
|
|
1229
|
+
allowed_actions: ["invoke-trigger", "navigate-to-page"],
|
|
1230
|
+
default_activation: "button",
|
|
1231
|
+
param_source: "record",
|
|
1219
1232
|
},
|
|
1220
1233
|
"activity-feed": {
|
|
1221
1234
|
description: "Chronological list of recent items/events, showing title, description, and timestamp.",
|
|
1222
|
-
dataSource: "Required — type: 'structure'
|
|
1223
|
-
|
|
1235
|
+
dataSource: "Required — type: 'structure'",
|
|
1236
|
+
feedConfig: {
|
|
1224
1237
|
titleField: "string — field to use as item title",
|
|
1225
1238
|
descriptionField: "string | null — field for item description",
|
|
1226
1239
|
timestampField: "string — field for item timestamp",
|
|
@@ -1231,20 +1244,19 @@ function registerDescribeTools(server) {
|
|
|
1231
1244
|
"progress-indicator": {
|
|
1232
1245
|
description: "Visual progress display — bar, ring, or badge. Shows completion toward a target.",
|
|
1233
1246
|
dataSource: "Optional — can use static value or aggregate from data",
|
|
1234
|
-
|
|
1247
|
+
progressConfig: {
|
|
1235
1248
|
mode: "'bar' | 'ring' | 'badge'",
|
|
1236
1249
|
label: "string",
|
|
1237
1250
|
value: "number | null — static value (if no dataSource)",
|
|
1238
1251
|
valueField: "string | null — field to aggregate (if using dataSource)",
|
|
1239
|
-
aggregation: "'count' | 'sum' | 'average' | 'percentage'",
|
|
1240
1252
|
target: "number — the 100% target value",
|
|
1241
1253
|
thresholds: "{ green?: [min, max], amber?: [min, max], red?: [min, max] }",
|
|
1242
1254
|
},
|
|
1243
1255
|
},
|
|
1244
1256
|
kanban: {
|
|
1245
1257
|
description: "Kanban board — drag-and-drop cards grouped by a status/category field.",
|
|
1246
|
-
dataSource: "Required — type: 'structure'
|
|
1247
|
-
|
|
1258
|
+
dataSource: "Required — type: 'structure'",
|
|
1259
|
+
kanbanConfig: {
|
|
1248
1260
|
groupByField: "string — field to group cards by (e.g., 'status')",
|
|
1249
1261
|
columnOrder: "string[] | null — explicit column order (e.g., ['todo', 'in-progress', 'done'])",
|
|
1250
1262
|
cardTitleField: "string — field for card title",
|
|
@@ -1254,89 +1266,39 @@ function registerDescribeTools(server) {
|
|
|
1254
1266
|
},
|
|
1255
1267
|
calendar: {
|
|
1256
1268
|
description: "Calendar view — displays records as events on a month/week/day calendar.",
|
|
1257
|
-
dataSource: "Required — type: 'structure'
|
|
1258
|
-
|
|
1269
|
+
dataSource: "Required — type: 'structure'",
|
|
1270
|
+
calendarConfig: {
|
|
1259
1271
|
dateField: "string — field for event start date",
|
|
1260
1272
|
endDateField: "string | null — field for event end date (for multi-day events)",
|
|
1261
1273
|
titleField: "string — field for event title",
|
|
1262
1274
|
colorField: "string | null — field to determine event color",
|
|
1263
1275
|
defaultView: "'month' | 'week' | 'day' (default: 'month')",
|
|
1264
|
-
eventClickAction: "BlockAction | null — action when an event is clicked",
|
|
1265
1276
|
},
|
|
1266
1277
|
},
|
|
1267
1278
|
"filter-bar": {
|
|
1268
1279
|
description: "Global filter bar for dashboards — provides date range pickers and dropdown filters that control other blocks on the page.",
|
|
1269
1280
|
dataSource: "Not required",
|
|
1270
|
-
|
|
1281
|
+
filterBarConfig: {
|
|
1271
1282
|
dateField: "string | null — field to filter by date range",
|
|
1272
1283
|
datePresets: "('today' | '7d' | '30d' | '90d' | 'custom')[] — available date range presets",
|
|
1273
1284
|
dropdownFilters: "{ field: string, label: string }[] — dropdown filter options",
|
|
1274
1285
|
},
|
|
1275
1286
|
},
|
|
1276
1287
|
"related-list": {
|
|
1277
|
-
description: "Displays related records from another collection. Similar to data-table but used in detail pages to show linked data
|
|
1278
|
-
dataSource: "Required — type: 'structure'
|
|
1288
|
+
description: "Displays related records from another collection. Similar to data-table but used in detail pages to show linked data.",
|
|
1289
|
+
dataSource: "Required — type: 'structure'",
|
|
1290
|
+
columns: "{ key: string, label: string }[] — column definitions on the block object",
|
|
1279
1291
|
allowed_actions: ["navigate-to-page", "invoke-trigger"],
|
|
1280
1292
|
default_activation: "row-click",
|
|
1281
1293
|
param_source: "row",
|
|
1282
1294
|
},
|
|
1283
|
-
|
|
1284
|
-
description: "
|
|
1285
|
-
|
|
1286
|
-
allowed_actions: ["invoke-trigger", "navigate-to-page"],
|
|
1287
|
-
default_activation: "button",
|
|
1288
|
-
param_source: "record",
|
|
1289
|
-
},
|
|
1290
|
-
"field-group": {
|
|
1291
|
-
description: "Group of editable form fields. Used in form pages for structured data entry with multiple fields in a logical group.",
|
|
1292
|
-
dataSource: "Optional — if set with mode: 'single', pre-populates for editing",
|
|
1293
|
-
allowed_actions: [
|
|
1294
|
-
"create-record",
|
|
1295
|
-
"update-record",
|
|
1296
|
-
"invoke-trigger",
|
|
1297
|
-
],
|
|
1298
|
-
default_activation: "form-submit",
|
|
1299
|
-
param_source: "form",
|
|
1300
|
-
},
|
|
1301
|
-
"text-input": {
|
|
1302
|
-
description: "Single-line text input field for form pages.",
|
|
1303
|
-
dataSource: "Not required (value comes from user input)",
|
|
1304
|
-
category: "field-block",
|
|
1305
|
-
},
|
|
1306
|
-
"number-input": {
|
|
1307
|
-
description: "Numeric input field for form pages. Supports min/max constraints.",
|
|
1308
|
-
dataSource: "Not required",
|
|
1309
|
-
category: "field-block",
|
|
1310
|
-
},
|
|
1311
|
-
select: {
|
|
1312
|
-
description: "Dropdown select input for form pages. Options can be static or dynamically loaded from a collection.",
|
|
1313
|
-
dataSource: "Not required (static options) or optional (dynamic options from collection)",
|
|
1314
|
-
category: "field-block",
|
|
1315
|
-
},
|
|
1316
|
-
checkbox: {
|
|
1317
|
-
description: "Boolean checkbox input for form pages.",
|
|
1318
|
-
dataSource: "Not required",
|
|
1319
|
-
category: "field-block",
|
|
1320
|
-
},
|
|
1321
|
-
"date-picker": {
|
|
1322
|
-
description: "Date/datetime picker input for form pages.",
|
|
1323
|
-
dataSource: "Not required",
|
|
1324
|
-
category: "field-block",
|
|
1325
|
-
},
|
|
1326
|
-
textarea: {
|
|
1327
|
-
description: "Multi-line text input for form pages. Use for long text, descriptions, notes.",
|
|
1328
|
-
dataSource: "Not required",
|
|
1329
|
-
category: "field-block",
|
|
1330
|
-
},
|
|
1331
|
-
"file-upload": {
|
|
1332
|
-
description: "File upload input for form pages. Stores files in blob storage.",
|
|
1333
|
-
dataSource: "Not required",
|
|
1334
|
-
category: "field-block",
|
|
1295
|
+
form: {
|
|
1296
|
+
description: "DEPRECATED — use 'field-group' blockType instead. The runtime does not handle 'form' as a blockType.",
|
|
1297
|
+
IMPORTANT: "Do NOT use this. Use field-group with a fields array.",
|
|
1335
1298
|
},
|
|
1336
|
-
|
|
1337
|
-
description: "
|
|
1338
|
-
|
|
1339
|
-
category: "field-block",
|
|
1299
|
+
"detail-fields": {
|
|
1300
|
+
description: "DEPRECATED — use 'field-display' blockType instead. The runtime does not handle 'detail-fields'.",
|
|
1301
|
+
IMPORTANT: "Do NOT use this. Use field-display with a fields array.",
|
|
1340
1302
|
},
|
|
1341
1303
|
markdown: {
|
|
1342
1304
|
description: "Static markdown content block. Renders markdown text on the page. Must have non-empty content to pass publishing validation.",
|
|
@@ -1352,8 +1314,8 @@ function registerDescribeTools(server) {
|
|
|
1352
1314
|
},
|
|
1353
1315
|
},
|
|
1354
1316
|
block_categories: {
|
|
1355
|
-
"data-block": "Blocks that display data from collections (data-table, chart, metric-card, stat-group,
|
|
1356
|
-
"
|
|
1317
|
+
"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)",
|
|
1318
|
+
"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.",
|
|
1357
1319
|
"content-block": "Static content blocks (markdown, static-html). Must have non-empty 'content' property.",
|
|
1358
1320
|
"layout-block": "Blocks that control page-level behavior (filter-bar)",
|
|
1359
1321
|
},
|
|
@@ -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",
|
|
@@ -847,6 +861,7 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
847
861
|
"Use correlationId when triggering to trace runs across systems",
|
|
848
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.",
|
|
849
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.",
|
|
850
865
|
],
|
|
851
866
|
},
|
|
852
867
|
null,
|
|
@@ -1006,7 +1021,6 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1006
1021
|
"Single-record view — shows all fields of one record with optional related data and actions.",
|
|
1007
1022
|
typical_sections: ["hero", "content", "supporting"],
|
|
1008
1023
|
typical_blocks: [
|
|
1009
|
-
"detail-fields",
|
|
1010
1024
|
"field-display",
|
|
1011
1025
|
"related-list",
|
|
1012
1026
|
"activity-feed",
|
|
@@ -1019,19 +1033,8 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1019
1033
|
description:
|
|
1020
1034
|
"Data entry form — lets users create or update records with validation and submission actions.",
|
|
1021
1035
|
typical_sections: ["content", "actions"],
|
|
1022
|
-
typical_blocks: [
|
|
1023
|
-
|
|
1024
|
-
"field-group",
|
|
1025
|
-
"text-input",
|
|
1026
|
-
"number-input",
|
|
1027
|
-
"select",
|
|
1028
|
-
"checkbox",
|
|
1029
|
-
"date-picker",
|
|
1030
|
-
"textarea",
|
|
1031
|
-
"file-upload",
|
|
1032
|
-
],
|
|
1033
|
-
validation_requirement:
|
|
1034
|
-
"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.",
|
|
1035
1038
|
use_when: "You need users to input or edit data",
|
|
1036
1039
|
},
|
|
1037
1040
|
dashboard: {
|
|
@@ -1177,36 +1180,24 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1177
1180
|
"string[] | null — which columns users can filter on (for data-table blocks)",
|
|
1178
1181
|
},
|
|
1179
1182
|
data_source_shape: {
|
|
1180
|
-
type: "'structure'
|
|
1181
|
-
ref: "string — the collection ID (UUID)
|
|
1182
|
-
|
|
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.",
|
|
1183
1186
|
config: {
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
fieldOrder:
|
|
1187
|
-
"string[] | null — display order for fields",
|
|
1188
|
-
filters:
|
|
1189
|
-
"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",
|
|
1190
1189
|
sort: "SortConfig[] | null — array of { field, direction: 'asc' | 'desc' }",
|
|
1191
|
-
limit: "number | null — max records to fetch",
|
|
1192
1190
|
page: "number | null — for pagination",
|
|
1193
1191
|
pageSize: "number | null — records per page",
|
|
1194
1192
|
},
|
|
1195
1193
|
aggregation: {
|
|
1196
1194
|
description:
|
|
1197
|
-
"
|
|
1195
|
+
"For metric/chart blocks. Defines computations over the data.",
|
|
1198
1196
|
operations:
|
|
1199
1197
|
"Record<string, { count?: '*', sum?: 'fieldName', avg?: 'fieldName', min?: 'fieldName', max?: 'fieldName' }>",
|
|
1200
1198
|
groupBy: "string[] | null — fields to group by",
|
|
1201
1199
|
},
|
|
1202
|
-
|
|
1203
|
-
presentation_shape: {
|
|
1204
|
-
density:
|
|
1205
|
-
"'compact' | 'comfortable' | 'spacious' — controls spacing/padding",
|
|
1206
|
-
columns: "string[] — which columns to show (for table blocks)",
|
|
1207
|
-
chartType: "'bar' | 'line' | 'pie' — for chart blocks",
|
|
1208
|
-
emphasisRules:
|
|
1209
|
-
"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.",
|
|
1210
1201
|
},
|
|
1211
1202
|
narrative_shape: {
|
|
1212
1203
|
primaryQuestion:
|
|
@@ -1233,20 +1224,14 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1233
1224
|
dataSource: {
|
|
1234
1225
|
type: "structure",
|
|
1235
1226
|
ref: "<collection-uuid>",
|
|
1236
|
-
|
|
1237
|
-
config: {
|
|
1238
|
-
fields: [
|
|
1239
|
-
"name",
|
|
1240
|
-
"email",
|
|
1241
|
-
"status",
|
|
1242
|
-
"createdAt",
|
|
1243
|
-
],
|
|
1244
|
-
sort: [{ field: "createdAt", direction: "desc" }],
|
|
1245
|
-
pageSize: 25,
|
|
1246
|
-
},
|
|
1227
|
+
recordSlug: "customers",
|
|
1247
1228
|
},
|
|
1248
|
-
|
|
1249
|
-
|
|
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
|
+
],
|
|
1250
1235
|
},
|
|
1251
1236
|
],
|
|
1252
1237
|
},
|
|
@@ -1347,46 +1332,53 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1347
1332
|
domain: "Page Block Types",
|
|
1348
1333
|
description:
|
|
1349
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.",
|
|
1350
1336
|
block_types: {
|
|
1351
1337
|
"data-table": {
|
|
1352
1338
|
description:
|
|
1353
|
-
"Tabular data display with columns, sorting, filtering, and pagination. The primary block for list pages.",
|
|
1354
|
-
dataSource: "Required — type: 'structure'
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
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
|
+
],
|
|
1363
1351
|
},
|
|
1364
|
-
presentation: "density, columns, emphasisRules",
|
|
1365
|
-
filterableColumns: "string[] — columns users can filter on",
|
|
1366
1352
|
},
|
|
1367
1353
|
"metric-card": {
|
|
1368
1354
|
description:
|
|
1369
1355
|
"Single KPI metric display — shows a number with label, optional trend, and thresholds.",
|
|
1370
1356
|
dataSource:
|
|
1371
|
-
"Required — type: 'structure', mode: 'aggregate' with
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
"
|
|
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
|
+
},
|
|
1383
1375
|
},
|
|
1384
1376
|
},
|
|
1385
1377
|
"stat-group": {
|
|
1386
1378
|
description:
|
|
1387
1379
|
"Group of 2-5 related metrics displayed side by side. More compact than individual metric-cards.",
|
|
1388
1380
|
dataSource: "Not set at block level — each item has its own dataSource",
|
|
1389
|
-
|
|
1381
|
+
statGroupConfig: {
|
|
1390
1382
|
items:
|
|
1391
1383
|
"StatGroupItem[] — array of { id, label, dataSource, aggregation, valueField, format, trend }",
|
|
1392
1384
|
},
|
|
@@ -1395,52 +1387,54 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1395
1387
|
description:
|
|
1396
1388
|
"Data visualization — bar, line, or pie chart.",
|
|
1397
1389
|
dataSource:
|
|
1398
|
-
"Required — type: 'structure'
|
|
1399
|
-
|
|
1390
|
+
"Required — type: 'structure' with aggregation and groupBy in the dataSource",
|
|
1391
|
+
chartConfig: {
|
|
1400
1392
|
chartType: "'bar' | 'line' | 'pie'",
|
|
1401
1393
|
categoryField: "string — field for x-axis / categories",
|
|
1402
1394
|
valueField: "string — field for y-axis / values",
|
|
1403
|
-
groupByField:
|
|
1404
|
-
"string | null — optional field for series grouping",
|
|
1395
|
+
groupByField: "string | null — optional field for series grouping",
|
|
1405
1396
|
colors: "string[] | null — custom color palette",
|
|
1406
1397
|
showLegend: "boolean (default: true)",
|
|
1407
1398
|
},
|
|
1408
|
-
presentation: "chartType",
|
|
1409
1399
|
},
|
|
1410
|
-
|
|
1400
|
+
"field-group": {
|
|
1411
1401
|
description:
|
|
1412
|
-
"
|
|
1402
|
+
"Group of editable form fields. THE block type for form pages. Contains a 'fields' array directly on the block (not under config).",
|
|
1413
1403
|
dataSource:
|
|
1414
|
-
"Optional —
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
"FormFieldDef[] — array of field definitions (see below)",
|
|
1418
|
-
},
|
|
1419
|
-
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: {
|
|
1420
1407
|
key: "string — maps to the record's data field name",
|
|
1421
|
-
label: "string — display label",
|
|
1422
|
-
type: "'text' | 'number' | 'email' | 'date' | 'boolean' | 'select' | 'textarea'",
|
|
1423
|
-
required: "boolean (default: false)",
|
|
1408
|
+
label: "string — display label (unused for hidden fields)",
|
|
1409
|
+
type: "'text' | 'number' | 'email' | 'date' | 'boolean' | 'select' | 'textarea' | 'hidden'",
|
|
1410
|
+
required: "boolean (default: false) — ignored for hidden fields",
|
|
1424
1411
|
placeholder: "string | null",
|
|
1425
|
-
|
|
1426
|
-
|
|
1412
|
+
defaultValue: "string | number | boolean | { source: 'auth' | 'system', field: string } — static value or derived default. For hidden fields, this is the value injected at submit time. For visible fields, this pre-populates the input. Derived sources: auth.userId, auth.email, auth.name (from logged-in user), system.now (server timestamp). Derived defaults are resolved server-side.",
|
|
1413
|
+
resolveErrorMessage: "string | null — custom error message shown when a derived defaultValue cannot be resolved (e.g. user not signed in). Defaults to 'This form requires you to be signed in' for auth source.",
|
|
1414
|
+
options: "For 'select' type: { label: string, value: string }[] — inline static options",
|
|
1415
|
+
optionSource: "For 'select' type (alternative): { type: 'static' | 'dynamic', staticOptions?: [{label, value}], dynamicRef?: 'collection-uuid', labelField?, valueField? }",
|
|
1427
1416
|
},
|
|
1417
|
+
HIDDEN_FIELDS: "Fields with type 'hidden' are NOT rendered to end users but their defaultValue is included in the form submission payload. Use for auto-populated values like status, provider, userId, timestamps. Static defaults are injected directly; derived defaults (auth/system) are resolved securely on the server.",
|
|
1418
|
+
allowed_actions: ["create-record", "update-record", "invoke-trigger"],
|
|
1419
|
+
default_activation: "form-submit",
|
|
1420
|
+
param_source: "form",
|
|
1428
1421
|
},
|
|
1429
|
-
"
|
|
1422
|
+
"field-display": {
|
|
1430
1423
|
description:
|
|
1431
|
-
"Read-only display of
|
|
1432
|
-
dataSource:
|
|
1433
|
-
|
|
1424
|
+
"Read-only display of record fields with labels. THE block type for detail pages. Contains a 'fields' array directly on the block.",
|
|
1425
|
+
dataSource: "Required — type: 'structure'",
|
|
1426
|
+
fields: "{ key: string, label: string }[] — fields to display from the record",
|
|
1427
|
+
allowed_actions: ["invoke-trigger", "navigate-to-page"],
|
|
1428
|
+
default_activation: "button",
|
|
1429
|
+
param_source: "record",
|
|
1434
1430
|
},
|
|
1435
1431
|
"activity-feed": {
|
|
1436
1432
|
description:
|
|
1437
1433
|
"Chronological list of recent items/events, showing title, description, and timestamp.",
|
|
1438
|
-
dataSource:
|
|
1439
|
-
|
|
1440
|
-
config: {
|
|
1434
|
+
dataSource: "Required — type: 'structure'",
|
|
1435
|
+
feedConfig: {
|
|
1441
1436
|
titleField: "string — field to use as item title",
|
|
1442
|
-
descriptionField:
|
|
1443
|
-
"string | null — field for item description",
|
|
1437
|
+
descriptionField: "string | null — field for item description",
|
|
1444
1438
|
timestampField: "string — field for item timestamp",
|
|
1445
1439
|
iconField: "string | null — field for item icon",
|
|
1446
1440
|
maxItems: "number (default: 10)",
|
|
@@ -1449,147 +1443,66 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1449
1443
|
"progress-indicator": {
|
|
1450
1444
|
description:
|
|
1451
1445
|
"Visual progress display — bar, ring, or badge. Shows completion toward a target.",
|
|
1452
|
-
dataSource:
|
|
1453
|
-
|
|
1454
|
-
config: {
|
|
1446
|
+
dataSource: "Optional — can use static value or aggregate from data",
|
|
1447
|
+
progressConfig: {
|
|
1455
1448
|
mode: "'bar' | 'ring' | 'badge'",
|
|
1456
1449
|
label: "string",
|
|
1457
1450
|
value: "number | null — static value (if no dataSource)",
|
|
1458
|
-
valueField:
|
|
1459
|
-
"string | null — field to aggregate (if using dataSource)",
|
|
1460
|
-
aggregation:
|
|
1461
|
-
"'count' | 'sum' | 'average' | 'percentage'",
|
|
1451
|
+
valueField: "string | null — field to aggregate (if using dataSource)",
|
|
1462
1452
|
target: "number — the 100% target value",
|
|
1463
|
-
thresholds:
|
|
1464
|
-
"{ green?: [min, max], amber?: [min, max], red?: [min, max] }",
|
|
1453
|
+
thresholds: "{ green?: [min, max], amber?: [min, max], red?: [min, max] }",
|
|
1465
1454
|
},
|
|
1466
1455
|
},
|
|
1467
1456
|
kanban: {
|
|
1468
1457
|
description:
|
|
1469
1458
|
"Kanban board — drag-and-drop cards grouped by a status/category field.",
|
|
1470
|
-
dataSource:
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
"string — field to group cards by (e.g., 'status')",
|
|
1475
|
-
columnOrder:
|
|
1476
|
-
"string[] | null — explicit column order (e.g., ['todo', 'in-progress', 'done'])",
|
|
1459
|
+
dataSource: "Required — type: 'structure'",
|
|
1460
|
+
kanbanConfig: {
|
|
1461
|
+
groupByField: "string — field to group cards by (e.g., 'status')",
|
|
1462
|
+
columnOrder: "string[] | null — explicit column order (e.g., ['todo', 'in-progress', 'done'])",
|
|
1477
1463
|
cardTitleField: "string — field for card title",
|
|
1478
|
-
cardSubtitleField:
|
|
1479
|
-
|
|
1480
|
-
cardBadgeField:
|
|
1481
|
-
"string | null — field for a badge/tag on the card",
|
|
1464
|
+
cardSubtitleField: "string | null — field for card subtitle",
|
|
1465
|
+
cardBadgeField: "string | null — field for a badge/tag on the card",
|
|
1482
1466
|
},
|
|
1483
1467
|
},
|
|
1484
1468
|
calendar: {
|
|
1485
1469
|
description:
|
|
1486
1470
|
"Calendar view — displays records as events on a month/week/day calendar.",
|
|
1487
|
-
dataSource:
|
|
1488
|
-
|
|
1489
|
-
config: {
|
|
1471
|
+
dataSource: "Required — type: 'structure'",
|
|
1472
|
+
calendarConfig: {
|
|
1490
1473
|
dateField: "string — field for event start date",
|
|
1491
|
-
endDateField:
|
|
1492
|
-
"string | null — field for event end date (for multi-day events)",
|
|
1474
|
+
endDateField: "string | null — field for event end date (for multi-day events)",
|
|
1493
1475
|
titleField: "string — field for event title",
|
|
1494
|
-
colorField:
|
|
1495
|
-
|
|
1496
|
-
defaultView:
|
|
1497
|
-
"'month' | 'week' | 'day' (default: 'month')",
|
|
1498
|
-
eventClickAction:
|
|
1499
|
-
"BlockAction | null — action when an event is clicked",
|
|
1476
|
+
colorField: "string | null — field to determine event color",
|
|
1477
|
+
defaultView: "'month' | 'week' | 'day' (default: 'month')",
|
|
1500
1478
|
},
|
|
1501
1479
|
},
|
|
1502
1480
|
"filter-bar": {
|
|
1503
1481
|
description:
|
|
1504
1482
|
"Global filter bar for dashboards — provides date range pickers and dropdown filters that control other blocks on the page.",
|
|
1505
1483
|
dataSource: "Not required",
|
|
1506
|
-
|
|
1507
|
-
dateField:
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
"('today' | '7d' | '30d' | '90d' | 'custom')[] — available date range presets",
|
|
1511
|
-
dropdownFilters:
|
|
1512
|
-
"{ field: string, label: string }[] — dropdown filter options",
|
|
1484
|
+
filterBarConfig: {
|
|
1485
|
+
dateField: "string | null — field to filter by date range",
|
|
1486
|
+
datePresets: "('today' | '7d' | '30d' | '90d' | 'custom')[] — available date range presets",
|
|
1487
|
+
dropdownFilters: "{ field: string, label: string }[] — dropdown filter options",
|
|
1513
1488
|
},
|
|
1514
1489
|
},
|
|
1515
1490
|
"related-list": {
|
|
1516
1491
|
description:
|
|
1517
|
-
"Displays related records from another collection. Similar to data-table but used in detail pages to show linked data
|
|
1518
|
-
dataSource:
|
|
1519
|
-
|
|
1492
|
+
"Displays related records from another collection. Similar to data-table but used in detail pages to show linked data.",
|
|
1493
|
+
dataSource: "Required — type: 'structure'",
|
|
1494
|
+
columns: "{ key: string, label: string }[] — column definitions on the block object",
|
|
1520
1495
|
allowed_actions: ["navigate-to-page", "invoke-trigger"],
|
|
1521
1496
|
default_activation: "row-click",
|
|
1522
1497
|
param_source: "row",
|
|
1523
1498
|
},
|
|
1524
|
-
|
|
1525
|
-
description:
|
|
1526
|
-
|
|
1527
|
-
dataSource:
|
|
1528
|
-
"Required — type: 'structure', mode: 'single'",
|
|
1529
|
-
allowed_actions: ["invoke-trigger", "navigate-to-page"],
|
|
1530
|
-
default_activation: "button",
|
|
1531
|
-
param_source: "record",
|
|
1532
|
-
},
|
|
1533
|
-
"field-group": {
|
|
1534
|
-
description:
|
|
1535
|
-
"Group of editable form fields. Used in form pages for structured data entry with multiple fields in a logical group.",
|
|
1536
|
-
dataSource:
|
|
1537
|
-
"Optional — if set with mode: 'single', pre-populates for editing",
|
|
1538
|
-
allowed_actions: [
|
|
1539
|
-
"create-record",
|
|
1540
|
-
"update-record",
|
|
1541
|
-
"invoke-trigger",
|
|
1542
|
-
],
|
|
1543
|
-
default_activation: "form-submit",
|
|
1544
|
-
param_source: "form",
|
|
1545
|
-
},
|
|
1546
|
-
"text-input": {
|
|
1547
|
-
description:
|
|
1548
|
-
"Single-line text input field for form pages.",
|
|
1549
|
-
dataSource: "Not required (value comes from user input)",
|
|
1550
|
-
category: "field-block",
|
|
1551
|
-
},
|
|
1552
|
-
"number-input": {
|
|
1553
|
-
description:
|
|
1554
|
-
"Numeric input field for form pages. Supports min/max constraints.",
|
|
1555
|
-
dataSource: "Not required",
|
|
1556
|
-
category: "field-block",
|
|
1557
|
-
},
|
|
1558
|
-
select: {
|
|
1559
|
-
description:
|
|
1560
|
-
"Dropdown select input for form pages. Options can be static or dynamically loaded from a collection.",
|
|
1561
|
-
dataSource: "Not required (static options) or optional (dynamic options from collection)",
|
|
1562
|
-
category: "field-block",
|
|
1563
|
-
},
|
|
1564
|
-
checkbox: {
|
|
1565
|
-
description:
|
|
1566
|
-
"Boolean checkbox input for form pages.",
|
|
1567
|
-
dataSource: "Not required",
|
|
1568
|
-
category: "field-block",
|
|
1569
|
-
},
|
|
1570
|
-
"date-picker": {
|
|
1571
|
-
description:
|
|
1572
|
-
"Date/datetime picker input for form pages.",
|
|
1573
|
-
dataSource: "Not required",
|
|
1574
|
-
category: "field-block",
|
|
1575
|
-
},
|
|
1576
|
-
textarea: {
|
|
1577
|
-
description:
|
|
1578
|
-
"Multi-line text input for form pages. Use for long text, descriptions, notes.",
|
|
1579
|
-
dataSource: "Not required",
|
|
1580
|
-
category: "field-block",
|
|
1581
|
-
},
|
|
1582
|
-
"file-upload": {
|
|
1583
|
-
description:
|
|
1584
|
-
"File upload input for form pages. Stores files in blob storage.",
|
|
1585
|
-
dataSource: "Not required",
|
|
1586
|
-
category: "field-block",
|
|
1499
|
+
form: {
|
|
1500
|
+
description: "DEPRECATED — use 'field-group' blockType instead. The runtime does not handle 'form' as a blockType.",
|
|
1501
|
+
IMPORTANT: "Do NOT use this. Use field-group with a fields array.",
|
|
1587
1502
|
},
|
|
1588
|
-
|
|
1589
|
-
description:
|
|
1590
|
-
|
|
1591
|
-
dataSource: "Not required",
|
|
1592
|
-
category: "field-block",
|
|
1503
|
+
"detail-fields": {
|
|
1504
|
+
description: "DEPRECATED — use 'field-display' blockType instead. The runtime does not handle 'detail-fields'.",
|
|
1505
|
+
IMPORTANT: "Do NOT use this. Use field-display with a fields array.",
|
|
1593
1506
|
},
|
|
1594
1507
|
markdown: {
|
|
1595
1508
|
description:
|
|
@@ -1608,9 +1521,9 @@ export function registerDescribeTools(server: McpServer) {
|
|
|
1608
1521
|
},
|
|
1609
1522
|
block_categories: {
|
|
1610
1523
|
"data-block":
|
|
1611
|
-
"Blocks that display data from collections (data-table, chart, metric-card, stat-group,
|
|
1612
|
-
"
|
|
1613
|
-
"
|
|
1524
|
+
"Blocks that display data from collections (data-table, chart, metric-card, stat-group, field-display, related-list, activity-feed, kanban, calendar, progress-indicator)",
|
|
1525
|
+
"form-block":
|
|
1526
|
+
"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.",
|
|
1614
1527
|
"content-block":
|
|
1615
1528
|
"Static content blocks (markdown, static-html). Must have non-empty 'content' property.",
|
|
1616
1529
|
"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 {
|