mcp-use 2.0.0-beta.35 → 2.0.0-beta.37

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 (44) hide show
  1. package/dist/bin.js +1 -3
  2. package/dist/chunk-5Z6KY5ON.js +2 -0
  3. package/dist/{chunk-PPQL2WHL.js → chunk-GX6PGIEO.js} +32 -142
  4. package/dist/chunk-JMDHTN6N.js +1 -0
  5. package/dist/chunk-OJF6B5EU.js +1 -0
  6. package/dist/chunk-PSKSL567.js +1 -0
  7. package/dist/chunk-WYBJYZJB.js +1 -0
  8. package/dist/chunk-Y26DNVWA.js +3 -0
  9. package/dist/chunk-ZMU5USAZ.js +1 -0
  10. package/dist/index.js +9 -3100
  11. package/dist/internal/resource-completion.js +1 -6
  12. package/dist/internal/usage.js +1 -0
  13. package/dist/landing-handler-TG6LVQBI.js +1 -0
  14. package/dist/landing.js +1 -6
  15. package/dist/mcp-proxy-NETCUGUD.js +2 -0
  16. package/dist/mcp-proxy.d.ts +6 -0
  17. package/dist/next/index.js +1 -171
  18. package/dist/node-bridge.js +1 -150
  19. package/dist/oauth/auth0.js +1 -60
  20. package/dist/oauth/better-auth.js +1 -75
  21. package/dist/oauth/clerk.js +1 -69
  22. package/dist/oauth/index.js +1 -26
  23. package/dist/oauth/keycloak.js +1 -93
  24. package/dist/oauth/supabase.js +1 -100
  25. package/dist/oauth/workos.js +1 -76
  26. package/dist/openapi/index.js +1 -6
  27. package/dist/public-route-DAQJGS6K.js +1 -0
  28. package/dist/react/components/model-context.d.ts +9 -14
  29. package/dist/react/hooks/use-view-state.d.ts +23 -0
  30. package/dist/react/index.d.ts +1 -0
  31. package/dist/react/index.js +215 -81
  32. package/dist/react/runtime/model-context-store.d.ts +34 -68
  33. package/dist/react/runtime/view-runtime.d.ts +2 -2
  34. package/dist/usage.d.ts +11 -0
  35. package/package.json +6 -5
  36. package/dist/chunk-DFFP6QPR.js +0 -37
  37. package/dist/chunk-HDV7K2TE.js +0 -97
  38. package/dist/chunk-HNNQJLD5.js +0 -383
  39. package/dist/chunk-QCIREWRS.js +0 -64
  40. package/dist/chunk-QKJJ6DWK.js +0 -184
  41. package/dist/chunk-YF5X7FYF.js +0 -517
  42. package/dist/landing-handler-QEH2ATIR.js +0 -36
  43. package/dist/mcp-proxy-JK7IC5CR.js +0 -281
  44. package/dist/public-route-BAMZRI4R.js +0 -8
@@ -1,6 +1 @@
1
- import {
2
- normalizeCompletions
3
- } from "../chunk-DFFP6QPR.js";
4
- export {
5
- normalizeCompletions
6
- };
1
+ import{normalizeCompletions}from"../chunk-OJF6B5EU.js";export{normalizeCompletions};
@@ -0,0 +1 @@
1
+ import{flushUsage,recordUsage}from"../chunk-5Z6KY5ON.js";export{flushUsage,recordUsage};
@@ -0,0 +1 @@
1
+ import{generateLandingPage}from"./chunk-GX6PGIEO.js";import{resolveServerOrigin}from"./chunk-PSKSL567.js";function createLandingPageResponse(request,basePath,config,branding,tools,prompts,resources){let origin=resolveServerOrigin(request),url=new URL(basePath,`${origin}/`).href,html=generateLandingPage({...config,url,...branding.favicon!==void 0&&{iconUrl:new URL("/favicon.ico",`${origin}/`).href,...branding.faviconMimeType!==void 0&&{iconType:branding.faviconMimeType}},tools:Array.from(tools,entry=>entry.definition),prompts:Array.from(prompts,entry=>entry.definition),resources:Array.from(resources,entry=>entry.definition)});return new Response(request.method==="HEAD"?null:html,{status:200,headers:{"cache-control":"no-store","content-type":"text/html; charset=utf-8","x-content-type-options":"nosniff"}})}export{createLandingPageResponse};
package/dist/landing.js CHANGED
@@ -1,6 +1 @@
1
- import {
2
- generateLandingPage
3
- } from "./chunk-PPQL2WHL.js";
4
- export {
5
- generateLandingPage
6
- };
1
+ import{generateLandingPage}from"./chunk-GX6PGIEO.js";export{generateLandingPage};
@@ -0,0 +1,2 @@
1
+ var PROXY_CLIENT_INSTALL_HINT=["[mcp-use] server.proxy() requires the optional @mcp-use/client package.","Install it in your project:",""," npm install @mcp-use/client"].join(`
2
+ `);function passthroughJsonSchema(schema){return{"~standard":{version:1,vendor:"mcp-use-proxy",validate(value){return{value}},jsonSchema:{input:()=>schema,output:()=>schema}}}}function promptArgsToJsonSchema(args){let properties=Object.create(null),required=[];for(let arg of args??[])properties[arg.name]={type:"string",...arg.description!==void 0&&{description:arg.description}},arg.required===!0&&required.push(arg.name);return{type:"object",properties,...required.length>0&&{required}}}function prefixedName(namespace,name){return`${namespace}_${name}`}function proxiedResourceUri(namespace,uri){return`mcp-use-proxy:///${encodeURIComponent(namespace)}/${encodeURIComponent(uri)}`}function isConnection(value){if(value===null||typeof value!="object")return!1;let candidate=value;return typeof candidate.listTools=="function"&&typeof candidate.callTool=="function"&&typeof candidate.readResource=="function"&&typeof candidate.listPrompts=="function"&&typeof candidate.getPrompt=="function"}function isClientPackageMissing(error){if(!(error instanceof Error))return!1;let code=error.code;return(code==="ERR_MODULE_NOT_FOUND"||code==="MODULE_NOT_FOUND")&&error.message.includes("@mcp-use/client")}function proxyDiagnostic(message,error){if(error===void 0){console.error(`[mcp-use] ${message}`);return}let detail=error instanceof Error?error.message:String(error);console.error(`[mcp-use] ${message}: ${detail}`)}function proxyClientInstallError(error){return isClientPackageMissing(error)?new Error(PROXY_CLIENT_INSTALL_HINT,{cause:error}):void 0}async function loadProxyClient(importer=()=>import("@mcp-use/client")){try{return await importer()}catch(error){let installError=proxyClientInstallError(error);throw installError!==void 0?installError:error}}function supports(connection,capability){return connection.supports?.(capability)!==!1}async function introspect(namespace,connection){let tools=[];if(supports(connection,"tools"))try{tools=await connection.listTools()}catch(error){proxyDiagnostic(`Failed to introspect tools from upstream MCP server "${namespace}"`,error)}let resources=[];if(supports(connection,"resources"))try{connection.listAllResources!==void 0?resources=(await connection.listAllResources()).resources:connection.listResources!==void 0&&(resources=(await connection.listResources()).resources)}catch(error){proxyDiagnostic(`Failed to introspect resources from upstream MCP server "${namespace}"`,error)}let prompts=[];if(supports(connection,"prompts"))try{prompts=(await connection.listPrompts()).prompts}catch(error){proxyDiagnostic(`Failed to introspect prompts from upstream MCP server "${namespace}"`,error)}return{namespace,connection,tools,resources,prompts}}function mountPlan(host,plan){host.trackNamespace?.({tools:plan.tools.length,resources:plan.resources.length,prompts:plan.prompts.length});for(let tool of plan.tools){let name=prefixedName(plan.namespace,tool.name);if(host.hasTool(name)){proxyDiagnostic(`Skipping proxied tool "${name}" from upstream "${plan.namespace}" because that name is already registered`);continue}let definition={name,...tool.title!==void 0&&{title:tool.title},...tool.description!==void 0&&{description:tool.description},...tool.annotations!==void 0&&{annotations:tool.annotations},...tool.inputSchema!==void 0&&{inputSchema:passthroughJsonSchema(tool.inputSchema)},...tool.outputSchema!==void 0&&{outputSchema:passthroughJsonSchema(tool.outputSchema)}},upstreamName=tool.name,callback=async(params,ctx)=>{let progressForwarding=Promise.resolve();try{return await plan.connection.callTool(upstreamName,params,{signal:ctx.signal,onprogress:progress=>{progressForwarding=progressForwarding.then(async()=>{try{await ctx.reportProgress(progress.progress,progress.total,progress.message)}catch(error){proxyDiagnostic(`Failed to forward progress for proxied tool "${definition.name}"`,error)}})}})}finally{await progressForwarding}};host.registerTool(definition,callback)}for(let resource of plan.resources){let name=prefixedName(plan.namespace,resource.name);if(host.hasResource(name)){proxyDiagnostic(`Skipping proxied resource "${name}" from upstream "${plan.namespace}" because that name is already registered`);continue}let upstreamUri=resource.uri;host.registerResource({name,uri:proxiedResourceUri(plan.namespace,upstreamUri),...resource.title!==void 0&&{title:resource.title},...resource.description!==void 0&&{description:resource.description},...resource.mimeType!==void 0&&{mimeType:resource.mimeType}},async(_uri,ctx)=>plan.connection.readResource(upstreamUri,{signal:ctx.signal}))}for(let prompt of plan.prompts){let name=prefixedName(plan.namespace,prompt.name);if(host.hasPrompt(name)){proxyDiagnostic(`Skipping proxied prompt "${name}" from upstream "${plan.namespace}" because that name is already registered`);continue}let upstreamName=prompt.name;host.registerPrompt({name,...prompt.title!==void 0&&{title:prompt.title},...prompt.description!==void 0&&{description:prompt.description},schema:passthroughJsonSchema(promptArgsToJsonSchema(prompt.arguments))},async params=>plan.connection.getPrompt(upstreamName,params))}}async function mountProxyConnection(host,connection){if(host.isStarted())throw new Error("Cannot call proxy() after the server has started: register upstream servers before listen()/server.fetch.");let namespace=connection.info.server.name,plan=await introspect(namespace,connection);mountPlan(host,plan)}function toClientConfig(config){return{url:config.url,...config.headers!==void 0&&{headers:config.headers},...config.authToken!==void 0&&{authToken:config.authToken},...config.timeout!==void 0&&{timeout:config.timeout},...config.fetch!==void 0&&{fetch:config.fetch},...config.protocolNegotiation!==void 0&&{protocolNegotiation:config.protocolNegotiation},oauth:!1}}async function mountProxyServers(host,servers){if(host.isStarted())throw new Error("Cannot call proxy() after the server has started: register upstream servers before listen()/server.fetch.");let{MCPClient}=await loadProxyClient(),clientServers=Object.fromEntries(Object.entries(servers).map(([name,config])=>[name,toClientConfig(config)])),owner=new MCPClient({mcpServers:clientServers});try{let plans=[];for(let namespace of Object.keys(clientServers)){let connection;try{connection=await owner.connect(namespace)}catch(error){proxyDiagnostic(`Failed to connect to upstream MCP server "${namespace}"`,error);continue}plans.push(await introspect(namespace,connection))}for(let plan of plans)mountPlan(host,plan);host.trackOwner(owner)}catch(error){throw await owner.close().catch(()=>{}),error}}function isProxyConnection(value){return isConnection(value)}export{isProxyConnection,mountProxyConnection,mountProxyServers,proxyClientInstallError};
@@ -127,6 +127,12 @@ export interface ProxyMountHost {
127
127
  trackOwner(owner: {
128
128
  close(): Promise<void>;
129
129
  }): void;
130
+ /** Record one successfully introspected upstream namespace. */
131
+ trackNamespace?(counts: {
132
+ tools: number;
133
+ resources: number;
134
+ prompts: number;
135
+ }): void;
130
136
  }
131
137
  /** Convert a missing optional-client import into the proxy install error. @internal */
132
138
  export declare function proxyClientInstallError(error: unknown): Error | undefined;
@@ -1,171 +1 @@
1
- // src/next/handler.ts
2
- import { readFile } from "fs/promises";
3
- import { join } from "path";
4
- function isViewManifestEntry(value) {
5
- if (typeof value !== "object" || value === null || !("kind" in value)) {
6
- return false;
7
- }
8
- if (value.kind === "inline") {
9
- return "js" in value && typeof value.js === "string" && "css" in value && typeof value.css === "string";
10
- }
11
- return value.kind === "external" && "entry" in value && typeof value.entry === "string" && "css" in value && Array.isArray(value.css) && value.css.every((item) => typeof item === "string") && (!("scripts" in value) || Array.isArray(value.scripts) && value.scripts.every((item) => typeof item === "string"));
12
- }
13
- function parseBuildManifest(raw, manifestPath) {
14
- let parsed;
15
- try {
16
- parsed = JSON.parse(raw);
17
- } catch (error) {
18
- const reason = error instanceof Error ? error.message : String(error);
19
- throw new Error(
20
- `Invalid mcp-use build manifest at ${manifestPath}: ${reason}`
21
- );
22
- }
23
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed) || !("views" in parsed) || typeof parsed.views !== "object" || parsed.views === null || Array.isArray(parsed.views) || !Object.values(parsed.views).every(isViewManifestEntry)) {
24
- throw new Error(`Invalid mcp-use build manifest at ${manifestPath}.`);
25
- }
26
- return parsed.views;
27
- }
28
- function createNextHandler(server) {
29
- const projectRoot = process.cwd();
30
- const manifestPath = join(
31
- process.cwd(),
32
- ".mcp-use",
33
- "build",
34
- "manifest.json"
35
- );
36
- let handlerPromise;
37
- const initialize = async () => {
38
- let raw;
39
- try {
40
- raw = await readFile(manifestPath, "utf8");
41
- } catch (error) {
42
- const code = typeof error === "object" && error !== null && "code" in error ? error.code : void 0;
43
- if (code === "ENOENT") {
44
- throw new Error(
45
- `No mcp-use build found at ${manifestPath}. Wrap next.config with withMcpUse() before mounting this route.`
46
- );
47
- }
48
- throw error;
49
- }
50
- server.__primeViews(parseBuildManifest(raw, manifestPath), {
51
- projectRoot
52
- });
53
- return async (request) => server.fetch(request);
54
- };
55
- const handle = async (request) => {
56
- handlerPromise ??= initialize();
57
- return (await handlerPromise)(request);
58
- };
59
- const preflight = async () => new Response(null, {
60
- status: 204,
61
- headers: {
62
- "Access-Control-Allow-Origin": "*",
63
- "Access-Control-Allow-Methods": "GET, POST, DELETE, OPTIONS",
64
- "Access-Control-Allow-Headers": "Authorization, Content-Type, Accept, Mcp-Protocol-Version, Mcp-Method, Mcp-Name, Mcp-Session-Id, Last-Event-ID",
65
- "Access-Control-Expose-Headers": "Mcp-Session-Id"
66
- }
67
- });
68
- return { GET: handle, POST: handle, DELETE: handle, OPTIONS: preflight };
69
- }
70
-
71
- // src/next/config.ts
72
- var DEFAULT_BASE_PATH = "/api/mcp";
73
- var BUILD_TRACE_GLOB = "./.mcp-use/build/**/*";
74
- var MCP_CORS_HEADERS = [
75
- { key: "Access-Control-Allow-Origin", value: "*" },
76
- {
77
- key: "Access-Control-Allow-Methods",
78
- value: "GET, POST, DELETE, OPTIONS"
79
- },
80
- {
81
- key: "Access-Control-Allow-Headers",
82
- value: "Authorization, Content-Type, Accept, Mcp-Protocol-Version, Mcp-Method, Mcp-Name, Mcp-Session-Id, Last-Event-ID"
83
- },
84
- { key: "Access-Control-Expose-Headers", value: "Mcp-Session-Id" }
85
- ];
86
- function normalizeBasePath(value) {
87
- const raw = value ?? DEFAULT_BASE_PATH;
88
- if (!raw.startsWith("/") || raw === "/" || raw.includes(":")) {
89
- throw new Error(
90
- `withMcpUse basePath must be a concrete absolute path; received ${JSON.stringify(raw)}.`
91
- );
92
- }
93
- return raw.replace(/\/+$/, "");
94
- }
95
- function mergeHeaders(existing, additions) {
96
- const next = [...existing];
97
- for (const header of additions) {
98
- const index = next.findIndex(
99
- (candidate) => candidate.key.toLowerCase() === header.key.toLowerCase()
100
- );
101
- if (index === -1) next.push(header);
102
- else next[index] = header;
103
- }
104
- return next;
105
- }
106
- async function buildMcpProject(projectRoot, options) {
107
- const { spawn } = process.getBuiltinModule(
108
- "node:child_process"
109
- );
110
- const { fileURLToPath } = process.getBuiltinModule(
111
- "node:url"
112
- );
113
- const cliEntry = fileURLToPath(new URL("../bin.js", import.meta.url));
114
- const args = [cliEntry, "build"];
115
- if (options.entry !== void 0) args.push("--entry", options.entry);
116
- if (options.mcpDir !== void 0) args.push("--mcp-dir", options.mcpDir);
117
- if (options.viewsDir !== void 0)
118
- args.push("--views-dir", options.viewsDir);
119
- await new Promise((resolvePromise, reject) => {
120
- const child = spawn(process.execPath, args, {
121
- cwd: projectRoot,
122
- env: process.env,
123
- stdio: "inherit"
124
- });
125
- child.once("error", reject);
126
- child.once("exit", (code, signal) => {
127
- if (code === 0) {
128
- resolvePromise();
129
- return;
130
- }
131
- reject(
132
- new Error(
133
- `mcp-use build failed${code === null ? ` with signal ${signal}` : ` with exit code ${code}`}.`
134
- )
135
- );
136
- });
137
- });
138
- }
139
- function composeNextConfig(nextConfig, basePath) {
140
- const source = `${basePath}/:path*`;
141
- const originalHeaders = nextConfig.headers?.bind(nextConfig);
142
- const existingTrace = nextConfig.outputFileTracingIncludes ?? {};
143
- const routeTrace = existingTrace[basePath] ?? [];
144
- return {
145
- ...nextConfig,
146
- async headers() {
147
- const rules = originalHeaders === void 0 ? [] : await originalHeaders();
148
- const matchingIndex = rules.findIndex((rule) => rule.source === source);
149
- if (matchingIndex === -1) {
150
- return [...rules, { source, headers: MCP_CORS_HEADERS }];
151
- }
152
- return rules.map(
153
- (rule, index) => index === matchingIndex ? { ...rule, headers: mergeHeaders(rule.headers, MCP_CORS_HEADERS) } : rule
154
- );
155
- },
156
- outputFileTracingIncludes: {
157
- ...existingTrace,
158
- [basePath]: [.../* @__PURE__ */ new Set([...routeTrace, BUILD_TRACE_GLOB])]
159
- }
160
- };
161
- }
162
- async function withMcpUse(nextConfig = {}, options = {}) {
163
- const basePath = normalizeBasePath(options.basePath);
164
- const projectRoot = options.projectRoot ?? process.cwd();
165
- await buildMcpProject(projectRoot, options);
166
- return composeNextConfig(nextConfig, basePath);
167
- }
168
- export {
169
- createNextHandler,
170
- withMcpUse
171
- };
1
+ import{readFile}from"fs/promises";import{join}from"path";function isViewManifestEntry(value){return typeof value!="object"||value===null||!("kind"in value)?!1:value.kind==="inline"?"js"in value&&typeof value.js=="string"&&"css"in value&&typeof value.css=="string":value.kind==="external"&&"entry"in value&&typeof value.entry=="string"&&"css"in value&&Array.isArray(value.css)&&value.css.every(item=>typeof item=="string")&&(!("scripts"in value)||Array.isArray(value.scripts)&&value.scripts.every(item=>typeof item=="string"))}function parseBuildManifest(raw,manifestPath){let parsed;try{parsed=JSON.parse(raw)}catch(error){let reason=error instanceof Error?error.message:String(error);throw new Error(`Invalid mcp-use build manifest at ${manifestPath}: ${reason}`)}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed)||!("views"in parsed)||typeof parsed.views!="object"||parsed.views===null||Array.isArray(parsed.views)||!Object.values(parsed.views).every(isViewManifestEntry))throw new Error(`Invalid mcp-use build manifest at ${manifestPath}.`);return parsed.views}function createNextHandler(server){let projectRoot=process.cwd(),manifestPath=join(process.cwd(),".mcp-use","build","manifest.json"),handlerPromise,initialize=async()=>{let raw;try{raw=await readFile(manifestPath,"utf8")}catch(error){throw(typeof error=="object"&&error!==null&&"code"in error?error.code:void 0)==="ENOENT"?new Error(`No mcp-use build found at ${manifestPath}. Wrap next.config with withMcpUse() before mounting this route.`):error}return server.__primeViews(parseBuildManifest(raw,manifestPath),{projectRoot}),async request=>server.fetch(request)},handle=async request=>(handlerPromise??=initialize(),(await handlerPromise)(request));return{GET:handle,POST:handle,DELETE:handle,OPTIONS:async()=>new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, DELETE, OPTIONS","Access-Control-Allow-Headers":"Authorization, Content-Type, Accept, Mcp-Protocol-Version, Mcp-Method, Mcp-Name, Mcp-Session-Id, Last-Event-ID","Access-Control-Expose-Headers":"Mcp-Session-Id"}})}}var DEFAULT_BASE_PATH="/api/mcp",BUILD_TRACE_GLOB="./.mcp-use/build/**/*",MCP_CORS_HEADERS=[{key:"Access-Control-Allow-Origin",value:"*"},{key:"Access-Control-Allow-Methods",value:"GET, POST, DELETE, OPTIONS"},{key:"Access-Control-Allow-Headers",value:"Authorization, Content-Type, Accept, Mcp-Protocol-Version, Mcp-Method, Mcp-Name, Mcp-Session-Id, Last-Event-ID"},{key:"Access-Control-Expose-Headers",value:"Mcp-Session-Id"}];function normalizeBasePath(value){let raw=value??DEFAULT_BASE_PATH;if(!raw.startsWith("/")||raw==="/"||raw.includes(":"))throw new Error(`withMcpUse basePath must be a concrete absolute path; received ${JSON.stringify(raw)}.`);return raw.replace(/\/+$/,"")}function mergeHeaders(existing,additions){let next=[...existing];for(let header of additions){let index=next.findIndex(candidate=>candidate.key.toLowerCase()===header.key.toLowerCase());index===-1?next.push(header):next[index]=header}return next}async function buildMcpProject(projectRoot,options){let{spawn}=process.getBuiltinModule("node:child_process"),{fileURLToPath}=process.getBuiltinModule("node:url"),args=[fileURLToPath(new URL("../bin.js",import.meta.url)),"build"];options.entry!==void 0&&args.push("--entry",options.entry),options.mcpDir!==void 0&&args.push("--mcp-dir",options.mcpDir),options.viewsDir!==void 0&&args.push("--views-dir",options.viewsDir),await new Promise((resolvePromise,reject)=>{let child=spawn(process.execPath,args,{cwd:projectRoot,env:process.env,stdio:"inherit"});child.once("error",reject),child.once("exit",(code,signal)=>{if(code===0){resolvePromise();return}reject(new Error(`mcp-use build failed${code===null?` with signal ${signal}`:` with exit code ${code}`}.`))})})}function composeNextConfig(nextConfig,basePath){let source=`${basePath}/:path*`,originalHeaders=nextConfig.headers?.bind(nextConfig),existingTrace=nextConfig.outputFileTracingIncludes??{},routeTrace=existingTrace[basePath]??[];return{...nextConfig,async headers(){let rules=originalHeaders===void 0?[]:await originalHeaders(),matchingIndex=rules.findIndex(rule=>rule.source===source);return matchingIndex===-1?[...rules,{source,headers:MCP_CORS_HEADERS}]:rules.map((rule,index)=>index===matchingIndex?{...rule,headers:mergeHeaders(rule.headers,MCP_CORS_HEADERS)}:rule)},outputFileTracingIncludes:{...existingTrace,[basePath]:[...new Set([...routeTrace,BUILD_TRACE_GLOB])]}}}async function withMcpUse(nextConfig={},options={}){let basePath=normalizeBasePath(options.basePath),projectRoot=options.projectRoot??process.cwd();return await buildMcpProject(projectRoot,options),composeNextConfig(nextConfig,basePath)}export{createNextHandler,withMcpUse};
@@ -1,150 +1 @@
1
- // src/node-bridge.ts
2
- function toNodeHandler(handler, opts) {
3
- return async (req, res, parsedBody) => {
4
- if (typeof parsedBody === "function") {
5
- parsedBody = void 0;
6
- }
7
- let finished = false;
8
- const abort = new AbortController();
9
- res.on("close", () => {
10
- if (!finished) {
11
- abort.abort();
12
- }
13
- });
14
- if (res.destroyed === true) {
15
- abort.abort();
16
- }
17
- let response;
18
- try {
19
- const request = await toWebRequest(req, parsedBody, {
20
- signal: abort.signal
21
- });
22
- response = await handler.fetch(request, {
23
- ...req.auth !== void 0 && { authInfo: req.auth },
24
- ...parsedBody !== void 0 && { parsedBody }
25
- });
26
- } catch (error) {
27
- try {
28
- opts?.onerror?.(
29
- error instanceof Error ? error : new Error(String(error))
30
- );
31
- } catch {
32
- }
33
- response = internalServerErrorResponse(echoableRequestId(parsedBody));
34
- }
35
- const headers = {};
36
- for (const [name, value] of response.headers) {
37
- headers[name] = value;
38
- }
39
- res.writeHead(response.status, headers);
40
- if (response.body === null) {
41
- finished = true;
42
- res.end();
43
- return;
44
- }
45
- let drainResolve;
46
- const releaseDrainWait = () => {
47
- drainResolve?.();
48
- drainResolve = void 0;
49
- };
50
- const waitForDrain = () => new Promise((resolve) => {
51
- drainResolve = resolve;
52
- });
53
- res.on("drain", releaseDrainWait);
54
- const closed = new Promise((resolve) => {
55
- abort.signal.addEventListener("abort", () => resolve(), { once: true });
56
- });
57
- try {
58
- for await (const chunk of response.body) {
59
- if (abort.signal.aborted) {
60
- break;
61
- }
62
- const bytes = chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk);
63
- if (res.write(bytes) === false) {
64
- await Promise.race([waitForDrain(), closed]);
65
- }
66
- }
67
- } catch {
68
- }
69
- finished = true;
70
- res.end();
71
- };
72
- }
73
- async function toWebRequest(req, parsedBody, options) {
74
- const method = (req.method ?? "GET").toUpperCase();
75
- const host = singleHeaderValue(req.headers["host"]) ?? singleHeaderValue(req.headers[":authority"]) ?? "localhost";
76
- const url = `http://${host}${req.url ?? "/"}`;
77
- const headers = new Headers();
78
- for (const [name, value] of Object.entries(req.headers)) {
79
- if (value === void 0 || name.startsWith(":")) {
80
- continue;
81
- }
82
- if (Array.isArray(value)) {
83
- for (const item of value) {
84
- headers.append(name, item);
85
- }
86
- } else {
87
- headers.set(name, value);
88
- }
89
- }
90
- let body;
91
- if (method !== "GET" && method !== "HEAD") {
92
- if (parsedBody === void 0) {
93
- const decoder = new TextDecoder();
94
- let collected = "";
95
- for await (const chunk of req) {
96
- collected += typeof chunk === "string" ? chunk : decoder.decode(chunk, { stream: true });
97
- }
98
- collected += decoder.decode();
99
- if (collected.length > 0) {
100
- body = collected;
101
- }
102
- } else {
103
- const serialized = JSON.stringify(parsedBody);
104
- headers.delete("content-encoding");
105
- headers.delete("transfer-encoding");
106
- if (serialized === void 0) {
107
- headers.delete("content-length");
108
- } else {
109
- body = serialized;
110
- headers.set(
111
- "content-length",
112
- String(new TextEncoder().encode(serialized).byteLength)
113
- );
114
- }
115
- }
116
- }
117
- return new Request(url, {
118
- method,
119
- headers,
120
- ...options?.signal !== void 0 && { signal: options.signal },
121
- ...body !== void 0 && { body }
122
- });
123
- }
124
- function singleHeaderValue(value) {
125
- return Array.isArray(value) ? value[0] : value;
126
- }
127
- function echoableRequestId(body) {
128
- if (body === null || typeof body !== "object" || Array.isArray(body)) {
129
- return null;
130
- }
131
- const { method, id } = body;
132
- if (typeof method !== "string") {
133
- return null;
134
- }
135
- return typeof id === "string" || typeof id === "number" ? id : null;
136
- }
137
- function internalServerErrorResponse(id) {
138
- return Response.json(
139
- {
140
- jsonrpc: "2.0",
141
- error: { code: -32603, message: "Internal server error" },
142
- id
143
- },
144
- { status: 500 }
145
- );
146
- }
147
- export {
148
- toNodeHandler,
149
- toWebRequest
150
- };
1
+ function toNodeHandler(handler,opts){return async(req,res,parsedBody)=>{typeof parsedBody=="function"&&(parsedBody=void 0);let finished=!1,abort=new AbortController;res.on("close",()=>{finished||abort.abort()}),res.destroyed===!0&&abort.abort();let response;try{let request=await toWebRequest(req,parsedBody,{signal:abort.signal});response=await handler.fetch(request,{...req.auth!==void 0&&{authInfo:req.auth},...parsedBody!==void 0&&{parsedBody}})}catch(error){try{opts?.onerror?.(error instanceof Error?error:new Error(String(error)))}catch{}response=internalServerErrorResponse(echoableRequestId(parsedBody))}let headers={};for(let[name,value]of response.headers)headers[name]=value;if(res.writeHead(response.status,headers),response.body===null){finished=!0,res.end();return}let drainResolve,releaseDrainWait=()=>{drainResolve?.(),drainResolve=void 0},waitForDrain=()=>new Promise(resolve=>{drainResolve=resolve});res.on("drain",releaseDrainWait);let closed=new Promise(resolve=>{abort.signal.addEventListener("abort",()=>resolve(),{once:!0})});try{for await(let chunk of response.body){if(abort.signal.aborted)break;let bytes=chunk instanceof Uint8Array?chunk:new Uint8Array(chunk);res.write(bytes)===!1&&await Promise.race([waitForDrain(),closed])}}catch{}finished=!0,res.end()}}async function toWebRequest(req,parsedBody,options){let method=(req.method??"GET").toUpperCase(),url=`http://${singleHeaderValue(req.headers.host)??singleHeaderValue(req.headers[":authority"])??"localhost"}${req.url??"/"}`,headers=new Headers;for(let[name,value]of Object.entries(req.headers))if(!(value===void 0||name.startsWith(":")))if(Array.isArray(value))for(let item of value)headers.append(name,item);else headers.set(name,value);let body;if(method!=="GET"&&method!=="HEAD")if(parsedBody===void 0){let decoder=new TextDecoder,collected="";for await(let chunk of req)collected+=typeof chunk=="string"?chunk:decoder.decode(chunk,{stream:!0});collected+=decoder.decode(),collected.length>0&&(body=collected)}else{let serialized=JSON.stringify(parsedBody);headers.delete("content-encoding"),headers.delete("transfer-encoding"),serialized===void 0?headers.delete("content-length"):(body=serialized,headers.set("content-length",String(new TextEncoder().encode(serialized).byteLength)))}return new Request(url,{method,headers,...options?.signal!==void 0&&{signal:options.signal},...body!==void 0&&{body}})}function singleHeaderValue(value){return Array.isArray(value)?value[0]:value}function echoableRequestId(body){if(body===null||typeof body!="object"||Array.isArray(body))return null;let{method,id}=body;return typeof method!="string"?null:typeof id=="string"||typeof id=="number"?id:null}function internalServerErrorResponse(id){return Response.json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id},{status:500})}export{toNodeHandler,toWebRequest};
@@ -1,60 +1 @@
1
- import {
2
- booleanValue,
3
- createJwtVerifier,
4
- invalidToken,
5
- normalizedProviderUrl,
6
- normalizedStrings,
7
- oauthCustomProvider,
8
- payloadFromAuthInfo,
9
- providerEndpoint,
10
- requiredString,
11
- stringValue
12
- } from "../chunk-YF5X7FYF.js";
13
-
14
- // src/oauth/auth0.ts
15
- function oauthAuth0Provider(options) {
16
- const issuer = normalizedProviderUrl(options.domain, "Auth0 domain").href;
17
- return oauthCustomProvider({
18
- ...options,
19
- createTokenVerifier: (resource) => createJwtVerifier({
20
- issuer,
21
- jwksUrl: new URL(providerEndpoint(issuer, ".well-known/jwks.json")),
22
- resource
23
- }),
24
- oauthMetadata: {
25
- issuer,
26
- authorization_endpoint: providerEndpoint(issuer, "authorize"),
27
- token_endpoint: providerEndpoint(issuer, "oauth/token"),
28
- registration_endpoint: providerEndpoint(issuer, "oidc/register"),
29
- response_types_supported: ["code"],
30
- grant_types_supported: ["authorization_code", "refresh_token"],
31
- code_challenge_methods_supported: ["S256"]
32
- },
33
- mapAuthInfo: mapUser
34
- });
35
- }
36
- function mapUser(authInfo) {
37
- const payload = payloadFromAuthInfo(authInfo);
38
- const id = requiredString(payload, "sub");
39
- if (id === void 0) throw invalidToken("Missing Auth0 subject");
40
- return {
41
- user: {
42
- id,
43
- ...optional("email", stringValue(payload, "email")),
44
- ...optional("name", stringValue(payload, "name")),
45
- ...optional("nickname", stringValue(payload, "nickname")),
46
- ...optional("picture", stringValue(payload, "picture")),
47
- ...optional("emailVerified", booleanValue(payload, "email_verified")),
48
- ...optional("updatedAt", stringValue(payload, "updated_at")),
49
- roles: normalizedStrings(payload["roles"])
50
- },
51
- payload,
52
- permissions: normalizedStrings(payload["permissions"])
53
- };
54
- }
55
- function optional(key, value) {
56
- return value === void 0 ? {} : { [key]: value };
57
- }
58
- export {
59
- oauthAuth0Provider
60
- };
1
+ import{booleanValue,createJwtVerifier,invalidToken,normalizedProviderUrl,normalizedStrings,oauthCustomProvider,payloadFromAuthInfo,providerEndpoint,requiredString,stringValue}from"../chunk-JMDHTN6N.js";function oauthAuth0Provider(options){let issuer=normalizedProviderUrl(options.domain,"Auth0 domain").href;return oauthCustomProvider({...options,createTokenVerifier:resource=>createJwtVerifier({issuer,jwksUrl:new URL(providerEndpoint(issuer,".well-known/jwks.json")),resource}),oauthMetadata:{issuer,authorization_endpoint:providerEndpoint(issuer,"authorize"),token_endpoint:providerEndpoint(issuer,"oauth/token"),registration_endpoint:providerEndpoint(issuer,"oidc/register"),response_types_supported:["code"],grant_types_supported:["authorization_code","refresh_token"],code_challenge_methods_supported:["S256"]},mapAuthInfo:mapUser})}function mapUser(authInfo){let payload=payloadFromAuthInfo(authInfo),id=requiredString(payload,"sub");if(id===void 0)throw invalidToken("Missing Auth0 subject");return{user:{id,...optional("email",stringValue(payload,"email")),...optional("name",stringValue(payload,"name")),...optional("nickname",stringValue(payload,"nickname")),...optional("picture",stringValue(payload,"picture")),...optional("emailVerified",booleanValue(payload,"email_verified")),...optional("updatedAt",stringValue(payload,"updated_at")),roles:normalizedStrings(payload.roles)},payload,permissions:normalizedStrings(payload.permissions)}}function optional(key,value){return value===void 0?{}:{[key]:value}}export{oauthAuth0Provider};
@@ -1,75 +1 @@
1
- import {
2
- booleanValue,
3
- createJwtVerifier,
4
- invalidToken,
5
- normalizedProviderUrl,
6
- normalizedStrings,
7
- oauthCustomProvider,
8
- payloadFromAuthInfo,
9
- providerEndpoint,
10
- requiredString,
11
- stringValue
12
- } from "../chunk-YF5X7FYF.js";
13
-
14
- // src/oauth/better-auth.ts
15
- function oauthBetterAuthProvider(options) {
16
- const issuer = normalizedProviderUrl(
17
- options.authURL,
18
- "Better Auth authURL"
19
- ).href.replace(/\/$/, "");
20
- return oauthCustomProvider({
21
- ...options,
22
- createTokenVerifier: (resource) => createJwtVerifier({
23
- issuer,
24
- jwksUrl: new URL(providerEndpoint(issuer, "jwks")),
25
- resource
26
- }),
27
- oauthMetadata: metadata(issuer, options.scopesSupported),
28
- mapAuthInfo: mapUser
29
- });
30
- }
31
- function metadata(issuer, scopesSupported) {
32
- return {
33
- issuer,
34
- authorization_endpoint: providerEndpoint(issuer, "oauth2/authorize"),
35
- token_endpoint: providerEndpoint(issuer, "oauth2/token"),
36
- registration_endpoint: providerEndpoint(issuer, "oauth2/register"),
37
- jwks_uri: providerEndpoint(issuer, "jwks"),
38
- response_types_supported: ["code"],
39
- grant_types_supported: [
40
- "authorization_code",
41
- "client_credentials",
42
- "refresh_token"
43
- ],
44
- code_challenge_methods_supported: ["S256"],
45
- scopes_supported: scopesSupported === void 0 ? ["openid", "profile", "email", "offline_access"] : [...scopesSupported]
46
- };
47
- }
48
- function mapUser(authInfo) {
49
- const payload = payloadFromAuthInfo(authInfo);
50
- const id = requiredString(payload, "sub");
51
- if (id === void 0) throw invalidToken("Missing Better Auth subject");
52
- return {
53
- user: {
54
- id,
55
- ...optional("email", stringValue(payload, "email")),
56
- ...optional("name", stringValue(payload, "name")),
57
- ...optional("picture", stringValue(payload, "picture")),
58
- ...optional("emailVerified", booleanValue(payload, "email_verified")),
59
- ...optional("sessionId", stringValue(payload, "sid")),
60
- ...optional(
61
- "isAnonymous",
62
- booleanValue(payload, "is_anonymous") ?? booleanValue(payload, "isAnonymous")
63
- ),
64
- roles: normalizedStrings(payload["roles"])
65
- },
66
- payload,
67
- permissions: normalizedStrings(payload["permissions"])
68
- };
69
- }
70
- function optional(key, value) {
71
- return value === void 0 ? {} : { [key]: value };
72
- }
73
- export {
74
- oauthBetterAuthProvider
75
- };
1
+ import{booleanValue,createJwtVerifier,invalidToken,normalizedProviderUrl,normalizedStrings,oauthCustomProvider,payloadFromAuthInfo,providerEndpoint,requiredString,stringValue}from"../chunk-JMDHTN6N.js";function oauthBetterAuthProvider(options){let issuer=normalizedProviderUrl(options.authURL,"Better Auth authURL").href.replace(/\/$/,"");return oauthCustomProvider({...options,createTokenVerifier:resource=>createJwtVerifier({issuer,jwksUrl:new URL(providerEndpoint(issuer,"jwks")),resource}),oauthMetadata:metadata(issuer,options.scopesSupported),mapAuthInfo:mapUser})}function metadata(issuer,scopesSupported){return{issuer,authorization_endpoint:providerEndpoint(issuer,"oauth2/authorize"),token_endpoint:providerEndpoint(issuer,"oauth2/token"),registration_endpoint:providerEndpoint(issuer,"oauth2/register"),jwks_uri:providerEndpoint(issuer,"jwks"),response_types_supported:["code"],grant_types_supported:["authorization_code","client_credentials","refresh_token"],code_challenge_methods_supported:["S256"],scopes_supported:scopesSupported===void 0?["openid","profile","email","offline_access"]:[...scopesSupported]}}function mapUser(authInfo){let payload=payloadFromAuthInfo(authInfo),id=requiredString(payload,"sub");if(id===void 0)throw invalidToken("Missing Better Auth subject");return{user:{id,...optional("email",stringValue(payload,"email")),...optional("name",stringValue(payload,"name")),...optional("picture",stringValue(payload,"picture")),...optional("emailVerified",booleanValue(payload,"email_verified")),...optional("sessionId",stringValue(payload,"sid")),...optional("isAnonymous",booleanValue(payload,"is_anonymous")??booleanValue(payload,"isAnonymous")),roles:normalizedStrings(payload.roles)},payload,permissions:normalizedStrings(payload.permissions)}}function optional(key,value){return value===void 0?{}:{[key]:value}}export{oauthBetterAuthProvider};
@@ -1,69 +1 @@
1
- import {
2
- booleanValue,
3
- createJwtVerifier,
4
- invalidToken,
5
- normalizedProviderUrl,
6
- normalizedStrings,
7
- oauthCustomProvider,
8
- payloadFromAuthInfo,
9
- providerEndpoint,
10
- requiredString,
11
- stringValue
12
- } from "../chunk-YF5X7FYF.js";
13
-
14
- // src/oauth/clerk.ts
15
- function oauthClerkProvider(options) {
16
- const issuer = normalizedProviderUrl(
17
- options.frontendApiUrl,
18
- "Clerk frontendApiUrl"
19
- ).href.replace(/\/$/, "");
20
- return oauthCustomProvider({
21
- ...options,
22
- createTokenVerifier: (resource) => createJwtVerifier({
23
- issuer,
24
- jwksUrl: new URL(providerEndpoint(issuer, ".well-known/jwks.json")),
25
- resource
26
- }),
27
- oauthMetadata: metadata(issuer),
28
- mapAuthInfo: (authInfo) => mapUser(authInfo)
29
- });
30
- }
31
- function mapUser(authInfo) {
32
- const payload = payloadFromAuthInfo(authInfo);
33
- const id = requiredString(payload, "sub");
34
- if (id === void 0) throw invalidToken("Missing Clerk subject");
35
- const organizationRole = stringValue(payload, "org_role");
36
- return {
37
- user: {
38
- id,
39
- ...optional("email", stringValue(payload, "email")),
40
- ...optional("name", stringValue(payload, "name")),
41
- ...optional("username", stringValue(payload, "username")),
42
- ...optional("picture", stringValue(payload, "picture")),
43
- ...optional("emailVerified", booleanValue(payload, "email_verified")),
44
- ...optional("organizationId", stringValue(payload, "org_id")),
45
- ...optional("organizationRole", organizationRole),
46
- ...optional("organizationSlug", stringValue(payload, "org_slug")),
47
- roles: organizationRole === void 0 ? [] : [organizationRole]
48
- },
49
- payload,
50
- permissions: normalizedStrings(payload["org_permissions"])
51
- };
52
- }
53
- function metadata(issuer) {
54
- return {
55
- issuer,
56
- authorization_endpoint: providerEndpoint(issuer, "oauth/authorize"),
57
- token_endpoint: providerEndpoint(issuer, "oauth/token"),
58
- registration_endpoint: providerEndpoint(issuer, "oauth/register"),
59
- response_types_supported: ["code"],
60
- grant_types_supported: ["authorization_code", "refresh_token"],
61
- code_challenge_methods_supported: ["S256"]
62
- };
63
- }
64
- function optional(key, value) {
65
- return value === void 0 ? {} : { [key]: value };
66
- }
67
- export {
68
- oauthClerkProvider
69
- };
1
+ import{booleanValue,createJwtVerifier,invalidToken,normalizedProviderUrl,normalizedStrings,oauthCustomProvider,payloadFromAuthInfo,providerEndpoint,requiredString,stringValue}from"../chunk-JMDHTN6N.js";function oauthClerkProvider(options){let issuer=normalizedProviderUrl(options.frontendApiUrl,"Clerk frontendApiUrl").href.replace(/\/$/,"");return oauthCustomProvider({...options,createTokenVerifier:resource=>createJwtVerifier({issuer,jwksUrl:new URL(providerEndpoint(issuer,".well-known/jwks.json")),resource}),oauthMetadata:metadata(issuer),mapAuthInfo:authInfo=>mapUser(authInfo)})}function mapUser(authInfo){let payload=payloadFromAuthInfo(authInfo),id=requiredString(payload,"sub");if(id===void 0)throw invalidToken("Missing Clerk subject");let organizationRole=stringValue(payload,"org_role");return{user:{id,...optional("email",stringValue(payload,"email")),...optional("name",stringValue(payload,"name")),...optional("username",stringValue(payload,"username")),...optional("picture",stringValue(payload,"picture")),...optional("emailVerified",booleanValue(payload,"email_verified")),...optional("organizationId",stringValue(payload,"org_id")),...optional("organizationRole",organizationRole),...optional("organizationSlug",stringValue(payload,"org_slug")),roles:organizationRole===void 0?[]:[organizationRole]},payload,permissions:normalizedStrings(payload.org_permissions)}}function metadata(issuer){return{issuer,authorization_endpoint:providerEndpoint(issuer,"oauth/authorize"),token_endpoint:providerEndpoint(issuer,"oauth/token"),registration_endpoint:providerEndpoint(issuer,"oauth/register"),response_types_supported:["code"],grant_types_supported:["authorization_code","refresh_token"],code_challenge_methods_supported:["S256"]}}function optional(key,value){return value===void 0?{}:{[key]:value}}export{oauthClerkProvider};
@@ -1,26 +1 @@
1
- import {
2
- OAuthError,
3
- OAuthErrorCode,
4
- bearerAuth,
5
- bearerAuthChallengeResponse,
6
- getOAuthProtectedResourceMetadataUrl,
7
- oauthMetadata,
8
- oauthMetadataResponse,
9
- requireBearerAuth,
10
- verifyBearerToken
11
- } from "../chunk-QKJJ6DWK.js";
12
- import {
13
- oauthCustomProvider
14
- } from "../chunk-YF5X7FYF.js";
15
- export {
16
- OAuthError,
17
- OAuthErrorCode,
18
- bearerAuth,
19
- bearerAuthChallengeResponse,
20
- getOAuthProtectedResourceMetadataUrl,
21
- oauthCustomProvider,
22
- oauthMetadata,
23
- oauthMetadataResponse,
24
- requireBearerAuth,
25
- verifyBearerToken
26
- };
1
+ import{OAuthError,OAuthErrorCode,bearerAuth,bearerAuthChallengeResponse,getOAuthProtectedResourceMetadataUrl,oauthMetadata,oauthMetadataResponse,requireBearerAuth,verifyBearerToken}from"../chunk-WYBJYZJB.js";import{oauthCustomProvider}from"../chunk-JMDHTN6N.js";export{OAuthError,OAuthErrorCode,bearerAuth,bearerAuthChallengeResponse,getOAuthProtectedResourceMetadataUrl,oauthCustomProvider,oauthMetadata,oauthMetadataResponse,requireBearerAuth,verifyBearerToken};