node-autotask 0.8.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +13 -10
- package/MCP_TOOL_CATALOG.json +733 -251
- package/MCP_TOOL_MANIFEST.md +162 -133
- package/MCP_TOOL_OVERRIDES.json +2 -2
- package/N8N_MCP_MANIFEST.json +88 -25
- package/N8N_MCP_MANIFEST.md +26 -24
- package/README.md +12 -4
- package/capabilities.json +12503 -9316
- package/dist/capabilities.cjs +2 -3
- package/dist/capabilities.js +1 -2
- package/dist/{chunk-4WJCXIY2.js → chunk-3VB6N44U.js} +1141 -2977
- package/dist/{chunk-32AKZMY4.js → chunk-6KFP5HV3.js} +12502 -9316
- package/dist/chunk-DMMMWO6A.js +0 -0
- package/dist/chunk-FLB2X6O5.cjs +1 -0
- package/dist/{chunk-GYI4ZQID.js → chunk-HWC2WPX2.js} +4781 -89
- package/dist/chunk-IDPB4N2Q.cjs +1 -0
- package/dist/{chunk-F6YSQRZV.js → chunk-NVJ2PTN3.js} +7 -7
- package/dist/{chunk-5UGSQLLO.cjs → chunk-QUM74WLQ.cjs} +136 -136
- package/dist/{chunk-LAKEIYET.cjs → chunk-S7VMY5KN.cjs} +1468 -3304
- package/dist/chunk-UPQIUWOS.js +0 -0
- package/dist/{chunk-KNTUX3RR.cjs → chunk-WTVD2JZN.cjs} +12502 -9316
- package/dist/{chunk-V3XPLTIR.cjs → chunk-WTVLHMZA.cjs} +4784 -92
- package/dist/{index-B6JeThrY.d.ts → index-BOyh7S65.d.cts} +870 -79
- package/dist/{index-B0I2bGtx.d.cts → index-DGgMD8aq.d.ts} +870 -79
- package/dist/{index-DOCRp_83.d.cts → index-cQ6CRexR.d.cts} +158 -90
- package/dist/{index-DOCRp_83.d.ts → index-cQ6CRexR.d.ts} +158 -90
- package/dist/index.cjs +37 -22
- package/dist/index.d.cts +46 -5
- package/dist/index.d.ts +46 -5
- package/dist/index.js +48 -33
- package/dist/operations/index.cjs +480 -359
- package/dist/operations/index.d.cts +195 -16
- package/dist/operations/index.d.ts +195 -16
- package/dist/operations/index.js +370 -249
- package/dist/pool.cjs +36 -12
- package/dist/pool.d.cts +2 -3
- package/dist/pool.d.ts +2 -3
- package/dist/pool.js +33 -9
- package/dist/resources/index.cjs +5 -6
- package/dist/resources/index.d.cts +2 -2
- package/dist/resources/index.d.ts +2 -2
- package/dist/resources/index.js +4 -5
- package/dist/types/index.cjs +1 -2
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -2
- package/dist/untrusted.cjs +0 -1
- package/dist/untrusted.js +0 -1
- package/docs/API.md +693 -48
- package/docs/N8N-ADAPTER.md +4 -4
- package/examples/basic.ts +1 -1
- package/package.json +5 -3
- package/dist/capabilities.cjs.map +0 -1
- package/dist/capabilities.js.map +0 -1
- package/dist/chunk-32AKZMY4.js.map +0 -1
- package/dist/chunk-4WJCXIY2.js.map +0 -1
- package/dist/chunk-5UGSQLLO.cjs.map +0 -1
- package/dist/chunk-CXM35TEC.cjs +0 -1
- package/dist/chunk-CXM35TEC.cjs.map +0 -1
- package/dist/chunk-F6YSQRZV.js.map +0 -1
- package/dist/chunk-GIVD2CQ3.js +0 -1
- package/dist/chunk-GIVD2CQ3.js.map +0 -1
- package/dist/chunk-GYI4ZQID.js.map +0 -1
- package/dist/chunk-KNTUX3RR.cjs.map +0 -1
- package/dist/chunk-LAKEIYET.cjs.map +0 -1
- package/dist/chunk-MHBMSBTA.js +0 -1
- package/dist/chunk-MHBMSBTA.js.map +0 -1
- package/dist/chunk-NZUFSSIZ.cjs +0 -1
- package/dist/chunk-NZUFSSIZ.cjs.map +0 -1
- package/dist/chunk-V3XPLTIR.cjs.map +0 -1
- package/dist/client-DHmr0Oyx.d.ts +0 -203
- package/dist/client-Q6NoqinP.d.cts +0 -203
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/operations/index.cjs.map +0 -1
- package/dist/operations/index.js.map +0 -1
- package/dist/pool.cjs.map +0 -1
- package/dist/pool.js.map +0 -1
- package/dist/resources/index.cjs.map +0 -1
- package/dist/resources/index.js.map +0 -1
- package/dist/types/index.cjs.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/untrusted.cjs.map +0 -1
- package/dist/untrusted.js.map +0 -1
package/MCP_TOOL_OVERRIDES.json
CHANGED
|
@@ -100,8 +100,8 @@
|
|
|
100
100
|
{
|
|
101
101
|
"tool": "autotask_ticket_change_status",
|
|
102
102
|
"field": "description",
|
|
103
|
-
"newValue": "When to call: move a ticket to a target status without knowing the
|
|
104
|
-
"reason": "S12-A T2 (mcp-fix-20261003): the per-status required-field map is live-discovered vendor state an MCP LLM cannot know; the override states the picklist guard, the no-op contract and the bounded-discovery retry.; S13-QA (top-20 audit 2026-10-06) M-2: dropped the trailing dry-run sentence (the mechanical bounds tail already serves it).; S13-QA gate note 2 (dual-gate 2026-10-06): trailing space from the truncation fix."
|
|
103
|
+
"newValue": "When to call: move a ticket to a target status without knowing the tenant's status picklist or the per-status required fields — the node validates the targetStatus against the tenant's LIVE status picklist (entity metadata — a value the live picklist lacks → typed STATUS_UNKNOWN, zero record wire; the metadata unavailable → the vendor's own validation decides) and carries the live-discovered STATUS_REQUIRED_FIELDS map: one fresh GET merges the current record and the node fills the proven-safe defaults for the fields the target status requires that the record lacks. current === target → the typed no-op { changed: false, reason: 'NO_CHANGE' } (zero mutating wire). If the vendor 50s a status move naming required fields, the node retries once with those fields filled (typed discovery, bounded: max 3 merges) and returns filledFields + discoveryMerges.",
|
|
104
|
+
"reason": "S12-A T2 (mcp-fix-20261003): the per-status required-field map is live-discovered vendor state an MCP LLM cannot know; the override states the picklist guard, the no-op contract and the bounded-discovery retry.; S13-QA (top-20 audit 2026-10-06) M-2: dropped the trailing dry-run sentence (the mechanical bounds tail already serves it).; S13-QA gate note 2 (dual-gate 2026-10-06): trailing space from the truncation fix.; #64 (2026-10-10): the guard is the tenant's LIVE status picklist (entity metadata, cache-aware) with the vendor-rejection fallback — the pinned ww29 table is deleted."
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
107
|
"tool": "autotask_contact_upsert_by_email",
|
package/N8N_MCP_MANIFEST.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "node-autotask n8n consumer mcp projection v1",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"generatedAt": "2026-10-11T12:48:07.196Z",
|
|
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. | 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). | getUdfInfo: Get the Ticket user-defined-field catalog. | query: Query Ticket records with a JSON filter. | resolve: Resolve a Ticket from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (title — exact match only). Returns the Ticket record with the numeric id for get/update/delete. Other identifier forms (e.g. an email address) are NOT tried by resolve — use the resource's dedicated lookup op where one exists (see autotask_catalog). | search: Search ticket records by text (contains on the searchable fields). | slaHealthCheck: Run the SLA health check for a ticket (numeric ticket id). | summary: Get a one-call summary of a ticket (numeric ticket id). | timeline: Get the event timeline of a ticket (numeric ticket id).. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Bounded: limit default 25, max 500. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.",
|
|
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. | fullContext: Get the full context of one ticket in a single call: the ticket, its company, contact, assigned resource and project, plus its notes, time entries, attachment metadata and (opt-in) histories — every part separately reported. | get: Get one Ticket by id. | getContext: Get a ticket with its primary context records in one call. | getEntityInfo: Get the Ticket capability metadata (canCreate/canUpdate/hasUserDefinedFields/...). | getFieldInfo: Get the Ticket field catalog (types, picklists, required, maxLength) — the full raw field dump (the largest read of the info trio; compact discovery: operations.fieldCatalog). | getUdfInfo: Get the Ticket user-defined-field catalog. | query: Query Ticket records with a JSON filter. | resolve: Resolve a Ticket from a numeric id (the direct fetch, tried first) or an exact value of its primary text field(s) (title — exact match only). Returns the Ticket record with the numeric id for get/update/delete. Other identifier forms (e.g. an email address) are NOT tried by resolve — use the resource's dedicated lookup op where one exists (see autotask_catalog). | search: Search ticket records by text (contains on the searchable fields). | slaHealthCheck: Run the SLA health check for a ticket (numeric ticket id). | summary: Get a one-call summary of a ticket (numeric ticket id). | timeline: Get the event timeline of a ticket (numeric ticket id).. Bounds: Bounded: server-side pagination — up to limit records (default 500, max 2500) in one call; 1000-page guard; hasMore flags a truncation. Bounded: limit default 25, max 500. Errors carry the SDK error contract: code, category, retryable, operation, httpStatus, suggestedAction (the nextAction directive — follow the directive), correlationId, vendorError (when the vendor returned a response body — the deep-redacted body, host-sourced text wrapped as untrusted content when untrusted-wrapping is on); credentials never appear in an error message.",
|
|
25
25
|
"annotations": {
|
|
26
26
|
"readOnlyHint": true,
|
|
27
27
|
"destructiveHint": false,
|
|
@@ -202,7 +202,7 @@
|
|
|
202
202
|
"idempotentHint": true,
|
|
203
203
|
"openWorldHint": true
|
|
204
204
|
},
|
|
205
|
-
"purpose": "Get the Ticket field catalog (types, picklists, required, maxLength).",
|
|
205
|
+
"purpose": "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).",
|
|
206
206
|
"bounds": ""
|
|
207
207
|
},
|
|
208
208
|
{
|
|
@@ -451,7 +451,7 @@
|
|
|
451
451
|
"type": "number | string (the ticket id — a safe integer, or a canonical integer string for ids above 2^53)"
|
|
452
452
|
},
|
|
453
453
|
"targetStatus": {
|
|
454
|
-
"type": "number (
|
|
454
|
+
"type": "number (validated pre-request against the tenant's LIVE status picklist from the entity metadata when it is resolvable — a value the live picklist lacks → typed STATUS_UNKNOWN; when the metadata is unavailable the vendor's own validation decides)"
|
|
455
455
|
},
|
|
456
456
|
"fields": {
|
|
457
457
|
"type": "object (optional) — extra ticket fields merged into the same PUT (the caller value wins over the node map defaults; the merge keeps every other current field)"
|
|
@@ -500,7 +500,7 @@
|
|
|
500
500
|
"type": "number | string (the ticket id — a safe integer, or a canonical integer string for ids above 2^53)"
|
|
501
501
|
},
|
|
502
502
|
"targetStatus": {
|
|
503
|
-
"type": "number (
|
|
503
|
+
"type": "number (validated pre-request against the tenant's LIVE status picklist from the entity metadata when it is resolvable — a value the live picklist lacks → typed STATUS_UNKNOWN; when the metadata is unavailable the vendor's own validation decides)"
|
|
504
504
|
},
|
|
505
505
|
"fields": {
|
|
506
506
|
"type": "object (optional) — extra ticket fields merged into the same PUT (the caller value wins over the node map defaults; the merge keeps every other current field)"
|
|
@@ -517,7 +517,7 @@
|
|
|
517
517
|
"idempotentHint": false,
|
|
518
518
|
"openWorldHint": true
|
|
519
519
|
},
|
|
520
|
-
"purpose": "Move a ticket to a target status in ONE op — the node
|
|
520
|
+
"purpose": "Move a ticket to a target status in ONE op — the node validates targetStatus against the tenant's LIVE status picklist (entity metadata; vendor rejection is the fallback when the metadata is unavailable) + the live-discovered per-status required-field map and fills the proven-safe defaults itself (the vendor 500s when a target status has unsatisfied field requirements; the MCP LLM has no way to know the map).",
|
|
521
521
|
"bounds": "Dry-run first (dry_run).",
|
|
522
522
|
"dryRun": true
|
|
523
523
|
},
|
|
@@ -637,7 +637,7 @@
|
|
|
637
637
|
"entity": "contact",
|
|
638
638
|
"apiEntity": "contacts",
|
|
639
639
|
"effectLine": "effect=read only — zero mutating requests, ungated by design",
|
|
640
|
-
"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). | 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.",
|
|
640
|
+
"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.",
|
|
641
641
|
"annotations": {
|
|
642
642
|
"readOnlyHint": true,
|
|
643
643
|
"destructiveHint": false,
|
|
@@ -807,7 +807,7 @@
|
|
|
807
807
|
"idempotentHint": true,
|
|
808
808
|
"openWorldHint": true
|
|
809
809
|
},
|
|
810
|
-
"purpose": "Get the Contact field catalog (types, picklists, required, maxLength).",
|
|
810
|
+
"purpose": "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).",
|
|
811
811
|
"bounds": "Sensitive."
|
|
812
812
|
},
|
|
813
813
|
{
|
|
@@ -1182,7 +1182,7 @@
|
|
|
1182
1182
|
"entity": "company",
|
|
1183
1183
|
"apiEntity": "companies",
|
|
1184
1184
|
"effectLine": "effect=read only — zero mutating requests, ungated by design",
|
|
1185
|
-
"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). | getUdfInfo: Get the Company user-defined-field catalog. | 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
|
|
1185
|
+
"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. | 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.",
|
|
1186
1186
|
"annotations": {
|
|
1187
1187
|
"readOnlyHint": true,
|
|
1188
1188
|
"destructiveHint": false,
|
|
@@ -1335,7 +1335,7 @@
|
|
|
1335
1335
|
"idempotentHint": true,
|
|
1336
1336
|
"openWorldHint": true
|
|
1337
1337
|
},
|
|
1338
|
-
"purpose": "Get the Company field catalog (types, picklists, required, maxLength).",
|
|
1338
|
+
"purpose": "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).",
|
|
1339
1339
|
"bounds": ""
|
|
1340
1340
|
},
|
|
1341
1341
|
{
|
|
@@ -1508,6 +1508,34 @@
|
|
|
1508
1508
|
},
|
|
1509
1509
|
"purpose": "Find companies by any combination of companyName / email / website identity values.",
|
|
1510
1510
|
"bounds": ""
|
|
1511
|
+
},
|
|
1512
|
+
{
|
|
1513
|
+
"op": "companies.unbilledWork",
|
|
1514
|
+
"verb": "unbilledWork",
|
|
1515
|
+
"effect": "read",
|
|
1516
|
+
"kind": "helper",
|
|
1517
|
+
"flags": [],
|
|
1518
|
+
"requiredArgs": [
|
|
1519
|
+
"id"
|
|
1520
|
+
],
|
|
1521
|
+
"input": {
|
|
1522
|
+
"properties": {
|
|
1523
|
+
"id": {
|
|
1524
|
+
"type": "number | string"
|
|
1525
|
+
}
|
|
1526
|
+
},
|
|
1527
|
+
"required": [
|
|
1528
|
+
"id"
|
|
1529
|
+
]
|
|
1530
|
+
},
|
|
1531
|
+
"annotations": {
|
|
1532
|
+
"readOnlyHint": true,
|
|
1533
|
+
"destructiveHint": false,
|
|
1534
|
+
"idempotentHint": true,
|
|
1535
|
+
"openWorldHint": true
|
|
1536
|
+
},
|
|
1537
|
+
"purpose": "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",
|
|
1538
|
+
"bounds": ""
|
|
1511
1539
|
}
|
|
1512
1540
|
],
|
|
1513
1541
|
"backingOperations": [
|
|
@@ -1522,7 +1550,8 @@
|
|
|
1522
1550
|
"companies.resolve",
|
|
1523
1551
|
"companies.search",
|
|
1524
1552
|
"companies.searchByDomain",
|
|
1525
|
-
"companies.searchByIdentity"
|
|
1553
|
+
"companies.searchByIdentity",
|
|
1554
|
+
"companies.unbilledWork"
|
|
1526
1555
|
]
|
|
1527
1556
|
},
|
|
1528
1557
|
{
|
|
@@ -1691,7 +1720,7 @@
|
|
|
1691
1720
|
"entity": "companyLocation",
|
|
1692
1721
|
"apiEntity": "company_locations",
|
|
1693
1722
|
"effectLine": "effect=read only — zero mutating requests, ungated by design",
|
|
1694
|
-
"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). | 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.",
|
|
1723
|
+
"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.",
|
|
1695
1724
|
"annotations": {
|
|
1696
1725
|
"readOnlyHint": true,
|
|
1697
1726
|
"destructiveHint": false,
|
|
@@ -1793,7 +1822,7 @@
|
|
|
1793
1822
|
"idempotentHint": true,
|
|
1794
1823
|
"openWorldHint": true
|
|
1795
1824
|
},
|
|
1796
|
-
"purpose": "Get the CompanyLocation field catalog (types, picklists, required, maxLength).",
|
|
1825
|
+
"purpose": "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).",
|
|
1797
1826
|
"bounds": ""
|
|
1798
1827
|
},
|
|
1799
1828
|
{
|
|
@@ -2060,7 +2089,7 @@
|
|
|
2060
2089
|
"entity": "ticketNote",
|
|
2061
2090
|
"apiEntity": "ticket_notes",
|
|
2062
2091
|
"effectLine": "effect=read only — zero mutating requests, ungated by design",
|
|
2063
|
-
"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). | 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.",
|
|
2092
|
+
"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.",
|
|
2064
2093
|
"annotations": {
|
|
2065
2094
|
"readOnlyHint": true,
|
|
2066
2095
|
"destructiveHint": false,
|
|
@@ -2162,7 +2191,7 @@
|
|
|
2162
2191
|
"idempotentHint": true,
|
|
2163
2192
|
"openWorldHint": true
|
|
2164
2193
|
},
|
|
2165
|
-
"purpose": "Get the TicketNote field catalog (types, picklists, required, maxLength).",
|
|
2194
|
+
"purpose": "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).",
|
|
2166
2195
|
"bounds": ""
|
|
2167
2196
|
},
|
|
2168
2197
|
{
|
|
@@ -2395,7 +2424,7 @@
|
|
|
2395
2424
|
"entity": "resource",
|
|
2396
2425
|
"apiEntity": "resources",
|
|
2397
2426
|
"effectLine": "effect=read only — zero mutating requests, ungated by design",
|
|
2398
|
-
"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). | 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.",
|
|
2427
|
+
"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.",
|
|
2399
2428
|
"annotations": {
|
|
2400
2429
|
"readOnlyHint": true,
|
|
2401
2430
|
"destructiveHint": false,
|
|
@@ -2500,7 +2529,7 @@
|
|
|
2500
2529
|
"idempotentHint": true,
|
|
2501
2530
|
"openWorldHint": true
|
|
2502
2531
|
},
|
|
2503
|
-
"purpose": "Get the Resource field catalog (types, picklists, required, maxLength).",
|
|
2532
|
+
"purpose": "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).",
|
|
2504
2533
|
"bounds": "Sensitive."
|
|
2505
2534
|
},
|
|
2506
2535
|
{
|
|
@@ -2801,7 +2830,7 @@
|
|
|
2801
2830
|
"entity": "timeEntry",
|
|
2802
2831
|
"apiEntity": "time_entries",
|
|
2803
2832
|
"effectLine": "effect=read only — zero mutating requests, ungated by design",
|
|
2804
|
-
"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. | 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). | getPosted: Get posted time entries (optionally for one ticket). | getUdfInfo: Get the TimeEntry user-defined-field catalog. | getUnposted: Get unposted time entries (optionally for one ticket). | 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
|
|
2833
|
+
"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 clearer-named alias for time_entries.postedWithin (issue #66): the dateWorked window read with the posted/unposted split, counted in one pass — same wire, same result (incl. truncated). | 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 (optionally for one ticket). | getUdfInfo: Get the TimeEntry user-defined-field catalog. | getUnposted: Get unposted time entries (optionally for one ticket). | 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, counted in one pass (the window is ON the dateWorked field — the posted narrowing is a server-side postedDate exist|notExist predicate; the counts cover the returned rows only, truncated flags the capped window). | 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.",
|
|
2805
2834
|
"annotations": {
|
|
2806
2835
|
"readOnlyHint": true,
|
|
2807
2836
|
"destructiveHint": false,
|
|
@@ -2871,6 +2900,39 @@
|
|
|
2871
2900
|
"purpose": "Get time entries for an explicit dateWorked range.",
|
|
2872
2901
|
"bounds": ""
|
|
2873
2902
|
},
|
|
2903
|
+
{
|
|
2904
|
+
"op": "time_entries.dateWorkedWindow",
|
|
2905
|
+
"verb": "dateWorkedWindow",
|
|
2906
|
+
"effect": "read",
|
|
2907
|
+
"kind": "helper",
|
|
2908
|
+
"flags": [],
|
|
2909
|
+
"requiredArgs": [
|
|
2910
|
+
"from",
|
|
2911
|
+
"to"
|
|
2912
|
+
],
|
|
2913
|
+
"input": {
|
|
2914
|
+
"properties": {
|
|
2915
|
+
"from": {
|
|
2916
|
+
"type": "string (UTC date, inclusive — the dateWorked window start: the from-day start; when opts.tz is given the LOCAL calendar day in that zone, converted to UTC)"
|
|
2917
|
+
},
|
|
2918
|
+
"to": {
|
|
2919
|
+
"type": "string (UTC date, inclusive — the dateWorked window end: the to-day end; when opts.tz is given both bounds are LOCAL calendar days in that zone, converted to UTC). The clearer-named alias for postedWithin (same wire, same result incl. truncated — the name names the dateWorked window the counts cover). Result { items, postedCount, unpostedCount, window, truncated } — the counts cover the returned rows only (at most limit)"
|
|
2920
|
+
}
|
|
2921
|
+
},
|
|
2922
|
+
"required": [
|
|
2923
|
+
"from",
|
|
2924
|
+
"to"
|
|
2925
|
+
]
|
|
2926
|
+
},
|
|
2927
|
+
"annotations": {
|
|
2928
|
+
"readOnlyHint": true,
|
|
2929
|
+
"destructiveHint": false,
|
|
2930
|
+
"idempotentHint": true,
|
|
2931
|
+
"openWorldHint": true
|
|
2932
|
+
},
|
|
2933
|
+
"purpose": "The clearer-named alias for time_entries.postedWithin (issue #66): the dateWorked window read with the posted/unposted split, counted in one pass — same wire, same result (incl. truncated).",
|
|
2934
|
+
"bounds": ""
|
|
2935
|
+
},
|
|
2874
2936
|
{
|
|
2875
2937
|
"op": "time_entries.get",
|
|
2876
2938
|
"verb": "get",
|
|
@@ -2936,7 +2998,7 @@
|
|
|
2936
2998
|
"idempotentHint": true,
|
|
2937
2999
|
"openWorldHint": true
|
|
2938
3000
|
},
|
|
2939
|
-
"purpose": "Get the TimeEntry field catalog (types, picklists, required, maxLength).",
|
|
3001
|
+
"purpose": "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).",
|
|
2940
3002
|
"bounds": ""
|
|
2941
3003
|
},
|
|
2942
3004
|
{
|
|
@@ -3192,10 +3254,10 @@
|
|
|
3192
3254
|
"input": {
|
|
3193
3255
|
"properties": {
|
|
3194
3256
|
"from": {
|
|
3195
|
-
"type": "string (UTC date)"
|
|
3257
|
+
"type": "string (UTC date, inclusive — the dateWorked window start: the from-day start; when opts.tz is given the LOCAL calendar day in that zone, converted to UTC)"
|
|
3196
3258
|
},
|
|
3197
3259
|
"to": {
|
|
3198
|
-
"type": "string (UTC date)"
|
|
3260
|
+
"type": "string (UTC date, inclusive — the dateWorked window end: the to-day end; when opts.tz is given both bounds are LOCAL calendar days in that zone, converted to UTC). ONE server-filtered query; the window is ON the dateWorked field (the posted narrowing is a server-side postedDate exist|notExist predicate). Result { items, postedCount, unpostedCount, window, truncated } — the counts cover the returned rows only (at most limit); truncated is true when the vendor returned a live next-page cursor (more matching rows exist)"
|
|
3199
3261
|
}
|
|
3200
3262
|
},
|
|
3201
3263
|
"required": [
|
|
@@ -3209,7 +3271,7 @@
|
|
|
3209
3271
|
"idempotentHint": true,
|
|
3210
3272
|
"openWorldHint": true
|
|
3211
3273
|
},
|
|
3212
|
-
"purpose": "Get time entries worked within
|
|
3274
|
+
"purpose": "Get time entries worked within an inclusive dateWorked window with the posted/unposted split, counted in one pass (the window is ON the dateWorked field — the posted narrowing is a server-side postedDate exist|notExist predicate; the counts cover the returned rows only, truncated flags the capped window).",
|
|
3213
3275
|
"bounds": ""
|
|
3214
3276
|
},
|
|
3215
3277
|
{
|
|
@@ -3318,6 +3380,7 @@
|
|
|
3318
3380
|
"backingOperations": [
|
|
3319
3381
|
"time_entries.count",
|
|
3320
3382
|
"time_entries.customRange",
|
|
3383
|
+
"time_entries.dateWorkedWindow",
|
|
3321
3384
|
"time_entries.get",
|
|
3322
3385
|
"time_entries.getEntityInfo",
|
|
3323
3386
|
"time_entries.getFieldInfo",
|
|
@@ -3593,17 +3656,17 @@
|
|
|
3593
3656
|
}
|
|
3594
3657
|
],
|
|
3595
3658
|
"stats": {
|
|
3596
|
-
"registryRecords":
|
|
3659
|
+
"registryRecords": 1212,
|
|
3597
3660
|
"curatedEntities": 7,
|
|
3598
3661
|
"includedEntities": 7,
|
|
3599
3662
|
"readTools": 7,
|
|
3600
3663
|
"writeTools": 7,
|
|
3601
3664
|
"totalTools": 14,
|
|
3602
|
-
"readOperations":
|
|
3665
|
+
"readOperations": 84,
|
|
3603
3666
|
"writeOperations": 21,
|
|
3604
3667
|
"approvalGatedWrites": 2,
|
|
3605
3668
|
"destructiveExcluded": 3
|
|
3606
3669
|
},
|
|
3607
|
-
"capabilitiesHash": "
|
|
3670
|
+
"capabilitiesHash": "2f15d1ed249cebb21175ed8ef078d89a13fbe04aa7fe6b2d3c5d00d468a80b00",
|
|
3608
3671
|
"curationHash": "e19117ce73e38d9aded3be7e7f077a4e185d2e10294622b76c17d67f63cf9e3b"
|
|
3609
3672
|
}
|