@rockhopper-co/mcp-server 0.7.0 → 0.8.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/CHANGELOG.md +22 -0
- package/README.md +23 -0
- package/dist/api-client.d.ts +11 -0
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +57 -8
- package/dist/api-client.js.map +1 -1
- package/dist/auth/device-grant-client.d.ts.map +1 -1
- package/dist/auth/device-grant-client.js +3 -1
- package/dist/auth/device-grant-client.js.map +1 -1
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -1
- package/dist/correlation.d.ts +9 -0
- package/dist/correlation.d.ts.map +1 -0
- package/dist/correlation.js +26 -0
- package/dist/correlation.js.map +1 -0
- package/dist/logger.d.ts +42 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +159 -0
- package/dist/logger.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +37 -0
- package/dist/server.js.map +1 -1
- package/dist/zod-schemas.d.ts +6 -54
- package/dist/zod-schemas.d.ts.map +1 -1
- package/package.json +11 -9
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,28 @@ All notable changes to this project are documented here. Follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
### Added
|
|
10
|
+
- **Local rotating diagnostic logfile (KI-225).** The server now writes a
|
|
11
|
+
local diagnostic log to `~/.rockhopper/mcp-server/` (rotated via
|
|
12
|
+
`pino-roll`, ~5 MB × 5 files). It captures request latency plus the
|
|
13
|
+
client-side failures the backend never sees — network-unreachable
|
|
14
|
+
(`api_unreachable`), local auth rejection (`auth_failed`), response schema
|
|
15
|
+
drift (`schema_validation_failed`), per-tool-call timing (`tool_call` /
|
|
16
|
+
`tool_call_failed`), and uncaught crashes (`uncaught_exception` /
|
|
17
|
+
`unhandled_rejection`). Every line auto-carries the Phase 1.1
|
|
18
|
+
`correlationId`.
|
|
19
|
+
- **File only — never stdout** (stdout is the MCP stdio transport). On any
|
|
20
|
+
failure to open the file, logging degrades to a no-op; the server never
|
|
21
|
+
crashes and never writes to stdout.
|
|
22
|
+
- **No remote transmission.** The file stays on the customer's machine and
|
|
23
|
+
can be handed to support.
|
|
24
|
+
- **Redacted.** Tokens, `Authorization` headers, request/response bodies,
|
|
25
|
+
tool arguments, and cell data are never logged — only event, method, URL
|
|
26
|
+
pathname (no query), status, durationMs, tool name, correlationId,
|
|
27
|
+
version, and error type/message.
|
|
28
|
+
- Configurable via `ROCKHOPPER_MCP_LOG_DIR` / `ROCKHOPPER_MCP_LOG_LEVEL`;
|
|
29
|
+
disable with `ROCKHOPPER_MCP_LOG_DISABLE`.
|
|
30
|
+
|
|
9
31
|
### Fixed
|
|
10
32
|
- **`get_cell_history`, `resolve_comment`, and `rename_file` no longer
|
|
11
33
|
render `undefined` for every field (KI-096).** Diagnosis revealed the
|
package/README.md
CHANGED
|
@@ -98,6 +98,29 @@ Add to `.cursor/mcp.json` in your project:
|
|
|
98
98
|
|----------|----------|---------|-------------|
|
|
99
99
|
| `ROCKHOPPER_TOKEN` | No | — | Personal Access Token (starts with `rh_pat_`). When unset, OAuth device-grant flow runs on first launch. |
|
|
100
100
|
| `ROCKHOPPER_API_URL` | No | `https://api.rockhopper.co` | Rockhopper API base URL |
|
|
101
|
+
| `ROCKHOPPER_MCP_LOG_DIR` | No | `~/.rockhopper/mcp-server/` | Directory for the local diagnostic logfile (see below). |
|
|
102
|
+
| `ROCKHOPPER_MCP_LOG_DISABLE` | No | — | Set truthy (`1` / `true`) to disable local diagnostic logging entirely. |
|
|
103
|
+
| `ROCKHOPPER_MCP_LOG_LEVEL` | No | `info` | Diagnostic log level (`fatal` / `error` / `warn` / `info` / `debug` / `trace` / `silent`). |
|
|
104
|
+
|
|
105
|
+
## Diagnostic Logging
|
|
106
|
+
|
|
107
|
+
The server writes a **local diagnostic logfile** to `~/.rockhopper/mcp-server/`
|
|
108
|
+
(rotated, size-capped at ~5 MB × 5 files, named `mcp-server.<n>.log`). It
|
|
109
|
+
records request latency and the client-side failures the API never sees —
|
|
110
|
+
network-unreachable errors, local auth rejections, response schema drift, and
|
|
111
|
+
uncaught crashes — so you can hand the file to Rockhopper support when
|
|
112
|
+
something misbehaves.
|
|
113
|
+
|
|
114
|
+
- **Local only.** Nothing is transmitted anywhere — the file stays on your
|
|
115
|
+
machine. There is no remote telemetry.
|
|
116
|
+
- **Redacted.** Tokens, the `Authorization` header, request/response bodies,
|
|
117
|
+
tool arguments, and cell data are **never** written. Lines carry only
|
|
118
|
+
event name, HTTP method, URL pathname (no query string), status code,
|
|
119
|
+
duration, tool name, a correlation id, and error type/message.
|
|
120
|
+
- **Configurable.** Point it elsewhere with `ROCKHOPPER_MCP_LOG_DIR`, change
|
|
121
|
+
verbosity with `ROCKHOPPER_MCP_LOG_LEVEL`, or turn it off with
|
|
122
|
+
`ROCKHOPPER_MCP_LOG_DISABLE=1`. If the file can't be opened, logging
|
|
123
|
+
silently disables — it never interferes with the server.
|
|
101
124
|
|
|
102
125
|
## Postman
|
|
103
126
|
|
package/dist/api-client.d.ts
CHANGED
|
@@ -2,10 +2,21 @@ import type { CellHistoryEntry, EnrolledFile, FileChat, FileVersion, PaginatedUn
|
|
|
2
2
|
export interface ApiClientConfig {
|
|
3
3
|
baseUrl: string;
|
|
4
4
|
token: string;
|
|
5
|
+
/**
|
|
6
|
+
* Phase 1.1 / KI-226 — optional fixed correlation id stamped on every
|
|
7
|
+
* outbound request's `X-Correlation-Id` header. The mcp-gateway sets this
|
|
8
|
+
* to forward its own per-request id onto tool-call traffic (it constructs a
|
|
9
|
+
* fresh `ApiClient` per request). Precedence for the header value:
|
|
10
|
+
* an explicit per-call `init.headers['X-Correlation-Id']` >
|
|
11
|
+
* this config value > the per-tool-call ALS id (`getCorrelationId()`) >
|
|
12
|
+
* a freshly minted UUID v4.
|
|
13
|
+
*/
|
|
14
|
+
correlationId?: string;
|
|
5
15
|
}
|
|
6
16
|
export declare class ApiClient {
|
|
7
17
|
private readonly baseUrl;
|
|
8
18
|
private readonly token;
|
|
19
|
+
private readonly correlationId?;
|
|
9
20
|
constructor(config: ApiClientConfig);
|
|
10
21
|
/**
|
|
11
22
|
* KI-096: optional `responseSchema` validates the response shape with
|
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":"
|
|
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
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { getCorrelationId } from './correlation.js';
|
|
3
|
+
import { log } from './logger.js';
|
|
1
4
|
import { CellHistoryEntryArraySchema, EnrolledFileSchema, FileChatSchema, } from './zod-schemas.js';
|
|
2
5
|
export class ApiClient {
|
|
3
6
|
baseUrl;
|
|
4
7
|
token;
|
|
8
|
+
correlationId;
|
|
5
9
|
constructor(config) {
|
|
6
10
|
this.baseUrl = config.baseUrl.replace(/\/+$/, '');
|
|
7
11
|
this.token = config.token;
|
|
12
|
+
this.correlationId = config.correlationId;
|
|
8
13
|
}
|
|
9
14
|
/**
|
|
10
15
|
* KI-096: optional `responseSchema` validates the response shape with
|
|
@@ -16,18 +21,53 @@ export class ApiClient {
|
|
|
16
21
|
*/
|
|
17
22
|
async request(path, init, responseSchema) {
|
|
18
23
|
const url = `${this.baseUrl}${path}`;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
// KI-225: log only the URL pathname (drop the query string) — query may
|
|
25
|
+
// carry search terms / cell refs; it never carries the token (header
|
|
26
|
+
// only), but it's not a safe field to persist.
|
|
27
|
+
const pathname = path.split('?')[0];
|
|
28
|
+
const method = (init?.method ?? 'GET').toUpperCase();
|
|
29
|
+
const start = Date.now();
|
|
30
|
+
let response;
|
|
31
|
+
try {
|
|
32
|
+
response = await fetch(url, {
|
|
33
|
+
...init,
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer ${this.token}`,
|
|
36
|
+
'Content-Type': 'application/json',
|
|
37
|
+
// KI-226: trace this request in backend logs. Placed BEFORE the
|
|
38
|
+
// `...init?.headers` spread so a per-call header still wins but the
|
|
39
|
+
// id can't be dropped. Precedence: per-call > config > ALS > mint.
|
|
40
|
+
// Non-sensitive UUID — never co-logged with the bearer token above.
|
|
41
|
+
'X-Correlation-Id': this.correlationId ?? getCorrelationId() ?? randomUUID(),
|
|
42
|
+
...init?.headers,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
// KI-225: the can't-reach-the-API case — a thrown fetch is a network
|
|
48
|
+
// failure, the class of error that NEVER reaches the backend log.
|
|
49
|
+
log.error({ event: 'api_unreachable', method, path: pathname, durationMs: Date.now() - start, err }, 'api_unreachable');
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
const durationMs = Date.now() - start;
|
|
27
53
|
if (!response.ok) {
|
|
54
|
+
// KI-225: classify auth rejections (401/403) so they're greppable
|
|
55
|
+
// separately from generic HTTP errors.
|
|
56
|
+
const classification = response.status === 401 || response.status === 403
|
|
57
|
+
? 'auth_failed'
|
|
58
|
+
: 'http_error';
|
|
59
|
+
log.warn({
|
|
60
|
+
event: 'api_request_failed',
|
|
61
|
+
method,
|
|
62
|
+
path: pathname,
|
|
63
|
+
status: response.status,
|
|
64
|
+
durationMs,
|
|
65
|
+
classification,
|
|
66
|
+
}, 'api_request_failed');
|
|
28
67
|
const body = await response.text().catch(() => '');
|
|
29
68
|
throw new Error(`Rockhopper API ${response.status}: ${response.statusText} — ${body}`);
|
|
30
69
|
}
|
|
70
|
+
log.info({ event: 'api_request', method, path: pathname, status: response.status, durationMs }, 'api_request');
|
|
31
71
|
const json = await response.json();
|
|
32
72
|
if (responseSchema) {
|
|
33
73
|
const parsed = responseSchema.safeParse(json);
|
|
@@ -36,6 +76,15 @@ export class ApiClient {
|
|
|
36
76
|
// `undefined`, hiding the contract break. Include the path of the
|
|
37
77
|
// first issue so the cause is obvious from the error message.
|
|
38
78
|
const first = parsed.error.issues[0];
|
|
79
|
+
// KI-225: schema drift is a client-side detection the backend can't
|
|
80
|
+
// see. Log the issue path + message ONLY — never the raw payload
|
|
81
|
+
// (`json`), which may contain file/cell data.
|
|
82
|
+
log.warn({
|
|
83
|
+
event: 'schema_validation_failed',
|
|
84
|
+
endpoint: pathname,
|
|
85
|
+
issue: first?.path.join('.') || '<root>',
|
|
86
|
+
err: first?.message,
|
|
87
|
+
}, 'schema_validation_failed');
|
|
39
88
|
throw new Error(`Rockhopper API response failed schema check at ${path}: ` +
|
|
40
89
|
`${first?.path.join('.') || '<root>'} — ${first?.message} ` +
|
|
41
90
|
`(${parsed.error.issues.length} issue(s) total)`);
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-grant-client.d.ts","sourceRoot":"","sources":["../../src/auth/device-grant-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,uBAAuB,EAAE,MAAM,CAAC;KACjC,KAAK,IAAI,CAAC;CACZ;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aAEvB,IAAI,EAChB,eAAe,GACf,eAAe,GACf,eAAe,GACf,SAAS;gBAJG,IAAI,EAChB,eAAe,GACf,eAAe,GACf,eAAe,GACf,SAAS,EACb,OAAO,EAAE,MAAM;CAKlB;AAkBD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,GACvE,OAAO,CAAC,kBAAkB,CAAC,CAuB7B;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,EACxE,UAAU,EAAE,MAAM,GACjB,OAAO,CACN;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CACxB,
|
|
1
|
+
{"version":3,"file":"device-grant-client.d.ts","sourceRoot":"","sources":["../../src/auth/device-grant-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,uBAAuB,EAAE,MAAM,CAAC;KACjC,KAAK,IAAI,CAAC;CACZ;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aAEvB,IAAI,EAChB,eAAe,GACf,eAAe,GACf,eAAe,GACf,SAAS;gBAJG,IAAI,EAChB,eAAe,GACf,eAAe,GACf,eAAe,GACf,SAAS,EACb,OAAO,EAAE,MAAM;CAKlB;AAkBD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,GACvE,OAAO,CAAC,kBAAkB,CAAC,CAuB7B;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,EACxE,UAAU,EAAE,MAAM,GACjB,OAAO,CACN;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CACxB,CAwDA;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAgC7B"}
|
|
@@ -84,7 +84,9 @@ export async function pollOnce(opts, deviceCode) {
|
|
|
84
84
|
// memory `project_backend_badrequest_unwraps_payload`).
|
|
85
85
|
let body = {};
|
|
86
86
|
try {
|
|
87
|
-
|
|
87
|
+
// TS 6.0 types `Response.json()` as `Promise<unknown>`; the body shape is
|
|
88
|
+
// validated structurally by the `switch (body.error)` below.
|
|
89
|
+
body = (await res.json());
|
|
88
90
|
}
|
|
89
91
|
catch {
|
|
90
92
|
// Non-JSON error body — fall through to 'unknown'.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-grant-client.js","sourceRoot":"","sources":["../../src/auth/device-grant-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"device-grant-client.js","sourceRoot":"","sources":["../../src/auth/device-grant-client.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -2,8 +2,25 @@
|
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
3
|
import { ApiClient } from './api-client.js';
|
|
4
4
|
import { AuthResolutionError, resolveAuth, } from './auth/resolve-auth.js';
|
|
5
|
+
import { flushLoggerSync, initLogger, log, serviceVersion, } from './logger.js';
|
|
5
6
|
import { createServer } from './server.js';
|
|
6
7
|
const ROCKHOPPER_API_URL = process.env.ROCKHOPPER_API_URL || 'https://api.rockhopper.co';
|
|
8
|
+
// KI-225: start the local rotating diagnostic logfile before anything else,
|
|
9
|
+
// so startup-path failures (auth, preflight, crashes) are captured. Never
|
|
10
|
+
// throws and never writes to stdout — falls back to a no-op logger.
|
|
11
|
+
await initLogger();
|
|
12
|
+
// Capture client-side crashes that would otherwise vanish (the backend can't
|
|
13
|
+
// see them). Registering these handlers suppresses Node's default crash, so
|
|
14
|
+
// uncaughtException re-exits 1 to PRESERVE the existing exit behavior; the
|
|
15
|
+
// fatal line is flushed to disk synchronously first.
|
|
16
|
+
process.on('uncaughtException', (err) => {
|
|
17
|
+
log.fatal({ event: 'uncaught_exception', err }, 'uncaught_exception');
|
|
18
|
+
flushLoggerSync();
|
|
19
|
+
process.exit(1);
|
|
20
|
+
});
|
|
21
|
+
process.on('unhandledRejection', (reason) => {
|
|
22
|
+
log.error({ event: 'unhandled_rejection', err: reason }, 'unhandled_rejection');
|
|
23
|
+
});
|
|
7
24
|
// ENG-1444: auth resolution order is
|
|
8
25
|
// 1. ROCKHOPPER_TOKEN env var (Personal Access Token — headless / CI)
|
|
9
26
|
// 2. Stored OAuth bundle in the OS keychain (prior device-grant flow)
|
|
@@ -17,6 +34,8 @@ try {
|
|
|
17
34
|
}
|
|
18
35
|
catch (err) {
|
|
19
36
|
if (err instanceof AuthResolutionError) {
|
|
37
|
+
// KI-225: local auth failure before any API call (bad token / sign-in).
|
|
38
|
+
log.warn({ event: 'auth_failed', reason: err.code }, 'auth_failed');
|
|
20
39
|
if (err.code === 'pat_malformed') {
|
|
21
40
|
console.error(`Error: ${err.message}`);
|
|
22
41
|
console.error('Tokens start with "rh_pat_". Check that the full token was copied correctly.');
|
|
@@ -34,6 +53,12 @@ catch (err) {
|
|
|
34
53
|
}
|
|
35
54
|
process.exit(1);
|
|
36
55
|
}
|
|
56
|
+
// Every catch branch above ends in `process.exit(1)`, so `resolved` is always
|
|
57
|
+
// assigned past this point. TS 6.0's stricter control-flow analysis can't prove
|
|
58
|
+
// that across the implicit-typed `let`, so narrow it explicitly here.
|
|
59
|
+
if (!resolved) {
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
37
62
|
const apiClient = new ApiClient({
|
|
38
63
|
baseUrl: ROCKHOPPER_API_URL,
|
|
39
64
|
token: resolved.accessToken,
|
|
@@ -44,6 +69,11 @@ try {
|
|
|
44
69
|
catch (err) {
|
|
45
70
|
const msg = err instanceof Error ? err.message : String(err);
|
|
46
71
|
if (msg.includes('401') || msg.includes('403')) {
|
|
72
|
+
// KI-225: preflight token rejection — the local auth-fail signal.
|
|
73
|
+
log.warn({
|
|
74
|
+
event: 'auth_failed',
|
|
75
|
+
reason: resolved.source === 'pat' ? 'pat_invalid' : 'oauth_invalid',
|
|
76
|
+
}, 'auth_failed');
|
|
47
77
|
if (resolved.source === 'pat') {
|
|
48
78
|
console.error('Error: ROCKHOPPER_TOKEN is invalid or expired.\n' +
|
|
49
79
|
'Create a new Personal Access Token in Rockhopper Settings and set it as ROCKHOPPER_TOKEN.');
|
|
@@ -60,6 +90,8 @@ catch (err) {
|
|
|
60
90
|
process.exit(1);
|
|
61
91
|
}
|
|
62
92
|
const server = createServer(apiClient);
|
|
93
|
+
// KI-225: one line per launch — anchors a session in the file.
|
|
94
|
+
log.info({ event: 'mcp_server_start', version: serviceVersion }, 'mcp_server_start');
|
|
63
95
|
const transport = new StdioServerTransport();
|
|
64
96
|
await server.connect(transport);
|
|
65
97
|
//# 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,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,mBAAmB,EACnB,WAAW,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `fn` inside an AsyncLocalStorage scope carrying `id`. Reads via
|
|
3
|
+
* {@link getCorrelationId} anywhere in the (sync or async) continuation
|
|
4
|
+
* return the same id. Mints a fresh UUID v4 when `id` is omitted.
|
|
5
|
+
*/
|
|
6
|
+
export declare const runWithCorrelationId: <T>(fn: () => T, id?: string) => T;
|
|
7
|
+
/** Current correlation id, or `undefined` when called outside a scope. */
|
|
8
|
+
export declare const getCorrelationId: () => string | undefined;
|
|
9
|
+
//# sourceMappingURL=correlation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../src/correlation.ts"],"names":[],"mappings":"AAmBA;;;;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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
/**
|
|
4
|
+
* Phase 1.1 / KI-226 — correlation id propagation.
|
|
5
|
+
*
|
|
6
|
+
* Per-tool-call scope: a single correlation id covers every outbound
|
|
7
|
+
* Rockhopper API call a tool invocation makes (including multi-call
|
|
8
|
+
* fan-outs like search). The id rides the `X-Correlation-Id` header out of
|
|
9
|
+
* {@link ApiClient.request}, so an mcp-server-originated request is
|
|
10
|
+
* traceable as a group in backend logs.
|
|
11
|
+
*
|
|
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`) because the
|
|
14
|
+
* package supports Node 18, where global `crypto.randomUUID` is not
|
|
15
|
+
* guaranteed.
|
|
16
|
+
*/
|
|
17
|
+
const als = new AsyncLocalStorage();
|
|
18
|
+
/**
|
|
19
|
+
* Runs `fn` inside an AsyncLocalStorage scope carrying `id`. Reads via
|
|
20
|
+
* {@link getCorrelationId} anywhere in the (sync or async) continuation
|
|
21
|
+
* return the same id. Mints a fresh UUID v4 when `id` is omitted.
|
|
22
|
+
*/
|
|
23
|
+
export const runWithCorrelationId = (fn, id = randomUUID()) => als.run(id, fn);
|
|
24
|
+
/** Current correlation id, or `undefined` when called outside a scope. */
|
|
25
|
+
export const getCorrelationId = () => als.getStore();
|
|
26
|
+
//# sourceMappingURL=correlation.js.map
|
|
@@ -0,0 +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;;;;;;;;;;;;;GAaG;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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
import pinoRoll from 'pino-roll';
|
|
3
|
+
/** The 5 log methods we expose. A real `pino.Logger` satisfies this. */
|
|
4
|
+
export interface DiagnosticLogger {
|
|
5
|
+
debug: pino.LogFn;
|
|
6
|
+
info: pino.LogFn;
|
|
7
|
+
warn: pino.LogFn;
|
|
8
|
+
error: pino.LogFn;
|
|
9
|
+
fatal: pino.LogFn;
|
|
10
|
+
}
|
|
11
|
+
export declare const serviceVersion: string;
|
|
12
|
+
/**
|
|
13
|
+
* Builds a file-only diagnostic logger. NEVER throws and NEVER writes to
|
|
14
|
+
* stdout — on opt-out or any failure it returns a no-op logger. Exposed
|
|
15
|
+
* (vs. only the {@link log} singleton) so tests can drive an isolated
|
|
16
|
+
* instance pointed at a tmpdir.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createDiagnosticLogger(opts?: {
|
|
19
|
+
dir?: string;
|
|
20
|
+
disable?: boolean;
|
|
21
|
+
level?: string;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
logger: DiagnosticLogger;
|
|
24
|
+
flush: () => Promise<void>;
|
|
25
|
+
destination?: Awaited<ReturnType<typeof pinoRoll>>;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Process-wide singleton. Starts as a no-op (so importing this module —
|
|
29
|
+
* including from the library entry / mcp-gateway — has no side effect and
|
|
30
|
+
* opens no file) and is swapped to the real file logger by
|
|
31
|
+
* {@link initLogger}, which the stdio CLI calls at startup.
|
|
32
|
+
*/
|
|
33
|
+
export declare let log: DiagnosticLogger;
|
|
34
|
+
/** Idempotently constructs the singleton from env config. Never rejects. */
|
|
35
|
+
export declare function initLogger(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Best-effort synchronous flush — for the crash path, where the last
|
|
38
|
+
* `fatal` line must hit disk before {@link process.exit}. No-op when the
|
|
39
|
+
* logger is disabled / not yet ready.
|
|
40
|
+
*/
|
|
41
|
+
export declare function flushLoggerSync(): void;
|
|
42
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AA2BA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,QAAQ,MAAM,WAAW,CAAC;AAGjC,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;IAClB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;CACnB;AA0BD,eAAO,MAAM,cAAc,QAAkB,CAAC;AAuB9C;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,OAAO,CAAC;IACT,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC;CACpD,CAAC,CAmDD;AAED;;;;;GAKG;AACH,eAAO,IAAI,GAAG,EAAE,gBAA6B,CAAC;AAK9C,4EAA4E;AAC5E,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAQhD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAMtC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 1.5 / KI-225 — local, rotating diagnostic logfile.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: the backend already logs everything that *reaches* the
|
|
5
|
+
* API. The unique value of a client-side log is the failures that NEVER
|
|
6
|
+
* reach the backend (network-unreachable, local auth rejection, schema
|
|
7
|
+
* drift, uncaught crashes) plus a local request-latency view. The file is
|
|
8
|
+
* the customer's to keep and hand to support — there is NO remote
|
|
9
|
+
* transmission.
|
|
10
|
+
*
|
|
11
|
+
* 🚨 HARD CONSTRAINT — stdout is the MCP stdio transport. Logs MUST go to
|
|
12
|
+
* the FILE ONLY, never stdout. We therefore:
|
|
13
|
+
* - build pino against a {@link pino-roll} Sonic-boom file destination
|
|
14
|
+
* (NOT pino's default stdout destination, NOT a worker transport), and
|
|
15
|
+
* - fall back to a NO-OP logger on ANY construction failure — never
|
|
16
|
+
* crash the server, never write to stdout.
|
|
17
|
+
*
|
|
18
|
+
* Redaction (SOC2-adjacent, runs on customer machines): callers must only
|
|
19
|
+
* ever pass safe fields — event, method, URL pathname (no query/token),
|
|
20
|
+
* status, durationMs, tool name, correlationId, version, error
|
|
21
|
+
* type/message. Never tokens, Authorization headers, request/response
|
|
22
|
+
* bodies, tool arguments, file contents, or cell data.
|
|
23
|
+
*/
|
|
24
|
+
import fs from 'node:fs';
|
|
25
|
+
import { createRequire } from 'node:module';
|
|
26
|
+
import os from 'node:os';
|
|
27
|
+
import path from 'node:path';
|
|
28
|
+
import pino from 'pino';
|
|
29
|
+
import pinoRoll from 'pino-roll';
|
|
30
|
+
import { getCorrelationId } from './correlation.js';
|
|
31
|
+
const SERVICE_NAME = 'mcp-server';
|
|
32
|
+
const LOG_FILE_BASENAME = 'mcp-server.log';
|
|
33
|
+
const LOG_MAX_SIZE = '5m';
|
|
34
|
+
const LOG_FILE_COUNT = 5;
|
|
35
|
+
const DEFAULT_LOG_DIR = path.join(os.homedir(), '.rockhopper', 'mcp-server');
|
|
36
|
+
const VALID_LEVELS = new Set([
|
|
37
|
+
'fatal',
|
|
38
|
+
'error',
|
|
39
|
+
'warn',
|
|
40
|
+
'info',
|
|
41
|
+
'debug',
|
|
42
|
+
'trace',
|
|
43
|
+
'silent',
|
|
44
|
+
]);
|
|
45
|
+
/** Package version stamped into every line's `base`. Best-effort read. */
|
|
46
|
+
const requireJson = createRequire(import.meta.url);
|
|
47
|
+
let resolvedVersion = '0.0.0';
|
|
48
|
+
try {
|
|
49
|
+
const pkg = requireJson('../package.json');
|
|
50
|
+
if (pkg.version)
|
|
51
|
+
resolvedVersion = pkg.version;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// package.json unreadable — keep the sentinel; never crash over a version.
|
|
55
|
+
}
|
|
56
|
+
export const serviceVersion = resolvedVersion;
|
|
57
|
+
/** Shared no-op so disabled/failed logging is a single cheap call site. */
|
|
58
|
+
const noopFn = () => { };
|
|
59
|
+
const noopLogger = {
|
|
60
|
+
debug: noopFn,
|
|
61
|
+
info: noopFn,
|
|
62
|
+
warn: noopFn,
|
|
63
|
+
error: noopFn,
|
|
64
|
+
fatal: noopFn,
|
|
65
|
+
};
|
|
66
|
+
function isTruthyEnv(value) {
|
|
67
|
+
if (!value)
|
|
68
|
+
return false;
|
|
69
|
+
const v = value.trim().toLowerCase();
|
|
70
|
+
return v !== '' && v !== '0' && v !== 'false' && v !== 'no';
|
|
71
|
+
}
|
|
72
|
+
function normalizeLevel(level) {
|
|
73
|
+
const v = level?.trim().toLowerCase();
|
|
74
|
+
return v && VALID_LEVELS.has(v) ? v : 'info';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Builds a file-only diagnostic logger. NEVER throws and NEVER writes to
|
|
78
|
+
* stdout — on opt-out or any failure it returns a no-op logger. Exposed
|
|
79
|
+
* (vs. only the {@link log} singleton) so tests can drive an isolated
|
|
80
|
+
* instance pointed at a tmpdir.
|
|
81
|
+
*/
|
|
82
|
+
export async function createDiagnosticLogger(opts = {}) {
|
|
83
|
+
const disable = opts.disable ?? isTruthyEnv(process.env.ROCKHOPPER_MCP_LOG_DISABLE);
|
|
84
|
+
if (disable) {
|
|
85
|
+
return { logger: noopLogger, flush: async () => { } };
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const envDir = process.env.ROCKHOPPER_MCP_LOG_DIR?.trim();
|
|
89
|
+
const dir = opts.dir ?? (envDir && envDir.length ? envDir : DEFAULT_LOG_DIR);
|
|
90
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
91
|
+
const destination = await pinoRoll({
|
|
92
|
+
file: path.join(dir, LOG_FILE_BASENAME),
|
|
93
|
+
size: LOG_MAX_SIZE,
|
|
94
|
+
limit: { count: LOG_FILE_COUNT },
|
|
95
|
+
mkdir: true,
|
|
96
|
+
});
|
|
97
|
+
// A logging IO error must never crash the server (or escape as an
|
|
98
|
+
// unhandled 'error' event). Swallow it — diagnostics are best-effort.
|
|
99
|
+
destination.on('error', () => { });
|
|
100
|
+
const logger = pino({
|
|
101
|
+
level: normalizeLevel(opts.level ?? process.env.ROCKHOPPER_MCP_LOG_LEVEL),
|
|
102
|
+
base: { service: SERVICE_NAME, version: serviceVersion },
|
|
103
|
+
serializers: { err: pino.stdSerializers.err },
|
|
104
|
+
// Every line auto-carries the per-tool-call correlationId (Phase 1.1
|
|
105
|
+
// ALS scope) when one is active — no call site has to thread it.
|
|
106
|
+
mixin() {
|
|
107
|
+
const id = getCorrelationId();
|
|
108
|
+
return id ? { correlationId: id } : {};
|
|
109
|
+
},
|
|
110
|
+
}, destination);
|
|
111
|
+
const flush = () => new Promise((resolve) => {
|
|
112
|
+
try {
|
|
113
|
+
destination.flush(() => resolve());
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
resolve();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return { logger, flush, destination };
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// fs / pino-roll / pino failure — degrade to no-op, never to stdout.
|
|
123
|
+
return { logger: noopLogger, flush: async () => { } };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Process-wide singleton. Starts as a no-op (so importing this module —
|
|
128
|
+
* including from the library entry / mcp-gateway — has no side effect and
|
|
129
|
+
* opens no file) and is swapped to the real file logger by
|
|
130
|
+
* {@link initLogger}, which the stdio CLI calls at startup.
|
|
131
|
+
*/
|
|
132
|
+
export let log = noopLogger;
|
|
133
|
+
let activeDestination;
|
|
134
|
+
let initPromise;
|
|
135
|
+
/** Idempotently constructs the singleton from env config. Never rejects. */
|
|
136
|
+
export async function initLogger() {
|
|
137
|
+
if (initPromise)
|
|
138
|
+
return initPromise;
|
|
139
|
+
initPromise = (async () => {
|
|
140
|
+
const built = await createDiagnosticLogger();
|
|
141
|
+
log = built.logger;
|
|
142
|
+
activeDestination = built.destination;
|
|
143
|
+
})();
|
|
144
|
+
return initPromise;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Best-effort synchronous flush — for the crash path, where the last
|
|
148
|
+
* `fatal` line must hit disk before {@link process.exit}. No-op when the
|
|
149
|
+
* logger is disabled / not yet ready.
|
|
150
|
+
*/
|
|
151
|
+
export function flushLoggerSync() {
|
|
152
|
+
try {
|
|
153
|
+
activeDestination?.flushSync();
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Stream not ready or already closed — nothing more we can do pre-exit.
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAqD5E,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,SAAS,CA+BX"}
|
package/dist/server.js
CHANGED
|
@@ -1,7 +1,43 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { runWithCorrelationId } from './correlation.js';
|
|
3
|
+
import { log } from './logger.js';
|
|
2
4
|
import { registerPrompts } from './prompts/index.js';
|
|
3
5
|
import { registerResources } from './resources/index.js';
|
|
4
6
|
import { registerTools } from './tools/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Phase 1.1 / KI-226 + Phase 1.5 / KI-225 — wrap every tool handler once.
|
|
9
|
+
* Intercepting `registerTool` here (vs. wrapping each of the ~16 handlers)
|
|
10
|
+
* means all current and future tools are covered automatically. The wrapper:
|
|
11
|
+
* - runs the handler inside {@link runWithCorrelationId}, so every outbound
|
|
12
|
+
* `ApiClient` call it makes — including multi-call fan-outs like search —
|
|
13
|
+
* shares one `X-Correlation-Id` (1.1), and
|
|
14
|
+
* - times the handler and logs a `tool_call` / `tool_call_failed` line to
|
|
15
|
+
* the local diagnostic file (1.5). Only the tool NAME is logged — never
|
|
16
|
+
* the tool arguments, which may carry file refs / PII.
|
|
17
|
+
* The handler callback is always the last positional argument to
|
|
18
|
+
* `registerTool`; the loose casts insulate this seam from the SDK's generic
|
|
19
|
+
* `ToolCallback` union. On a handler throw we log then re-throw — behavior
|
|
20
|
+
* (the error surfacing to the SDK) is preserved.
|
|
21
|
+
*/
|
|
22
|
+
function installCorrelationScope(server) {
|
|
23
|
+
const baseRegisterTool = server.registerTool.bind(server);
|
|
24
|
+
server.registerTool = ((name, config, cb) => {
|
|
25
|
+
const handler = cb;
|
|
26
|
+
const wrapped = (...args) => runWithCorrelationId(async () => {
|
|
27
|
+
const start = Date.now();
|
|
28
|
+
try {
|
|
29
|
+
const result = await handler(...args);
|
|
30
|
+
log.info({ event: 'tool_call', tool: name, durationMs: Date.now() - start, outcome: 'ok' }, 'tool_call');
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
log.error({ event: 'tool_call_failed', tool: name, durationMs: Date.now() - start, err }, 'tool_call_failed');
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return baseRegisterTool(name, config, wrapped);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
5
41
|
export function createServer(apiClient, options) {
|
|
6
42
|
const readOnly = options?.scope === 'read-only';
|
|
7
43
|
const server = new McpServer({
|
|
@@ -22,6 +58,7 @@ export function createServer(apiClient, options) {
|
|
|
22
58
|
'rename_file) require a read-write scoped token. ' +
|
|
23
59
|
'File IDs use the platformId field (e.g. from list_files output).',
|
|
24
60
|
});
|
|
61
|
+
installCorrelationScope(server);
|
|
25
62
|
registerResources(server, apiClient);
|
|
26
63
|
registerTools(server, apiClient, options);
|
|
27
64
|
registerPrompts(server, apiClient);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAA6B,MAAM,kBAAkB,CAAC;AAE5E,MAAM,UAAU,YAAY,CAC1B,SAAoB,EACpB,OAA8B;IAE9B,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK,KAAK,WAAW,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE,QAAQ;YACpB,CAAC,CAAC,yDAAyD;gBACzD,oEAAoE;gBACpE,gDAAgD;gBAChD,gEAAgE;gBAChE,kEAAkE;YACpE,CAAC,CAAC,0DAA0D;gBAC1D,oEAAoE;gBACpE,iEAAiE;gBACjE,0EAA0E;gBAC1E,kEAAkE;gBAClE,kDAAkD;gBAClD,kEAAkE;KACvE,CACF,CAAC;IAEF,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAA6B,MAAM,kBAAkB,CAAC;AAE5E;;;;;;;;;;;;;;GAcG;AACH,SAAS,uBAAuB,CAAC,MAAiB;IAChD,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,CAAC,YAAY,GAAG,CAAC,CACrB,IAAY,EACZ,MAAe,EACf,EAAW,EAC0B,EAAE;QACvC,MAAM,OAAO,GAAG,EAAqC,CAAC;QACtD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAe,EAAW,EAAE,CAC9C,oBAAoB,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;gBACtC,GAAG,CAAC,IAAI,CACN,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EACjF,WAAW,CACZ,CAAC;gBACF,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CACP,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,EAC9E,kBAAkB,CACnB,CAAC;gBACF,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QACL,OACE,gBAKD,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC,CAA+B,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,SAAoB,EACpB,OAA8B;IAE9B,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK,KAAK,WAAW,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE,QAAQ;YACpB,CAAC,CAAC,yDAAyD;gBACzD,oEAAoE;gBACpE,gDAAgD;gBAChD,gEAAgE;gBAChE,kEAAkE;YACpE,CAAC,CAAC,0DAA0D;gBAC1D,oEAAoE;gBACpE,iEAAiE;gBACjE,0EAA0E;gBAC1E,kEAAkE;gBAClE,kDAAkD;gBAClD,kEAAkE;KACvE,CACF,CAAC;IAEF,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/zod-schemas.d.ts
CHANGED
|
@@ -27,23 +27,9 @@ export declare const FileChatSchema: z.ZodObject<{
|
|
|
27
27
|
message: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
28
28
|
resolved: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
29
29
|
cellReference: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
30
|
-
createdAt: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodDate]>>;
|
|
31
|
-
updatedAt: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodDate]>>;
|
|
32
|
-
},
|
|
33
|
-
internalId: z.ZodNumber;
|
|
34
|
-
message: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
35
|
-
resolved: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
36
|
-
cellReference: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
37
|
-
createdAt: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodDate]>>;
|
|
38
|
-
updatedAt: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodDate]>>;
|
|
39
|
-
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
40
|
-
internalId: z.ZodNumber;
|
|
41
|
-
message: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
42
|
-
resolved: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
43
|
-
cellReference: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
44
|
-
createdAt: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodDate]>>;
|
|
45
|
-
updatedAt: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodDate]>>;
|
|
46
|
-
}, z.ZodTypeAny, "passthrough">>;
|
|
30
|
+
createdAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodDate]>>;
|
|
31
|
+
updatedAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodDate]>>;
|
|
32
|
+
}, z.core.$loose>;
|
|
47
33
|
/**
|
|
48
34
|
* Backend `PATCH /enrolled-files/:fileMsId` returns the updated
|
|
49
35
|
* EnrolledFile entity after KI-096 (was UpdateResult). The
|
|
@@ -56,21 +42,7 @@ export declare const EnrolledFileSchema: z.ZodObject<{
|
|
|
56
42
|
fileType: z.ZodOptional<z.ZodString>;
|
|
57
43
|
driveMsId: z.ZodOptional<z.ZodString>;
|
|
58
44
|
hasUncommittedChanges: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
59
|
-
},
|
|
60
|
-
internalId: z.ZodOptional<z.ZodNumber>;
|
|
61
|
-
platformId: z.ZodString;
|
|
62
|
-
name: z.ZodString;
|
|
63
|
-
fileType: z.ZodOptional<z.ZodString>;
|
|
64
|
-
driveMsId: z.ZodOptional<z.ZodString>;
|
|
65
|
-
hasUncommittedChanges: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
66
|
-
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
67
|
-
internalId: z.ZodOptional<z.ZodNumber>;
|
|
68
|
-
platformId: z.ZodString;
|
|
69
|
-
name: z.ZodString;
|
|
70
|
-
fileType: z.ZodOptional<z.ZodString>;
|
|
71
|
-
driveMsId: z.ZodOptional<z.ZodString>;
|
|
72
|
-
hasUncommittedChanges: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
73
|
-
}, z.ZodTypeAny, "passthrough">>;
|
|
45
|
+
}, z.core.$loose>;
|
|
74
46
|
/**
|
|
75
47
|
* Backend `GET /file-versions/file/:fileMsId/cell-history?format=mcp`
|
|
76
48
|
* returns the normalized projection added by KI-096. The mcp-server
|
|
@@ -81,31 +53,11 @@ export declare const CellHistoryEntrySchema: z.ZodObject<{
|
|
|
81
53
|
value: z.ZodUnknown;
|
|
82
54
|
changedBy: z.ZodNullable<z.ZodString>;
|
|
83
55
|
changedAt: z.ZodString;
|
|
84
|
-
},
|
|
85
|
-
versionId: string;
|
|
86
|
-
changedBy: string | null;
|
|
87
|
-
changedAt: string;
|
|
88
|
-
value?: unknown;
|
|
89
|
-
}, {
|
|
90
|
-
versionId: string;
|
|
91
|
-
changedBy: string | null;
|
|
92
|
-
changedAt: string;
|
|
93
|
-
value?: unknown;
|
|
94
|
-
}>;
|
|
56
|
+
}, z.core.$strip>;
|
|
95
57
|
export declare const CellHistoryEntryArraySchema: z.ZodArray<z.ZodObject<{
|
|
96
58
|
versionId: z.ZodString;
|
|
97
59
|
value: z.ZodUnknown;
|
|
98
60
|
changedBy: z.ZodNullable<z.ZodString>;
|
|
99
61
|
changedAt: z.ZodString;
|
|
100
|
-
},
|
|
101
|
-
versionId: string;
|
|
102
|
-
changedBy: string | null;
|
|
103
|
-
changedAt: string;
|
|
104
|
-
value?: unknown;
|
|
105
|
-
}, {
|
|
106
|
-
versionId: string;
|
|
107
|
-
changedBy: string | null;
|
|
108
|
-
changedAt: string;
|
|
109
|
-
value?: unknown;
|
|
110
|
-
}>, "many">;
|
|
62
|
+
}, z.core.$strip>>;
|
|
111
63
|
//# sourceMappingURL=zod-schemas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-schemas.d.ts","sourceRoot":"","sources":["../src/zod-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"zod-schemas.d.ts","sourceRoot":"","sources":["../src/zod-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;;;;iBASX,CAAC;AAEjB;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;iBASf,CAAC;AAEjB;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;iBAKjC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;kBAAkC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rockhopper-co/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Rockhopper MCP server — expose file metadata, versions, reviews, and comments to AI tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -46,18 +46,20 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
48
48
|
"keytar": "^7.9.0",
|
|
49
|
-
"
|
|
49
|
+
"pino": "^10.3.1",
|
|
50
|
+
"pino-roll": "^4.0.0",
|
|
51
|
+
"zod": "^4.4.3"
|
|
50
52
|
},
|
|
51
53
|
"devDependencies": {
|
|
52
54
|
"@eslint/js": "^10.0.1",
|
|
53
|
-
"@types/node": "^
|
|
54
|
-
"@vitest/coverage-v8": "^
|
|
55
|
-
"eslint": "^10.
|
|
56
|
-
"globals": "^17.
|
|
55
|
+
"@types/node": "^26.0.1",
|
|
56
|
+
"@vitest/coverage-v8": "^4.1.8",
|
|
57
|
+
"eslint": "^10.6.0",
|
|
58
|
+
"globals": "^17.7.0",
|
|
57
59
|
"tsx": "^4.19.4",
|
|
58
|
-
"typescript": "^
|
|
59
|
-
"typescript-eslint": "^8.
|
|
60
|
-
"vitest": "^
|
|
60
|
+
"typescript": "^6.0.3",
|
|
61
|
+
"typescript-eslint": "^8.62.1",
|
|
62
|
+
"vitest": "^4.1.8",
|
|
61
63
|
"zod-to-json-schema": "^3.24.6"
|
|
62
64
|
},
|
|
63
65
|
"keywords": [
|