mcp-zenskar 1.2.0 → 1.3.1

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/README.md CHANGED
@@ -279,6 +279,9 @@ cd mcp-zenskar
279
279
  # Install dependencies
280
280
  npm install
281
281
 
282
+ # Build the bundle (produces dist/server.mjs + dist/mcp-config.json)
283
+ npm run build
284
+
282
285
  # Run the server
283
286
  npm start
284
287
  ```
@@ -288,19 +291,20 @@ npm start
288
291
  If you want Claude Desktop to use a local checkout instead of the npm package:
289
292
 
290
293
  ```bash
291
- # Install dependencies once
294
+ # Install dependencies + build the bundle
292
295
  npm install
296
+ npm run build
293
297
 
294
- # Optional: install the local build globally
298
+ # Optional: install the local build globally (requires dist/ from the previous step)
295
299
  npm install -g .
296
300
  ```
297
301
 
298
- Then either point Claude to the globally-installed binary (usually `$(npm bin -g)/mcp-zenskar`) or call the repo copy directly:
302
+ Then either point Claude to the globally-installed binary (usually `$(npm bin -g)/mcp-zenskar`) or call the built bundle directly:
299
303
 
300
304
  ```json
301
305
  {
302
306
  "command": "node",
303
- "args": ["/absolute/path/to/mcp-zenskar/src/server.js"],
307
+ "args": ["/absolute/path/to/mcp-zenskar/dist/server.mjs"],
304
308
  "env": {
305
309
  "ZENSKAR_ORGANIZATION": "your-org-id",
306
310
  "ZENSKAR_AUTH_TOKEN": "your-token"
@@ -308,6 +312,15 @@ Then either point Claude to the globally-installed binary (usually `$(npm bin -g
308
312
  }
309
313
  ```
310
314
 
315
+ To iterate on `src/server.js` without rebuilding, run it directly — `npm install` already installs the bundler's devDependencies which include the runtime libs:
316
+
317
+ ```json
318
+ {
319
+ "command": "node",
320
+ "args": ["/absolute/path/to/mcp-zenskar/src/server.js"]
321
+ }
322
+ ```
323
+
311
324
  ## Configuration
312
325
 
313
326
  The server uses `src/mcp-config.json` to define available tools and API endpoints. This file contains the complete mapping of MCP tools to Zenskar API operations. All tools are declarative — no code changes needed to add new tools.
@@ -679,7 +679,7 @@
679
679
  },
680
680
  {
681
681
  "name": "listAggregates",
682
- "description": "List Billable Metrics (also called aggregates in backend/API terminology) in paginated form, with filtering by ID, name, and data source.",
682
+ "description": "List Billable Metrics in paginated form, with filtering by ID, name, and data source.",
683
683
  "args": [
684
684
  {
685
685
  "name": "cursor",
@@ -753,12 +753,12 @@
753
753
  "method": "GET"
754
754
  },
755
755
  "responseTemplate": {
756
- "prependBody": "## Billable Metrics (Aggregates)\n\nHere is the list of billable metrics. Backend/API terminology may also call these aggregates:\n\n"
756
+ "prependBody": "## Billable Metrics\n\nHere is the list of billable metrics:\n\n"
757
757
  }
758
758
  },
759
759
  {
760
760
  "name": "getAggregateSchemas",
761
- "description": "Show the underlying storage/schema definitions for Billable Metrics (also called aggregates). Mainly useful for advanced debugging, SQL/schema inspection, and integration work rather than day-to-day business operations.",
761
+ "description": "Show the underlying storage/schema definitions for Billable Metrics. Mainly useful for advanced debugging, SQL/schema inspection, and integration work rather than day-to-day business operations.",
762
762
  "args": [],
763
763
  "requestTemplate": {
764
764
  "url": "/aggregates/tables/schema",
@@ -770,7 +770,7 @@
770
770
  },
771
771
  {
772
772
  "name": "getAggregateEstimates",
773
- "description": "Get Billable Metric estimates based on the specified criteria. Backend/API terminology may also call a billable metric an aggregate.",
773
+ "description": "Get Billable Metric estimates based on the specified criteria.",
774
774
  "args": [
775
775
  {
776
776
  "name": "aggregate_id",
@@ -819,7 +819,7 @@
819
819
  },
820
820
  {
821
821
  "name": "getAggregateById",
822
- "description": "Get the details of a Billable Metric by its ID. Backend/API terminology may also call this an aggregate.",
822
+ "description": "Get the details of a Billable Metric by its ID.",
823
823
  "args": [
824
824
  {
825
825
  "name": "aggregateId",
@@ -893,9 +893,192 @@
893
893
  "prependBody": "## Billable Metric Logs\n\nHere are the logs for the specified Billable Metric (aggregate):\n\n"
894
894
  }
895
895
  },
896
+ {
897
+ "name": "createAggregate",
898
+ "description": "Create a new Billable Metric. Requires a name, data schema, aggregation queries, visual query builder config, and a data source. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
899
+ "needsApproval": true,
900
+ "approvalConfig": {
901
+ "title": "Create Billable Metric",
902
+ "description": "This will create a new billable metric (aggregate) in your system.",
903
+ "warningText": "This action will create a new billable metric definition that may be used in pricing and billing configurations.",
904
+ "confirmText": "Create Billable Metric",
905
+ "cancelText": "Cancel",
906
+ "sensitiveFields": [
907
+ "name",
908
+ "datasource"
909
+ ]
910
+ },
911
+ "args": [
912
+ {
913
+ "name": "name",
914
+ "description": "Name of the billable metric (required).",
915
+ "type": "string",
916
+ "required": true,
917
+ "position": "body"
918
+ },
919
+ {
920
+ "name": "dataschema",
921
+ "description": "Data schema of the aggregate (JSON string, required).",
922
+ "type": "string",
923
+ "required": true,
924
+ "position": "body"
925
+ },
926
+ {
927
+ "name": "aggregation_query",
928
+ "description": "Aggregate query — SQL/Jinja template for computing the metric (required).",
929
+ "type": "string",
930
+ "required": true,
931
+ "position": "body"
932
+ },
933
+ {
934
+ "name": "cust_agg_query",
935
+ "description": "Customer aggregate query — SQL/Jinja template for customer-level computation (required).",
936
+ "type": "string",
937
+ "required": true,
938
+ "position": "body"
939
+ },
940
+ {
941
+ "name": "visual_query_builder",
942
+ "description": "Visual query builder configuration object (required).",
943
+ "type": "object",
944
+ "required": true,
945
+ "position": "body"
946
+ },
947
+ {
948
+ "name": "datasource",
949
+ "description": "Data source UUID (required).",
950
+ "type": "string",
951
+ "required": true,
952
+ "position": "body"
953
+ }
954
+ ],
955
+ "requestTemplate": {
956
+ "url": "/aggregates",
957
+ "method": "POST",
958
+ "headers": {
959
+ "Content-Type": "application/json"
960
+ }
961
+ },
962
+ "responseTemplate": {
963
+ "prependBody": "## Billable Metric Created\n\nNew billable metric (aggregate) has been successfully created:\n\n"
964
+ }
965
+ },
966
+ {
967
+ "name": "updateAggregate",
968
+ "description": "Update an existing Billable Metric. All body fields are optional — only send fields you want to change. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
969
+ "needsApproval": true,
970
+ "approvalConfig": {
971
+ "title": "Update Billable Metric",
972
+ "description": "This will update the specified billable metric (aggregate). Please review the changes carefully.",
973
+ "warningText": "This action will modify the billable metric definition which may affect active pricing and billing configurations.",
974
+ "confirmText": "Update Billable Metric",
975
+ "cancelText": "Cancel",
976
+ "sensitiveFields": [
977
+ "aggregateId",
978
+ "name",
979
+ "aggregation_query",
980
+ "datasource"
981
+ ]
982
+ },
983
+ "args": [
984
+ {
985
+ "name": "aggregateId",
986
+ "description": "The unique identifier (UUID) of the billable metric (aggregate) to update.",
987
+ "type": "string",
988
+ "required": true,
989
+ "position": "path"
990
+ },
991
+ {
992
+ "name": "name",
993
+ "description": "Updated name of the billable metric.",
994
+ "type": "string",
995
+ "required": false,
996
+ "position": "body"
997
+ },
998
+ {
999
+ "name": "dataschema",
1000
+ "description": "Updated data schema (JSON string).",
1001
+ "type": "string",
1002
+ "required": false,
1003
+ "position": "body"
1004
+ },
1005
+ {
1006
+ "name": "aggregation_query",
1007
+ "description": "Updated aggregate query (SQL/Jinja template).",
1008
+ "type": "string",
1009
+ "required": false,
1010
+ "position": "body"
1011
+ },
1012
+ {
1013
+ "name": "cust_agg_query",
1014
+ "description": "Updated customer aggregate query (SQL/Jinja template).",
1015
+ "type": "string",
1016
+ "required": false,
1017
+ "position": "body"
1018
+ },
1019
+ {
1020
+ "name": "visual_query_builder",
1021
+ "description": "Updated visual query builder configuration.",
1022
+ "type": "object",
1023
+ "required": false,
1024
+ "position": "body"
1025
+ },
1026
+ {
1027
+ "name": "datasource",
1028
+ "description": "Updated data source UUID.",
1029
+ "type": "string",
1030
+ "required": false,
1031
+ "position": "body"
1032
+ }
1033
+ ],
1034
+ "requestTemplate": {
1035
+ "url": "/aggregates/{aggregateId}",
1036
+ "method": "PATCH",
1037
+ "headers": {
1038
+ "Content-Type": "application/json"
1039
+ }
1040
+ },
1041
+ "responseTemplate": {
1042
+ "prependBody": "## Billable Metric Updated\n\nThe billable metric (aggregate) has been successfully updated:\n\n"
1043
+ }
1044
+ },
1045
+ {
1046
+ "name": "deleteAggregate",
1047
+ "description": "Permanently delete a Billable Metric. DESTRUCTIVE: cannot be undone. ONLY call when the user explicitly says 'delete' or 'remove' for THIS billable metric. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
1048
+ "needsApproval": true,
1049
+ "approvalConfig": {
1050
+ "title": "Delete Billable Metric",
1051
+ "description": "This will permanently delete the billable metric (aggregate).",
1052
+ "warningText": "DESTRUCTIVE — this cannot be undone. This may affect active pricing configurations and billing that reference this metric.",
1053
+ "confirmText": "Delete Billable Metric",
1054
+ "cancelText": "Cancel",
1055
+ "sensitiveFields": [
1056
+ "aggregateId"
1057
+ ]
1058
+ },
1059
+ "args": [
1060
+ {
1061
+ "name": "aggregateId",
1062
+ "description": "The unique identifier (UUID) of the billable metric (aggregate) to delete.",
1063
+ "type": "string",
1064
+ "required": true,
1065
+ "position": "path"
1066
+ }
1067
+ ],
1068
+ "requestTemplate": {
1069
+ "url": "/aggregates/{aggregateId}",
1070
+ "method": "DELETE",
1071
+ "headers": {
1072
+ "Content-Type": "application/json"
1073
+ }
1074
+ },
1075
+ "responseTemplate": {
1076
+ "prependBody": "## Billable Metric Deleted\n\n"
1077
+ }
1078
+ },
896
1079
  {
897
1080
  "name": "listRawMetrics",
898
- "description": "List Usage Events. In backend/API terminology these are also called raw metrics. Supports filtering by ID, name, and API slug.",
1081
+ "description": "List Usage Events. Supports filtering by ID, name, and API slug.",
899
1082
  "args": [
900
1083
  {
901
1084
  "name": "cursor",
@@ -969,16 +1152,16 @@
969
1152
  "method": "GET"
970
1153
  },
971
1154
  "responseTemplate": {
972
- "prependBody": "## Usage Events\n\nHere is the list of usage events. Backend/API terminology may also call these raw metrics:\n\n"
1155
+ "prependBody": "## Usage Events\n\nHere is the list of usage events:\n\n"
973
1156
  }
974
1157
  },
975
1158
  {
976
1159
  "name": "createRawMetric",
977
- "description": "Create a new Usage Event schema. In backend/API terminology this resource is called a raw metric. This defines the schema used for ingesting usage events. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
1160
+ "description": "Create a new Usage Event schema. This defines the schema used for ingesting usage events. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
978
1161
  "needsApproval": true,
979
1162
  "approvalConfig": {
980
1163
  "title": "Create Usage Event Schema",
981
- "description": "This will create a new Usage Event schema (called a raw metric in backend/API terminology) and provision its event schema. Please review the payload carefully.",
1164
+ "description": "This will create a new Usage Event schema and provision its event schema. Please review the payload carefully.",
982
1165
  "warningText": "Ensure the dataschema and slug values are correct before continuing.",
983
1166
  "confirmText": "Create Usage Event Schema",
984
1167
  "cancelText": "Cancel",
@@ -1001,7 +1184,7 @@
1001
1184
  },
1002
1185
  {
1003
1186
  "name": "dataschema",
1004
- "description": "Data schema of the Usage Event resource (called a raw metric in backend/API terminology). Structure: {\"data\": {custom_fields}, \"timestamp\": \"DateTime64\", \"customer_id\": \"String\"}. The 'timestamp' and 'customer_id' fields are mandatory schema fields for usage ingestion. The 'data' map must include only valid ClickHouse types (String, Int64, Float64, Date32, DateTime64, UUID, Bool); use 'Bool' instead of 'Boolean'.",
1187
+ "description": "Data schema of the Usage Event resource. Structure: {\"data\": {custom_fields}, \"timestamp\": \"DateTime64\", \"customer_id\": \"String\"}. The 'timestamp' and 'customer_id' fields are mandatory schema fields for usage ingestion. The 'data' map must include only valid ClickHouse types (String, Int64, Float64, Date32, DateTime64, UUID, Bool); use 'Bool' instead of 'Boolean'.",
1005
1188
  "type": "object",
1006
1189
  "required": true,
1007
1190
  "position": "body",
@@ -1042,7 +1225,7 @@
1042
1225
  },
1043
1226
  {
1044
1227
  "name": "getRawMetricById",
1045
- "description": "Get Usage Event details by ID. Backend/API terminology may also call this a raw metric.",
1228
+ "description": "Get Usage Event details by ID.",
1046
1229
  "args": [
1047
1230
  {
1048
1231
  "name": "rawMetricId",
@@ -1062,7 +1245,7 @@
1062
1245
  },
1063
1246
  {
1064
1247
  "name": "getRawMetricLogs",
1065
- "description": "Get recent Usage Event rows for a resource by ID. Returns the most recent event rows; backend does NOT support filters, pagination, ordering, or aggregation on this endpoint. For filtered/aggregated queries use the aggregate endpoints. Backend/API terminology may also call this a raw metric.",
1248
+ "description": "Get recent Usage Event rows for a resource by ID. Returns the most recent event rows; backend does NOT support filters, pagination, ordering, or aggregation on this endpoint. For filtered/aggregated queries use the aggregate endpoints.",
1066
1249
  "args": [
1067
1250
  {
1068
1251
  "name": "rawMetricId",
@@ -1082,7 +1265,7 @@
1082
1265
  },
1083
1266
  {
1084
1267
  "name": "getRawMetricBySlug",
1085
- "description": "Get Usage Event details by API slug. Backend/API terminology may also call this a raw metric.",
1268
+ "description": "Get Usage Event details by API slug.",
1086
1269
  "args": [
1087
1270
  {
1088
1271
  "name": "rawMetricSlug",
@@ -1849,6 +2032,242 @@
1849
2032
  "prependBody": "## Entitlement Created\n\nNew entitlement has been successfully created:\n\n"
1850
2033
  }
1851
2034
  },
2035
+ {
2036
+ "name": "listEntitlements",
2037
+ "description": "List entitlements in paginated form, with filtering by ID, name, type, product, and active status.",
2038
+ "args": [
2039
+ {
2040
+ "name": "cursor",
2041
+ "description": "The cursor for pagination.",
2042
+ "type": "string",
2043
+ "required": false,
2044
+ "position": "query"
2045
+ },
2046
+ {
2047
+ "name": "limit",
2048
+ "description": "Maximum number of records to return per page (defaults to 50).",
2049
+ "type": "integer",
2050
+ "required": false,
2051
+ "position": "query"
2052
+ },
2053
+ {
2054
+ "name": "order",
2055
+ "description": "Order of results (e.g., '-created_at').",
2056
+ "type": "string",
2057
+ "required": false,
2058
+ "default": "-created_at",
2059
+ "position": "query"
2060
+ },
2061
+ {
2062
+ "name": "sort_key",
2063
+ "description": "Key to sort the results by.",
2064
+ "type": "string",
2065
+ "required": false,
2066
+ "default": "created_at",
2067
+ "position": "query"
2068
+ },
2069
+ {
2070
+ "name": "sort_type",
2071
+ "description": "Sort order type ('ASC' or 'DESC').",
2072
+ "type": "string",
2073
+ "required": false,
2074
+ "default": "DESC",
2075
+ "position": "query"
2076
+ },
2077
+ {
2078
+ "name": "search",
2079
+ "description": "Text search across entitlement fields.",
2080
+ "type": "string",
2081
+ "required": false,
2082
+ "position": "query"
2083
+ },
2084
+ {
2085
+ "name": "id",
2086
+ "description": "Filter by entitlement ID.",
2087
+ "type": "string",
2088
+ "required": false,
2089
+ "position": "query"
2090
+ },
2091
+ {
2092
+ "name": "name__ilike",
2093
+ "description": "Case-insensitive partial match for entitlement name.",
2094
+ "type": "string",
2095
+ "required": false,
2096
+ "position": "query"
2097
+ },
2098
+ {
2099
+ "name": "entitlement_type",
2100
+ "description": "Filter by entitlement type.",
2101
+ "type": "string",
2102
+ "required": false,
2103
+ "position": "query",
2104
+ "enum": [
2105
+ "Feature",
2106
+ "Quantity",
2107
+ "Credits"
2108
+ ]
2109
+ },
2110
+ {
2111
+ "name": "is_active",
2112
+ "description": "Filter by active status.",
2113
+ "type": "boolean",
2114
+ "required": false,
2115
+ "position": "query"
2116
+ },
2117
+ {
2118
+ "name": "product_id",
2119
+ "description": "Filter by associated product ID.",
2120
+ "type": "string",
2121
+ "required": false,
2122
+ "position": "query"
2123
+ }
2124
+ ],
2125
+ "requestTemplate": {
2126
+ "url": "/entitlements",
2127
+ "method": "GET"
2128
+ },
2129
+ "responseTemplate": {
2130
+ "prependBody": "## Entitlements\n\nHere is the list of entitlements:\n\n"
2131
+ }
2132
+ },
2133
+ {
2134
+ "name": "getEntitlementById",
2135
+ "description": "Get the details of an entitlement by its ID.",
2136
+ "args": [
2137
+ {
2138
+ "name": "entitlementId",
2139
+ "description": "The unique identifier (UUID) of the entitlement.",
2140
+ "type": "string",
2141
+ "required": true,
2142
+ "position": "path"
2143
+ }
2144
+ ],
2145
+ "requestTemplate": {
2146
+ "url": "/entitlements/{entitlementId}",
2147
+ "method": "GET"
2148
+ },
2149
+ "responseTemplate": {
2150
+ "prependBody": "## Entitlement Details\n\nHere are the details for the specified entitlement:\n\n"
2151
+ }
2152
+ },
2153
+ {
2154
+ "name": "updateEntitlement",
2155
+ "description": "Update an existing entitlement's details. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
2156
+ "needsApproval": true,
2157
+ "approvalConfig": {
2158
+ "title": "Update Entitlement",
2159
+ "description": "This will update the specified entitlement. Please review the changes carefully.",
2160
+ "warningText": "This action will modify the entitlement record which may affect billing and access control.",
2161
+ "confirmText": "Update Entitlement",
2162
+ "cancelText": "Cancel",
2163
+ "sensitiveFields": [
2164
+ "entitlementId",
2165
+ "name",
2166
+ "entitlement_type",
2167
+ "product_id"
2168
+ ]
2169
+ },
2170
+ "args": [
2171
+ {
2172
+ "name": "entitlementId",
2173
+ "description": "The unique identifier (UUID) of the entitlement to update.",
2174
+ "type": "string",
2175
+ "required": true,
2176
+ "position": "path"
2177
+ },
2178
+ {
2179
+ "name": "name",
2180
+ "description": "Updated entitlement name.",
2181
+ "type": "string",
2182
+ "required": true,
2183
+ "position": "body"
2184
+ },
2185
+ {
2186
+ "name": "description",
2187
+ "description": "Updated entitlement description.",
2188
+ "type": "string",
2189
+ "required": false,
2190
+ "position": "body"
2191
+ },
2192
+ {
2193
+ "name": "entitlement_type",
2194
+ "description": "Updated type of entitlement.",
2195
+ "type": "string",
2196
+ "required": false,
2197
+ "position": "body",
2198
+ "enum": [
2199
+ "Feature",
2200
+ "Quantity",
2201
+ "Credits"
2202
+ ]
2203
+ },
2204
+ {
2205
+ "name": "units",
2206
+ "description": "Updated units for the entitlement (e.g., 'units', 'GB', 'users').",
2207
+ "type": "string",
2208
+ "required": false,
2209
+ "position": "body"
2210
+ },
2211
+ {
2212
+ "name": "is_active",
2213
+ "description": "Whether the entitlement is active.",
2214
+ "type": "boolean",
2215
+ "required": false,
2216
+ "position": "body"
2217
+ },
2218
+ {
2219
+ "name": "product_id",
2220
+ "description": "Updated associated product ID (UUID format).",
2221
+ "type": "string",
2222
+ "required": false,
2223
+ "position": "body"
2224
+ }
2225
+ ],
2226
+ "requestTemplate": {
2227
+ "url": "/entitlements/{entitlementId}",
2228
+ "method": "PATCH",
2229
+ "headers": {
2230
+ "Content-Type": "application/json"
2231
+ }
2232
+ },
2233
+ "responseTemplate": {
2234
+ "prependBody": "## Entitlement Updated\n\nThe entitlement has been successfully updated:\n\n"
2235
+ }
2236
+ },
2237
+ {
2238
+ "name": "deleteEntitlement",
2239
+ "description": "Permanently delete an entitlement. DESTRUCTIVE: cannot be undone. ONLY call when the user explicitly says 'delete' or 'remove' for THIS entitlement. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
2240
+ "needsApproval": true,
2241
+ "approvalConfig": {
2242
+ "title": "Delete Entitlement",
2243
+ "description": "This will permanently delete the entitlement.",
2244
+ "warningText": "DESTRUCTIVE — this cannot be undone. This may affect billing and access control for customers using this entitlement.",
2245
+ "confirmText": "Delete Entitlement",
2246
+ "cancelText": "Cancel",
2247
+ "sensitiveFields": [
2248
+ "entitlementId"
2249
+ ]
2250
+ },
2251
+ "args": [
2252
+ {
2253
+ "name": "entitlementId",
2254
+ "description": "The unique identifier (UUID) of the entitlement to delete.",
2255
+ "type": "string",
2256
+ "required": true,
2257
+ "position": "path"
2258
+ }
2259
+ ],
2260
+ "requestTemplate": {
2261
+ "url": "/entitlements/{entitlementId}",
2262
+ "method": "DELETE",
2263
+ "headers": {
2264
+ "Content-Type": "application/json"
2265
+ }
2266
+ },
2267
+ "responseTemplate": {
2268
+ "prependBody": "## Entitlement Deleted\n\n"
2269
+ }
2270
+ },
1852
2271
  {
1853
2272
  "name": "approveInvoice",
1854
2273
  "description": "Approve an invoice; sets status to approved. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
@@ -2408,11 +2827,11 @@
2408
2827
  },
2409
2828
  {
2410
2829
  "name": "ingestRawMetricEvent",
2411
- "description": "Ingest a Usage Event for the specified resource slug. Backend/API terminology may also call the target resource a raw metric. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
2830
+ "description": "Ingest a Usage Event for the specified resource slug. Host enforces user confirmation via the approval gate; do NOT ask the user to re-confirm before calling.",
2412
2831
  "needsApproval": true,
2413
2832
  "approvalConfig": {
2414
2833
  "title": "Ingest Usage Event",
2415
- "description": "This will ingest a Usage Event for the selected Usage Event schema (called a raw metric in backend/API terminology). Review the payload carefully.",
2834
+ "description": "This will ingest a Usage Event for the selected Usage Event schema. Review the payload carefully.",
2416
2835
  "warningText": "Ensure the data payload matches the Usage Event schema (raw metric schema) before proceeding.",
2417
2836
  "confirmText": "Ingest Usage Event",
2418
2837
  "cancelText": "Cancel",