Skip to content

Commit 12cacce

Browse files
committed
Make example app MCP endpoints unauthenticated
Remove bearer auth middleware from all /:slug/mcp routes (pdf, map, etc.) so they are publicly accessible without an OAuth token. The root /mcp endpoint retains its existing bearer auth requirement. https://claude.ai/code/session_019bG1wzY84JA7LbpkybddP9
1 parent e3cfccb commit 12cacce

2 files changed

Lines changed: 7 additions & 18 deletions

File tree

src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ async function main() {
170170
// Mount Example Apps module (MCP Apps servers at /:slug/mcp)
171171
const exampleAppsModule = new ExampleAppsModule(
172172
{ baseUri: config.baseUri },
173-
tokenValidator
174173
);
175174
app.use('/', exampleAppsModule.getRouter());
176175

src/modules/example-apps/index.ts

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
/**
22
* Example Apps Module - Mounts ext-apps example servers at /:slug/mcp
33
*
4-
* Each example MCP App server is mounted at its own path, sharing the same
5-
* OAuth authentication as the main MCP server.
4+
* Each example MCP App server is mounted at its own path without authentication.
5+
* The root /mcp endpoint requires OAuth bearer token authentication, but these
6+
* additional example servers are publicly accessible.
67
*
78
* These servers run in STATELESS mode - each request creates a fresh server
89
* instance without maintaining session state across requests.
910
*/
1011

1112
import { Router, Request, Response, NextFunction } from 'express';
1213
import cors from 'cors';
13-
import { BearerAuthMiddlewareOptions, requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js';
14-
import { getOAuthProtectedResourceMetadataUrl } from '@modelcontextprotocol/sdk/server/auth/router.js';
1514
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
1615
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
17-
import { ITokenValidator } from '../../interfaces/auth-validator.js';
1816
import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
1917
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
2018

@@ -66,7 +64,6 @@ export class ExampleAppsModule {
6664

6765
constructor(
6866
private config: ExampleAppsConfig,
69-
private tokenValidator: ITokenValidator
7067
) {
7168
this.router = this.setupRouter();
7269
}
@@ -94,13 +91,6 @@ export class ExampleAppsModule {
9491
next();
9592
};
9693

97-
// Bearer auth middleware
98-
const bearerAuthOptions: BearerAuthMiddlewareOptions = {
99-
verifier: this.tokenValidator,
100-
resourceMetadataUrl: getOAuthProtectedResourceMetadataUrl(new URL(this.config.baseUri))
101-
};
102-
const bearerAuth = requireBearerAuth(bearerAuthOptions);
103-
10494
// Handler for /:slug/mcp - stateless: each request creates a fresh server
10595
const handleExampleMcp = async (req: Request, res: Response) => {
10696
const { slug } = req.params;
@@ -155,10 +145,10 @@ export class ExampleAppsModule {
155145
}
156146
};
157147

158-
// Mount routes for each example server
159-
router.get('/:slug/mcp', cors(corsOptions), bearerAuth, securityHeaders, handleExampleMcp);
160-
router.post('/:slug/mcp', cors(corsOptions), bearerAuth, securityHeaders, handleExampleMcp);
161-
router.delete('/:slug/mcp', cors(corsOptions), bearerAuth, securityHeaders, handleExampleMcp);
148+
// Mount routes for each example server (unauthenticated)
149+
router.get('/:slug/mcp', cors(corsOptions), securityHeaders, handleExampleMcp);
150+
router.post('/:slug/mcp', cors(corsOptions), securityHeaders, handleExampleMcp);
151+
router.delete('/:slug/mcp', cors(corsOptions), securityHeaders, handleExampleMcp);
162152

163153
return router;
164154
}

0 commit comments

Comments
 (0)