ChatGPT MCP Backend
utilcn/chatgpt-app-backendFreeBlock
MCP server bootstrap, widget asset builder, and tool registration for the ChatGPT widget.
Install it
npx shadcn@latest add https://utilcn.dev/r/chatgpt-app-backend.jsonSource
1import {2 createServer,3 type IncomingMessage,4 type ServerResponse,5} from 'node:http';6import { URL } from 'node:url';78import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';9import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';1011import { registerAdd } from '@/registry/default/chatgpt-app/add';1213function createUtilCnServer(): McpServer {14 const server = new McpServer({15 name: 'utilcn-mcp',16 version: '0.1.0',17 });1819 registerAdd(server);20 return server;21}2223type SessionRecord = {24 server: McpServer;25 transport: SSEServerTransport;26};2728const sessions = new Map<string, SessionRecord>();2930const ssePath = '/mcp';31const postPath = '/mcp/messages';3233async function handleSseRequest(res: ServerResponse) {34 res.setHeader('Access-Control-Allow-Origin', '*');35 const server = createUtilCnServer();36 const transport = new SSEServerTransport(postPath, res);37 const sessionId = transport.sessionId;3839 sessions.set(sessionId, { server, transport });4041 transport.onclose = () => {42 sessions.delete(sessionId);43 };4445 transport.onerror = (error) => {46 console.error('SSE transport error', error);47 };4849 try {50 await server.connect(transport);51 } catch (error) {52 sessions.delete(sessionId);53 console.error('Failed to start SSE session', error);54 if (!res.headersSent) {55 res.writeHead(500).end('Failed to establish SSE connection');56 }57 }58}5960async function handlePostMessage(61 req: IncomingMessage,62 res: ServerResponse,63 url: URL,64) {65 res.setHeader('Access-Control-Allow-Origin', '*');66 res.setHeader('Access-Control-Allow-Headers', 'content-type');67 const sessionId = url.searchParams.get('sessionId');6869 if (!sessionId) {70 res.writeHead(400).end('Missing sessionId query parameter');71 return;72 }7374 const session = sessions.get(sessionId);7576 if (!session) {77 res.writeHead(404).end('Unknown session');78 return;79 }8081 try {82 await session.transport.handlePostMessage(req, res);83 } catch (error) {84 console.error('Failed to process message', error);85 if (!res.headersSent) {86 res.writeHead(500).end('Failed to process message');87 }88 }89}9091const portEnv = Number(process.env.PORT ?? 8000);92const port = Number.isFinite(portEnv) ? portEnv : 8000;9394const httpServer = createServer(95 async (req: IncomingMessage, res: ServerResponse) => {96 if (!req.url) {97 res.writeHead(400).end('Missing URL');98 return;99 }100101// … truncated
What it pulls in
npm packages
Files it writes
More from utilcn
All 17 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| ChatGPT Widget Frontendchatgpt-app | utilcn | Blocks | Free | 6 deps · 9 files |
