node-autotask 0.44.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.
- package/CHANGELOG.md +28 -0
- package/MCP_TOOL_CATALOG.json +153 -1269
- package/MCP_TOOL_MANIFEST.md +28 -95
- package/MCP_TOOL_OVERRIDES.json +8 -62
- package/N8N_MCP_MANIFEST.json +118 -695
- package/N8N_MCP_MANIFEST.md +32 -52
- package/README.md +5 -10
- package/capabilities.json +23788 -31075
- package/dist/{base-CftidiyZ.d.cts → base-BVoYDlVA.d.cts} +2 -2
- package/dist/{base-CftidiyZ.d.ts → base-BVoYDlVA.d.ts} +2 -2
- package/dist/capabilities.cjs +2 -2
- package/dist/capabilities.js +1 -1
- package/dist/{chunk-N6IWPGHB.js → chunk-ASMCTZO2.js} +23787 -31074
- package/dist/{chunk-6WLGHKIU.cjs → chunk-DC3PY4EF.cjs} +1839 -1407
- package/dist/{chunk-BKTOMNT2.js → chunk-DXKXQHCX.js} +5 -5
- package/dist/{chunk-KWQSGWY5.cjs → chunk-JO6WI763.cjs} +143 -143
- package/dist/{chunk-LYI5FRPX.js → chunk-NSW7JPVS.js} +11544 -13365
- package/dist/{chunk-7MCKJTSA.js → chunk-O4PIPUS4.js} +1583 -1151
- package/dist/{chunk-PH3ESYAF.cjs → chunk-VXVYFJH3.cjs} +23787 -31074
- package/dist/{chunk-EMYDC5SG.cjs → chunk-YMBVKVK4.cjs} +6123 -7944
- package/dist/{index-YbEk0awP.d.cts → index-C5g1H_hF.d.ts} +1194 -1415
- package/dist/{index-D8FtzUGP.d.ts → index-Db0SNnQn.d.cts} +1194 -1415
- package/dist/{index-DgBA1JMH.d.cts → index-c549LvOb.d.cts} +188 -188
- package/dist/{index-DgBA1JMH.d.ts → index-c549LvOb.d.ts} +188 -188
- package/dist/index.cjs +22 -22
- package/dist/index.d.cts +15 -42
- package/dist/index.d.ts +15 -42
- package/dist/index.js +7 -7
- package/dist/operations/index.cjs +5 -2327
- package/dist/operations/index.d.cts +7 -287
- package/dist/operations/index.d.ts +7 -287
- package/dist/operations/index.js +29 -2351
- package/dist/pool.cjs +8 -8
- package/dist/pool.d.cts +1 -1
- package/dist/pool.d.ts +1 -1
- package/dist/pool.js +4 -4
- package/dist/resources/index.cjs +4 -4
- package/dist/resources/index.d.cts +2 -2
- package/dist/resources/index.d.ts +2 -2
- package/dist/resources/index.js +7 -7
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/docs/API.md +201 -303
- package/docs/LIVE-TESTING.md +4 -6
- package/docs/N8N-ADAPTER.md +26 -26
- package/n8n-mcp.curation.json +3 -3
- package/package.json +1 -1
package/MCP_TOOL_OVERRIDES.json
CHANGED
|
@@ -76,26 +76,14 @@
|
|
|
76
76
|
{
|
|
77
77
|
"tool": "autotask_billingCode_count",
|
|
78
78
|
"field": "description",
|
|
79
|
-
"newValue": "Zone quirk (ww29, live-verified): the unfiltered count/query surface is blind — query with `useType` (1 = general, 3 = internal) + `isActive` filters
|
|
80
|
-
"reason": "S11-C F4 (mcp-fix-20261003, plan M4): the unfiltered billing_codes surface is blind in ww29 (S9b node rule: the resolver always queries the internal family useType=3 + isActive); a raw caller gets a silent 0."
|
|
79
|
+
"newValue": "Zone quirk (ww29, live-verified): the unfiltered count/query surface is blind — query with `useType` (1 = general, 3 = internal) + `isActive` filters. A raw caller must pass those filters (the allocation-code-aware createForResource node op was cut in #292).",
|
|
80
|
+
"reason": "S11-C F4 (mcp-fix-20261003, plan M4): the unfiltered billing_codes surface is blind in ww29 (S9b node rule: the resolver always queries the internal family useType=3 + isActive); a raw caller gets a silent 0. The node op that applied these filters (createForResource) was cut in #292 — callers now pass the filters themselves."
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
"tool": "autotask_billingCode_query",
|
|
84
84
|
"field": "description",
|
|
85
|
-
"newValue": "Zone quirk (ww29, live-verified): the unfiltered count/query surface is blind — query with `useType` (1 = general, 3 = internal) + `isActive` filters
|
|
86
|
-
"reason": "S11-C F4 (mcp-fix-20261003, plan M4): the unfiltered billing_codes surface is blind in ww29 — pass the useType + isActive filters (
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
"tool": "autotask_timeEntry_create_for_resource",
|
|
90
|
-
"field": "description",
|
|
91
|
-
"newValue": "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. Pass `resourceID` and, optionally, the time window (`dateWorked`/`startDateTime`/`endDateTime`/`hoursWorked`) ONLY — the node resolves the allocation code; pin `internallAllocationCodeID` only when you hold a known active code. Wire key: the body posts the model name `internalBillingCodeID` (settled live for the australia-nz zone). (ww29/australia-nz: a (resource, role) pair that selects the API-only user's own resource was refused 2026-10-06 — 500 'API-only user cannot be selected for this field'. Creates succeeded live 2026-10-21 (pair not recorded); the authorised pair set is not re-adjudicated. On that error use an authorised (resource, role) pair or record time in the Autotask UI; the working reads remain postedWithin / the window helpers.)",
|
|
92
|
-
"reason": "S11-C F5 (mcp-fix-20261003, plan M5): state the minimal-input contract (resourceID + optional time window only), the pin rule (internallAllocationCodeID only when you hold a known active code) and the wire-key fact (the body posts the model name internalBillingCodeID — key oracle, S9b §5). The mechanical purpose covers node resolution only.; S13-QA (top-20 audit 2026-10-06) I-1 (W-A3, re-verified 2026-10-06 CONF100-1791187382): a (resource, role) pair wall for the API-only user's own resource (re-scoped 2026-10-21, #195) — the served surface names the wall and the working reads."
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
"tool": "autotask_ticket_open_with_note_and_assign",
|
|
96
|
-
"field": "description",
|
|
97
|
-
"newValue": "When to call: open a ticket and — in the same call — optionally attach the first note and/or assign a resource (1 call instead of the 6-call create + note + assign choreography). The node absorbs the ww29-proven create contract (required set { title, status (default 1 New), priority (default 3 Low), companyID, queueID }) and NEVER guesses a queue: an omitted queueID the vendor 500s on becomes the typed QUEUE_REQUIRED (suggestedAction: pass params.queueID — discover via autotask_describe(tickets.create)). Partial-failure contract: `steps[]` reports per-step results — the ticket is created first and a note/assign failure returns the applied ticketId + the typed step error (vendor rules now absorbed: the note create REQUIRES `title`; the assignment requires BOTH assignedResourceID and assignedResourceRoleID — live-verified). The resources table is blind to this API user, so the node pre-validates the assign target via resources.get (get is the authority). Apply after the dry run.",
|
|
98
|
-
"reason": "S12-A T1 (mcp-fix-20261003): the write composition that collapses the open-and-assign choreography; the override surfaces the steps[] partial-failure contract, the never-guess-queue rule and the live-verified vendor field rules (note title, the assign roleID) the mechanical purpose omits.; S13-QA (top-20 audit 2026-10-06) M-2: de-duplicated the dry-run sentence against the mechanical bounds tail."
|
|
85
|
+
"newValue": "Zone quirk (ww29, live-verified): the unfiltered count/query surface is blind — query with `useType` (1 = general, 3 = internal) + `isActive` filters. A raw caller must pass those filters (the allocation-code-aware createForResource node op was cut in #292).",
|
|
86
|
+
"reason": "S11-C F4 (mcp-fix-20261003, plan M4): the unfiltered billing_codes surface is blind in ww29 — pass the useType + isActive filters (the allocation-code-aware createForResource node op that applied them was cut in #292)."
|
|
99
87
|
},
|
|
100
88
|
{
|
|
101
89
|
"tool": "autotask_ticket_change_status",
|
|
@@ -103,22 +91,10 @@
|
|
|
103
91
|
"newValue": "When to call: move a ticket to a target status without knowing the tenant's status picklist or the per-status required fields — the node validates the targetStatus against the tenant's LIVE status picklist (entity metadata — a value the live picklist lacks → typed STATUS_UNKNOWN, zero record wire; the metadata unavailable → the vendor's own validation decides) and carries the live-discovered STATUS_REQUIRED_FIELDS map: one fresh GET merges the current record and the node fills the proven-safe defaults for the fields the target status requires that the record lacks. current === target → the typed no-op { changed: false, reason: 'NO_CHANGE' } (zero mutating wire). If the vendor 50s a status move naming required fields, the node retries once with those fields filled (typed discovery, bounded: max 3 merges) and returns filledFields + discoveryMerges.",
|
|
104
92
|
"reason": "S12-A T2 (mcp-fix-20261003): the per-status required-field map is live-discovered vendor state an MCP LLM cannot know; the override states the picklist guard, the no-op contract and the bounded-discovery retry.; S13-QA (top-20 audit 2026-10-06) M-2: dropped the trailing dry-run sentence (the mechanical bounds tail already serves it).; S13-QA gate note 2 (dual-gate 2026-10-06): trailing space from the truncation fix.; #64 (2026-10-10): the guard is the tenant's LIVE status picklist (entity metadata, cache-aware) with the vendor-rejection fallback — the pinned ww29 table is deleted."
|
|
105
93
|
},
|
|
106
|
-
{
|
|
107
|
-
"tool": "autotask_contact_upsert_by_email",
|
|
108
|
-
"field": "description",
|
|
109
|
-
"newValue": "When to call: ensure a contact with the given email exists under the given company (find-or-create) — one call with the typed EXISTS/CREATED result (+ the record). The node pre-checks the parent via companies.get (the companies count/query surface is blind to this API user — get is the authority; a miss → typed COMPANY_NOT_FOUND), then the parent-narrowed dedup query (1 wire, never widens; exact-case matching). The contact create absorbs the live-verified vendor rule: lastName must be non-empty (the node defaults it to 'Unknown'). Caveat: under the default redaction policy existing.emailAddress arrives [REDACTED] (PII).",
|
|
110
|
-
"reason": "S12-A T4 (mcp-fix-20261003): the find-or-create under the right parent with the blind-safe pre-check; the override states the typed EXISTS/CREATED contract, the redaction caveat and the live-verified lastName rule.; S13-QA (top-20 audit 2026-10-06) M-2: dropped the trailing dry-run sentence (the mechanical bounds tail already serves it).; S13-QA gate note 2 (dual-gate 2026-10-06): trailing space from the truncation fix."
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
"tool": "autotask_company_upsert_by_name",
|
|
114
|
-
"field": "description",
|
|
115
|
-
"newValue": "When to call: ensure a company with the given name exists (find-or-create) — one call with the typed EXISTS/CREATED result. The dedup boundary travels IN THE RESULT: the companies surface is blind to this API user (unowned companies are invisible to count/query), so BOTH result shapes carry the typed blindSurface caveat ('dedup covers only companies this API user can enumerate; a same-name company outside that scope is not detected') — the op never pretends total visibility. CREATE needs the ww29 required set { companyName, companyType, phone, ownerResourceID }: a missing owner → typed OWNER_RESOURCE_REQUIRED (the fix is fixture-free: pass params.ownerResourceID — the API-only user holds no owner resource in this zone). The create side-effects an auto 'Primary Address' location (reported in sideEffects).",
|
|
116
|
-
"reason": "S12-A T5 (mcp-fix-20261003): the blind-surface-aware find-or-create; the override states the in-result caveat, the OWNER_RESOURCE_REQUIRED remedy and the auto-location side-effect.; S13-QA (top-20 audit 2026-10-06) M-2: dropped the trailing dry-run sentence (the mechanical bounds tail already serves it).; S13-QA gate note 2 (dual-gate 2026-10-06): trailing space from the truncation fix."
|
|
117
|
-
},
|
|
118
94
|
{
|
|
119
95
|
"tool": "autotask_ticket_full_context",
|
|
120
96
|
"field": "description",
|
|
121
|
-
"newValue": "When to call: the full context of ONE ticket in a single call (instead of 8–10 separate reads): the ticket + company + contact + assigned resource + project (a missing/dangling FK part is null + 'absent' — a part miss never fails the op), plus its notes, time entries and attachment metadata (histories are not read by this served tool). Wire: 8 bounded reads. Long text is truncated at textLimit (default 500) and flagged. The ticket itself missing → NOT_FOUND. Prefer this before composing actions on a ticket (changeStatus
|
|
97
|
+
"newValue": "When to call: the full context of ONE ticket in a single call (instead of 8–10 separate reads): the ticket + company + contact + assigned resource + project (a missing/dangling FK part is null + 'absent' — a part miss never fails the op), plus its notes, time entries and attachment metadata (histories are not read by this served tool). Wire: 8 bounded reads. Long text is truncated at textLimit (default 500) and flagged. The ticket itself missing → NOT_FOUND. Prefer this before composing actions on a ticket (changeStatus).",
|
|
122
98
|
"reason": "S12-B T1 (mcp-fix-20261003): collapses the 9 raw relationship reads into one read call; the override states the per-part 'absent' semantics and the opt-in budget knobs.; S13-QA (top-20 audit 2026-10-06) I-4: includeHistories is not a served argument — the opt-in wording promised a control the closed schema lacks.; S13-QA gate note 1 (dual-gate 2026-10-06): the served schema is {id} — the 10-reads-with-histories figure is unreachable, dropped so the row does not contradict itself."
|
|
123
99
|
},
|
|
124
100
|
{
|
|
@@ -133,12 +109,6 @@
|
|
|
133
109
|
"newValue": "When to call: the full profile of ONE configuration item in a single call: the item + its type + category records + notes + related items + billing-product associations (wire: <=6 reads; a dangling type/category FK skips its read). productAssociations is TYPED, never an error: on a tenant without enumerable products (ww29: products.count = 0 — the CI-create wall) the part carries blind: true + the zone-facts note. Zone fact: on ww29 NO CI record exists (the product wall blocked every create) — expect NOT_FOUND there; the op is mock-verified and stranger-verified.",
|
|
134
110
|
"reason": "S12-B T3 (mcp-fix-20261003): the typed product-wall part; the override states the wall zone fact so consumers do not misread the blind association part as a defect."
|
|
135
111
|
},
|
|
136
|
-
{
|
|
137
|
-
"tool": "autotask_fetch_many",
|
|
138
|
-
"field": "description",
|
|
139
|
-
"newValue": "When to call: batch up to 20 single-record GETs across MIXED resources in one call (instead of N sequential autotask_read calls): items [{ resource, id, fields? }] with per-item typed results (NOT_FOUND / SERVER_ERROR per item — never all-or-nothing). Refusals are pre-request (zero wire): string ids point at operations.resolveAny (name → id is its job); parent-scoped children (e.g. ticket_notes) need a parentId; unknown `fields` keys come back as the complete problem list (fields = exact vendor field names — client-side projection, zero extra wire); >20 items → CONFIG_ERROR (use <resource>.query for bulk). Sequential GETs (one wire per item); read op — no dry run.",
|
|
140
|
-
"reason": "S12-B T4 (mcp-fix-20261003): the batch/fan-out read primitive that collapses the server's worst cost pattern (N sequential reads); the override states the refusal contracts up front."
|
|
141
|
-
},
|
|
142
112
|
{
|
|
143
113
|
"tool": "autotask_relationship_map",
|
|
144
114
|
"field": "description",
|
|
@@ -148,21 +118,15 @@
|
|
|
148
118
|
{
|
|
149
119
|
"tool": "autotask_timeEntry_create",
|
|
150
120
|
"field": "description",
|
|
151
|
-
"newValue": "Create a time entry. (ww29/australia-nz: a (resource, role) pair that selects the API-only user's own resource was refused 2026-10-06 — 500 'API-only user cannot be selected for this field'. Creates succeeded live 2026-10-21 (pair not recorded); the authorised pair set is not re-adjudicated. On that error use an authorised (resource, role) pair or record time in the Autotask UI; the working reads remain
|
|
121
|
+
"newValue": "Create a time entry. (ww29/australia-nz: a (resource, role) pair that selects the API-only user's own resource was refused 2026-10-06 — 500 'API-only user cannot be selected for this field'. Creates succeeded live 2026-10-21 (pair not recorded); the authorised pair set is not re-adjudicated. On that error use an authorised (resource, role) pair or record time in the Autotask UI; the working reads remain time_entries.dateWorkedWindow / the plain query.)",
|
|
152
122
|
"reason": "S13-QA (top-20 audit 2026-10-06) I-1 (W-A3, re-verified 2026-10-06 CONF100-1791187382): the 2026-10-06 (resource, role) pair wall (API-only user's own resource); re-scoped 2026-10-21 (#195) after live creates succeeded; the served surface previously presented the write as normal."
|
|
153
123
|
},
|
|
154
124
|
{
|
|
155
125
|
"tool": "autotask_timeEntry_update",
|
|
156
126
|
"field": "description",
|
|
157
|
-
"newValue": "Update a time entry. (ww29/australia-nz: a (resource, role) pair that selects the API-only user's own resource was refused 2026-10-06 — 500 'API-only user cannot be selected for this field'. Creates succeeded live 2026-10-21 (pair not recorded); the authorised pair set is not re-adjudicated. On that error use an authorised (resource, role) pair or record time in the Autotask UI; the working reads remain
|
|
127
|
+
"newValue": "Update a time entry. (ww29/australia-nz: a (resource, role) pair that selects the API-only user's own resource was refused 2026-10-06 — 500 'API-only user cannot be selected for this field'. Creates succeeded live 2026-10-21 (pair not recorded); the authorised pair set is not re-adjudicated. On that error use an authorised (resource, role) pair or record time in the Autotask UI; the working reads remain time_entries.dateWorkedWindow / the plain query.)",
|
|
158
128
|
"reason": "S13-QA (top-20 audit 2026-10-06) I-1 (W-A3, re-verified 2026-10-06 CONF100-1791187382): same wall on the update write path; the served surface names it."
|
|
159
129
|
},
|
|
160
|
-
{
|
|
161
|
-
"tool": "autotask_timeEntry_create_if_not_exists",
|
|
162
|
-
"field": "description",
|
|
163
|
-
"newValue": "Create a TimeEntry. (ww29/australia-nz: a (resource, role) pair that selects the API-only user's own resource was refused 2026-10-06 — 500 'API-only user cannot be selected for this field'. Creates succeeded live 2026-10-21 (pair not recorded); the authorised pair set is not re-adjudicated. On that error use an authorised (resource, role) pair or record time in the Autotask UI; the working reads remain postedWithin / the window helpers.)",
|
|
164
|
-
"reason": "S13-QA (top-20 audit 2026-10-06) I-1 (W-A3): the dedup-miss branch runs the walled create; the served surface names the wall (the plain-create caveat is appended mechanically by the projection when the schema lacks dedupFields)."
|
|
165
|
-
},
|
|
166
130
|
{
|
|
167
131
|
"tool": "autotask_ticket_count",
|
|
168
132
|
"field": "description",
|
|
@@ -174,24 +138,6 @@
|
|
|
174
138
|
"field": "description",
|
|
175
139
|
"newValue": "Query Ticket records with a JSON filter. Zone quirk (ww29, live-verified): the tickets count/query surface returns 0/empty even when data exists (0 before AND after a proven live create) — verify presence with get(id), not count.",
|
|
176
140
|
"reason": "S13-QA (top-20 audit 2026-10-06) M-4: the ww29 blind-surface quirk rides the served text (precedent: the companies count/query overrides, S11-C F3)."
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
"tool": "autotask_configurationItems_create_if_not_exists",
|
|
180
|
-
"field": "description",
|
|
181
|
-
"newValue": "Create a ConfigurationItem. Note: the create branch inherits the zone wall documented on configuration_items.create (ww29: product wall — products.count = 0, this create is UNAVAILABLE in tenants without products).",
|
|
182
|
-
"reason": "S13-QA (top-20 audit 2026-10-06) M-5: pointer to the walled sibling create on the create branch."
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
"tool": "autotask_contractCharge_create_if_not_exists",
|
|
186
|
-
"field": "description",
|
|
187
|
-
"newValue": "Create a ContractCharge. Note: the create branch inherits the zone wall documented on contract_charges.create (ww29: blind parent — the contracts table is 0 rows for this API user).",
|
|
188
|
-
"reason": "S13-QA (top-20 audit 2026-10-06) M-5: pointer to the walled sibling create on the create branch."
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
"tool": "autotask_projectCharge_create_if_not_exists",
|
|
192
|
-
"field": "description",
|
|
193
|
-
"newValue": "Create a ProjectCharge. Note: the create branch inherits the zone wall documented on project_charges.create (ww29: blind parent — the projects table is 0 rows for this API user).",
|
|
194
|
-
"reason": "S13-QA (top-20 audit 2026-10-06) M-5: pointer to the walled sibling create on the create branch."
|
|
195
141
|
}
|
|
196
142
|
]
|
|
197
|
-
}
|
|
143
|
+
}
|