iit-mcp-autotask 0.38.4 → 0.38.5

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/README.md CHANGED
@@ -9,9 +9,9 @@ packaged playbooks, strong security boundaries, and predictable per-tenant in-pr
9
9
  client + SDK-owned TTL caches).
10
10
 
11
11
  > **Package status (2026-10-29):** the runtime dependency `node-autotask` is published to public npm
12
- > at `0.39.1`; the committed `pnpm-lock.yaml` pins that
12
+ > at `0.39.4`; the committed `pnpm-lock.yaml` pins that
13
13
  > release with its integrity hash, so installs resolve deterministically. The dependency is always npm
14
- > (node-autotask pinned exactly at `0.39.1`) — never a `file:`, `git:`, `link:` or workspace reference
14
+ > (node-autotask pinned exactly at `0.39.4`) — never a `file:`, `git:`, `link:` or workspace reference
15
15
  > to a local checkout.
16
16
 
17
17
  > **0.6.0 is a breaking release** (unreleased): tool names, result shapes and configuration all
@@ -780,7 +780,7 @@ independent review with its resolutions, [`docs/reviews/0.6.0.md`](docs/reviews/
780
780
 
781
781
  ## SDK dependency
782
782
 
783
- `iit-mcp-autotask` depends on **`node-autotask` from npm at exactly `0.39.1`** (an exact pin —
783
+ `iit-mcp-autotask` depends on **`node-autotask` from npm at exactly `0.39.4`** (an exact pin —
784
784
  no range operator; subpaths `.` / `/capabilities` / `/operations` / `/resources` / `/types` /
785
785
  `/pool`) — the only **vendor** dependency; the other two runtime dependencies are
786
786
  `@modelcontextprotocol/server` (the MCP framework) and `zod` (schema validation). It never
@@ -319,6 +319,12 @@ export async function readOneItem(ctx, operation, args, signal, opts) {
319
319
  if (verdict.aborted)
320
320
  return { aborted: true, result: undefined };
321
321
  guardNote = verdict.note;
322
+ // #245: a no-filter walk answers the first rows of the tenant table; say so, so the page is not read as the full answer
323
+ const f = sent.filter;
324
+ if ((f === undefined || (Array.isArray(f) && f.length === 0)) && sent.latest === undefined && typeof sent.limit === 'number') {
325
+ const noFilter = `no filter: the first ${sent.limit} rows in id order, not a scoped or complete answer.`;
326
+ guardNote = guardNote === undefined ? noFilter : `${guardNote} ${noFilter}`;
327
+ }
322
328
  }
323
329
  if (operation === 'contracts.profitability') {
324
330
  const rawBag = cleanArgs[1];
@@ -22,7 +22,8 @@ export declare const ACK_KEY = "acknowledgeUnscoped";
22
22
  /** Typed refusal of an unscoped walk: an error envelope (reason SCOPE_REQUIRED, next supply_input) or a typed slot error. */
23
23
  export declare class ScopeRequiredError extends Error {
24
24
  readonly code: "SCOPE_REQUIRED";
25
- readonly field = "filter";
25
+ /** The reason pointer in the caller's arg shape: `args[0].filter` on autotask_read, `filter` on autotask_query (#245). */
26
+ readonly field: string;
26
27
  readonly count: number;
27
28
  readonly threshold: number;
28
29
  readonly operation: string;
@@ -7,7 +7,8 @@ export const ACK_KEY = 'acknowledgeUnscoped';
7
7
  /** Typed refusal of an unscoped walk: an error envelope (reason SCOPE_REQUIRED, next supply_input) or a typed slot error. */
8
8
  export class ScopeRequiredError extends Error {
9
9
  code = 'SCOPE_REQUIRED';
10
- field = 'filter';
10
+ /** The reason pointer in the caller's arg shape: `args[0].filter` on autotask_read, `filter` on autotask_query (#245). */
11
+ field;
11
12
  count;
12
13
  threshold;
13
14
  operation;
@@ -17,6 +18,7 @@ export class ScopeRequiredError extends Error {
17
18
  const suggestedAction = `Filter on resolved ids (companyID, contractID, ticketID, resourceID with op eq or in), or autotask_query group_by, sum or count for totals, or pass ${ackName}: true to walk it anyway.`;
18
19
  // within the 200-char message bound (MAX_ERROR_MESSAGE_CHARS) whatever the resource name: data.operation names the op
19
20
  super(`${count} rows match with no id filter (over ${UNSCOPED_WALK_THRESHOLD}). Filter on companyID, contractID, ticketID or resourceID (eq or in; time entries: ticket.companyID) and call again, or pass ${ackName}: true.`);
21
+ this.field = ackName === ACK_KEY ? 'args[0].filter' : 'filter';
20
22
  this.operation = operation;
21
23
  this.count = count;
22
24
  this.threshold = UNSCOPED_WALK_THRESHOLD;
@@ -1,3 +1,3 @@
1
1
  /** The wire identity of this server: a leaf module (no imports) so any tool can read it without an import cycle. */
2
2
  export declare const SERVER_NAME = "iit-mcp-autotask";
3
- export declare const SERVER_VERSION = "0.38.4";
3
+ export declare const SERVER_VERSION = "0.38.5";
@@ -1,4 +1,4 @@
1
1
  /** The wire identity of this server: a leaf module (no imports) so any tool can read it without an import cycle. */
2
2
  export const SERVER_NAME = 'iit-mcp-autotask';
3
- export const SERVER_VERSION = '0.38.4';
3
+ export const SERVER_VERSION = '0.38.5';
4
4
  //# sourceMappingURL=server-version.js.map
@@ -60,7 +60,7 @@ export declare function serverInstructions(config: Pick<Config, 'AUTOTASK_PROFIL
60
60
  /** The full identity stamp (the `/metadata` build block — the era pair, FR-2). */
61
61
  export declare const SERVER_IDENTITY: {
62
62
  readonly name: "iit-mcp-autotask";
63
- readonly version: "0.38.4";
63
+ readonly version: "0.38.5";
64
64
  readonly mcpProtocolBaseline: "2026-07-28";
65
65
  readonly legacyProtocolFallback: "2025-11-25";
66
66
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iit-mcp-autotask",
3
- "version": "0.38.4",
3
+ "version": "0.38.5",
4
4
  "description": "MCP server for the Autotask (Datto) PSA domain, built on the node-autotask SDK",
5
5
  "license": "MIT",
6
6
  "author": "Max Soukhomlinov",
@@ -53,7 +53,7 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "@modelcontextprotocol/server": "^2.2.0",
56
- "node-autotask": "0.39.1",
56
+ "node-autotask": "0.39.4",
57
57
  "zod": "^4.6.7"
58
58
  },
59
59
  "devDependencies": {
package/server.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iit-mcp-autotask",
3
- "version": "0.38.4",
3
+ "version": "0.38.5",
4
4
  "description": "MCP server for the Autotask (Datto) PSA API, powered by the node-autotask SDK",
5
5
  "mcpProtocolBaseline": "2026-07-28",
6
6
  "legacyProtocolFallback": "2025-11-25",
@@ -61,7 +61,7 @@
61
61
  "capabilitiesManifest": "capabilities.json",
62
62
  "sdk": {
63
63
  "package": "node-autotask",
64
- "versionRange": "0.39.1"
64
+ "versionRange": "0.39.4"
65
65
  },
66
66
  "vendorExtensions": false,
67
67
  "credentialModelNote": "per-request; server-held under stdio or, on HTTP, only behind AUTOTASK_HTTP_AUTH=tokens; operator plans and the ledger are keyed by principal and tenant id, never by credential, and an apply uses the credential on the apply request"