Introducción del modelo de MCP: muestreo de migración y MRTR de apátridas
input_requiredEl cliente retoma la solicitud original con la salida del modelo. El bucle de razonamiento se vuelve explícito, limitado y sin estado en la capa de protocolo.Type: Build
Languages: Python
Prerequisites: Phase 13 · 07 (MCP server), Phase 13 · 10 (resources and prompts)
Time: ~75 minutes
Objetivos de aprendizaje
- Explica por qué la muestreo se ha desactualizado en MCP 2026-07-28 y elige el modelo de integración directa predeterminado para los nuevos servidores.
- Implementar un flujo de trabajo de compatibilidad que lleve
sampling/createMessagea través de las solicitudes de viajes múltiples y redondos (MRTR). - Coloque la revisión del protocolo y las capacidades del cliente en cada solicitud
_metaObjeto. - Regreso .
resultType: "input_required"y volver a probar el método original con un nuevo ID JSON-RPC. - Protección de la integridad
requestStatey se vinculen al principio, método, argumentos y vencimiento. - Los bucles con modelo de ayuda ligada con controles de capacidad, aprobación, validación de respuesta y un límite redondo.
La decisión antes del Protocolo
Una herramienta como summarize_repoNecesita dos tipos de trabajo:
- Trabajo determinista: lista de archivos, lectura de archivos permitidos, validación de caminos y ensamblaje de contenido.
- Trabajo de modelo: elegir archivos representativos y sintetizar el resumen.
Ahora tienes dos arquitecturas válidas.
Nuevo servidor: se integra directamente con un proveedor de modelos
Este es el estándar actual. El servidor posee la selección de modelos, credenciales, presupuestos, retemplazos y observabilidad.tools/callel resultado para el cliente de MCP.
Elige esto cuando el servidor ya sea un servicio alojado o cuando el comportamiento predecible del modelo sea más importante que el uso del modelo del host.
Flujo de trabajo de muestreo existente: migrarlo a MRTR
El muestreo todavía existe durante su ventana de deprecación. Un servidor dirigido a 2026-07-28 no puede enviar una transmisión en vivo sampling/createMessageEn cambio, el cliente debe incorporar esa solicitud en unInputRequiredResult¿ Qué ?
Elegir este camino de compatibilidad sólo cuando se utiliza el modelo del cliente y las credenciales es un requisito real del producto.
El contrato de apatrida
El protocolo de julio de 2026 no tieneinitializeel intercambio, no notifications/initialized, y no .Mcp-Session-IdCada solicitud contiene la información que antes vivía en el apretón de manos:
json{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "summarize_repo",
"arguments": {"audience": "developer"},
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {"sampling": {}},
"io.modelcontextprotocol/clientInfo": {
"name": "lesson-client",
"version": "1.0.0"
}
}
}
}El servidor valida la revisión en cada solicitud. Una versión que no está disponible o sin cadena es un parámetro inválido.-32602Una cadena no soportada devuelve .-32022con datos exactos {"supported":["2026-07-28"],"requested":"<client version>"}. Una capacidad de muestreo faltante regresa .-32021condata.requiredCapabilitiesse fija en {"sampling":{}}¿ Qué ?
Un sobre sin un JSON-RPC idEl receptor puede procesarlo, pero no emite una respuesta de éxito ni una respuesta de error. Un adaptador HTTP transmitible devuelve 202 Acceptedsin organismo para una notificación aceptada.
El servidor también implementa server/discovercon el exacto supportedVersionsclave, capacidades, ttlMs, y cacheScopepara que un cliente pueda aprender y almacenar en caché el contrato del servidor antes de llamar a una herramienta.tools, el servidor también implementa obligatorio tools/listEs determinista .summarize_repoel descriptor incluye un objeto válido inputSchema¿ Qué ?resultType: "complete", metadatos de identidad del servidor, y pistas de caché público.
Cada resultado moderno exitoso tiene un discriminador:
resultType: "complete"significa que la operación ha terminado.resultType: "input_required"significa que el cliente debe cumplir con las solicitudes incorporadas y volver a intentarlo.- Las extensiones pueden definir tipos de resultados adicionales.
"task"En la Lección 13.
Una ronda de MRTR
El servidor no puede llamar al cliente mientras se maneja la solicitud. En su lugar devuelve este resultado:
json{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resultType": "input_required",
"inputRequests": {
"pick_files": {
"method": "sampling/createMessage",
"params": {
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "Choose three representative files and return a JSON array."
}
}
],
"systemPrompt": "Return only the requested value.",
"modelPreferences": {
"costPriority": 0.8,
"intelligencePriority": 0.2
},
"maxTokens": 400
}
}
},
"requestState": "opaque-integrity-protected-value"
}
}El cliente verifica que admite la muestra, aplica sus políticas de aprobación y modelo y obtiene una respuesta de modelo. Luego envía una nueva solicitud con un id JSON-RPC diferente:
json{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "summarize_repo",
"arguments": {"audience": "developer"},
"inputResponses": {
"pick_files": {
"role": "assistant",
"content": {
"type": "text",
"text": "[\"README.md\", \"server.py\", \"docs/intro.md\"]"
},
"model": "host-model",
"stopReason": "endTurn"
}
},
"requestState": "opaque-integrity-protected-value",
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {"sampling": {}}
}
}
}El retraso no es una continuación de una sesión de protocolo. Es una nueva solicitud que repite el método y los argumentos originales, añadiendo sólo los de la ronda actual inputResponses, y los ecos .requestStatebyte por byte.
El MRTR sólo está permitido en tools/call¿ Qué ?prompts/get, y resources/readUn servidor no debe regresar .input_requiredde métodos no relacionados.
Estado de la mayoría de las partes
Esta lección necesita dos modelos:
pick_filesdevuelve una matriz JSON.summarydevuelve la prosa final.
Cada retraso solo contiene las respuestas de esa ronda. El servidor, por lo tanto, pone la fase y los datos intermedios validados en la siguiente requestState¿ Qué ?
Tratar ese valor como controlado por el atacante. Firmar un nombre de fase crudo no es suficiente.
- el principal autenticado, no auto-informado
clientInfoEl artículo 1 - el método de origen;
- un resumen de los argumentos originales;
- una caducidad corta;
- la fase actual y los valores intermedios validados.
Utilice HMAC cuando no se requiere confidencialidad. Utilice cifrado autenticado cuando el cliente no debe leer el estado. Rechazar una firma mala, valor expirado, cambio de principal o argumentos cambiados con -32602¿ Qué ?
El cliente no debe analizar ni modificar requestStateSu único trabajo es hacer eco de la cuerda exacta en el retraso.
Las preferencias de modelo son indicios
costPriority¿ Qué ?speedPriority, y intelligencePriorityLas preferencias de la probabilidad de un cliente pueden ser ignoradas porque el cliente posee una política de modelo.
Mantenga .includeContextEn el"none"Si mantiene un flujo de muestreo heredado. Otros modos de contexto aumentan el riesgo de fugas y son en sí mismos desactualizados.
Las medidas de seguridad
El cliente es el límite de confianza para las solicitudes de muestreo integradas.
- Muestre al usuario lo que el servidor le pide al modelo cuando la política requiere aprobación.
- Un servidor malicioso puede crear un bucle de gasto de modelo.
- Valida cada respuesta de muestreo antes de usarla como un nombre de archivo, URL o entrada de herramienta.
- Limite los bytes y tokens por ronda.
- Rechazar una solicitud de entrada que no se declaró en las capacidades actuales del cliente.
- Mantenga la salida del modelo fuera de las decisiones de autorización.
- Registre el método de origen y la clave de entrada-solicitud sin registrar el contenido de la solicitud sensible.
clientInfoy serverInfoLos datos de identidad de los usuarios son metadatos de visualización y diagnóstico.
Construye el mismo
code/main.pyImplementa el flujo completo de dos rondas sin paquete de terceros:
server/discoverretornosupportedVersions, anuncia el soporte de herramientas, y devuelve sugerencias de caché.tools/listdevuelve un determinista, cachéablesummarize_repoDescriptor con un esquema de entrada de objeto.tools/callvalida los metadatos por solicitud.- El primer resultado se incorpora
sampling/createMessagepara la selección de archivos. - El primer retraso valida el resultado del modelo y incorpora una segunda solicitud.
- Protegida por HMAC
requestStatese realiza la fase entre las solicitudes independientes. - El resultado final utiliza
resultType: "complete"¿ Qué ?
El modelo de anfitrión falso hace que el ejemplo sea determinista.fake_host_modelLa máquina del lado del servidor debe permanecer determinista y testable.
Usalo
Desde la raíz del repositorio:
bashcd phases/13-tools-and-protocols/11-mcp-sampling/code
python3 main.py
python3 -m unittest discover tests -vLos puntos de control previstos:
- Discovery devuelve un resultado completo con
ttlMsycacheScope¿ Qué ? - El descubrimiento de herramientas devuelve el mismo descriptor clasificado con
resultType, identidad del servidor, y pistas de caché. - Capacidades faltantes y versiones no compatibles utilizan exacto
-32021y-32022datos de error. - Una notificación sin id no produce respuesta JSON-RPC.
- Los documentos de identificación de la solicitud son
[1, 2, 3], que demuestra que cada ronda de MRTR es independiente. - Los dos primeros resultados son:
input_required¿ Qué ? - El resultado final es
completey contiene los archivos seleccionados más un resumen. - Cambiar los argumentos originales en una nueva prueba falla en la verificación del estado de solicitud.
Envío
outputs/skill-sampling-loop-designer.mdEs un programa de migración que decide si se debe eliminar la muestreo a favor de la integración directa del modelo. Si se requiere compatibilidad, produce las rondas MRTR, la vinculación del estado, la puerta de capacidad, el presupuesto, la validación y el plan de eliminación.
Los ejercicios
- Cambiar la respuesta de selección de archivos a JSON inválido. Confirmar el servidor devuelve
-32602en lugar de confiar en la salida del modelo. - Cambiar
audienceExplique por qué el estado sellado bloquea la reutilización de las solicitudes cruzadas. - Añadir una tercera ronda que le pida al anfitrión que critique el resumen. Llevar el resumen anterior dentro del estado firmado y limitar todo el flujo en tres rondas.
- Elimine la muestreo reemplazando la llamada de regreso de host falso con un adaptador de modelo propiedad del servidor.
- Añadir una prueba de vencimiento utilizando un valor de estado que es un segundo después de su fecha límite.
Términos clave
| Term | Meaning in 2026-07-28 |
|---|---|
| Sampling | Deprecated feature that asks the client's model for a completion |
| MRTR | Stateless retry pattern for client input required during a request |
InputRequiredResult | Result with resultType: "input_required" |
inputRequests | Server-assigned map of embedded elicitation, sampling, or roots requests |
inputResponses | Current round's client results keyed like inputRequests |
requestState | Opaque server state echoed exactly by the client and verified by the server |
resultType | Required discriminator for modern MCP results |
| Direct model integration | Recommended replacement for new servers that need model inference |
| Capability gate | Rule that prevents sending an embedded request the client did not advertise |
| Loop budget | Maximum rounds, tokens, bytes, time, and spend allowed for the operation |
Compatibilidad con el legado
Un cliente fijado a 2025-11-25 puede seguir utilizando el antiguo servidor iniciado sampling/createMessageNo haga que el camino de sesión sea la arquitectura de un servidor 2026-07-28.
Los SDK oficiales pueden traducir modernos input_requiredEse shim es un límite de compatibilidad, no el permiso para añadir nueva lógica dependiente de la sesión.
Leer más
- MCP 2026-07-28 Multi Round-Trip Requests
- MCP 2026-07-28 changelog
- MCP Sampling deprecation
- MCP 2026-07-28 server discovery
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.