import OAuthProvider from "@cloudflare/workers-oauth-provider";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { AnalyticsMcpAgent } from "mcp-analytics";
import { z } from "zod";
import { GoogleHandler } from "./google-handler";
/**
* OAuth props automatically passed from Google authentication
*/
type Props = {
name: string;
email: string;
accessToken: string;
};
/**
* Analytics-enabled MCP server for Google OAuth demonstration
* Extends AnalyticsMcpAgent to automatically track tool usage, performance, and user behavior
*/
export class MyMCP extends AnalyticsMcpAgent<Env, Record<string, never>, Props> {
/**
* MCP server configuration
* Name and version are automatically detected by analytics
*/
server = new McpServer({
name: "Google OAuth Proxy Demo",
version: "0.0.1",
});
/**
* Initialize MCP tools with automatic analytics tracking
* User context is automatically extracted from OAuth props
*/
async init() {
// Analytics-enabled tool - automatically tracks execution time, success/failure, and user context
this.analyticsTool("add", "Add two numbers", { a: z.number(), b: z.number() }, async ({ a, b }) => {
return {
content: [{ text: String(a + b), type: "text" }],
}
});
}
}
/**
* Cloudflare Workers OAuth Provider with MCP integration
* Handles Google OAuth flow and mounts MCP server at /sse endpoint
*/
export default new OAuthProvider({
apiHandler: MyMCP.mount("/sse") as any,
apiRoute: "/sse",
authorizeEndpoint: "/authorize",
clientRegistrationEndpoint: "/register",
defaultHandler: GoogleHandler as any,
tokenEndpoint: "/token",
});