mcp-use-compat 0.3.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 +23 -0
- package/LICENSE +21 -0
- package/README.md +375 -0
- package/dist/checks/auth.d.ts +2 -0
- package/dist/checks/auth.d.ts.map +1 -0
- package/dist/checks/auth.js +229 -0
- package/dist/checks/auth.js.map +1 -0
- package/dist/checks/calls.d.ts +4 -0
- package/dist/checks/calls.d.ts.map +1 -0
- package/dist/checks/calls.js +192 -0
- package/dist/checks/calls.js.map +1 -0
- package/dist/checks/discovery.d.ts +3 -0
- package/dist/checks/discovery.d.ts.map +1 -0
- package/dist/checks/discovery.js +47 -0
- package/dist/checks/discovery.js.map +1 -0
- package/dist/checks/explanations.d.ts +15 -0
- package/dist/checks/explanations.d.ts.map +1 -0
- package/dist/checks/explanations.js +346 -0
- package/dist/checks/explanations.js.map +1 -0
- package/dist/checks/index.d.ts +3 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +23 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/protocol.d.ts +5 -0
- package/dist/checks/protocol.d.ts.map +1 -0
- package/dist/checks/protocol.js +380 -0
- package/dist/checks/protocol.js.map +1 -0
- package/dist/checks/resources.d.ts +10 -0
- package/dist/checks/resources.d.ts.map +1 -0
- package/dist/checks/resources.js +144 -0
- package/dist/checks/resources.js.map +1 -0
- package/dist/checks/schema.d.ts +21 -0
- package/dist/checks/schema.d.ts.map +1 -0
- package/dist/checks/schema.js +412 -0
- package/dist/checks/schema.js.map +1 -0
- package/dist/checks/sdk.d.ts +10 -0
- package/dist/checks/sdk.d.ts.map +1 -0
- package/dist/checks/sdk.js +68 -0
- package/dist/checks/sdk.js.map +1 -0
- package/dist/checks/tools.d.ts +18 -0
- package/dist/checks/tools.d.ts.map +1 -0
- package/dist/checks/tools.js +422 -0
- package/dist/checks/tools.js.map +1 -0
- package/dist/checks/transport.d.ts +2 -0
- package/dist/checks/transport.d.ts.map +1 -0
- package/dist/checks/transport.js +123 -0
- package/dist/checks/transport.js.map +1 -0
- package/dist/checks/types.d.ts +37 -0
- package/dist/checks/types.d.ts.map +1 -0
- package/dist/checks/types.js +5 -0
- package/dist/checks/types.js.map +1 -0
- package/dist/checks/ui.d.ts +2 -0
- package/dist/checks/ui.d.ts.map +1 -0
- package/dist/checks/ui.js +207 -0
- package/dist/checks/ui.js.map +1 -0
- package/dist/checks/util.d.ts +20 -0
- package/dist/checks/util.d.ts.map +1 -0
- package/dist/checks/util.js +42 -0
- package/dist/checks/util.js.map +1 -0
- package/dist/cli.d.ts +110 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +317 -0
- package/dist/cli.js.map +1 -0
- package/dist/connect/calls.d.ts +13 -0
- package/dist/connect/calls.d.ts.map +1 -0
- package/dist/connect/calls.js +130 -0
- package/dist/connect/calls.js.map +1 -0
- package/dist/connect/http.d.ts +14 -0
- package/dist/connect/http.d.ts.map +1 -0
- package/dist/connect/http.js +122 -0
- package/dist/connect/http.js.map +1 -0
- package/dist/connect/index.d.ts +41 -0
- package/dist/connect/index.d.ts.map +1 -0
- package/dist/connect/index.js +168 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/lists.d.ts +12 -0
- package/dist/connect/lists.d.ts.map +1 -0
- package/dist/connect/lists.js +70 -0
- package/dist/connect/lists.js.map +1 -0
- package/dist/connect/modern.d.ts +13 -0
- package/dist/connect/modern.d.ts.map +1 -0
- package/dist/connect/modern.js +169 -0
- package/dist/connect/modern.js.map +1 -0
- package/dist/connect/session.d.ts +29 -0
- package/dist/connect/session.d.ts.map +1 -0
- package/dist/connect/session.js +96 -0
- package/dist/connect/session.js.map +1 -0
- package/dist/connect/stdio.d.ts +36 -0
- package/dist/connect/stdio.d.ts.map +1 -0
- package/dist/connect/stdio.js +127 -0
- package/dist/connect/stdio.js.map +1 -0
- package/dist/diff.d.ts +23 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +255 -0
- package/dist/diff.js.map +1 -0
- package/dist/evaluate.d.ts +70 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +104 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/explain.d.ts +4 -0
- package/dist/explain.d.ts.map +1 -0
- package/dist/explain.js +46 -0
- package/dist/explain.js.map +1 -0
- package/dist/fix.d.ts +19 -0
- package/dist/fix.d.ts.map +1 -0
- package/dist/fix.js +116 -0
- package/dist/fix.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +85 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +287 -0
- package/dist/oauth.js.map +1 -0
- package/dist/policy.d.ts +29 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +63 -0
- package/dist/policy.js.map +1 -0
- package/dist/profiles/chatgpt.d.ts +3 -0
- package/dist/profiles/chatgpt.d.ts.map +1 -0
- package/dist/profiles/chatgpt.js +29 -0
- package/dist/profiles/chatgpt.js.map +1 -0
- package/dist/profiles/claude-code.d.ts +3 -0
- package/dist/profiles/claude-code.d.ts.map +1 -0
- package/dist/profiles/claude-code.js +62 -0
- package/dist/profiles/claude-code.js.map +1 -0
- package/dist/profiles/claude-desktop.d.ts +3 -0
- package/dist/profiles/claude-desktop.d.ts.map +1 -0
- package/dist/profiles/claude-desktop.js +51 -0
- package/dist/profiles/claude-desktop.js.map +1 -0
- package/dist/profiles/cline.d.ts +4 -0
- package/dist/profiles/cline.d.ts.map +1 -0
- package/dist/profiles/cline.js +118 -0
- package/dist/profiles/cline.js.map +1 -0
- package/dist/profiles/codex.d.ts +4 -0
- package/dist/profiles/codex.d.ts.map +1 -0
- package/dist/profiles/codex.js +168 -0
- package/dist/profiles/codex.js.map +1 -0
- package/dist/profiles/continue.d.ts +4 -0
- package/dist/profiles/continue.d.ts.map +1 -0
- package/dist/profiles/continue.js +93 -0
- package/dist/profiles/continue.js.map +1 -0
- package/dist/profiles/cursor.d.ts +3 -0
- package/dist/profiles/cursor.d.ts.map +1 -0
- package/dist/profiles/cursor.js +52 -0
- package/dist/profiles/cursor.js.map +1 -0
- package/dist/profiles/gemini-cli.d.ts +4 -0
- package/dist/profiles/gemini-cli.d.ts.map +1 -0
- package/dist/profiles/gemini-cli.js +137 -0
- package/dist/profiles/gemini-cli.js.map +1 -0
- package/dist/profiles/goose.d.ts +4 -0
- package/dist/profiles/goose.d.ts.map +1 -0
- package/dist/profiles/goose.js +114 -0
- package/dist/profiles/goose.js.map +1 -0
- package/dist/profiles/index.d.ts +7 -0
- package/dist/profiles/index.d.ts.map +1 -0
- package/dist/profiles/index.js +43 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/opencode.d.ts +3 -0
- package/dist/profiles/opencode.d.ts.map +1 -0
- package/dist/profiles/opencode.js +47 -0
- package/dist/profiles/opencode.js.map +1 -0
- package/dist/profiles/types.d.ts +86 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +2 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/profiles/vscode-copilot.d.ts +3 -0
- package/dist/profiles/vscode-copilot.d.ts.map +1 -0
- package/dist/profiles/vscode-copilot.js +71 -0
- package/dist/profiles/vscode-copilot.js.map +1 -0
- package/dist/profiles/windsurf.d.ts +4 -0
- package/dist/profiles/windsurf.d.ts.map +1 -0
- package/dist/profiles/windsurf.js +49 -0
- package/dist/profiles/windsurf.js.map +1 -0
- package/dist/project.d.ts +52 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +291 -0
- package/dist/project.js.map +1 -0
- package/dist/reporters/escape.d.ts +7 -0
- package/dist/reporters/escape.d.ts.map +1 -0
- package/dist/reporters/escape.js +15 -0
- package/dist/reporters/escape.js.map +1 -0
- package/dist/reporters/github.d.ts +7 -0
- package/dist/reporters/github.d.ts.map +1 -0
- package/dist/reporters/github.js +19 -0
- package/dist/reporters/github.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +10 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json.d.ts +3 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +4 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/markdown.d.ts +3 -0
- package/dist/reporters/markdown.d.ts.map +1 -0
- package/dist/reporters/markdown.js +98 -0
- package/dist/reporters/markdown.js.map +1 -0
- package/dist/run.d.ts +14 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +163 -0
- package/dist/run.js.map +1 -0
- package/dist/sdk-facts.d.ts +27 -0
- package/dist/sdk-facts.d.ts.map +1 -0
- package/dist/sdk-facts.js +63 -0
- package/dist/sdk-facts.js.map +1 -0
- package/dist/snapshot.d.ts +189 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +22 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/ui.d.ts +18 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +22 -0
- package/dist/ui.js.map +1 -0
- package/dist/upgrade.d.ts +12 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +115 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +65 -0
- package/schema/report.schema.json +327 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
2
|
+
import { type ServerSnapshot, type VersionProbe } from "../snapshot.js";
|
|
3
|
+
export type ConnectTarget = {
|
|
4
|
+
kind: "stdio";
|
|
5
|
+
command: string;
|
|
6
|
+
args: string[];
|
|
7
|
+
cwd: string;
|
|
8
|
+
env: Record<string, string>;
|
|
9
|
+
} | {
|
|
10
|
+
kind: "http";
|
|
11
|
+
url: string;
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
authProvider?: OAuthClientProvider;
|
|
14
|
+
};
|
|
15
|
+
export interface ConnectOptions {
|
|
16
|
+
target: ConnectTarget;
|
|
17
|
+
timeoutMs: number;
|
|
18
|
+
authProbe: boolean;
|
|
19
|
+
/** Also initialize once per SDK-supported protocol version (one extra session each). */
|
|
20
|
+
versionMatrix?: boolean;
|
|
21
|
+
/** Call tools that declare readOnlyHint: true, with synthesized arguments. */
|
|
22
|
+
probeCalls?: boolean;
|
|
23
|
+
/** Tools the user asked to call explicitly, with their arguments. */
|
|
24
|
+
calls?: Array<{
|
|
25
|
+
tool: string;
|
|
26
|
+
args: Record<string, unknown>;
|
|
27
|
+
}>;
|
|
28
|
+
/** Progress messages (stderr). */
|
|
29
|
+
log?: (msg: string) => void;
|
|
30
|
+
/** Skip registry lookups for the project's SDK versions. */
|
|
31
|
+
offline?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare function connect(options: ConnectOptions): Promise<ServerSnapshot>;
|
|
34
|
+
/**
|
|
35
|
+
* Published protocol revisions that use the initialize handshake. 2024-10-07 is in
|
|
36
|
+
* the SDK's list but was never published, so it isn't probed.
|
|
37
|
+
*/
|
|
38
|
+
export declare const HANDSHAKE_VERSIONS: readonly ["2024-11-05", "2025-03-26", "2025-06-18", "2025-11-25"];
|
|
39
|
+
/** Opens one session per handshake protocol version and records what the server answers. */
|
|
40
|
+
export declare function probeVersions(target: ConnectTarget, timeoutMs: number): Promise<VersionProbe[]>;
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connect/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAIpF,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAUxB,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5F;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEvG,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,wFAAwF;IACxF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC/D,kCAAkC;IAClC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAWD,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAgH9E;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,mEAAoE,CAAC;AAEpG,4FAA4F;AAC5F,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA6BrG"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
2
|
+
import { LATEST_PROTOCOL_VERSION } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import { LIST_KINDS, } from "../snapshot.js";
|
|
4
|
+
import { TOOL_NAME, VERSION } from "../version.js";
|
|
5
|
+
import { detectProject, lookupLatest } from "../project.js";
|
|
6
|
+
import { callTool, probeCalls } from "./calls.js";
|
|
7
|
+
import { MODERN_VERSION, probeModern } from "./modern.js";
|
|
8
|
+
import { listAll, readUiResources, requester } from "./lists.js";
|
|
9
|
+
import { probeHttpAuth } from "./http.js";
|
|
10
|
+
import { RpcSession } from "./session.js";
|
|
11
|
+
import { CapturingStdioTransport } from "./stdio.js";
|
|
12
|
+
function makeTransport(target) {
|
|
13
|
+
return target.kind === "stdio"
|
|
14
|
+
? new CapturingStdioTransport(target)
|
|
15
|
+
: new StreamableHTTPClientTransport(new URL(target.url), {
|
|
16
|
+
requestInit: { headers: target.headers },
|
|
17
|
+
authProvider: target.authProvider,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export async function connect(options) {
|
|
21
|
+
const { target, timeoutMs } = options;
|
|
22
|
+
const snapshot = {
|
|
23
|
+
snapshotVersion: 1,
|
|
24
|
+
target: target.kind === "stdio"
|
|
25
|
+
? { kind: "stdio", command: target.command, args: target.args, cwd: target.cwd }
|
|
26
|
+
: { kind: "http", url: target.url },
|
|
27
|
+
connectedAt: new Date().toISOString(),
|
|
28
|
+
connect: { ok: false },
|
|
29
|
+
lists: {},
|
|
30
|
+
io: { stdoutNonJsonLines: [], stderrTail: [] },
|
|
31
|
+
};
|
|
32
|
+
const transport = makeTransport(target);
|
|
33
|
+
const session = new RpcSession(transport);
|
|
34
|
+
try {
|
|
35
|
+
const started = performance.now();
|
|
36
|
+
await session.start();
|
|
37
|
+
const init = (await session.request("initialize", {
|
|
38
|
+
protocolVersion: LATEST_PROTOCOL_VERSION,
|
|
39
|
+
capabilities: {},
|
|
40
|
+
clientInfo: { name: TOOL_NAME, version: VERSION },
|
|
41
|
+
}, timeoutMs * 2));
|
|
42
|
+
snapshot.connect = { ok: true, startupMs: Math.round(performance.now() - started) };
|
|
43
|
+
const negotiated = typeof init?.protocolVersion === "string" ? init.protocolVersion : undefined;
|
|
44
|
+
snapshot.initialize = {
|
|
45
|
+
requestedProtocolVersion: LATEST_PROTOCOL_VERSION,
|
|
46
|
+
negotiatedProtocolVersion: negotiated,
|
|
47
|
+
serverInfo: isObject(init?.serverInfo) ? init.serverInfo : undefined,
|
|
48
|
+
capabilities: isObject(init?.capabilities) ? init.capabilities : {},
|
|
49
|
+
instructions: typeof init?.instructions === "string" ? init.instructions : undefined,
|
|
50
|
+
};
|
|
51
|
+
if (negotiated)
|
|
52
|
+
transport.setProtocolVersion?.(negotiated);
|
|
53
|
+
await session.notify("notifications/initialized");
|
|
54
|
+
// Call every list method regardless of declared capabilities, so checks can
|
|
55
|
+
// compare what was declared with what actually works.
|
|
56
|
+
for (const kind of Object.keys(LIST_KINDS)) {
|
|
57
|
+
snapshot.lists[kind] = await listAll(requester(session, timeoutMs), kind);
|
|
58
|
+
}
|
|
59
|
+
snapshot.uiReads = await readUiResources(requester(session, timeoutMs), snapshot.lists.tools?.items ?? []);
|
|
60
|
+
if (options.probeCalls || options.calls?.length) {
|
|
61
|
+
const log = options.log ?? ((msg) => console.error(msg));
|
|
62
|
+
snapshot.calls = options.probeCalls ? await probeCalls(session, snapshot.lists.tools?.items ?? [], timeoutMs, log) : [];
|
|
63
|
+
for (const { tool, args } of options.calls ?? []) {
|
|
64
|
+
snapshot.calls.push(await callTool(session, tool, args, "explicit", timeoutMs));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
snapshot.connect = { ok: false, error: describeError(err, transport) };
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await session.close().catch(() => { });
|
|
73
|
+
}
|
|
74
|
+
if (transport instanceof CapturingStdioTransport) {
|
|
75
|
+
snapshot.io = {
|
|
76
|
+
stdoutNonJsonLines: transport.stdoutNonJsonLines,
|
|
77
|
+
stderrTail: transport.stderrTail,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const tokens = target.kind === "http" ? await target.authProvider?.tokens() : undefined;
|
|
81
|
+
const authHeaders = target.kind === "http" ? (tokens ? { ...target.headers, authorization: `Bearer ${tokens.access_token}` } : target.headers) : {};
|
|
82
|
+
// Protocol 2026-07-28 runs in its own session (its own process for stdio).
|
|
83
|
+
const modern = await probeModern(target, timeoutMs, authHeaders);
|
|
84
|
+
snapshot.modern = modern;
|
|
85
|
+
snapshot.discover = modern.discover;
|
|
86
|
+
if (!snapshot.connect.ok && modern.supported && modern.lists) {
|
|
87
|
+
// Modern-only server: run every check over what 2026-07-28 returned.
|
|
88
|
+
const info = modern.discoverMeta?.serverInfo ?? modern.pagesMeta?.tools?.[0]?.serverInfo;
|
|
89
|
+
snapshot.era = "modern";
|
|
90
|
+
snapshot.connect = { ok: true, startupMs: modern.startupMs, legacyError: snapshot.connect.error };
|
|
91
|
+
snapshot.initialize = {
|
|
92
|
+
requestedProtocolVersion: MODERN_VERSION,
|
|
93
|
+
negotiatedProtocolVersion: MODERN_VERSION,
|
|
94
|
+
serverInfo: info,
|
|
95
|
+
capabilities: isObject(modern.discover.result?.capabilities) ? modern.discover.result.capabilities : {},
|
|
96
|
+
instructions: typeof modern.discover.result?.instructions === "string" ? modern.discover.result.instructions : undefined,
|
|
97
|
+
};
|
|
98
|
+
snapshot.lists = modern.lists;
|
|
99
|
+
snapshot.uiReads = modern.uiReads;
|
|
100
|
+
if (!snapshot.io.stderrTail.length && modern.stderrTail)
|
|
101
|
+
snapshot.io.stderrTail = modern.stderrTail;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
snapshot.era = modern.supported && snapshot.connect.ok ? "both" : "legacy";
|
|
105
|
+
}
|
|
106
|
+
if (target.kind === "http" && options.authProbe) {
|
|
107
|
+
snapshot.http = await probeHttpAuth(target.url, target.headers, timeoutMs);
|
|
108
|
+
}
|
|
109
|
+
if (target.kind === "stdio") {
|
|
110
|
+
const project = detectProject(target.command, target.args, target.cwd);
|
|
111
|
+
if (project) {
|
|
112
|
+
if (!options.offline)
|
|
113
|
+
await lookupLatest(project.sdks);
|
|
114
|
+
snapshot.project = project;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (options.versionMatrix && snapshot.connect.ok && snapshot.era !== "modern") {
|
|
118
|
+
snapshot.versionMatrix = await probeVersions(target, timeoutMs);
|
|
119
|
+
}
|
|
120
|
+
return snapshot;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Published protocol revisions that use the initialize handshake. 2024-10-07 is in
|
|
124
|
+
* the SDK's list but was never published, so it isn't probed.
|
|
125
|
+
*/
|
|
126
|
+
export const HANDSHAKE_VERSIONS = ["2024-11-05", "2025-03-26", "2025-06-18", "2025-11-25"];
|
|
127
|
+
/** Opens one session per handshake protocol version and records what the server answers. */
|
|
128
|
+
export async function probeVersions(target, timeoutMs) {
|
|
129
|
+
const results = [];
|
|
130
|
+
for (const requested of HANDSHAKE_VERSIONS) {
|
|
131
|
+
const transport = makeTransport(target);
|
|
132
|
+
const session = new RpcSession(transport);
|
|
133
|
+
try {
|
|
134
|
+
await session.start();
|
|
135
|
+
const init = (await session.request("initialize", { protocolVersion: requested, capabilities: {}, clientInfo: { name: TOOL_NAME, version: VERSION } }, timeoutMs * 2));
|
|
136
|
+
const negotiated = typeof init?.protocolVersion === "string" ? init.protocolVersion : undefined;
|
|
137
|
+
if (negotiated)
|
|
138
|
+
transport.setProtocolVersion?.(negotiated);
|
|
139
|
+
await session.notify("notifications/initialized");
|
|
140
|
+
const tools = await listAll(requester(session, timeoutMs), "tools");
|
|
141
|
+
results.push({
|
|
142
|
+
requested,
|
|
143
|
+
ok: true,
|
|
144
|
+
negotiated,
|
|
145
|
+
tools: tools.ok ? tools.items.flatMap((t) => (typeof t.name === "string" ? [t.name] : [])).sort() : undefined,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
results.push({ requested, ok: false, error: describeError(err, transport) });
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
await session.close().catch(() => { });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return results;
|
|
156
|
+
}
|
|
157
|
+
function describeError(err, transport) {
|
|
158
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
159
|
+
if (transport instanceof CapturingStdioTransport && (transport.exitCode !== null || transport.exitSignal)) {
|
|
160
|
+
const how = transport.exitSignal ? `signal ${transport.exitSignal}` : `code ${transport.exitCode}`;
|
|
161
|
+
return `${message} (server exited with ${how})`;
|
|
162
|
+
}
|
|
163
|
+
return message;
|
|
164
|
+
}
|
|
165
|
+
function isObject(value) {
|
|
166
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connect/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,EACL,UAAU,GAIX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAsBrD,SAAS,aAAa,CAAC,MAAqB;IAC1C,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO;QAC5B,CAAC,CAAC,IAAI,uBAAuB,CAAC,MAAM,CAAC;QACrC,CAAC,CAAC,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACrD,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;YACxC,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;AACT,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACnD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAmB;QAC/B,eAAe,EAAE,CAAC;QAClB,MAAM,EACJ,MAAM,CAAC,IAAI,KAAK,OAAO;YACrB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;YAChF,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;QACvC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;QACtB,KAAK,EAAE,EAAE;QACT,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;KAC/C,CAAC;IAEF,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CACjC,YAAY,EACZ;YACE,eAAe,EAAE,uBAAuB;YACxC,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;SAClD,EACD,SAAS,GAAG,CAAC,CACd,CAAwC,CAAC;QAE1C,QAAQ,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACpF,MAAM,UAAU,GAAG,OAAO,IAAI,EAAE,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;QAChG,QAAQ,CAAC,UAAU,GAAG;YACpB,wBAAwB,EAAE,uBAAuB;YACjD,yBAAyB,EAAE,UAAU;YACrC,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACpE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;YACnE,YAAY,EAAE,OAAO,IAAI,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;SACrF,CAAC;QACF,IAAI,UAAU;YAAE,SAAS,CAAC,kBAAkB,EAAE,CAAC,UAAU,CAAC,CAAC;QAC3D,MAAM,OAAO,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAElD,4EAA4E;QAC5E,sDAAsD;QACtD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAe,EAAE,CAAC;YACzD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5E,CAAC;QACD,QAAQ,CAAC,OAAO,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3G,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACjE,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxH,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;gBACjD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;IACzE,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,SAAS,YAAY,uBAAuB,EAAE,CAAC;QACjD,QAAQ,CAAC,EAAE,GAAG;YACZ,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;YAChD,UAAU,EAAE,SAAS,CAAC,UAAU;SACjC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACxF,MAAM,WAAW,GACf,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElI,2EAA2E;IAC3E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7D,qEAAqE;QACrE,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,EAAE,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;QACzF,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC;QACxB,QAAQ,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClG,QAAQ,CAAC,UAAU,GAAG;YACpB,wBAAwB,EAAE,cAAc;YACxC,yBAAyB,EAAE,cAAc;YACzC,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;YACvG,YAAY,EAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;SACzH,CAAC;QACF,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9B,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU;YAAE,QAAQ,CAAC,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACtG,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7E,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAChD,QAAQ,CAAC,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACvE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvD,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC9E,QAAQ,CAAC,aAAa,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AAEpG,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAqB,EAAE,SAAiB;IAC1E,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CACjC,YAAY,EACZ,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EACnG,SAAS,GAAG,CAAC,CACd,CAAwC,CAAC;YAC1C,MAAM,UAAU,GAAG,OAAO,IAAI,EAAE,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;YAChG,IAAI,UAAU;gBAAE,SAAS,CAAC,kBAAkB,EAAE,CAAC,UAAU,CAAC,CAAC;YAC3D,MAAM,OAAO,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC;gBACX,SAAS;gBACT,EAAE,EAAE,IAAI;gBACR,UAAU;gBACV,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;aAC9G,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,GAAY,EAAE,SAAoB;IACvD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,SAAS,YAAY,uBAAuB,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1G,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,QAAQ,EAAE,CAAC;QACnG,OAAO,GAAG,OAAO,wBAAwB,GAAG,GAAG,CAAC;IAClD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ListKind, type ListResult, type RawItem, type UiRead } from "../snapshot.js";
|
|
2
|
+
import { type RpcSession } from "./session.js";
|
|
3
|
+
/** Sends one request and resolves with the raw result; rejects with RpcError on a JSON-RPC error. */
|
|
4
|
+
export type Requester = (method: string, params: Record<string, unknown> | undefined) => Promise<unknown>;
|
|
5
|
+
export declare function requester(session: RpcSession, timeoutMs: number): Requester;
|
|
6
|
+
export declare const isObject: (value: unknown) => value is Record<string, unknown>;
|
|
7
|
+
/** Lists every page of one kind, following nextCursor. Errors are recorded, never thrown. */
|
|
8
|
+
export declare function listAll(request: Requester, kind: ListKind, onPage?: (result: Record<string, unknown>) => void): Promise<ListResult>;
|
|
9
|
+
/** Reads each UI resource a tool links to, so checks can tell whether the link works. */
|
|
10
|
+
export declare function readUiResources(request: Requester, tools: RawItem[]): Promise<Record<string, UiRead> | undefined>;
|
|
11
|
+
export declare function elapsed(started: number): number;
|
|
12
|
+
//# sourceMappingURL=lists.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/connect/lists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEvG,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAKzD,qGAAqG;AACrG,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1G,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAE3E;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CACH,CAAC;AAEvE,6FAA6F;AAC7F,wBAAsB,OAAO,CAC3B,OAAO,EAAE,SAAS,EAClB,IAAI,EAAE,QAAQ,EACd,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GACjD,OAAO,CAAC,UAAU,CAAC,CAkCrB;AAED,yFAAyF;AACzF,wBAAsB,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAgBvH;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { LIST_KINDS } from "../snapshot.js";
|
|
2
|
+
import { linkedUiUris } from "../ui.js";
|
|
3
|
+
import { RpcError } from "./session.js";
|
|
4
|
+
const MAX_PAGES = 50;
|
|
5
|
+
const MAX_UI_READS = 20;
|
|
6
|
+
export function requester(session, timeoutMs) {
|
|
7
|
+
return (method, params) => session.request(method, params, timeoutMs);
|
|
8
|
+
}
|
|
9
|
+
export const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
10
|
+
/** Lists every page of one kind, following nextCursor. Errors are recorded, never thrown. */
|
|
11
|
+
export async function listAll(request, kind, onPage) {
|
|
12
|
+
const { method, key } = LIST_KINDS[kind];
|
|
13
|
+
const items = [];
|
|
14
|
+
const seenCursors = new Set();
|
|
15
|
+
const started = performance.now();
|
|
16
|
+
let cursor;
|
|
17
|
+
let pages = 0;
|
|
18
|
+
try {
|
|
19
|
+
do {
|
|
20
|
+
const raw = await request(method, cursor ? { cursor } : undefined);
|
|
21
|
+
const result = isObject(raw) ? raw : {};
|
|
22
|
+
pages++;
|
|
23
|
+
onPage?.(result);
|
|
24
|
+
const page = result[key];
|
|
25
|
+
if (Array.isArray(page))
|
|
26
|
+
items.push(...page.filter(isObject));
|
|
27
|
+
cursor = typeof result.nextCursor === "string" ? result.nextCursor : undefined;
|
|
28
|
+
if (cursor !== undefined) {
|
|
29
|
+
if (seenCursors.has(cursor)) {
|
|
30
|
+
return { ok: true, items, pages, durationMs: elapsed(started), cursorLoop: true };
|
|
31
|
+
}
|
|
32
|
+
seenCursors.add(cursor);
|
|
33
|
+
}
|
|
34
|
+
} while (cursor !== undefined && pages < MAX_PAGES);
|
|
35
|
+
return { ok: true, items, pages, durationMs: elapsed(started) };
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
return {
|
|
39
|
+
ok: false,
|
|
40
|
+
items,
|
|
41
|
+
pages,
|
|
42
|
+
durationMs: elapsed(started),
|
|
43
|
+
error: { code: err instanceof RpcError ? err.code : undefined, message: err.message },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Reads each UI resource a tool links to, so checks can tell whether the link works. */
|
|
48
|
+
export async function readUiResources(request, tools) {
|
|
49
|
+
const uris = [...new Set(tools.flatMap((t) => linkedUiUris(t)))].slice(0, MAX_UI_READS);
|
|
50
|
+
if (uris.length === 0)
|
|
51
|
+
return undefined;
|
|
52
|
+
const reads = {};
|
|
53
|
+
for (const uri of uris) {
|
|
54
|
+
try {
|
|
55
|
+
const result = (await request("resources/read", { uri }));
|
|
56
|
+
const first = Array.isArray(result?.contents) ? result.contents[0] : undefined;
|
|
57
|
+
reads[uri] = first
|
|
58
|
+
? { ok: true, mimeType: typeof first.mimeType === "string" ? first.mimeType : undefined }
|
|
59
|
+
: { ok: false, error: "No contents returned" };
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
reads[uri] = { ok: false, error: err.message };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return reads;
|
|
66
|
+
}
|
|
67
|
+
export function elapsed(started) {
|
|
68
|
+
return Math.round(performance.now() - started);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=lists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/connect/lists.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ConnectTarget } from "./index.js";
|
|
2
|
+
import { type ModernProbe } from "../snapshot.js";
|
|
3
|
+
/** The stateless protocol revision: no initialize, a _meta envelope on every request. */
|
|
4
|
+
export declare const MODERN_VERSION = "2026-07-28";
|
|
5
|
+
/** Parses a JSON-RPC response from a JSON body or the first SSE data event carrying one. */
|
|
6
|
+
export declare function parseHttpJsonRpc(body: string, contentType: string): Record<string, unknown> | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Talks 2026-07-28 to the server: server/discover, then (if the server is modern)
|
|
9
|
+
* every list method, the linked UI resources, and one request with an unsupported
|
|
10
|
+
* version to check the error. Never throws.
|
|
11
|
+
*/
|
|
12
|
+
export declare function probeModern(target: ConnectTarget, timeoutMs: number, headers: Record<string, string>): Promise<ModernProbe>;
|
|
13
|
+
//# sourceMappingURL=modern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modern.d.ts","sourceRoot":"","sources":["../../src/connect/modern.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAkD,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlG,yFAAyF;AACzF,eAAO,MAAM,cAAc,eAAe,CAAC;AA8E3C,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAgBvG;AAYD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CA0DjI"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { LIST_KINDS } from "../snapshot.js";
|
|
2
|
+
import { TOOL_NAME, VERSION } from "../version.js";
|
|
3
|
+
import { elapsed, isObject, listAll, readUiResources } from "./lists.js";
|
|
4
|
+
import { RpcError, RpcSession } from "./session.js";
|
|
5
|
+
import { CapturingStdioTransport } from "./stdio.js";
|
|
6
|
+
/** The stateless protocol revision: no initialize, a _meta envelope on every request. */
|
|
7
|
+
export const MODERN_VERSION = "2026-07-28";
|
|
8
|
+
const META = "io.modelcontextprotocol/";
|
|
9
|
+
/** Error codes only a 2026-07-28 server sends; seeing one means the server is modern. */
|
|
10
|
+
const MODERN_ERROR_CODES = new Set([-32020, -32021, -32022]);
|
|
11
|
+
/** A version no server supports, to check the UnsupportedProtocolVersion error. */
|
|
12
|
+
const BOGUS_VERSION = "1999-01-01";
|
|
13
|
+
function envelope(params, version = MODERN_VERSION) {
|
|
14
|
+
const meta = isObject(params?._meta) ? params._meta : {};
|
|
15
|
+
return {
|
|
16
|
+
...params,
|
|
17
|
+
_meta: {
|
|
18
|
+
...meta,
|
|
19
|
+
[`${META}protocolVersion`]: version,
|
|
20
|
+
[`${META}clientCapabilities`]: {},
|
|
21
|
+
[`${META}clientInfo`]: { name: TOOL_NAME, version: VERSION },
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** stdio: a fresh server process, as the spec's era detection and the v2 SDK do. */
|
|
26
|
+
async function stdioChannel(target, timeoutMs) {
|
|
27
|
+
const transport = new CapturingStdioTransport(target);
|
|
28
|
+
const session = new RpcSession(transport);
|
|
29
|
+
await session.start();
|
|
30
|
+
return {
|
|
31
|
+
request: (method, params, version) => session.request(method, envelope(params, version), timeoutMs),
|
|
32
|
+
close: () => session.close(),
|
|
33
|
+
stderrTail: () => transport.stderrTail,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** HTTP: independent POSTs with the headers 2026-07-28 requires. */
|
|
37
|
+
function httpChannel(url, headers, timeoutMs) {
|
|
38
|
+
let nextId = 1;
|
|
39
|
+
return {
|
|
40
|
+
async request(method, params, version = MODERN_VERSION) {
|
|
41
|
+
const body = { jsonrpc: "2.0", id: nextId++, method, params: envelope(params, version) };
|
|
42
|
+
const name = typeof params?.name === "string" ? params.name : typeof params?.uri === "string" ? params.uri : undefined;
|
|
43
|
+
const res = await fetch(url, {
|
|
44
|
+
method: "POST",
|
|
45
|
+
headers: {
|
|
46
|
+
...headers,
|
|
47
|
+
"content-type": "application/json",
|
|
48
|
+
accept: "application/json, text/event-stream",
|
|
49
|
+
"mcp-protocol-version": version,
|
|
50
|
+
"mcp-method": method,
|
|
51
|
+
...(name ? { "mcp-name": encodeHeader(name) } : {}),
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify(body),
|
|
54
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
55
|
+
});
|
|
56
|
+
const message = parseHttpJsonRpc(await res.text(), res.headers.get("content-type") ?? "");
|
|
57
|
+
if (!message)
|
|
58
|
+
throw new Error(`HTTP ${res.status} with no JSON-RPC response`);
|
|
59
|
+
if (isObject(message.error)) {
|
|
60
|
+
const e = message.error;
|
|
61
|
+
throw new RpcError(e.message ?? "Unknown error", e.code, e.data);
|
|
62
|
+
}
|
|
63
|
+
return message.result;
|
|
64
|
+
},
|
|
65
|
+
close: async () => { },
|
|
66
|
+
stderrTail: () => [],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Header values must be ASCII; others use the spec's =?base64?…?= form. */
|
|
70
|
+
function encodeHeader(value) {
|
|
71
|
+
return /^[\x20-\x7e]*$/.test(value) ? value : `=?base64?${Buffer.from(value, "utf8").toString("base64")}?=`;
|
|
72
|
+
}
|
|
73
|
+
/** Parses a JSON-RPC response from a JSON body or the first SSE data event carrying one. */
|
|
74
|
+
export function parseHttpJsonRpc(body, contentType) {
|
|
75
|
+
const candidates = contentType.includes("text/event-stream")
|
|
76
|
+
? body
|
|
77
|
+
.split(/\r?\n/)
|
|
78
|
+
.filter((l) => l.startsWith("data:"))
|
|
79
|
+
.map((l) => l.slice(5).trim())
|
|
80
|
+
: [body];
|
|
81
|
+
for (const candidate of candidates) {
|
|
82
|
+
try {
|
|
83
|
+
const parsed = JSON.parse(candidate);
|
|
84
|
+
if (isObject(parsed) && ("result" in parsed || "error" in parsed))
|
|
85
|
+
return parsed;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Not JSON; try the next event.
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
function pageMeta(result) {
|
|
94
|
+
const meta = isObject(result._meta) ? result._meta : {};
|
|
95
|
+
return {
|
|
96
|
+
resultType: result.resultType,
|
|
97
|
+
ttlMs: result.ttlMs,
|
|
98
|
+
cacheScope: result.cacheScope,
|
|
99
|
+
serverInfo: isObject(meta[`${META}serverInfo`]) ? meta[`${META}serverInfo`] : undefined,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Talks 2026-07-28 to the server: server/discover, then (if the server is modern)
|
|
104
|
+
* every list method, the linked UI resources, and one request with an unsupported
|
|
105
|
+
* version to check the error. Never throws.
|
|
106
|
+
*/
|
|
107
|
+
export async function probeModern(target, timeoutMs, headers) {
|
|
108
|
+
const started = performance.now();
|
|
109
|
+
let channel;
|
|
110
|
+
try {
|
|
111
|
+
channel = target.kind === "stdio" ? await stdioChannel(target, timeoutMs) : httpChannel(target.url, headers, timeoutMs);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return { version: MODERN_VERSION, supported: false, discover: { ok: false, error: { message: err.message } } };
|
|
115
|
+
}
|
|
116
|
+
const probe = { version: MODERN_VERSION, supported: false, discover: { ok: false } };
|
|
117
|
+
try {
|
|
118
|
+
try {
|
|
119
|
+
const result = await channel.request("server/discover", undefined);
|
|
120
|
+
if (isObject(result)) {
|
|
121
|
+
probe.discover = { ok: true, result };
|
|
122
|
+
probe.discoverMeta = pageMeta(result);
|
|
123
|
+
probe.supported = Array.isArray(result.supportedVersions);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
probe.discover = { ok: false, error: { message: "Result is not an object" } };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const code = err instanceof RpcError ? err.code : undefined;
|
|
131
|
+
probe.discover = { ok: false, error: { code, message: err.message } };
|
|
132
|
+
// A modern-only error means a modern server that rejected our request.
|
|
133
|
+
probe.supported = code !== undefined && MODERN_ERROR_CODES.has(code);
|
|
134
|
+
}
|
|
135
|
+
probe.startupMs = elapsed(started);
|
|
136
|
+
const versions = probe.discover.result?.supportedVersions;
|
|
137
|
+
if (!probe.supported || (Array.isArray(versions) && !versions.includes(MODERN_VERSION)))
|
|
138
|
+
return probe;
|
|
139
|
+
const request = (method, params) => channel.request(method, params);
|
|
140
|
+
probe.lists = {};
|
|
141
|
+
probe.pagesMeta = {};
|
|
142
|
+
for (const kind of Object.keys(LIST_KINDS)) {
|
|
143
|
+
const pages = [];
|
|
144
|
+
probe.lists[kind] = await listAll(request, kind, (result) => pages.push(pageMeta(result)));
|
|
145
|
+
probe.pagesMeta[kind] = pages;
|
|
146
|
+
}
|
|
147
|
+
probe.uiReads = await readUiResources(request, probe.lists.tools?.items ?? []);
|
|
148
|
+
try {
|
|
149
|
+
await channel.request("tools/list", undefined, BOGUS_VERSION);
|
|
150
|
+
probe.unsupportedVersion = { answered: true };
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
probe.unsupportedVersion = {
|
|
154
|
+
answered: false,
|
|
155
|
+
code: err instanceof RpcError ? err.code : undefined,
|
|
156
|
+
message: err.message,
|
|
157
|
+
data: err instanceof RpcError ? err.data : undefined,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return probe;
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
await channel.close().catch(() => { });
|
|
164
|
+
const tail = channel.stderrTail();
|
|
165
|
+
if (tail.length)
|
|
166
|
+
probe.stderrTail = tail.slice(-10);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=modern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modern.js","sourceRoot":"","sources":["../../src/connect/modern.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAwD,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD,yFAAyF;AACzF,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,yFAAyF;AACzF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,mFAAmF;AACnF,MAAM,aAAa,GAAG,YAAY,CAAC;AAEnC,SAAS,QAAQ,CAAC,MAA2C,EAAE,OAAO,GAAG,cAAc;IACrF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,OAAO;QACL,GAAG,MAAM;QACT,KAAK,EAAE;YACL,GAAG,IAAI;YACP,CAAC,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO;YACnC,CAAC,GAAG,IAAI,oBAAoB,CAAC,EAAE,EAAE;YACjC,CAAC,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;SAC7D;KACF,CAAC;AACJ,CAAC;AASD,oFAAoF;AACpF,KAAK,UAAU,YAAY,CAAC,MAAiD,EAAE,SAAiB;IAC9F,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO;QACL,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QACnG,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;QAC5B,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU;KACvC,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,SAAS,WAAW,CAAC,GAAW,EAAE,OAA+B,EAAE,SAAiB;IAClF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,cAAc;YACpD,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACzF,MAAM,IAAI,GAAG,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YACvH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,GAAG,OAAO;oBACV,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,qCAAqC;oBAC7C,sBAAsB,EAAE,OAAO;oBAC/B,YAAY,EAAE,MAAM;oBACpB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpD;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;aACvC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1F,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,4BAA4B,CAAC,CAAC;YAC9E,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,KAA4D,CAAC;gBAC/E,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACrB,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE;KACrB,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9G,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,WAAmB;IAChE,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC1D,CAAC,CAAC,IAAI;aACD,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACX,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,MAA+B;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,GAAG,IAAI,YAAY,CAA6B,CAAC,CAAC,CAAC,SAAS;KACrH,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAqB,EAAE,SAAiB,EAAE,OAA+B;IACzG,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1H,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;IAC5H,CAAC;IAED,MAAM,KAAK,GAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;IAClG,IAAI,CAAC;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;YACnE,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACtC,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACtC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,CAAC;YAChF,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,KAAK,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;YACjF,uEAAuE;YACvE,KAAK,CAAC,SAAS,GAAG,IAAI,KAAK,SAAS,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtG,MAAM,OAAO,GAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/E,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAe,EAAE,CAAC;YACzD,MAAM,KAAK,GAAqB,EAAE,CAAC;YACnC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3F,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAE/E,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;YAC9D,KAAK,CAAC,kBAAkB,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,kBAAkB,GAAG;gBACzB,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBACpD,OAAO,EAAG,GAAa,CAAC,OAAO;gBAC/B,IAAI,EAAE,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;aACrD,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
2
|
+
export declare class RpcError extends Error {
|
|
3
|
+
readonly code?: number | undefined;
|
|
4
|
+
readonly data?: unknown | undefined;
|
|
5
|
+
constructor(message: string, code?: number | undefined, data?: unknown | undefined);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Minimal JSON-RPC session over an MCP transport. Unlike the SDK Client it
|
|
9
|
+
* returns results unvalidated, so malformed server output is observable rather
|
|
10
|
+
* than thrown away.
|
|
11
|
+
*/
|
|
12
|
+
export declare class RpcSession {
|
|
13
|
+
private readonly transport;
|
|
14
|
+
private nextId;
|
|
15
|
+
private pending;
|
|
16
|
+
private closedError?;
|
|
17
|
+
readonly notifications: Array<{
|
|
18
|
+
method: string;
|
|
19
|
+
params?: unknown;
|
|
20
|
+
}>;
|
|
21
|
+
constructor(transport: Transport);
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
request(method: string, params: Record<string, unknown> | undefined, timeoutMs: number): Promise<unknown>;
|
|
24
|
+
notify(method: string, params?: Record<string, unknown>): Promise<void>;
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
private onMessage;
|
|
27
|
+
private failAll;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/connect/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAG/E,qBAAa,QAAS,SAAQ,KAAK;IAG/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO;gBAFvB,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,IAAI,CAAC,EAAE,OAAO,YAAA;CAI1B;AAQD;;;;GAIG;AACH,qBAAa,UAAU;IAMT,OAAO,CAAC,QAAQ,CAAC,SAAS;IALtC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAM;gBAE5C,SAAS,EAAE,SAAS;IAQjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBnG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,OAAO;CAQhB"}
|