假設我們是一間剛成立的新創公司,目標是開發一個日記程式給一般社會大眾使用,我們會用 Node.js 來做,並且先不考慮使用者驗證跟資料庫的問題。
這是為了先從最小可行版本 (MVP) 開始,再逐步擴充:
今天 → 初始化專案,建立一個最基礎的 MCP Server
明天 → 加入 MCP Server 的基本 tools(例如 createJournal、getJournals)
後續 → 慢慢迭代,加入使用者驗證、甚至從 stdio 模式改成 HTTP server 模式(方便部署到線上)。
我們至少需要以下四個基本的 tools:
create_journal(content, date) → 新增一篇日記
get_journals(startDate, endDate) → 取得指定時間範圍的日記
read_journal(journalId) → 讀取單篇日記
searchJournal(text) → 直接從內容搜尋
也因為我們是面向一般使用者而非開發者, 我們會用 claude desktop而非 cursor 作為範例。
創建一個空資料夾 → 命名為「journal-mcp-server」
↓
用你習慣的編輯器打開這個資料夾
↓
打開終端機 (Terminal)
↓
在專案資料夾中執行指令:
npm init -y
↓
接著執行 npm install @modelcontextprotocol/sdk zod@3
@modelcontextprotocol/sdk
是方便我們創建 Mcp server 的套件,後者是用於驗證 request 格式的套件。
接著修改 package.json:
{
"type": "module",
"name": "journal-mcp-server",
"version": "1.0.0",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.18.1",
"zod": "^3.25.76"
}
}
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new McpServer({
name: 'Journal MCP Server',
version: '1.0.0',
description: 'A MCP server for the Journal',
capabilities: {
tools: {},
},
});
我們先讓這個專案只能本機使用,所以先選 stdio 即可。不熟的朋友幫我去複習 [03] 如何讓 MCP Server 與 Client 溝通:STDIO 與 Streamable HTTP
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('Journal MCP Server is running on stdio');
}
建立傳輸層 (transport) → 使用 StdioServerTransport()。
server.connect(transport) → 讓 MCP Server 透過 stdio 和外部 (MCP Host) 溝通。
-- 使用 console.error() → 在終端機輸出啟動訊息(MCP server 的 log 通常建議用 stderr,原因一樣可複習: [03] 如何讓 MCP Server 與 Client 溝通:STDIO 與 Streamable HTTP)。
main().catch((error) => {
console.error(error);
process.exit(1);
});
接著運行
npm run start
看到出現:
Journal MCP Server is running on stdio
就代表成功了,明天我們會開始實作 tools。