Cómo funciona
El probador es un cliente MCP que corre en tu navegador. Usa el SDK oficial de TypeScript, el mismo del curso, y habla la versión que
elijas: 2026-07-28, sin estado, o 2025-11-25, con el saludo initialize. Al conectar pide al servidor sus tools, resources,
plantillas y prompts, recorriendo todas las páginas si las hay.
Según la dirección, la conexión va por uno de dos caminos:
- Directo, para
http://localhosty127.0.0.1. Tu navegador habla con tu servidor y nada pasa por desarrollomcp.com. Sirve para probar mientras programas. - A través de desarrollomcp.com, para un servidor publicado en https. Un navegador no puede llamar a cualquier servidor por CORS, así que reenviamos tus peticiones. Solo hacia direcciones https públicas y nunca con tus cookies. Con los ejemplos del curso no hace falta cuenta. Con tu servidor, sí: es gratis.
MCP Apps: la vista, como en Claude
Si una tool declara una vista en _meta.ui.resourceUri, al llamarla el probador hace de host, como Claude o ChatGPT. Lee el
HTML con resources/read, lo carga en un sandbox de otro dominio con la CSP que declara la vista y le pasa los argumentos y el
resultado. La vista puede llamar a tools del servidor, y el probador deja pasar solo las que incluyen app en
visibility, como dice la especificación. También puede dejar contexto al modelo o escribir en el chat, y pedir abrir enlaces
o la pantalla completa.
Debajo de la vista ves el cable: cada mensaje entre la vista y el host, de ui/initialize a tool-result, con lo
que significa. Lo que la vista deja al modelo y lo que escribiría en el chat sale en sus propios paneles. Para entender las piezas, lee
MCP Apps: cuándo una tool pide interfaz y
Construir una MCP App completa. Pruébalo con el ejemplo panel-entregas.
El sandbox está en desarrollomcp-vistas.andresleontest.workers.dev, un sitio distinto de desarrollomcp.com: la vista no ve
tu sesión ni la página del probador. Sin dominios declarados no tiene acceso a la red, y nunca puede conectarse a desarrollomcp.com.
Login OAuth, paso a paso
Si tu servidor responde 401 con WWW-Authenticate, el probador sigue la autorización de MCP con el SDK oficial, como un
cliente público. Lee los metadatos del recurso y los del servidor de autorización, y se registra como cliente. Si el servidor admite
documentos de metadatos (CIMD), su client_id es https://desarrollomcp.com/probar/cliente-oauth.json; si no, se registra con
registro dinámico. Después abre la página de login en una ventana con PKCE y canjea el código por un token ligado a tu servidor.
Cada paso sale en el panel de tráfico con lo que significa, y el código, el token y el verificador PKCE aparecen tapados. El token solo
vive en esta página: se pierde al recargar o al cerrar la sesión. Para verlo sin montar nada, conecta el ejemplo
nortia-login: su login no pide contraseña. Lo explica APIs externas y autorización.
Probar un servidor local
En modo directo, la página de desarrollomcp.com hace las peticiones a tu servidor desde tu navegador. El navegador solo deja leer la
respuesta si tu servidor acepta ese origen (CORS) y expone la cabecera Mcp-Session-Id. Los SDK, además, rechazan por defecto
un Origin que no sea local, como protección frente a DNS rebinding. Estos son los cambios en los servidores de las lecciones 9 y 10.
En TypeScript, sobre el src/http.ts de la lección 9 (el paquete cors se instala con npm install cors):
import cors from 'cors';
import { createMcpExpressApp } from '@modelcontextprotocol/express';
// Acepta el Origin del probador (createMcpExpressApp compara el nombre de host)
const app = createMcpExpressApp({ allowedOrigins: ['localhost', '127.0.0.1', 'desarrollomcp.com'] });
// CORS: deja leer la respuesta y la cabecera Mcp-Session-Id desde la página
app.use(cors({
origin: 'https://desarrollomcp.com',
exposedHeaders: ['Mcp-Session-Id', 'Mcp-Protocol-Version', 'WWW-Authenticate'],
}));
app.all('/mcp', (req, res) => void node(req, res, req.body)); En Python, con el SDK oficial mcp 2.x y uvicorn:
from mcp.server.transport_security import TransportSecuritySettings
from starlette.middleware.cors import CORSMiddleware
seguridad = TransportSecuritySettings(
allowed_hosts=["127.0.0.1:*", "localhost:*"],
allowed_origins=["https://desarrollomcp.com"],
)
app = mcp.streamable_http_app(stateless_http=True, json_response=True, transport_security=seguridad)
app.add_middleware(
CORSMiddleware,
allow_origins=["https://desarrollomcp.com"],
allow_methods=["GET", "POST", "DELETE"],
allow_headers=["*"],
expose_headers=["Mcp-Session-Id", "Mcp-Protocol-Version", "WWW-Authenticate"],
)
# uvicorn.run(app, host="127.0.0.1", port=8765)
Chrome pide además permiso para que una web acceda a tu red local la primera vez que la página llama a localhost. Si lo
deniegas, el probador no llega a tu servidor; puedes cambiarlo en la configuración del sitio. Cuando termines de probar, quita
desarrollomcp.com de los orígenes permitidos si no lo necesitas.
Qué revisa
La revisión de diseño aplica los criterios de las lecciones a lo que devuelve tu servidor. Avisa, por ejemplo, de tools sin descripción
o con una descripción que no dice cuándo no usarlas, de parámetros sin tipo ni límites, de anotaciones que faltan o no cuadran con el
nombre, de errores que llegan como fallo del protocolo en lugar de isError y de definiciones que ocupan demasiado contexto.
Cada aviso enlaza con la lección que lo explica: Herramientas,
Qué construir y cuándo no,
Diseño de servidores MCP,
Evaluar si el modelo usa bien tus tools,
Rendimiento y coste de contexto y
Seguridad avanzada.
El tamaño en tokens es una estimación. Medimos los bytes de lo que un host típico entrega al modelo (nombre, descripción y esquema de entrada de cada tool) y lo dividimos entre 3,5 caracteres por token, con un margen de 3 a 4. La cifra exacta depende del modelo: para saberla, pasa el mismo JSON por el contador de tokens de tu proveedor.
Privacidad y límites
- La cabecera
Authorizationsolo viaja a tu servidor. No la registramos ni la guardamos, y el panel de tráfico la muestra oculta. - En el login OAuth, el token, el código y el registro del cliente solo viven en la memoria de esta página. Cuando el servidor de autorización no admite CORS, los metadatos, el registro y el canje del token pasan por desarrollomcp.com con las mismas reglas que el resto, sin guardarse.
- Del tráfico que pasa por desarrollomcp.com solo registramos el servidor de destino, el método MCP, el código de estado y lo que tardó. Nunca los cuerpos.
- Hay un límite de 60 peticiones por minuto y 300 al día por cuenta. Cada petición se corta a los 30 segundos o a los 2 MB de respuesta.
- Solo se admiten direcciones https públicas en el puerto 443, sin direcciones IP ni redes locales. El probador no sigue redirecciones.
Lo que no hace
El probador no abre el stream de avisos del servidor (el GET de la era 2025), así que no recibe notificaciones como
list_changed. Tampoco hace de modelo: no decide qué tool llamar, y en una MCP App los mensajes al chat y el contexto para el
modelo se enseñan, pero nadie los responde. Para conectar nuestro propio servidor a Claude o ChatGPT, sigue
Usa el curso desde Claude y ChatGPT.