@sonisoft/now-sdk-ext-mcp 4.3.0 → 4.5.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/README.md CHANGED
@@ -207,7 +207,8 @@ test/
207
207
 
208
208
  ### Adding a New Tool
209
209
 
210
- 1. Create a new file in `src/tools/` (e.g., `src/tools/query-table.ts`).
210
+ 1. Create a new file in `src/resources/ # servicenow:// read-only resources
211
+ src/tools/` (e.g., `src/tools/query-table.ts`).
211
212
  2. Export a registration function:
212
213
 
213
214
  ```typescript
@@ -27,8 +27,14 @@
27
27
  * - `idempotentHint` — repeating the call with identical arguments leaves the
28
28
  * same end state. True for "set this field to X"; false for "append a comment"
29
29
  * or "create a record", which accumulate.
30
- * - `openWorldHint` — reserved here for arbitrary code execution, where the
31
- * effect is genuinely unbounded and cannot be inferred from the arguments.
30
+ * - `openWorldHint` — TRUE FOR EVERY TOOL HERE, and set explicitly rather than
31
+ * left to the spec's default. All of them talk to a live ServiceNow instance,
32
+ * which is exactly what the spec means by an open world. It was tempting to use
33
+ * it to single out arbitrary code execution, but that would have been wrong in
34
+ * both directions: the spec default is already `true`, so the marking would
35
+ * have been a no-op, and leaving it off the other 80-odd would have implied
36
+ * they were closed-world when they are not. MCP has no hint for "runs
37
+ * caller-supplied logic" — the tool description carries that.
32
38
  */
33
39
  export interface ToolAnnotations {
34
40
  readOnlyHint?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/common/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,eAAe;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAyBD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAmJ5D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAShE"}
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/common/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,MAAM,WAAW,eAAe;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AA2BD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAwJ5D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAchE"}
@@ -27,27 +27,39 @@
27
27
  * - `idempotentHint` — repeating the call with identical arguments leaves the
28
28
  * same end state. True for "set this field to X"; false for "append a comment"
29
29
  * or "create a record", which accumulate.
30
- * - `openWorldHint` — reserved here for arbitrary code execution, where the
31
- * effect is genuinely unbounded and cannot be inferred from the arguments.
30
+ * - `openWorldHint` — TRUE FOR EVERY TOOL HERE, and set explicitly rather than
31
+ * left to the spec's default. All of them talk to a live ServiceNow instance,
32
+ * which is exactly what the spec means by an open world. It was tempting to use
33
+ * it to single out arbitrary code execution, but that would have been wrong in
34
+ * both directions: the spec default is already `true`, so the marking would
35
+ * have been a no-op, and leaving it off the other 80-odd would have implied
36
+ * they were closed-world when they are not. MCP has no hint for "runs
37
+ * caller-supplied logic" — the tool description carries that.
32
38
  */
33
39
  /** Cannot modify anything. */
34
- const READ = { readOnlyHint: true };
40
+ const READ = { readOnlyHint: true, openWorldHint: true };
35
41
  /** Adds something new; nothing pre-existing is lost. Repeating accumulates. */
36
- const CREATE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false };
42
+ const CREATE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true };
37
43
  /** Sets state to a given value. Nothing is destroyed; repeating is a no-op. */
38
- const SET = { readOnlyHint: false, destructiveHint: false, idempotentHint: true };
44
+ const SET = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true };
39
45
  /** Overwrites or removes data that already existed. Repeating settles. */
40
- const OVERWRITE = { readOnlyHint: false, destructiveHint: true, idempotentHint: true };
46
+ const OVERWRITE = { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true };
41
47
  /** Overwrites or removes, and repeating does NOT settle. */
42
- const OVERWRITE_ONCE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false };
43
- /** Runs caller-supplied logic. Effect is unbounded and not inferable from args. */
44
- const ARBITRARY = {
45
- readOnlyHint: false,
46
- destructiveHint: true,
47
- idempotentHint: false,
48
- openWorldHint: true,
49
- };
48
+ const OVERWRITE_ONCE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true };
49
+ /**
50
+ * Runs caller-supplied logic — a script or a flow someone else authored.
51
+ *
52
+ * Structurally identical to OVERWRITE_ONCE, because MCP has no hint that means
53
+ * "unbounded effect". Kept as a separate name purely so this table records which
54
+ * tools are in that category; the warning that actually reaches the model is in
55
+ * the tool description.
56
+ */
57
+ const ARBITRARY = OVERWRITE_ONCE;
50
58
  export const TOOL_ANNOTATIONS = {
59
+ // ---- meta: reports this server's own configuration, touches no instance.
60
+ // Registered outside TOOL_REGISTRY because it is always available regardless
61
+ // of the active package.
62
+ list_tool_packages: READ,
51
63
  // ---- aggregate: server-side counts, no writes
52
64
  count_records: READ,
53
65
  aggregate_query: READ,
@@ -183,7 +195,12 @@ export const TOOL_ANNOTATIONS = {
183
195
  * Failing at registration makes that impossible.
184
196
  */
185
197
  export function annotationsFor(toolName) {
186
- const annotations = TOOL_ANNOTATIONS[toolName];
198
+ // hasOwnProperty, not bracket access: TOOL_ANNOTATIONS["constructor"] would
199
+ // otherwise return the Object constructor — truthy — and this would hand back
200
+ // a function instead of throwing.
201
+ const annotations = Object.prototype.hasOwnProperty.call(TOOL_ANNOTATIONS, toolName)
202
+ ? TOOL_ANNOTATIONS[toolName]
203
+ : undefined;
187
204
  if (!annotations) {
188
205
  throw new Error(`No annotations defined for tool "${toolName}". Add it to TOOL_ANNOTATIONS ` +
189
206
  `in src/common/annotations.ts — every tool must declare whether it is read-only.`);
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/common/annotations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/common/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AASH,8BAA8B;AAC9B,MAAM,IAAI,GAAoB,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAE1E,+EAA+E;AAC/E,MAAM,MAAM,GAAoB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAE5H,+EAA+E;AAC/E,MAAM,GAAG,GAAoB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAExH,0EAA0E;AAC1E,MAAM,SAAS,GAAoB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAE7H,4DAA4D;AAC5D,MAAM,cAAc,GAAoB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAEnI;;;;;;;GAOG;AACH,MAAM,SAAS,GAAoB,cAAc,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAoC;IAC7D,2EAA2E;IAC3E,6EAA6E;IAC7E,yBAAyB;IACzB,kBAAkB,EAAE,IAAI;IAExB,gDAAgD;IAChD,aAAa,EAAE,IAAI;IACnB,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,IAAI;IAEvB,qBAAqB;IACrB,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,oEAAoE;IACpE,oBAAoB,EAAE,IAAI;IAC1B,6EAA6E;IAC7E,6EAA6E;IAC7E,iBAAiB,EAAE,cAAc;IACjC,gBAAgB,EAAE,cAAc;IAChC,qBAAqB,EAAE,cAAc;IACrC,mBAAmB,EAAE,cAAc;IAEnC,wEAAwE;IACxE,gDAAgD;IAChD,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,cAAc;IAC5B,kBAAkB,EAAE,cAAc;IAElC,mBAAmB;IACnB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;IACzB,iBAAiB,EAAE,MAAM;IAEzB,aAAa;IACb,oBAAoB,EAAE,MAAM;IAC5B,oBAAoB,EAAE,SAAS;IAE/B,eAAe;IACf,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,IAAI;IACtB,uBAAuB,EAAE,IAAI;IAC7B,oBAAoB,EAAE,IAAI;IAC1B,2BAA2B,EAAE,IAAI;IACjC,sBAAsB,EAAE,MAAM;IAE9B,YAAY;IACZ,sBAAsB,EAAE,IAAI;IAC5B,mBAAmB,EAAE,IAAI;IAEzB,mBAAmB;IACnB,WAAW,EAAE,IAAI;IACjB,uBAAuB,EAAE,IAAI;IAC7B,uBAAuB,EAAE,IAAI;IAC7B,kEAAkE;IAClE,qBAAqB,EAAE,GAAG;IAE1B,iBAAiB;IACjB,oBAAoB,EAAE,IAAI;IAC1B,YAAY,EAAE,IAAI;IAElB,6EAA6E;IAC7E,cAAc,EAAE,SAAS;IAEzB,mEAAmE;IACnE,YAAY,EAAE,SAAS;IACvB,eAAe,EAAE,SAAS;IAC1B,cAAc,EAAE,SAAS;IACzB,SAAS,EAAE,SAAS;IACpB,uBAAuB,EAAE,IAAI;IAC7B,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,IAAI;IACpB,0BAA0B,EAAE,IAAI;IAChC,aAAa,EAAE,IAAI;IACnB,wEAAwE;IACxE,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,MAAM;IAEjB,cAAc;IACd,qBAAqB,EAAE,IAAI;IAE3B,iBAAiB;IACjB,oBAAoB,EAAE,IAAI;IAC1B,kBAAkB,EAAE,IAAI;IACxB,kBAAkB,EAAE,IAAI;IACxB,kBAAkB,EAAE,MAAM;IAC1B,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,MAAM;IACzB,iBAAiB,EAAE,SAAS;IAC5B,kEAAkE;IAClE,kBAAkB,EAAE,GAAG;IAEvB,eAAe;IACf,UAAU,EAAE,IAAI;IAChB,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,IAAI;IAElB,0EAA0E;IAC1E,8DAA8D;IAC9D,oBAAoB,EAAE,SAAS;IAC/B,oBAAoB,EAAE,SAAS;IAE/B,qBAAqB;IACrB,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,IAAI;IAEjB,cAAc;IACd,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IAEtB,aAAa;IACb,iBAAiB,EAAE,IAAI;IACvB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,GAAG;IAEtB,mBAAmB;IACnB,gFAAgF;IAChF,6EAA6E;IAC7E,YAAY;IACZ,WAAW,EAAE,SAAS;IACtB,gDAAgD;IAChD,WAAW,EAAE,SAAS;IAEtB,wCAAwC;IACxC,SAAS,EAAE,IAAI;IACf,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM;IACxB,WAAW,EAAE,GAAG;IAChB,gBAAgB,EAAE,GAAG;IACrB,cAAc,EAAE,GAAG;IACnB,cAAc,EAAE,GAAG;IAEnB,mBAAmB;IACnB,sBAAsB,EAAE,IAAI;IAC5B,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,MAAM;IACzB,sBAAsB,EAAE,GAAG;IAC3B,gBAAgB,EAAE,MAAM;IACxB,+DAA+D;IAC/D,uBAAuB,EAAE,SAAS;IAElC,gBAAgB;IAChB,eAAe,EAAE,MAAM;IAEvB,WAAW;IACX,iBAAiB,EAAE,IAAI;IACvB,0DAA0D;IAC1D,kBAAkB,EAAE,cAAc;CACrC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC3C,4EAA4E;IAC5E,8EAA8E;IAC9E,kCAAkC;IAClC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC;QAChF,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAC5B,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACX,oCAAoC,QAAQ,gCAAgC;YACxE,iFAAiF,CACxF,CAAC;IACN,CAAC;IACD,OAAO,WAAW,CAAC;AACvB,CAAC"}
@@ -17,6 +17,16 @@ export declare function getServiceNowInstance(authAlias?: string): Promise<Servi
17
17
  * creates a fresh connection.
18
18
  */
19
19
  export declare function clearInstance(authAlias?: string): void;
20
+ /** Patterns that indicate a connection/session problem worth retrying. */
21
+ /** Set by sn-credstore's shim once it has taken over credential storage. */
22
+ export declare const CRED_STORE_PATCHED_ENV = "NOW_SDK_KEYCHAIN_PATCHED";
23
+ /**
24
+ * True when credentials come from sn-credstore rather than the OS keyring.
25
+ *
26
+ * Exported so callers do not re-spell the variable name and the "=== 1"
27
+ * convention; both were already duplicated once.
28
+ */
29
+ export declare function isCredStoreActive(): boolean;
20
30
  /**
21
31
  * Returns true if an HTTP response indicates a stale or dead session.
22
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/common/connection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAEnB,MAAM,4BAA4B,CAAC;AA4BpC;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAkD7B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAKtD;AAgBD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GACpE,OAAO,CAIT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GACtD,OAAO,CAAC,CAAC,CAAC,CAeZ"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/common/connection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAEnB,MAAM,4BAA4B,CAAC;AA4BpC;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAkD7B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED,0EAA0E;AAC1E,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AAEjE;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAeD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GACpE,OAAO,CAIT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GACtD,OAAO,CAAC,CAAC,CAAC,CAeZ"}
@@ -81,6 +81,17 @@ export function clearInstance(authAlias) {
81
81
  }
82
82
  }
83
83
  /** Patterns that indicate a connection/session problem worth retrying. */
84
+ /** Set by sn-credstore's shim once it has taken over credential storage. */
85
+ export const CRED_STORE_PATCHED_ENV = "NOW_SDK_KEYCHAIN_PATCHED";
86
+ /**
87
+ * True when credentials come from sn-credstore rather than the OS keyring.
88
+ *
89
+ * Exported so callers do not re-spell the variable name and the "=== 1"
90
+ * convention; both were already duplicated once.
91
+ */
92
+ export function isCredStoreActive() {
93
+ return process.env[CRED_STORE_PATCHED_ENV] === "1";
94
+ }
84
95
  const RETRYABLE_PATTERNS = /ECONNREFUSED|ECONNRESET|ETIMEDOUT|EPIPE|socket hang up|fetch failed|No response|Body not XML/i;
85
96
  /**
86
97
  * Returns true if the error looks like a transient connection or stale-session
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/common/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/common/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Resolves MCP_TOOL_PACKAGE into the set of tools to register.
3
+ *
4
+ * Every failure mode here degrades toward MORE tools, never fewer. A typo in the
5
+ * env var that silently exposed a smaller surface would look like the server was
6
+ * broken — tools simply missing, with no error to search for. Falling back to
7
+ * `full` and saying so on stderr is the recoverable direction.
8
+ */
9
+ export interface ResolvedPackage {
10
+ /** Package names that were actually applied. */
11
+ names: string[];
12
+ /** Tool names to register, already filtered to ones that exist. */
13
+ tools: string[];
14
+ /** Requested names that matched no package. */
15
+ unknownPackages: string[];
16
+ /** Tools named by a package that this server does not have. */
17
+ unknownTools: string[];
18
+ /** True when the requested selection could not be used and `full` was substituted. */
19
+ fellBack: boolean;
20
+ }
21
+ /**
22
+ * Resolves a selection into a concrete tool set.
23
+ *
24
+ * `selection` is the raw env value: one package name, or several comma-separated,
25
+ * in which case the result is their UNION. Union rather than intersection because
26
+ * combining packages is how someone expresses "I do service desk work AND change
27
+ * approvals" — an intersection of two role packages is almost always empty.
28
+ */
29
+ export declare function resolveToolPackage(selection: string | undefined): ResolvedPackage;
30
+ /**
31
+ * Reports the resolution on stderr.
32
+ *
33
+ * stderr, never stdout — stdout is the JSON-RPC transport, and a stray byte
34
+ * there breaks the client's parser.
35
+ */
36
+ export declare function reportResolution(resolved: ResolvedPackage): void;
37
+ //# sourceMappingURL=tool-packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-packages.d.ts","sourceRoot":"","sources":["../../src/common/tool-packages.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,WAAW,eAAe;IAC5B,gDAAgD;IAChD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sFAAsF;IACtF,QAAQ,EAAE,OAAO,CAAC;CACrB;AAgBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAuEjF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAuBhE"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Resolves MCP_TOOL_PACKAGE into the set of tools to register.
3
+ *
4
+ * Every failure mode here degrades toward MORE tools, never fewer. A typo in the
5
+ * env var that silently exposed a smaller surface would look like the server was
6
+ * broken — tools simply missing, with no error to search for. Falling back to
7
+ * `full` and saying so on stderr is the recoverable direction.
8
+ */
9
+ import { TOOL_PACKAGES, DEFAULT_PACKAGE } from "../config/tool-packages.js";
10
+ import { TOOL_ANNOTATIONS } from "./annotations.js";
11
+ import { allToolNames } from "../tools/registry.js";
12
+ /** Sentinel in a package's `tools` meaning "everything". */
13
+ const ALL = "*";
14
+ /** Sentinel meaning "every tool annotated readOnlyHint: true". */
15
+ const READONLY = "@readonly";
16
+ /**
17
+ * Tools annotated as read-only. Derived, so it cannot drift from the annotations.
18
+ *
19
+ * Filtered to the registry deliberately. TOOL_ANNOTATIONS covers one tool the
20
+ * registry does not — `list_tool_packages`, which is registered unconditionally —
21
+ * and returning it here would put a name in the resolved set that has no
22
+ * registrar, crashing startup on `TOOL_REGISTRY[name](server)`.
23
+ */
24
+ function readonlyTools(known) {
25
+ return Object.entries(TOOL_ANNOTATIONS)
26
+ .filter(([name, a]) => a.readOnlyHint === true && known.has(name))
27
+ .map(([name]) => name);
28
+ }
29
+ /**
30
+ * Resolves a selection into a concrete tool set.
31
+ *
32
+ * `selection` is the raw env value: one package name, or several comma-separated,
33
+ * in which case the result is their UNION. Union rather than intersection because
34
+ * combining packages is how someone expresses "I do service desk work AND change
35
+ * approvals" — an intersection of two role packages is almost always empty.
36
+ */
37
+ export function resolveToolPackage(selection) {
38
+ const known = new Set(allToolNames());
39
+ const requested = (selection ?? "")
40
+ .split(",")
41
+ .map((s) => s.trim())
42
+ .filter((s) => s.length > 0);
43
+ if (requested.length === 0) {
44
+ return {
45
+ names: [DEFAULT_PACKAGE],
46
+ tools: allToolNames(),
47
+ unknownPackages: [],
48
+ unknownTools: [],
49
+ fellBack: false,
50
+ };
51
+ }
52
+ const names = [];
53
+ const unknownPackages = [];
54
+ const selected = new Set();
55
+ const namedButMissing = new Set();
56
+ for (const name of requested) {
57
+ // hasOwnProperty, not bracket access. TOOL_PACKAGES is an object literal,
58
+ // so TOOL_PACKAGES["constructor"] returns the Object constructor — truthy,
59
+ // with no `.tools` — and `for (const t of pkg.tools)` then throws at module
60
+ // load, before the uncaughtException handler exists. MCP_TOOL_PACKAGE=
61
+ // constructor would crash the server rather than falling back, which is the
62
+ // exact opposite of this file's stated invariant.
63
+ const pkg = Object.prototype.hasOwnProperty.call(TOOL_PACKAGES, name)
64
+ ? TOOL_PACKAGES[name]
65
+ : undefined;
66
+ if (!pkg) {
67
+ unknownPackages.push(name);
68
+ continue;
69
+ }
70
+ names.push(name);
71
+ for (const tool of pkg.tools) {
72
+ if (tool === ALL) {
73
+ allToolNames().forEach((t) => selected.add(t));
74
+ }
75
+ else if (tool === READONLY) {
76
+ readonlyTools(known).forEach((t) => selected.add(t));
77
+ }
78
+ else if (known.has(tool)) {
79
+ selected.add(tool);
80
+ }
81
+ else {
82
+ // Expected for packages naming tools from open tickets; still
83
+ // reported, because the same path catches a genuine typo.
84
+ namedButMissing.add(tool);
85
+ }
86
+ }
87
+ }
88
+ // Nothing usable was requested. Fall back rather than register an empty
89
+ // server: a server with no tools is indistinguishable from a broken one.
90
+ if (names.length === 0) {
91
+ return {
92
+ names: [DEFAULT_PACKAGE],
93
+ tools: allToolNames(),
94
+ unknownPackages,
95
+ unknownTools: [],
96
+ fellBack: true,
97
+ };
98
+ }
99
+ return {
100
+ names,
101
+ tools: [...selected].sort(),
102
+ unknownPackages,
103
+ unknownTools: [...namedButMissing].sort(),
104
+ fellBack: false,
105
+ };
106
+ }
107
+ /**
108
+ * Reports the resolution on stderr.
109
+ *
110
+ * stderr, never stdout — stdout is the JSON-RPC transport, and a stray byte
111
+ * there breaks the client's parser.
112
+ */
113
+ export function reportResolution(resolved) {
114
+ const { names, tools, unknownPackages, unknownTools, fellBack } = resolved;
115
+ if (unknownPackages.length > 0) {
116
+ const available = Object.keys(TOOL_PACKAGES).sort().join(", ");
117
+ console.error(`[tool-packages] unknown package(s): ${unknownPackages.join(", ")}. ` +
118
+ `Available: ${available}.` +
119
+ (fellBack ? ` Falling back to "${DEFAULT_PACKAGE}".` : ""));
120
+ }
121
+ if (unknownTools.length > 0) {
122
+ console.error(`[tool-packages] ${unknownTools.length} tool(s) named by a package do not exist ` +
123
+ `on this server and were skipped: ${unknownTools.join(", ")}. ` +
124
+ `This is expected for tools from work that has not landed yet.`);
125
+ }
126
+ console.error(`[tool-packages] active: ${names.join(", ")} — ${tools.length} of ${allToolNames().length} tools registered`);
127
+ }
128
+ //# sourceMappingURL=tool-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-packages.js","sourceRoot":"","sources":["../../src/common/tool-packages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Tool packages — named subsets of the tool surface.
3
+ *
4
+ * All 86 tools are registered by default, and their descriptions are long by
5
+ * design (`execute_script`'s runs to about thirteen lines, because it has to
6
+ * teach scoped-vs-global name qualification). That is a fixed cost paid on every
7
+ * session, and model tool-selection accuracy degrades as the option count grows.
8
+ * A user doing service-desk work does not need Flow Designer, ATF, or app
9
+ * publishing in front of them.
10
+ *
11
+ * Selected with MCP_TOOL_PACKAGE. Unset means "full", so the default behaviour
12
+ * is unchanged.
13
+ *
14
+ * ---
15
+ *
16
+ * ON NAMING TOOLS THAT DO NOT EXIST YET
17
+ *
18
+ * Packages may reference tools this server does not have. That is deliberate,
19
+ * not sloppiness: NEX-38 (user and group tools), NEX-39 (incident and change
20
+ * tools) and NEX-46 (workflow execution) are all open, and their tools belong in
21
+ * these packages the day they land. Naming them now means the package is already
22
+ * right rather than something someone has to remember to revisit.
23
+ *
24
+ * Unknown names are reported once at startup and skipped. They are a warning
25
+ * rather than an error precisely because forward references are expected — but
26
+ * they are still surfaced, because the same warning catches a genuine typo.
27
+ */
28
+ export interface ToolPackage {
29
+ /** Shown by list_tool_packages, so write it for whoever picks a package. */
30
+ description: string;
31
+ /** Tool names, or ["*"] for everything. May name tools that do not exist yet. */
32
+ tools: string[];
33
+ }
34
+ export declare const TOOL_PACKAGES: Record<string, ToolPackage>;
35
+ /** The package used when MCP_TOOL_PACKAGE is unset or unusable. */
36
+ export declare const DEFAULT_PACKAGE = "full";
37
+ //# sourceMappingURL=tool-packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-packages.d.ts","sourceRoot":"","sources":["../../src/config/tool-packages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,WAAW,WAAW;IACxB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAkLrD,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,eAAe,SAAS,CAAC"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Tool packages — named subsets of the tool surface.
3
+ *
4
+ * All 86 tools are registered by default, and their descriptions are long by
5
+ * design (`execute_script`'s runs to about thirteen lines, because it has to
6
+ * teach scoped-vs-global name qualification). That is a fixed cost paid on every
7
+ * session, and model tool-selection accuracy degrades as the option count grows.
8
+ * A user doing service-desk work does not need Flow Designer, ATF, or app
9
+ * publishing in front of them.
10
+ *
11
+ * Selected with MCP_TOOL_PACKAGE. Unset means "full", so the default behaviour
12
+ * is unchanged.
13
+ *
14
+ * ---
15
+ *
16
+ * ON NAMING TOOLS THAT DO NOT EXIST YET
17
+ *
18
+ * Packages may reference tools this server does not have. That is deliberate,
19
+ * not sloppiness: NEX-38 (user and group tools), NEX-39 (incident and change
20
+ * tools) and NEX-46 (workflow execution) are all open, and their tools belong in
21
+ * these packages the day they land. Naming them now means the package is already
22
+ * right rather than something someone has to remember to revisit.
23
+ *
24
+ * Unknown names are reported once at startup and skipped. They are a warning
25
+ * rather than an error precisely because forward references are expected — but
26
+ * they are still surfaced, because the same warning catches a genuine typo.
27
+ */
28
+ export const TOOL_PACKAGES = {
29
+ full: {
30
+ description: "Every tool. The default when MCP_TOOL_PACKAGE is unset.",
31
+ tools: ["*"],
32
+ },
33
+ readonly: {
34
+ description: "Only tools that cannot modify anything — safe to expose when the session " +
35
+ "should be able to investigate but never change the instance. Derived from " +
36
+ "the readOnlyHint annotations rather than hand-listed, so it cannot drift.",
37
+ // Resolved dynamically; see resolveReadonlyPackage in common/tool-packages.ts.
38
+ tools: ["@readonly"],
39
+ },
40
+ developer: {
41
+ description: "Building and debugging on an instance: scripts, schema, source sync, " +
42
+ "update sets, scope, logs and code search.",
43
+ tools: [
44
+ "execute_script",
45
+ "query_table",
46
+ "query_syslog",
47
+ "count_records",
48
+ "aggregate_query",
49
+ "aggregate_grouped",
50
+ "discover_table_schema",
51
+ "explain_field",
52
+ "lookup_table",
53
+ "lookup_columns",
54
+ "lookup_app",
55
+ "list_instance_tables",
56
+ "pull_script",
57
+ "push_script",
58
+ "code_search",
59
+ "list_code_search_groups",
60
+ "list_code_search_tables",
61
+ "add_code_search_table",
62
+ "get_current_update_set",
63
+ "list_update_sets",
64
+ "create_update_set",
65
+ "set_current_update_set",
66
+ "inspect_update_set",
67
+ "clone_update_set",
68
+ "move_update_set_records",
69
+ "get_current_scope",
70
+ "set_current_scope",
71
+ "list_scoped_apps",
72
+ "check_instance_health",
73
+ "find_task",
74
+ "export_record_xml",
75
+ "import_records_xml",
76
+ ],
77
+ },
78
+ service_desk: {
79
+ description: "Working tickets: find and update tasks, read knowledge, raise catalog " +
80
+ "requests. No scripting, no schema, no app lifecycle.",
81
+ tools: [
82
+ "find_task",
83
+ "query_table",
84
+ "add_task_comment",
85
+ "assign_task",
86
+ "resolve_incident",
87
+ "close_incident",
88
+ "approve_change",
89
+ "list_knowledge_bases",
90
+ "list_kb_articles",
91
+ "get_kb_article",
92
+ "list_catalog_items",
93
+ "get_catalog_item",
94
+ "list_catalog_item_variables",
95
+ "submit_catalog_request",
96
+ "list_attachments",
97
+ "get_attachment_info",
98
+ // Pending NEX-39.
99
+ "create_incident",
100
+ "update_incident",
101
+ "add_work_note",
102
+ ],
103
+ },
104
+ admin: {
105
+ description: "Instance administration: users and groups, plugins, health, logs, and " +
106
+ "scripting. Deliberately includes execute_script — an admin package " +
107
+ "without it is not an admin package.",
108
+ tools: [
109
+ "query_table",
110
+ "query_syslog",
111
+ "count_records",
112
+ "find_task",
113
+ "execute_script",
114
+ "list_plugins",
115
+ "list_instance_tables",
116
+ "check_instance_health",
117
+ "list_scoped_apps",
118
+ "get_app_details",
119
+ "list_company_apps",
120
+ "search_store_apps",
121
+ "validate_app_install",
122
+ "install_store_app",
123
+ "update_store_app",
124
+ // Pending NEX-38.
125
+ "find_user",
126
+ "list_users",
127
+ "create_user",
128
+ "update_user",
129
+ "list_groups",
130
+ "get_group_members",
131
+ "add_group_members",
132
+ "remove_group_members",
133
+ "assign_user_role",
134
+ "remove_user_role",
135
+ ],
136
+ },
137
+ change_manager: {
138
+ description: "Change and release work: change approvals, update sets, flows and " +
139
+ "workflows, and the app repo.",
140
+ tools: [
141
+ "find_task",
142
+ "query_table",
143
+ "approve_change",
144
+ "add_task_comment",
145
+ "get_current_update_set",
146
+ "list_update_sets",
147
+ "create_update_set",
148
+ "set_current_update_set",
149
+ "inspect_update_set",
150
+ "clone_update_set",
151
+ "move_update_set_records",
152
+ "execute_flow",
153
+ "get_flow_context_status",
154
+ "get_flow_outputs",
155
+ "get_flow_error",
156
+ "get_flow_logs",
157
+ "cancel_flow",
158
+ "create_workflow",
159
+ "install_from_app_repo",
160
+ "publish_to_app_repo",
161
+ // Pending NEX-39 and NEX-46.
162
+ "create_change_request",
163
+ "update_change_request",
164
+ "get_change_details",
165
+ "add_change_task",
166
+ "get_workflow_versions",
167
+ "execute_workflow",
168
+ ],
169
+ },
170
+ flow_developer: {
171
+ description: "Flow Designer work end to end: run, test, copy, inspect and diagnose " +
172
+ "flows, plus the schema and logs needed to debug them.",
173
+ tools: [
174
+ "execute_flow",
175
+ "execute_subflow",
176
+ "execute_action",
177
+ "test_flow",
178
+ "copy_flow",
179
+ "cancel_flow",
180
+ "get_flow_context_status",
181
+ "get_flow_outputs",
182
+ "get_flow_error",
183
+ "get_flow_execution_details",
184
+ "get_flow_logs",
185
+ "query_table",
186
+ "query_syslog",
187
+ "discover_table_schema",
188
+ "lookup_table",
189
+ "get_current_scope",
190
+ "set_current_scope",
191
+ "list_scoped_apps",
192
+ ],
193
+ },
194
+ };
195
+ /** The package used when MCP_TOOL_PACKAGE is unset or unusable. */
196
+ export const DEFAULT_PACKAGE = "full";
197
+ //# sourceMappingURL=tool-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-packages.js","sourceRoot":"","sources":["../../src/config/tool-packages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AASH,MAAM,CAAC,MAAM,aAAa,GAAgC;IACtD,IAAI,EAAE;QACF,WAAW,EAAE,yDAAyD;QACtE,KAAK,EAAE,CAAC,GAAG,CAAC;KACf;IAED,QAAQ,EAAE;QACN,WAAW,EACP,2EAA2E;YAC3E,4EAA4E;YAC5E,2EAA2E;QAC/E,+EAA+E;QAC/E,KAAK,EAAE,CAAC,WAAW,CAAC;KACvB;IAED,SAAS,EAAE;QACP,WAAW,EACP,uEAAuE;YACvE,2CAA2C;QAC/C,KAAK,EAAE;YACH,gBAAgB;YAChB,aAAa;YACb,cAAc;YACd,eAAe;YACf,iBAAiB;YACjB,mBAAmB;YACnB,uBAAuB;YACvB,eAAe;YACf,cAAc;YACd,gBAAgB;YAChB,YAAY;YACZ,sBAAsB;YACtB,aAAa;YACb,aAAa;YACb,aAAa;YACb,yBAAyB;YACzB,yBAAyB;YACzB,uBAAuB;YACvB,wBAAwB;YACxB,kBAAkB;YAClB,mBAAmB;YACnB,wBAAwB;YACxB,oBAAoB;YACpB,kBAAkB;YAClB,yBAAyB;YACzB,mBAAmB;YACnB,mBAAmB;YACnB,kBAAkB;YAClB,uBAAuB;YACvB,WAAW;YACX,mBAAmB;YACnB,oBAAoB;SACvB;KACJ;IAED,YAAY,EAAE;QACV,WAAW,EACP,wEAAwE;YACxE,sDAAsD;QAC1D,KAAK,EAAE;YACH,WAAW;YACX,aAAa;YACb,kBAAkB;YAClB,aAAa;YACb,kBAAkB;YAClB,gBAAgB;YAChB,gBAAgB;YAChB,sBAAsB;YACtB,kBAAkB;YAClB,gBAAgB;YAChB,oBAAoB;YACpB,kBAAkB;YAClB,6BAA6B;YAC7B,wBAAwB;YACxB,kBAAkB;YAClB,qBAAqB;YACrB,kBAAkB;YAClB,iBAAiB;YACjB,iBAAiB;YACjB,eAAe;SAClB;KACJ;IAED,KAAK,EAAE;QACH,WAAW,EACP,wEAAwE;YACxE,qEAAqE;YACrE,qCAAqC;QACzC,KAAK,EAAE;YACH,aAAa;YACb,cAAc;YACd,eAAe;YACf,WAAW;YACX,gBAAgB;YAChB,cAAc;YACd,sBAAsB;YACtB,uBAAuB;YACvB,kBAAkB;YAClB,iBAAiB;YACjB,mBAAmB;YACnB,mBAAmB;YACnB,sBAAsB;YACtB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;YAClB,WAAW;YACX,YAAY;YACZ,aAAa;YACb,aAAa;YACb,aAAa;YACb,mBAAmB;YACnB,mBAAmB;YACnB,sBAAsB;YACtB,kBAAkB;YAClB,kBAAkB;SACrB;KACJ;IAED,cAAc,EAAE;QACZ,WAAW,EACP,oEAAoE;YACpE,8BAA8B;QAClC,KAAK,EAAE;YACH,WAAW;YACX,aAAa;YACb,gBAAgB;YAChB,kBAAkB;YAClB,wBAAwB;YACxB,kBAAkB;YAClB,mBAAmB;YACnB,wBAAwB;YACxB,oBAAoB;YACpB,kBAAkB;YAClB,yBAAyB;YACzB,cAAc;YACd,yBAAyB;YACzB,kBAAkB;YAClB,gBAAgB;YAChB,eAAe;YACf,aAAa;YACb,iBAAiB;YACjB,uBAAuB;YACvB,qBAAqB;YACrB,6BAA6B;YAC7B,uBAAuB;YACvB,uBAAuB;YACvB,oBAAoB;YACpB,iBAAiB;YACjB,uBAAuB;YACvB,kBAAkB;SACrB;KACJ;IAED,cAAc,EAAE;QACZ,WAAW,EACP,uEAAuE;YACvE,uDAAuD;QAC3D,KAAK,EAAE;YACH,cAAc;YACd,iBAAiB;YACjB,gBAAgB;YAChB,WAAW;YACX,WAAW;YACX,aAAa;YACb,yBAAyB;YACzB,kBAAkB;YAClB,gBAAgB;YAChB,4BAA4B;YAC5B,eAAe;YACf,aAAa;YACb,cAAc;YACd,uBAAuB;YACvB,cAAc;YACd,mBAAmB;YACnB,mBAAmB;YACnB,kBAAkB;SACrB;KACJ;CACJ,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC"}