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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema": "node-autotask n8n consumer mcp projection v1",
3
- "generatedAt": "2026-10-31T20:17:42.452Z",
3
+ "generatedAt": "2026-11-01T01:23:14.190Z",
4
4
  "generator": "scripts/project-n8n-mcp.mjs",
5
5
  "inputs": {
6
6
  "capabilities": "capabilities.json (the capability registry — the single source of truth)",
@@ -21,7 +21,7 @@
21
21
  "entity": "ticket",
22
22
  "apiEntity": "tickets",
23
23
  "effectLine": "effect=read only — zero mutating requests, ungated by design",
24
- "description": "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. | lineOfBusiness: Get the full Line of Business chain for one ticket in a single call: the association, the OrganizationalLevel2 (the customizable 'Line of Business' label) and the OrganizationalLevel1 (the division). | 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.",
24
+ "description": "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. | lineOfBusiness: Get the full Line of Business chain for one ticket in a single call: the association, the OrganizationalLevel2 (the customizable 'Line of Business' label) and the OrganizationalLevel1 (the division). | 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 — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.",
25
25
  "annotations": {
26
26
  "readOnlyHint": true,
27
27
  "destructiveHint": false,
@@ -318,7 +318,7 @@
318
318
  "openWorldHint": true
319
319
  },
320
320
  "purpose": "Query Ticket records with a JSON filter.",
321
- "bounds": "Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation."
321
+ "bounds": "Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows."
322
322
  },
323
323
  {
324
324
  "op": "tickets.resolve",
@@ -721,7 +721,7 @@
721
721
  "entity": "contact",
722
722
  "apiEntity": "contacts",
723
723
  "effectLine": "effect=read only — zero mutating requests, ungated by design",
724
- "description": "Read contact records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for contacts: count: Count contact records matching a JSON filter. (under a company) | findByEmail: Find a contact by email address. | get: Get one Contact by id. | getContext: Get a contact with its primary context records in one call. (under a company) | getEntityInfo: Get the Contact capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Contact 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 Contact user-defined-field catalog. | query: Query Contact records with a JSON filter. | resolve: Resolve a Contact from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Contact 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 contact records by text (contains on the searchable fields). (under a company). Bounds: Sensitive. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Sensitive. Bounded: limit default 25, max 500. Sensitive. 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.",
724
+ "description": "Read contact records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for contacts: count: Count contact records matching a JSON filter. (under a company) | findByEmail: Find a contact by email address. | get: Get one Contact by id. | getContext: Get a contact with its primary context records in one call. (under a company) | getEntityInfo: Get the Contact capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Contact 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 Contact user-defined-field catalog. | query: Query Contact records with a JSON filter. | resolve: Resolve a Contact from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Contact 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 contact records by text (contains on the searchable fields). (under a company). Bounds: Sensitive. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. Sensitive. Bounded: limit default 25, max 500. Sensitive. 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.",
725
725
  "annotations": {
726
726
  "readOnlyHint": true,
727
727
  "destructiveHint": false,
@@ -955,7 +955,7 @@
955
955
  "openWorldHint": true
956
956
  },
957
957
  "purpose": "Query Contact records with a JSON filter.",
958
- "bounds": "Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Sensitive."
958
+ "bounds": "Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. Sensitive."
959
959
  },
960
960
  {
961
961
  "op": "contacts.resolve",
@@ -1268,7 +1268,7 @@
1268
1268
  "entity": "company",
1269
1269
  "apiEntity": "companies",
1270
1270
  "effectLine": "effect=read only — zero mutating requests, ungated by design",
1271
- "description": "Read company records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for companies: count: Count company records matching a JSON filter. | fullProfile: Get everything the node knows about one company in a single call: the company record, its locations, contacts and notes, its open tickets, and its projects — every part separately reported with caps. | get: Get one Company by id. | getContext: Get a company with its primary context records in one call. | getEntityInfo: Get the Company capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Company 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 Company user-defined-field catalog. | prepareCrmWrite: Plan a CRM write: from partial company/contact details, find the company, its locations and the location to link a contact to, duplicate contacts, the required fields still missing (with how to get each) and the next atomic write to preview. | query: Query Company records with a JSON filter. | resolve: Resolve a Company from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (companyName — exact match only). Returns the Company 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 company records by text (contains on the searchable fields). | searchByDomain: Find companies whose web address matches a domain (when no web address matches, the op falls back to matching contact emails). | searchByIdentity: Find companies by any combination of companyName / email / website identity values. | unbilledWork: One call for a company's unbilled work: its posted billing items (per source), the time behind them (joined through the company's tickets and tasks — time entries carry no companyID), the per-ticket rollup, the unposted anti-join section, ex-tax totals + hours, and the billing-vs-time warnings. 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.",
1271
+ "description": "Read company records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for companies: count: Count company records matching a JSON filter. | fullProfile: Get everything the node knows about one company in a single call: the company record, its locations, contacts and notes, its open tickets, and its projects — every part separately reported with caps. | get: Get one Company by id. | getContext: Get a company with its primary context records in one call. | getEntityInfo: Get the Company capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Company 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 Company user-defined-field catalog. | prepareCrmWrite: Plan a CRM write: from partial company/contact details, find the company, its locations and the location to link a contact to, duplicate contacts, the required fields still missing (with how to get each) and the next atomic write to preview. | query: Query Company records with a JSON filter. | resolve: Resolve a Company from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (companyName — exact match only). Returns the Company 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 company records by text (contains on the searchable fields). | searchByDomain: Find companies whose web address matches a domain (when no web address matches, the op falls back to matching contact emails). | searchByIdentity: Find companies by any combination of companyName / email / website identity values. | unbilledWork: One call for a company's unbilled work: its posted billing items (per source), the time behind them (joined through the company's tickets and tasks — time entries carry no companyID), the per-ticket rollup, the unposted anti-join section, ex-tax totals + hours, and the billing-vs-time warnings. Bounds: Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.",
1272
1272
  "annotations": {
1273
1273
  "readOnlyHint": true,
1274
1274
  "destructiveHint": false,
@@ -1509,7 +1509,7 @@
1509
1509
  "openWorldHint": true
1510
1510
  },
1511
1511
  "purpose": "Query Company records with a JSON filter.",
1512
- "bounds": "Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation."
1512
+ "bounds": "Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows."
1513
1513
  },
1514
1514
  {
1515
1515
  "op": "companies.resolve",
@@ -1840,7 +1840,7 @@
1840
1840
  "entity": "companyLocation",
1841
1841
  "apiEntity": "company_locations",
1842
1842
  "effectLine": "effect=read only — zero mutating requests, ungated by design",
1843
- "description": "Read companyLocation records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for company_locations: count: Count company location records matching a JSON filter. | get: Get one CompanyLocation by id. | getEntityInfo: Get the CompanyLocation capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the CompanyLocation 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 CompanyLocation user-defined-field catalog. | query: Query CompanyLocation records with a JSON filter. | resolve: Resolve a company location from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (name — exact match only). Returns the Company location 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 company location records by text (contains on the searchable fields).. 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.",
1843
+ "description": "Read companyLocation records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for company_locations: count: Count company location records matching a JSON filter. | get: Get one CompanyLocation by id. | getEntityInfo: Get the CompanyLocation capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the CompanyLocation 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 CompanyLocation user-defined-field catalog. | query: Query CompanyLocation records with a JSON filter. | resolve: Resolve a company location from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (name — exact match only). Returns the Company location 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 company location records by text (contains on the searchable fields).. Bounds: Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.",
1844
1844
  "annotations": {
1845
1845
  "readOnlyHint": true,
1846
1846
  "destructiveHint": false,
@@ -2002,7 +2002,7 @@
2002
2002
  "openWorldHint": true
2003
2003
  },
2004
2004
  "purpose": "Query CompanyLocation records with a JSON filter.",
2005
- "bounds": "Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation."
2005
+ "bounds": "Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows."
2006
2006
  },
2007
2007
  {
2008
2008
  "op": "company_locations.resolve",
@@ -2214,7 +2214,7 @@
2214
2214
  "entity": "ticketNote",
2215
2215
  "apiEntity": "ticket_notes",
2216
2216
  "effectLine": "effect=read only — zero mutating requests, ungated by design",
2217
- "description": "Read ticketNote records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for ticket_notes: count: Count ticket note records matching a JSON filter. | get: Get one TicketNote by id. | getEntityInfo: Get the TicketNote capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the TicketNote 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 TicketNote user-defined-field catalog. | query: Query TicketNote records with a JSON filter. | resolve: Resolve a ticket note from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error.. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. 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.",
2217
+ "description": "Read ticketNote records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for ticket_notes: count: Count ticket note records matching a JSON filter. | get: Get one TicketNote by id. | getEntityInfo: Get the TicketNote capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the TicketNote 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 TicketNote user-defined-field catalog. | query: Query TicketNote records with a JSON filter. | resolve: Resolve a ticket note from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error.. Bounds: Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.",
2218
2218
  "annotations": {
2219
2219
  "readOnlyHint": true,
2220
2220
  "destructiveHint": false,
@@ -2376,7 +2376,7 @@
2376
2376
  "openWorldHint": true
2377
2377
  },
2378
2378
  "purpose": "Query TicketNote records with a JSON filter.",
2379
- "bounds": "Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation."
2379
+ "bounds": "Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows."
2380
2380
  },
2381
2381
  {
2382
2382
  "op": "ticket_notes.resolve",
@@ -2554,7 +2554,7 @@
2554
2554
  "entity": "resource",
2555
2555
  "apiEntity": "resources",
2556
2556
  "effectLine": "effect=read only — zero mutating requests, ungated by design",
2557
- "description": "Read resource records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for resources: count: Count resource records matching a JSON filter. | get: Get one Resource by id. | getEntityInfo: Get the Resource capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Resource 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 Resource user-defined-field catalog. | query: Query Resource records with a JSON filter. | resolve: Resolve a resource from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Resource 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 resource records by text (contains on the searchable fields). | whoAmI: Identify the resource the current credentials act as.. Bounds: Sensitive. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Sensitive. Bounded: limit default 25, max 500. Sensitive. 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.",
2557
+ "description": "Read resource records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for resources: count: Count resource records matching a JSON filter. | get: Get one Resource by id. | getEntityInfo: Get the Resource capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Resource 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 Resource user-defined-field catalog. | query: Query Resource records with a JSON filter. | resolve: Resolve a resource from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Resource 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 resource records by text (contains on the searchable fields). | whoAmI: Identify the resource the current credentials act as.. Bounds: Sensitive. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. Sensitive. Bounded: limit default 25, max 500. Sensitive. 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.",
2558
2558
  "annotations": {
2559
2559
  "readOnlyHint": true,
2560
2560
  "destructiveHint": false,
@@ -2723,7 +2723,7 @@
2723
2723
  "openWorldHint": true
2724
2724
  },
2725
2725
  "purpose": "Query Resource records with a JSON filter.",
2726
- "bounds": "Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Sensitive."
2726
+ "bounds": "Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. Sensitive."
2727
2727
  },
2728
2728
  {
2729
2729
  "op": "resources.resolve",
@@ -2965,7 +2965,7 @@
2965
2965
  "entity": "timeEntry",
2966
2966
  "apiEntity": "time_entries",
2967
2967
  "effectLine": "effect=read only — zero mutating requests, ungated by design",
2968
- "description": "Read timeEntry records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for time_entries: count: Count time entry records matching a JSON filter. | customRange: Get time entries for an explicit dateWorked range. | dateWorkedWindow: The unambiguous-named alias for time_entries.postedWithin (issue #66): the dateWorked window read with the posted/unposted split derived from the billing_items.timeEntryID join — same wire, same result (incl. truncated). The window is ON dateWorked (entries worked within [from, to]); \"postedWithin\" keeps its historical name (its \"posted\" is the posted/unposted split, never a posted-date window or a postedDate read). | get: Get one TimeEntry by id. | getEntityInfo: Get the TimeEntry capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the TimeEntry field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getPosted: Get posted time entries (an entry that a billing item references), optionally for one ticket and/or a dateWorked window — posted state derives from the billing_items.timeEntryID join, never a postedDate read or approval. | getUdfInfo: Get the TimeEntry user-defined-field catalog. | getUnposted: Get unposted time entries (entries no billing item references), optionally for one ticket and/or a dateWorked window — posted state derives from the billing_items.timeEntryID join, never a postedDate read or approval. | last14: Get time entries for the last 14 days (rolling, dateWorked). | last24h: Get time entries for the last 24 hours (rolling, dateWorked). | last30: Get time entries for the last 30 days (rolling, dateWorked). | last7: Get time entries for the last 7 days (rolling, dateWorked). | last90: Get time entries for the last 90 days (rolling, dateWorked). | lastFullFortnight: Get time entries for the last complete fortnight. | lastFullMonth: Get time entries for the last complete calendar month. | lastFullQuarter: Get time entries for the last complete calendar quarter. | lastFullWeek: Get time entries for the last complete calendar week. | postedWithin: Get time entries WORKED within an inclusive dateWorked window with the posted/unposted split. The window is ON the dateWorked field — the name's \"posted\" is the posted/unposted SPLIT derived from the billing_items.timeEntryID join (an entry a billing item references is posted, approval is not consulted), never a posted-date window or a postedDate read. The counts cover the returned rows only; truncated flags a capped read. time_entries.dateWorkedWindow is the unambiguous name. | query: Query TimeEntry records with a JSON filter. | resolve: Resolve a time entry from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error. | today: Get time entries for today (dateWorked = now, server date). | yesterday: Get time entries for yesterday (dateWorked = yesterday, server date).. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. 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.",
2968
+ "description": "Read timeEntry records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for time_entries: count: Count time entry records matching a JSON filter. | customRange: Get time entries for an explicit dateWorked range. | dateWorkedWindow: The unambiguous-named alias for time_entries.postedWithin (issue #66): the dateWorked window read with the posted/unposted split derived from the billing_items.timeEntryID join — same wire, same result (incl. truncated). The window is ON dateWorked (entries worked within [from, to]); \"postedWithin\" keeps its historical name (its \"posted\" is the posted/unposted split, never a posted-date window or a postedDate read). | get: Get one TimeEntry by id. | getEntityInfo: Get the TimeEntry capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the TimeEntry field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getPosted: Get posted time entries (an entry that a billing item references), optionally for one ticket and/or a dateWorked window — posted state derives from the billing_items.timeEntryID join, never a postedDate read or approval. | getUdfInfo: Get the TimeEntry user-defined-field catalog. | getUnposted: Get unposted time entries (entries no billing item references), optionally for one ticket and/or a dateWorked window — posted state derives from the billing_items.timeEntryID join, never a postedDate read or approval. | last14: Get time entries for the last 14 days (rolling, dateWorked). | last24h: Get time entries for the last 24 hours (rolling, dateWorked). | last30: Get time entries for the last 30 days (rolling, dateWorked). | last7: Get time entries for the last 7 days (rolling, dateWorked). | last90: Get time entries for the last 90 days (rolling, dateWorked). | lastFullFortnight: Get time entries for the last complete fortnight. | lastFullMonth: Get time entries for the last complete calendar month. | lastFullQuarter: Get time entries for the last complete calendar quarter. | lastFullWeek: Get time entries for the last complete calendar week. | postedWithin: Get time entries WORKED within an inclusive dateWorked window with the posted/unposted split. The window is ON the dateWorked field — the name's \"posted\" is the posted/unposted SPLIT derived from the billing_items.timeEntryID join (an entry a billing item references is posted, approval is not consulted), never a posted-date window or a postedDate read. The counts cover the returned rows only; truncated flags a capped read. time_entries.dateWorkedWindow is the unambiguous name. | query: Query TimeEntry records with a JSON filter. | resolve: Resolve a time entry from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error. | today: Get time entries for today (dateWorked = now, server date). | yesterday: Get time entries for yesterday (dateWorked = yesterday, server date).. Bounds: Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.",
2969
2969
  "annotations": {
2970
2970
  "readOnlyHint": true,
2971
2971
  "destructiveHint": false,
@@ -3446,7 +3446,7 @@
3446
3446
  "openWorldHint": true
3447
3447
  },
3448
3448
  "purpose": "Query TimeEntry records with a JSON filter.",
3449
- "bounds": "Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation."
3449
+ "bounds": "Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows."
3450
3450
  },
3451
3451
  {
3452
3452
  "op": "time_entries.resolve",
@@ -3843,7 +3843,7 @@
3843
3843
  }
3844
3844
  ],
3845
3845
  "stats": {
3846
- "registryRecords": 1281,
3846
+ "registryRecords": 1282,
3847
3847
  "curatedEntities": 7,
3848
3848
  "includedEntities": 7,
3849
3849
  "readTools": 7,
@@ -3854,6 +3854,6 @@
3854
3854
  "approvalGatedWrites": 2,
3855
3855
  "destructiveExcluded": 4
3856
3856
  },
3857
- "capabilitiesHash": "5c62553190a68829af1e554abc22fd9187edf78a0314a63fbf6706e98de0cbe4",
3857
+ "capabilitiesHash": "7cf0032e0744a559430781aeafbd3984b708e71f04b850011e08fbf113eaadcc",
3858
3858
  "curationHash": "e19117ce73e38d9aded3be7e7f077a4e185d2e10294622b76c17d67f63cf9e3b"
3859
3859
  }
@@ -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-31T20:17:42.452Z — do not hand-edit. -->
3
+ <!-- GENERATED by scripts/project-n8n-mcp.mjs at 2026-11-01T01:23:14.190Z — 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
@@ -40,7 +40,7 @@ user's n8n instances; PROD is read-only for any verification).
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. | 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. | lineOfBusiness: Get the full Line of Business chain for one ticket in a single call: the association, the OrganizationalLevel2 (the customizable 'Line of Business' label) and the OrganizationalLevel1 (the division). | 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.
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. | lineOfBusiness: Get the full Line of Business chain for one ticket in a single call: the association, the OrganizationalLevel2 (the customizable 'Line of Business' label) and the OrganizationalLevel1 (the division). | 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 — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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
  |------------------|------|--------|-------|--------------|---------|
@@ -54,7 +54,7 @@ user's n8n instances; PROD is read-only for any verification).
54
54
  | `tickets.getFieldInfo` | getFieldInfo | read | — | none | 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). |
55
55
  | `tickets.getUdfInfo` | getUdfInfo | read | — | none | Get the Ticket user-defined-field catalog. |
56
56
  | `tickets.lineOfBusiness` | lineOfBusiness | read | — | ticketId | Get the full Line of Business chain for one ticket in a single call: the association, the OrganizationalLevel2 (the customizable 'Line of Business' label) and the OrganizationalLevel1 (the division). |
57
- | `tickets.query` | query | read | — | none | Query Ticket records with a JSON filter. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. |
57
+ | `tickets.query` | query | read | — | none | Query Ticket records with a JSON filter. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. |
58
58
  | `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). |
59
59
  | `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. |
60
60
  | `tickets.slaHealthCheck` | slaHealthCheck | read | — | id | Run the SLA health check for a ticket (numeric ticket id). |
@@ -77,7 +77,7 @@ Tool input: {"operation":{"type":"string","enum":["changeStatus","create","openW
77
77
 
78
78
  ### `autotask_contact` (read — contact)
79
79
 
80
- > Read contact records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for contacts: count: Count contact records matching a JSON filter. (under a company) | findByEmail: Find a contact by email address. | get: Get one Contact by id. | getContext: Get a contact with its primary context records in one call. (under a company) | getEntityInfo: Get the Contact capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Contact 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 Contact user-defined-field catalog. | query: Query Contact records with a JSON filter. | resolve: Resolve a Contact from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Contact 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 contact records by text (contains on the searchable fields). (under a company). Bounds: Sensitive. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Sensitive. Bounded: limit default 25, max 500. Sensitive. 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.
80
+ > Read contact records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for contacts: count: Count contact records matching a JSON filter. (under a company) | findByEmail: Find a contact by email address. | get: Get one Contact by id. | getContext: Get a contact with its primary context records in one call. (under a company) | getEntityInfo: Get the Contact capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Contact 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 Contact user-defined-field catalog. | query: Query Contact records with a JSON filter. | resolve: Resolve a Contact from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Contact 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 contact records by text (contains on the searchable fields). (under a company). Bounds: Sensitive. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. Sensitive. Bounded: limit default 25, max 500. Sensitive. 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.
81
81
 
82
82
  | backingOperation | verb | effect | flags | requiredArgs | purpose |
83
83
  |------------------|------|--------|-------|--------------|---------|
@@ -88,7 +88,7 @@ Tool input: {"operation":{"type":"string","enum":["changeStatus","create","openW
88
88
  | `contacts.getEntityInfo` | getEntityInfo | read | sensitive | none | Get the Contact capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). Sensitive. |
89
89
  | `contacts.getFieldInfo` | getFieldInfo | read | sensitive | none | Get the Contact field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). Sensitive. |
90
90
  | `contacts.getUdfInfo` | getUdfInfo | read | sensitive | none | Get the Contact user-defined-field catalog. Sensitive. |
91
- | `contacts.query` | query | read | sensitive | none | Query Contact records with a JSON filter. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Sensitive. |
91
+ | `contacts.query` | query | read | sensitive | none | Query Contact records with a JSON filter. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. Sensitive. |
92
92
  | `contacts.resolve` | resolve | read | sensitive | identifier | Resolve a Contact from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Contact 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). Sensitive. |
93
93
  | `contacts.search` | search | read | sensitive | query | Search contact records by text (contains on the searchable fields). (under a company) Bounded: limit default 25, max 500. Sensitive. |
94
94
 
@@ -107,7 +107,7 @@ Tool input: {"operation":{"type":"string","enum":["create","moveToCompany","upda
107
107
 
108
108
  ### `autotask_company` (read — company)
109
109
 
110
- > Read company records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for companies: count: Count company records matching a JSON filter. | fullProfile: Get everything the node knows about one company in a single call: the company record, its locations, contacts and notes, its open tickets, and its projects — every part separately reported with caps. | get: Get one Company by id. | getContext: Get a company with its primary context records in one call. | getEntityInfo: Get the Company capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Company 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 Company user-defined-field catalog. | prepareCrmWrite: Plan a CRM write: from partial company/contact details, find the company, its locations and the location to link a contact to, duplicate contacts, the required fields still missing (with how to get each) and the next atomic write to preview. | query: Query Company records with a JSON filter. | resolve: Resolve a Company from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (companyName — exact match only). Returns the Company 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 company records by text (contains on the searchable fields). | searchByDomain: Find companies whose web address matches a domain (when no web address matches, the op falls back to matching contact emails). | searchByIdentity: Find companies by any combination of companyName / email / website identity values. | unbilledWork: One call for a company's unbilled work: its posted billing items (per source), the time behind them (joined through the company's tickets and tasks — time entries carry no companyID), the per-ticket rollup, the unposted anti-join section, ex-tax totals + hours, and the billing-vs-time warnings. 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.
110
+ > Read company records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for companies: count: Count company records matching a JSON filter. | fullProfile: Get everything the node knows about one company in a single call: the company record, its locations, contacts and notes, its open tickets, and its projects — every part separately reported with caps. | get: Get one Company by id. | getContext: Get a company with its primary context records in one call. | getEntityInfo: Get the Company capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Company 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 Company user-defined-field catalog. | prepareCrmWrite: Plan a CRM write: from partial company/contact details, find the company, its locations and the location to link a contact to, duplicate contacts, the required fields still missing (with how to get each) and the next atomic write to preview. | query: Query Company records with a JSON filter. | resolve: Resolve a Company from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (companyName — exact match only). Returns the Company 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 company records by text (contains on the searchable fields). | searchByDomain: Find companies whose web address matches a domain (when no web address matches, the op falls back to matching contact emails). | searchByIdentity: Find companies by any combination of companyName / email / website identity values. | unbilledWork: One call for a company's unbilled work: its posted billing items (per source), the time behind them (joined through the company's tickets and tasks — time entries carry no companyID), the per-ticket rollup, the unposted anti-join section, ex-tax totals + hours, and the billing-vs-time warnings. Bounds: Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.
111
111
 
112
112
  | backingOperation | verb | effect | flags | requiredArgs | purpose |
113
113
  |------------------|------|--------|-------|--------------|---------|
@@ -119,7 +119,7 @@ Tool input: {"operation":{"type":"string","enum":["create","moveToCompany","upda
119
119
  | `companies.getFieldInfo` | getFieldInfo | read | — | none | Get the Company field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). |
120
120
  | `companies.getUdfInfo` | getUdfInfo | read | — | none | Get the Company user-defined-field catalog. |
121
121
  | `companies.prepareCrmWrite` | prepareCrmWrite | read | — | input | Plan a CRM write: from partial company/contact details, find the company, its locations and the location to link a contact to, duplicate contacts, the required fields still missing (with how to get each) and the next atomic write to preview. |
122
- | `companies.query` | query | read | — | none | Query Company records with a JSON filter. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. |
122
+ | `companies.query` | query | read | — | none | Query Company records with a JSON filter. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. |
123
123
  | `companies.resolve` | resolve | read | — | identifier | Resolve a Company from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (companyName — exact match only). Returns the Company 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). |
124
124
  | `companies.search` | search | read | — | query | Search company records by text (contains on the searchable fields). Bounded: limit default 25, max 500. |
125
125
  | `companies.searchByDomain` | searchByDomain | read | — | domain | Find companies whose web address matches a domain (when no web address matches, the op falls back to matching contact emails). |
@@ -140,7 +140,7 @@ Tool input: {"operation":{"type":"string","enum":["create","update","upsertByNam
140
140
 
141
141
  ### `autotask_companyLocation` (read — companyLocation)
142
142
 
143
- > Read companyLocation records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for company_locations: count: Count company location records matching a JSON filter. | get: Get one CompanyLocation by id. | getEntityInfo: Get the CompanyLocation capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the CompanyLocation 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 CompanyLocation user-defined-field catalog. | query: Query CompanyLocation records with a JSON filter. | resolve: Resolve a company location from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (name — exact match only). Returns the Company location 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 company location records by text (contains on the searchable fields).. 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.
143
+ > Read companyLocation records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for company_locations: count: Count company location records matching a JSON filter. | get: Get one CompanyLocation by id. | getEntityInfo: Get the CompanyLocation capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the CompanyLocation 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 CompanyLocation user-defined-field catalog. | query: Query CompanyLocation records with a JSON filter. | resolve: Resolve a company location from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (name — exact match only). Returns the Company location 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 company location records by text (contains on the searchable fields).. Bounds: Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.
144
144
 
145
145
  | backingOperation | verb | effect | flags | requiredArgs | purpose |
146
146
  |------------------|------|--------|-------|--------------|---------|
@@ -149,7 +149,7 @@ Tool input: {"operation":{"type":"string","enum":["create","update","upsertByNam
149
149
  | `company_locations.getEntityInfo` | getEntityInfo | read | — | none | Get the CompanyLocation capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). |
150
150
  | `company_locations.getFieldInfo` | getFieldInfo | read | — | none | Get the CompanyLocation field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). |
151
151
  | `company_locations.getUdfInfo` | getUdfInfo | read | — | none | Get the CompanyLocation user-defined-field catalog. |
152
- | `company_locations.query` | query | read | — | none | Query CompanyLocation records with a JSON filter. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. |
152
+ | `company_locations.query` | query | read | — | none | Query CompanyLocation records with a JSON filter. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. |
153
153
  | `company_locations.resolve` | resolve | read | — | identifier | Resolve a company location from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (name — exact match only). Returns the Company location 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). |
154
154
  | `company_locations.search` | search | read | — | query | Search company location records by text (contains on the searchable fields). Bounded: limit default 25, max 500. |
155
155
 
@@ -166,7 +166,7 @@ Tool input: {"operation":{"type":"string","enum":["create","update"]},"parentId"
166
166
 
167
167
  ### `autotask_ticketNote` (read — ticketNote)
168
168
 
169
- > Read ticketNote records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for ticket_notes: count: Count ticket note records matching a JSON filter. | get: Get one TicketNote by id. | getEntityInfo: Get the TicketNote capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the TicketNote 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 TicketNote user-defined-field catalog. | query: Query TicketNote records with a JSON filter. | resolve: Resolve a ticket note from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error.. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. 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.
169
+ > Read ticketNote records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for ticket_notes: count: Count ticket note records matching a JSON filter. | get: Get one TicketNote by id. | getEntityInfo: Get the TicketNote capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the TicketNote 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 TicketNote user-defined-field catalog. | query: Query TicketNote records with a JSON filter. | resolve: Resolve a ticket note from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error.. Bounds: Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.
170
170
 
171
171
  | backingOperation | verb | effect | flags | requiredArgs | purpose |
172
172
  |------------------|------|--------|-------|--------------|---------|
@@ -175,7 +175,7 @@ Tool input: {"operation":{"type":"string","enum":["create","update"]},"parentId"
175
175
  | `ticket_notes.getEntityInfo` | getEntityInfo | read | — | none | Get the TicketNote capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). |
176
176
  | `ticket_notes.getFieldInfo` | getFieldInfo | read | — | none | Get the TicketNote field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). |
177
177
  | `ticket_notes.getUdfInfo` | getUdfInfo | read | — | none | Get the TicketNote user-defined-field catalog. |
178
- | `ticket_notes.query` | query | read | — | none | Query TicketNote records with a JSON filter. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. |
178
+ | `ticket_notes.query` | query | read | — | none | Query TicketNote records with a JSON filter. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. |
179
179
  | `ticket_notes.resolve` | resolve | read | — | identifier | Resolve a ticket note from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error. |
180
180
 
181
181
  ### `autotask_ticketNote_write` (write — ticketNote)
@@ -191,7 +191,7 @@ Tool input: {"operation":{"type":"string","enum":["create","update"]},"parentId"
191
191
 
192
192
  ### `autotask_resource` (read — resource)
193
193
 
194
- > Read resource records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for resources: count: Count resource records matching a JSON filter. | get: Get one Resource by id. | getEntityInfo: Get the Resource capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Resource 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 Resource user-defined-field catalog. | query: Query Resource records with a JSON filter. | resolve: Resolve a resource from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Resource 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 resource records by text (contains on the searchable fields). | whoAmI: Identify the resource the current credentials act as.. Bounds: Sensitive. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Sensitive. Bounded: limit default 25, max 500. Sensitive. 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.
194
+ > Read resource records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for resources: count: Count resource records matching a JSON filter. | get: Get one Resource by id. | getEntityInfo: Get the Resource capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Resource 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 Resource user-defined-field catalog. | query: Query Resource records with a JSON filter. | resolve: Resolve a resource from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Resource 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 resource records by text (contains on the searchable fields). | whoAmI: Identify the resource the current credentials act as.. Bounds: Sensitive. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. Sensitive. Bounded: limit default 25, max 500. Sensitive. 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.
195
195
 
196
196
  | backingOperation | verb | effect | flags | requiredArgs | purpose |
197
197
  |------------------|------|--------|-------|--------------|---------|
@@ -200,7 +200,7 @@ Tool input: {"operation":{"type":"string","enum":["create","update"]},"parentId"
200
200
  | `resources.getEntityInfo` | getEntityInfo | read | sensitive | none | Get the Resource capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). Sensitive. |
201
201
  | `resources.getFieldInfo` | getFieldInfo | read | sensitive | none | Get the Resource field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). Sensitive. |
202
202
  | `resources.getUdfInfo` | getUdfInfo | read | sensitive | none | Get the Resource user-defined-field catalog. Sensitive. |
203
- | `resources.query` | query | read | sensitive | none | Query Resource records with a JSON filter. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Sensitive. |
203
+ | `resources.query` | query | read | sensitive | none | Query Resource records with a JSON filter. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. Sensitive. |
204
204
  | `resources.resolve` | resolve | read | sensitive | identifier | Resolve a resource from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (firstName + lastName — exact match only). Returns the Resource 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). Sensitive. |
205
205
  | `resources.search` | search | read | sensitive | query | Search resource records by text (contains on the searchable fields). Bounded: limit default 25, max 500. Sensitive. |
206
206
  | `resources.whoAmI` | whoAmI | read | sensitive | none | Identify the resource the current credentials act as. Sensitive. |
@@ -218,7 +218,7 @@ Tool input: {"operation":{"type":"string","enum":["transferOwnership","update"]}
218
218
 
219
219
  ### `autotask_timeEntry` (read — timeEntry)
220
220
 
221
- > Read timeEntry records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for time_entries: count: Count time entry records matching a JSON filter. | customRange: Get time entries for an explicit dateWorked range. | dateWorkedWindow: The unambiguous-named alias for time_entries.postedWithin (issue #66): the dateWorked window read with the posted/unposted split derived from the billing_items.timeEntryID join — same wire, same result (incl. truncated). The window is ON dateWorked (entries worked within [from, to]); "postedWithin" keeps its historical name (its "posted" is the posted/unposted split, never a posted-date window or a postedDate read). | get: Get one TimeEntry by id. | getEntityInfo: Get the TimeEntry capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the TimeEntry field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getPosted: Get posted time entries (an entry that a billing item references), optionally for one ticket and/or a dateWorked window — posted state derives from the billing_items.timeEntryID join, never a postedDate read or approval. | getUdfInfo: Get the TimeEntry user-defined-field catalog. | getUnposted: Get unposted time entries (entries no billing item references), optionally for one ticket and/or a dateWorked window — posted state derives from the billing_items.timeEntryID join, never a postedDate read or approval. | last14: Get time entries for the last 14 days (rolling, dateWorked). | last24h: Get time entries for the last 24 hours (rolling, dateWorked). | last30: Get time entries for the last 30 days (rolling, dateWorked). | last7: Get time entries for the last 7 days (rolling, dateWorked). | last90: Get time entries for the last 90 days (rolling, dateWorked). | lastFullFortnight: Get time entries for the last complete fortnight. | lastFullMonth: Get time entries for the last complete calendar month. | lastFullQuarter: Get time entries for the last complete calendar quarter. | lastFullWeek: Get time entries for the last complete calendar week. | postedWithin: Get time entries WORKED within an inclusive dateWorked window with the posted/unposted split. The window is ON the dateWorked field — the name's "posted" is the posted/unposted SPLIT derived from the billing_items.timeEntryID join (an entry a billing item references is posted, approval is not consulted), never a posted-date window or a postedDate read. The counts cover the returned rows only; truncated flags a capped read. time_entries.dateWorkedWindow is the unambiguous name. | query: Query TimeEntry records with a JSON filter. | resolve: Resolve a time entry from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error. | today: Get time entries for today (dateWorked = now, server date). | yesterday: Get time entries for yesterday (dateWorked = yesterday, server date).. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. 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.
221
+ > Read timeEntry records (mode: read — effect=read operations only; zero mutating requests, ungated by design). Registry operations for time_entries: count: Count time entry records matching a JSON filter. | customRange: Get time entries for an explicit dateWorked range. | dateWorkedWindow: The unambiguous-named alias for time_entries.postedWithin (issue #66): the dateWorked window read with the posted/unposted split derived from the billing_items.timeEntryID join — same wire, same result (incl. truncated). The window is ON dateWorked (entries worked within [from, to]); "postedWithin" keeps its historical name (its "posted" is the posted/unposted split, never a posted-date window or a postedDate read). | get: Get one TimeEntry by id. | getEntityInfo: Get the TimeEntry capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the TimeEntry field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getPosted: Get posted time entries (an entry that a billing item references), optionally for one ticket and/or a dateWorked window — posted state derives from the billing_items.timeEntryID join, never a postedDate read or approval. | getUdfInfo: Get the TimeEntry user-defined-field catalog. | getUnposted: Get unposted time entries (entries no billing item references), optionally for one ticket and/or a dateWorked window — posted state derives from the billing_items.timeEntryID join, never a postedDate read or approval. | last14: Get time entries for the last 14 days (rolling, dateWorked). | last24h: Get time entries for the last 24 hours (rolling, dateWorked). | last30: Get time entries for the last 30 days (rolling, dateWorked). | last7: Get time entries for the last 7 days (rolling, dateWorked). | last90: Get time entries for the last 90 days (rolling, dateWorked). | lastFullFortnight: Get time entries for the last complete fortnight. | lastFullMonth: Get time entries for the last complete calendar month. | lastFullQuarter: Get time entries for the last complete calendar quarter. | lastFullWeek: Get time entries for the last complete calendar week. | postedWithin: Get time entries WORKED within an inclusive dateWorked window with the posted/unposted split. The window is ON the dateWorked field — the name's "posted" is the posted/unposted SPLIT derived from the billing_items.timeEntryID join (an entry a billing item references is posted, approval is not consulted), never a posted-date window or a postedDate read. The counts cover the returned rows only; truncated flags a capped read. time_entries.dateWorkedWindow is the unambiguous name. | query: Query TimeEntry records with a JSON filter. | resolve: Resolve a time entry from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error. | today: Get time entries for today (dateWorked = now, server date). | yesterday: Get time entries for yesterday (dateWorked = yesterday, server date).. Bounds: Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. 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.
222
222
 
223
223
  | backingOperation | verb | effect | flags | requiredArgs | purpose |
224
224
  |------------------|------|--------|-------|--------------|---------|
@@ -241,7 +241,7 @@ Tool input: {"operation":{"type":"string","enum":["transferOwnership","update"]}
241
241
  | `time_entries.lastFullQuarter` | lastFullQuarter | read | — | none | Get time entries for the last complete calendar quarter. |
242
242
  | `time_entries.lastFullWeek` | lastFullWeek | read | — | none | Get time entries for the last complete calendar week. |
243
243
  | `time_entries.postedWithin` | postedWithin | read | — | from, to | Get time entries WORKED within an inclusive dateWorked window with the posted/unposted split. The window is ON the dateWorked field — the name's "posted" is the posted/unposted SPLIT derived from the billing_items.timeEntryID join (an entry a billing item references is posted, approval is not consulted), never a posted-date window or a postedDate read. The counts cover the returned rows only; truncated flags a capped read. time_entries.dateWorkedWindow is the unambiguous name. |
244
- | `time_entries.query` | query | read | — | none | Query TimeEntry records with a JSON filter. Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. |
244
+ | `time_entries.query` | query | read | — | none | Query TimeEntry records with a JSON filter. Bounded: server-side pagination — ordinary limit default 500, max 2500; walk.maxRows independently sets the total cap, with pages at most min(500, limit); 1000-page guard; hasMore/truncated flag remaining rows. |
245
245
  | `time_entries.resolve` | resolve | read | — | identifier | Resolve a time entry from a numeric id (the direct fetch) only — this resource has no searchable text field, so a non-numeric identifier throws a config error. |
246
246
  | `time_entries.today` | today | read | — | none | Get time entries for today (dateWorked = now, server date). |
247
247
  | `time_entries.yesterday` | yesterday | read | — | none | Get time entries for yesterday (dateWorked = yesterday, server date). |
@@ -275,7 +275,7 @@ only via a recorded change to `n8n-mcp.curation.json`.
275
275
 
276
276
  ## Stats
277
277
 
278
- - registryRecords: 1281
278
+ - registryRecords: 1282
279
279
  - curatedEntities: 7
280
280
  - includedEntities: 7
281
281
  - readTools: 7
@@ -288,6 +288,6 @@ only via a recorded change to `n8n-mcp.curation.json`.
288
288
 
289
289
  ## Meta
290
290
 
291
- - generatedAt: 2026-10-31T20:17:42.452Z
292
- - capabilitiesHash: 5c62553190a68829af1e554abc22fd9187edf78a0314a63fbf6706e98de0cbe4
291
+ - generatedAt: 2026-11-01T01:23:14.190Z
292
+ - capabilitiesHash: 7cf0032e0744a559430781aeafbd3984b708e71f04b850011e08fbf113eaadcc
293
293
  - curationHash: e19117ce73e38d9aded3be7e7f077a4e185d2e10294622b76c17d67f63cf9e3b
package/README.md CHANGED
@@ -47,6 +47,8 @@ const autotask = new AutotaskClient({
47
47
 
48
48
  // 2. Bounded query — the preferred read: ONE call returns up to `limit` TOTAL
49
49
  // records (server-side pagination inside the SDK; default 500, max 2500).
50
+ // For larger exports, `walk: { maxRows: 10_000 }` sets an independent total
51
+ // cap; `limit` then sizes pages (max 500). Check the returned `truncated` flag.
50
52
  // `maxRecords` is only the wire page size (default 10, max 500) — a raw
51
53
  // `query()`/`queryAll()` walk has NO total cap. `includeFields` slims the
52
54
  // payload (the context lever: only those fields + id come back).
@@ -242,7 +244,7 @@ The primary import re-exports everything; deep subpaths keep bundles small:
242
244
 
243
245
  ```ts
244
246
  // Cross-resource helpers (the agent execution layer)
245
- import { searchAcrossResources, resolveAny, invoke } from 'node-autotask/operations';
247
+ import { searchAcrossResources, resolveAny, resolveStaff, sanitiseResult, invoke } from 'node-autotask/operations';
246
248
 
247
249
  // The generated capability registry (zero-import plain literals)
248
250
  import { CAPABILITIES, CAPABILITY_GROUPS, CAPABILITY_PLAN_HASHES } from 'node-autotask/capabilities';
@@ -340,24 +342,9 @@ The SDK ships the mechanical substrate, not a server (no MCP imports, no zod):
340
342
  required); cross-mode calls are refused before any request (single
341
343
  governor place: `src/operations/invoke.ts`).
342
344
 
343
- **Harness approval policy (recommended).** Require approval on every tool
344
- whose MCP annotation is `readOnlyHint !== true` — today exactly **267
345
- tools**: the 265 dedicated write/delete tools (209 `effect=write` + 56
346
- `effect=destructive`, every one of them has a dedicated tool) +
347
- `autotask_write` + `autotask_delete`. The remaining **635 tools** (the 622 dedicated read tools + the 10 core read tools + `autotask_read` +
348
- `autotask_catalog` + `autotask_describe`) all carry `readOnlyHint: true`
349
- and are safe ungated: every op they can route is `effect=read` (zero
350
- mutating requests — pinned by the test inventory). Refined class for the
351
- highest-risk ops: the **57 tools with `destructiveHint: true`** (56
352
- dedicated delete tools + `autotask_delete`) additionally require
353
- `confirm === <operation key>` even inside `autotask_delete`, and the 3
354
- approval-gated writes (`configuration_items.moveConfigurationItem`,
355
- `contacts.moveToCompany`, `resources.transferOwnership`) require the same
356
- confirm inside `autotask_write`. Migration: `autotask_invoke` is REPLACED
357
- by `autotask_read`/`autotask_write`/`autotask_delete` — update harness
358
- config (approve the 267 above) and remove any `autotask_invoke` entry. The
359
- rule is derivable from the registry `effect` column (and the mode tools'
360
- fixed annotations) — it never needs a hand-maintained name list.
345
+ <!-- BEGIN GENERATED:approval-policy -->
346
+ **Harness approval policy (recommended).** Require approval on every tool whose MCP annotation is `readOnlyHint !== true` — today exactly **267 tools**: the 265 dedicated write/delete tools (209 `effect=write` + 56 `effect=destructive`, every one of them has a dedicated tool) + `autotask_write` + `autotask_delete`. The remaining **636 tools** (the 623 dedicated read tools + the 10 core read tools + `autotask_read` + `autotask_catalog` + `autotask_describe`) all carry `readOnlyHint: true` and are safe ungated: every op they can route is `effect=read` (zero mutating requests). Refined class for the highest-risk ops: the **57 tools with `destructiveHint: true`** (56 dedicated delete tools + `autotask_delete`) additionally require `confirm === <operation key>` even inside `autotask_delete`. The approval-gated writes (`configuration_items.moveConfigurationItem`, `contacts.moveToCompany`, `resources.transferOwnership`) require the same confirm inside `autotask_write`. Migration: `autotask_invoke` is REPLACED by `autotask_read`/`autotask_write`/`autotask_delete` — update harness config and remove any `autotask_invoke` entry. The rule is derivable from the registry `effect` column and the mode tools’ fixed annotations; it never needs a hand-maintained name list.
347
+ <!-- END GENERATED:approval-policy -->
361
348
 
362
349
  **Provider tool-search interop.** Hosts with provider-native tool search
363
350
  (OpenAI `type: "tool_search"` / `defer_loading`; Anthropic's tool search