@fluentcommerce/fluent-mcp-extn 0.7.0 → 0.7.3

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.
@@ -31,7 +31,7 @@ Most tools include extra fields like `event`, `response`, `job`, or `status`.
31
31
 
32
32
  `error.retryable` indicates whether a caller can safely retry the same request. Non-idempotent writes intentionally avoid automatic retry behavior.
33
33
 
34
- ## `config.validate`
34
+ ## `config_validate`
35
35
 
36
36
  Validates configuration and auth readiness without calling Fluent APIs.
37
37
 
@@ -44,7 +44,7 @@ Example:
44
44
  {}
45
45
  ```
46
46
 
47
- ## `health.ping`
47
+ ## `health_ping`
48
48
 
49
49
  Returns server health, SDK availability, and safe config summary.
50
50
 
@@ -57,7 +57,7 @@ Example:
57
57
  {}
58
58
  ```
59
59
 
60
- ## `event.build`
60
+ ## `event_build`
61
61
 
62
62
  Builds a Fluent event payload only (no API call).
63
63
 
@@ -79,19 +79,19 @@ Example:
79
79
  }
80
80
  ```
81
81
 
82
- ## `event.send`
82
+ ## `event_send`
83
83
 
84
84
  Builds and sends an event via SDK adapter. When `dryRun: true`, enriches the response with a `_workflowPreview` showing predicted outcomes from cached workflow analysis.
85
85
 
86
86
  - **Required**: `name`, `entityRef`, `entityType`
87
- - **Optional**: all `event.build` fields plus:
87
+ - **Optional**: all `event_build` fields plus:
88
88
  - `mode`: `async` or `sync`
89
89
  - `dryRun`: boolean
90
90
  - **Important**: `retailerId` must match the target entity's retailer for real sends.
91
91
 
92
92
  ### dryRun workflow preview
93
93
 
94
- When `dryRun: true` and a workflow is cached (call `workflow.get` first), the response includes `_workflowPreview`:
94
+ When `dryRun: true` and a workflow is cached (call `workflow_get` first), the response includes `_workflowPreview`:
95
95
 
96
96
  - `workflowName`: matched workflow name (e.g. `ORDER::HD`)
97
97
  - `matchingRulesets`: array of rulesets triggered by this event at the current status
@@ -125,7 +125,7 @@ Example send:
125
125
  }
126
126
  ```
127
127
 
128
- ## `event.get`
128
+ ## `event_get`
129
129
 
130
130
  Gets one event by ID via SDK-native `getEventById(eventId)`:
131
131
 
@@ -155,7 +155,7 @@ Typical success shape (truncated):
155
155
  }
156
156
  ```
157
157
 
158
- ## `event.list`
158
+ ## `event_list`
159
159
 
160
160
  Lists/filter events via SDK-native `getEvents(params)`:
161
161
 
@@ -207,11 +207,11 @@ Typical success shape (truncated):
207
207
  }
208
208
  ```
209
209
 
210
- If `event.send` does not return an `id`, use `event.list` with `name`,
210
+ If `event_send` does not return an `id`, use `event_list` with `name`,
211
211
  `entityRef`, and `retailerId` to resolve the latest event ID, then call
212
- `event.get`.
212
+ `event_get`.
213
213
 
214
- ## `event.flowInspect`
214
+ ## `event_flowInspect`
215
215
 
216
216
  One-call runtime forensics for any root entity.
217
217
 
@@ -225,8 +225,8 @@ One-call runtime forensics for any root entity.
225
225
  - `includeEventDetails`: include compact orchestration event rows (default `true`, full mode only)
226
226
  - `includeAuditDetails`: include compact audit action samples (default `false`, full mode only)
227
227
  - `includeScheduled`: fetch SCHEDULED events separately (default `true`)
228
- - `inspectStatuses`: statuses to drill via `event.get` (defaults: `["NO_MATCH", "PENDING", "FAILED"]`)
229
- - `maxDrilldowns`: cap on individual event.get calls (`0..100`, default `50`)
228
+ - `inspectStatuses`: statuses to drill via `event_get` (defaults: `["NO_MATCH", "PENDING", "FAILED"]`)
229
+ - `maxDrilldowns`: cap on individual event_get calls (`0..100`, default `50`)
230
230
  - `actionSampleLimit`: max rows for action-derived sections (`1..200`, default `100`)
231
231
  - **Default-on flags:**
232
232
  - `compact`: pre-analyzed summary response (default `true`)
@@ -265,7 +265,7 @@ Returns complete raw arrays:
265
265
  - Custom plugin logs (when `includeCustomLogs: true`)
266
266
  - Entity snapshots (when `includeSnapshots: true`)
267
267
  - Cross-entity events with full events array (when `includeCrossEntity: true`)
268
- - `NO_MATCH`/`PENDING`/`FAILED` drilldown with full event payload via `event.get`
268
+ - `NO_MATCH`/`PENDING`/`FAILED` drilldown with full event payload via `event_get`
269
269
  - Auto-recommendations based on findings
270
270
 
271
271
  Example (compact — recommended first call):
@@ -304,7 +304,7 @@ Example (lightweight):
304
304
  }
305
305
  ```
306
306
 
307
- ## `metrics.query`
307
+ ## `metrics_query`
308
308
 
309
309
  Queries Prometheus metrics for Fluent runtime telemetry.
310
310
 
@@ -317,25 +317,25 @@ Queries Prometheus metrics for Fluent runtime telemetry.
317
317
  - **Execution path**:
318
318
  - instant -> GraphQL `metricInstant(query, time?)`
319
319
  - range -> GraphQL `metricRange(query, start, end, step)`
320
- - **Note**: `metrics.query` routes PromQL through Fluent's GraphQL proxy. Raw Prometheus REST endpoints are not relied on directly by this tool.
320
+ - **Note**: `metrics_query` routes PromQL through Fluent's GraphQL proxy. Raw Prometheus REST endpoints are not relied on directly by this tool.
321
321
 
322
322
  Label hygiene reminder:
323
323
  - `core_event_received_total` does **not** include `status`
324
324
  - `rubix_event_runtime_seconds_*` does include `status`
325
325
  - histogram bucket series add `le`
326
326
 
327
- Safer fixed-window counter total pattern:
328
-
329
- ```promql
330
- (
331
- last_over_time(metric[window])
332
- -
333
- last_over_time(metric[5m] offset <period>)
334
- )
335
- or last_over_time(metric[window])
336
- ```
337
-
338
- Use the fallback `or` arm when the series did not exist at the offset point. Pair this with `resets(metric[window])` to decide whether the delta is trustworthy.
327
+ Safer fixed-window counter total pattern:
328
+
329
+ ```promql
330
+ (
331
+ last_over_time(metric[window])
332
+ -
333
+ last_over_time(metric[5m] offset <period>)
334
+ )
335
+ or last_over_time(metric[window])
336
+ ```
337
+
338
+ Use the fallback `or` arm when the series did not exist at the offset point. Pair this with `resets(metric[window])` to decide whether the delta is trustworthy.
339
339
 
340
340
  Instant example:
341
341
 
@@ -358,7 +358,7 @@ Range example:
358
358
  }
359
359
  ```
360
360
 
361
- ## `metrics.topEvents`
361
+ ## `metrics_topEvents`
362
362
 
363
363
  Returns ranked event analytics for a time window by aggregating Event API results.
364
364
 
@@ -385,20 +385,20 @@ Example:
385
385
  }
386
386
  ```
387
387
 
388
- ## `metrics.healthCheck`
388
+ ## `metrics_healthCheck`
389
389
 
390
390
  Runs a compact, one-call anomaly assessment.
391
391
 
392
392
  - **Optional**:
393
393
  - `window`: Prometheus/Event API analysis window (`1h`, `6h`, `24h`, `7d`; default `1h`)
394
- - `includeTopEvents`: include ranked event list in response (default `true`)
394
+ - `includeTopEvents`: include ranked event_list in response (default `true`)
395
395
  - `topN`: max top event rows (`1..100`, default `10`)
396
396
  - `thresholds`: override defaults
397
397
  - `failureRate` (default `5`)
398
398
  - `pendingRate` (default `10`)
399
399
  - `dominanceRate` (default `50`)
400
400
  - **Behavior**:
401
- - Prometheus-first (`metrics.query` equivalent calls under the hood)
401
+ - Prometheus-first (`metrics_query` equivalent calls under the hood)
402
402
  - Falls back to Event API aggregation if Prometheus is unavailable
403
403
 
404
404
  Example:
@@ -411,7 +411,7 @@ Example:
411
411
  }
412
412
  ```
413
413
 
414
- ## `metrics.sloReport`
414
+ ## `metrics_sloReport`
415
415
 
416
416
  Returns a managed-services SLO snapshot with explicit KPI fields and threshold findings.
417
417
 
@@ -442,7 +442,7 @@ Example:
442
442
  }
443
443
  ```
444
444
 
445
- ## `metrics.labelCatalog`
445
+ ## `metrics_labelCatalog`
446
446
 
447
447
  Discovers what labels a metric supports so PromQL groupings are correct.
448
448
 
@@ -467,7 +467,7 @@ Example:
467
467
  }
468
468
  ```
469
469
 
470
- ## `metrics.metricCatalog`
470
+ ## `metrics_metricCatalog`
471
471
 
472
472
  Lists all documented Fluent platform metric families with labels, variants, example PromQL, and queryability flags. Optional live probing discovers active metrics and samples label values from the environment.
473
473
 
@@ -479,11 +479,11 @@ Lists all documented Fluent platform metric families with labels, variants, exam
479
479
  - `includeLiveLabels`: sample live label values for the selected metric (default `false`)
480
480
  - `maxMetrics`: max live metrics to return (default `100`)
481
481
  - `maxValuesPerLabel`: max sample values per label (default `10`)
482
- - **Behavior**:
483
- - Without `metric`: returns all 10 documented families (Rubix OTel, GraphQL OTel, GraphQL Micrometer, billing/read-only usage, freshness gauge)
484
- - With `metric`: deep dive into one family with labels, variants, notes, examples
485
- - `includeLiveMetrics=true`: runs `count by (__name__)({__name__=~".+"})` to discover active metrics
486
- - `includeLiveLabels=true`: samples label values via `last_over_time` on histogram _count + _bucket variants
482
+ - **Behavior**:
483
+ - Without `metric`: returns all 10 documented families (Rubix OTel, GraphQL OTel, GraphQL Micrometer, billing/read-only usage, freshness gauge)
484
+ - With `metric`: deep dive into one family with labels, variants, notes, examples
485
+ - `includeLiveMetrics=true`: runs `count by (__name__)({__name__=~".+"})` to discover active metrics
486
+ - `includeLiveLabels=true`: samples label values via `last_over_time` on histogram _count + _bucket variants
487
487
 
488
488
  Example:
489
489
 
@@ -495,132 +495,132 @@ Example:
495
495
  }
496
496
  ```
497
497
 
498
- ## `metrics.planQuery`
498
+ ## `metrics_planQuery`
499
499
 
500
- Generates ready-to-run PromQL for any documented metric family. Validates labels, picks the right histogram variant, and returns a metrics.query-ready payload plus count-audit helpers when the query is count-like.
500
+ Generates ready-to-run PromQL for any documented metric family. Validates labels, picks the right histogram variant, and returns a metrics_query-ready payload plus count-audit helpers when the query is count-like.
501
501
 
502
502
  - **Required**: `metric`
503
- - **Optional**:
504
- - `goal`: `rate` (default), `increase`, `delta` (exact integer count via last_over_time-offset), `breakdown`, `topk`, `p95`, `avg`, `recency` (gauge freshness via max last_over_time), `raw`
505
- - `window`: PromQL range window (default `5m`). Supports compound durations like `1h30m`
503
+ - **Optional**:
504
+ - `goal`: `rate` (default), `increase`, `delta` (exact integer count via last_over_time-offset), `breakdown`, `topk`, `p95`, `avg`, `recency` (gauge freshness via max last_over_time), `raw`
505
+ - `window`: PromQL range window (default `5m`). Supports compound durations like `1h30m`
506
506
  - `groupBy`: labels to group by
507
507
  - `filters`: label matchers (string for exact, array for regex OR)
508
508
  - `validateLabels`: reject unsupported labels (default `true`)
509
509
  - `topN`: for `topk` goal (default `10`)
510
510
  - `percentile`: for `p95` goal (default `0.95`)
511
- - **Behavior**:
512
- - Resolves metric family → picks correct variant (_bucket for p95, _count for rate/increase/delta, _sum/_count for avg, gauge for recency)
513
- - Validates groupBy/filter labels against known schema
514
- - Reuses the shared duration parser so `metrics.planQuery`, `metrics.compare`, and `metrics.mutationAudit` interpret windows the same way
515
- - Returns `rangeQueryHint` with `recommendedStep`, `estimatedPoints`, and a ready-to-run `metrics.query` range payload, snapped upward to stay within the LLM-safe point budget
516
- - For `goal=delta` and `goal=increase`, returns `countAudit` with:
517
- - `resetAuditQuery`
518
- - `comparisonQuery`
519
- - `recommendedMethod`
520
- - Returns `executeWith: { tool: "metrics.query", arguments: { query, type } }` for direct handoff
521
-
522
- ### Practical goal mapping
523
-
524
- - `rate`: throughput per second
525
- - `increase`: extrapolated total over a window
526
- - `delta`: fixed-window endpoint delta, best for near-integer counts when `resets(...) == 0`
527
- - `breakdown`: grouped totals/rates by safe labels
528
- - `topk`: ranked grouped results
529
- - `p95`: latency percentile from histogram buckets
530
- - `avg`: mean latency from `_sum / _count`
531
- - `recency`: last-seen timestamp for gauge freshness metrics
532
- - `raw`: raw selector, mostly for debugging
511
+ - **Behavior**:
512
+ - Resolves metric family → picks correct variant (_bucket for p95, _count for rate/increase/delta, _sum/_count for avg, gauge for recency)
513
+ - Validates groupBy/filter labels against known schema
514
+ - Reuses the shared duration parser so `metrics_planQuery`, `metrics_compare`, and `metrics_mutationAudit` interpret windows the same way
515
+ - Returns `rangeQueryHint` with `recommendedStep`, `estimatedPoints`, and a ready-to-run `metrics_query` range payload, snapped upward to stay within the LLM-safe point budget
516
+ - For `goal=delta` and `goal=increase`, returns `countAudit` with:
517
+ - `resetAuditQuery`
518
+ - `comparisonQuery`
519
+ - `recommendedMethod`
520
+ - Returns `executeWith: { tool: "metrics_query", arguments: { query, type } }` for direct handoff
521
+
522
+ ### Practical goal mapping
523
+
524
+ - `rate`: throughput per second
525
+ - `increase`: extrapolated total over a window
526
+ - `delta`: fixed-window endpoint delta, best for near-integer counts when `resets(...) == 0`
527
+ - `breakdown`: grouped totals/rates by safe labels
528
+ - `topk`: ranked grouped results
529
+ - `p95`: latency percentile from histogram buckets
530
+ - `avg`: mean latency from `_sum / _count`
531
+ - `recency`: last-seen timestamp for gauge freshness metrics
532
+ - `raw`: raw selector, mostly for debugging
533
+
534
+ Example:
535
+
536
+ ```json
537
+ {
538
+ "metric": "rubix_event_runtime_seconds",
539
+ "goal": "p95",
540
+ "groupBy": ["entity_type"],
541
+ "filters": { "account_id": "ACME" },
542
+ "window": "5m"
543
+ }
544
+ ```
545
+
546
+ ## `time_resolveWindow`
547
+
548
+ Resolves natural-language, shorthand, and datemath time phrases into exact ISO `from` / `to` timestamps so the LLM does not silently guess calendar intent.
549
+
550
+ - **Required**:
551
+ - `phrase`: natural-language, shorthand, or datemath phrase such as `last month`, `yesterday`, `last 7 days`, `7d`, `1h30m`, `now-7d/d`, or `now-7d to now`
552
+ - **Optional**:
553
+ - `timezone`: IANA timezone such as `UTC`, `Asia/Calcutta`, `Australia/Sydney` (defaults to runtime timezone)
554
+ - `anchor`: ISO-8601 anchor timestamp to resolve against (defaults to `now`)
555
+ - `mode`: `detect` (default), `calendar`, or `rolling`
556
+ - `weekStartsOn`: `monday` (default) or `sunday`
557
+
558
+ Behavior:
559
+ - unambiguous phrases resolve directly (`last 7 days`, `7d`, `previous calendar month`)
560
+ - compound shorthand resolves directly (`1h30m`, `2w3d`)
561
+ - datemath resolves directly (`now-7d`, `now/d`, `now-7d/d`, `now-7d to now`)
562
+ - ambiguous phrases return `valid: false`, `candidates`, and `clarificationQuestion` when `mode: "detect"`
563
+ - forcing `mode: "calendar"` or `mode: "rolling"` resolves the phrase without asking
564
+
565
+ Use this tool before `graphql_query`, `graphql_queryAll`, or `event_list` when the user asks for relative windows like `last month` and the underlying tool needs explicit timestamps.
566
+
567
+ Example:
568
+
569
+ ```json
570
+ {
571
+ "phrase": "last month",
572
+ "timezone": "Asia/Calcutta"
573
+ }
574
+ ```
575
+
576
+ Datemath example:
577
+
578
+ ```json
579
+ {
580
+ "phrase": "now-7d/d",
581
+ "timezone": "Asia/Calcutta"
582
+ }
583
+ ```
584
+
585
+ ## `metrics_mutationAudit`
586
+
587
+ Audits GraphQL create/update mutation traffic by business domain and subdomain. This tool discovers mutation names locally, then queries each operation explicitly over the requested window so the model does not need to handcraft per-operation PromQL.
588
+
589
+ - **Optional**:
590
+ - `window`: fixed window for counts (default `7d`)
591
+ - `domain`: optional domain filter such as `inventory`, `order`, `fulfilment`, `catalog`
592
+ - `subdomain`: optional subdomain filter such as `position`, `quantity`, `virtual-catalogue`, `virtual-position`, `consignment`
593
+ - `operationTypes`: subset of `create`, `update` (default both)
594
+ - `statuses`: GraphQL request outcome labels to include (default `["success"]`)
595
+ - `operations`: explicit mutation names to audit instead of schema discovery
596
+ - `includeZeroCount`: include zero-count operations (default `false`)
597
+ - `comparePrevious`: also count the immediately preceding window and return deltas (default `true`)
598
+ - `includeQueries`: include the generated PromQL per operation (default `false`)
599
+ - `maxOperations`: safety cap for how many operations to evaluate (default `100`)
600
+ - `forceIntrospection`: refresh schema mutation discovery instead of using cache
601
+ - **Behavior**:
602
+ - Discovers `create*` / `update*` mutations from schema when `operations` is omitted
603
+ - Classifies operations into domain/subdomain using the built-in taxonomy
604
+ - Uses fixed-window delta counting on `graphql_request_runtime_seconds_count`
605
+ - Returns grouped summaries by domain, subdomain, and action, plus per-operation rows
606
+ - Includes `countAudit` with `resets()` and `increase()` comparison queries so you can sanity-check the totals
607
+ - **Caveat**:
608
+ - This measures GraphQL mutation request traffic, not guaranteed business-truth entity changes
609
+ - If the tenant does not expose a usable `operation` label on GraphQL metrics, the tool returns `valid=false` instead of pretending the split is trustworthy
533
610
 
534
611
  Example:
535
612
 
536
613
  ```json
537
- {
538
- "metric": "rubix_event_runtime_seconds",
539
- "goal": "p95",
540
- "groupBy": ["entity_type"],
541
- "filters": { "account_id": "ACME" },
542
- "window": "5m"
543
- }
544
- ```
545
-
546
- ## `time.resolveWindow`
547
-
548
- Resolves natural-language, shorthand, and datemath time phrases into exact ISO `from` / `to` timestamps so the LLM does not silently guess calendar intent.
549
-
550
- - **Required**:
551
- - `phrase`: natural-language, shorthand, or datemath phrase such as `last month`, `yesterday`, `last 7 days`, `7d`, `1h30m`, `now-7d/d`, or `now-7d to now`
552
- - **Optional**:
553
- - `timezone`: IANA timezone such as `UTC`, `Asia/Calcutta`, `Australia/Sydney` (defaults to runtime timezone)
554
- - `anchor`: ISO-8601 anchor timestamp to resolve against (defaults to `now`)
555
- - `mode`: `detect` (default), `calendar`, or `rolling`
556
- - `weekStartsOn`: `monday` (default) or `sunday`
557
-
558
- Behavior:
559
- - unambiguous phrases resolve directly (`last 7 days`, `7d`, `previous calendar month`)
560
- - compound shorthand resolves directly (`1h30m`, `2w3d`)
561
- - datemath resolves directly (`now-7d`, `now/d`, `now-7d/d`, `now-7d to now`)
562
- - ambiguous phrases return `valid: false`, `candidates`, and `clarificationQuestion` when `mode: "detect"`
563
- - forcing `mode: "calendar"` or `mode: "rolling"` resolves the phrase without asking
564
-
565
- Use this tool before `graphql.query`, `graphql.queryAll`, or `event.list` when the user asks for relative windows like `last month` and the underlying tool needs explicit timestamps.
566
-
567
- Example:
568
-
569
- ```json
570
- {
571
- "phrase": "last month",
572
- "timezone": "Asia/Calcutta"
573
- }
574
- ```
575
-
576
- Datemath example:
577
-
578
- ```json
579
- {
580
- "phrase": "now-7d/d",
581
- "timezone": "Asia/Calcutta"
582
- }
583
- ```
584
-
585
- ## `metrics.mutationAudit`
586
-
587
- Audits GraphQL create/update mutation traffic by business domain and subdomain. This tool discovers mutation names locally, then queries each operation explicitly over the requested window so the model does not need to handcraft per-operation PromQL.
588
-
589
- - **Optional**:
590
- - `window`: fixed window for counts (default `7d`)
591
- - `domain`: optional domain filter such as `inventory`, `order`, `fulfilment`, `catalog`
592
- - `subdomain`: optional subdomain filter such as `position`, `quantity`, `virtual-catalogue`, `virtual-position`, `consignment`
593
- - `operationTypes`: subset of `create`, `update` (default both)
594
- - `statuses`: GraphQL request outcome labels to include (default `["success"]`)
595
- - `operations`: explicit mutation names to audit instead of schema discovery
596
- - `includeZeroCount`: include zero-count operations (default `false`)
597
- - `comparePrevious`: also count the immediately preceding window and return deltas (default `true`)
598
- - `includeQueries`: include the generated PromQL per operation (default `false`)
599
- - `maxOperations`: safety cap for how many operations to evaluate (default `100`)
600
- - `forceIntrospection`: refresh schema mutation discovery instead of using cache
601
- - **Behavior**:
602
- - Discovers `create*` / `update*` mutations from schema when `operations` is omitted
603
- - Classifies operations into domain/subdomain using the built-in taxonomy
604
- - Uses fixed-window delta counting on `graphql_request_runtime_seconds_count`
605
- - Returns grouped summaries by domain, subdomain, and action, plus per-operation rows
606
- - Includes `countAudit` with `resets()` and `increase()` comparison queries so you can sanity-check the totals
607
- - **Caveat**:
608
- - This measures GraphQL mutation request traffic, not guaranteed business-truth entity changes
609
- - If the tenant does not expose a usable `operation` label on GraphQL metrics, the tool returns `valid=false` instead of pretending the split is trustworthy
610
-
611
- Example:
612
-
613
- ```json
614
- {
615
- "domain": "inventory",
616
- "window": "7d",
617
- "operationTypes": ["create", "update"],
618
- "statuses": ["success"],
619
- "comparePrevious": true
620
- }
621
- ```
622
-
623
- ## `workflow.transitions`
614
+ {
615
+ "domain": "inventory",
616
+ "window": "7d",
617
+ "operationTypes": ["create", "update"],
618
+ "statuses": ["success"],
619
+ "comparePrevious": true
620
+ }
621
+ ```
622
+
623
+ ## `workflow_transitions`
624
624
 
625
625
  Query available user actions (transitions) for entities at a given workflow state, enriched with workflow-aware predictions.
626
626
 
@@ -630,7 +630,7 @@ Calls `POST /api/v4.1/transition` to discover what events can be fired, what att
630
630
  - **Optional per trigger**: `type`, `subtype`, `status`, `module`, `flexType`, `flexVersion`, `name`
631
631
  - **Retailer behavior**: `retailerId` is required per trigger. Falls back to `FLUENT_RETAILER_ID` when omitted.
632
632
  - **flexType auto-derive**: When `flexType` is not provided but `type` and `subtype` are, the tool auto-derives `flexType` as `{type}::{subtype}` (e.g., `CREDIT_MEMO::APPEASEMENT`). This avoids the silent empty-response problem where the Transition API returns `{"response":[]}` when `flexType` is missing.
633
- - **Auto-fetch workflow**: When no cached workflow exists, automatically fetches it via `workflow.get` (deriving entityType/entitySubtype from trigger type+subtype or flexType) and caches it for future calls.
633
+ - **Auto-fetch workflow**: When no cached workflow exists, automatically fetches it via `workflow_get` (deriving entityType/entitySubtype from trigger type+subtype or flexType) and caches it for future calls.
634
634
 
635
635
  ### Use cases
636
636
 
@@ -646,13 +646,13 @@ Calls `POST /api/v4.1/transition` to discover what events can be fired, what att
646
646
  - `classification`: `"progression"` (advances workflow), `"terminal"` (reaches end state), or `"unknown"` (no workflow match)
647
647
  - `targetStatus`: the predicted status the entity will reach after this action
648
648
  - `nextSteps`: array of event names available from the predicted `targetStatus` (multi-step lookahead)
649
- - **`_attributeTemplate`**: `{ eventName: { attrName: "<required>" | "<optional>" } }` — ready-to-fill templates for `event.send`
649
+ - **`_attributeTemplate`**: `{ eventName: { attrName: "<required>" | "<optional>" } }` — ready-to-fill templates for `event_send`
650
650
  - **`_recommended`**: `{ eventName, reason, confidence }` — the safest next action to take
651
651
  - `confidence`: `"high"` (single progression action), `"medium"` (non-confirmation only), `"low"` (multiple choices)
652
652
 
653
- ### Integration with event.send
653
+ ### Integration with event_send
654
654
 
655
- The `eventName` from each `userAction` maps directly to `event.send`'s `name` parameter. The `attributes[]` tell you what to include in `event.send`'s `attributes` parameter. The `_attributeTemplate` provides a pre-built skeleton.
655
+ The `eventName` from each `userAction` maps directly to `event_send`'s `name` parameter. The `attributes[]` tell you what to include in `event_send`'s `attributes` parameter. The `_attributeTemplate` provides a pre-built skeleton.
656
656
 
657
657
  ### Example: ORDER at CREATED status
658
658
 
@@ -736,17 +736,17 @@ Typical success shape (truncated, showing enrichment):
736
736
  ### Dynamic test sequence pattern
737
737
 
738
738
  ```
739
- 1. Create entity via graphql.query (mutation)
740
- 2. workflow.transitions → get available actions at current status
739
+ 1. Create entity via graphql_query (mutation)
740
+ 2. workflow_transitions → get available actions at current status
741
741
  3. Use _recommended for safest next action, or iterate _predictions for multi-path testing
742
742
  4. For each action:
743
- a. event.send with eventName and attributes from _attributeTemplate
743
+ a. event_send with eventName and attributes from _attributeTemplate
744
744
  b. Poll entity status until transition completes
745
- c. workflow.transitions → get next available actions (use nextSteps for lookahead)
745
+ c. workflow_transitions → get next available actions (use nextSteps for lookahead)
746
746
  5. Repeat until no more userActions (terminal state)
747
747
  ```
748
748
 
749
- ## `plugin.list`
749
+ ## `plugin_list`
750
750
 
751
751
  List all registered orchestration rules (standard + custom) with metadata.
752
752
 
@@ -806,7 +806,7 @@ Typical success shape (truncated):
806
806
  }
807
807
  ```
808
808
 
809
- ## `graphql.query`
809
+ ## `graphql_query`
810
810
 
811
811
  Executes a Fluent Commerce GraphQL query or mutation through the SDK.
812
812
 
@@ -850,7 +850,7 @@ Pagination args: `first`/`after` (forward), `last`/`before` (backward).
850
850
 
851
851
  ### Synchronous Fulfilment Options (Live Checkout)
852
852
 
853
- `graphql.query` supports synchronous fulfilment options orchestration calls,
853
+ `graphql_query` supports synchronous fulfilment options orchestration calls,
854
854
  commonly used by checkout journeys to get plans in the same response.
855
855
 
856
856
  ```json
@@ -892,7 +892,7 @@ All list queries return connections:
892
892
 
893
893
  Common query roots: `orders`, `fulfilments`, `fulfilmentChoices`, `locations`, `inventoryPositions`, `products`, `categories`, `settings`, `waves`, `articles`.
894
894
 
895
- ## `batch.create`
895
+ ## `batch_create`
896
896
 
897
897
  Creates a Fluent ingestion job.
898
898
 
@@ -910,9 +910,9 @@ Example:
910
910
  }
911
911
  ```
912
912
 
913
- ## `batch.describePayload`
913
+ ## `batch_describePayload`
914
914
 
915
- Returns entity-type-specific payload guidance for `batch.send` without making an API call.
915
+ Returns entity-type-specific payload guidance for `batch_send` without making an API call.
916
916
 
917
917
  - **Required**: `entityType`
918
918
  - **Optional**: `action` (default: `UPSERT`)
@@ -935,9 +935,9 @@ Returns:
935
935
  }
936
936
  ```
937
937
 
938
- Use this before `batch.send` when the model is unsure about row shape for entity types like `PRODUCT`, `INVENTORY_POSITION`, `LOCATION`, `CUSTOMER`, or `ORDER`.
938
+ Use this before `batch_send` when the model is unsure about row shape for entity types like `PRODUCT`, `INVENTORY_POSITION`, `LOCATION`, `CUSTOMER`, or `ORDER`.
939
939
 
940
- ## `batch.send`
940
+ ## `batch_send`
941
941
 
942
942
  Sends payload records to an existing batch job.
943
943
 
@@ -968,7 +968,7 @@ Example:
968
968
  }
969
969
  ```
970
970
 
971
- ## `batch.status`
971
+ ## `batch_status`
972
972
 
973
973
  Reads status for a previously created batch job.
974
974
 
@@ -982,7 +982,7 @@ Example:
982
982
  }
983
983
  ```
984
984
 
985
- ## `batch.batchStatus`
985
+ ## `batch_batchStatus`
986
986
 
987
987
  Gets the status of a specific batch within a job. Useful for troubleshooting partial failures in multi-batch jobs.
988
988
 
@@ -997,9 +997,9 @@ Example:
997
997
  }
998
998
  ```
999
999
 
1000
- ## `batch.results`
1000
+ ## `batch_results`
1001
1001
 
1002
- Gets per-record outcomes for a completed job. Call after `batch.status` reports a terminal state.
1002
+ Gets per-record outcomes for a completed job. Call after `batch_status` reports a terminal state.
1003
1003
 
1004
1004
  - **Required**: `jobId`
1005
1005
 
@@ -1013,9 +1013,9 @@ Example:
1013
1013
 
1014
1014
  ---
1015
1015
 
1016
- ## `graphql.queryAll`
1016
+ ## `graphql_queryAll`
1017
1017
 
1018
- Executes a GraphQL query with SDK auto-pagination. Automatically follows cursors, merges all edges, and deduplicates by node ID. Use instead of `graphql.query` when you need ALL records from a connection.
1018
+ Executes a GraphQL query with SDK auto-pagination. Automatically follows cursors, merges all edges, and deduplicates by node ID. Use instead of `graphql_query` when you need ALL records from a connection.
1019
1019
 
1020
1020
  - **Required**: `query`
1021
1021
  - **Optional**:
@@ -1072,7 +1072,7 @@ If truncated: `truncationReason` will be `"maxPages"`, `"maxRecords"`, or `"time
1072
1072
  }
1073
1073
  ```
1074
1074
 
1075
- ## `graphql.batchMutate`
1075
+ ## `graphql_batchMutate`
1076
1076
 
1077
1077
  Executes multiple GraphQL mutations in a single request using aliased mutations. Sends up to 50 mutations at once, each with its own input.
1078
1078
 
@@ -1138,7 +1138,7 @@ On partial failure, `errors` array includes per-mutation error details with `ali
1138
1138
  }
1139
1139
  ```
1140
1140
 
1141
- ## `graphql.introspect`
1141
+ ## `graphql_introspect`
1142
1142
 
1143
1143
  Inspects the Fluent Commerce GraphQL schema via introspection. Caches schema responses locally (24h disk cache by default when cache is enabled) and supports `force` refresh. Use to discover mutations, input types, and field requirements at runtime.
1144
1144
 
@@ -1224,9 +1224,9 @@ Response:
1224
1224
  1. `{ "listMutations": true }` → find `updateOrder`
1225
1225
  2. `{ "mutation": "updateOrder" }` → see it takes `UpdateOrderInput!`
1226
1226
  3. `{ "type": "UpdateOrderInput" }` → see all updatable fields
1227
- 4. Use `graphql.query` or `graphql.batchMutate` with the discovered schema
1227
+ 4. Use `graphql_query` or `graphql_batchMutate` with the discovered schema
1228
1228
 
1229
- ## `graphql.listRoots`
1229
+ ## `graphql_listRoots`
1230
1230
 
1231
1231
  List all query and mutation root fields from the live GraphQL schema. Use to discover what queries and mutations are available before building them.
1232
1232
 
@@ -1250,7 +1250,7 @@ Response:
1250
1250
  }
1251
1251
  ```
1252
1252
 
1253
- ## `graphql.planOperation`
1253
+ ## `graphql_planOperation`
1254
1254
 
1255
1255
  Plan a query or mutation before execution. This is the best tool when the model needs help building the right GraphQL payload shape.
1256
1256
 
@@ -1274,7 +1274,7 @@ Returns:
1274
1274
  - `recommendedExecutionTool`
1275
1275
  - `document`
1276
1276
 
1277
- For query roots with nested connections or aggregate-style fields, the planner also includes connection/field guidance so the caller can decide when to use `graphql.queryAll`, add `first`, or select leaf fields like `sum` / `count`.
1277
+ For query roots with nested connections or aggregate-style fields, the planner also includes connection/field guidance so the caller can decide when to use `graphql_queryAll`, add `first`, or select leaf fields like `sum` / `count`.
1278
1278
 
1279
1279
  ### Example
1280
1280
 
@@ -1287,12 +1287,12 @@ For query roots with nested connections or aggregate-style fields, the planner a
1287
1287
 
1288
1288
  Typical follow-on flow:
1289
1289
 
1290
- 1. Run `graphql.planOperation`
1290
+ 1. Run `graphql_planOperation`
1291
1291
  2. Review `requiredInputPaths` and `variablesTemplate`
1292
1292
  3. Adjust the scaffold if needed
1293
- 4. Execute with `graphql.query` or `graphql.queryAll`
1293
+ 4. Execute with `graphql_query` or `graphql_queryAll`
1294
1294
 
1295
- ## `graphql.buildQuery`
1295
+ ## `graphql_buildQuery`
1296
1296
 
1297
1297
  Generate a GraphQL query or mutation string from structured inputs. Validates the result against the live schema by default.
1298
1298
 
@@ -1333,7 +1333,7 @@ Response:
1333
1333
  }
1334
1334
  ```
1335
1335
 
1336
- ## `graphql.validate`
1336
+ ## `graphql_validate`
1337
1337
 
1338
1338
  Validate a GraphQL document string against the live schema. Returns "OK" if valid, or a list of validation errors.
1339
1339
 
@@ -1364,7 +1364,7 @@ Response (invalid):
1364
1364
  }
1365
1365
  ```
1366
1366
 
1367
- ## `graphql.generateFull`
1367
+ ## `graphql_generateFull`
1368
1368
 
1369
1369
  Generate a maximal-selection query for a root field, recursively including all scalar fields and nested object fields up to the specified depth.
1370
1370
 
@@ -1396,7 +1396,7 @@ Response:
1396
1396
  }
1397
1397
  ```
1398
1398
 
1399
- ## `connection.test`
1399
+ ## `connection_test`
1400
1400
 
1401
1401
  Comprehensive Fluent Commerce connectivity test. Authenticates, executes a `me` query, and returns the authenticated user's details.
1402
1402
 
@@ -1433,9 +1433,9 @@ Comprehensive Fluent Commerce connectivity test. Authenticates, executes a `me`
1433
1433
  }
1434
1434
  ```
1435
1435
 
1436
- More thorough than `health.ping` — actually verifies the GraphQL endpoint works end-to-end. Use when first connecting, debugging auth issues, or verifying retailer/location context.
1436
+ More thorough than `health_ping` — actually verifies the GraphQL endpoint works end-to-end. Use when first connecting, debugging auth issues, or verifying retailer/location context.
1437
1437
 
1438
- ## `webhook.validate`
1438
+ ## `webhook_validate`
1439
1439
 
1440
1440
  Validates a Fluent Commerce webhook payload and optionally verifies its signature.
1441
1441
 
@@ -1507,7 +1507,7 @@ Response:
1507
1507
 
1508
1508
  ---
1509
1509
 
1510
- ## `entity.planCreate`
1510
+ ## `entity_planCreate`
1511
1511
 
1512
1512
  Plan an entity creation locally without making an API call.
1513
1513
 
@@ -1527,7 +1527,7 @@ Returns:
1527
1527
  - `_meta.availableEdges`
1528
1528
  - `_hints`
1529
1529
 
1530
- Use this when the model knows it wants `entity.create` but needs help with required fields, retailer auto-injection, or the mutation shape first.
1530
+ Use this when the model knows it wants `entity_create` but needs help with required fields, retailer auto-injection, or the mutation shape first.
1531
1531
 
1532
1532
  ### Example
1533
1533
 
@@ -1539,9 +1539,9 @@ Use this when the model knows it wants `entity.create` but needs help with requi
1539
1539
 
1540
1540
  ---
1541
1541
 
1542
- ## `entity.planUpdate`
1542
+ ## `entity_planUpdate`
1543
1543
 
1544
- Plan an entity update locally without making an API call.
1544
+ Plan an entity_update locally without making an API call.
1545
1545
 
1546
1546
  - **Required**: `entityType`
1547
1547
 
@@ -1557,7 +1557,7 @@ Returns:
1557
1557
  - `_meta.availableEdges`
1558
1558
  - `_hints`
1559
1559
 
1560
- Use this when the model needs to know which fields are likely safe to send to `entity.update`, or wants a starter payload before setting `status`, `attributes`, or related fields.
1560
+ Use this when the model needs to know which fields are likely safe to send to `entity_update`, or wants a starter payload before setting `status`, `attributes`, or related fields.
1561
1561
 
1562
1562
  ### Example
1563
1563
 
@@ -1569,7 +1569,7 @@ Use this when the model needs to know which fields are likely safe to send to `e
1569
1569
 
1570
1570
  ---
1571
1571
 
1572
- ## `entity.create`
1572
+ ## `entity_create`
1573
1573
 
1574
1574
  Type-safe entity creation with built-in validation and gotcha knowledge.
1575
1575
 
@@ -1656,7 +1656,7 @@ Response:
1656
1656
 
1657
1657
  ---
1658
1658
 
1659
- ## `entity.update`
1659
+ ## `entity_update`
1660
1660
 
1661
1661
  Status-aware entity updates with optional transition validation.
1662
1662
 
@@ -1666,12 +1666,12 @@ Status-aware entity updates with optional transition validation.
1666
1666
  - `fields`: object of fields to update (matches GraphQL update input type)
1667
1667
  - **Optional**:
1668
1668
  - `returnFields`: array of field names to return
1669
- - `validateTransition`: if `true` and `status` is being changed, queries `workflow.transitions` to verify the transition is allowed before executing (default `false`)
1669
+ - `validateTransition`: if `true` and `status` is being changed, queries `workflow_transitions` to verify the transition is allowed before executing (default `false`)
1670
1670
 
1671
1671
  **Key behaviors:**
1672
1672
 
1673
1673
  - Auto-detects the correct GraphQL mutation name from entity type
1674
- - When `validateTransition` is `true`: fetches current entity state, queries transition API, warns if no workflow transitions exist from the current status
1674
+ - When `validateTransition` is `true`: fetches current entity state, queries transition API, warns if no workflow_transitions exist from the current status
1675
1675
  - Returns the previous status for audit trail when transition validation is used
1676
1676
  - Uses no-retry semantics (write operation)
1677
1677
 
@@ -1705,13 +1705,13 @@ If no workflow transition exists:
1705
1705
  "entityType": "ORDER",
1706
1706
  "entity": { "id": "12345", "ref": "HD-001", "status": "COMPLETE" },
1707
1707
  "mutation": "...",
1708
- "transitionWarning": "No workflow transitions available from status \"BOOKED\" for ORDER. The status update may succeed as a direct mutation but will not trigger workflow orchestration."
1708
+ "transitionWarning": "No workflow_transitions available from status \"BOOKED\" for ORDER. The status update may succeed as a direct mutation but will not trigger workflow orchestration."
1709
1709
  }
1710
1710
  ```
1711
1711
 
1712
1712
  ---
1713
1713
 
1714
- ## `entity.get`
1714
+ ## `entity_get`
1715
1715
 
1716
1716
  Unified entity lookup by ID or ref with optional edge inclusion.
1717
1717
 
@@ -1764,7 +1764,7 @@ Response:
1764
1764
 
1765
1765
  ---
1766
1766
 
1767
- ## `workflow.get`
1767
+ ## `workflow_get`
1768
1768
 
1769
1769
  Fetch a specific workflow definition by entity type and subtype via REST API.
1770
1770
 
@@ -1796,7 +1796,7 @@ Uses `GET /api/v4.1/workflow/{retailerId}/{entityType}::{entitySubtype}/` — wo
1796
1796
 
1797
1797
  ---
1798
1798
 
1799
- ## `workflow.list`
1799
+ ## `workflow_list`
1800
1800
 
1801
1801
  List all workflows for a retailer via REST API.
1802
1802
 
@@ -1816,20 +1816,19 @@ Uses `GET /api/v4.1/workflow?retailerId={id}&count=200`. Response is deduplicate
1816
1816
  }
1817
1817
  ```
1818
1818
 
1819
- **Note:** Some accounts restrict this endpoint (401 "Incorrect retailer"). In that case, use `workflow.get` with a specific entityType + entitySubtype instead.
1819
+ **Note:** Some accounts restrict this endpoint (401 "Incorrect retailer"). In that case, use `workflow_get` with a specific entityType + entitySubtype instead.
1820
1820
 
1821
1821
  ---
1822
1822
 
1823
- ## `workflow.upload`
1823
+ ## `workflow_upload`
1824
1824
 
1825
- Deploy a workflow JSON definition to the Fluent environment with preflight safety analysis.
1825
+ Deploy a workflow JSON via the Fluent REST API (`PUT /api/v4.1/workflow/{retailerId}`) with preflight safety analysis.
1826
1826
 
1827
- Uploads via REST API `POST /api/v4.1/workflow/{retailerId}` — the same endpoint the Fluent CLI uses. Before deploying, performs semantic risk analysis and compares with the live workflow if it exists.
1827
+ Uses PUT for idempotent upsertdeploying the same JSON twice does not create duplicate versions (unlike POST which always creates a new version). Before deploying, performs semantic risk analysis and compares with the live workflow if it exists.
1828
1828
 
1829
1829
  - **Required**:
1830
1830
  - `workflow`: workflow JSON definition (as object or JSON string)
1831
1831
  - **Optional**:
1832
- - `retailerId`: target retailer ID (falls back to `FLUENT_RETAILER_ID`)
1833
1832
  - `validate`: validate structure before uploading (default `true`)
1834
1833
  - `dryRun`: validate only, do not deploy (default `false`)
1835
1834
 
@@ -1843,7 +1842,7 @@ Uploads via REST API `POST /api/v4.1/workflow/{retailerId}` — the same endpoin
1843
1842
 
1844
1843
  - **No-match zone detection**: identifies statuses that are transition targets but have no rulesets triggered from them — events sent to these statuses will NO_MATCH
1845
1844
  - **Webhook dependency extraction**: lists all setting keys referenced by webhook rules so you can verify they exist
1846
- - **Live workflow comparison**: when updating an existing workflow, fetches the current version and runs `workflow.diff` to show ruleset/status changes and risk level
1845
+ - **Live workflow comparison**: when updating an existing workflow, fetches the current version and runs `workflow_diff` to show ruleset/status changes and risk level
1847
1846
  - **Cross-version risk analysis**: detects removed statuses that had active rulesets and removed rulesets
1848
1847
 
1849
1848
  **Response fields (in addition to standard success fields):**
@@ -1857,8 +1856,9 @@ Uploads via REST API `POST /api/v4.1/workflow/{retailerId}` — the same endpoin
1857
1856
 
1858
1857
  **Important:**
1859
1858
  - Preflight analysis is **non-blocking** — failures to fetch the current workflow don't prevent upload (handles first deployments and permission issues gracefully)
1859
+ - Deploys via REST API PUT (full replace semantics) — the uploaded JSON completely replaces the workflow definition
1860
+ - Does NOT update the CLI workflowlog — `fluent workflow download` may show stale data. Fix: `fluent workflowlog delete` then redeploy via CLI
1860
1861
  - For production deployments, prefer `fluent module install` via CLI which bundles workflows with settings, rules, and data in a versioned module
1861
- - Use this tool for interactive editing, hotfixes, or when CLI is unavailable
1862
1862
 
1863
1863
  **Example** — dry-run with risk analysis:
1864
1864
 
@@ -1917,7 +1917,7 @@ Response (dry run with no-match zone detected):
1917
1917
 
1918
1918
  ---
1919
1919
 
1920
- ## `workflow.diff`
1920
+ ## `workflow_diff`
1921
1921
 
1922
1922
  Compare two workflow JSON definitions and identify changes.
1923
1923
 
@@ -1967,7 +1967,7 @@ Response:
1967
1967
 
1968
1968
  ---
1969
1969
 
1970
- ## `workflow.simulate`
1970
+ ## `workflow_simulate`
1971
1971
 
1972
1972
  Static prediction of workflow event outcomes from workflow JSON.
1973
1973
 
@@ -1994,7 +1994,7 @@ Pure local computation — no API calls. Parses workflow JSON to find matching r
1994
1994
  - **STATIC ONLY** — cannot evaluate runtime conditions, entity attributes, or settings values
1995
1995
  - **CUSTOM RULES OPAQUE** — Java plugin rules may conditionally execute; behavior unknown without live state
1996
1996
  - **NO CROSS-ENTITY** — does not follow SendEvent chains into child entity workflows
1997
- - Use `workflow.transitions` for **authoritative live validation** of available actions
1997
+ - Use `workflow_transitions` for **authoritative live validation** of available actions
1998
1998
 
1999
1999
  **Example** — simulate from CREATED status:
2000
2000
 
@@ -2035,14 +2035,14 @@ Response:
2035
2035
  "limitations": [
2036
2036
  "STATIC PREDICTION ONLY — does not account for runtime conditions, entity attributes, or settings values.",
2037
2037
  "1 custom rule(s) found whose behavior cannot be predicted statically: ForwardIfOrderCoordinatesPresent.",
2038
- "Use workflow.transitions for AUTHORITATIVE live validation of available actions."
2038
+ "Use workflow_transitions for AUTHORITATIVE live validation of available actions."
2039
2039
  ]
2040
2040
  }
2041
2041
  ```
2042
2042
 
2043
2043
  ---
2044
2044
 
2045
- ## `setting.get`
2045
+ ## `setting_get`
2046
2046
 
2047
2047
  Fetch one or more Fluent Commerce settings by name (supports `%` wildcards).
2048
2048
 
@@ -2093,7 +2093,7 @@ Uses the GraphQL `settings(name:)` query. Returns metadata inline (name, context
2093
2093
 
2094
2094
  ---
2095
2095
 
2096
- ## `setting.upsert`
2096
+ ## `setting_upsert`
2097
2097
 
2098
2098
  Create or update a Fluent Commerce setting with upsert semantics.
2099
2099
 
@@ -2158,7 +2158,7 @@ Response (updated existing):
2158
2158
 
2159
2159
  ---
2160
2160
 
2161
- ## `setting.bulkUpsert`
2161
+ ## `setting_bulkUpsert`
2162
2162
 
2163
2163
  Batch create or update multiple settings in one call.
2164
2164
 
@@ -2198,7 +2198,7 @@ Response:
2198
2198
 
2199
2199
  ---
2200
2200
 
2201
- ## `environment.discover`
2201
+ ## `environment_discover`
2202
2202
 
2203
2203
  Full environment snapshot in one call.
2204
2204
 
@@ -2237,7 +2237,7 @@ Response:
2237
2237
 
2238
2238
  ---
2239
2239
 
2240
- ## `environment.validate`
2240
+ ## `environment_validate`
2241
2241
 
2242
2242
  Pre-flight environment validation. Runs configurable checks before E2E tests or deployments.
2243
2243
 
@@ -2284,7 +2284,7 @@ Response:
2284
2284
 
2285
2285
  ---
2286
2286
 
2287
- ## `test.assert`
2287
+ ## `test_assert`
2288
2288
 
2289
2289
  Assert entity state matches expectations with optional polling.
2290
2290
 
@@ -2364,7 +2364,7 @@ Response (fail after timeout):
2364
2364
 
2365
2365
  ---
2366
2366
 
2367
- ## `cache.status`
2367
+ ## `cache_status`
2368
2368
 
2369
2369
  Show local cache statistics. No API call.
2370
2370
 
@@ -2394,11 +2394,11 @@ Returns:
2394
2394
  - `FLUENT_CACHE_TTL_PLUGIN` — plugin TTL in ms (default 1 hour)
2395
2395
 
2396
2396
  **Cached tools:**
2397
- - `graphql.introspect`
2398
- - `plugin.list`
2399
- - `workflow.get`
2400
- - `workflow.list`
2401
- - `setting.get`
2397
+ - `graphql_introspect`
2398
+ - `plugin_list`
2399
+ - `workflow_get`
2400
+ - `workflow_list`
2401
+ - `setting_get`
2402
2402
 
2403
2403
  Example:
2404
2404
 
@@ -2410,7 +2410,7 @@ Example:
2410
2410
 
2411
2411
  ---
2412
2412
 
2413
- ## `cache.clear`
2413
+ ## `cache_clear`
2414
2414
 
2415
2415
  Clear cached entries. No API call.
2416
2416
 
@@ -2418,10 +2418,10 @@ Clear cached entries. No API call.
2418
2418
  - `pattern`: string — glob-style cache key filter. Omit to clear everything.
2419
2419
 
2420
2420
  Common patterns:
2421
- - `workflow:*` — clear workflow list/get cache
2421
+ - `workflow:get:*` or `workflow:list:*` — clear workflow get/list cache
2422
2422
  - `setting:get:fc.mystique.*` — clear cached manifest/settings lookups
2423
2423
  - `introspect:*` — clear GraphQL schema cache
2424
- - `plugin:list` — clear cached plugin metadata
2424
+ - `plugin:list:*` — clear cached plugin metadata
2425
2425
 
2426
2426
  Response includes:
2427
2427
  - `cleared`: number of entries removed
@@ -2446,15 +2446,15 @@ Example:
2446
2446
 
2447
2447
  | Category | Tools | Retry behavior |
2448
2448
  |------|----------|-------------|
2449
- | Read operations | `event.get`, `event.list`, `event.flowInspect`, `metrics.query`, `metrics.healthCheck`, `metrics.sloReport`, `metrics.labelCatalog`, `metrics.metricCatalog`, `metrics.planQuery`, `metrics.snapshot`, `metrics.compare`, `metrics.mutationAudit`, `metrics.topEvents`, `workflow.transitions`, `workflow.get`, `workflow.list`, `graphql.query` (query), `graphql.queryAll`, `batch.status`, `batch.batchStatus`, `batch.results`, `graphql.introspect`, `graphql.listRoots`, `graphql.validate`, `graphql.generateFull`, `connection.test`, `entity.get`, `setting.get`, `environment.discover`, `environment.validate`, `test.assert`, `plugin.list` | retry + backoff |
2450
- | Write operations | `event.send`, `batch.create`, `batch.send`, `graphql.query` (mutation), `graphql.batchMutate`, `entity.create`, `entity.update`, `workflow.upload`, `setting.upsert`, `setting.bulkUpsert` | timeout-only (no automatic retry) |
2451
- | Local validation / no API | `config.validate`, `health.ping`, `time.resolveWindow`, `event.build`, `webhook.validate`, `workflow.diff`, `workflow.simulate`, `graphql.buildQuery` (validate=false), `cache.status`, `cache.clear`, `connection.list`, `connection.add`, `connection.remove`, `connection.switch` | not applicable |
2449
+ | Read operations | `event_get`, `event_list`, `event_flowInspect`, `metrics_query`, `metrics_healthCheck`, `metrics_sloReport`, `metrics_labelCatalog`, `metrics_metricCatalog`, `metrics_planQuery`, `metrics_snapshot`, `metrics_compare`, `metrics_mutationAudit`, `metrics_topEvents`, `workflow_transitions`, `workflow_get`, `workflow_list`, `graphql_query` (query), `graphql_queryAll`, `batch_status`, `batch_batchStatus`, `batch_results`, `graphql_introspect`, `graphql_listRoots`, `graphql_validate`, `graphql_generateFull`, `connection_test`, `entity_get`, `setting_get`, `environment_discover`, `environment_validate`, `test_assert`, `plugin_list` | retry + backoff |
2450
+ | Write operations | `event_send`, `batch_create`, `batch_send`, `graphql_query` (mutation), `graphql_batchMutate`, `entity_create`, `entity_update`, `workflow_upload`, `setting_upsert`, `setting_bulkUpsert` | timeout-only (no automatic retry) |
2451
+ | Local validation / no API | `config_validate`, `health_ping`, `time_resolveWindow`, `event_build`, `webhook_validate`, `workflow_diff`, `workflow_simulate`, `graphql_buildQuery` (validate=false), `cache_status`, `cache_clear`, `connection_list`, `connection_add`, `connection_remove`, `connection_switch` | not applicable |
2452
2452
 
2453
2453
  ## Connection Management
2454
2454
 
2455
2455
  These tools manage the multi-profile registry at runtime. They do not require a `profile` parameter themselves.
2456
2456
 
2457
- ### `connection.list`
2457
+ ### `connection_list`
2458
2458
 
2459
2459
  List all registered profiles with auth strategy, init status, and default marker.
2460
2460
 
@@ -2498,7 +2498,7 @@ Response:
2498
2498
  }
2499
2499
  ```
2500
2500
 
2501
- ### `connection.add`
2501
+ ### `connection_add`
2502
2502
 
2503
2503
  Add a new profile at runtime. Supports CLI profile names or explicit credentials.
2504
2504
 
@@ -2519,7 +2519,7 @@ Each registered slot resolves auth independently, so one server session can mix:
2519
2519
  - explicit OAuth
2520
2520
  - explicit static bearer token
2521
2521
 
2522
- `TOKEN_COMMAND` is not currently a `connection.add` option; token-command auth is configured at server startup via environment variables.
2522
+ `TOKEN_COMMAND` is not currently a `connection_add` option; token-command auth is configured at server startup via environment variables.
2523
2523
 
2524
2524
  Example — add by CLI profile:
2525
2525
 
@@ -2554,7 +2554,7 @@ Example — add with static bearer token:
2554
2554
  }
2555
2555
  ```
2556
2556
 
2557
- ### `connection.remove`
2557
+ ### `connection_remove`
2558
2558
 
2559
2559
  Remove a non-default profile from the registry.
2560
2560
 
@@ -2569,7 +2569,7 @@ Example:
2569
2569
  }
2570
2570
  ```
2571
2571
 
2572
- ### `connection.switch`
2572
+ ### `connection_switch`
2573
2573
 
2574
2574
  Change the default profile. Subsequent tool calls that omit `profile` will use this profile.
2575
2575
 
@@ -2589,63 +2589,63 @@ Example:
2589
2589
 
2590
2590
  | Tool | Category | Requires SDK | Retry | Description |
2591
2591
  |------|----------|:------------:|:-----:|-------------|
2592
- | `config.validate` | Diagnostics | No | — | Validate auth/base URL configuration |
2593
- | `health.ping` | Diagnostics | No | — | Quick health check with config summary |
2594
- | `connection.test` | Diagnostics | Yes | Yes | Full auth + GraphQL end-to-end test (returns user/account context) |
2595
- | `connection.list` | Connection | No | — | List registered profiles with auth strategy and init status |
2596
- | `connection.add` | Connection | No | — | Add a profile at runtime (CLI profile or explicit credentials) |
2597
- | `connection.remove` | Connection | No | — | Remove a non-default profile |
2598
- | `connection.switch` | Connection | No | — | Switch the default profile |
2599
- | `event.build` | Events | No | — | Build event payload (no API call) |
2600
- | `event.send` | Events | Yes | No | Send event (async/sync, supports dryRun) |
2601
- | `event.get` | Events | Yes | Yes | Get single event by ID |
2602
- | `event.list` | Events | Yes | Yes | List/filter events with pagination and optional analysis mode |
2603
- | `event.flowInspect` | Events | Yes | Yes | One-call root-entity flow forensics with compact/full modes |
2604
- | `metrics.query` | Metrics | Yes | Yes | Query Prometheus metrics (instant/range) |
2605
- | `metrics.healthCheck` | Metrics | Yes | Yes | One-call anomaly assessment with Prometheus + Event API fallback |
2606
- | `metrics.sloReport` | Metrics | Yes | Yes | SLO snapshot with rates, latency, and threshold findings |
2607
- | `metrics.labelCatalog` | Metrics | Yes | Yes | Label discovery for a metric (live sampling + known hints) |
2608
- | `metrics.metricCatalog` | Metrics | Yes | Yes | Documented Fluent metric families with labels, examples, live probing |
2609
- | `metrics.planQuery` | Metrics | No | No | Generate validated PromQL for any documented metric family |
2610
- | `metrics.snapshot` | Metrics | Yes | Yes | One-call dashboard snapshot for volume, failures, and latency |
2611
- | `metrics.compare` | Metrics | Yes | Yes | Compare two adjacent windows for a metric and highlight deltas |
2612
- | `time.resolveWindow` | Time | Yes | Yes | Resolve natural-language time phrases into exact `from` / `to` timestamps |
2613
- | `metrics.mutationAudit` | Metrics | Yes | Yes | Audit GraphQL create/update mutation traffic by domain, subdomain, and operation |
2614
- | `metrics.topEvents` | Metrics | Yes | Yes | Ranked event analytics using Event API aggregation |
2615
- | `workflow.transitions` | Orchestration | Yes | Yes | Query available user actions/transitions at any entity state |
2616
- | `plugin.list` | Orchestration | Yes | Yes | List registered rules with optional name filter |
2617
- | `graphql.query` | GraphQL | Yes | Varies | Execute single-page query or mutation (retries for queries only) |
2618
- | `graphql.queryAll` | GraphQL | Yes | Yes | Auto-paginated query — follows cursors across all pages |
2619
- | `graphql.batchMutate` | GraphQL | Yes | No | Execute up to 50 aliased mutations in one request |
2620
- | `graphql.introspect` | GraphQL | Yes | Yes | Schema introspection (types, mutations, queries) with force-refresh |
2621
- | `graphql.listRoots` | GraphQL | Yes | Yes | List all query and mutation root fields from the live schema |
2622
- | `graphql.planOperation` | GraphQL | Yes | Yes | Plan a query or mutation: required args, variables skeleton, selection template, execution guidance |
2623
- | `graphql.buildQuery` | GraphQL | Yes | Varies | Generate query/mutation from structured inputs with optional validation |
2624
- | `graphql.validate` | GraphQL | Yes | Yes | Validate a GraphQL document against the live schema |
2625
- | `graphql.generateFull` | GraphQL | Yes | Yes | Generate maximal-selection query for a root field (depth-limited) |
2626
- | `batch.create` | Batch | Yes | No | Create ingestion job |
2627
- | `batch.describePayload` | Batch | No | — | Describe entity-type-specific payload shape and example rows for batch.send |
2628
- | `batch.send` | Batch | Yes | No | Send records to job |
2629
- | `batch.status` | Batch | Yes | Yes | Check job status |
2630
- | `batch.batchStatus` | Batch | Yes | Yes | Check specific batch within a job |
2631
- | `batch.results` | Batch | Yes | Yes | Get per-record job outcomes |
2632
- | `webhook.validate` | Webhooks | No | — | Validate webhook payload + optional signature verification |
2633
- | `entity.planCreate` | Entity | No | — | Plan an entity create mutation locally with required fields, skeleton, and gotchas |
2634
- | `entity.planUpdate` | Entity | No | — | Plan an entity update mutation locally with updatable fields, skeleton, and guidance |
2635
- | `entity.create` | Entity | Yes | No | Type-safe entity creation with field validation and gotcha knowledge (12 entity types) |
2636
- | `entity.update` | Entity | Yes | No | Status-aware entity updates with optional transition validation |
2637
- | `entity.get` | Entity | Yes | Yes | Unified entity lookup by ID or ref with optional edge inclusion |
2638
- | `workflow.get` | Workflow Mgmt | Yes | Yes | Fetch specific workflow by entityType + entitySubtype via REST API |
2639
- | `workflow.list` | Workflow Mgmt | Yes | Yes | List all workflows for a retailer (deduplicated to latest versions) |
2640
- | `workflow.upload` | Workflow Mgmt | Yes | No | Deploy workflow JSON via REST API with structure validation and preflight safety analysis |
2641
- | `workflow.diff` | Workflow Mgmt | No | — | Compare two workflows — rulesets, statuses, risk assessment, mermaid output |
2642
- | `workflow.simulate` | Workflow Mgmt | No | — | Static prediction of event outcomes from workflow JSON |
2643
- | `setting.get` | Settings | Yes | Yes | Fetch settings by name (wildcards supported), optionally save to local file |
2644
- | `setting.upsert` | Settings | Yes | No | Create or update a setting with upsert semantics |
2645
- | `setting.bulkUpsert` | Settings | Yes | No | Batch create/update up to 50 settings with per-setting error handling |
2646
- | `environment.discover` | Environment | Yes | Yes | Full environment snapshot — retailer, locations, networks, catalogues, settings, modules |
2647
- | `environment.validate` | Environment | Yes | Yes | Pre-flight validation checks: auth, retailer, locations, inventory, workflows |
2648
- | `test.assert` | Test | Yes | Yes | Assert entity state with status, attribute, and edge assertions + polling mode |
2649
- | `cache.status` | Cache | No | — | Show local cache statistics — entry count, size, hit/miss rate, per-category breakdown |
2650
- | `cache.clear` | Cache | No | — | Clear cached entries by pattern or all — no API call, local filesystem only |
2592
+ | `config_validate` | Diagnostics | No | — | Validate auth/base URL configuration |
2593
+ | `health_ping` | Diagnostics | No | — | Quick health check with config summary |
2594
+ | `connection_test` | Diagnostics | Yes | Yes | Full auth + GraphQL end-to-end test (returns user/account context) |
2595
+ | `connection_list` | Connection | No | — | List registered profiles with auth strategy and init status |
2596
+ | `connection_add` | Connection | No | — | Add a profile at runtime (CLI profile or explicit credentials) |
2597
+ | `connection_remove` | Connection | No | — | Remove a non-default profile |
2598
+ | `connection_switch` | Connection | No | — | Switch the default profile |
2599
+ | `event_build` | Events | No | — | Build event payload (no API call) |
2600
+ | `event_send` | Events | Yes | No | Send event (async/sync, supports dryRun) |
2601
+ | `event_get` | Events | Yes | Yes | Get single event by ID |
2602
+ | `event_list` | Events | Yes | Yes | List/filter events with pagination and optional analysis mode |
2603
+ | `event_flowInspect` | Events | Yes | Yes | One-call root-entity flow forensics with compact/full modes |
2604
+ | `metrics_query` | Metrics | Yes | Yes | Query Prometheus metrics (instant/range) |
2605
+ | `metrics_healthCheck` | Metrics | Yes | Yes | One-call anomaly assessment with Prometheus + Event API fallback |
2606
+ | `metrics_sloReport` | Metrics | Yes | Yes | SLO snapshot with rates, latency, and threshold findings |
2607
+ | `metrics_labelCatalog` | Metrics | Yes | Yes | Label discovery for a metric (live sampling + known hints) |
2608
+ | `metrics_metricCatalog` | Metrics | Yes | Yes | Documented Fluent metric families with labels, examples, live probing |
2609
+ | `metrics_planQuery` | Metrics | No | No | Generate validated PromQL for any documented metric family |
2610
+ | `metrics_snapshot` | Metrics | Yes | Yes | One-call dashboard snapshot for volume, failures, and latency |
2611
+ | `metrics_compare` | Metrics | Yes | Yes | Compare two adjacent windows for a metric and highlight deltas |
2612
+ | `time_resolveWindow` | Time | Yes | Yes | Resolve natural-language time phrases into exact `from` / `to` timestamps |
2613
+ | `metrics_mutationAudit` | Metrics | Yes | Yes | Audit GraphQL create/update mutation traffic by domain, subdomain, and operation |
2614
+ | `metrics_topEvents` | Metrics | Yes | Yes | Ranked event analytics using Event API aggregation |
2615
+ | `workflow_transitions` | Orchestration | Yes | Yes | Query available user actions/transitions at any entity state |
2616
+ | `plugin_list` | Orchestration | Yes | Yes | List registered rules with optional name filter |
2617
+ | `graphql_query` | GraphQL | Yes | Varies | Execute single-page query or mutation (retries for queries only) |
2618
+ | `graphql_queryAll` | GraphQL | Yes | Yes | Auto-paginated query — follows cursors across all pages |
2619
+ | `graphql_batchMutate` | GraphQL | Yes | No | Execute up to 50 aliased mutations in one request |
2620
+ | `graphql_introspect` | GraphQL | Yes | Yes | Schema introspection (types, mutations, queries) with force-refresh |
2621
+ | `graphql_listRoots` | GraphQL | Yes | Yes | List all query and mutation root fields from the live schema |
2622
+ | `graphql_planOperation` | GraphQL | Yes | Yes | Plan a query or mutation: required args, variables skeleton, selection template, execution guidance |
2623
+ | `graphql_buildQuery` | GraphQL | Yes | Varies | Generate query/mutation from structured inputs with optional validation |
2624
+ | `graphql_validate` | GraphQL | Yes | Yes | Validate a GraphQL document against the live schema |
2625
+ | `graphql_generateFull` | GraphQL | Yes | Yes | Generate maximal-selection query for a root field (depth-limited) |
2626
+ | `batch_create` | Batch | Yes | No | Create ingestion job |
2627
+ | `batch_describePayload` | Batch | No | — | Describe entity-type-specific payload shape and example rows for batch_send |
2628
+ | `batch_send` | Batch | Yes | No | Send records to job |
2629
+ | `batch_status` | Batch | Yes | Yes | Check job status |
2630
+ | `batch_batchStatus` | Batch | Yes | Yes | Check specific batch within a job |
2631
+ | `batch_results` | Batch | Yes | Yes | Get per-record job outcomes |
2632
+ | `webhook_validate` | Webhooks | No | — | Validate webhook payload + optional signature verification |
2633
+ | `entity_planCreate` | Entity | No | — | Plan an entity_create mutation locally with required fields, skeleton, and gotchas |
2634
+ | `entity_planUpdate` | Entity | No | — | Plan an entity_update mutation locally with updatable fields, skeleton, and guidance |
2635
+ | `entity_create` | Entity | Yes | No | Type-safe entity creation with field validation and gotcha knowledge (12 entity types) |
2636
+ | `entity_update` | Entity | Yes | No | Status-aware entity updates with optional transition validation |
2637
+ | `entity_get` | Entity | Yes | Yes | Unified entity lookup by ID or ref with optional edge inclusion |
2638
+ | `workflow_get` | Workflow Mgmt | Yes | Yes | Fetch specific workflow by entityType + entitySubtype via REST API |
2639
+ | `workflow_list` | Workflow Mgmt | Yes | Yes | List all workflows for a retailer (deduplicated to latest versions) |
2640
+ | `workflow_upload` | Workflow Mgmt | Yes | Yes | Deploy workflow JSON via REST API PUT (idempotent upsert) with structure validation and preflight safety analysis |
2641
+ | `workflow_diff` | Workflow Mgmt | No | — | Compare two workflows — rulesets, statuses, risk assessment, mermaid output |
2642
+ | `workflow_simulate` | Workflow Mgmt | No | — | Static prediction of event outcomes from workflow JSON |
2643
+ | `setting_get` | Settings | Yes | Yes | Fetch settings by name (wildcards supported), optionally save to local file |
2644
+ | `setting_upsert` | Settings | Yes | No | Create or update a setting with upsert semantics |
2645
+ | `setting_bulkUpsert` | Settings | Yes | No | Batch create/update up to 50 settings with per-setting error handling |
2646
+ | `environment_discover` | Environment | Yes | Yes | Full environment snapshot — retailer, locations, networks, catalogues, settings, modules |
2647
+ | `environment_validate` | Environment | Yes | Yes | Pre-flight validation checks: auth, retailer, locations, inventory, workflows |
2648
+ | `test_assert` | Test | Yes | Yes | Assert entity state with status, attribute, and edge assertions + polling mode |
2649
+ | `cache_status` | Cache | No | — | Show local cache statistics — entry count, size, hit/miss rate, per-category breakdown |
2650
+ | `cache_clear` | Cache | No | — | Clear cached entries by pattern or all — no API call, local filesystem only |
2651
2651