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
package/dist/cli.js
ADDED
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { Command, CommanderError, InvalidArgumentError } from "commander";
|
|
2
|
+
import { VERSION } from "./version.js";
|
|
3
|
+
export class UsageError extends Error {
|
|
4
|
+
}
|
|
5
|
+
/** Parses the full command line into one invocation. `check` is the default command. */
|
|
6
|
+
export function parseCommandLine(argv, warn = console.error) {
|
|
7
|
+
let result;
|
|
8
|
+
const program = new Command()
|
|
9
|
+
.name("mcp-use-compat")
|
|
10
|
+
.description("Check an MCP server for issues that break specific MCP clients")
|
|
11
|
+
.version(VERSION)
|
|
12
|
+
.enablePositionalOptions()
|
|
13
|
+
.exitOverride()
|
|
14
|
+
.configureOutput({ writeErr: (s) => process.stderr.write(s) });
|
|
15
|
+
const check = program
|
|
16
|
+
.command("check", { isDefault: true })
|
|
17
|
+
.description("connect to a server and report compatibility issues per client (default)")
|
|
18
|
+
.usage("[options] -- <command> [args...]\n mcp-use-compat check [options] --url <url>")
|
|
19
|
+
.argument("[command...]", "stdio server command, after --")
|
|
20
|
+
.passThroughOptions();
|
|
21
|
+
addTargetOptions(check)
|
|
22
|
+
.option("--save-snapshot <file>", "write the raw server snapshot to a file")
|
|
23
|
+
.option("--version-matrix", "also initialize with every protocol version (one session each)", false)
|
|
24
|
+
.option("--probe-calls", "call tools that declare readOnlyHint: true, with arguments generated from their schema", false)
|
|
25
|
+
.option("-c, --clients <list>", "comma-separated client ids (default: all)", splitList)
|
|
26
|
+
.option("-f, --format <format>", "md | json | github", parseFormat, "md")
|
|
27
|
+
.option("-o, --out <file>", "write the report to a file instead of stdout")
|
|
28
|
+
.option("--fail-on <spec>", "error | warn | none | comma list of check ids/areas", "error")
|
|
29
|
+
.option("--list-checks", "same as the list-checks command", false)
|
|
30
|
+
.option("--list-clients", "same as the list-clients command", false)
|
|
31
|
+
.action((command, opts) => {
|
|
32
|
+
const base = {
|
|
33
|
+
saveSnapshot: opts.saveSnapshot,
|
|
34
|
+
versionMatrix: opts.versionMatrix,
|
|
35
|
+
probeCalls: opts.probeCalls,
|
|
36
|
+
clients: opts.clients,
|
|
37
|
+
format: opts.format,
|
|
38
|
+
out: opts.out,
|
|
39
|
+
failOn: opts.failOn,
|
|
40
|
+
listChecks: opts.listChecks,
|
|
41
|
+
listClients: opts.listClients,
|
|
42
|
+
};
|
|
43
|
+
if (base.listChecks)
|
|
44
|
+
return void (result = { command: "list-checks" });
|
|
45
|
+
if (base.listClients)
|
|
46
|
+
return void (result = { command: "list-clients" });
|
|
47
|
+
result = { command: "check", options: { ...base, ...resolveTarget(command, opts, warn) } };
|
|
48
|
+
});
|
|
49
|
+
program
|
|
50
|
+
.command("diff")
|
|
51
|
+
.description("compare two snapshots (or JSON reports) and classify tool-surface changes")
|
|
52
|
+
.argument("<before>", "snapshot or --format json report from the old version")
|
|
53
|
+
.argument("<after>", "snapshot or --format json report from the new version")
|
|
54
|
+
.option("-f, --format <format>", "md | json | github", parseFormat, "md")
|
|
55
|
+
.option("-o, --out <file>", "write the diff to a file instead of stdout")
|
|
56
|
+
.option("--fail-on <level>", "breaking | any | none", parseDiffFailOn, "breaking")
|
|
57
|
+
.action((before, after, opts) => {
|
|
58
|
+
result = {
|
|
59
|
+
command: "diff",
|
|
60
|
+
options: {
|
|
61
|
+
before,
|
|
62
|
+
after,
|
|
63
|
+
format: opts.format,
|
|
64
|
+
out: opts.out,
|
|
65
|
+
failOn: opts.failOn,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
const callCommand = program
|
|
70
|
+
.command("call")
|
|
71
|
+
.description("call one tool (any tool, at your own risk) and check the result")
|
|
72
|
+
.usage("<tool> [options] -- <command> [args...]")
|
|
73
|
+
.argument("<tool>", "tool name")
|
|
74
|
+
.argument("[command...]", "stdio server command, after --");
|
|
75
|
+
addTargetOptions(callCommand)
|
|
76
|
+
.option("-a, --args <json>", "tool arguments as JSON (default: {})", parseJsonObject, {})
|
|
77
|
+
.option("-f, --format <format>", "md | json", parseFormat, "md")
|
|
78
|
+
.action((tool, command, opts) => {
|
|
79
|
+
if (opts.format === "github")
|
|
80
|
+
throw new UsageError("call supports --format md or json");
|
|
81
|
+
result = {
|
|
82
|
+
command: "call",
|
|
83
|
+
options: {
|
|
84
|
+
tool,
|
|
85
|
+
args: opts.args,
|
|
86
|
+
format: opts.format,
|
|
87
|
+
...resolveTarget(command, opts, warn),
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
const oauth = program.command("oauth").description("log in to OAuth-protected servers and manage stored credentials");
|
|
92
|
+
oauth
|
|
93
|
+
.command("login")
|
|
94
|
+
.description("run the browser OAuth flow, report each step, and store the tokens")
|
|
95
|
+
.requiredOption("--url <url>", "MCP server URL")
|
|
96
|
+
.option("--callback-port <port>", "local port for the redirect (0 = random; pre-registered clients need a fixed one)", parsePort, 0)
|
|
97
|
+
.option("--client-id <id>", "use a pre-registered client instead of CIMD/DCR")
|
|
98
|
+
.option("--client-secret <secret>", "secret for --client-id (confidential clients)")
|
|
99
|
+
.option("--client-metadata-url <url>", "HTTPS URL of a Client ID Metadata Document you host (used if the server supports CIMD)")
|
|
100
|
+
.option("--scope <scope>", "scopes to request (default: what the server advertises)")
|
|
101
|
+
.option("--no-browser", "print the login URL instead of opening a browser")
|
|
102
|
+
.option("--timeout <ms>", "how long to wait for the browser login", parsePositiveInt, 300000)
|
|
103
|
+
.action((opts) => {
|
|
104
|
+
result = {
|
|
105
|
+
command: "oauth-login",
|
|
106
|
+
options: {
|
|
107
|
+
url: parseUrl(opts.url),
|
|
108
|
+
callbackPort: opts.callbackPort,
|
|
109
|
+
clientId: opts.clientId,
|
|
110
|
+
clientSecret: opts.clientSecret,
|
|
111
|
+
clientMetadataUrl: opts.clientMetadataUrl,
|
|
112
|
+
scope: opts.scope,
|
|
113
|
+
openBrowser: opts.browser,
|
|
114
|
+
timeoutMs: opts.timeout,
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
oauth
|
|
119
|
+
.command("status")
|
|
120
|
+
.description("list servers with stored credentials")
|
|
121
|
+
.action(() => void (result = { command: "oauth-status" }));
|
|
122
|
+
oauth
|
|
123
|
+
.command("logout")
|
|
124
|
+
.description("delete stored credentials for a server")
|
|
125
|
+
.requiredOption("--url <url>", "MCP server URL")
|
|
126
|
+
.action((opts) => void (result = { command: "oauth-logout", url: parseUrl(opts.url) }));
|
|
127
|
+
program
|
|
128
|
+
.command("upgrade")
|
|
129
|
+
.description("find the server's MCP SDK, compare it with the latest release, and print (or --apply) the upgrade")
|
|
130
|
+
.usage("[options] [-- <server command>]")
|
|
131
|
+
.argument("[command...]", "stdio server command, after --; with --apply the server is re-checked before and after")
|
|
132
|
+
.option("--dir <path>", "project directory, when no server command is given", process.cwd())
|
|
133
|
+
.option("--cwd <dir>", "working directory for the server command", process.cwd())
|
|
134
|
+
.option("--env <KEY=VAL>", "environment variable for the server (repeatable)", collectKeyValue("="), {})
|
|
135
|
+
.option("--apply", "run the upgrade commands (minor updates; majors need --major)", false)
|
|
136
|
+
.option("--major", "with --apply, also run major-version upgrades", false)
|
|
137
|
+
.option("--offline", "don't look up latest versions", false)
|
|
138
|
+
.option("--timeout <ms>", "per-request timeout for the re-checks", parsePositiveInt, 10000)
|
|
139
|
+
.action((command, opts) => {
|
|
140
|
+
const target = command.length
|
|
141
|
+
? { kind: "stdio", command: command[0], args: command.slice(1), cwd: opts.cwd, env: opts.env }
|
|
142
|
+
: undefined;
|
|
143
|
+
result = {
|
|
144
|
+
command: "upgrade",
|
|
145
|
+
options: {
|
|
146
|
+
target,
|
|
147
|
+
dir: opts.dir,
|
|
148
|
+
apply: opts.apply,
|
|
149
|
+
major: opts.major,
|
|
150
|
+
offline: opts.offline,
|
|
151
|
+
timeoutMs: opts.timeout,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
program
|
|
156
|
+
.command("fix")
|
|
157
|
+
.description("apply safe mechanical fixes to tool definitions and list what changed")
|
|
158
|
+
.argument("<input>", "snapshot (from --save-snapshot), { tools: [...] } or an array of tools")
|
|
159
|
+
.option("-o, --out <file>", "write the fixed { tools } JSON to a file")
|
|
160
|
+
.option("--json", "print the fixed { tools } JSON to stdout", false)
|
|
161
|
+
.option("--rename", "also rename tools with characters clients rewrite (breaking for callers)", false)
|
|
162
|
+
.action((input, opts) => {
|
|
163
|
+
result = {
|
|
164
|
+
command: "fix",
|
|
165
|
+
options: { input, out: opts.out, format: opts.json ? "json" : "summary", rename: opts.rename },
|
|
166
|
+
};
|
|
167
|
+
});
|
|
168
|
+
program
|
|
169
|
+
.command("explain")
|
|
170
|
+
.description("explain what a check verifies, why, and where the facts come from")
|
|
171
|
+
.argument("<check-id>")
|
|
172
|
+
.action((checkId) => void (result = { command: "explain", checkId }));
|
|
173
|
+
program
|
|
174
|
+
.command("list-checks")
|
|
175
|
+
.description("print all checks")
|
|
176
|
+
.action(() => void (result = { command: "list-checks" }));
|
|
177
|
+
program
|
|
178
|
+
.command("list-clients")
|
|
179
|
+
.description("print client profiles and how fresh their facts are")
|
|
180
|
+
.action(() => void (result = { command: "list-clients" }));
|
|
181
|
+
// Commander matches subcommand names even after "--", so `-- diff x` (a server
|
|
182
|
+
// command called diff) would run our diff. Route anything not starting with a
|
|
183
|
+
// subcommand to `check` explicitly when a server command is given.
|
|
184
|
+
const subcommands = new Set(program.commands.flatMap((c) => [c.name(), ...c.aliases()]));
|
|
185
|
+
const args = argv[0] !== undefined && !subcommands.has(argv[0]) && argv.includes("--") ? ["check", ...argv] : argv;
|
|
186
|
+
program.parse(args, { from: "user" });
|
|
187
|
+
if (!result)
|
|
188
|
+
throw new UsageError("No command given. Run with --help for usage.");
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
/** Back-compat entry point for the default command; throws if argv selects another command. */
|
|
192
|
+
export function parseArgs(argv, warn = console.error) {
|
|
193
|
+
const invocation = parseCommandLine(argv, warn);
|
|
194
|
+
if (invocation.command === "check")
|
|
195
|
+
return invocation.options;
|
|
196
|
+
if (invocation.command === "list-checks" || invocation.command === "list-clients") {
|
|
197
|
+
return {
|
|
198
|
+
format: "md",
|
|
199
|
+
failOn: "error",
|
|
200
|
+
versionMatrix: false,
|
|
201
|
+
probeCalls: false,
|
|
202
|
+
timeoutMs: 10000,
|
|
203
|
+
authProbe: true,
|
|
204
|
+
listChecks: invocation.command === "list-checks",
|
|
205
|
+
listClients: invocation.command === "list-clients",
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
throw new UsageError(`"${invocation.command}" is not the check command`);
|
|
209
|
+
}
|
|
210
|
+
/** Adds --url/--from-snapshot/--env/--header/--cwd/--timeout/--no-auth-probe. */
|
|
211
|
+
export function addTargetOptions(cmd) {
|
|
212
|
+
return cmd
|
|
213
|
+
.option("--url <url>", "Streamable HTTP endpoint instead of a stdio command")
|
|
214
|
+
.option("--from-snapshot <file>", "use a saved snapshot instead of connecting")
|
|
215
|
+
.option("--timeout <ms>", "per-request timeout in ms (startup gets 2x)", parsePositiveInt, 10000)
|
|
216
|
+
.option("--env <KEY=VAL>", "environment variable for the stdio server (repeatable)", collectKeyValue("="), {})
|
|
217
|
+
.option("--header <Name:Value>", "HTTP header for --url (repeatable)", collectKeyValue(":"), {})
|
|
218
|
+
.option("--cwd <dir>", "working directory for the stdio server", process.cwd())
|
|
219
|
+
.option("--no-auth-probe", "skip unauthenticated OAuth discovery requests (--url only)")
|
|
220
|
+
.option("--oauth", "use credentials stored by `oauth login` (--url only)", false)
|
|
221
|
+
.option("--offline", "don't look up the latest SDK versions", false);
|
|
222
|
+
}
|
|
223
|
+
/** Turns the shared target options plus the positional command into a TargetOptions. */
|
|
224
|
+
export function resolveTarget(command, opts, warn) {
|
|
225
|
+
const base = {
|
|
226
|
+
fromSnapshot: opts.fromSnapshot,
|
|
227
|
+
timeoutMs: opts.timeout,
|
|
228
|
+
authProbe: opts.authProbe,
|
|
229
|
+
oauth: opts.oauth,
|
|
230
|
+
offline: opts.offline,
|
|
231
|
+
};
|
|
232
|
+
if (base.oauth && !opts.url)
|
|
233
|
+
throw new UsageError("--oauth needs --url");
|
|
234
|
+
const sources = [command.length > 0, !!opts.url, !!base.fromSnapshot].filter(Boolean).length;
|
|
235
|
+
if (sources !== 1) {
|
|
236
|
+
throw new UsageError("Specify exactly one of: -- <command>, --url <url>, --from-snapshot <file>");
|
|
237
|
+
}
|
|
238
|
+
if (opts.url) {
|
|
239
|
+
return { ...base, target: { kind: "http", url: parseUrl(opts.url), headers: opts.header } };
|
|
240
|
+
}
|
|
241
|
+
if (command.length > 0) {
|
|
242
|
+
let [cmd, ...args] = command;
|
|
243
|
+
// v0.1 compatibility: a bare script path means "node <path>".
|
|
244
|
+
if (command.length === 1 && /\.(c|m)?js$/.test(cmd)) {
|
|
245
|
+
warn(`Note: treating "${cmd}" as "-- node ${cmd}". Pass the full command after -- instead.`);
|
|
246
|
+
args = [cmd];
|
|
247
|
+
cmd = process.execPath;
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
...base,
|
|
251
|
+
target: { kind: "stdio", command: cmd, args, cwd: opts.cwd, env: opts.env },
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return base;
|
|
255
|
+
}
|
|
256
|
+
export function isCommanderExit(err) {
|
|
257
|
+
return err instanceof CommanderError;
|
|
258
|
+
}
|
|
259
|
+
function parseUrl(value) {
|
|
260
|
+
try {
|
|
261
|
+
return new URL(value).href;
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
throw new UsageError(`Invalid --url: ${value}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function parsePort(value) {
|
|
268
|
+
const n = Number(value);
|
|
269
|
+
if (!Number.isInteger(n) || n < 0 || n > 65535)
|
|
270
|
+
throw new InvalidArgumentError("must be a port number");
|
|
271
|
+
return n;
|
|
272
|
+
}
|
|
273
|
+
function splitList(value) {
|
|
274
|
+
return value
|
|
275
|
+
.split(",")
|
|
276
|
+
.map((s) => s.trim())
|
|
277
|
+
.filter(Boolean);
|
|
278
|
+
}
|
|
279
|
+
function parseFormat(value) {
|
|
280
|
+
if (value === "markdown")
|
|
281
|
+
return "md";
|
|
282
|
+
if (value === "md" || value === "json" || value === "github")
|
|
283
|
+
return value;
|
|
284
|
+
throw new InvalidArgumentError("must be md, json or github");
|
|
285
|
+
}
|
|
286
|
+
function parseJsonObject(value) {
|
|
287
|
+
let parsed;
|
|
288
|
+
try {
|
|
289
|
+
parsed = JSON.parse(value);
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
throw new InvalidArgumentError(`not valid JSON: ${err.message}`);
|
|
293
|
+
}
|
|
294
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
|
|
295
|
+
throw new InvalidArgumentError("must be a JSON object");
|
|
296
|
+
return parsed;
|
|
297
|
+
}
|
|
298
|
+
function parseDiffFailOn(value) {
|
|
299
|
+
if (value === "breaking" || value === "any" || value === "none")
|
|
300
|
+
return value;
|
|
301
|
+
throw new InvalidArgumentError("must be breaking, any or none");
|
|
302
|
+
}
|
|
303
|
+
function parsePositiveInt(value) {
|
|
304
|
+
const n = Number(value);
|
|
305
|
+
if (!Number.isInteger(n) || n <= 0)
|
|
306
|
+
throw new InvalidArgumentError("must be a positive integer");
|
|
307
|
+
return n;
|
|
308
|
+
}
|
|
309
|
+
function collectKeyValue(separator) {
|
|
310
|
+
return (value, previous) => {
|
|
311
|
+
const index = value.indexOf(separator);
|
|
312
|
+
if (index <= 0)
|
|
313
|
+
throw new InvalidArgumentError(`expected NAME${separator}VALUE`);
|
|
314
|
+
return { ...previous, [value.slice(0, index).trim()]: value.slice(index + 1).trim() };
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CallProbe, RawItem } from "../snapshot.js";
|
|
2
|
+
import { type RpcSession } from "./session.js";
|
|
3
|
+
/**
|
|
4
|
+
* Tools --probe-calls may call: explicitly readOnlyHint: true, not also marked
|
|
5
|
+
* destructive, and not named like a write. Anything else is never called.
|
|
6
|
+
*/
|
|
7
|
+
export declare function safeToProbe(tool: RawItem): boolean;
|
|
8
|
+
/** Minimal arguments that satisfy the schema's required properties. */
|
|
9
|
+
export declare function synthesizeArgs(schema: unknown): Record<string, unknown>;
|
|
10
|
+
export declare function callTool(session: RpcSession, tool: string, args: Record<string, unknown>, origin: CallProbe["origin"], timeoutMs: number): Promise<CallProbe>;
|
|
11
|
+
/** Calls up to MAX_PROBES safe tools with synthesized arguments. */
|
|
12
|
+
export declare function probeCalls(session: RpcSession, tools: RawItem[], timeoutMs: number, log: (msg: string) => void): Promise<CallProbe[]>;
|
|
13
|
+
//# sourceMappingURL=calls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../src/connect/calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAQzD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAIlD;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGvE;AAuDD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,EAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAiBD,oEAAoE;AACpE,wBAAsB,UAAU,CAC9B,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,OAAO,EAAE,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,SAAS,EAAE,CAAC,CAYtB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { nameIntent } from "../checks/tools.js";
|
|
2
|
+
import { RpcError } from "./session.js";
|
|
3
|
+
const MAX_PROBES = 20;
|
|
4
|
+
const MAX_TEXT = 4000;
|
|
5
|
+
const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
6
|
+
/**
|
|
7
|
+
* Tools --probe-calls may call: explicitly readOnlyHint: true, not also marked
|
|
8
|
+
* destructive, and not named like a write. Anything else is never called.
|
|
9
|
+
*/
|
|
10
|
+
export function safeToProbe(tool) {
|
|
11
|
+
const a = isObject(tool.annotations) ? tool.annotations : {};
|
|
12
|
+
if (a.readOnlyHint !== true || a.destructiveHint === true)
|
|
13
|
+
return false;
|
|
14
|
+
return typeof tool.name === "string" && nameIntent(tool.name) !== "write";
|
|
15
|
+
}
|
|
16
|
+
/** Minimal arguments that satisfy the schema's required properties. */
|
|
17
|
+
export function synthesizeArgs(schema) {
|
|
18
|
+
const value = synthesizeValue(schema, 0);
|
|
19
|
+
return isObject(value) ? value : {};
|
|
20
|
+
}
|
|
21
|
+
function synthesizeValue(schema, depth) {
|
|
22
|
+
if (!isObject(schema) || depth > 6)
|
|
23
|
+
return undefined;
|
|
24
|
+
if ("default" in schema)
|
|
25
|
+
return schema.default;
|
|
26
|
+
if (Array.isArray(schema.examples) && schema.examples.length)
|
|
27
|
+
return schema.examples[0];
|
|
28
|
+
if ("const" in schema)
|
|
29
|
+
return schema.const;
|
|
30
|
+
if (Array.isArray(schema.enum) && schema.enum.length)
|
|
31
|
+
return schema.enum[0];
|
|
32
|
+
for (const key of ["anyOf", "oneOf"]) {
|
|
33
|
+
if (Array.isArray(schema[key]) && schema[key].length)
|
|
34
|
+
return synthesizeValue(schema[key][0], depth + 1);
|
|
35
|
+
}
|
|
36
|
+
const type = Array.isArray(schema.type) ? schema.type.find((t) => t !== "null") : schema.type;
|
|
37
|
+
switch (type) {
|
|
38
|
+
case "string":
|
|
39
|
+
return stringFor(schema);
|
|
40
|
+
case "integer":
|
|
41
|
+
case "number":
|
|
42
|
+
return typeof schema.minimum === "number" ? schema.minimum : typeof schema.exclusiveMinimum === "number" ? schema.exclusiveMinimum + 1 : 1;
|
|
43
|
+
case "boolean":
|
|
44
|
+
return false;
|
|
45
|
+
case "array": {
|
|
46
|
+
const min = typeof schema.minItems === "number" ? schema.minItems : 0;
|
|
47
|
+
return Array.from({ length: min }, () => synthesizeValue(schema.items, depth + 1));
|
|
48
|
+
}
|
|
49
|
+
case "null":
|
|
50
|
+
return null;
|
|
51
|
+
default: {
|
|
52
|
+
const out = {};
|
|
53
|
+
const props = isObject(schema.properties) ? schema.properties : {};
|
|
54
|
+
for (const name of Array.isArray(schema.required) ? schema.required : []) {
|
|
55
|
+
if (typeof name === "string")
|
|
56
|
+
out[name] = synthesizeValue(props[name] ?? { type: "string" }, depth + 1);
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function stringFor(schema) {
|
|
63
|
+
switch (schema.format) {
|
|
64
|
+
case "date":
|
|
65
|
+
return "2026-01-02";
|
|
66
|
+
case "date-time":
|
|
67
|
+
return "2026-01-02T03:04:05Z";
|
|
68
|
+
case "email":
|
|
69
|
+
return "test@example.com";
|
|
70
|
+
case "uri":
|
|
71
|
+
case "url":
|
|
72
|
+
return "https://example.com";
|
|
73
|
+
case "uuid":
|
|
74
|
+
return "00000000-0000-4000-8000-000000000000";
|
|
75
|
+
}
|
|
76
|
+
const min = typeof schema.minLength === "number" ? schema.minLength : 1;
|
|
77
|
+
return "test".padEnd(min, "x");
|
|
78
|
+
}
|
|
79
|
+
export async function callTool(session, tool, args, origin, timeoutMs) {
|
|
80
|
+
const started = performance.now();
|
|
81
|
+
try {
|
|
82
|
+
const result = await session.request("tools/call", { name: tool, arguments: args }, timeoutMs);
|
|
83
|
+
const raw = isObject(result) ? result : { __nonObjectResult: result };
|
|
84
|
+
return {
|
|
85
|
+
tool,
|
|
86
|
+
args,
|
|
87
|
+
origin,
|
|
88
|
+
durationMs: Math.round(performance.now() - started),
|
|
89
|
+
result: truncateResult(raw),
|
|
90
|
+
resultChars: JSON.stringify(raw).length,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
return {
|
|
95
|
+
tool,
|
|
96
|
+
args,
|
|
97
|
+
origin,
|
|
98
|
+
durationMs: Math.round(performance.now() - started),
|
|
99
|
+
error: { code: err instanceof RpcError ? err.code : undefined, message: err.message },
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Keeps structure (for validation) but caps long text so snapshots stay small. */
|
|
104
|
+
function truncateResult(result) {
|
|
105
|
+
if (!Array.isArray(result.content))
|
|
106
|
+
return result;
|
|
107
|
+
return {
|
|
108
|
+
...result,
|
|
109
|
+
content: result.content.map((c) => isObject(c) && typeof c.text === "string" && c.text.length > MAX_TEXT
|
|
110
|
+
? { ...c, text: c.text.slice(0, MAX_TEXT), __truncatedFrom: c.text.length }
|
|
111
|
+
: isObject(c) && typeof c.data === "string" && c.data.length > MAX_TEXT
|
|
112
|
+
? { ...c, data: c.data.slice(0, 64), __truncatedFrom: c.data.length }
|
|
113
|
+
: c),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** Calls up to MAX_PROBES safe tools with synthesized arguments. */
|
|
117
|
+
export async function probeCalls(session, tools, timeoutMs, log) {
|
|
118
|
+
const safe = tools.filter(safeToProbe).slice(0, MAX_PROBES);
|
|
119
|
+
if (safe.length === 0) {
|
|
120
|
+
log("--probe-calls: no tools declare readOnlyHint: true, so nothing was called.");
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
log(`--probe-calls: calling ${safe.length} read-only tool(s): ${safe.map((t) => t.name).join(", ")}`);
|
|
124
|
+
const results = [];
|
|
125
|
+
for (const tool of safe) {
|
|
126
|
+
results.push(await callTool(session, tool.name, synthesizeArgs(tool.inputSchema), "probe", timeoutMs));
|
|
127
|
+
}
|
|
128
|
+
return results;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=calls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls.js","sourceRoot":"","sources":["../../src/connect/calls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HttpProbe } from "../snapshot.js";
|
|
2
|
+
/**
|
|
3
|
+
* Unauthenticated discovery probes, following the MCP authorization spec:
|
|
4
|
+
* one initialize POST without credentials, then RFC 9728 protected resource
|
|
5
|
+
* metadata, then RFC 8414 / OIDC authorization server metadata.
|
|
6
|
+
* Nothing here sends credentials or starts a real OAuth flow.
|
|
7
|
+
*/
|
|
8
|
+
export declare function probeHttpAuth(url: string, headers: Record<string, string>, timeoutMs: number): Promise<HttpProbe>;
|
|
9
|
+
/** RFC 9728 §3: path-suffixed well-known first, then the root. */
|
|
10
|
+
export declare function wellKnownUrls(resourceUrl: string, name: string): string[];
|
|
11
|
+
/** RFC 8414 path insertion, then OIDC path insertion, then OIDC path appending. */
|
|
12
|
+
export declare function authServerMetadataUrls(issuer: string): string[];
|
|
13
|
+
export declare function parseResourceMetadataParam(header: string | undefined): string | undefined;
|
|
14
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/connect/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,gBAAgB,CAAC;AAGnE;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,CAiDpB;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOzE;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAc/D;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIzF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { LATEST_PROTOCOL_VERSION } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { VERSION } from "../version.js";
|
|
3
|
+
/**
|
|
4
|
+
* Unauthenticated discovery probes, following the MCP authorization spec:
|
|
5
|
+
* one initialize POST without credentials, then RFC 9728 protected resource
|
|
6
|
+
* metadata, then RFC 8414 / OIDC authorization server metadata.
|
|
7
|
+
* Nothing here sends credentials or starts a real OAuth flow.
|
|
8
|
+
*/
|
|
9
|
+
export async function probeHttpAuth(url, headers, timeoutMs) {
|
|
10
|
+
const unauthenticated = await fetchProbe(url, timeoutMs, {
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: {
|
|
13
|
+
...withoutAuthorization(headers),
|
|
14
|
+
"content-type": "application/json",
|
|
15
|
+
accept: "application/json, text/event-stream",
|
|
16
|
+
},
|
|
17
|
+
body: JSON.stringify({
|
|
18
|
+
jsonrpc: "2.0",
|
|
19
|
+
id: 1,
|
|
20
|
+
method: "initialize",
|
|
21
|
+
params: {
|
|
22
|
+
protocolVersion: LATEST_PROTOCOL_VERSION,
|
|
23
|
+
capabilities: {},
|
|
24
|
+
clientInfo: { name: "mcp-use-compat-auth-probe", version: VERSION },
|
|
25
|
+
},
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
const probe = { unauthenticated, protectedResource: [], authorizationServer: [] };
|
|
29
|
+
if (unauthenticated.status !== 401 && unauthenticated.status !== 403)
|
|
30
|
+
return probe;
|
|
31
|
+
// Protected resource metadata: header hint first, then the well-known URIs.
|
|
32
|
+
const prmUrls = [];
|
|
33
|
+
const hinted = parseResourceMetadataParam(unauthenticated.headers?.["www-authenticate"]);
|
|
34
|
+
if (hinted)
|
|
35
|
+
prmUrls.push(hinted);
|
|
36
|
+
prmUrls.push(...wellKnownUrls(url, "oauth-protected-resource"));
|
|
37
|
+
let authServers = [];
|
|
38
|
+
for (const prmUrl of unique(prmUrls)) {
|
|
39
|
+
const res = await fetchProbe(prmUrl, timeoutMs);
|
|
40
|
+
probe.protectedResource.push(res);
|
|
41
|
+
const servers = res.json?.authorization_servers;
|
|
42
|
+
if (res.status === 200 && Array.isArray(servers)) {
|
|
43
|
+
authServers = servers.filter((s) => typeof s === "string");
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const issuer of authServers.slice(0, 3)) {
|
|
48
|
+
for (const asmUrl of authServerMetadataUrls(issuer)) {
|
|
49
|
+
const res = await fetchProbe(asmUrl, timeoutMs);
|
|
50
|
+
probe.authorizationServer.push(res);
|
|
51
|
+
if (res.status === 200 && res.json && typeof res.json === "object")
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return probe;
|
|
56
|
+
}
|
|
57
|
+
/** RFC 9728 §3: path-suffixed well-known first, then the root. */
|
|
58
|
+
export function wellKnownUrls(resourceUrl, name) {
|
|
59
|
+
const u = new URL(resourceUrl);
|
|
60
|
+
const path = u.pathname.replace(/\/$/, "");
|
|
61
|
+
const urls = [];
|
|
62
|
+
if (path)
|
|
63
|
+
urls.push(`${u.origin}/.well-known/${name}${path}`);
|
|
64
|
+
urls.push(`${u.origin}/.well-known/${name}`);
|
|
65
|
+
return urls;
|
|
66
|
+
}
|
|
67
|
+
/** RFC 8414 path insertion, then OIDC path insertion, then OIDC path appending. */
|
|
68
|
+
export function authServerMetadataUrls(issuer) {
|
|
69
|
+
const u = new URL(issuer);
|
|
70
|
+
const path = u.pathname.replace(/\/$/, "");
|
|
71
|
+
if (!path) {
|
|
72
|
+
return [
|
|
73
|
+
`${u.origin}/.well-known/oauth-authorization-server`,
|
|
74
|
+
`${u.origin}/.well-known/openid-configuration`,
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
return [
|
|
78
|
+
`${u.origin}/.well-known/oauth-authorization-server${path}`,
|
|
79
|
+
`${u.origin}/.well-known/openid-configuration${path}`,
|
|
80
|
+
`${u.origin}${path}/.well-known/openid-configuration`,
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
export function parseResourceMetadataParam(header) {
|
|
84
|
+
if (!header)
|
|
85
|
+
return undefined;
|
|
86
|
+
const match = /resource_metadata\s*=\s*(?:"([^"]*)"|([^\s,]+))/i.exec(header);
|
|
87
|
+
return match?.[1] ?? match?.[2];
|
|
88
|
+
}
|
|
89
|
+
async function fetchProbe(url, timeoutMs, init = {}) {
|
|
90
|
+
try {
|
|
91
|
+
const res = await fetch(url, {
|
|
92
|
+
...init,
|
|
93
|
+
headers: { accept: "application/json", ...init.headers },
|
|
94
|
+
redirect: "follow",
|
|
95
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
96
|
+
});
|
|
97
|
+
const headers = {};
|
|
98
|
+
for (const name of ["www-authenticate", "content-type", "mcp-session-id"]) {
|
|
99
|
+
const value = res.headers.get(name);
|
|
100
|
+
if (value !== null)
|
|
101
|
+
headers[name] = value;
|
|
102
|
+
}
|
|
103
|
+
let json;
|
|
104
|
+
if (res.headers.get("content-type")?.includes("json")) {
|
|
105
|
+
json = await res.json().catch(() => undefined);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
await res.body?.cancel().catch(() => { });
|
|
109
|
+
}
|
|
110
|
+
return { url, status: res.status, headers, json };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
return { url, error: err.message };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function withoutAuthorization(headers) {
|
|
117
|
+
return Object.fromEntries(Object.entries(headers).filter(([k]) => k.toLowerCase() !== "authorization"));
|
|
118
|
+
}
|
|
119
|
+
function unique(items) {
|
|
120
|
+
return [...new Set(items)];
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/connect/http.ts"],"names":[],"mappings":"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"}
|