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.
Files changed (225) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +21 -0
  3. package/README.md +375 -0
  4. package/dist/checks/auth.d.ts +2 -0
  5. package/dist/checks/auth.d.ts.map +1 -0
  6. package/dist/checks/auth.js +229 -0
  7. package/dist/checks/auth.js.map +1 -0
  8. package/dist/checks/calls.d.ts +4 -0
  9. package/dist/checks/calls.d.ts.map +1 -0
  10. package/dist/checks/calls.js +192 -0
  11. package/dist/checks/calls.js.map +1 -0
  12. package/dist/checks/discovery.d.ts +3 -0
  13. package/dist/checks/discovery.d.ts.map +1 -0
  14. package/dist/checks/discovery.js +47 -0
  15. package/dist/checks/discovery.js.map +1 -0
  16. package/dist/checks/explanations.d.ts +15 -0
  17. package/dist/checks/explanations.d.ts.map +1 -0
  18. package/dist/checks/explanations.js +346 -0
  19. package/dist/checks/explanations.js.map +1 -0
  20. package/dist/checks/index.d.ts +3 -0
  21. package/dist/checks/index.d.ts.map +1 -0
  22. package/dist/checks/index.js +23 -0
  23. package/dist/checks/index.js.map +1 -0
  24. package/dist/checks/protocol.d.ts +5 -0
  25. package/dist/checks/protocol.d.ts.map +1 -0
  26. package/dist/checks/protocol.js +380 -0
  27. package/dist/checks/protocol.js.map +1 -0
  28. package/dist/checks/resources.d.ts +10 -0
  29. package/dist/checks/resources.d.ts.map +1 -0
  30. package/dist/checks/resources.js +144 -0
  31. package/dist/checks/resources.js.map +1 -0
  32. package/dist/checks/schema.d.ts +21 -0
  33. package/dist/checks/schema.d.ts.map +1 -0
  34. package/dist/checks/schema.js +412 -0
  35. package/dist/checks/schema.js.map +1 -0
  36. package/dist/checks/sdk.d.ts +10 -0
  37. package/dist/checks/sdk.d.ts.map +1 -0
  38. package/dist/checks/sdk.js +68 -0
  39. package/dist/checks/sdk.js.map +1 -0
  40. package/dist/checks/tools.d.ts +18 -0
  41. package/dist/checks/tools.d.ts.map +1 -0
  42. package/dist/checks/tools.js +422 -0
  43. package/dist/checks/tools.js.map +1 -0
  44. package/dist/checks/transport.d.ts +2 -0
  45. package/dist/checks/transport.d.ts.map +1 -0
  46. package/dist/checks/transport.js +123 -0
  47. package/dist/checks/transport.js.map +1 -0
  48. package/dist/checks/types.d.ts +37 -0
  49. package/dist/checks/types.d.ts.map +1 -0
  50. package/dist/checks/types.js +5 -0
  51. package/dist/checks/types.js.map +1 -0
  52. package/dist/checks/ui.d.ts +2 -0
  53. package/dist/checks/ui.d.ts.map +1 -0
  54. package/dist/checks/ui.js +207 -0
  55. package/dist/checks/ui.js.map +1 -0
  56. package/dist/checks/util.d.ts +20 -0
  57. package/dist/checks/util.d.ts.map +1 -0
  58. package/dist/checks/util.js +42 -0
  59. package/dist/checks/util.js.map +1 -0
  60. package/dist/cli.d.ts +110 -0
  61. package/dist/cli.d.ts.map +1 -0
  62. package/dist/cli.js +317 -0
  63. package/dist/cli.js.map +1 -0
  64. package/dist/connect/calls.d.ts +13 -0
  65. package/dist/connect/calls.d.ts.map +1 -0
  66. package/dist/connect/calls.js +130 -0
  67. package/dist/connect/calls.js.map +1 -0
  68. package/dist/connect/http.d.ts +14 -0
  69. package/dist/connect/http.d.ts.map +1 -0
  70. package/dist/connect/http.js +122 -0
  71. package/dist/connect/http.js.map +1 -0
  72. package/dist/connect/index.d.ts +41 -0
  73. package/dist/connect/index.d.ts.map +1 -0
  74. package/dist/connect/index.js +168 -0
  75. package/dist/connect/index.js.map +1 -0
  76. package/dist/connect/lists.d.ts +12 -0
  77. package/dist/connect/lists.d.ts.map +1 -0
  78. package/dist/connect/lists.js +70 -0
  79. package/dist/connect/lists.js.map +1 -0
  80. package/dist/connect/modern.d.ts +13 -0
  81. package/dist/connect/modern.d.ts.map +1 -0
  82. package/dist/connect/modern.js +169 -0
  83. package/dist/connect/modern.js.map +1 -0
  84. package/dist/connect/session.d.ts +29 -0
  85. package/dist/connect/session.d.ts.map +1 -0
  86. package/dist/connect/session.js +96 -0
  87. package/dist/connect/session.js.map +1 -0
  88. package/dist/connect/stdio.d.ts +36 -0
  89. package/dist/connect/stdio.d.ts.map +1 -0
  90. package/dist/connect/stdio.js +127 -0
  91. package/dist/connect/stdio.js.map +1 -0
  92. package/dist/diff.d.ts +23 -0
  93. package/dist/diff.d.ts.map +1 -0
  94. package/dist/diff.js +255 -0
  95. package/dist/diff.js.map +1 -0
  96. package/dist/evaluate.d.ts +70 -0
  97. package/dist/evaluate.d.ts.map +1 -0
  98. package/dist/evaluate.js +104 -0
  99. package/dist/evaluate.js.map +1 -0
  100. package/dist/explain.d.ts +4 -0
  101. package/dist/explain.d.ts.map +1 -0
  102. package/dist/explain.js +46 -0
  103. package/dist/explain.js.map +1 -0
  104. package/dist/fix.d.ts +19 -0
  105. package/dist/fix.d.ts.map +1 -0
  106. package/dist/fix.js +116 -0
  107. package/dist/fix.js.map +1 -0
  108. package/dist/index.d.ts +3 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +54 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/oauth.d.ts +85 -0
  113. package/dist/oauth.d.ts.map +1 -0
  114. package/dist/oauth.js +287 -0
  115. package/dist/oauth.js.map +1 -0
  116. package/dist/policy.d.ts +29 -0
  117. package/dist/policy.d.ts.map +1 -0
  118. package/dist/policy.js +63 -0
  119. package/dist/policy.js.map +1 -0
  120. package/dist/profiles/chatgpt.d.ts +3 -0
  121. package/dist/profiles/chatgpt.d.ts.map +1 -0
  122. package/dist/profiles/chatgpt.js +29 -0
  123. package/dist/profiles/chatgpt.js.map +1 -0
  124. package/dist/profiles/claude-code.d.ts +3 -0
  125. package/dist/profiles/claude-code.d.ts.map +1 -0
  126. package/dist/profiles/claude-code.js +62 -0
  127. package/dist/profiles/claude-code.js.map +1 -0
  128. package/dist/profiles/claude-desktop.d.ts +3 -0
  129. package/dist/profiles/claude-desktop.d.ts.map +1 -0
  130. package/dist/profiles/claude-desktop.js +51 -0
  131. package/dist/profiles/claude-desktop.js.map +1 -0
  132. package/dist/profiles/cline.d.ts +4 -0
  133. package/dist/profiles/cline.d.ts.map +1 -0
  134. package/dist/profiles/cline.js +118 -0
  135. package/dist/profiles/cline.js.map +1 -0
  136. package/dist/profiles/codex.d.ts +4 -0
  137. package/dist/profiles/codex.d.ts.map +1 -0
  138. package/dist/profiles/codex.js +168 -0
  139. package/dist/profiles/codex.js.map +1 -0
  140. package/dist/profiles/continue.d.ts +4 -0
  141. package/dist/profiles/continue.d.ts.map +1 -0
  142. package/dist/profiles/continue.js +93 -0
  143. package/dist/profiles/continue.js.map +1 -0
  144. package/dist/profiles/cursor.d.ts +3 -0
  145. package/dist/profiles/cursor.d.ts.map +1 -0
  146. package/dist/profiles/cursor.js +52 -0
  147. package/dist/profiles/cursor.js.map +1 -0
  148. package/dist/profiles/gemini-cli.d.ts +4 -0
  149. package/dist/profiles/gemini-cli.d.ts.map +1 -0
  150. package/dist/profiles/gemini-cli.js +137 -0
  151. package/dist/profiles/gemini-cli.js.map +1 -0
  152. package/dist/profiles/goose.d.ts +4 -0
  153. package/dist/profiles/goose.d.ts.map +1 -0
  154. package/dist/profiles/goose.js +114 -0
  155. package/dist/profiles/goose.js.map +1 -0
  156. package/dist/profiles/index.d.ts +7 -0
  157. package/dist/profiles/index.d.ts.map +1 -0
  158. package/dist/profiles/index.js +43 -0
  159. package/dist/profiles/index.js.map +1 -0
  160. package/dist/profiles/opencode.d.ts +3 -0
  161. package/dist/profiles/opencode.d.ts.map +1 -0
  162. package/dist/profiles/opencode.js +47 -0
  163. package/dist/profiles/opencode.js.map +1 -0
  164. package/dist/profiles/types.d.ts +86 -0
  165. package/dist/profiles/types.d.ts.map +1 -0
  166. package/dist/profiles/types.js +2 -0
  167. package/dist/profiles/types.js.map +1 -0
  168. package/dist/profiles/vscode-copilot.d.ts +3 -0
  169. package/dist/profiles/vscode-copilot.d.ts.map +1 -0
  170. package/dist/profiles/vscode-copilot.js +71 -0
  171. package/dist/profiles/vscode-copilot.js.map +1 -0
  172. package/dist/profiles/windsurf.d.ts +4 -0
  173. package/dist/profiles/windsurf.d.ts.map +1 -0
  174. package/dist/profiles/windsurf.js +49 -0
  175. package/dist/profiles/windsurf.js.map +1 -0
  176. package/dist/project.d.ts +52 -0
  177. package/dist/project.d.ts.map +1 -0
  178. package/dist/project.js +291 -0
  179. package/dist/project.js.map +1 -0
  180. package/dist/reporters/escape.d.ts +7 -0
  181. package/dist/reporters/escape.d.ts.map +1 -0
  182. package/dist/reporters/escape.js +15 -0
  183. package/dist/reporters/escape.js.map +1 -0
  184. package/dist/reporters/github.d.ts +7 -0
  185. package/dist/reporters/github.d.ts.map +1 -0
  186. package/dist/reporters/github.js +19 -0
  187. package/dist/reporters/github.js.map +1 -0
  188. package/dist/reporters/index.d.ts +6 -0
  189. package/dist/reporters/index.d.ts.map +1 -0
  190. package/dist/reporters/index.js +10 -0
  191. package/dist/reporters/index.js.map +1 -0
  192. package/dist/reporters/json.d.ts +3 -0
  193. package/dist/reporters/json.d.ts.map +1 -0
  194. package/dist/reporters/json.js +4 -0
  195. package/dist/reporters/json.js.map +1 -0
  196. package/dist/reporters/markdown.d.ts +3 -0
  197. package/dist/reporters/markdown.d.ts.map +1 -0
  198. package/dist/reporters/markdown.js +98 -0
  199. package/dist/reporters/markdown.js.map +1 -0
  200. package/dist/run.d.ts +14 -0
  201. package/dist/run.d.ts.map +1 -0
  202. package/dist/run.js +163 -0
  203. package/dist/run.js.map +1 -0
  204. package/dist/sdk-facts.d.ts +27 -0
  205. package/dist/sdk-facts.d.ts.map +1 -0
  206. package/dist/sdk-facts.js +63 -0
  207. package/dist/sdk-facts.js.map +1 -0
  208. package/dist/snapshot.d.ts +189 -0
  209. package/dist/snapshot.d.ts.map +1 -0
  210. package/dist/snapshot.js +22 -0
  211. package/dist/snapshot.js.map +1 -0
  212. package/dist/ui.d.ts +18 -0
  213. package/dist/ui.d.ts.map +1 -0
  214. package/dist/ui.js +22 -0
  215. package/dist/ui.js.map +1 -0
  216. package/dist/upgrade.d.ts +12 -0
  217. package/dist/upgrade.d.ts.map +1 -0
  218. package/dist/upgrade.js +115 -0
  219. package/dist/upgrade.js.map +1 -0
  220. package/dist/version.d.ts +3 -0
  221. package/dist/version.d.ts.map +1 -0
  222. package/dist/version.js +5 -0
  223. package/dist/version.js.map +1 -0
  224. package/package.json +65 -0
  225. 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":"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"}
@@ -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,3 @@
1
+ import type { ClientProfile } from "./types.js";
2
+ export declare const chatgpt: ClientProfile;
3
+ //# sourceMappingURL=chatgpt.d.ts.map
@@ -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,3 @@
1
+ import type { ClientProfile } from "./types.js";
2
+ export declare const claudeCode: ClientProfile;
3
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -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,3 @@
1
+ import type { ClientProfile } from "./types.js";
2
+ export declare const claudeDesktop: ClientProfile;
3
+ //# sourceMappingURL=claude-desktop.d.ts.map
@@ -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,4 @@
1
+ import type { ClientProfile } from "./types.js";
2
+ /** Generated from research notes (2026-09-27); every fact links to its source. */
3
+ export declare const cline: ClientProfile;
4
+ //# sourceMappingURL=cline.d.ts.map
@@ -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"}