@rockhopper-co/mcp-server 1.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -27
- package/README.md +1 -1
- package/dist/api-client.d.ts +18 -0
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +29 -0
- package/dist/api-client.js.map +1 -1
- package/dist/capabilities.d.ts +41 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +54 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cli.js +53 -5
- package/dist/cli.js.map +1 -1
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +2 -3
- package/dist/correlation.js.map +1 -1
- package/dist/instructions.d.ts +3 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +46 -0
- package/dist/instructions.js.map +1 -0
- package/dist/lib.d.ts +10 -2
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +10 -1
- package/dist/lib.js.map +1 -1
- package/dist/prompts/index.d.ts +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +8 -8
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/changes.d.ts +1 -1
- package/dist/resources/changes.d.ts.map +1 -1
- package/dist/resources/changes.js +1 -1
- package/dist/resources/changes.js.map +1 -1
- package/dist/resources/comments.d.ts +1 -1
- package/dist/resources/comments.d.ts.map +1 -1
- package/dist/resources/comments.js +1 -1
- package/dist/resources/comments.js.map +1 -1
- package/dist/resources/files.d.ts +1 -1
- package/dist/resources/files.d.ts.map +1 -1
- package/dist/resources/files.js +1 -1
- package/dist/resources/files.js.map +1 -1
- package/dist/resources/index.d.ts +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/orchestration-guide.d.ts +1 -1
- package/dist/resources/orchestration-guide.d.ts.map +1 -1
- package/dist/resources/reviews.d.ts +1 -1
- package/dist/resources/reviews.d.ts.map +1 -1
- package/dist/resources/reviews.js +1 -1
- package/dist/resources/reviews.js.map +1 -1
- package/dist/resources/teams.d.ts +1 -1
- package/dist/resources/teams.d.ts.map +1 -1
- package/dist/resources/teams.js +1 -1
- package/dist/resources/teams.js.map +1 -1
- package/dist/resources/versions.d.ts +1 -1
- package/dist/resources/versions.d.ts.map +1 -1
- package/dist/resources/versions.js +1 -1
- package/dist/resources/versions.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +54 -16
- package/dist/server.js.map +1 -1
- package/dist/tools/get-cell-history.d.ts +1 -1
- package/dist/tools/get-cell-history.d.ts.map +1 -1
- package/dist/tools/get-cell-history.js +2 -2
- package/dist/tools/get-cell-history.js.map +1 -1
- package/dist/tools/get-comments.d.ts +1 -1
- package/dist/tools/get-comments.d.ts.map +1 -1
- package/dist/tools/get-comments.js +2 -2
- package/dist/tools/get-comments.js.map +1 -1
- package/dist/tools/get-reviews.d.ts +1 -1
- package/dist/tools/get-reviews.d.ts.map +1 -1
- package/dist/tools/get-reviews.js +2 -2
- package/dist/tools/get-reviews.js.map +1 -1
- package/dist/tools/get-versions.d.ts +1 -1
- package/dist/tools/get-versions.d.ts.map +1 -1
- package/dist/tools/get-versions.js +9 -3
- package/dist/tools/get-versions.js.map +1 -1
- package/dist/tools/index.d.ts +43 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +44 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-files.d.ts +1 -1
- package/dist/tools/list-files.d.ts.map +1 -1
- package/dist/tools/list-files.js +2 -2
- package/dist/tools/list-files.js.map +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +8 -5
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/write-comments.d.ts +1 -1
- package/dist/tools/write-comments.d.ts.map +1 -1
- package/dist/tools/write-comments.js +6 -6
- package/dist/tools/write-comments.js.map +1 -1
- package/dist/tools/write-files.d.ts +1 -1
- package/dist/tools/write-files.d.ts.map +1 -1
- package/dist/tools/write-files.js +2 -2
- package/dist/tools/write-files.js.map +1 -1
- package/dist/tools/write-reviews.d.ts +1 -1
- package/dist/tools/write-reviews.d.ts.map +1 -1
- package/dist/tools/write-reviews.js +6 -6
- package/dist/tools/write-reviews.js.map +1 -1
- package/dist/tools/write-versions.d.ts +1 -1
- package/dist/tools/write-versions.d.ts.map +1 -1
- package/dist/tools/write-versions.js +4 -4
- package/dist/tools/write-versions.js.map +1 -1
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,39 +4,50 @@ All notable changes to this project are documented here. Follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
-
## [
|
|
8
|
-
|
|
9
|
-
**No code changed between `0.10.0` and `1.0.0`.** This release exists to fix a
|
|
10
|
-
versioning trap, and states a compatibility promise that was already true.
|
|
7
|
+
## [2.0.0] — 2026-08-16
|
|
11
8
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
On a `0.x` version npm reads a caret range as **minor-locked**: `^0.9.0` means
|
|
15
|
-
`>=0.9.0 <0.10.0`, not `<1.0.0`. Nobody reads it that way. It cost two releases
|
|
16
|
-
— `mcp-gateway` sat on `^0.9.0` and could not receive `0.10.0`, the very release
|
|
17
|
-
it was waiting for, and before that on the same coupling one release earlier
|
|
18
|
-
(ENG-2165, ENG-2233). At `1.x` a caret finally means "any compatible version".
|
|
19
|
-
|
|
20
|
-
### The compatibility promise
|
|
21
|
-
|
|
22
|
-
From `1.0.0`, a breaking change to any of the following requires a major bump:
|
|
9
|
+
Cuts everything that had accumulated under `[Unreleased]` below. Published by
|
|
10
|
+
ENG-2533, the batched release the MCP-spec epic (ENG-2164) deferred to its end.
|
|
23
11
|
|
|
24
|
-
|
|
25
|
-
schemas are runtime `zod` validators that execute **on the caller's machine**,
|
|
26
|
-
before any request is sent, so narrowing one breaks that caller no matter how
|
|
27
|
-
compatible the backend is. Widening a schema is not breaking; narrowing it is.
|
|
28
|
-
- **Resource URIs and templates**, and the prompts the server registers.
|
|
29
|
-
- **The CLI's flags and its stdio contract.**
|
|
12
|
+
### Why a major
|
|
30
13
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
14
|
+
`engines.node` moved from `>=18.0.0` to `>=20.0.0` (see Breaking, below) — that
|
|
15
|
+
alone requires it under the 1.0.0 compatibility promise. Separately, and more
|
|
16
|
+
visibly to a caller: **which tools get registered now depends on what the
|
|
17
|
+
presenting token was actually granted.** A `read-only` token that saw all 16
|
|
18
|
+
tools on 1.0.0 sees 7 here, and a token holding one write family sees only that
|
|
19
|
+
family's tools. That is the intended behaviour (ENG-2208, ENG-2212) and it is
|
|
20
|
+
still a change a caller can observe, so it ships behind a major.
|
|
34
21
|
|
|
35
|
-
### Note
|
|
22
|
+
### Note on the 1.0.0 → 2.0.0 gap
|
|
36
23
|
|
|
37
|
-
|
|
24
|
+
The `[Unreleased]` block cut here had accumulated across more than one round:
|
|
25
|
+
`0.7.0`, `0.8.0` and `0.10.0` were published without their own headings, and
|
|
26
|
+
`1.0.0` was cut above it rather than below. The entries below are therefore NOT
|
|
27
|
+
all new since 1.0.0. They are left as written rather than retro-attributed to
|
|
28
|
+
releases nobody recorded at the time — an invented attribution would read as
|
|
29
|
+
fact. Everything from here on is dated.
|
|
38
30
|
|
|
39
|
-
|
|
31
|
+
### Changed
|
|
32
|
+
- **Moved to the v2 MCP SDK (ENG-2175).** v2 is a package **split**, not a
|
|
33
|
+
version bump: `@modelcontextprotocol/sdk` stays on the v1 line at 1.30.0
|
|
34
|
+
forever, and v2 ships as `@modelcontextprotocol/{core,server,client,node}`.
|
|
35
|
+
This package now depends on `@modelcontextprotocol/server` (and
|
|
36
|
+
`@modelcontextprotocol/client` for tests). Tool `inputSchema` and prompt
|
|
37
|
+
`argsSchema` are declared as `z.object({...})` rather than the raw
|
|
38
|
+
`{ field: schema }` shape v1 accepted.
|
|
39
|
+
|
|
40
|
+
**Nothing changes on the wire.** v2's `LATEST_PROTOCOL_VERSION` is
|
|
41
|
+
`2025-11-25` — the same value v1 1.30.0 carried — so a connected client
|
|
42
|
+
negotiates exactly the version it did before, and the advertised
|
|
43
|
+
capabilities are unchanged (`prompts`, `resources`, `tools`). Serving
|
|
44
|
+
protocol revision 2026-07-28 is separate work (ENG-2176).
|
|
45
|
+
|
|
46
|
+
### Breaking
|
|
47
|
+
- **`engines.node` moved from `>=18.0.0` to `>=20.0.0`.** Every v2 SDK package
|
|
48
|
+
declares `engines.node: ">=20"`, so the previous floor advertised a Node
|
|
49
|
+
version this package no longer runs on. Node 18 reached end of life on
|
|
50
|
+
2025-04-30.
|
|
40
51
|
|
|
41
52
|
### Added
|
|
42
53
|
- **User and team ids are accepted as uuids (ENG-2230).** `reviewerIds` on
|
|
@@ -230,6 +241,38 @@ Move a `^0.x` range to `^1.0.0`. A `0.x` range will not pick this up.
|
|
|
230
241
|
`@typescript-eslint/no-explicit-any` (mock-stub casts) while production
|
|
231
242
|
code keeps the rule on. Lint is clean across `src/`.
|
|
232
243
|
|
|
244
|
+
## [1.0.0] — 2026-08-10
|
|
245
|
+
|
|
246
|
+
**No code changed between `0.10.0` and `1.0.0`.** This release exists to fix a
|
|
247
|
+
versioning trap, and states a compatibility promise that was already true.
|
|
248
|
+
|
|
249
|
+
### Why 1.0.0
|
|
250
|
+
|
|
251
|
+
On a `0.x` version npm reads a caret range as **minor-locked**: `^0.9.0` means
|
|
252
|
+
`>=0.9.0 <0.10.0`, not `<1.0.0`. Nobody reads it that way. It cost two releases
|
|
253
|
+
— `mcp-gateway` sat on `^0.9.0` and could not receive `0.10.0`, the very release
|
|
254
|
+
it was waiting for, and before that on the same coupling one release earlier
|
|
255
|
+
(ENG-2165, ENG-2233). At `1.x` a caret finally means "any compatible version".
|
|
256
|
+
|
|
257
|
+
### The compatibility promise
|
|
258
|
+
|
|
259
|
+
From `1.0.0`, a breaking change to any of the following requires a major bump:
|
|
260
|
+
|
|
261
|
+
- **Tool names and their input schemas.** These are the load-bearing ones. The
|
|
262
|
+
schemas are runtime `zod` validators that execute **on the caller's machine**,
|
|
263
|
+
before any request is sent, so narrowing one breaks that caller no matter how
|
|
264
|
+
compatible the backend is. Widening a schema is not breaking; narrowing it is.
|
|
265
|
+
- **Resource URIs and templates**, and the prompts the server registers.
|
|
266
|
+
- **The CLI's flags and its stdio contract.**
|
|
267
|
+
|
|
268
|
+
Explicitly **not** covered, and free to change in a minor: internal modules, the
|
|
269
|
+
`dist/` layout, anything reachable only by deep-importing a path this package
|
|
270
|
+
does not document, and log output.
|
|
271
|
+
|
|
272
|
+
### Note for consumers
|
|
273
|
+
|
|
274
|
+
Move a `^0.x` range to `^1.0.0`. A `0.x` range will not pick this up.
|
|
275
|
+
|
|
233
276
|
## [0.6.0] — 2026-05-13
|
|
234
277
|
|
|
235
278
|
> Released to npm as `0.6.0`. The release branch was prepared with
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ MCP (Model Context Protocol) server for Rockhopper. Lets AI tools like Claude, C
|
|
|
4
4
|
|
|
5
5
|
## Prerequisites
|
|
6
6
|
|
|
7
|
-
- Node.js
|
|
7
|
+
- Node.js 20+
|
|
8
8
|
- A Rockhopper account with at least one enrolled file
|
|
9
9
|
- (Optional) A Personal Access Token — only required for headless / CI / scripted setups
|
|
10
10
|
|
package/dist/api-client.d.ts
CHANGED
|
@@ -50,6 +50,8 @@ export declare class ApiClient {
|
|
|
50
50
|
private readonly surface;
|
|
51
51
|
private readonly sessionId;
|
|
52
52
|
private drivingHumanPlatformId;
|
|
53
|
+
private authExpiredHandler?;
|
|
54
|
+
private authExpiredNotified;
|
|
53
55
|
constructor(config: ApiClientConfig);
|
|
54
56
|
/**
|
|
55
57
|
* ENG-1756: declare (or clear) the human driving this agent. The CLI sets
|
|
@@ -59,6 +61,22 @@ export declare class ApiClient {
|
|
|
59
61
|
* working — this header is the explicit, forward-compatible form.
|
|
60
62
|
*/
|
|
61
63
|
setDrivingHuman(platformId: string | null): void;
|
|
64
|
+
/**
|
|
65
|
+
* ENG-2208 — run `handler` the FIRST time this client sees a 401, and never
|
|
66
|
+
* again for the life of the client.
|
|
67
|
+
*
|
|
68
|
+
* A token that expires mid-session is silent today: the 401 becomes an error
|
|
69
|
+
* string inside a tool result, which the model reads and the human does not.
|
|
70
|
+
* The CLI registers a handler that writes one stderr line, and registers it
|
|
71
|
+
* only AFTER the `/users/me` preflight has succeeded — so a token that was
|
|
72
|
+
* already dead at launch takes the startup path (which exits with its own
|
|
73
|
+
* message) and can never double-report here.
|
|
74
|
+
*
|
|
75
|
+
* 401 only. A 403 is an authorisation answer about one resource, not a dead
|
|
76
|
+
* token, and telling a customer to re-mint their token over a permission
|
|
77
|
+
* denial sends them to fix the wrong thing.
|
|
78
|
+
*/
|
|
79
|
+
setAuthExpiredHandler(handler: () => void): void;
|
|
62
80
|
/**
|
|
63
81
|
* KI-096: optional `responseSchema` validates the response shape with
|
|
64
82
|
* zod. When supplied, drift between backend's actual response and the
|
package/dist/api-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,UAAU,EACV,6BAA6B,EAC7B,cAAc,EACd,aAAa,EACb,YAAY,EACZ,IAAI,EACJ,kBAAkB,EAClB,WAAW,EACZ,MAAM,YAAY,CAAC;AA8BpB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE;QAClB,sEAAsE;QACtE,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,0EAA0E;QAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,mEAAmE;QACnE,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;CACH;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAKD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,sBAAsB,CAAgB;
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/api-client.js
CHANGED
|
@@ -44,6 +44,8 @@ export class ApiClient {
|
|
|
44
44
|
surface;
|
|
45
45
|
sessionId;
|
|
46
46
|
drivingHumanPlatformId;
|
|
47
|
+
authExpiredHandler;
|
|
48
|
+
authExpiredNotified = false;
|
|
47
49
|
constructor(config) {
|
|
48
50
|
this.baseUrl = config.baseUrl.replace(/\/+$/, '');
|
|
49
51
|
this.token = config.token;
|
|
@@ -63,6 +65,24 @@ export class ApiClient {
|
|
|
63
65
|
setDrivingHuman(platformId) {
|
|
64
66
|
this.drivingHumanPlatformId = platformId;
|
|
65
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* ENG-2208 — run `handler` the FIRST time this client sees a 401, and never
|
|
70
|
+
* again for the life of the client.
|
|
71
|
+
*
|
|
72
|
+
* A token that expires mid-session is silent today: the 401 becomes an error
|
|
73
|
+
* string inside a tool result, which the model reads and the human does not.
|
|
74
|
+
* The CLI registers a handler that writes one stderr line, and registers it
|
|
75
|
+
* only AFTER the `/users/me` preflight has succeeded — so a token that was
|
|
76
|
+
* already dead at launch takes the startup path (which exits with its own
|
|
77
|
+
* message) and can never double-report here.
|
|
78
|
+
*
|
|
79
|
+
* 401 only. A 403 is an authorisation answer about one resource, not a dead
|
|
80
|
+
* token, and telling a customer to re-mint their token over a permission
|
|
81
|
+
* denial sends them to fix the wrong thing.
|
|
82
|
+
*/
|
|
83
|
+
setAuthExpiredHandler(handler) {
|
|
84
|
+
this.authExpiredHandler = handler;
|
|
85
|
+
}
|
|
66
86
|
/**
|
|
67
87
|
* KI-096: optional `responseSchema` validates the response shape with
|
|
68
88
|
* zod. When supplied, drift between backend's actual response and the
|
|
@@ -139,6 +159,15 @@ export class ApiClient {
|
|
|
139
159
|
durationMs,
|
|
140
160
|
classification,
|
|
141
161
|
}, 'api_request_failed');
|
|
162
|
+
// ENG-2208: one-shot mid-session expiry notice (see
|
|
163
|
+
// {@link setAuthExpiredHandler}). Guarded on the handler existing so the
|
|
164
|
+
// "first 401" is the first one anybody is listening for.
|
|
165
|
+
if (response.status === 401 &&
|
|
166
|
+
this.authExpiredHandler &&
|
|
167
|
+
!this.authExpiredNotified) {
|
|
168
|
+
this.authExpiredNotified = true;
|
|
169
|
+
this.authExpiredHandler();
|
|
170
|
+
}
|
|
142
171
|
const body = await response.text().catch(() => '');
|
|
143
172
|
if (notReady) {
|
|
144
173
|
throw new ChangeHistoryNotReadyError({
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAelC,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAExB;;;;;;GAMG;AACH,SAAS,sBAAsB,CAAC,QAE/B;IACC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,2BAA2B,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC;QAC5C,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,2BAA2B,CAAC;AAClC,CAAC;AAmCD;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,MAAM,CAAS;IACxB,YAAY,MAAc,EAAE,OAAe;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,qEAAqE;AACrE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAElE,MAAM,OAAO,SAAS;IACH,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,aAAa,CAAU;IACvB,OAAO,CAAS;IAChB,SAAS,CAAS;IAC3B,sBAAsB,CAAgB;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ENG-2212 — the write-capability VOCABULARY, kept apart from the registrars
|
|
3
|
+
* that act on it.
|
|
4
|
+
*
|
|
5
|
+
* Its own module because `instructions.ts` needs the tool names per family and
|
|
6
|
+
* `tools/index.ts` needs the registrars: folding both into one module means
|
|
7
|
+
* every test that mocks the registration seam also has to restate the
|
|
8
|
+
* vocabulary, and a restated vocabulary is one that drifts.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* The four write families a Personal Access Token may hold, in the order they
|
|
12
|
+
* are reported and rendered. Mirrors the backend's `PatCapability`
|
|
13
|
+
* (`backend/src/resources/personal-access-tokens/pat-capabilities.ts`) and the
|
|
14
|
+
* `CHK_pat_scopes_vocabulary` constraint on the stored column.
|
|
15
|
+
*/
|
|
16
|
+
export declare const PAT_CAPABILITIES: readonly ["comments:write", "reviews:write", "versions:write", "files:write"];
|
|
17
|
+
export type PatCapability = (typeof PAT_CAPABILITIES)[number];
|
|
18
|
+
export declare const CAPABILITY_SET: ReadonlySet<string>;
|
|
19
|
+
/**
|
|
20
|
+
* The write tools each family covers.
|
|
21
|
+
*
|
|
22
|
+
* This is the VOCABULARY, not the registration list: `enroll_file` is named
|
|
23
|
+
* here before any registrar registers it, because plan 13's ENG-2200 adds that
|
|
24
|
+
* tool this release and is blockedBy this ticket. Carrying the edge now means
|
|
25
|
+
* that ticket adds a registrar and drops one entry from
|
|
26
|
+
* {@link PENDING_WRITE_TOOLS}, rather than re-cutting the family map in every
|
|
27
|
+
* repo that copied it.
|
|
28
|
+
*/
|
|
29
|
+
export declare const WRITE_TOOLS_BY_CAPABILITY: Readonly<Record<PatCapability, readonly string[]>>;
|
|
30
|
+
/**
|
|
31
|
+
* Names in {@link WRITE_TOOLS_BY_CAPABILITY} that no registrar registers yet.
|
|
32
|
+
*
|
|
33
|
+
* Kept explicit so the instructions string never advertises a tool the model
|
|
34
|
+
* cannot call, and so `tools.capability-gate.test.ts` can assert that every
|
|
35
|
+
* OTHER enumerated name really is registered — a set derived from the
|
|
36
|
+
* registrars rather than a second hand-maintained list that silently drifts.
|
|
37
|
+
*/
|
|
38
|
+
export declare const PENDING_WRITE_TOOLS: ReadonlySet<string>;
|
|
39
|
+
/** The tools a granted family actually adds to the surface today. */
|
|
40
|
+
export declare function registeredToolsForCapabilities(capabilities: readonly PatCapability[]): string[];
|
|
41
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,+EAKnB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAA6B,CAAC;AAE7E;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAC9C,MAAM,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC,CAMzC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAElD,CAAC;AAEH,qEAAqE;AACrE,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,SAAS,aAAa,EAAE,GACrC,MAAM,EAAE,CAMV"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ENG-2212 — the write-capability VOCABULARY, kept apart from the registrars
|
|
3
|
+
* that act on it.
|
|
4
|
+
*
|
|
5
|
+
* Its own module because `instructions.ts` needs the tool names per family and
|
|
6
|
+
* `tools/index.ts` needs the registrars: folding both into one module means
|
|
7
|
+
* every test that mocks the registration seam also has to restate the
|
|
8
|
+
* vocabulary, and a restated vocabulary is one that drifts.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* The four write families a Personal Access Token may hold, in the order they
|
|
12
|
+
* are reported and rendered. Mirrors the backend's `PatCapability`
|
|
13
|
+
* (`backend/src/resources/personal-access-tokens/pat-capabilities.ts`) and the
|
|
14
|
+
* `CHK_pat_scopes_vocabulary` constraint on the stored column.
|
|
15
|
+
*/
|
|
16
|
+
export const PAT_CAPABILITIES = [
|
|
17
|
+
'comments:write',
|
|
18
|
+
'reviews:write',
|
|
19
|
+
'versions:write',
|
|
20
|
+
'files:write',
|
|
21
|
+
];
|
|
22
|
+
export const CAPABILITY_SET = new Set(PAT_CAPABILITIES);
|
|
23
|
+
/**
|
|
24
|
+
* The write tools each family covers.
|
|
25
|
+
*
|
|
26
|
+
* This is the VOCABULARY, not the registration list: `enroll_file` is named
|
|
27
|
+
* here before any registrar registers it, because plan 13's ENG-2200 adds that
|
|
28
|
+
* tool this release and is blockedBy this ticket. Carrying the edge now means
|
|
29
|
+
* that ticket adds a registrar and drops one entry from
|
|
30
|
+
* {@link PENDING_WRITE_TOOLS}, rather than re-cutting the family map in every
|
|
31
|
+
* repo that copied it.
|
|
32
|
+
*/
|
|
33
|
+
export const WRITE_TOOLS_BY_CAPABILITY = {
|
|
34
|
+
'comments:write': ['add_comment', 'reply_to_comment', 'resolve_comment'],
|
|
35
|
+
'reviews:write': ['create_review_request', 'approve_review', 'cancel_review'],
|
|
36
|
+
'versions:write': ['create_version', 'discard_changes'],
|
|
37
|
+
'files:write': ['rename_file', 'enroll_file'],
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Names in {@link WRITE_TOOLS_BY_CAPABILITY} that no registrar registers yet.
|
|
41
|
+
*
|
|
42
|
+
* Kept explicit so the instructions string never advertises a tool the model
|
|
43
|
+
* cannot call, and so `tools.capability-gate.test.ts` can assert that every
|
|
44
|
+
* OTHER enumerated name really is registered — a set derived from the
|
|
45
|
+
* registrars rather than a second hand-maintained list that silently drifts.
|
|
46
|
+
*/
|
|
47
|
+
export const PENDING_WRITE_TOOLS = new Set([
|
|
48
|
+
'enroll_file',
|
|
49
|
+
]);
|
|
50
|
+
/** The tools a granted family actually adds to the surface today. */
|
|
51
|
+
export function registeredToolsForCapabilities(capabilities) {
|
|
52
|
+
return capabilities.flatMap((capability) => WRITE_TOOLS_BY_CAPABILITY[capability].filter((name) => !PENDING_WRITE_TOOLS.has(name)));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,aAAa;CACL,CAAC;AAIX,MAAM,CAAC,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAE7E;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAElC;IACF,gBAAgB,EAAE,CAAC,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,CAAC;IACxE,eAAe,EAAE,CAAC,uBAAuB,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC7E,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IACvD,aAAa,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;CAC9C,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC;IAC9D,aAAa;CACd,CAAC,CAAC;AAEH,qEAAqE;AACrE,MAAM,UAAU,8BAA8B,CAC5C,YAAsC;IAEtC,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CACzC,yBAAyB,CAAC,UAAU,CAAC,CAAC,MAAM,CAC1C,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CACzC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { serveStdio } from '@modelcontextprotocol/server/stdio';
|
|
3
3
|
import { ApiClient } from './api-client.js';
|
|
4
4
|
import { AuthResolutionError, resolveAuth, } from './auth/resolve-auth.js';
|
|
5
5
|
import { flushLoggerSync, initLogger, log, serviceVersion, } from './logger.js';
|
|
@@ -63,8 +63,18 @@ const apiClient = new ApiClient({
|
|
|
63
63
|
baseUrl: ROCKHOPPER_API_URL,
|
|
64
64
|
token: resolved.accessToken,
|
|
65
65
|
});
|
|
66
|
+
// ENG-2208: the scope the token reports about ITSELF (ENG-2205 put it on the
|
|
67
|
+
// preflight response). Left undefined by a backend older than that, and by any
|
|
68
|
+
// non-PAT principal — both of which the allow-list in `tools/index.ts` denies.
|
|
69
|
+
let patScope;
|
|
70
|
+
// ENG-2212: the write families the token actually holds. Absent against a
|
|
71
|
+
// backend older than ENG-2211, which is why `patScope` is still read — absent
|
|
72
|
+
// means "the backend said nothing", and the coarse scope decides.
|
|
73
|
+
let patCapabilities;
|
|
66
74
|
try {
|
|
67
75
|
const me = await apiClient.getMe();
|
|
76
|
+
patScope = me?.patScope;
|
|
77
|
+
patCapabilities = me?.patScopes;
|
|
68
78
|
// ENG-1756 (plan §9 decision 15): the PAT owner IS the human driving this
|
|
69
79
|
// local agent — reuse the preflight to declare them, so every write carries
|
|
70
80
|
// `X-Driving-Human` and the backend's anonymous-agent-write admission
|
|
@@ -95,9 +105,47 @@ catch (err) {
|
|
|
95
105
|
}
|
|
96
106
|
process.exit(1);
|
|
97
107
|
}
|
|
98
|
-
|
|
108
|
+
// ENG-2208: the preflight succeeded, so from here a 401 means the token died
|
|
109
|
+
// mid-session. Report it once on stderr — the only channel a stdio server has
|
|
110
|
+
// to the human — instead of leaving it as an error string inside a tool result
|
|
111
|
+
// that only the model ever reads.
|
|
112
|
+
apiClient.setAuthExpiredHandler(() => {
|
|
113
|
+
log.warn({ event: 'auth_failed', reason: 'expired_mid_session' }, 'auth_failed');
|
|
114
|
+
console.error('Error: Rockhopper rejected the token (401) — it expired or was revoked after this server started. ' +
|
|
115
|
+
'Create a new Personal Access Token in Rockhopper Settings and restart this MCP server.');
|
|
116
|
+
});
|
|
117
|
+
// ENG-2208: register only what this token may do. `createServer(apiClient)` —
|
|
118
|
+
// one argument — used to register all nine write tools for every launch, so a
|
|
119
|
+
// read-only token advertised writes it could not perform and the customer's
|
|
120
|
+
// scope choice surfaced as a 403 rendered into tool text.
|
|
121
|
+
//
|
|
122
|
+
// ENG-2176: a FACTORY now, not one instance. `serveStdio` owns the era
|
|
123
|
+
// decision for the connection and calls this per connection — plus once more
|
|
124
|
+
// for a `server/discover` probe it discards if the client falls back to
|
|
125
|
+
// `initialize`. Each call must therefore hand back a fresh server.
|
|
126
|
+
//
|
|
127
|
+
// ENG-2212: the FAMILIES ride along. When the backend serves them they decide
|
|
128
|
+
// which registrars run, one per family, so a token granted `comments:write`
|
|
129
|
+
// alone no longer receives `discard_changes`.
|
|
130
|
+
const buildServer = () => createServer(apiClient, { scope: patScope, capabilities: patCapabilities });
|
|
99
131
|
// KI-225: one line per launch — anchors a session in the file.
|
|
100
|
-
log.info({
|
|
101
|
-
|
|
102
|
-
|
|
132
|
+
log.info({
|
|
133
|
+
event: 'mcp_server_start',
|
|
134
|
+
version: serviceVersion,
|
|
135
|
+
scope: patScope ?? 'unknown',
|
|
136
|
+
capabilities: patCapabilities ?? 'unknown',
|
|
137
|
+
}, 'mcp_server_start');
|
|
138
|
+
// ENG-2176: `serveStdio`, not `new StdioServerTransport()` + `connect`. The
|
|
139
|
+
// modern (2026-07-28) handlers — `server/discover`, and adding `2026-07-28`
|
|
140
|
+
// to the instance's supported-versions list — are installed by the SERVING
|
|
141
|
+
// ENTRY, never by the server object: the SDK's default
|
|
142
|
+
// `SUPPORTED_PROTOCOL_VERSIONS` names only 2025-era revisions, so a
|
|
143
|
+
// hand-connected server answers `server/discover` with `-32601` forever.
|
|
144
|
+
// `legacy: 'serve'` (the default) keeps a 2025-era client working unchanged —
|
|
145
|
+
// it pins the connection to a 2025 instance from this same factory.
|
|
146
|
+
serveStdio(buildServer, {
|
|
147
|
+
onerror: (err) => {
|
|
148
|
+
log.error({ event: 'stdio_serving_error', err }, 'stdio_serving_error');
|
|
149
|
+
},
|
|
150
|
+
});
|
|
103
151
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"AAkBA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,IAAI,MAAM,CAAC,EACX,KAAI,MAAqB,KACxB,CAAoB,CAAC;AAExB,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,QAAO,MAAM,GAAG,SAA2B,CAAC"}
|
package/dist/correlation.js
CHANGED
|
@@ -10,9 +10,8 @@ import { randomUUID } from 'node:crypto';
|
|
|
10
10
|
* traceable as a group in backend logs.
|
|
11
11
|
*
|
|
12
12
|
* The id is a non-sensitive UUID v4 — never co-log the bearer token with it.
|
|
13
|
-
* `randomUUID` comes from `node:crypto` (NOT the global `crypto`)
|
|
14
|
-
*
|
|
15
|
-
* guaranteed.
|
|
13
|
+
* `randomUUID` comes from `node:crypto` (NOT the global `crypto`): the explicit
|
|
14
|
+
* import is the portable form and does not depend on the global being present.
|
|
16
15
|
*/
|
|
17
16
|
const als = new AsyncLocalStorage();
|
|
18
17
|
/**
|
package/dist/correlation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"correlation.js","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC
|
|
1
|
+
{"version":3,"file":"correlation.js","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;;;;GAYG;AACH,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAU,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,EAAW,EACX,KAAa,UAAU,EAAE,EACtB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAExB,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAuB,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAkC3B,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,SAAS,aAAa,EAAE,GACrC,MAAM,CA4BR"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { PAT_CAPABILITIES, registeredToolsForCapabilities, } from './capabilities.js';
|
|
2
|
+
/**
|
|
3
|
+
* ENG-2212 — the `instructions` string the model reads, built from the SAME
|
|
4
|
+
* families that decide which registrars run.
|
|
5
|
+
*
|
|
6
|
+
* It used to say one of two things: "this token is read-only", or a list of
|
|
7
|
+
* all nine write tools. A token holding `comments:write` alone got the second
|
|
8
|
+
* sentence and was told `discard_changes` existed — so the model planned work
|
|
9
|
+
* it could not perform, and the customer's narrowing surfaced as a
|
|
10
|
+
* method-not-found error mid-task.
|
|
11
|
+
*/
|
|
12
|
+
const PREAMBLE = 'Rockhopper MCP server for managing Excel file metadata. ' +
|
|
13
|
+
'Use list_files first to discover available files, then drill into ' +
|
|
14
|
+
'versions, comments, reviews, or cell history. ';
|
|
15
|
+
const FILE_IDS = 'File IDs use the platformId field (e.g. from list_files output).';
|
|
16
|
+
/** What each family is called in a sentence a model reads. */
|
|
17
|
+
const FAMILY_PROSE = {
|
|
18
|
+
'comments:write': 'comments',
|
|
19
|
+
'reviews:write': 'reviews',
|
|
20
|
+
'versions:write': 'versions',
|
|
21
|
+
'files:write': 'files',
|
|
22
|
+
};
|
|
23
|
+
function list(parts) {
|
|
24
|
+
if (parts.length <= 1)
|
|
25
|
+
return parts[0] ?? '';
|
|
26
|
+
return `${parts.slice(0, -1).join(', ')} and ${parts[parts.length - 1]}`;
|
|
27
|
+
}
|
|
28
|
+
export function buildInstructions(capabilities) {
|
|
29
|
+
if (capabilities.length === 0) {
|
|
30
|
+
return ('Rockhopper MCP server for reading Excel file metadata. ' +
|
|
31
|
+
'Use list_files first to discover available files, then drill into ' +
|
|
32
|
+
'versions, comments, reviews, or cell history. ' +
|
|
33
|
+
'This token is read-only — write operations are not available. ' +
|
|
34
|
+
FILE_IDS);
|
|
35
|
+
}
|
|
36
|
+
const granted = registeredToolsForCapabilities(capabilities);
|
|
37
|
+
const withheld = PAT_CAPABILITIES.filter((c) => !capabilities.includes(c));
|
|
38
|
+
const withheldSentence = withheld.length === 0
|
|
39
|
+
? ''
|
|
40
|
+
: `No other write operations are available to this token — it was not granted ${list(withheld.map((c) => FAMILY_PROSE[c]))}. `;
|
|
41
|
+
return (PREAMBLE +
|
|
42
|
+
`This token may write ${list(capabilities.map((c) => FAMILY_PROSE[c]))}: ${granted.join(', ')}. ` +
|
|
43
|
+
withheldSentence +
|
|
44
|
+
FILE_IDS);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,8BAA8B,GAE/B,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;GASG;AAEH,MAAM,QAAQ,GACZ,0DAA0D;IAC1D,oEAAoE;IACpE,gDAAgD,CAAC;AAEnD,MAAM,QAAQ,GACZ,kEAAkE,CAAC;AAErE,8DAA8D;AAC9D,MAAM,YAAY,GAA4C;IAC5D,gBAAgB,EAAE,UAAU;IAC5B,eAAe,EAAE,SAAS;IAC1B,gBAAgB,EAAE,UAAU;IAC5B,aAAa,EAAE,OAAO;CACvB,CAAC;AAEF,SAAS,IAAI,CAAC,KAAwB;IACpC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,YAAsC;IAEtC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CACL,yDAAyD;YACzD,oEAAoE;YACpE,gDAAgD;YAChD,gEAAgE;YAChE,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,gBAAgB,GACpB,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,8EAA8E,IAAI,CAChF,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CACrC,IAAI,CAAC;IAEZ,OAAO,CACL,QAAQ;QACR,wBAAwB,IAAI,CAC1B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CACzC,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC5B,gBAAgB;QAChB,QAAQ,CACT,CAAC;AACJ,CAAC"}
|
package/dist/lib.d.ts
CHANGED
|
@@ -12,12 +12,20 @@
|
|
|
12
12
|
* with their own transport (HTTP, in-memory, etc.).
|
|
13
13
|
*
|
|
14
14
|
* Stable API surface (semver-bound):
|
|
15
|
-
* - `createServer(apiClient): McpServer`
|
|
15
|
+
* - `createServer(apiClient, options?): McpServer`
|
|
16
|
+
* - `grantsWriteTools(scope)` — the write allow-list (ENG-2208), exported so
|
|
17
|
+
* the gateway asks the same question instead of writing a second copy of
|
|
18
|
+
* the rule that would drift from this one.
|
|
19
|
+
* - `PAT_CAPABILITIES`, `WRITE_TOOLS_BY_CAPABILITY`, `PENDING_WRITE_TOOLS`
|
|
20
|
+
* and `resolveCapabilities` (ENG-2212) — the four write families, which
|
|
21
|
+
* tools each covers, and how a grant is resolved. Exported for the same
|
|
22
|
+
* reason: the gateway has to answer "which family does this tool need"
|
|
23
|
+
* BEFORE it builds a server, and a hand-copied list drifts.
|
|
16
24
|
* - `ApiClient` (class) and `ApiClientConfig` (interface)
|
|
17
25
|
* - All `types` (Team, EnrolledFile, FileVersion, ...)
|
|
18
26
|
*/
|
|
19
27
|
export { createServer } from './server.js';
|
|
20
|
-
export { type RegisterToolsOptions } from './tools/index.js';
|
|
28
|
+
export { grantsWriteTools, resolveCapabilities, registeredToolsForCapabilities, PAT_CAPABILITIES, PENDING_WRITE_TOOLS, WRITE_TOOLS_BY_CAPABILITY, type PatCapability, type RegisterToolsOptions, } from './tools/index.js';
|
|
21
29
|
export { ApiClient, type ApiClientConfig } from './api-client.js';
|
|
22
30
|
export * from './types.js';
|
|
23
31
|
//# sourceMappingURL=lib.d.ts.map
|
package/dist/lib.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,8BAA8B,EAC9B,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClE,cAAc,YAAY,CAAC"}
|
package/dist/lib.js
CHANGED
|
@@ -12,11 +12,20 @@
|
|
|
12
12
|
* with their own transport (HTTP, in-memory, etc.).
|
|
13
13
|
*
|
|
14
14
|
* Stable API surface (semver-bound):
|
|
15
|
-
* - `createServer(apiClient): McpServer`
|
|
15
|
+
* - `createServer(apiClient, options?): McpServer`
|
|
16
|
+
* - `grantsWriteTools(scope)` — the write allow-list (ENG-2208), exported so
|
|
17
|
+
* the gateway asks the same question instead of writing a second copy of
|
|
18
|
+
* the rule that would drift from this one.
|
|
19
|
+
* - `PAT_CAPABILITIES`, `WRITE_TOOLS_BY_CAPABILITY`, `PENDING_WRITE_TOOLS`
|
|
20
|
+
* and `resolveCapabilities` (ENG-2212) — the four write families, which
|
|
21
|
+
* tools each covers, and how a grant is resolved. Exported for the same
|
|
22
|
+
* reason: the gateway has to answer "which family does this tool need"
|
|
23
|
+
* BEFORE it builds a server, and a hand-copied list drifts.
|
|
16
24
|
* - `ApiClient` (class) and `ApiClientConfig` (interface)
|
|
17
25
|
* - All `types` (Team, EnrolledFile, FileVersion, ...)
|
|
18
26
|
*/
|
|
19
27
|
export { createServer } from './server.js';
|
|
28
|
+
export { grantsWriteTools, resolveCapabilities, registeredToolsForCapabilities, PAT_CAPABILITIES, PENDING_WRITE_TOOLS, WRITE_TOOLS_BY_CAPABILITY, } from './tools/index.js';
|
|
20
29
|
export { ApiClient } from './api-client.js';
|
|
21
30
|
export * from './types.js';
|
|
22
31
|
//# sourceMappingURL=lib.js.map
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,8BAA8B,EAC9B,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,GAG1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAClE,cAAc,YAAY,CAAC"}
|