node-autotask 0.43.0 → 0.45.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 (57) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/MCP_TOOL_CATALOG.json +156 -1253
  3. package/MCP_TOOL_MANIFEST.md +154 -220
  4. package/MCP_TOOL_OVERRIDES.json +8 -62
  5. package/N8N_MCP_MANIFEST.json +128 -705
  6. package/N8N_MCP_MANIFEST.md +43 -63
  7. package/README.md +10 -28
  8. package/capabilities.json +15315 -22219
  9. package/dist/{base-CVx2VMSj.d.cts → base-BVoYDlVA.d.cts} +2 -1
  10. package/dist/{base-CVx2VMSj.d.ts → base-BVoYDlVA.d.ts} +2 -1
  11. package/dist/capabilities.cjs +2 -2
  12. package/dist/capabilities.d.cts +2 -1
  13. package/dist/capabilities.d.ts +2 -1
  14. package/dist/capabilities.js +1 -1
  15. package/dist/{chunk-5VHSLJMR.js → chunk-A6LHCJQP.js} +30 -9
  16. package/dist/{chunk-JY2BWYXY.js → chunk-ASMCTZO2.js} +15314 -22218
  17. package/dist/{chunk-TH7B5H4P.cjs → chunk-DC3PY4EF.cjs} +1839 -1407
  18. package/dist/{chunk-4EFXIE53.js → chunk-DXKXQHCX.js} +5 -5
  19. package/dist/{chunk-SK3GYRNA.cjs → chunk-JO6WI763.cjs} +143 -143
  20. package/dist/{chunk-Q23JULNN.js → chunk-NSW7JPVS.js} +11529 -13319
  21. package/dist/{chunk-KTEDPS4X.js → chunk-O4PIPUS4.js} +1583 -1151
  22. package/dist/{chunk-MJTKK3QG.cjs → chunk-SN4BMQ2N.cjs} +31 -10
  23. package/dist/{chunk-5BDUMDAQ.cjs → chunk-VXVYFJH3.cjs} +15314 -22218
  24. package/dist/{chunk-VFLAMMIJ.cjs → chunk-YMBVKVK4.cjs} +10604 -12394
  25. package/dist/{index-C7rMJ4IV.d.ts → index-C5g1H_hF.d.ts} +1080 -1288
  26. package/dist/{index-Cm_Xpt7X.d.cts → index-Db0SNnQn.d.cts} +1080 -1288
  27. package/dist/{index-C3KFMnRT.d.cts → index-c549LvOb.d.cts} +332 -331
  28. package/dist/{index-C3KFMnRT.d.ts → index-c549LvOb.d.ts} +332 -331
  29. package/dist/index.cjs +23 -23
  30. package/dist/index.d.cts +15 -41
  31. package/dist/index.d.ts +15 -41
  32. package/dist/index.js +8 -8
  33. package/dist/operations/index.cjs +5 -2234
  34. package/dist/operations/index.d.cts +51 -323
  35. package/dist/operations/index.d.ts +51 -323
  36. package/dist/operations/index.js +30 -2259
  37. package/dist/pool.cjs +9 -9
  38. package/dist/pool.d.cts +4 -3
  39. package/dist/pool.d.ts +4 -3
  40. package/dist/pool.js +5 -5
  41. package/dist/resources/index.cjs +5 -5
  42. package/dist/resources/index.d.cts +2 -2
  43. package/dist/resources/index.d.ts +2 -2
  44. package/dist/resources/index.js +8 -8
  45. package/dist/types/index.d.cts +1 -1
  46. package/dist/types/index.d.ts +1 -1
  47. package/dist/untrusted.cjs +2 -2
  48. package/dist/untrusted.d.cts +14 -5
  49. package/dist/untrusted.d.ts +14 -5
  50. package/dist/untrusted.js +1 -1
  51. package/docs/API.md +321 -334
  52. package/docs/LIVE-TESTING.md +4 -6
  53. package/docs/N8N-ADAPTER.md +26 -26
  54. package/examples/mcp/schemas.ts +2 -0
  55. package/examples/mcp/tools-read.ts +3 -2
  56. package/n8n-mcp.curation.json +3 -3
  57. package/package.json +10 -9
@@ -137,18 +137,16 @@ DRY-RUN-ONLY verdict (the only no-credentials path, exit 0).
137
137
  Full-sweep budget (worst case, every table non-empty — the machine-readable
138
138
  number is the report's `budget` block): PLAN-HONEST 1016 bounded op calls
139
139
  (every read/helper row = at most ONE bounded call — reads use
140
- `queryBounded` limit 2, a TOTAL cap; the served-artifact rows —
141
- operations.blindSurfaces (issue #11), operations.createGuidance (issue
142
- #12) — plan the op call at ZERO wire, but still count as one op call in
140
+ `queryBounded` limit 2, a TOTAL cap; the served-artifact row —
141
+ operations.createGuidance (issue #12) — plans the op call at ZERO wire,
142
+ but still counts as one op call in
143
143
  this number: the budget counts ROW calls, not raw wire, so the 1016 is the
144
144
  conservative row-based figure)
145
145
  + <=82 best-effort update diff GETs
146
146
  + <=129 cached limit-1 id reads (one per resource; the parent chain shares
147
147
  the cache) = <= 1227. WIRE-HONEST: the dry-run verification reads ride on
148
148
  top — 54 delete current-record GETs + 63 scoped-create parent-verify GETs
149
- + 20 getContext part GETs + <=18 special-op reads (incl. the issue #9
150
- `operations.recovery` dry-run find — ONE bounded query, zero mutating
151
- wire) = <=155 — so the worst case is <= 1382 raw wire requests. The 1600
149
+ + 20 getContext part GETs + <=18 special-op reads = <=155 — so the worst case is <= 1382 raw wire requests. The 1600
152
150
  --max-calls cap bounds the row-based plan (actualCalls <= 1227); the wire
153
151
  count cannot exceed plan + the stated verification set (and 1382 is far
154
152
  under the API's 10k req/hour). ZERO mutating requests: every mutation travels
@@ -36,12 +36,12 @@ Two sources in, markdown table out: the node repo (the ops column is re-derived
36
36
  |----------|-----------|---------------|---------------------------|------------------|----------------------------------|
37
37
  | `appointments` | Appointment | no | create, delete, get, getMany, update, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
38
38
  | `billingCodes` | BillingCode | no | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search |
39
- | `billingItems` | BillingItems | no | update, get, getMany, count | — | count, customRange, get, getEntityInfo, getFieldInfo, getUdfInfo, last14, last24h, last30, last7, last90, lastFullFortnight, lastFullMonth, lastFullQuarter, lastFullWeek, query, resolve, today, update, yesterday |
40
- | `changeRequestLinks` | ChangeRequestLink | no | create, createIfNotExists, delete, get, getMany, count | createIfNotExists → `change_request_links.createIfNotExists` | count, create, createIfNotExists, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
39
+ | `billingItems` | BillingItems | no | update, get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
40
+ | `changeRequestLinks` | ChangeRequestLink | no | create, createIfNotExists, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
41
41
  | `checklistLibraries` | ChecklistLibrary | no | create, update, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
42
42
  | `checklistLibraryChecklistItems` | ChecklistLibraryChecklistItem | yes | create, update, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
43
43
  | `classificationIcons` | ClassificationIcon | no | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search |
44
- | `companies` | Company | no | create, update, get, getMany, count, searchByIdentity, searchByDomain | searchByDomain → `companies.searchByDomain`; searchByIdentity → `companies.searchByIdentity` | count, create, fullProfile, get, getContext, getEntityInfo, getFieldInfo, getUdfInfo, prepareCrmWrite, query, resolve, search, searchByDomain, searchByIdentity, unbilledWork, update, upsertByName |
44
+ | `companies` | Company | no | create, update, get, getMany, count, searchByIdentity, searchByDomain | searchByDomain → `companies.searchByDomain`; searchByIdentity → `companies.searchByIdentity` | count, create, fullProfile, get, getContext, getEntityInfo, getFieldInfo, getUdfInfo, prepareCrmWrite, query, resolve, search, searchByDomain, searchByIdentity, unbilledWork, update |
45
45
  | `companyAlerts` | CompanyAlert | yes | create, update, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
46
46
  | `companyLocations` | CompanyLocation | yes | create, get, getMany, update, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
47
47
  | `companyNotes` | CompanyNote | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
@@ -56,15 +56,15 @@ Two sources in, markdown table out: the node repo (the ops column is re-derived
56
56
  | `configurationItemSslSubjectAlternativeNames` | ConfigurationItemSslSubjectAlternativeName | yes | update, get, getMany, delete, count | — | count, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
57
57
  | `configurationItemTypes` | ConfigurationItemType | no | create, update, get, getMany, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
58
58
  | `configurationItemWebhooks` | ConfigurationItemWebhook | yes | get, getMany, delete | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
59
- | `configurationItems` | ConfigurationItem | no | create, update, get, getMany, count, moveConfigurationItem, createIfNotExists | createIfNotExists → `configuration_items.createIfNotExists`; moveConfigurationItem → `configuration_items.moveConfigurationItem` | count, create, createIfNotExists, findBySerial, get, getContext, getEntityInfo, getFieldInfo, getUdfInfo, moveConfigurationItem, profile, query, resolve, search, update |
59
+ | `configurationItems` | ConfigurationItem | no | create, update, get, getMany, count, moveConfigurationItem, createIfNotExists | moveConfigurationItem → `configuration_items.moveConfigurationItem` | count, create, findBySerial, get, getContext, getEntityInfo, getFieldInfo, getUdfInfo, moveConfigurationItem, profile, query, resolve, search, update |
60
60
  | `contactGroupContacts` | ContactGroupContacts | no | create, get, getMany, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
61
61
  | `contactGroups` | ContactGroups | no | create, update, get, getMany, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
62
62
  | `contactWebhooks` | ContactWebhook | yes | get, getMany, delete | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
63
- | `contacts` | Contact | yes | create, get, getMany, update, count, delete, moveToCompany | moveToCompany → `contacts.moveToCompany` | count, create, delete, findByEmail, get, getContext, getEntityInfo, getFieldInfo, getUdfInfo, moveToCompany, query, resolve, search, update, upsertByEmail |
63
+ | `contacts` | Contact | yes | create, get, getMany, update, count, delete, moveToCompany | moveToCompany → `contacts.moveToCompany` | count, create, delete, findByEmail, fullProfile, get, getContext, getEntityInfo, getFieldInfo, getUdfInfo, moveToCompany, query, resolve, search, update |
64
64
  | `contractBillingRules` | ContractBillingRule | yes | create, update, get, getMany, count, delete | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
65
65
  | `contractBlockHourFactors` | ContractBlockHourFactor | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
66
66
  | `contractBlocks` | ContractBlock | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
67
- | `contractCharges` | ContractCharge | yes | create, createIfNotExists, update, delete, get, getMany, count | createIfNotExists → `contract_charges.createIfNotExists` | count, create, createIfNotExists, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
67
+ | `contractCharges` | ContractCharge | yes | create, createIfNotExists, update, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
68
68
  | `contractExclusionBillingCodes` | ContractExclusionBillingCode | yes | create, get, getMany, count, delete | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
69
69
  | `contractExclusionRoles` | ContractExclusionRoles | yes | create, get, getMany, count, delete | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
70
70
  | `contractExclusionSetExcludedRoles` | ContractExclusionSetExcludedRoles | yes | create, get, getMany, count, delete | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
@@ -80,25 +80,25 @@ Two sources in, markdown table out: the node repo (the ops column is re-derived
80
80
  | `contractServiceBundleUnits` | ContractServiceBundleUnit | yes | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
81
81
  | `contractServiceBundles` | ContractServiceBundle | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
82
82
  | `contractServiceUnits` | ContractServiceUnit | yes | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
83
- | `contractServices` | ContractService | yes | create, update, get, getMany, count, createIfNotExists | createIfNotExists → `contract_services.createIfNotExists` | count, create, createIfNotExists, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
83
+ | `contractServices` | ContractService | yes | create, update, get, getMany, count, createIfNotExists | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
84
84
  | `contractTicketPurchases` | ContractTicketPurchases | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
85
- | `contracts` | Contract | no | create, update, get, getMany, count, createIfNotExists | createIfNotExists → `contracts.createIfNotExists` | count, create, createIfNotExists, get, getEntityInfo, getFieldInfo, getUdfInfo, lineOfBusiness, profitability, query, resolve, search, update |
85
+ | `contracts` | Contract | no | create, update, get, getMany, count, createIfNotExists | — | count, create, fullProfile, get, getEntityInfo, getFieldInfo, getUdfInfo, lineOfBusiness, profitability, query, resolve, search, update |
86
86
  | `countries` | Country | no | get, getMany, update, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
87
87
  | `departments` | Department | no | count, create, get, getMany, update | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
88
88
  | `domainRegistrar` | DomainRegistrar | no | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
89
89
  | `expenseItemAttachments` | ExpenseItemAttachment | yes | create, getMany, count, download, delete | download → `expense_item_attachments.download` | count, create, delete, download, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
90
- | `expenseItems` | ExpenseItem | yes | create, update, get, getMany, count, createIfNotExists | createIfNotExists → `expense_items.createIfNotExists` | count, create, createIfNotExists, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
90
+ | `expenseItems` | ExpenseItem | yes | create, update, get, getMany, count, createIfNotExists | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
91
91
  | `expenseReports` | ExpenseReport | no | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
92
- | `holidaySets` | HolidaySet | no | create, update, get, getMany, delete, count, createIfNotExists | createIfNotExists → `holiday_sets.createIfNotExists` | count, create, createIfNotExists, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
93
- | `holidays` | Holiday | yes | create, update, get, getMany, count, delete, createIfNotExists | createIfNotExists → `holidays.createIfNotExists` | count, create, createIfNotExists, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
94
- | `invoices` | Invoice | no | update, get, getMany, count, pdf, markupHtml, markupXml | markupHtml → `invoices.markupHtml`; markupXml → `invoices.markupXml`; pdf → `invoices.pdf` | count, customRange, get, getEntityInfo, getFieldInfo, getUdfInfo, last14, last24h, last30, last7, last90, lastFullFortnight, lastFullMonth, lastFullQuarter, lastFullWeek, markupHtml, markupXml, pdf, query, resolve, today, update, yesterday |
92
+ | `holidaySets` | HolidaySet | no | create, update, get, getMany, delete, count, createIfNotExists | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
93
+ | `holidays` | Holiday | yes | create, update, get, getMany, count, delete, createIfNotExists | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
94
+ | `invoices` | Invoice | no | update, get, getMany, count, pdf, markupHtml, markupXml | markupHtml → `invoices.markupHtml`; markupXml → `invoices.markupXml`; pdf → `invoices.pdf` | count, get, getEntityInfo, getFieldInfo, getUdfInfo, markupHtml, markupXml, pdf, query, resolve, update |
95
95
  | `notificationHistory` | NotificationHistory | no | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
96
- | `opportunities` | Opportunity | no | create, createIfNotExists, update, get, getMany, count | createIfNotExists → `opportunities.createIfNotExists` | count, create, createIfNotExists, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
96
+ | `opportunities` | Opportunity | no | create, createIfNotExists, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
97
97
  | `opportunityAttachments` | OpportunityAttachment | yes | create, getMany, count, download, delete | download → `opportunity_attachments.download` | count, create, delete, download, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
98
98
  | `opportunityCategories` | OpportunityCategory | no | get, getMany, count, update | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
99
99
  | `productVendors` | ProductVendors | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
100
100
  | `products` | Product | no | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
101
- | `projectCharges` | ProjectCharge | yes | create, update, delete, get, getMany, count, createIfNotExists | createIfNotExists → `project_charges.createIfNotExists` | count, create, createIfNotExists, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
101
+ | `projectCharges` | ProjectCharge | yes | create, update, delete, get, getMany, count, createIfNotExists | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
102
102
  | `projectNotes` | ProjectNote | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
103
103
  | `projectPhases` | Phase | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
104
104
  | `projectTasks` | Task | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
@@ -110,20 +110,20 @@ Two sources in, markdown table out: the node repo (the ops column is re-derived
110
110
  | `quoteItems` | QuoteItem | yes | create, update, get, getMany, count, delete | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
111
111
  | `quoteLocations` | QuoteLocation | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
112
112
  | `quoteTemplates` | QuoteTemplate | no | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search |
113
- | `quotes` | Quote | no | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
113
+ | `quotes` | Quote | no | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update, withItems |
114
114
  | `resourceRoleQueues` | ResourceRoleQueue | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
115
115
  | `resourceRoles` | ResourceRole | yes | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
116
116
  | `resourceSkills` | ResourceSkill | yes | get, getMany, count, update | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
117
117
  | `resourceTimeOffAdditional` | ResourceTimeOffAdditional | yes | get, update | getByResource → `resource_time_off_additional.getByResource`; get → `resource_time_off_additional.getByResource` | getByResource, getEntityInfo, getFieldInfo, getUdfInfo, resolve, update |
118
118
  | `resourceTimeOffApprovers` | ResourceTimeOffApprover | yes | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
119
119
  | `resourceTimeOffBalances` | ResourceTimeOffBalance | yes | get, getByYear | getByResource → `resource_time_off_balances.getByResource`; getByYear → `resource_time_off_balances.getByYear` | get, getByResource, getByYear, getEntityInfo, getFieldInfo, getUdfInfo, resolve |
120
- | `resources` | Resource | no | get, getMany, whoAmI, transferOwnership, update, count | transferOwnership → `resources.transferOwnership`; whoAmI → `resources.whoAmI` | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, transferOwnership, update, whoAmI |
120
+ | `resources` | Resource | no | get, getMany, whoAmI, transferOwnership, update, count | whoAmI → `resources.whoAmI` | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update, whoAmI, workload |
121
121
  | `roles` | Role | no | create, get, getMany, update | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
122
122
  | `serviceCallTaskResources` | ServiceCallTaskResource | yes | create, get, getMany, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
123
123
  | `serviceCallTasks` | ServiceCallTask | yes | create, get, getMany, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
124
124
  | `serviceCallTicketResources` | ServiceCallTicketResource | yes | create, get, getMany, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
125
125
  | `serviceCallTickets` | ServiceCallTicket | yes | create, get, getMany, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
126
- | `serviceCalls` | ServiceCall | no | create, update, get, getMany, delete, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
126
+ | `serviceCalls` | ServiceCall | no | create, update, get, getMany, delete, count | — | count, create, delete, fullProfile, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
127
127
  | `serviceLevelAgreementResults` | ServiceLevelAgreementResults | no | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
128
128
  | `services` | Service | no | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
129
129
  | `skills` | Skill | no | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search |
@@ -135,13 +135,13 @@ Two sources in, markdown table out: the node repo (the ops column is re-derived
135
135
  | `tagGroups` | TagGroup | no | create, update, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
136
136
  | `tags` | Tag | no | create, update, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
137
137
  | `taskSecondaryResources` | TaskSecondaryResource | yes | create, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
138
- | `ticketAdditionalConfigurationItems` | TicketAdditionalConfigurationItem | yes | create, createIfNotExists, delete, get, getMany, count | createIfNotExists → `ticket_additional_configuration_items.createIfNotExists` | count, create, createIfNotExists, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
139
- | `ticketAdditionalContacts` | TicketAdditionalContact | yes | create, createIfNotExists, delete, get, getMany, count | createIfNotExists → `ticket_additional_contacts.createIfNotExists` | count, create, createIfNotExists, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
138
+ | `ticketAdditionalConfigurationItems` | TicketAdditionalConfigurationItem | yes | create, createIfNotExists, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
139
+ | `ticketAdditionalContacts` | TicketAdditionalContact | yes | create, createIfNotExists, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
140
140
  | `ticketAttachments` | TicketAttachment | yes | create, getMany, count, download, delete | download → `ticket_attachments.download` | count, create, delete, download, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
141
141
  | `ticketCategories` | TicketCategory | no | get, getMany, update, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
142
142
  | `ticketCategoryFieldDefaults` | TicketCategoryFieldDefault | yes | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
143
143
  | `ticketChangeRequestApprovals` | TicketChangeRequestApproval | yes | create, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
144
- | `ticketCharges` | TicketCharge | yes | create, createIfNotExists, update, delete, get, getMany, count | createIfNotExists → `ticket_charges.createIfNotExists` | count, create, createIfNotExists, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, moveToTicket, query, resolve, search, update |
144
+ | `ticketCharges` | TicketCharge | yes | create, createIfNotExists, update, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, moveToTicket, query, resolve, search, update |
145
145
  | `ticketChecklistItems` | TicketChecklistItem | yes | create, update, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
146
146
  | `ticketChecklistLibraries` | TicketChecklistLibrary | yes | create | — | attachToDocument, create, getEntityInfo, getFieldInfo, getUdfInfo, resolve |
147
147
  | `ticketHistories` | TicketHistory | no | get, getMany, count | — | count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
@@ -150,8 +150,8 @@ Two sources in, markdown table out: the node repo (the ops column is re-derived
150
150
  | `ticketNotes` | TicketNote | yes | create, update, get, getMany, count | — | count, create, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, update |
151
151
  | `ticketSecondaryResources` | TicketSecondaryResource | yes | create, delete, get, getMany, count | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
152
152
  | `ticketWebhooks` | TicketWebhook | yes | get, getMany, delete | — | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, search, update |
153
- | `tickets` | Ticket | no | create, get, getMany, slaHealthCheck, summary, timeline, update, count | slaHealthCheck → `tickets.slaHealthCheck`; summary → `tickets.summary`; timeline → `tickets.timeline` | changeStatus, count, create, findByTicketNumber, forResource, fullContext, get, getContext, getEntityInfo, getFieldInfo, getUdfInfo, lineOfBusiness, openWithNoteAndAssign, query, resolve, search, slaHealthCheck, statusSemantics, summary, timeline, update |
154
- | `timeEntries` | TimeEntry | no | create, update, get, getMany, getPosted, getUnposted, delete, count, createIfNotExists | createIfNotExists → `time_entries.createIfNotExists`; customRange → `time_entries.customRange`; getPosted → `time_entries.getPosted`; getUnposted → `time_entries.getUnposted`; last14 → `time_entries.last14`; last24h → `time_entries.last24h`; last30 → `time_entries.last30`; last7 → `time_entries.last7`; last90 → `time_entries.last90`; lastFullFortnight → `time_entries.lastFullFortnight`; lastFullMonth → `time_entries.lastFullMonth`; lastFullQuarter → `time_entries.lastFullQuarter`; lastFullWeek → `time_entries.lastFullWeek`; today → `time_entries.today`; yesterday → `time_entries.yesterday` | approve, count, create, createForResource, createIfNotExists, customRange, dateWorkedWindow, delete, get, getEntityInfo, getFieldInfo, getPosted, getUdfInfo, getUnposted, last14, last24h, last30, last7, last90, lastFullFortnight, lastFullMonth, lastFullQuarter, lastFullWeek, moveToTicket, postedWithin, query, resolve, today, update, yesterday |
153
+ | `tickets` | Ticket | no | create, get, getMany, slaHealthCheck, summary, timeline, update, count | slaHealthCheck → `tickets.slaHealthCheck`; summary → `tickets.summary`; timeline → `tickets.timeline` | changeStatus, count, create, findByTicketNumber, forResource, fullContext, get, getContext, getEntityInfo, getFieldInfo, getUdfInfo, lineOfBusiness, query, resolve, search, slaHealthCheck, statusSemantics, summary, timeline, update |
154
+ | `timeEntries` | TimeEntry | no | create, update, get, getMany, getPosted, getUnposted, delete, count, createIfNotExists | dateWorkedWindow → `time_entries.dateWorkedWindow`; moveToTicket → `time_entries.moveToTicket` | count, create, dateWorkedWindow, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, moveToTicket, query, resolve, update |
155
155
  | `timeEntryAttachments` | TimeEntryAttachment | yes | create, getMany, count, download, delete | download → `time_entry_attachments.download` | count, create, delete, download, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve |
156
156
  | `timeOffRequests` | TimeOffRequest | no | get, getMany, count, approve, reject | approve → `time_off_requests.approve`; reject → `time_off_requests.reject` | approve, count, get, getEntityInfo, getFieldInfo, getUdfInfo, query, reject, resolve |
157
157
  | `(none — NOT IMPLEMENTED in node)` | InventoryProduct (StockedItemsAdd/Remove/Transfer pseudo-entities) | yes | | stockedItemsAdd → `inventory_products.stockedItemsAdd`; stockedItemsRemove → `inventory_products.stockedItemsRemove`; stockedItemsTransfer → `inventory_products.stockedItemsTransfer` | count, create, delete, get, getEntityInfo, getFieldInfo, getUdfInfo, query, resolve, stockedItemsAdd, stockedItemsRemove, stockedItemsTransfer, update |
@@ -352,10 +352,10 @@ taste**: extend or shrink it only via a recorded change to
352
352
  `code`, `category`, `retryable`, `operation`, `httpStatus`, `suggestedAction`
353
353
  (the nextAction directive — follow it), `correlationId`, the deep-redacted
354
354
  `vendorError` body (the vendor's own field-level failure text — absent when
355
- the error carries no body), and — when the SDK attached extras (issue #9/#14:
356
- the typed `emptyReason` / `pointerNote` on a plan-pinned op's failure, the
357
- recovery refusal `candidateIds`) — `details` (passed through verbatim;
358
- absent on unpinned surfaces). A string `vendorError` / `details.bodySnippet`
355
+ the error carries no body), and — when the SDK attached extras (issue
356
+ #13/#14: the typed `emptyReason` / `pointerNote` on a plan-pinned op's
357
+ failure, the #13 shape-drift `candidateIds` refusal) — `details` (passed
358
+ through verbatim; absent on unpinned surfaces). A string `vendorError` / `details.bodySnippet`
359
359
  body is host-sourced free text: when the untrusted-content projection is on
360
360
  it is served wrapped in `<untrusted_content>` (the wrapper marks DATA, never
361
361
  instructions); a parsed (non-string) `vendorError` body is the redacted copy
@@ -160,6 +160,8 @@ export function hitsOutput(): z.ZodType {
160
160
  /** `resolveAny`: one outcome per requested resource; misses do not throw. */
161
161
  export function resolveAnyOutput(): z.ZodType {
162
162
  return z.object({
163
+ matched: z.enum(['exact', 'contains']),
164
+ contains: hitsOutput().optional(),
163
165
  identifier: z.union([z.string(), z.number()]),
164
166
  results: z.array(
165
167
  crossDataField('Per-resource outcome: value (compact or null), resolutionCost, scanned, candidates/error on a miss.'),
@@ -84,7 +84,7 @@ export function registerReadTools({ server, client, dry, untrustedWrap }: ToolCo
84
84
  // R3 — find a record it cannot name.
85
85
  registerCoreRead(
86
86
  coreSpec('autotask_resolve_any')!,
87
- z.object({ identifier: IDENTIFIER, resources: RESOURCES }),
87
+ z.object({ identifier: IDENTIFIER, resources: RESOURCES, match: z.enum(['exact', 'auto']).optional(), limit: z.number().int().min(1).max(500).optional() }),
88
88
  resolveAnyOutput,
89
89
  (v) => `${(v as { matches: string[] }).matches.length} resource(s) matched the identifier.`,
90
90
  );
@@ -163,6 +163,7 @@ export function projectUntrustedResult(opId: string, value: unknown, fields: rea
163
163
  case 'operations.resolveAny':
164
164
  return {
165
165
  ...v,
166
+ ...(v.contains === undefined ? {} : { contains: projectUntrustedResult('operations.searchAcrossResources', v.contains, fields) }),
166
167
  results: (Array.isArray(v.results) ? v.results : []).map((row) =>
167
168
  row !== null && typeof row === 'object' && !Array.isArray(row) && 'value' in row
168
169
  ? { ...(row as Record<string, unknown>), value: deepMarkUntrusted((row as Record<string, unknown>).value, fields) }
@@ -212,7 +213,7 @@ export async function coreReadCall(client: AutotaskClient, opId: string, args: R
212
213
  case 'threshold_information.get':
213
214
  return { model: await client.thresholdInformation.get() };
214
215
  case 'operations.resolveAny':
215
- return resolveAny(client, args.identifier as number | string, { resources: args.resources as string[] | undefined });
216
+ return resolveAny(client, args.identifier as number | string, { resources: args.resources as string[] | undefined, match: args.match as 'exact' | 'auto' | undefined, limit: args.limit as number | undefined });
216
217
  case 'operations.searchAcrossResources':
217
218
  return searchAcrossResources(client, args.query as string, {
218
219
  resources: args.resources as string[] | undefined,
@@ -45,15 +45,15 @@
45
45
  "entity": "resource",
46
46
  "apiEntity": "resources",
47
47
  "included": true,
48
- "reason": "The staff side: the resource the credentials act as (whoAmI) and staff lookup (get/query/count/resolve/search), plus resource update and the approval-gated ownership transfer.",
48
+ "reason": "The staff side: the resource the credentials act as (whoAmI) and staff lookup (get/query/count/resolve/search), plus resource update.",
49
49
  "excludeDestructive": true,
50
- "notes": "resources.transferOwnership is approval-gated (requiresApproval) \u2014 it stays in the write tool with its confirm rule; no destructive operations for resources."
50
+ "notes": "No approval-gated operations for resources remain (the transferOwnership ownership transfer was cut in #292); no destructive operations for resources."
51
51
  },
52
52
  {
53
53
  "entity": "timeEntry",
54
54
  "apiEntity": "time_entries",
55
55
  "included": true,
56
- "reason": "The effort side: time entries logged against tickets \u2014 create/update (incl. createIfNotExists) and the bounded window reads (today/last7/last30/last90/last24h/customRange, posted/unposted).",
56
+ "reason": "The effort side: time entries logged against tickets \u2014 create/update and the posted-state window read (dateWorkedWindow: the inclusive dateWorked window with the posted/unposted split from the billing-item join).",
57
57
  "excludeDestructive": true,
58
58
  "notes": "time_entries.delete (destructive, confirm-gated) is excluded from the consumer surface by default; listed available-via-SDK-server."
59
59
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-autotask",
3
- "version": "0.43.0",
3
+ "version": "0.45.0",
4
4
  "description": "Fully-typed TypeScript SDK for the Autotask (Datto) PSA REST API. Zero runtime dependencies. Built for building MCP servers and integrations.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -161,18 +161,19 @@
161
161
  },
162
162
  "homepage": "https://github.com/msoukhomlinov/node-autotask#readme",
163
163
  "devDependencies": {
164
- "@eslint/js": "^9.17.0",
164
+ "@eslint/js": "^10.0.1",
165
165
  "@modelcontextprotocol/server": "^2.2.0",
166
- "@types/node": "^22.10.0",
167
- "@vitest/coverage-v8": "^4.1.12",
168
- "eslint": "^9.17.0",
169
- "globals": "^15.14.0",
166
+ "@types/node": "^26.6.6",
167
+ "@vitest/coverage-v8": "^5.0.5",
168
+ "eslint": "^10.13.0",
169
+ "globals": "^17.13.0",
170
170
  "rimraf": "^6.0.1",
171
- "tsup": "^8.3.0",
171
+ "tsup": "^9.0.0",
172
172
  "tsx": "^4.23.15",
173
- "typescript": "^5.7.0",
173
+ "typescript": "^6.0.3",
174
174
  "typescript-eslint": "^8.18.0",
175
- "vitest": "^4.1.12",
175
+ "vite": "^8.3.5",
176
+ "vitest": "^5.0.5",
176
177
  "zod": "^4.4.3"
177
178
  },
178
179
  "overrides": {