{"schemaVersion":1,"id":"https://lucioduran.com/es/projects/mcp-contract-harness","url":"https://lucioduran.com/es/projects/mcp-contract-harness","title":"MCP Contract Harness","description":"Servidor MCP de solo lectura y clientes independientes para comprobar negociación, paginación, errores y cancelación por stdio, con mensajes reales e informes reproducibles.","language":"es","datePublished":"2026-10-21","dateModified":"2026-10-21","contentFormat":"text/markdown","content":"[Proyectos](<https://lucioduran.com/es/projects>) / MCP Contract Harness\n\n# MCP Contract Harness\n\nServidor MCP de solo lectura y clientes independientes para comprobar negociación, paginación, errores y cancelación por stdio, con mensajes reales e informes reproducibles.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.9 / Node 24.8.0 / MCP 2025-06-18 · Licencia: [MIT](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/LICENSE>)\n\nFicha publicada: 2026-10-21 · Ficha actualizada: 2026-10-21\n\n[Repositorio](<https://github.com/lucioduran/mcp-contract-harness>) · [Informe de clientes](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/report.json>)\n\n## Problema y utilidad para agentes\n\nUn initialize exitoso no demuestra que una integración maneje la segunda página, una cancelación o un error. El proyecto comprueba esos contratos contra una versión concreta de MCP y conserva los mensajes intercambiados.\n\nUn agente necesita saber qué herramientas existen, recuperar recursos completos y distinguir errores de protocolo de errores de ejecución. Esta implementación hace observables esos límites mediante clientes y trazas de transporte.\n\n## Arquitectura\n\n1. **Servidor acotado.** Un servidor escrito con la biblioteca estándar de Python implementa un subconjunto de MCP 2025-06-18 sobre JSON-RPC por stdio. Expone tres notas ficticias y dos herramientas de lectura, sin acceso a archivos ni a la red.\n2. **Tres clientes.** Un cliente Python propio, el SDK oficial Python 2.3.0 y el SDK oficial TypeScript 1.32.1 se conectan al mismo servidor. Los clientes SDK negocian desde 2025-11-25 a la versión soportada.\n3. **Registro de mensajes.** Un proxy registra las líneas reales de los clientes SDK antes de reenviarlas. El cliente propio registra su transporte por separado. Las trazas conservan dirección y mensajes JSON-RPC.\n4. **Validación del contrato.** Un verificador adicional comprueba correlación, cadenas de cursores, cancelaciones sin respuesta y un ping posterior contestado. Los errores de herramienta usan isError; los de protocolo usan errores JSON-RPC.\n\n- [Diseño y fuentes del protocolo](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/design.md>)\n- [Contrato MCP y errores](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/contract.md>)\n- [Implementación del servidor](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/server.py>)\n- [Verificador de mensajes](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/clients/evidence.py>)\n\n## Qué demuestra\n\n- Implementación de un contrato MCP versionado sin depender de un SDK en el servidor.\n- Interoperabilidad medida con tres clientes, con cobertura declarada por cliente y mensajes inspeccionables.\n- Validación de casos negativos, paginación y cancelación más allá de una inicialización exitosa.\n\n## Resultados publicados\n\nEl informe publicado registra un servidor local ejercitado por tres clientes. El cliente propio completó 13 escenarios y cada cliente SDK completó ocho. Los tres negociaron MCP 2025-06-18.\n\nLa ejecución registrada usa Python 3.11.9 y Node 24.8.0 en un Intel Xeon W-3223. Todos los clientes recorren páginas de recursos y herramientas, leen una nota, obtienen resultados y errores, prueban un cursor inválido y cancelan una operación antes de enviar otro ping.\n\n### Ejecución registrada por cliente\n\n| Cliente | Versión | Controles | Mensajes | Protocolo |\n| --- | --- | --- | --- | --- |\n| Referencia propia | 0.1.0 | 13 | 34 | 2025-06-18 |\n| SDK oficial Python | 2.3.0 | 8 | 23 | 2025-06-18 |\n| SDK oficial TypeScript | 1.32.1 | 8 | 23 | 2025-06-18 |\n\nSon escenarios fijos de corrección sobre un subconjunto stdio. Los 13, 8 y 8 controles no son la misma cobertura ni un ranking de clientes. El resultado no certifica conformidad completa con MCP ni compatibilidad con hosts gráficos.\n\nLa matriz detalla controles que solo ejecuta el cliente propio: errores antes de inicializar, método y recurso desconocidos, JSON inválido y cancelaciones desconocidas. [Matriz de interoperabilidad y alcance](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/interoperability.md>).\n\nLas pruebas negativas documentadas alteran una página, la versión negociada, una respuesta duplicada y una respuesta a una petición cancelada. El informe de clientes no es una medición estadística de detección de defectos. [Matriz de interoperabilidad y alcance](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/interoperability.md>).\n\n## Reproducir\n\nEl servidor y el cliente propio usan la biblioteca estándar de Python. La reproducción con los SDK requiere Python 3.11.9, Node 24.8.0, npm 11.6.0 y los archivos lock del repositorio. No necesita modelos, cuentas ni APIs pagas.\n\nEl primer comando ejecuta el cliente propio contra un subproceso real. La reproducción completa instala dependencias fijadas, verifica las trazas guardadas y genera nuevas en un directorio libre. No uses Python con -O: los clientes usan assertions de contrato.\n\n### Ejecutar el cliente propio\n\n```\ngit clone https://github.com/lucioduran/mcp-contract-harness.git\ncd mcp-contract-harness\ngit checkout 44e77c071525127cd7e9ef5008b1b9f41e02ad07\npython -m clients.raw\n```\n\n### Reproducir los tres clientes\n\n```\npython -m venv .venv\n. .venv/bin/activate\npython -m pip install --require-hashes -r requirements-dev.lock\nnpm ci --ignore-scripts\npython -m clients.reproduce verify --output results/reference\npython -m clients.reproduce run --output build/reproduced\npython -m clients.reproduce verify --output build/reproduced\n```\n\n## Alcance y límites\n\n- No implementa HTTP, OAuth, subscriptions, prompts, sampling, elicitation, progress ni plantillas de recursos. No es una certificación MCP.\n- No se probaron ChatGPT, Claude Desktop, IDEs ni otros hosts gráficos. La compatibilidad con SDKs no demuestra compatibilidad con esos hosts.\n- La cancelación usa una demora deliberada de 400 ms y una ventana de silencio de al menos 600 ms. No prueba todas las carreras de planificación ni ausencia de fugas bajo carga.\n- Hay límites de 64 KiB por mensaje, 32 solicitudes activas y 10.000 identificadores por sesión. No se evaluaron rendimiento, backpressure, fuzzing exhaustivo ni agotamiento adversarial de recursos.\n- Las anotaciones de herramientas son descriptivas. La restricción real viene de leer un catálogo compilado; no hay una auditoría de seguridad ni un sandbox para herramientas arbitrarias.\n- Las trazas y hashes permiten inspeccionar consistencia. No autentican quién realizó la medición ni constituyen revisión independiente.\n\n- [Model Context Protocol e integración de herramientas](<https://lucioduran.com/es/blog/model-context-protocol-mcp-ai-integration>)\n\n## Fuentes y revisión\n\nLos valores de esta ficha provienen del informe enlazado. No son una medición en vivo. El informe conserva la revisión ejecutada; la revisión consultada incluye la publicación posterior de ese informe.\n\n- Revisión consultada: [` 44e77c071525127cd7e9ef5008b1b9f41e02ad07 `](<https://github.com/lucioduran/mcp-contract-harness/commit/44e77c071525127cd7e9ef5008b1b9f41e02ad07>)\n- Revisión registrada por el experimento: [` 781f24d4188cae00d231460ccce04638f877f33c `](<https://github.com/lucioduran/mcp-contract-harness/commit/781f24d4188cae00d231460ccce04638f877f33c>)\n- Fecha del informe (UTC): 2026-10-21T21:33:32.334799+00:00\n- [Catálogo de notas ficticias](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/catalog.py>) SHA-256: ` 163b61136fba3454add6694d38492f6ee6b899c34864f4c10b971faaab720fdc `\n\n- [README](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/README.md>)\n- [Diseño y fuentes del protocolo](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/design.md>)\n- [Contrato MCP y errores](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/contract.md>)\n- [Matriz de interoperabilidad y alcance](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/interoperability.md>)\n- [Informe de clientes](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/report.json>)\n- [Mensajes del cliente propio](<https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/raw.jsonl>)\n- [Mensajes del SDK Python](<https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/python.jsonl>)\n- [Mensajes del SDK TypeScript](<https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/typescript.jsonl>)\n- [Implementación del servidor](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/server.py>)\n- [Catálogo de notas ficticias](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/catalog.py>)\n- [Verificador de mensajes](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/clients/evidence.py>)\n- [Licencia MIT](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/LICENSE>)","headings":[{"level":1,"text":"MCP Contract Harness","url":"https://lucioduran.com/es/projects/mcp-contract-harness#title"},{"level":2,"text":"Problema y utilidad para agentes","url":"https://lucioduran.com/es/projects/mcp-contract-harness#problem"},{"level":2,"text":"Arquitectura","url":"https://lucioduran.com/es/projects/mcp-contract-harness#architecture"},{"level":2,"text":"Qué demuestra","url":"https://lucioduran.com/es/projects/mcp-contract-harness#demonstrates"},{"level":2,"text":"Resultados publicados","url":"https://lucioduran.com/es/projects/mcp-contract-harness#results"},{"level":3,"text":"Ejecución registrada por cliente","url":"https://lucioduran.com/es/projects/mcp-contract-harness#results-interop"},{"level":2,"text":"Reproducir","url":"https://lucioduran.com/es/projects/mcp-contract-harness#reproduce"},{"level":3,"text":"Ejecutar el cliente propio","url":"https://lucioduran.com/es/projects/mcp-contract-harness#reproduce-raw"},{"level":3,"text":"Reproducir los tres clientes","url":"https://lucioduran.com/es/projects/mcp-contract-harness#reproduce-all"},{"level":2,"text":"Alcance y límites","url":"https://lucioduran.com/es/projects/mcp-contract-harness#scope"},{"level":2,"text":"Fuentes y revisión","url":"https://lucioduran.com/es/projects/mcp-contract-harness#sources"}],"sections":[{"heading":"MCP Contract Harness","level":1,"url":"https://lucioduran.com/es/projects/mcp-contract-harness","content":"[Proyectos](<https://lucioduran.com/es/projects>) / MCP Contract Harness"},{"heading":"MCP Contract Harness","level":1,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#title","content":"Servidor MCP de solo lectura y clientes independientes para comprobar negociación, paginación, errores y cancelación por stdio, con mensajes reales e informes reproducibles.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.9 / Node 24.8.0 / MCP 2025-06-18 · Licencia: [MIT](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/LICENSE>)\n\nFicha publicada: 2026-10-21 · Ficha actualizada: 2026-10-21\n\n[Repositorio](<https://github.com/lucioduran/mcp-contract-harness>) · [Informe de clientes](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/report.json>)"},{"heading":"Problema y utilidad para agentes","level":2,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#problem","content":"Un initialize exitoso no demuestra que una integración maneje la segunda página, una cancelación o un error. El proyecto comprueba esos contratos contra una versión concreta de MCP y conserva los mensajes intercambiados.\n\nUn agente necesita saber qué herramientas existen, recuperar recursos completos y distinguir errores de protocolo de errores de ejecución. Esta implementación hace observables esos límites mediante clientes y trazas de transporte."},{"heading":"Arquitectura","level":2,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#architecture","content":"1. **Servidor acotado.** Un servidor escrito con la biblioteca estándar de Python implementa un subconjunto de MCP 2025-06-18 sobre JSON-RPC por stdio. Expone tres notas ficticias y dos herramientas de lectura, sin acceso a archivos ni a la red.\n2. **Tres clientes.** Un cliente Python propio, el SDK oficial Python 2.3.0 y el SDK oficial TypeScript 1.32.1 se conectan al mismo servidor. Los clientes SDK negocian desde 2025-11-25 a la versión soportada.\n3. **Registro de mensajes.** Un proxy registra las líneas reales de los clientes SDK antes de reenviarlas. El cliente propio registra su transporte por separado. Las trazas conservan dirección y mensajes JSON-RPC.\n4. **Validación del contrato.** Un verificador adicional comprueba correlación, cadenas de cursores, cancelaciones sin respuesta y un ping posterior contestado. Los errores de herramienta usan isError; los de protocolo usan errores JSON-RPC.\n\n- [Diseño y fuentes del protocolo](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/design.md>)\n- [Contrato MCP y errores](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/contract.md>)\n- [Implementación del servidor](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/server.py>)\n- [Verificador de mensajes](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/clients/evidence.py>)"},{"heading":"Qué demuestra","level":2,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#demonstrates","content":"- Implementación de un contrato MCP versionado sin depender de un SDK en el servidor.\n- Interoperabilidad medida con tres clientes, con cobertura declarada por cliente y mensajes inspeccionables.\n- Validación de casos negativos, paginación y cancelación más allá de una inicialización exitosa."},{"heading":"Resultados publicados","level":2,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#results","content":"El informe publicado registra un servidor local ejercitado por tres clientes. El cliente propio completó 13 escenarios y cada cliente SDK completó ocho. Los tres negociaron MCP 2025-06-18.\n\nLa ejecución registrada usa Python 3.11.9 y Node 24.8.0 en un Intel Xeon W-3223. Todos los clientes recorren páginas de recursos y herramientas, leen una nota, obtienen resultados y errores, prueban un cursor inválido y cancelan una operación antes de enviar otro ping."},{"heading":"Ejecución registrada por cliente","level":3,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#results-interop","content":"| Cliente | Versión | Controles | Mensajes | Protocolo |\n| --- | --- | --- | --- | --- |\n| Referencia propia | 0.1.0 | 13 | 34 | 2025-06-18 |\n| SDK oficial Python | 2.3.0 | 8 | 23 | 2025-06-18 |\n| SDK oficial TypeScript | 1.32.1 | 8 | 23 | 2025-06-18 |\n\nSon escenarios fijos de corrección sobre un subconjunto stdio. Los 13, 8 y 8 controles no son la misma cobertura ni un ranking de clientes. El resultado no certifica conformidad completa con MCP ni compatibilidad con hosts gráficos.\n\nLa matriz detalla controles que solo ejecuta el cliente propio: errores antes de inicializar, método y recurso desconocidos, JSON inválido y cancelaciones desconocidas. [Matriz de interoperabilidad y alcance](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/interoperability.md>).\n\nLas pruebas negativas documentadas alteran una página, la versión negociada, una respuesta duplicada y una respuesta a una petición cancelada. El informe de clientes no es una medición estadística de detección de defectos. [Matriz de interoperabilidad y alcance](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/interoperability.md>)."},{"heading":"Reproducir","level":2,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#reproduce","content":"El servidor y el cliente propio usan la biblioteca estándar de Python. La reproducción con los SDK requiere Python 3.11.9, Node 24.8.0, npm 11.6.0 y los archivos lock del repositorio. No necesita modelos, cuentas ni APIs pagas.\n\nEl primer comando ejecuta el cliente propio contra un subproceso real. La reproducción completa instala dependencias fijadas, verifica las trazas guardadas y genera nuevas en un directorio libre. No uses Python con -O: los clientes usan assertions de contrato."},{"heading":"Ejecutar el cliente propio","level":3,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#reproduce-raw","content":"```\ngit clone https://github.com/lucioduran/mcp-contract-harness.git\ncd mcp-contract-harness\ngit checkout 44e77c071525127cd7e9ef5008b1b9f41e02ad07\npython -m clients.raw\n```"},{"heading":"Reproducir los tres clientes","level":3,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#reproduce-all","content":"```\npython -m venv .venv\n. .venv/bin/activate\npython -m pip install --require-hashes -r requirements-dev.lock\nnpm ci --ignore-scripts\npython -m clients.reproduce verify --output results/reference\npython -m clients.reproduce run --output build/reproduced\npython -m clients.reproduce verify --output build/reproduced\n```"},{"heading":"Alcance y límites","level":2,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#scope","content":"- No implementa HTTP, OAuth, subscriptions, prompts, sampling, elicitation, progress ni plantillas de recursos. No es una certificación MCP.\n- No se probaron ChatGPT, Claude Desktop, IDEs ni otros hosts gráficos. La compatibilidad con SDKs no demuestra compatibilidad con esos hosts.\n- La cancelación usa una demora deliberada de 400 ms y una ventana de silencio de al menos 600 ms. No prueba todas las carreras de planificación ni ausencia de fugas bajo carga.\n- Hay límites de 64 KiB por mensaje, 32 solicitudes activas y 10.000 identificadores por sesión. No se evaluaron rendimiento, backpressure, fuzzing exhaustivo ni agotamiento adversarial de recursos.\n- Las anotaciones de herramientas son descriptivas. La restricción real viene de leer un catálogo compilado; no hay una auditoría de seguridad ni un sandbox para herramientas arbitrarias.\n- Las trazas y hashes permiten inspeccionar consistencia. No autentican quién realizó la medición ni constituyen revisión independiente.\n\n- [Model Context Protocol e integración de herramientas](<https://lucioduran.com/es/blog/model-context-protocol-mcp-ai-integration>)"},{"heading":"Fuentes y revisión","level":2,"url":"https://lucioduran.com/es/projects/mcp-contract-harness#sources","content":"Los valores de esta ficha provienen del informe enlazado. No son una medición en vivo. El informe conserva la revisión ejecutada; la revisión consultada incluye la publicación posterior de ese informe.\n\n- Revisión consultada: [` 44e77c071525127cd7e9ef5008b1b9f41e02ad07 `](<https://github.com/lucioduran/mcp-contract-harness/commit/44e77c071525127cd7e9ef5008b1b9f41e02ad07>)\n- Revisión registrada por el experimento: [` 781f24d4188cae00d231460ccce04638f877f33c `](<https://github.com/lucioduran/mcp-contract-harness/commit/781f24d4188cae00d231460ccce04638f877f33c>)\n- Fecha del informe (UTC): 2026-10-21T21:33:32.334799+00:00\n- [Catálogo de notas ficticias](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/catalog.py>) SHA-256: ` 163b61136fba3454add6694d38492f6ee6b899c34864f4c10b971faaab720fdc `\n\n- [README](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/README.md>)\n- [Diseño y fuentes del protocolo](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/design.md>)\n- [Contrato MCP y errores](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/contract.md>)\n- [Matriz de interoperabilidad y alcance](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/interoperability.md>)\n- [Informe de clientes](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/report.json>)\n- [Mensajes del cliente propio](<https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/raw.jsonl>)\n- [Mensajes del SDK Python](<https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/python.jsonl>)\n- [Mensajes del SDK TypeScript](<https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/typescript.jsonl>)\n- [Implementación del servidor](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/server.py>)\n- [Catálogo de notas ficticias](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/catalog.py>)\n- [Verificador de mensajes](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/clients/evidence.py>)\n- [Licencia MIT](<https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/LICENSE>)"}],"links":[{"text":"Proyectos","url":"https://lucioduran.com/es/projects"},{"text":"Lucio Durán","url":"https://lucioduran.com/es"},{"text":"MIT","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/LICENSE"},{"text":"Repositorio","url":"https://github.com/lucioduran/mcp-contract-harness"},{"text":"Informe de clientes","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/report.json"},{"text":"Diseño y fuentes del protocolo","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/design.md"},{"text":"Contrato MCP y errores","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/contract.md"},{"text":"Implementación del servidor","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/server.py"},{"text":"Verificador de mensajes","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/clients/evidence.py"},{"text":"Matriz de interoperabilidad y alcance","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/interoperability.md"},{"text":"Model Context Protocol e integración de herramientas","url":"https://lucioduran.com/es/blog/model-context-protocol-mcp-ai-integration"},{"text":"44e77c071525127cd7e9ef5008b1b9f41e02ad07","url":"https://github.com/lucioduran/mcp-contract-harness/commit/44e77c071525127cd7e9ef5008b1b9f41e02ad07"},{"text":"781f24d4188cae00d231460ccce04638f877f33c","url":"https://github.com/lucioduran/mcp-contract-harness/commit/781f24d4188cae00d231460ccce04638f877f33c"},{"text":"Catálogo de notas ficticias","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/catalog.py"},{"text":"README","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/README.md"},{"text":"Mensajes del cliente propio","url":"https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/raw.jsonl"},{"text":"Mensajes del SDK Python","url":"https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/python.jsonl"},{"text":"Mensajes del SDK TypeScript","url":"https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/typescript.jsonl"},{"text":"Licencia MIT","url":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/LICENSE"}],"structuredData":[{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://lucioduran.com/es/projects/mcp-contract-harness#page","url":"https://lucioduran.com/es/projects/mcp-contract-harness","name":"MCP Contract Harness","description":"Servidor MCP de solo lectura y clientes independientes para comprobar negociación, paginación, errores y cancelación por stdio, con mensajes reales e informes reproducibles.","inLanguage":"es","datePublished":"2026-10-21","dateModified":"2026-10-21","author":{"@id":"https://lucioduran.com/#person"},"mainEntity":{"@id":"https://lucioduran.com/projects/mcp-contract-harness#software"}},{"@type":"SoftwareSourceCode","@id":"https://lucioduran.com/projects/mcp-contract-harness#software","name":"MCP Contract Harness","description":"Servidor MCP de solo lectura y clientes independientes para comprobar negociación, paginación, errores y cancelación por stdio, con mensajes reales e informes reproducibles.","url":"https://lucioduran.com/es/projects/mcp-contract-harness","codeRepository":"https://github.com/lucioduran/mcp-contract-harness","programmingLanguage":"Python / JavaScript","runtimePlatform":"Python 3.11.9 / Node 24.8.0 / MCP 2025-06-18","license":"https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/LICENSE","version":"44e77c071525127cd7e9ef5008b1b9f41e02ad07","identifier":{"@type":"PropertyValue","propertyID":"git-commit","value":"44e77c071525127cd7e9ef5008b1b9f41e02ad07"},"author":{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com"},"isAccessibleForFree":true,"citation":["https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/README.md","https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/design.md","https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/contract.md","https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/docs/interoperability.md","https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/report.json","https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/raw.jsonl","https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/python.jsonl","https://raw.githubusercontent.com/lucioduran/mcp-contract-harness/44e77c071525127cd7e9ef5008b1b9f41e02ad07/results/reference/typescript.jsonl","https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/server.py","https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/mcp_contract/catalog.py","https://github.com/lucioduran/mcp-contract-harness/blob/44e77c071525127cd7e9ef5008b1b9f41e02ad07/clients/evidence.py"]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Proyectos","item":"https://lucioduran.com/es/projects"},{"@type":"ListItem","position":2,"name":"MCP Contract Harness","item":"https://lucioduran.com/es/projects/mcp-contract-harness"}]}]}],"contentHash":"6ab8bf50b263d0e53346da281b224fc7fb38c4faa07dad7fa6b951dc22985a7a","provenance":{"method":"Deterministic serialization of the server-rendered main element","source":"https://lucioduran.com/es/projects/mcp-contract-harness","hashAlgorithm":"sha256","hashScope":"JSON document fields before contentHash and provenance","sourceHTMLBytes":49914,"contentBytes":9858}}
