StdioTransport traps ("Negative value is not representable") when stdio is a socket, e.g. spawned by Node clients
Los mantenedores suelen responder en 2 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 73/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- swift
- Área
- backend-api-design
Línea de trabajo
Lee en Sources/MCP/Base/Transports/StdioTransport.swift el código alrededor de las líneas indicadas en setNonBlocking(fileDescriptor:) y restoreFlags. El issue incluye la conversión propuesta y un escenario reproducible de Node con socketpair; añade una prueba de regresión con socketpair para verificar que el transporte se conecta sin provocar un trap y ejecuta las pruebas de Swift pertinentes. Se considerará terminado cuando stdin/stdout respaldados por sockets ya no provoquen el trap por valor negativo.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
Since #297 (merged 2026-10-31, on main, not in 0.12.1), StdioTransport.connect() traps when stdin/stdout is a socket:
Fatal error: Negative value is not representable
Node's child_process.spawn with stdio: 'pipe' uses socketpairs on macOS, and fstat on a socket reports st_dev == -1. dev_t is signed (Int32 on Darwin), so UInt64(status.st_dev) traps. Every Node-based MCP client hits this: Claude Desktop and Claude Code both report "Connection closed" right after initialize.
Affected lines: StdioTransport.swift L147, L159–160. Symbolicated crash: StdioTransport.setNonBlocking(fileDescriptor:) (StdioTransport.swift:147) ← StdioTransport.connect() ← Server.start(transport:).
Repro (macOS)
Build any server using StdioTransport(), then:
// node repro.js /path/to/server
const p = require("child_process").spawn(process.argv[2], [], { stdio: ["pipe", "pipe", "inherit"] });
p.on("exit", (c, s) => console.log("exit", c, s)); // → exit null SIGTRAP
p.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: 0, method: "initialize",
params: { protocolVersion: "2025-06-18", capabilities: {}, clientInfo: { name: "n", version: "1" } } }) + "\n");
Shell pipes don't reproduce it (st_dev == 0), which is why terminal testing passes:
$ python3 -c "import os,socket; a,_=socket.socketpair(); r,_=os.pipe(); print(os.fstat(a.fileno()).st_dev, os.fstat(r).st_dev)"
-1 0
Fix
Convert by bit pattern instead of value (the values are only compared for identity):
-flags: flags, device: UInt64(status.st_dev), inode: UInt64(status.st_ino))
+flags: flags, device: UInt64(truncatingIfNeeded: status.st_dev), inode: UInt64(truncatingIfNeeded: status.st_ino))
(and the same in restoreFlags). Patch with this change: https://github.com/noisyneighborstudio/swift-sdk/commit/b7a26b8d887fda9389a81f0c5feaa34e3d7e8ff7. Happy to open a PR with it plus a socketpair regression test.
- Lenguaje dominante
- Swift
- Estrellas
- 1.6k
- Forks
- 270
- Merge medio
- 2 d 7 h
- PR fusionados (30 d)
- 15
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de modelcontextprotocol/swift-sdk
-
Value decoding changes data-URL-looking JSON strings into Value.dataPosiblemente ocupada @bitbemol la tomó hace 72 días. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
modelcontextprotocol/swift-sdk#277 ·
Los mantenedores suelen responder en 2 días
-
enhancement
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
modelcontextprotocol/swift-sdk#274 ·
Los mantenedores suelen responder en 2 días
-
`HTTPClientTransport` fails to build on Windows: `#if !os(Linux)` guards no longer match the `EventSource` platform conditionQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
modelcontextprotocol/swift-sdk#261 ·
Los mantenedores suelen responder en 2 días
-
Client.withBatch leaves per-request tasks pending when transport.send throwsPosiblemente ocupada @bbdu3 la tomó hace 1 día. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
modelcontextprotocol/swift-sdk#324 · 2 comentarios · 1 reacción ·
Los mantenedores suelen responder en 2 días
-
NetworkTransport drops a JSON message when a TCP receive contains a heartbeat followed by the messagePosiblemente ocupada @bbdu3 la tomó hace 4 días. Abiertobug
Dificultad 3/5 1-2 días Aptitud para principiantes 25/100
modelcontextprotocol/swift-sdk#322 ·
Los mantenedores suelen responder en 2 días
Todos los issues de modelcontextprotocol/swift-sdk
Issues similares
-
[java] TestClassWithoutTestCases: document that abstract classes and interfaces are not checkedAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 91/100
Los mantenedores suelen responder en 2 días
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
文件夹设置bugAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
joeseesun/qiaomu-jot#14 ·
Los mantenedores suelen responder en 1 día
-
30-minutes algorithm any-language beginner-friendly c community cpp csharp data-structures go good first issue hacktoberfest help wanted kotlin learning leetcode php ruby rust swift
Dificultad 2/5 Menos de una hora Aptitud para principiantes 85/100
Huerte/algo-solutions-python#211 ·
Los mantenedores suelen responder en 1 día
-
area: build-and-ci S3: minor
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
manaflow-ai/cmux#39902 ·
Los mantenedores suelen responder en 1 día