MCPController
MCPController
MCPController es una aplicación MCP de gestión de médicos con un único administrador. ChatGPT se conecta mediante OAuth 2.1 con PKCE, el administrador inicia sesión, elige qué permisos de médicos conceder, y el servidor MCP expone herramientas de médicos respaldadas por MongoDB.
Arquitectura
ChatGPT
↓
OAuth
↓
Admin Login
↓
Admin Consent
↓
Granted Permissions
↓
MCP Access Token
↓
MCP /mcp
↓
Permission Check
↓
Doctor Tools
↓
MongoDBRelated MCP server: GPT MCP Service
Qué hace esta aplicación
Un único administrador es dueño de todo el sistema.
No hay registro público ni cambio de cuentas multiusuario.
El administrador se autentica con credenciales de variables de entorno.
La pantalla de consentimiento permite al administrador aprobar
doctor:read,doctor:writeydoctor:delete.El servidor MCP vuelve a comprobar los ámbitos aprobados en cada llamada a una herramienta.
Los datos de los médicos se almacenan en MongoDB mediante un modelo simple de Mongoose.
Autenticación
La sesión del navegador es independiente del token Bearer de MCP.
Sesión del navegador: cookie HTTP-only utilizada para la interfaz de administración y la pantalla de consentimiento.
Token de acceso MCP: token Bearer utilizado por ChatGPT contra
/mcp.OAuth utiliza el flujo de código de autorización con PKCE.
Los códigos de autorización son de un solo uso y de corta duración.
Los tokens de acceso y de actualización se almacenan con hash antes de guardarlos.
El inicio de sesión del administrador utiliza ADMIN_EMAIL y ADMIN_PASSWORD de .env.
Gestión de médicos
El modelo de dominio es intencionadamente pequeño:
name- cadena obligatoriaspecialization- cadena obligatoriacreatedAt/updatedAt- gestionados por las marcas de tiempo de Mongoose
El CRUD de médicos se implementa en una capa de servicios y se reutiliza tanto en la API REST de administración como en la capa de herramientas MCP.
Flujo OAuth
ChatGPT abre el endpoint de autorización.
Si el administrador no está autenticado, el navegador va a
/login.El administrador inicia sesión.
La página de consentimiento muestra los permisos de médicos solicitados.
El administrador aprueba un subconjunto o deniega la solicitud.
El código de autorización se intercambia por un token de acceso.
ChatGPT utiliza ese token en
/mcp.
Flujo de permisos
Los ámbitos solicitados se asignan a las herramientas MCP de la siguiente manera:
doctor:read→list_doctors,get_doctordoctor:write→add_doctor,update_doctordoctor:delete→delete_doctor
El backend aplica los permisos dos veces:
OAuth solo escribe los ámbitos aprobados en el código de autorización y el token.
Cada herramienta MCP comprueba los ámbitos del token antes de tocar MongoDB.
Herramientas MCP
Herramienta | Ámbito | Comportamiento |
|
| Devuelve todos los médicos |
|
| Devuelve un médico por |
|
| Crea un médico con |
|
| Actualiza un médico por |
|
| Elimina un médico por |
Variables de entorno
Usa un archivo .env en la raíz. La aplicación lo carga desde la raíz del proyecto.
Valores necesarios para npm run dev local (Vite en 5173, API en 3000):
NODE_ENV=development
PORT=3000
APP_URL=http://localhost:5173
API_URL=http://localhost:3000
MONGODB_URI=mongodb://127.0.0.1:27017/mcpcontroller
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=change-this-password
JWT_SECRET=change-this-to-a-long-random-secret
MCP_SERVER_NAME=MCPController
MCP_SERVER_VERSION=1.0.0El código también admite variables de duración de token/sesión con valores predeterminados seguros:
JWT_EXPIRES_INAUTH_CODE_TTL_SECONDSACCESS_TOKEN_TTL_SECONDSREFRESH_TOKEN_TTL_SECONDS
En Vercel, APP_URL y API_URL deben ser ambas el origen HTTPS público (ver Implementación más abajo).
Configuración local
Instala las dependencias:
npm installInicia MongoDB localmente.
Siembra datos de ejemplo:
npm run seedInicia la aplicación:
npm run devEn desarrollo, el cliente React se ejecuta a través de Vite y envía las solicitudes de API al backend mediante proxy.
Pruebas
Ejecuta las comprobaciones automatizadas con:
npm testEjecuta la compilación del cliente con:
npm run buildLa suite de pruebas actual cubre:
inicio de sesión de administrador
registro deshabilitado
modelo de médico y servicio CRUD
aprobación de ámbitos OAuth
aplicación de permisos de herramientas MCP
revocación de tokens
Conectar ChatGPT
Usa la URL de autorización expuesta por el servidor:
/.well-known/oauth-authorization-server/.well-known/oauth-protected-resource/oauth/token/mcp
Flujo típico:
ChatGPT descubre los metadatos OAuth.
ChatGPT solicita autorización para el recurso MCP.
El navegador redirige a la pantalla de inicio de sesión del administrador.
El administrador revisa los permisos y hace clic en
Permitir y conectar.ChatGPT intercambia el código por tokens.
ChatGPT llama a las herramientas MCP usando el token Bearer.
Implementación
La aplicación es un único origen: Express sirve /api, /oauth, /mcp, el descubrimiento OAuth y la compilación de React.
Vercel
Este repositorio ya incluye vercel.json y api/index.js. Vercel ejecuta la aplicación Express como una única función serverless y reescribe cada ruta hacia ella.
1. MongoDB Atlas
Crea un clúster (el M0 gratuito es suficiente).
Crea un usuario de base de datos.
Acceso de red: permite
0.0.0.0/0para que Vercel pueda conectarse (o añade las IPs de Vercel si lo prefieres).Copia la cadena de conexión, por ejemplo:
mongodb+srv://USER:PASSWORD@cluster0.xxxxx.mongodb.net/mcpcontroller?retryWrites=true&w=majority2. Implementa el proyecto
Sube este repositorio a GitHub.
En Vercel, importa el repositorio.
Framework Preset: Other (déjalo).
vercel.jsonestablece la instalación y la compilación.Root Directory: déjalo como la raíz del repositorio (no lo configures como
clientoserver).Versión de Node.js: 20.x o más reciente.
3. Variables de entorno en Vercel
Proyecto → Configuración → Variables de entorno. Configúralas para Producción (y Vista previa si usas URLs de vista previa).
Nombre | Ejemplo | Notas |
|
| Vercel normalmente lo establece automáticamente. |
|
| Sin barra final. Debe coincidir con el origen en vivo. |
|
| Mismo valor que |
|
| URI de Atlas. |
| tu correo de administrador | Se usa para iniciar sesión en la interfaz de consentimiento. |
| una contraseña fuerte | Se compara al iniciar sesión; nunca se envía al navegador. |
| cadena aleatoria larga | Firma de la cookie de sesión. No uses los valores de ejemplo. |
|
| Opcional. |
|
| Opcional. |
|
| Opcional. |
|
| Opcional. |
|
| Opcional. |
|
| Opcional. |
No pongas ADMIN_PASSWORD ni JWT_SECRET en la aplicación React. El cliente solo habla con /api.
Si añades un dominio personalizado más tarde, cambia APP_URL y API_URL a https://your-domain.com y vuelve a implementar.
Genera JWT_SECRET con:
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"4. Primera implementación y siembra
Implementa.
Abre
https://your-app.vercel.app/api/health— deberías ver{ "ok": true, ... }.Siembra MongoDB desde tu máquina, apuntando a Atlas (no a la función serverless de Vercel):
# In the project root, temporarily set MONGODB_URI to the Atlas URI in .env
npm run seedLa siembra crea la fila de usuario administrador, médicos de ejemplo y un cliente local de MCP Inspector. Después, inicia sesión en el sitio en vivo con ADMIN_EMAIL / ADMIN_PASSWORD.
5. Conectar ChatGPT
Usa el origen implementado:
https://your-app.vercel.app/.well-known/oauth-authorization-serverhttps://your-app.vercel.app/.well-known/oauth-protected-resourcehttps://your-app.vercel.app/mcp
En ChatGPT (o MCP Inspector), añade esa URL de MCP. ChatGPT abrirá las pantallas de inicio de sesión y consentimiento en el mismo dominio, y luego llamará a /mcp con un token Bearer.
Implementación por CLI (opcional)
npm i -g vercel
vercel login
vercel env pull # optional: sync env locally
vercel --prodDespués de la primera implementación de producción, copia la URL en APP_URL y API_URL si usaste un marcador de posición, y vuelve a implementar para que los metadatos OAuth apunten al origen real.
Notas de seguridad
No expongas
ADMIN_PASSWORDniJWT_SECRETal navegador.Mantén los tokens OAuth con hash en la base de datos.
Solo aprueba los ámbitos que el administrador realmente quiera que ChatGPT use.
Revoca el acceso cuando la conexión ya no deba ser de confianza.
El inicio de sesión de administrador existe solo para autorizar a ChatGPT y gestionar datos de médicos; no hay flujo de registro público.
Datos de siembra
El script de siembra crea:
médicos de ejemplo
un cliente OAuth de ejemplo para uso local con inspector
No crea usuarios de demostración ni codifica credenciales de administrador.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA complete ChatGPT App implementation using MCP with OAuth2 authentication via Privy.io, enabling secure user authentication and interactive widgets rendered in ChatGPT.165
- FlicenseNot gradedqualityBmaintenancePrivate OAuth-backed MCP server for ChatGPT, supporting GPT Apps via MCP Streamable HTTP and GPT Actions via REST endpoints with OpenAPI 3.1.
- AlicenseNot gradedqualityDmaintenanceEnables AI models to interactively explore, analyze, and manage Salesforce organizations through OAuth2 authentication and standardized tools.623MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP-compatible AI agents to read and write architecture-map projects and diagrams with per-project access controls via OAuth 2.1/PKCE.101ISC
Related MCP Connectors
Odoo ERP for AI agents: hosted OAuth endpoint, gated writes, one endpoint for every instance.
Self-hosted federated MCP gateway: one OAuth 2.1 MCP server in front of N apps, user-level scopes.
MCP server for Argo RPG Platform — connects AI assistants to campaign data via OAuth2
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/im-Saqib-Nawab/MCPController'
If you have feedback or need assistance with the MCP directory API, please join our Discord server