node-autotask 0.26.0 → 0.28.0

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.
Files changed (49) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/MCP_TOOL_CATALOG.json +941 -14
  3. package/MCP_TOOL_MANIFEST.md +71 -16
  4. package/N8N_MCP_MANIFEST.json +91 -10
  5. package/N8N_MCP_MANIFEST.md +14 -11
  6. package/README.md +11 -9
  7. package/capabilities.json +13623 -7738
  8. package/capabilities.schema.json +125 -0
  9. package/dist/capabilities.cjs +2 -2
  10. package/dist/capabilities.js +1 -1
  11. package/dist/{chunk-QXWIQ67O.js → chunk-6EQSXYRW.js} +13622 -7737
  12. package/dist/{chunk-HQGE4WAV.cjs → chunk-D5IVS6GY.cjs} +1054 -235
  13. package/dist/{chunk-5OGJTS2E.cjs → chunk-GUY2KK7U.cjs} +157 -136
  14. package/dist/{chunk-SSUECUVN.js → chunk-IRVZGW5K.js} +947 -128
  15. package/dist/{chunk-7DOSJS6S.js → chunk-O2D7KDDD.js} +23 -2
  16. package/dist/{chunk-VVQ6NJYZ.js → chunk-SYX6EWMT.js} +694 -76
  17. package/dist/{chunk-SG4LIVMG.cjs → chunk-WYKGD5UD.cjs} +1189 -571
  18. package/dist/{chunk-WM6E5O55.cjs → chunk-ZEGMVEF3.cjs} +13622 -7737
  19. package/dist/{index-CKYr0unq.d.cts → index-CORcZUNm.d.cts} +457 -50
  20. package/dist/{index-1zBdJIEy.d.cts → index-DQ9NgraW.d.cts} +281 -1
  21. package/dist/{index-1zBdJIEy.d.ts → index-DQ9NgraW.d.ts} +281 -1
  22. package/dist/{index-C8QH3BkP.d.ts → index-DXuV04zM.d.ts} +457 -50
  23. package/dist/index.cjs +44 -24
  24. package/dist/index.d.cts +11 -5
  25. package/dist/index.d.ts +11 -5
  26. package/dist/index.js +26 -6
  27. package/dist/operations/index.cjs +147 -120
  28. package/dist/operations/index.d.cts +136 -7
  29. package/dist/operations/index.d.ts +136 -7
  30. package/dist/operations/index.js +33 -6
  31. package/dist/pool.cjs +42 -9
  32. package/dist/pool.d.cts +14 -3
  33. package/dist/pool.d.ts +14 -3
  34. package/dist/pool.js +38 -5
  35. package/dist/resources/index.cjs +19 -5
  36. package/dist/resources/index.d.cts +2 -2
  37. package/dist/resources/index.d.ts +2 -2
  38. package/dist/resources/index.js +18 -4
  39. package/dist/types/index.cjs +1 -1
  40. package/dist/types/index.d.cts +1 -1
  41. package/dist/types/index.d.ts +1 -1
  42. package/dist/types/index.js +1 -1
  43. package/docs/API.md +246 -10
  44. package/examples/mcp/schemas.ts +16 -7
  45. package/package.json +1 -1
  46. /package/dist/{chunk-S643FDOR.cjs → chunk-IXF7AKOJ.cjs} +0 -0
  47. /package/dist/{chunk-2TWKEB2L.js → chunk-RMG55JTF.js} +0 -0
  48. /package/dist/{chunk-W3K5BEVY.cjs → chunk-SDYRQFGL.cjs} +0 -0
  49. /package/dist/{chunk-EBCHCNPK.js → chunk-WLTLB2ND.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  # N8N MCP Manifest — node-autotask (consumer projection)
2
2
 
3
- <!-- GENERATED by scripts/project-n8n-mcp.mjs at 2026-10-25T12:41:37.955Z — do not hand-edit. -->
3
+ <!-- GENERATED by scripts/project-n8n-mcp.mjs at 2026-10-26T07:54:09.279Z — do not hand-edit. -->
4
4
 
5
5
  The n8n CONSUMER projection of the capability registry: the canonical source for what the
6
6
  n8n-side MCP tools must expose. The SDK is canonical — this is a projection of it, never a
@@ -23,7 +23,7 @@ user's n8n instances; PROD is read-only for any verification).
23
23
 
24
24
  | tool | mode | entity | readOnlyHint | destructiveHint | idempotentHint | openWorldHint | operations |
25
25
  |------|------|--------|--------------|-----------------|----------------|---------------|------------|
26
- | `autotask_ticket` | read | ticket | true | false | true | true | 14 |
26
+ | `autotask_ticket` | read | ticket | true | false | true | true | 16 |
27
27
  | `autotask_ticket_write` | write | ticket | false | false | false | true | 4 |
28
28
  | `autotask_contact` | read | contact | true | false | true | true | 10 |
29
29
  | `autotask_contact_write` | write | contact | false | false | false | true | 4 |
@@ -36,16 +36,17 @@ user's n8n instances; PROD is read-only for any verification).
36
36
  | `autotask_resource` | read | resource | true | false | true | true | 9 |
37
37
  | `autotask_resource_write` | write | resource | false | false | false | true | 2 |
38
38
  | `autotask_timeEntry` | read | timeEntry | true | false | true | true | 24 |
39
- | `autotask_timeEntry_write` | write | timeEntry | false | false | false | true | 4 |
39
+ | `autotask_timeEntry_write` | write | timeEntry | false | false | false | true | 5 |
40
40
 
41
41
  ### `autotask_ticket` (read — ticket)
42
42
 
43
- > Read ticket records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for tickets: count: Count ticket records matching a JSON filter. | findByTicketNumber: Find a ticket by its ticketNumber. | fullContext: Get the full context of one ticket in a single call: the ticket, its company, contact, assigned resource and project, plus its notes, time entries, attachment metadata and (opt-in) histories — every part separately reported. | get: Get one Ticket by id. | getContext: Get a ticket with its primary context records in one call. | getEntityInfo: Get the Ticket capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Ticket field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getUdfInfo: Get the Ticket user-defined-field catalog. | query: Query Ticket records with a JSON filter. | resolve: Resolve a Ticket from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (title — exact match only). Returns the Ticket record with the numeric id for get/update/delete. Other identifier forms (e.g. an email address) are NOT tried by resolve — use the resource's dedicated lookup op where one exists (see autotask_catalog). | search: Search ticket records by text (a vendor contains filter on title only — the vendor exposes no free-text search and no matched-field reporting). | slaHealthCheck: Run the SLA health check for a ticket (numeric ticket id). | summary: Get a one-call summary of a ticket (numeric ticket id). | timeline: Get the event timeline of a ticket (numeric ticket id).. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Bounded: limit default 25, max 500. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.
43
+ > Read ticket records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for tickets: count: Count ticket records matching a JSON filter. | findByTicketNumber: Find a ticket by its ticketNumber. | forResource: List the tickets a resource is assigned to — as primary owner, as a secondary resource, or both — de-duplicated, with the four reconciling counts and an optional open-only filter that uses the tenant's own closed-status set. | fullContext: Get the full context of one ticket in a single call: the ticket, its company, contact, assigned resource and project, plus its notes, time entries, attachment metadata and (opt-in) histories — every part separately reported. | get: Get one Ticket by id. | getContext: Get a ticket with its primary context records in one call. | getEntityInfo: Get the Ticket capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Ticket field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getUdfInfo: Get the Ticket user-defined-field catalog. | query: Query Ticket records with a JSON filter. | resolve: Resolve a Ticket from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (title — exact match only). Returns the Ticket record with the numeric id for get/update/delete. Other identifier forms (e.g. an email address) are NOT tried by resolve — use the resource's dedicated lookup op where one exists (see autotask_catalog). | search: Search ticket records by text (a vendor contains filter on title only — the vendor exposes no free-text search and no matched-field reporting). | slaHealthCheck: Run the SLA health check for a ticket (numeric ticket id). | statusSemantics: Report the ticket status picklist and the ids this SDK treats as CLOSED for the caller's tenant, with the provenance of that set (read from the tenant's picklist, or the documented assumed fallback). | summary: Get a one-call summary of a ticket (numeric ticket id). | timeline: Get the event timeline of a ticket (numeric ticket id).. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Bounded: limit default 25, max 500. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.
44
44
 
45
45
  | backingOperation | verb | effect | flags | requiredArgs | purpose |
46
46
  |------------------|------|--------|-------|--------------|---------|
47
47
  | `tickets.count` | count | read | — | none | Count ticket records matching a JSON filter. |
48
48
  | `tickets.findByTicketNumber` | findByTicketNumber | read | — | value | Find a ticket by its ticketNumber. |
49
+ | `tickets.forResource` | forResource | read | — | resourceID | List the tickets a resource is assigned to — as primary owner, as a secondary resource, or both — de-duplicated, with the four reconciling counts and an optional open-only filter that uses the tenant's own closed-status set. |
49
50
  | `tickets.fullContext` | fullContext | read | — | id | Get the full context of one ticket in a single call: the ticket, its company, contact, assigned resource and project, plus its notes, time entries, attachment metadata and (opt-in) histories — every part separately reported. |
50
51
  | `tickets.get` | get | read | — | id | Get one Ticket by id. |
51
52
  | `tickets.getContext` | getContext | read | — | id | Get a ticket with its primary context records in one call. |
@@ -56,6 +57,7 @@ user's n8n instances; PROD is read-only for any verification).
56
57
  | `tickets.resolve` | resolve | read | — | identifier | Resolve a Ticket from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (title — exact match only). Returns the Ticket record with the numeric id for get/update/delete. Other identifier forms (e.g. an email address) are NOT tried by resolve — use the resource's dedicated lookup op where one exists (see autotask_catalog). |
57
58
  | `tickets.search` | search | read | — | query | Search ticket records by text (a vendor contains filter on title only — the vendor exposes no free-text search and no matched-field reporting). Bounded: limit default 25, max 500. |
58
59
  | `tickets.slaHealthCheck` | slaHealthCheck | read | — | id | Run the SLA health check for a ticket (numeric ticket id). |
60
+ | `tickets.statusSemantics` | statusSemantics | read | — | none | Report the ticket status picklist and the ids this SDK treats as CLOSED for the caller's tenant, with the provenance of that set (read from the tenant's picklist, or the documented assumed fallback). |
59
61
  | `tickets.summary` | summary | read | — | id | Get a one-call summary of a ticket (numeric ticket id). |
60
62
  | `tickets.timeline` | timeline | read | — | id | Get the event timeline of a ticket (numeric ticket id). |
61
63
 
@@ -245,12 +247,13 @@ Tool input: {"operation":{"type":"string","enum":["transferOwnership","update"]}
245
247
 
246
248
  ### `autotask_timeEntry_write` (write — timeEntry)
247
249
 
248
- > Write timeEntry records (mode: write — the registry operations with effect=write for time_entries: create, createForResource, createIfNotExists, update). Writes are dry-run first: dry_run defaults to true — the request is validated against the registry inputSchema and a DryRunResult envelope is returned; the mutating request is never issued unless the caller passes confirm (the n8n-side handler must force dry-run unless confirm is present, mirroring the SDK governor). Destructive operations are refused without the confirm flag — confirm must equal the operation key exactly (the deliberate act is the call). The n8n consumer surface excludes destructive operations by curation default (excludeDestructive); they remain available on the canonical SDK server (autotask_delete / per-op tools). By curation default (excludeDestructive) no destructive operation is included; destructive capability remains on the canonical SDK server surface. Per-operation required arguments: create [data]; createForResource [resourceID, params]; createIfNotExists [data]; update [id, data]. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.
250
+ > Write timeEntry records (mode: write — the registry operations with effect=write for time_entries: approve, create, createForResource, createIfNotExists, update). Writes are dry-run first: dry_run defaults to true — the request is validated against the registry inputSchema and a DryRunResult envelope is returned; the mutating request is never issued unless the caller passes confirm (the n8n-side handler must force dry-run unless confirm is present, mirroring the SDK governor). Destructive operations are refused without the confirm flag — confirm must equal the operation key exactly (the deliberate act is the call). The n8n consumer surface excludes destructive operations by curation default (excludeDestructive); they remain available on the canonical SDK server (autotask_delete / per-op tools). By curation default (excludeDestructive) no destructive operation is included; destructive capability remains on the canonical SDK server surface. Per-operation required arguments: approve [id]; create [data]; createForResource [resourceID, params]; createIfNotExists [data]; update [id, data]. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.
249
251
 
250
- Tool input: {"operation":{"type":"string","enum":["create","createForResource","createIfNotExists","update"]},"data":{"type":"object","ref":"time_entries body (see types)"},"resourceID":{"type":"number | string"},"params":{"type":"object — the smart-create params: { internallAllocationCodeID?: number (pin the internal linkage code), ticketID?: number, taskID?: number, roleID?: number (pin the task/ticket roleID — vendor-validated as an allocation code), dateWorked?: UTC YYYY-MM-DD, startDateTime?: UTC ISO, endDateTime?: UTC ISO, hoursWorked?: number, + any other vendor TimeEntry field } (exactly one linkage pin; none → the default internal linkage with the node-resolved code)"},"id":{"type":"number | string"},"dry_run":{"type":"boolean","default":true,"note":"true (the default) = the pinned DryRunResult envelope; the mutating request is never issued. The handler must force dry-run unless confirm is present."},"confirm":{"type":"string","note":"The operation key (e.g. \"tickets.create\") — its presence lifts the dry run. For destructive/approval-gated operations confirm must equal the operation key exactly; the call is refused pre-request without it."}} (required: operation)
252
+ Tool input: {"operation":{"type":"string","enum":["approve","create","createForResource","createIfNotExists","update"]},"id":{"type":"number | string"},"data":{"type":"object","ref":"time_entries body (see types)"},"resourceID":{"type":"number | string"},"params":{"type":"object — the smart-create params: { internallAllocationCodeID?: number (pin the internal linkage code), ticketID?: number, taskID?: number, roleID?: number (pin the task/ticket roleID — vendor-validated as an allocation code), dateWorked?: UTC YYYY-MM-DD, startDateTime?: UTC ISO, endDateTime?: UTC ISO, hoursWorked?: number, + any other vendor TimeEntry field } (exactly one linkage pin; none → the default internal linkage with the node-resolved code)"},"dry_run":{"type":"boolean","default":true,"note":"true (the default) = the pinned DryRunResult envelope; the mutating request is never issued. The handler must force dry-run unless confirm is present."},"confirm":{"type":"string","note":"The operation key (e.g. \"tickets.create\") — its presence lifts the dry run. For destructive/approval-gated operations confirm must equal the operation key exactly; the call is refused pre-request without it."}} (required: operation)
251
253
 
252
254
  | backingOperation | verb | effect | flags | requiredArgs | purpose |
253
255
  |------------------|------|--------|-------|--------------|---------|
256
+ | `time_entries.approve` | approve | write | — | id | Approve a time entry (the REST-only approval path): create the BillingItemApprovalLevels record, apply the vendor-documented follow-up update of BillingApprovalDateTime + BillingApprovalResourceID, then read the entry back and report whether the vendor accepted it. Dry-run first (dry_run). |
254
257
  | `time_entries.create` | create | write | — | data | Create a time entry. Dry-run first (dry_run). |
255
258
  | `time_entries.createForResource` | createForResource | write | — | resourceID, params | Create a time entry for a resource with the allocation-code dependency resolved by the node: it verifies the resource is active, honours the caller's linkage pin (else the default internal linkage), resolves an EXISTING active allocation code applicable to the resource (never creates one — the API user cannot), and posts the vendor-valid body. Dry-run first (dry_run). |
256
259
  | `time_entries.createIfNotExists` | createIfNotExists | write | — | data | Create a TimeEntry. Dry-run first (dry_run). |
@@ -271,19 +274,19 @@ only via a recorded change to `n8n-mcp.curation.json`.
271
274
 
272
275
  ## Stats
273
276
 
274
- - registryRecords: 1225
277
+ - registryRecords: 1277
275
278
  - curatedEntities: 7
276
279
  - includedEntities: 7
277
280
  - readTools: 7
278
281
  - writeTools: 7
279
282
  - totalTools: 14
280
- - readOperations: 85
281
- - writeOperations: 21
283
+ - readOperations: 87
284
+ - writeOperations: 22
282
285
  - approvalGatedWrites: 2
283
286
  - destructiveExcluded: 4
284
287
 
285
288
  ## Meta
286
289
 
287
- - generatedAt: 2026-10-25T12:41:37.955Z
288
- - capabilitiesHash: 670d40c8ba7a05acde7fa679e17c67d3a99a26d3ed07f934d219a5ec2c31cfab
290
+ - generatedAt: 2026-10-26T07:54:09.279Z
291
+ - capabilitiesHash: 246ea3a90022972a2a63bc2131ba631b47a664f7f2c000c4f08dc0b380d5ebfa
289
292
  - curationHash: e19117ce73e38d9aded3be7e7f077a4e185d2e10294622b76c17d67f63cf9e3b
package/README.md CHANGED
@@ -4,7 +4,7 @@ Fully-typed TypeScript SDK for the Autotask (Datto) PSA REST API. Zero runtime
4
4
  dependencies. Built for building MCP servers and integrations.
5
5
 
6
6
  The SDK is also the **deterministic execution layer for agents** (ARCHITECTURE
7
- section 19): a generated capability registry (1214 operations across the 121-entity
7
+ section 19): a generated capability registry (1275 operations across the 121-entity
8
8
  MVP set), a mechanical MCP substrate (registry → manifest → overrides → core tier +
9
9
  catalog meta-tool), and a write governor (dry-run-first, destructive
10
10
  confirmation). The SDK boundary also redacts response field values — the
@@ -288,7 +288,9 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
288
288
  destructive ones; the plan-derived `untrustedFields` read tools additionally
289
289
  carry the untrusted-content sentence + the field list as the `x-untrusted`
290
290
  output-schema extension (issue #1 — externally-sourced free text is
291
- marker-wrapped in the projection; the SDK primitives stay raw).
291
+ marker-wrapped in the projection; the SDK primitives stay raw); the
292
+ cross-resource tools carry `["*"]` rather than the union (the per-resource
293
+ lists are the authority, and the served surface has a hard token budget).
292
294
  3. **Overrides** — [`MCP_TOOL_OVERRIDES.json`](./MCP_TOOL_OVERRIDES.json): the ONLY
293
295
  place a curation delta may live (`{ tool, field, newValue, reason }`); silent
294
296
  divergence between projection and curation is a defect; the delta file is reviewed
@@ -344,10 +346,10 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
344
346
  governor place: `src/operations/invoke.ts`).
345
347
 
346
348
  **Harness approval policy (recommended).** Require approval on every tool
347
- whose MCP annotation is `readOnlyHint !== true` — today exactly **256
348
- tools**: the 254 dedicated write/delete tools (198 `effect=write` + 56
349
+ whose MCP annotation is `readOnlyHint !== true` — today exactly **267
350
+ tools**: the 265 dedicated write/delete tools (209 `effect=write` + 56
349
351
  `effect=destructive`, every one of them has a dedicated tool) +
350
- `autotask_write` + `autotask_delete`. The remaining **608 tools** (the 595
352
+ `autotask_write` + `autotask_delete`. The remaining **631 tools** (the 618
351
353
  dedicated read tools + the 10 core read tools + `autotask_read` +
352
354
  `autotask_catalog` + `autotask_describe`) all carry `readOnlyHint: true`
353
355
  and are safe ungated: every op they can route is `effect=read` (zero
@@ -359,7 +361,7 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
359
361
  `contacts.moveToCompany`, `resources.transferOwnership`) require the same
360
362
  confirm inside `autotask_write`. Migration: `autotask_invoke` is REPLACED
361
363
  by `autotask_read`/`autotask_write`/`autotask_delete` — update harness
362
- config (approve the 256 above) and remove any `autotask_invoke` entry. The
364
+ config (approve the 267 above) and remove any `autotask_invoke` entry. The
363
365
  rule is derivable from the registry `effect` column (and the mode tools'
364
366
  fixed annotations) — it never needs a hand-maintained name list.
365
367
 
@@ -413,7 +415,7 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
413
415
  source.
414
416
 
415
417
  7. **Agent QoL surface (the stage-12 issue wave, live-verified on ww29)** —
416
- the zero-wire planning reads `operations.blindSurfaces` (the 116-surface
418
+ the zero-wire planning reads `operations.blindSurfaces` (the 124-surface
417
419
  blind/data inventory) and `operations.createGuidance` (per-child zone
418
420
  facts with verbatim vendor evidence), the bounded live
419
421
  `operations.probeReachability` sweep (confirm-gated, over-cap refuses),
@@ -453,7 +455,7 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
453
455
  ## Partial-update merge (collectionUpdate resources)
454
456
 
455
457
  The vendor's top-level **collection PUT** validates the **FULL model**: a partial body is
456
- rejected with a 500 `Missing Required Field`. This applies to the **40 top-level update ops**
458
+ rejected with a 500 `Missing Required Field`. This applies to the **45 top-level update ops**
457
459
  whose spec defines no item-path write (the `collectionUpdate` class — the flag is derived from
458
460
  `api-docs.json` by the shared `scripts/lib/collection-update.mjs`, stamped into both the
459
461
  generated resource config and the registry record's `metadata.collectionUpdate`, and pinned by
@@ -519,7 +521,7 @@ node-parity paths the vendored swagger lacks, all UNVERIFIED-live this run), and
519
521
  | `npm run capabilities:check` | `scripts/check-capabilities.mjs` — the batch gate (missing/incomplete/stale records → exit 1) |
520
522
  | `npm run public-surface` | `scripts/public-surface.mjs` — capture (`--write`) / verify the public API surface baseline; default mode fails on unannounced removals, **and** checks the BUILT surface: every tsup entry has a matching `exports` key (and vice versa), every declared target was emitted and loads (ESM+CJS), and no runtime dependency leaks into `dist` |
521
523
  | `npm run live-smoke` | `scripts/live-smoke.mjs` — read-only live smoke: 5 vendor probes (5-6 wire calls worst case: 4 GET + 1 bounded query that may walk a 2nd, empty page) + a zero-network shape guard; `--dry` prints the plan with no calls (DRY-RUN-ONLY verdict, exit 0); live via `AUTOTASK_*` env — missing/partial credentials hard-fail exit 2 |
522
- | `npm run live-coverage` | `scripts/live-coverage.mjs` — the live coverage sweep over all 1217 registry ops (`--dry`: full call plan, no calls; live: bounded reads for real, mutations `dryRun: true` only — zero mutating requests, every governor-gated row (the 54 delete dry-runs included) routed through invoke with `confirm`; budget <= 1161 plan-honest / <= 1315 wire-honest worst case) |
524
+ | `npm run live-coverage` | `scripts/live-coverage.mjs` — the live coverage sweep over all 1275 registry ops (`--dry`: full call plan, no calls; live: bounded reads for real, mutations `dryRun: true` only — zero mutating requests, every governor-gated row (the 54 delete dry-runs included) routed through invoke with `confirm`; budget <= 1161 plan-honest / <= 1315 wire-honest worst case) |
523
525
  | `npm run mcp:project` | `scripts/project-mcp-tools.mjs` — mechanical MCP projection → `MCP_TOOL_MANIFEST.md` (`:check` verifies) |
524
526
  | `npm run n8n:project` / `n8n:project:check` | `scripts/project-n8n-mcp.mjs` — the n8n consumer projection from the SAME registry → `N8N_MCP_MANIFEST.json`/`.md` (`--check` rebuilds and diffs; the gate is wired into `verify`) |
525
527
  | `npm run catalog:build` / `catalog:check` | `scripts/build-tool-catalog.mjs` — the catalog meta-tool row data → `MCP_TOOL_CATALOG.json` + mechanical CORE profile (`--check` verifies drift) |