stdin 到底是什麼 Port? (Stdio vs TCP/IP)
stdin 到底是什麼 Port? (Stdio vs TCP/IP)
這是一個非常好的系統架構問題!
直接回答您的問題:stdin 完全沒有 Port(連接埠)的概念,也不是廣播頻這。
並不是「所有開 stdin 的都收得到」,而是**「只有被特定的父行程(Parent Process)連接的那一條管線(Pipe)才收得到」**。
這裡用一個比喻跟技術細節來解釋:
1. 比喻:廣播電台 vs. 傳聲筒
-
TCP/IP (Port) 就像是 「廣播電台」或「門牌號碼」。
- 如果你開了
localhost:3000,就像是你家大門開著,只要知道地址(IP)和門牌(Port)的人,都可以過來喊話。 - 這需要處理防火牆、端口衝突(Port already in use)等問題。
- 如果你開了
-
Stdio (Stdin/Stdout) 就像是 「兩個人用一條線連著的紙杯傳聲筒」。
- MCP Client (例如 Cursor) 是「父行程」,它手裡拿著傳聲筒的一端。
- MCP Server (您的這段 code) 是「子行程」,是 Cursor 啟動的,手裡拿著傳聲筒的另一端。
- 這條線是 私密的、實體的(在記憶體中)、一對一的。
- 旁邊路人(其他 Process)完全聽不到,也無法插嘴。
2. 技術運作原理:Process Spawning & Pipes
當您在 Cursor 或 Claude Desktop 設定這個 MCP Server 時,背後發生了這件事:
-
啟動 (Spawn):
Client (Host) 執行類似這樣的指令:child_process.spawn("bun", ["run", "server.ts"])。
這時,您的 Server 作為 子行程 (Child Process) 被創造出來。 -
管線連接 (Piping):
作業系統會建立三條專屬的「管線」,直接對接這兩個程式:- Client 的寫入端 ➡️ 連接到 ➡️ Server 的
stdin(fd 0) - Server 的
stdout(fd 1) ➡️ 連接到 ➡️ Client 的讀取端 - Server 的
stderr(fd 2) ➡️ 連接到 ➡️ Client 的錯誤日誌讀取端
- Client 的寫入端 ➡️ 連接到 ➡️ Server 的
-
隔離 (Isolation):
即使您的電腦上有 10 個不同的 MCP Server 同時在跑,它們每一個都有自己獨立的stdin。Cursor 傳給 Server A 的訊息,是透過 Server A 專屬的 Handle 寫入的,Server B 絕對收不到。
3. 為什麼 MCP 預設選用 Stdio 而不是 Port?
對於 Local 的 AI 工具來說,Stdio 有巨大的優勢:
- 沒有 Port 衝突:您不需要擔心
8080被佔用了要改8081。您可以同時開 50 個 MCP Server,它們互不干擾。 - 安全性 (Security):因為沒有開 Port,外部網路(Hacker)無法掃描或攻擊您的 Server。只有啟動它的那個應用程式(Cursor/Claude)能跟它溝通。
- 生命週期管理:當 Client (Cursor) 關閉時,因為管線斷了,OS 會自動發送訊號殺死您的 Server 行程。您不需要擔心 Server 變成殭屍行程在背景偷跑。
總結
stdin 是一條專屬的、點對點的私密通道。
- 有 Port 嗎? 沒有。
- 有 Channel ID 嗎? 它的 ID 就是作業系統層級的 File Descriptor (FD),通常對應到數字
0。 - 大家都能收到嗎? 不行,只有「啟動這段程式碼的主程式」能發送數據給它。
由於 Stdio 這種「私密通道」的特性,除錯(Debug)會比較麻煩(因為您看不見通道裡的內容)。