Cómo funciona MCP, a fondo
Para los técnicos: las partes del Model Context Protocol, los mensajes que se envían y cómo se protege una conexión. Verificado contra la especificación actual, revisión 2026-07-28, con el propio servidor de MCP Team como ejemplo.
- Revisión de la especificación
- 2026-07-28, la actual
- Mensajes
- JSON-RPC 2.0
- Transportes
- stdio para servidores locales, Streamable HTTP para los remotos
- Los servidores ofrecen
- Herramientas (tools), recursos (resources) y prompts
- Los clientes ofrecen
- Elicitation. Sampling y roots todavía funcionan, pero están en desuso
- Acceso por HTTP
- OAuth 2.1, cuando el servidor lo necesita
1Tres partes: host, cliente, servidor
El host es la app de IA que usas: Claude, ChatGPT, un editor de código. Trabaja con el modelo, guarda la conversación y decide qué necesita tu aprobación.
Por cada servidor al que se conecta, el host crea un cliente. Un cliente, un servidor: así cada conexión queda separada.
Un servidor ofrece datos y acciones. Puede correr en tu computadora o en internet. Por diseño, solo ve los requests que le envían: ni la conversación completa ni los otros servidores.
Host
Claude, ChatGPT, un editor de código
El modelo y tu conversación
- Cliente 1
- Cliente 2
- Cliente 3
- Streamable HTTPMCP TeamRemoto: la memoria de tu negocio
- stdioServidor de archivosLocal: en tu computadora
- Streamable HTTPCualquier otro servidorRemoto: un calendario, un CRM
Dos capas
MCP tiene dos capas. La capa de datos es lo que se dice: mensajes JSON-RPC para descubrimiento, herramientas, recursos, prompts y notificaciones. La capa de transporte es cómo viaja: abrir la conexión, enmarcar cada mensaje y manejar la autorización.
2Cada mensaje es JSON-RPC 2.0
MCP no inventa un formato propio. Cada mensaje es un objeto JSON-RPC 2.0, de uno de tres tipos.
Request
Pide algo. Lleva un id y un method, como tools/. En MCP el id nunca puede ser null.
tools/listcliente → servidor{"jsonrpc": "2.0","id": 2,"method": "tools/list","params": {"_meta": {"io.modelcontextprotocol/ protocolVersion": "2026-07-28","io.modelcontextprotocol/ clientInfo": {"name": "ExampleClient","version": "1.0.0"},"io.modelcontextprotocol/ clientCapabilities": {}}}}Respuesta
Contesta un request, con el mismo id, y trae un result o un error. Desde 2026-07-28 cada resultado dice su resultType: complete, o input_required cuando el servidor necesita algo más para terminar.
{"jsonrpc": "2.0","id": 2,"result": {"tools": […],"resultType": "complete",…}}Notificación
Un mensaje de una sola vía, sin id. Nadie la contesta. Así viajan los avisos de progreso y de cambios.
{"jsonrpc": "2.0","method": "notifications/ tools/ list_changed"}En la revisión actual solo el cliente envía requests. El servidor contesta cada uno, y puede enviar notificaciones sobre el request que está trabajando. Si necesita algo del usuario o del cliente, lo pide dentro de su respuesta en vez de enviar un request propio.
Los errores usan los códigos estándar de JSON-RPC, como -32601 (método no encontrado) y -32602 (parámetros inválidos). MCP añade tres: -32020 headers que no coinciden, -32021 falta una capacidad del cliente y -32022 versión del protocolo no soportada.
3Ya no hay handshake: cada request se sostiene solo
Hasta la revisión 2025-11-25, cada conexión empezaba con un handshake. El cliente enviaba initialize con su versión del protocolo y sus capacidades, el servidor contestaba con las suyas, el cliente confirmaba con notifications/ y solo entonces empezaba el trabajo.
La revisión 2026-07-28 eliminó el handshake y las sesiones del protocolo. Ahora cada request lleva en _meta la versión del protocolo y las capacidades del cliente, y debe identificar al cliente también. El servidor no puede depender de nada que dijo un request anterior, aunque sea en la misma conexión.
Todo servidor tiene que contestar server/ con sus versiones, capacidades e identidad. Llamarlo primero es opcional: el cliente puede enviar su request directamente y, si la versión no coincide, el servidor contesta con el error -32022 y las versiones que soporta.
El servidor de MCP Team habla las dos. Un request 2026-07-28 se atiende por sí solo, y un cliente más viejo que abre con initialize recibe el handshake de 2025-11-25. Los dos diagramas de abajo siguen sus respuestas reales.
- Del cliente al servidor: server/discoverOpcional: ¿qué versiones y funciones tienes?
- Del servidor al cliente: resultVersión
2026-07-28, capacidadtools - Del cliente al servidor: tools/listLa versión y las capacidades van en
_meta - Del servidor al cliente: resultSeis herramientas, de
get_profileafetch - Host: el modelo escoge
get_fact - Del cliente al servidor: tools/call
get_factconquery: "sunday hours" - Del servidor al cliente: resultTexto para el modelo, y la misma respuesta en JSON
- Del cliente al servidor: initializeVersión
2025-11-25, capacidades, datos del cliente - Del servidor al cliente: resultVersión acordada, capacidades, datos del servidor, instrucciones
- Del cliente al servidor: notifications/initializedUna notificación: no hay respuesta, solo HTTP 202
- Del cliente al servidor: tools/listLa versión va en el header
MCP-Protocol-Version - Del servidor al cliente: resultLas mismas seis herramientas
- Del cliente al servidor: tools/call
get_fact, con los mismos argumentos - Del servidor al cliente: resultLa misma respuesta
server/discovercliente → servidor{"jsonrpc": "2.0","id": 1,"method": "server/discover","params": {"_meta": {"io.modelcontextprotocol/ protocolVersion": "2026-07-28","io.modelcontextprotocol/ clientInfo": {"name": "ExampleClient","version": "1.0.0"},"io.modelcontextprotocol/ clientCapabilities": {}}}}{"jsonrpc": "2.0","id": 1,"result": {"resultType": "complete","supportedVersions": ["2026-07-28"],"capabilities": { "tools": { "listChanged": true } },"instructions": "This connector is Example Café's business brain: facts the owner h…","ttlMs": 0,"cacheScope": "private","_meta": {"io.modelcontextprotocol/ serverInfo": {"name": "mcp-team","version": "0.1.0",…}}}}instructions es texto que el host le puede pasar al modelo. MCP Team lo usa para decir qué es el conector y cómo tratar sus datos.
Antes de 2026-07-28, esa misma información llegaba con el handshake. MCP Team todavía lo contesta:
initializecliente → servidor{"jsonrpc": "2.0","id": 1,"method": "initialize","params": {"protocolVersion": "2025-11-25","capabilities": {},"clientInfo": {"name": "ExampleClient","version": "1.0.0"}}}{"jsonrpc": "2.0","id": 1,"result": {"protocolVersion": "2025-11-25","capabilities": { "tools": { "listChanged": true } },"serverInfo": {"name": "mcp-team","version": "0.1.0",…},"instructions": "This connector is Example Café's business brain: facts the owner h…"}}4Dos transportes: stdio y Streamable HTTP
stdio, para servidores locales
El cliente arranca el servidor como un subproceso en la misma máquina. Los mensajes van por stdin y stdout, un objeto JSON por línea. El servidor puede escribir logs en stderr, nunca en stdout. No hay red ni OAuth: un servidor local lee sus credenciales del entorno.
Streamable HTTP, para servidores remotos
El servidor tiene un solo endpoint, y cada mensaje es su propio POST. La respuesta es JSON simple, o un stream de eventos (SSE) solo para ese request, que puede traer avisos de progreso antes del resultado.
El cliente también copia campos clave a headers, para que los gateways puedan enrutar sin leer el cuerpo: MCP-Protocol-Version en cada request y, nuevos en 2026-07-28, Mcp-Method y, en una llamada a herramienta, Mcp-Name. Si un header y el cuerpo no coinciden, el servidor tiene que rechazar el request. Los servidores también tienen que revisar el header Origin, para frenar el DNS rebinding.
POST / mcp/ <secreto> HTTP/ 1.1Host: mcp.teamContent-Type: application/jsonAccept: application/ json, text/ event-streamMCP-Protocol-Version: 2026-07-28Mcp-Method: tools/callMcp-Name: get_factSi quitas Mcp-Method, el servidor de MCP Team contesta 400 Bad Request:
{"jsonrpc": "2.0","id": 3,"error": {"code": -32020,"message": "Bad Request: the request headers and body disagree: the body names method tools/ call but the required Mcp-Method header is absent","data": {"mismatch": {"header": "(missing)","body": "the body names method tools/ call but the required Mcp-Method header is absent"}}}}Lo que se fue, o va de salida
- El transporte HTTP+SSE original, de 2024-11-05: en desuso desde 2025-03-26. Usa Streamable HTTP.
- Las sesiones (
Mcp-Session-Id), el stream por GET y los streams reanudables (Last-Event-ID): eliminados de Streamable HTTP en 2026-07-28. - Los avisos de cambios ahora llegan por un stream
subscriptions/que abre el cliente. Reemplaza el stream por GET ylisten resources/.subscribe
5Lo que ofrecen los servidores, y lo que los clientes ofrecen de vuelta
Un servidor puede ofrecer tres tipos de cosas. La diferencia está en quién decide cuándo se usan.
Herramientas (tools)
Quién decide: el modelo
Funciones que el modelo puede llamar para buscar algo o hacer una acción.
tools/listtools/call
Recursos (resources)
Quién decide: la app
Datos con un URI, como un archivo o el esquema de una base de datos, que la app añade como contexto.
resources/listresources/readresources/templates/list
Prompts
Quién decide: el usuario
Plantillas que el usuario escoge, a menudo como comandos con barra (/).
prompts/listprompts/get
Los clientes pueden ofrecer cosas de vuelta. El servidor las pide en medio de un request.
Elicitation
El servidor le pide información al usuario. El modo formulario muestra un formulario corto descrito por un JSON Schema plano. El modo URL manda al usuario a una página web, y es obligatorio para contraseñas, API keys y datos de pago, para que nunca pasen por el cliente.
Sampling
En desuso. El servidor le pide una respuesta al modelo del cliente. Los servidores nuevos deben llamar directamente a un proveedor de modelos.
Roots
En desuso. El cliente le dice al servidor qué carpetas importan. Los servidores nuevos deben recibir las rutas como argumentos de herramienta o en su configuración.
Sampling, roots y los logs del servidor quedaron en desuso (deprecated) en 2026-07-28. Siguen funcionando por al menos doce meses.
Cómo pide algo un servidor ahora
Los servidores ya no envían requests propios. El servidor contesta con resultType: "input_required" y un grupo de inputRequests, por ejemplo un elicitation/. El cliente reúne las respuestas y envía el request original otra vez, con inputResponses y un id nuevo.
{"jsonrpc": "2.0","id": 2,"result": {"resultType": "input_required","inputRequests": {"github_login": {"method": "elicitation/create","params": {"mode": "form","message": "Please provide your GitHub username","requestedSchema": {"type": "object","properties": {"name": { "type": "string" }},"required": ["name"]}}}},"requestState": "eyJsb2NhdGlvbiI6Ik5ldyBZb3JrIn0..."}}{"jsonrpc": "2.0","id": 3,"method": "tools/call","params": {"name": "get_weather","arguments": { "location": "New York" },"inputResponses": {"github_login": {"action": "accept","content": { "name": "octocat" }}},"requestState": "eyJsb2NhdGlvbiI6Ik5ldyBZb3JrIn0..."}}MCP Team solo usa herramientas. Su respuesta a server/ solo menciona tools, y nunca le pide nada al cliente.
6Una herramienta de cerca: get_fact de MCP Team
Una herramienta es un nombre, una descripción que lee el modelo y un JSON Schema para sus argumentos. Esta es una entrada real del tools/ de MCP Team, para un café de ejemplo.
- name
- Lo que llama el modelo. Único dentro del servidor.
- title
- Un nombre para mostrarle a la gente.
- description
- Lo que lee el modelo para decidir cuándo usar la herramienta.
- inputSchema
- JSON Schema de los argumentos, versión 2020-12 a menos que el esquema diga otra. MCP Team escribe sus esquemas en zod, con límites de largo.
- outputSchema
- Opcional: la forma del JSON que devuelve la herramienta. MCP Team no declara uno.
- annotations
- Pistas sobre cómo se comporta la herramienta. Más en la sección 10.
{"jsonrpc": "2.0","id": 2,"result": {"tools": [{ "name": "get_profile", … },{"name": "get_fact","title": "Example Café: look up one fact","description": "Looks up a single fact in Example Café's business brain (for example a price, an offer, a policy, a booking link or a contact detail) by its exact key or by a few words describing it. Returns the value with its label, section and when it was last updated, or says that it is not in the brain.","inputSchema": {"type": "object","$schema": "https:/ / json-schema.org/ draft/ 2020-12/ schema","properties": {"key": {"description": "Exact fact key, e.g. prices.drop-in-class.","type": "string","maxLength": 120},"query": {"description": "A few words describing the fact, e.g. 'cancellation policy'.","type": "string","maxLength": 200}}},"annotations": {"readOnlyHint": true,"destructiveHint": false,"idempotentHint": true,"openWorldHint": false}},{ "name": "list_upcoming", … },{ "name": "propose_change", … },{ "name": "search", … },{ "name": "fetch", … }],"resultType": "complete","ttlMs": 0,"cacheScope": "private","_meta": {"io.modelcontextprotocol/ serverInfo": {"name": "mcp-team","version": "0.1.0",…}}}}La llamada
Alguien le pregunta al asistente del café: ¿abren el domingo por la mañana? El modelo escoge get_fact, y el cliente envía:
tools/callcliente → servidor{"jsonrpc": "2.0","id": 3,"method": "tools/call","params": {"name": "get_fact","arguments": { "query": "sunday hours" },"_meta": {"io.modelcontextprotocol/ protocolVersion": "2026-07-28","io.modelcontextprotocol/ clientInfo": {"name": "ExampleClient","version": "1.0.0"},"io.modelcontextprotocol/ clientCapabilities": {}}}}{"jsonrpc": "2.0","id": 3,"result": {"content": [{"type": "text","text": "Sunday hours (Schedule & dates): 7 am to 1 pm. Breakfast until noon.\nKey: schedule.sunday-hours\nLast updated: 2026-10-14"}],"structuredContent": {"found": true,"key": "schedule.sunday-hours","section": "schedule","label": "Sunday hours","value": "7 am to 1 pm. Breakfast until noon.","updated_at": "2026-10-14","event_start": null,"event_end": null},"resultType": "complete","_meta": {"io.modelcontextprotocol/ serverInfo": {"name": "mcp-team","version": "0.1.0",…}}}}contentes lo que lee el modelo: texto simple, aquí con la clave del dato y su fecha.structuredContentes la misma respuesta en JSON, para el código que prefiere campos en vez de texto.- Cuando una herramienta no puede hacer su trabajo, igual devuelve un resultado, con
isError: truey una explicación que el modelo puede usar para corregirse. Envía unakeyde 500 caracteres y MCP Team contesta:Input validation error: … expected string to have <=120 characters. - Un request que el servidor no puede correr recibe un error de JSON-RPC. Pídele a MCP Team una herramienta que no existe y devuelve
-32602:Tool delete_everything not found.
Las seis herramientas
| Herramienta | Qué hace | Annotations |
|---|---|---|
| get_profile | La memoria aprobada en markdown, sección por sección | readOnlyHint: true |
| get_fact | Un dato, por su clave o por unas palabras | readOnlyHint: true |
| list_upcoming | Lo que viene con fecha, lo más cercano primero | readOnlyHint: true |
| propose_change | Guarda una sugerencia que el dueño tiene que aprobar | readOnlyHint: false, destructiveHint: false |
| search | Los datos que coinciden, con id, título y url: la forma que espera ChatGPT | readOnlyHint: true |
| fetch | Un dato completo, por el id de un resultado de búsqueda | readOnlyHint: true |
Las seis también dicen openWorldHint: false: solo tocan la memoria de este negocio.
7Cuando cambia la lista de herramientas
Un servidor que va a avisar los cambios en su lista de herramientas declara listChanged: true. En 2026-07-28, un cliente que quiere enterarse abre un request de larga duración, subscriptions/, y dice qué quiere recibir, como toolsListChanged. El servidor confirma con notifications/, envía notifications/ cada vez que la lista cambia, y el cliente vuelve a llamar tools/. Los prompts y los recursos funcionan igual, y un cliente también puede vigilar recursos específicos.
El servidor de MCP Team lo declara y acepta la suscripción, como ves abajo. Sus seis herramientas son las mismas en cada request, así que el stream no tiene nada que avisar.
subscriptions/listencliente → servidor{"jsonrpc": "2.0","id": 4,"method": "subscriptions/listen","params": {"_meta": {"io.modelcontextprotocol/ protocolVersion": "2026-07-28","io.modelcontextprotocol/ clientInfo": {"name": "ExampleClient","version": "1.0.0"},"io.modelcontextprotocol/ clientCapabilities": {}},"notifications": { "toolsListChanged": true }}}{"jsonrpc": "2.0","method": "notifications/ subscriptions/ acknowledged","params": {"notifications": { "toolsListChanged": true },"_meta": {"io.modelcontextprotocol/ subscriptionId": 4}}}Los resultados de las listas también traen pistas para el caché: ttlMs, cuántos milisegundos sigue fresco el resultado, y cacheScope, public o private. MCP Team envía ttlMs: 0 y private: la lista se considera vieja de inmediato, y una copia en caché no se comparte entre quienes llaman.
8Entrar a un servidor remoto: OAuth 2.1
En MCP la autorización es opcional. Cuando un servidor HTTP la necesita, la especificación se apoya en OAuth 2.1. El servidor MCP hace de resource server, y un servidor de autorización, de la misma empresa o de otra, autentica al usuario y emite los tokens.
Los servidores locales por stdio se saltan todo esto y leen sus credenciales del entorno.
El flujo, paso a paso
El cliente llama al servidor sin token. Recibe
401y un headerWWW-Authenticateque puede apuntar a la metadata del recurso protegido del servidor (RFC 9728). Si no la indica, el cliente busca ese documento en un URL well-known.Ese documento dice cuál es el servidor de autorización. El cliente lee la metadata de ese servidor (RFC 8414 u OpenID Connect Discovery).
El cliente se identifica: con un ID registrado de antemano, o con un Client ID Metadata Document, un URL HTTPS que describe al cliente. Dynamic Client Registration todavía funciona, pero está en desuso.
El usuario entra y aprueba en el navegador. El cliente usa PKCE con S256, nombra este servidor exacto en un parámetro
resource(RFC 8707) y verifica el valorisscuando la respuesta lo trae (RFC 9207).El cliente cambia el código por un access token y lo envía en cada request como
Authorization: Bearer …, nunca en el query string del URL.El servidor verifica que el token se emitió para él y rechaza cualquier otro. Nunca le pasa el token a otras APIs.
HTTP/ 1.1 401 UnauthorizedWWW-Authenticate: Bearer resource_metadata="https:/ / mcp.example.com/ .well-known/ oauth-protected-resource", scope="files:read"El menor privilegio
Los clientes piden el grupo más pequeño de scopes. Cuando una acción necesita más, el servidor contesta 403 con insufficient_scope y los scopes que hacen falta, y el cliente le pide al usuario que apruebe esos además de los que ya tiene.
9El enlace del conector de MCP Team, y por qué no es OAuth
MCP Team no usa el flujo de OAuth. Cada negocio recibe un enlace privado, y el enlace es la llave.
https:/ / mcp.team/ mcp/ <secreto: 43 caracteres>- El secreto son 32 bytes al azar, escritos como 43 caracteres seguros para URLs.
- El dueño lo ve una sola vez. La base de datos guarda solo su hash SHA-256, más los últimos cuatro caracteres para que el dueño lo reconozca.
- En cada request, el servidor calcula el hash del secreto que viene en la ruta y busca el negocio con ese hash. Un secreto equivocado, reemplazado o mal formado recibe siempre la misma respuesta:
404 Not found. El código propio de MCP Team nunca escribe el secreto en sus logs. Los logs de requests de la plataforma de hosting sí guardan el URL completo, como pasa con cualquier secreto que va en un enlace. - Cada request arma un servidor MCP nuevo para ese negocio nada más. No se comparte nada entre negocios.
- Crear un enlace nuevo apaga el anterior al instante, porque solo se guarda el hash nuevo.
- El enlace lee los datos que aprobó el dueño, menos los marcados como privados, y puede dejar sugerencias. No puede cambiar un dato: el dueño revisa cada sugerencia en el dashboard.
Por qué no OAuth
El dueño pega un enlace en Claude o ChatGPT, y funciona. No hay que crear una cuenta dentro de la app de chat ni pasar por una pantalla de permisos. La especificación lo permite: la autorización es opcional, y un cliente y un servidor pueden acordar su propio esquema.
Lo que cuesta
El enlace es un secreto al portador (bearer). Quien lo tenga puede leer esos datos y dejar sugerencias hasta que el dueño cree uno nuevo. No identifica a nadie, no tiene scopes y no vence, así que trátalo como una contraseña.
| Aspecto | OAuth 2.1, según la especificación | El enlace de MCP Team |
|---|---|---|
| Por dónde viaja la credencial | OAuth 2.1, según la especificación: En un header Authorization: Bearer, en cada request | El enlace de MCP Team: En la ruta del URL |
| A quién representa | OAuth 2.1, según la especificación: A un usuario que entró y aprobó | El enlace de MCP Team: A quien tenga el enlace |
| Qué permite | OAuth 2.1, según la especificación: Los scopes otorgados | El enlace de MCP Team: Fijo: leer datos aprobados, dejar sugerencias |
| Cuánto dura | OAuth 2.1, según la especificación: Tokens de vida corta, como recomienda la especificación | El enlace de MCP Team: Hasta que el dueño cree un enlace nuevo |
| Configuración | OAuth 2.1, según la especificación: Entrar y aprobar en el navegador | El enlace de MCP Team: Pegar un enlace |
¿Quieres un enlace para tu negocio? Empieza con tu página web aquí abajo. ↓
10Seguridad que aguanta
MCP no puede imponer la seguridad por sí solo. La especificación se la deja a los hosts, los clientes y los servidores. Estos cinco hábitos son los que más pesan; debajo de cada uno, cómo lo aplica MCP Team.
Da el menor acceso que funcione
Pide el grupo más pequeño de scopes, añade más solo cuando una acción lo necesite, y que cada servidor haga una sola cosa.
En MCP Team: El enlace puede leer datos aprobados y dejar sugerencias. Nada más. Los datos marcados como privados nunca le llegan.
Que una persona apruebe las acciones
Los hosts tienen que pedirle permiso al usuario antes de que corra una herramienta, y siempre debe haber una persona que pueda decir que no. Los clientes deben mostrar lo que le van a enviar a una herramienta antes de enviarlo.
En MCP Team: La única herramienta que escribe,
propose_change, solo guarda una sugerencia. Nada cambia hasta que el dueño la aprueba, y no se aceptan más cuando hay 25 esperando.Trata lo que regresa como no confiable
Las descripciones y los resultados de las herramientas entran al contexto del modelo, y un texto escondido en ellos lo puede desviar. Eso es prompt injection; cuando se esconde en la descripción de una herramienta le dicen tool poisoning. Los clientes deben revisar los resultados antes de que los vea el modelo, y los servidores tienen que limpiar lo que devuelven.
En MCP Team: Los datos vienen de páginas web y de texto pegado, así que el servidor quita caracteres invisibles (de ancho cero, cambios de dirección, caracteres de etiqueta de Unicode), limita los largos y evita que un valor empiece su propio título. Sus instrucciones le dicen al modelo que los valores son datos, no instrucciones.
Lee las annotations como pistas, no como promesas
readOnlyHint,destructiveHint,idempotentHintyopenWorldHintdescriben lo que hace una herramienta. Un cliente no debe confiar en ellas si vienen de un servidor en el que no confía.En MCP Team: Cinco herramientas dicen que solo leen.
propose_changedice que escribe, pero que no destruye nada. Las seis dicen que se quedan dentro de la memoria de este negocio.Revisa cada entrada
Los servidores tienen que validar lo que reciben las herramientas, controlar el acceso y limitar la cantidad de llamadas. Por HTTP, tienen que revisar el header
Origin.En MCP Team: Los argumentos se validan contra el esquema de cada herramienta antes de que corra, y cada request tiene que traer un secreto válido.
11Fuentes
Verificado contra estas páginas de la especificación y su documentación en modelcontextprotocol.io (en inglés), revisión 2026-07-28 a menos que el enlace diga otra. Los ejemplos de MCP Team salen de correr el código de su servidor con un café de ejemplo.
- Panorama de la especificaciónspecification/
2026-07-28 - Cambios principales desde 2025-11-25specification/
2026-07-28/ changelog - Funciones en desusospecification/
2026-07-28/ deprecated - Arquitecturaspecification/
2026-07-28/ architecture - Protocolo base: mensajes, statelessness, _metaspecification/
2026-07-28/ basic - Versiones y compatibilidadspecification/
2026-07-28/ basic/ versioning - Descubrimiento: server/discoverspecification/
2026-07-28/ server/ discover - Ciclo de vida e initialize (2025-11-25)specification/
2025-11-25/ basic/ lifecycle - Transporte: stdiospecification/
2026-07-28/ basic/ transports/ stdio - Transporte: Streamable HTTPspecification/
2026-07-28/ basic/ transports/ streamable-http - Requests de varias vueltas (MRTR)specification/
2026-07-28/ basic/ patterns/ mrtr - Suscripcionesspecification/
2026-07-28/ basic/ patterns/ subscriptions - Herramientas (tools)specification/
2026-07-28/ server/ tools - Recursos (resources)specification/
2026-07-28/ server/ resources - Promptsspecification/
2026-07-28/ server/ prompts - Elicitationspecification/
2026-07-28/ client/ elicitation - Samplingspecification/
2026-07-28/ client/ sampling - Rootsspecification/
2026-07-28/ client/ roots - Cachéspecification/
2026-07-28/ server/ utilities/ caching - Autorizaciónspecification/
2026-07-28/ basic/ authorization - Seguridad de la autorizaciónspecification/
2026-07-28/ basic/ authorization/ security-considerations - Esquema: ToolAnnotationsspecification/
2026-07-28/ schema#toolannotations - Docs: arquitectura, capa de datos y de transportedocs/
2026-07-28/ learn/ architecture - Docs: buenas prácticas de seguridaddocs/
2026-07-28/ tutorials/ security/ security_best_practices - Docs: seguridad de servidores locales, prompt injection y tool poisoningdocs/
2026-07-28/ tutorials/ security/ local-server-security - Docs: buenas prácticas para clientes, resultados como entrada no confiabledocs/
2026-07-28/ develop/ clients/ client-best-practices
Míralo con tu propio negocio
Pega tu página web y mira cómo preparamos la memoria de tu negocio. Gratis, sin registrarte.
¿Quieres la IA conectada a tus propias herramientas? Habla con nosotros →