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/oauth.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { createServer } from "node:http";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import { auth } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
8
|
+
import { TOOL_NAME, VERSION } from "./version.js";
|
|
9
|
+
/** Credentials per MCP server URL in ~/.config/mcp-use-compat/oauth.json (mode 0600). */
|
|
10
|
+
export class CredentialStore {
|
|
11
|
+
path;
|
|
12
|
+
constructor(path = defaultStorePath()) {
|
|
13
|
+
this.path = path;
|
|
14
|
+
}
|
|
15
|
+
all() {
|
|
16
|
+
if (!existsSync(this.path))
|
|
17
|
+
return {};
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(readFileSync(this.path, "utf8"));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
get(url) {
|
|
26
|
+
return this.all()[url] ?? {};
|
|
27
|
+
}
|
|
28
|
+
update(url, change) {
|
|
29
|
+
const data = this.all();
|
|
30
|
+
const next = change(data[url] ?? {});
|
|
31
|
+
if (next)
|
|
32
|
+
data[url] = next;
|
|
33
|
+
else
|
|
34
|
+
delete data[url];
|
|
35
|
+
mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
36
|
+
writeFileSync(this.path, JSON.stringify(data, null, 2) + "\n", { mode: 0o600 });
|
|
37
|
+
chmodSync(this.path, 0o600);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function defaultStorePath() {
|
|
41
|
+
const base = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
|
|
42
|
+
return join(base, TOOL_NAME, "oauth.json");
|
|
43
|
+
}
|
|
44
|
+
/** SDK OAuthClientProvider backed by the credential store. */
|
|
45
|
+
export class StoredOAuthProvider {
|
|
46
|
+
serverUrl;
|
|
47
|
+
store;
|
|
48
|
+
options;
|
|
49
|
+
clientMetadataUrl;
|
|
50
|
+
stateValue = randomBytes(16).toString("hex");
|
|
51
|
+
constructor(serverUrl, store, options = {}) {
|
|
52
|
+
this.serverUrl = serverUrl;
|
|
53
|
+
this.store = store;
|
|
54
|
+
this.options = options;
|
|
55
|
+
this.clientMetadataUrl = options.clientMetadataUrl;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Non-interactive providers (no onRedirect) still report a redirect URL so the SDK
|
|
59
|
+
* takes the authorization-code path and reaches redirectToAuthorization, which
|
|
60
|
+
* explains how to log in, instead of attempting a client-credentials grant.
|
|
61
|
+
*/
|
|
62
|
+
get redirectUrl() {
|
|
63
|
+
return this.options.redirectUrl ?? (this.options.onRedirect ? undefined : "http://127.0.0.1/not-logged-in");
|
|
64
|
+
}
|
|
65
|
+
get clientMetadata() {
|
|
66
|
+
return {
|
|
67
|
+
client_name: TOOL_NAME,
|
|
68
|
+
software_id: TOOL_NAME,
|
|
69
|
+
software_version: VERSION,
|
|
70
|
+
redirect_uris: this.options.redirectUrl ? [this.options.redirectUrl] : [],
|
|
71
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
72
|
+
response_types: ["code"],
|
|
73
|
+
token_endpoint_auth_method: this.options.clientSecret ? "client_secret_post" : "none",
|
|
74
|
+
...(this.options.scope ? { scope: this.options.scope } : {}),
|
|
75
|
+
// Required by protocol 2026-07-28 for DCR; ignored by older servers. Not in the SDK's type yet.
|
|
76
|
+
...{ application_type: "native" },
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
state() {
|
|
80
|
+
return this.stateValue;
|
|
81
|
+
}
|
|
82
|
+
clientInformation() {
|
|
83
|
+
if (this.options.clientId) {
|
|
84
|
+
return { client_id: this.options.clientId, ...(this.options.clientSecret ? { client_secret: this.options.clientSecret } : {}) };
|
|
85
|
+
}
|
|
86
|
+
const info = this.store.get(this.serverUrl).clientInformation;
|
|
87
|
+
if (info)
|
|
88
|
+
return info;
|
|
89
|
+
// Never register a new client from a non-interactive run.
|
|
90
|
+
if (!this.options.onRedirect)
|
|
91
|
+
throw this.notLoggedIn();
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
notLoggedIn() {
|
|
95
|
+
return new Error(`Not logged in to ${this.serverUrl} (or the session can't be refreshed). Run: ${TOOL_NAME} oauth login --url ${this.serverUrl}`);
|
|
96
|
+
}
|
|
97
|
+
saveClientInformation(info) {
|
|
98
|
+
const registration = info.client_id === this.clientMetadataUrl ? "cimd" : "dcr";
|
|
99
|
+
this.store.update(this.serverUrl, (c) => ({ ...c, clientInformation: info, registration }));
|
|
100
|
+
}
|
|
101
|
+
tokens() {
|
|
102
|
+
return this.store.get(this.serverUrl).tokens;
|
|
103
|
+
}
|
|
104
|
+
saveTokens(tokens) {
|
|
105
|
+
const registration = this.options.clientId
|
|
106
|
+
? "preregistered"
|
|
107
|
+
: this.store.get(this.serverUrl).registration ?? (this.clientMetadataUrl ? "cimd" : undefined);
|
|
108
|
+
this.store.update(this.serverUrl, (c) => ({ ...c, tokens, tokensSavedAt: Date.now(), registration }));
|
|
109
|
+
}
|
|
110
|
+
async redirectToAuthorization(url) {
|
|
111
|
+
if (!this.options.onRedirect)
|
|
112
|
+
throw this.notLoggedIn();
|
|
113
|
+
await this.options.onRedirect(url);
|
|
114
|
+
}
|
|
115
|
+
saveCodeVerifier(codeVerifier) {
|
|
116
|
+
this.store.update(this.serverUrl, (c) => ({ ...c, codeVerifier }));
|
|
117
|
+
}
|
|
118
|
+
codeVerifier() {
|
|
119
|
+
const verifier = this.store.get(this.serverUrl).codeVerifier;
|
|
120
|
+
if (!verifier)
|
|
121
|
+
throw new Error("No PKCE code verifier saved; restart the login.");
|
|
122
|
+
return verifier;
|
|
123
|
+
}
|
|
124
|
+
saveDiscoveryState(state) {
|
|
125
|
+
this.store.update(this.serverUrl, (c) => ({ ...c, discoveryState: state }));
|
|
126
|
+
}
|
|
127
|
+
discoveryState() {
|
|
128
|
+
return this.store.get(this.serverUrl).discoveryState;
|
|
129
|
+
}
|
|
130
|
+
invalidateCredentials(scope) {
|
|
131
|
+
this.store.update(this.serverUrl, (c) => {
|
|
132
|
+
if (scope === "all")
|
|
133
|
+
return undefined;
|
|
134
|
+
const next = { ...c };
|
|
135
|
+
if (scope === "client")
|
|
136
|
+
delete next.clientInformation;
|
|
137
|
+
if (scope === "tokens")
|
|
138
|
+
delete next.tokens;
|
|
139
|
+
if (scope === "verifier")
|
|
140
|
+
delete next.codeVerifier;
|
|
141
|
+
if (scope === "discovery")
|
|
142
|
+
delete next.discoveryState;
|
|
143
|
+
return next;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Runs the full browser login and records each step. Throws only on programmer errors. */
|
|
148
|
+
export async function oauthLogin(options) {
|
|
149
|
+
const store = options.store ?? new CredentialStore();
|
|
150
|
+
const steps = [];
|
|
151
|
+
const record = (step, ok, detail) => {
|
|
152
|
+
steps.push({ step, ok, detail });
|
|
153
|
+
options.log(`${ok ? "✔" : "✖"} ${step}: ${detail}`);
|
|
154
|
+
return ok;
|
|
155
|
+
};
|
|
156
|
+
// Start fresh: a DCR client registered earlier is tied to an old redirect port.
|
|
157
|
+
store.update(options.url, () => undefined);
|
|
158
|
+
const callback = await startCallbackServer(options.callbackPort);
|
|
159
|
+
const redirectUrl = `http://127.0.0.1:${callback.port}/callback`;
|
|
160
|
+
let authorizationUrl;
|
|
161
|
+
const provider = new StoredOAuthProvider(options.url, store, {
|
|
162
|
+
redirectUrl,
|
|
163
|
+
clientId: options.clientId,
|
|
164
|
+
clientSecret: options.clientSecret,
|
|
165
|
+
clientMetadataUrl: options.clientMetadataUrl,
|
|
166
|
+
scope: options.scope,
|
|
167
|
+
onRedirect: (url) => {
|
|
168
|
+
authorizationUrl = url;
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
try {
|
|
172
|
+
let first;
|
|
173
|
+
try {
|
|
174
|
+
first = await auth(provider, { serverUrl: options.url, scope: options.scope });
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
record("Discovery and client registration", false, err.message);
|
|
178
|
+
return steps;
|
|
179
|
+
}
|
|
180
|
+
const discovery = provider.discoveryState();
|
|
181
|
+
record("Discovery", true, `authorization server ${discovery?.authorizationServerUrl ?? "(unknown)"}${discovery?.resourceMetadata ? ", protected resource metadata found" : ", no protected resource metadata (fell back to the server origin)"}`);
|
|
182
|
+
const registration = options.clientId ? "preregistered" : store.get(options.url).registration ?? (options.clientMetadataUrl ? "cimd" : "dcr");
|
|
183
|
+
record("Client registration", true, { preregistered: "pre-registered client id", cimd: "Client ID Metadata Document", dcr: "Dynamic Client Registration" }[registration]);
|
|
184
|
+
if (first === "AUTHORIZED") {
|
|
185
|
+
record("Authorization", true, "already authorized");
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const url = authorizationUrl;
|
|
189
|
+
const pkce = url.searchParams.get("code_challenge_method");
|
|
190
|
+
const resource = url.searchParams.get("resource");
|
|
191
|
+
record("Authorization request", pkce === "S256", `PKCE ${pkce ?? "missing"}, resource=${resource ?? "(none)"}`);
|
|
192
|
+
options.log(`\nOpen this URL to log in${options.openBrowser ? " (opening your browser)" : ""}:\n ${url.href}\n`);
|
|
193
|
+
if (options.openBrowser)
|
|
194
|
+
(options.browser ?? openInBrowser)(url.href);
|
|
195
|
+
const result = await callback.waitForCode(options.timeoutMs);
|
|
196
|
+
if ("error" in result) {
|
|
197
|
+
record("Authorization", false, result.error);
|
|
198
|
+
return steps;
|
|
199
|
+
}
|
|
200
|
+
if (result.state !== provider.state()) {
|
|
201
|
+
record("Authorization", false, "state parameter mismatch (possible CSRF); aborting");
|
|
202
|
+
return steps;
|
|
203
|
+
}
|
|
204
|
+
if (result.iss && discovery?.authorizationServerMetadata?.issuer && result.iss !== discovery.authorizationServerMetadata.issuer) {
|
|
205
|
+
record("Authorization", false, `iss ${result.iss} doesn't match the issuer ${discovery.authorizationServerMetadata.issuer} (RFC 9207)`);
|
|
206
|
+
return steps;
|
|
207
|
+
}
|
|
208
|
+
record("Authorization", true, `code received${result.iss ? ", iss matches issuer" : ""}`);
|
|
209
|
+
try {
|
|
210
|
+
await auth(provider, { serverUrl: options.url, authorizationCode: result.code, scope: options.scope });
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
record("Token exchange", false, err.message);
|
|
214
|
+
return steps;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const tokens = provider.tokens();
|
|
218
|
+
record("Token exchange", !!tokens?.access_token, tokens
|
|
219
|
+
? `${tokens.token_type} token${tokens.expires_in ? `, expires in ${tokens.expires_in}s` : ""}${tokens.refresh_token ? ", refresh token issued" : ", no refresh token"}${tokens.scope ? `, scope "${tokens.scope}"` : ""}`
|
|
220
|
+
: "no tokens");
|
|
221
|
+
if (!tokens?.access_token)
|
|
222
|
+
return steps;
|
|
223
|
+
try {
|
|
224
|
+
record("Authenticated MCP request", true, await options.verify(provider));
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
record("Authenticated MCP request", false, `${err.message} (token issued but rejected: check audience/resource and scopes)`);
|
|
228
|
+
}
|
|
229
|
+
return steps;
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
callback.close();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async function startCallbackServer(port) {
|
|
236
|
+
let resolveResult;
|
|
237
|
+
const result = new Promise((r) => (resolveResult = r));
|
|
238
|
+
const server = createServer((req, res) => {
|
|
239
|
+
const url = new URL(req.url ?? "/", "http://127.0.0.1");
|
|
240
|
+
if (url.pathname !== "/callback") {
|
|
241
|
+
res.writeHead(404).end();
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const error = url.searchParams.get("error");
|
|
245
|
+
const code = url.searchParams.get("code");
|
|
246
|
+
res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
|
|
247
|
+
res.end(`<!doctype html><title>${TOOL_NAME}</title><p>${error ? "Login failed. You can close this tab." : "Logged in. You can close this tab and return to the terminal."}</p>`);
|
|
248
|
+
if (error)
|
|
249
|
+
resolveResult({ error: `${error}${url.searchParams.get("error_description") ? `: ${url.searchParams.get("error_description")}` : ""}` });
|
|
250
|
+
else if (code)
|
|
251
|
+
resolveResult({ code, state: url.searchParams.get("state") ?? undefined, iss: url.searchParams.get("iss") ?? undefined });
|
|
252
|
+
else
|
|
253
|
+
resolveResult({ error: "callback without code or error" });
|
|
254
|
+
});
|
|
255
|
+
await new Promise((resolve, reject) => {
|
|
256
|
+
server.once("error", reject);
|
|
257
|
+
server.listen(port, "127.0.0.1", () => resolve());
|
|
258
|
+
});
|
|
259
|
+
const address = server.address();
|
|
260
|
+
return {
|
|
261
|
+
port: typeof address === "object" && address ? address.port : port,
|
|
262
|
+
waitForCode: (timeoutMs) => Promise.race([result, new Promise((r) => setTimeout(() => r({ error: `no callback within ${Math.round(timeoutMs / 1000)}s` }), timeoutMs).unref())]),
|
|
263
|
+
close: () => server.close(),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function openInBrowser(url) {
|
|
267
|
+
const [cmd, args] = process.platform === "darwin" ? ["open", [url]] : process.platform === "win32" ? ["cmd", ["/c", "start", "", url]] : ["xdg-open", [url]];
|
|
268
|
+
try {
|
|
269
|
+
spawn(cmd, args, { stdio: "ignore", detached: true }).on("error", () => { }).unref();
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// The URL is printed too.
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/** Human summary of stored credentials, without secrets. */
|
|
276
|
+
export function describeCredentials(url, c) {
|
|
277
|
+
const expires = c.tokens?.expires_in && c.tokensSavedAt ? new Date(c.tokensSavedAt + c.tokens.expires_in * 1000) : undefined;
|
|
278
|
+
const state = !c.tokens
|
|
279
|
+
? "no tokens"
|
|
280
|
+
: expires
|
|
281
|
+
? expires.getTime() > Date.now()
|
|
282
|
+
? `valid until ${expires.toISOString()}`
|
|
283
|
+
: `expired ${expires.toISOString()}${c.tokens.refresh_token ? " (will refresh)" : ""}`
|
|
284
|
+
: "no expiry given";
|
|
285
|
+
return `${url}\n ${c.registration ?? "unknown"} client ${c.clientInformation?.client_id ?? "-"} · ${state}`;
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAsD,MAAM,0CAA0C,CAAC;AAMpH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAalD,yFAAyF;AACzF,MAAM,OAAO,eAAe;IACL;IAArB,YAAqB,OAAe,gBAAgB,EAAE;QAAjC,SAAI,GAAJ,IAAI,CAA6B;IAAG,CAAC;IAE1D,GAAG;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAsC,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,MAAqE;QACvF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,IAAI;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;;YACtB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAC7C,CAAC;AAaD,8DAA8D;AAC9D,MAAM,OAAO,mBAAmB;IAKX;IACA;IACA;IANV,iBAAiB,CAAU;IACnB,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9D,YACmB,SAAiB,EACjB,KAAsB,EACtB,UAA2B,EAAE;QAF7B,cAAS,GAAT,SAAS,CAAQ;QACjB,UAAK,GAAL,KAAK,CAAiB;QACtB,YAAO,GAAP,OAAO,CAAsB;QAE9C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;IAC9G,CAAC;IAED,IAAI,cAAc;QAChB,OAAO;YACL,WAAW,EAAE,SAAS;YACtB,WAAW,EAAE,SAAS;YACtB,gBAAgB,EAAE,OAAO;YACzB,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;YACzE,WAAW,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;YACpD,cAAc,EAAE,CAAC,MAAM,CAAC;YACxB,0BAA0B,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM;YACrF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,gGAAgG;YAChG,GAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAa;SAC9C,CAAC;IACJ,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAClI,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC;QAC9D,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,WAAW;QACjB,OAAO,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,SAAS,8CAA8C,SAAS,sBAAsB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACpJ,CAAC;IAED,qBAAqB,CAAC,IAAiC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAChF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/C,CAAC;IAED,UAAU,CAAC,MAAmB;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;YACxC,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACjG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,GAAQ;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACvD,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,gBAAgB,CAAC,YAAoB;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,YAAY;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC;QAC7D,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAClF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kBAAkB,CAAC,KAA0B;QAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC;IACvD,CAAC;IAED,qBAAqB,CAAC,KAA6D;QACjF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YACtC,IAAI,KAAK,KAAK,KAAK;gBAAE,OAAO,SAAS,CAAC;YACtC,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC;YACtD,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC;YAC3C,IAAI,KAAK,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC,YAAY,CAAC;YACnD,IAAI,KAAK,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC,cAAc,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAyBD,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAqB;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,eAAe,EAAE,CAAC;IACrD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAW,EAAE,MAAc,EAAE,EAAE;QAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,gFAAgF;IAChF,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,oBAAoB,QAAQ,CAAC,IAAI,WAAW,CAAC;IACjE,IAAI,gBAAiC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE;QAC3D,WAAW;QACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;YAClB,gBAAgB,GAAG,GAAG,CAAC;QACzB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,mCAAmC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YAC3E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,CACJ,WAAW,EACX,IAAI,EACJ,wBAAwB,SAAS,EAAE,sBAAsB,IAAI,WAAW,GAAG,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,mEAAmE,EAAE,CACvN,CAAC;QACF,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9I,MAAM,CAAC,qBAAqB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,0BAA0B,EAAE,IAAI,EAAE,6BAA6B,EAAE,GAAG,EAAE,6BAA6B,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;QAE1K,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC3B,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,gBAAiB,CAAC;YAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,CAAC,uBAAuB,EAAE,IAAI,KAAK,MAAM,EAAE,QAAQ,IAAI,IAAI,SAAS,cAAc,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;YAChH,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;YAClH,IAAI,OAAO,CAAC,WAAW;gBAAE,CAAC,OAAO,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,oDAAoD,CAAC,CAAC;gBACrF,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS,EAAE,2BAA2B,EAAE,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,2BAA2B,CAAC,MAAM,EAAE,CAAC;gBAChI,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,MAAM,CAAC,GAAG,6BAA6B,SAAS,CAAC,2BAA2B,CAAC,MAAM,aAAa,CAAC,CAAC;gBACxI,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,gBAAgB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAE1F,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACzG,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,gBAAgB,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;gBACxD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CACJ,gBAAgB,EAChB,CAAC,CAAC,MAAM,EAAE,YAAY,EACtB,MAAM;YACJ,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,SAAS,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACzN,CAAC,CAAC,WAAW,CAChB,CAAC;QACF,IAAI,CAAC,MAAM,EAAE,YAAY;YAAE,OAAO,KAAK,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,CAAC,2BAA2B,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,2BAA2B,EAAE,KAAK,EAAE,GAAI,GAAa,CAAC,OAAO,kEAAkE,CAAC,CAAC;QAC1I,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAID,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAK7C,IAAI,aAA2C,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAW,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,GAAG,CACL,yBAAyB,SAAS,cAAc,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,+DAA+D,MAAM,CACxK,CAAC;QACF,IAAI,KAAK;YAAE,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;aAC/I,IAAI,IAAI;YAAE,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;;YACpI,aAAa,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAClE,WAAW,EAAE,CAAC,SAAS,EAAE,EAAE,CACzB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,OAAO,CAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtK,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GACf,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3I,IAAI,CAAC;QACH,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,CAAoB;IACnE,MAAM,OAAO,GACX,CAAC,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/G,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM;QACrB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,OAAO;YACP,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;gBAC9B,CAAC,CAAC,eAAe,OAAO,CAAC,WAAW,EAAE,EAAE;gBACxC,CAAC,CAAC,WAAW,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE;YACxF,CAAC,CAAC,iBAAiB,CAAC;IACxB,OAAO,GAAG,GAAG,OAAO,CAAC,CAAC,YAAY,IAAI,SAAS,WAAW,CAAC,CAAC,iBAAiB,EAAE,SAAS,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC;AAC/G,CAAC"}
|
package/dist/policy.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { CheckArea } from "./checks/types.js";
|
|
2
|
+
import type { Report } from "./evaluate.js";
|
|
3
|
+
export declare const EXIT: {
|
|
4
|
+
readonly ok: 0;
|
|
5
|
+
readonly failed: 1;
|
|
6
|
+
readonly usage: 2;
|
|
7
|
+
readonly connectFailed: 3;
|
|
8
|
+
};
|
|
9
|
+
export declare class PolicyError extends Error {
|
|
10
|
+
}
|
|
11
|
+
type Policy = {
|
|
12
|
+
kind: "none";
|
|
13
|
+
} | {
|
|
14
|
+
kind: "severity";
|
|
15
|
+
includeWarn: boolean;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "match";
|
|
18
|
+
patterns: RegExp[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* --fail-on: "error" (default), "warn", "none", or a comma list of check ids,
|
|
22
|
+
* id globs (TOOL_*) and areas (auth). A list fails on matching errors only.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parsePolicy(spec: string, knownIds: string[], knownAreas: CheckArea[]): Policy;
|
|
25
|
+
/** Findings that make the run fail, as "CLIENT CHECK_ID" strings (for the log). */
|
|
26
|
+
export declare function failures(report: Report, policy: Policy): string[];
|
|
27
|
+
export declare function exitCode(report: Report, policy: Policy, snapshotConnectFailed: boolean): number;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,IAAI;;;;;CAA4D,CAAC;AAE9E,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC,KAAK,MAAM,GACP;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAkB7F;AAED,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BjE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,GAAG,MAAM,CAG/F"}
|
package/dist/policy.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const EXIT = { ok: 0, failed: 1, usage: 2, connectFailed: 3 };
|
|
2
|
+
export class PolicyError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* --fail-on: "error" (default), "warn", "none", or a comma list of check ids,
|
|
6
|
+
* id globs (TOOL_*) and areas (auth). A list fails on matching errors only.
|
|
7
|
+
*/
|
|
8
|
+
export function parsePolicy(spec, knownIds, knownAreas) {
|
|
9
|
+
const value = spec.trim().toLowerCase();
|
|
10
|
+
if (value === "none")
|
|
11
|
+
return { kind: "none" };
|
|
12
|
+
if (value === "error" || value === "")
|
|
13
|
+
return { kind: "severity", includeWarn: false };
|
|
14
|
+
if (value === "warn")
|
|
15
|
+
return { kind: "severity", includeWarn: true };
|
|
16
|
+
const patterns = spec.split(",").map((raw) => {
|
|
17
|
+
const token = raw.trim();
|
|
18
|
+
if (knownAreas.includes(token.toLowerCase())) {
|
|
19
|
+
return new RegExp(`^area:${token.toLowerCase()}$`);
|
|
20
|
+
}
|
|
21
|
+
const re = new RegExp(`^${token.toUpperCase().replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*")}$`);
|
|
22
|
+
if (!knownIds.some((id) => re.test(id))) {
|
|
23
|
+
throw new PolicyError(`--fail-on: "${token}" matches no check id or area. See --list-checks.`);
|
|
24
|
+
}
|
|
25
|
+
return re;
|
|
26
|
+
});
|
|
27
|
+
return { kind: "match", patterns };
|
|
28
|
+
}
|
|
29
|
+
/** Findings that make the run fail, as "CLIENT CHECK_ID" strings (for the log). */
|
|
30
|
+
export function failures(report, policy) {
|
|
31
|
+
if (policy.kind === "none")
|
|
32
|
+
return [];
|
|
33
|
+
const failing = new Set();
|
|
34
|
+
const matches = (checkId, area) => policy.kind === "match" && policy.patterns.some((re) => re.test(checkId) || re.test(`area:${area}`));
|
|
35
|
+
const consider = (label, checkId, area, status) => {
|
|
36
|
+
const bad = policy.kind === "severity"
|
|
37
|
+
? status === "fail" || (policy.includeWarn && status === "warn")
|
|
38
|
+
: status === "fail" && matches(checkId, area);
|
|
39
|
+
if (bad)
|
|
40
|
+
failing.add(`${label} ${checkId}`);
|
|
41
|
+
};
|
|
42
|
+
if (report.clients.length > 0) {
|
|
43
|
+
for (const client of report.clients) {
|
|
44
|
+
for (const row of client.rows)
|
|
45
|
+
consider(client.client, row.checkId, row.area, row.status);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// No client profiles selected: judge client-independent findings by severity.
|
|
50
|
+
const areaOf = new Map(report.checks.map((c) => [c.id, c.area]));
|
|
51
|
+
for (const f of report.findings.filter((f) => !f.client)) {
|
|
52
|
+
const status = f.severity === "error" ? "fail" : f.severity;
|
|
53
|
+
consider("server", f.checkId, areaOf.get(f.checkId) ?? "", status);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return [...failing];
|
|
57
|
+
}
|
|
58
|
+
export function exitCode(report, policy, snapshotConnectFailed) {
|
|
59
|
+
if (policy.kind !== "none" && snapshotConnectFailed)
|
|
60
|
+
return EXIT.connectFailed;
|
|
61
|
+
return failures(report, policy).length > 0 ? EXIT.failed : EXIT.ok;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatgpt.d.ts","sourceRoot":"","sources":["../../src/profiles/chatgpt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhD,eAAO,MAAM,OAAO,EAAE,aAuBrB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const REFERENCE = "https://developers.openai.com/apps-sdk/reference";
|
|
2
|
+
const CONNECT = "https://developers.openai.com/apps-sdk/deploy/connect-chatgpt";
|
|
3
|
+
const AUTH = "https://developers.openai.com/apps-sdk/build/auth";
|
|
4
|
+
const verifiedOn = "2026-09-26";
|
|
5
|
+
export const chatgpt = {
|
|
6
|
+
id: "chatgpt",
|
|
7
|
+
aliases: ["openai", "chatgpt-apps"],
|
|
8
|
+
displayName: "ChatGPT (Apps SDK / connectors)",
|
|
9
|
+
supports: {
|
|
10
|
+
streamableHttp: { value: true, source: CONNECT, verifiedOn },
|
|
11
|
+
stdio: { value: "partial", source: CONNECT, verifiedOn, note: "Only through a Secure MCP Tunnel in developer mode." },
|
|
12
|
+
toolsListChanged: {
|
|
13
|
+
value: false,
|
|
14
|
+
source: CONNECT,
|
|
15
|
+
verifiedOn,
|
|
16
|
+
note: "Inferred: after tool changes the docs require pressing Refresh on the connection and starting a new conversation.",
|
|
17
|
+
},
|
|
18
|
+
elicitation: { value: true, source: "https://developers.openai.com/apps-sdk/build/mcp-server", verifiedOn },
|
|
19
|
+
oauth: { value: true, source: AUTH, verifiedOn, note: "Requires code_challenge_methods_supported with S256." },
|
|
20
|
+
dcr: { value: true, source: AUTH, verifiedOn },
|
|
21
|
+
cimd: { value: true, source: AUTH, verifiedOn, note: "Preferred when available." },
|
|
22
|
+
uiResources: { value: true, source: REFERENCE, verifiedOn },
|
|
23
|
+
structuredContent: { value: true, source: REFERENCE, verifiedOn },
|
|
24
|
+
},
|
|
25
|
+
limits: {
|
|
26
|
+
structuredContent: { value: "alongsideText", source: REFERENCE, verifiedOn },
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=chatgpt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatgpt.js","sourceRoot":"","sources":["../../src/profiles/chatgpt.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,kDAAkD,CAAC;AACrE,MAAM,OAAO,GAAG,+DAA+D,CAAC;AAChF,MAAM,IAAI,GAAG,mDAAmD,CAAC;AACjE,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,MAAM,CAAC,MAAM,OAAO,GAAkB;IACpC,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;IACnC,WAAW,EAAE,iCAAiC;IAC9C,QAAQ,EAAE;QACR,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;QAC5D,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,qDAAqD,EAAE;QACrH,gBAAgB,EAAE;YAChB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,OAAO;YACf,UAAU;YACV,IAAI,EAAE,mHAAmH;SAC1H;QACD,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,yDAAyD,EAAE,UAAU,EAAE;QAC3G,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,sDAAsD,EAAE;QAC9G,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAC9C,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,2BAA2B,EAAE;QAClF,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE;QAC3D,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE;KAClE;IACD,MAAM,EAAE;QACN,iBAAiB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE;KAC7E;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/profiles/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,eAAO,MAAM,UAAU,EAAE,aA0DxB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const DOCS = "https://code.claude.com/docs/en/mcp";
|
|
2
|
+
const verifiedOn = "2026-09-26";
|
|
3
|
+
export const claudeCode = {
|
|
4
|
+
id: "claude-code",
|
|
5
|
+
aliases: [],
|
|
6
|
+
displayName: "Claude Code",
|
|
7
|
+
versionTested: "docs up to v2.1.283",
|
|
8
|
+
supports: {
|
|
9
|
+
stdio: { value: true, source: DOCS, verifiedOn },
|
|
10
|
+
streamableHttp: { value: true, source: DOCS, verifiedOn },
|
|
11
|
+
sse: { value: true, source: DOCS, verifiedOn, note: "Deprecated." },
|
|
12
|
+
toolsListChanged: { value: true, source: DOCS, verifiedOn },
|
|
13
|
+
resourcesListChanged: { value: true, source: DOCS, verifiedOn },
|
|
14
|
+
promptsListChanged: { value: true, source: DOCS, verifiedOn },
|
|
15
|
+
resources: { value: true, source: DOCS, verifiedOn },
|
|
16
|
+
prompts: { value: true, source: DOCS, verifiedOn },
|
|
17
|
+
elicitation: { value: true, source: DOCS, verifiedOn },
|
|
18
|
+
oauth: { value: true, source: DOCS, verifiedOn },
|
|
19
|
+
dcr: { value: true, source: DOCS, verifiedOn },
|
|
20
|
+
cimd: { value: true, source: DOCS, verifiedOn },
|
|
21
|
+
uiResources: {
|
|
22
|
+
value: false,
|
|
23
|
+
source: DOCS,
|
|
24
|
+
verifiedOn,
|
|
25
|
+
note: "UI resources are hidden from @-mentions and the resource list; no rendering is documented.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
limits: {
|
|
29
|
+
toolNamePrefix: { value: { format: "mcp__{server}__" }, source: "https://code.claude.com/docs/en/permissions", verifiedOn },
|
|
30
|
+
toolNameChars: {
|
|
31
|
+
value: { allowed: "A-Za-z0-9_-", onInvalid: "unknown" },
|
|
32
|
+
source: "https://platform.claude.com/docs/en/agents-and-tools/tool-use/implement-tool-use",
|
|
33
|
+
verifiedOn,
|
|
34
|
+
note: "Claude API tool-name rule; how Claude Code maps other characters is not documented.",
|
|
35
|
+
},
|
|
36
|
+
maxToolNameLength: {
|
|
37
|
+
value: { max: 128, onExceed: "unknown" },
|
|
38
|
+
source: "https://platform.claude.com/docs/en/agents-and-tools/tool-use/implement-tool-use",
|
|
39
|
+
verifiedOn,
|
|
40
|
+
note: "Claude API limit, applied to the prefixed name; handling of longer names is not documented.",
|
|
41
|
+
},
|
|
42
|
+
maxDescriptionLength: {
|
|
43
|
+
value: 2048,
|
|
44
|
+
source: DOCS,
|
|
45
|
+
verifiedOn,
|
|
46
|
+
note: "Tool descriptions and server instructions (CLAUDE_CODE_MAX_MCP_DESCRIPTION_LENGTH, v2.1.280+).",
|
|
47
|
+
},
|
|
48
|
+
inputPropertyNamePattern: {
|
|
49
|
+
value: "^[A-Za-z0-9_.-]{1,64}$",
|
|
50
|
+
source: DOCS,
|
|
51
|
+
verifiedOn,
|
|
52
|
+
note: "Tools with other top-level property names are excluded (flag-gated, v2.1.216+).",
|
|
53
|
+
},
|
|
54
|
+
maxToolResult: {
|
|
55
|
+
value: { max: 25000, unit: "tokens", onExceed: "file" },
|
|
56
|
+
source: "https://code.claude.com/docs/en/mcp#mcp-output-limits-and-warnings",
|
|
57
|
+
verifiedOn: "2026-09-27",
|
|
58
|
+
note: "MAX_MCP_OUTPUT_TOKENS default; larger results are saved to disk and replaced by a file reference.",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/profiles/claude-code.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,qCAAqC,CAAC;AACnD,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAkB;IACvC,EAAE,EAAE,aAAa;IACjB,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,qBAAqB;IACpC,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAChD,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QACzD,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE;QACnE,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAC3D,oBAAoB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAC/D,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAC7D,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QACpD,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAClD,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QACtD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAChD,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAC9C,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAC/C,WAAW,EAAE;YACX,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,IAAI;YACZ,UAAU;YACV,IAAI,EAAE,4FAA4F;SACnG;KACF;IACD,MAAM,EAAE;QACN,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,6CAA6C,EAAE,UAAU,EAAE;QAC3H,aAAa,EAAE;YACb,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE;YACvD,MAAM,EAAE,kFAAkF;YAC1F,UAAU;YACV,IAAI,EAAE,qFAAqF;SAC5F;QACD,iBAAiB,EAAE;YACjB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE;YACxC,MAAM,EAAE,kFAAkF;YAC1F,UAAU;YACV,IAAI,EAAE,6FAA6F;SACpG;QACD,oBAAoB,EAAE;YACpB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,UAAU;YACV,IAAI,EAAE,gGAAgG;SACvG;QACD,wBAAwB,EAAE;YACxB,KAAK,EAAE,wBAAwB;YAC/B,MAAM,EAAE,IAAI;YACZ,UAAU;YACV,IAAI,EAAE,iFAAiF;SACxF;QACD,aAAa,EAAE;YACb,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;YACvD,MAAM,EAAE,oEAAoE;YAC5E,UAAU,EAAE,YAAY;YACxB,IAAI,EAAE,mGAAmG;SAC1G;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/profiles/claude-desktop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,eAAO,MAAM,aAAa,EAAE,aA+C3B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const DOCS = "https://claude.com/docs/connectors/building/index";
|
|
2
|
+
const verifiedOn = "2026-09-26";
|
|
3
|
+
export const claudeDesktop = {
|
|
4
|
+
id: "claude-desktop",
|
|
5
|
+
aliases: ["claude", "claude-ai", "claude.ai"],
|
|
6
|
+
displayName: "Claude Desktop / claude.ai",
|
|
7
|
+
supports: {
|
|
8
|
+
stdio: { value: true, source: "https://claude.com/docs/connectors/building/mcpb", verifiedOn },
|
|
9
|
+
streamableHttp: {
|
|
10
|
+
value: true,
|
|
11
|
+
source: DOCS,
|
|
12
|
+
verifiedOn,
|
|
13
|
+
note: "Remote connectors are reached from Anthropic's cloud, so the server must be publicly reachable.",
|
|
14
|
+
},
|
|
15
|
+
sse: { value: true, source: DOCS, verifiedOn, note: "Legacy HTTP+SSE, being deprecated." },
|
|
16
|
+
resources: { value: true, source: DOCS, verifiedOn },
|
|
17
|
+
prompts: { value: true, source: DOCS, verifiedOn },
|
|
18
|
+
sampling: { value: false, source: DOCS, verifiedOn },
|
|
19
|
+
oauth: { value: true, source: DOCS, verifiedOn },
|
|
20
|
+
dcr: { value: true, source: "https://claude.com/docs/connectors/building/authentication", verifiedOn },
|
|
21
|
+
cimd: {
|
|
22
|
+
value: true,
|
|
23
|
+
source: "https://claude.com/docs/connectors/building/authentication",
|
|
24
|
+
verifiedOn,
|
|
25
|
+
note: "Preferred when AS metadata has client_id_metadata_document_supported and 'none' in token_endpoint_auth_methods_supported.",
|
|
26
|
+
},
|
|
27
|
+
uiResources: { value: true, source: "https://claude.com/docs/connectors/building/mcp-apps/getting-started", verifiedOn },
|
|
28
|
+
},
|
|
29
|
+
limits: {
|
|
30
|
+
toolNameChars: {
|
|
31
|
+
value: { allowed: "A-Za-z0-9_-", onInvalid: "unknown" },
|
|
32
|
+
source: "https://platform.claude.com/docs/en/agents-and-tools/tool-use/implement-tool-use",
|
|
33
|
+
verifiedOn,
|
|
34
|
+
note: "Claude API tool-name rule; how MCP names with other characters are mapped is not documented.",
|
|
35
|
+
},
|
|
36
|
+
maxToolResult: {
|
|
37
|
+
value: { max: 150000, unit: "chars", onExceed: "unknown" },
|
|
38
|
+
source: "https://claude.com/docs/connectors/building/index",
|
|
39
|
+
verifiedOn: "2026-09-27",
|
|
40
|
+
note: "Approximate limit for claude.ai and Desktop; behaviour beyond it isn't documented.",
|
|
41
|
+
},
|
|
42
|
+
toolTimeoutMs: { value: 240000, source: "https://claude.com/docs/connectors/building/index", verifiedOn: "2026-09-27" },
|
|
43
|
+
readOnlySkipsApproval: {
|
|
44
|
+
value: true,
|
|
45
|
+
source: "https://claude.com/docs/connectors/building/review-criteria",
|
|
46
|
+
verifiedOn: "2026-09-27",
|
|
47
|
+
note: "Read-only tools can run without per-call confirmation; destructive tools always prompt.",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=claude-desktop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/profiles/claude-desktop.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,mDAAmD,CAAC;AACjE,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,EAAE,EAAE,gBAAgB;IACpB,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC7C,WAAW,EAAE,4BAA4B;IACzC,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,kDAAkD,EAAE,UAAU,EAAE;QAC9F,cAAc,EAAE;YACd,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,UAAU;YACV,IAAI,EAAE,iGAAiG;SACxG;QACD,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,oCAAoC,EAAE;QAC1F,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QACpD,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAClD,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QACpD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;QAChD,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,4DAA4D,EAAE,UAAU,EAAE;QACtG,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,4DAA4D;YACpE,UAAU;YACV,IAAI,EAAE,2HAA2H;SAClI;QACD,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,sEAAsE,EAAE,UAAU,EAAE;KACzH;IACD,MAAM,EAAE;QACN,aAAa,EAAE;YACb,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE;YACvD,MAAM,EAAE,kFAAkF;YAC1F,UAAU;YACV,IAAI,EAAE,8FAA8F;SACrG;QACD,aAAa,EAAE;YACb,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;YAC1D,MAAM,EAAE,mDAAmD;YAC3D,UAAU,EAAE,YAAY;YACxB,IAAI,EAAE,oFAAoF;SAC3F;QACD,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mDAAmD,EAAE,UAAU,EAAE,YAAY,EAAE;QACvH,qBAAqB,EAAE;YACrB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,6DAA6D;YACrE,UAAU,EAAE,YAAY;YACxB,IAAI,EAAE,yFAAyF;SAChG;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../src/profiles/cline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,kFAAkF;AAClF,eAAO,MAAM,KAAK,EAAE,aAmHnB,CAAC"}
|