介紹

MCP 伺服器讓你連接自訂資料來源,並讓它們可在 Cursor 內使用。當你需要來自瀏覽器、資料庫,或錯誤與系統日誌等來源的上下文時特別實用。設定 MCP 伺服器很直覺,搭配 Cursor 可以很快完成。 在這份指南中,我們會帶你一步步打造一個用於 Postgres 的 MCP 伺服器。我們的目標是讓 Cursor 能直接對 Postgres 資料庫執行 SQL 查詢,並以結構化的方式揭露資料表綱要。
本教學著重於建立 MCP 伺服器的核心觀念與基礎。

什麼是 MCP 伺服器?

MCP 伺服器 是一個會與 Cursor 溝通並提供外部資料或動作存取的程序。它可以用多種方式實作,但在這裡我們會用最簡單的方法:一個透過 stdio(標準輸入/輸出串流)在你電腦本機執行的伺服器。這樣可以避免繁複的安全性考量,讓我們把重點放在 MCP 的邏輯本身。 MCP 最常見的使用情境之一是存取資料庫。當你在建立儀表板、執行分析或製作資料遷移時,通常需要查詢並檢視資料庫。我們的 Postgres MCP 伺服器會支援兩項核心能力:執行任意查詢,以及列出資料表結構。 雖然這兩個工作都能用純 SQL 完成,MCP 提供的功能會讓它們更強大且更通用。工具(tools)提供一種方式來公開動作,例如執行查詢;而資源(resources)則能用來分享標準化的脈絡,例如結構資訊。稍後在本指南中,我們也會看看提示(prompts),它能啟用更進階的工作流程。 在底層,我們會使用 postgres 的 npm 套件來對資料庫執行 SQL 陳述式。MCP SDK 會包覆這些呼叫,讓我們把 Postgres 的功能無縫整合進 Cursor。 【佔位圖:具備 tools 與 resources 的 MCP 伺服器示意圖】

如何建立 MCP Server

建立伺服器的第一步是設定一個新專案。先建立一個新資料夾並初始化一個 Bun 專案
> mkdir postgres-mcp-server
> Bun init
接著選擇 Blank 專案。樣板建立好之後,需要安裝必要的相依套件。zod 會用來在 MCP SDK 中定義 I/O 的結構(schema)
bun add postgres @modelcontextprotocol/sdk zod
接下來到各個函式庫的 repository,取得各自 README 檔案的原始內容連結。建置伺服器時會把這些當作參考脈絡 現在來定義伺服器的行為。為此,我們會建立 spec.md,並寫下高階目標
# Spec

- Allow defining DATABASE_URL through MCP env configuration
- Query postgres data through tool
  - By default, make it readonly
  - Allow write ops by setting ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Access tables as `resources`
- Use Zod for schema definitions
如你所見,這是一份相當輕量的規格。需要的話可以自由補上更多細節。配合 README 連結,我們會組出最終的提示詞
Read the following and follow @spec.md to understand what we want. All necesary dependeies are installed
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
有了這三個組件(規格、MCP SDK 文件,以及 Postgres 函式庫文件),我們就能用 Cursor 來腳手架伺服器實作。Cursor 會幫忙把各部分串接起來,產生把 MCP SDK 與 Postgres 連接起來的程式碼。 經過幾輪來回提示後,現在我們有了 MCP 伺服器的第一個版本。要試跑的話,可以使用 MCP Inspector
npx @modelcontextprotocol/inspector bun run index.ts

測試 MCP 伺服器

在完成初始實作後,我們可以用 MCP Inspector 來測試。Inspector 提供介面來查看伺服器對外提供的內容,並驗證工具與資源是否如預期運作。我們應該確認查詢能成功執行,且能正確回傳綱要(schema)資訊。 MCP Inspector 介面 當一切看起來都沒問題時,我們可以把伺服器連到 Cursor 本身,在真實環境中測試。此時,Cursor 會把 Postgres MCP 伺服器當成內建能力一樣使用,讓我們能直接查詢與檢視資料庫。

下一步

在本機透過 stdio 執行 MCP 伺服器是很好的起點,但團隊通常需要透過 MCP 伺服器共用同一個資料庫。在這種情境下,就有必要將 MCP 伺服器部署成集中式的 HTTP 服務。 將 MCP 伺服器部署起來,相較於各自獨立的 stdio 執行個體有幾個好處:
  • 共用資料庫存取: 多位團隊成員可以在 Cursor 中查詢同一個資料庫執行個體
  • 集中化設定: 綱要更新與權限變更在單一位置管理
  • 更強的安全性: 可實作正確的身分驗證、頻率限制與存取控制
  • 可觀測性: 全團隊的使用模式與效能指標都能被監控
要達成這點,你會把傳輸方式從 stdio 切換為 HTTP。 雖然我們不會涵蓋完整的設定流程,這裡有一段不錯的起始提示可以丟給 Cursor
Based on the existig MCP server, create a new file that implements the HTTP protocol.

Move shared logic to mcp-core, and name each transport implementation by name (mcp-server-stdio, mcp-server-http)

@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md 
最終成果可以在這裡看到:pg-mcp-server