branch:
server.ts
2201 bytesRaw
import { createMcpHandler, getMcpAuthContext } from "agents/mcp";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { OAuthProvider } from "@cloudflare/workers-oauth-provider";
import { AuthHandler } from "./auth-handler";
function createServer() {
const server = new McpServer({
name: "Authenticated MCP Server",
version: "1.0.0"
});
server.registerTool(
"hello",
{
description: "Returns a greeting message",
inputSchema: { name: z.string().optional() }
},
async ({ name }) => {
const auth = getMcpAuthContext();
const username = auth?.props?.username as string | undefined;
return {
content: [
{
text: `Hello, ${name ?? username ?? "World"}!`,
type: "text"
}
]
};
}
);
server.registerTool(
"whoami",
{
description: "Returns information about the authenticated user"
},
async () => {
const auth = getMcpAuthContext();
if (!auth) {
return {
content: [
{
text: "No authentication context available",
type: "text"
}
]
};
}
return {
content: [
{
text: JSON.stringify(
{
userId: auth.props?.userId,
username: auth.props?.username,
email: auth.props?.email
},
null,
2
),
type: "text"
}
]
};
}
);
return server;
}
const apiHandler = {
async fetch(request: Request, env: unknown, ctx: ExecutionContext) {
const server = createServer();
return createMcpHandler(server)(request, env, ctx);
}
};
export default new OAuthProvider({
authorizeEndpoint: "/authorize",
tokenEndpoint: "/oauth/token",
clientRegistrationEndpoint: "/oauth/register",
apiRoute: "/mcp",
apiHandler: apiHandler,
defaultHandler: {
async fetch(request: Request, env: unknown, ctx: ExecutionContext) {
return AuthHandler.fetch(request, env as Record<string, unknown>, ctx);
}
}
});