介紹

MCP 伺服器能讓你連接自訂資料來源,並在 Cursor 裡使用。當你需要來自瀏覽器、資料庫,或錯誤與系統日誌等來源的上下文時,這特別實用。設定 MCP 伺服器相當簡單,搭配 Cursor 就能很快完成。 在本指南中,我們會帶你一步步建立一個用於 Postgres 的 MCP 伺服器。我們的目標是讓 Cursor 能直接對 Postgres 資料庫執行 SQL 查詢,並以結構化方式公開資料表綱要。
本教學旨在教授建立 MCP 伺服器的基本原理。

什麼是 MCP Server?

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

如何建置 MCP 伺服器

建置伺服器的第一步是設定一個新專案。我們先建立新資料夾並初始化 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 提供了一種方式來查看伺服器所曝光的功能,並驗證工具與資源是否如預期運作。我們也要確認查詢能被執行,且綱要資訊能正確回傳。 MCP Inspector 介面 當一切看起來都沒問題時,我們可以把伺服器連上 Cursor 本體,並在真實環境中測試。此時,Cursor 就能把 Postgres MCP 伺服器當作內建能力來使用,讓我們可以直接查詢並檢視資料庫。

下一步

在本機透過 stdio 執行 MCP server 是很好的起點,但團隊通常需要透過他們的 MCP server 共享存取同一個資料庫。在這種情況下,就有必要將 MCP server 部署為集中式的 HTTP 服務。 部署後的 MCP server 相較於個別的 stdio 執行個體有幾個優勢:
  • 共享資料庫存取: 多位團隊成員可以透過 Cursor 查詢同一個資料庫執行個體
  • 集中化設定: 結構更新與權限變更可在單一位置管理
  • 強化安全性: 可實作正確的身分驗證、頻率限制與存取控制
  • 可觀測性: 可在團隊範圍監控使用模式與效能指標
要達成這點,你會把傳輸方式從 stdio 切換為 HTTP。 雖然我們不會涵蓋整個設定流程,這裡有個可以交給 Cursor 的不錯起始提示
Based on the existing 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