Ian Chou's Blog

stdin 到底是什麼 Port? (Stdio vs TCP/IP)

stdin 到底是什麼 Port? (Stdio vs TCP/IP)

這是一個非常好的系統架構問題!

直接回答您的問題:stdin 完全沒有 Port(連接埠)的概念,也不是廣播頻這。

並不是「所有開 stdin 的都收得到」,而是**「只有被特定的父行程(Parent Process)連接的那一條管線(Pipe)才收得到」**。

這裡用一個比喻跟技術細節來解釋:

1. 比喻:廣播電台 vs. 傳聲筒


2. 技術運作原理:Process Spawning & Pipes

當您在 Cursor 或 Claude Desktop 設定這個 MCP Server 時,背後發生了這件事:

  1. 啟動 (Spawn):
    Client (Host) 執行類似這樣的指令:child_process.spawn("bun", ["run", "server.ts"])
    這時,您的 Server 作為 子行程 (Child Process) 被創造出來。

  2. 管線連接 (Piping):
    作業系統會建立三條專屬的「管線」,直接對接這兩個程式:

    • Client 的寫入端 ➡️ 連接到 ➡️ Server 的 stdin (fd 0)
    • Server 的 stdout (fd 1) ➡️ 連接到 ➡️ Client 的讀取端
    • Server 的 stderr (fd 2) ➡️ 連接到 ➡️ Client 的錯誤日誌讀取端
  3. 隔離 (Isolation):
    即使您的電腦上有 10 個不同的 MCP Server 同時在跑,它們每一個都有自己獨立的 stdin。Cursor 傳給 Server A 的訊息,是透過 Server A 專屬的 Handle 寫入的,Server B 絕對收不到。

3. 為什麼 MCP 預設選用 Stdio 而不是 Port?

對於 Local 的 AI 工具來說,Stdio 有巨大的優勢:

  1. 沒有 Port 衝突:您不需要擔心 8080 被佔用了要改 8081。您可以同時開 50 個 MCP Server,它們互不干擾。
  2. 安全性 (Security):因為沒有開 Port,外部網路(Hacker)無法掃描或攻擊您的 Server。只有啟動它的那個應用程式(Cursor/Claude)能跟它溝通。
  3. 生命週期管理:當 Client (Cursor) 關閉時,因為管線斷了,OS 會自動發送訊號殺死您的 Server 行程。您不需要擔心 Server 變成殭屍行程在背景偷跑。

總結

stdin 是一條專屬的、點對點的私密通道


由於 Stdio 這種「私密通道」的特性,除錯(Debug)會比較麻煩(因為您看不見通道裡的內容)。