node-autotask 0.43.0 → 0.44.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 (53) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/MCP_TOOL_CATALOG.json +27 -8
  3. package/MCP_TOOL_MANIFEST.md +138 -137
  4. package/N8N_MCP_MANIFEST.json +17 -17
  5. package/N8N_MCP_MANIFEST.md +18 -18
  6. package/README.md +6 -19
  7. package/capabilities.json +1815 -1432
  8. package/dist/{base-CVx2VMSj.d.cts → base-CftidiyZ.d.cts} +2 -1
  9. package/dist/{base-CVx2VMSj.d.ts → base-CftidiyZ.d.ts} +2 -1
  10. package/dist/capabilities.cjs +2 -2
  11. package/dist/capabilities.d.cts +2 -1
  12. package/dist/capabilities.d.ts +2 -1
  13. package/dist/capabilities.js +1 -1
  14. package/dist/{chunk-TH7B5H4P.cjs → chunk-6WLGHKIU.cjs} +285 -285
  15. package/dist/{chunk-KTEDPS4X.js → chunk-7MCKJTSA.js} +2 -2
  16. package/dist/{chunk-5VHSLJMR.js → chunk-A6LHCJQP.js} +30 -9
  17. package/dist/{chunk-4EFXIE53.js → chunk-BKTOMNT2.js} +2 -2
  18. package/dist/{chunk-VFLAMMIJ.cjs → chunk-EMYDC5SG.cjs} +151 -120
  19. package/dist/{chunk-SK3GYRNA.cjs → chunk-KWQSGWY5.cjs} +143 -143
  20. package/dist/{chunk-Q23JULNN.js → chunk-LYI5FRPX.js} +55 -24
  21. package/dist/{chunk-JY2BWYXY.js → chunk-N6IWPGHB.js} +1814 -1431
  22. package/dist/{chunk-5BDUMDAQ.cjs → chunk-PH3ESYAF.cjs} +1814 -1431
  23. package/dist/{chunk-MJTKK3QG.cjs → chunk-SN4BMQ2N.cjs} +31 -10
  24. package/dist/{index-C7rMJ4IV.d.ts → index-D8FtzUGP.d.ts} +54 -41
  25. package/dist/{index-C3KFMnRT.d.cts → index-DgBA1JMH.d.cts} +131 -130
  26. package/dist/{index-C3KFMnRT.d.ts → index-DgBA1JMH.d.ts} +131 -130
  27. package/dist/{index-Cm_Xpt7X.d.cts → index-YbEk0awP.d.cts} +54 -41
  28. package/dist/index.cjs +23 -23
  29. package/dist/index.d.cts +8 -7
  30. package/dist/index.d.ts +8 -7
  31. package/dist/index.js +5 -5
  32. package/dist/operations/index.cjs +337 -244
  33. package/dist/operations/index.d.cts +53 -45
  34. package/dist/operations/index.d.ts +53 -45
  35. package/dist/operations/index.js +121 -28
  36. package/dist/pool.cjs +9 -9
  37. package/dist/pool.d.cts +4 -3
  38. package/dist/pool.d.ts +4 -3
  39. package/dist/pool.js +5 -5
  40. package/dist/resources/index.cjs +5 -5
  41. package/dist/resources/index.d.cts +2 -2
  42. package/dist/resources/index.d.ts +2 -2
  43. package/dist/resources/index.js +4 -4
  44. package/dist/types/index.d.cts +1 -1
  45. package/dist/types/index.d.ts +1 -1
  46. package/dist/untrusted.cjs +2 -2
  47. package/dist/untrusted.d.cts +14 -5
  48. package/dist/untrusted.d.ts +14 -5
  49. package/dist/untrusted.js +1 -1
  50. package/docs/API.md +126 -37
  51. package/examples/mcp/schemas.ts +2 -0
  52. package/examples/mcp/tools-read.ts +3 -2
  53. package/package.json +10 -9
package/CHANGELOG.md CHANGED
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.44.0] - 2026-11-01
11
+
12
+ The capability plan changed (staff resolution and read-contract updates), so this release needs a minor bump.
13
+
14
+ ### Breaking
15
+
16
+ - **#350:** explicit `walk.maxRows` replaces the ordinary total cap instead of taking its minimum: `{ limit: 100, walk: { maxRows: 2500 } }` can return 2500 rows. Direct explicit walks now honor `names` and client `labels`; pass `names: false` for raw rows. Ordinary bounded query and latest behavior are unchanged.
17
+ - **#351:** self-prefixed dotted UDFs are now refused rather than rewritten to a different tenant field. Use the literal undotted UDF name.
18
+ - **#353:** `operations.resolveAny({ match: 'auto' })` now completes every exact lookup before falling back to the existing bounded cross-resource search. Only clean misses everywhere allow contains matching; exact hits, ambiguity, truncation and faults block fallback. The result identifies `matched: 'exact' | 'contains'` and carries the contains-search payload when used; `limit` is an integer 1..500 and can only narrow the configured resolution scan cap (at most 500); malformed limits refuse before lookup requests. The default exact-only behavior is unchanged.
19
+ - **#354:** untrusted projection now fences nested UDF values and named string arrays, bounds deep/cyclic input and safely copies prototype-like keys. Hosts retain unsafe-character cleaning, length caps and provenance for formatted output; projection does not grant vendor strings any formatting exemption. An unstamped result containing UDF values can now return a projected copy instead of its original reference.
20
+
21
+ ### Added
22
+
23
+ - **#353:** `operations.resolveStaff` resolves staff by id, email, username or full name. Text lookups require active staff and exclude API users identified by tenant labels unless opted in; numeric id lookups bypass those filters. Candidate limits, truncation and metadata availability are explicit. Text records honor the client’s existing `labels` setting, preserving expanded staff label siblings; projection fences both licenseTypeLabel and userTypeLabel. Numeric-id misses propagate NOT_FOUND; text misses return an empty matches list.
24
+
25
+ ### Fixed
26
+
27
+ - **#350:** query `walk.maxRows` is the total returned-row cap, independently of the ordinary `limit`/page-size bound, so export-sized walks can return up to the requested total. Scope checks estimate the actual walk, and truncation remains true while a cursor or unserved rows remain. Explicit walks preserve the iterator’s per-vendor-page label budgets and avoid a second labeling pass; ordinary invoked queries keep their per-call budget.
28
+ - **#351:** dotted UDF names, including self-prefixed aliases, are refused before metadata or vendor requests, preserving literal tenant UDF identity.
29
+ - **#352:** self-resource prefixes are normalized consistently in query projection and aggregate group/sum fields, preserving date buckets and parent relations without mutating caller options.
30
+
10
31
  ## [0.43.0] - 2026-10-31
11
32
 
12
33
  ### Changed
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "generatedBy": "scripts/build-tool-catalog.mjs",
3
- "generatedAt": "2026-10-31T20:17:42.030Z",
4
- "planHash": "5c18b378722a038159564faccee795e7c278f048f30c77d77b5dc27e83ea2dee",
3
+ "generatedAt": "2026-11-01T01:23:13.336Z",
4
+ "planHash": "f2b02eb792fd6e2934afab0a48b1c2e338bf741080d15550512c2db5091f4bc5",
5
5
  "metaTools": [
6
6
  {
7
7
  "name": "autotask_catalog",
@@ -51,7 +51,7 @@
51
51
  {
52
52
  "name": "autotask_read",
53
53
  "title": "Read One Registry Operation (read mode)",
54
- "description": "Route an effect=read registry operation by its exact name (never fuzzy, never a tool name): the 384 field/entity/UDF-info reads (getEntityInfo/getFieldInfo/getUdfInfo) have no dedicated tool and ride this one, and any read op is routable. For field discovery use operations.fieldCatalog (compact) instead of per-resource getFieldInfo (full dump). Read-only by construction — every op it can route is effect=read (zero mutating requests), and a write or delete op is refused BEFORE any request (cross-mode refusal; the message names the correct tool). Reads have no dry run (a read with dry_run: true is refused). Harness approval policy: approve every tool with readOnlyHint !== true (exactly 267 today); the 635 readOnlyHint: true tools — including this one — are safe ungated; the 57 destructiveHint: true tools (56 dedicated delete tools + autotask_delete) require confirm === the operation key. Migration: autotask_invoke is REPLACED by autotask_read/autotask_write/autotask_delete — update harness config. For query/count ops args[0] is a params object (filter/limit); call autotask_describe first for the exact arg shape and filter grammar. The argument set is CLOSED at the top level: an unknown argument is refused before any request, with a typed error naming the key and the valid keys.",
54
+ "description": "Route an effect=read registry operation by its exact name (never fuzzy, never a tool name): the 384 field/entity/UDF-info reads (getEntityInfo/getFieldInfo/getUdfInfo) have no dedicated tool and ride this one, and any read op is routable. For field discovery use operations.fieldCatalog (compact) instead of per-resource getFieldInfo (full dump). Read-only by construction — every op it can route is effect=read (zero mutating requests), and a write or delete op is refused BEFORE any request (cross-mode refusal; the message names the correct tool). Reads have no dry run (a read with dry_run: true is refused). Harness approval policy: approve every tool with readOnlyHint !== true (exactly 267 today); the 636 readOnlyHint: true tools — including this one — are safe ungated; the 57 destructiveHint: true tools (56 dedicated delete tools + autotask_delete) require confirm === the operation key. Migration: autotask_invoke is REPLACED by autotask_read/autotask_write/autotask_delete — update harness config. For query/count ops args[0] is a params object (filter/limit); call autotask_describe first for the exact arg shape and filter grammar. The argument set is CLOSED at the top level: an unknown argument is refused before any request, with a typed error naming the key and the valid keys.",
55
55
  "input": {
56
56
  "operation": {
57
57
  "type": "string",
@@ -71,7 +71,7 @@
71
71
  {
72
72
  "name": "autotask_write",
73
73
  "title": "Write One Registry Operation (write mode)",
74
- "description": "Route an effect=write registry operation by its exact name (never fuzzy, never a tool name), dry-run-first: the first call always travels dry_run: true (the pinned DryRunResult envelope, simulated: true — the mutating request is never issued); pass dry_run: false to apply. A read or delete op is refused BEFORE any request (cross-mode refusal; the message names the correct tool). The 3 approval-gated writes (configuration_items.moveConfigurationItem, contacts.moveToCompany, resources.transferOwnership) additionally require confirm === the operation key, in BOTH dry-run and apply mode. Harness approval policy: this tool is one of the 267 tools that require approval (readOnlyHint !== true); the 635 readOnlyHint: true tools are safe ungated, and the 57 destructiveHint: true tools (56 dedicated delete tools + autotask_delete) require confirm === the operation key. Migration: autotask_invoke is REPLACED by autotask_read/autotask_write/autotask_delete — update harness config. For query/count ops args[0] is a params object (filter/limit); call autotask_describe first for the exact arg shape and filter grammar. The argument set is CLOSED at the top level: an unknown argument is refused before any request, with a typed error naming the key and the valid keys.",
74
+ "description": "Route an effect=write registry operation by its exact name (never fuzzy, never a tool name), dry-run-first: the first call always travels dry_run: true (the pinned DryRunResult envelope, simulated: true — the mutating request is never issued); pass dry_run: false to apply. A read or delete op is refused BEFORE any request (cross-mode refusal; the message names the correct tool). The 3 approval-gated writes (configuration_items.moveConfigurationItem, contacts.moveToCompany, resources.transferOwnership) additionally require confirm === the operation key, in BOTH dry-run and apply mode. Harness approval policy: this tool is one of the 267 tools that require approval (readOnlyHint !== true); the 636 readOnlyHint: true tools are safe ungated, and the 57 destructiveHint: true tools (56 dedicated delete tools + autotask_delete) require confirm === the operation key. Migration: autotask_invoke is REPLACED by autotask_read/autotask_write/autotask_delete — update harness config. For query/count ops args[0] is a params object (filter/limit); call autotask_describe first for the exact arg shape and filter grammar. The argument set is CLOSED at the top level: an unknown argument is refused before any request, with a typed error naming the key and the valid keys.",
75
75
  "input": {
76
76
  "operation": {
77
77
  "type": "string",
@@ -101,7 +101,7 @@
101
101
  {
102
102
  "name": "autotask_delete",
103
103
  "title": "Delete One Registry Operation (delete mode)",
104
- "description": "Route an effect=destructive (delete) registry operation by its exact name (never fuzzy, never a tool name), dry-run-first: the first call always travels dry_run: true (the pinned DryRunResult envelope, simulated: true); pass dry_run: false to apply. confirm === the operation key is REQUIRED for every delete (all 56), in BOTH dry-run and apply mode — the deliberate act is the call, not the delete. A read or write op is refused BEFORE any request (cross-mode refusal; the message names the correct tool). Harness approval policy: this tool is one of the 57 destructiveHint: true tools that require approval + confirm; approve every tool with readOnlyHint !== true (exactly 267 today); the 635 readOnlyHint: true tools are safe ungated. Migration: autotask_invoke is REPLACED by autotask_read/autotask_write/autotask_delete — update harness config. The argument set is CLOSED at the top level: an unknown argument is refused before any request, with a typed error naming the key and the valid keys.",
104
+ "description": "Route an effect=destructive (delete) registry operation by its exact name (never fuzzy, never a tool name), dry-run-first: the first call always travels dry_run: true (the pinned DryRunResult envelope, simulated: true); pass dry_run: false to apply. confirm === the operation key is REQUIRED for every delete (all 56), in BOTH dry-run and apply mode — the deliberate act is the call, not the delete. A read or write op is refused BEFORE any request (cross-mode refusal; the message names the correct tool). Harness approval policy: this tool is one of the 57 destructiveHint: true tools that require approval + confirm; approve every tool with readOnlyHint !== true (exactly 267 today); the 636 readOnlyHint: true tools are safe ungated. Migration: autotask_invoke is REPLACED by autotask_read/autotask_write/autotask_delete — update harness config. The argument set is CLOSED at the top level: an unknown argument is refused before any request, with a typed error naming the key and the valid keys.",
105
105
  "input": {
106
106
  "operation": {
107
107
  "type": "string",
@@ -23511,6 +23511,25 @@
23511
23511
  "reachReason": null,
23512
23512
  "boundedAlternative": null
23513
23513
  },
23514
+ {
23515
+ "operation": "operations.resolveStaff",
23516
+ "core": false,
23517
+ "tool": "autotask_resolve_staff",
23518
+ "purpose": "Resolve staff with tenant-labelled API-user exclusions and honest metadata state.",
23519
+ "preferredWhen": "Resolve an owner or technician by email, username or name; use numeric id for an exact Resource fetch regardless of active/licence status.",
23520
+ "backingOperation": "operations.resolveStaff",
23521
+ "effect": "read",
23522
+ "dryRunFirst": false,
23523
+ "confirm": false,
23524
+ "requiredArgs": [
23525
+ "identifier"
23526
+ ],
23527
+ "tier": "extended",
23528
+ "reachable": true,
23529
+ "reach": "dedicated tool",
23530
+ "reachReason": null,
23531
+ "boundedAlternative": null
23532
+ },
23514
23533
  {
23515
23534
  "operation": "operations.revenueRollup",
23516
23535
  "core": false,
@@ -23588,10 +23607,10 @@
23588
23607
  }
23589
23608
  ],
23590
23609
  "counts": {
23591
- "registryOperations": 1281,
23610
+ "registryOperations": 1282,
23592
23611
  "coreOperations": 10,
23593
- "catalogRows": 1281,
23594
- "withTool": 897,
23612
+ "catalogRows": 1282,
23613
+ "withTool": 898,
23595
23614
  "readModeOnly": 384,
23596
23615
  "neverExposed": 0,
23597
23616
  "metaTools": 5