使用 IBM Bob 建構 MCP 伺服器
了解如何使用 IBM Bob 建構自訂模型情境協定 (MCP) 伺服器,將 AI 模型連接至外部工具和資料來源。本實作教學涵蓋進階模式、核准工作流程和 MCP 設定。
在本教學中,你將使用 IBM Bob 建構一個自訂 MCP 伺服器,提供對 arXiv 的唯讀存取權限——arXiv 是一個科學論文的開放存取內容儲存庫。你也可以選擇擴充該伺服器,將其與 watsonx Orchestrate AI 代理整合。
模型情境協定 (MCP) 是一種開放標準,使大型語言模型 (LLM) 能夠透過統一的用戶端-伺服器架構與外部工具、資料來源和內容儲存庫進行通訊。在 MCP 出現之前,每個 AI 助理都需要為每個外部工具建立自己專屬的整合,使用 function calling 且無法互通。MCP 則定義了單一的 JSON-RPC 2.0 協定,任何 MCP 主機都可以用它連接到任何 MCP 伺服器。
先決條件
本教學建構一個查詢 arXiv API 的 TypeScript MCP 伺服器,不需要 TypeScript 或 MCP 整合的先備經驗。
完成本教學需要以下項目:
IBM Bob IDE
在你的電腦上下載並安裝 IBM Bob 應用程式。Bob 是獨立的 IDE 應用程式,不是擴充功能。
Node.js
安裝 Node.js 22 或更新版本,以便在本機建構和執行 TypeScript MCP 伺服器。
設定工作區
啟動 IBM Bob,開啟 MCP 設定面板,並為伺服器專案準備工作目錄。
啟動 IBM Bob
在你的電腦上啟動 IBM Bob 應用程式。
開啟 Bob 聊天面板
如果聊天面板尚未開啟,請點擊導覽列旁的 Bob 圖示,或使用快速鍵 Option + Command + B(Mac)或 Ctrl + Alt + B(Windows)。
開啟 MCP 設定面板
點擊聊天視窗右上角的齒輪圖示,然後從左側邊欄選取 MCP。
MCP 設定面板可讓你透過啟用或停用伺服器、自動核准特定工具、以及使用 MCP SDK 建構自訂整合來管理存取控制。
- 全域:儲存在
mcp_settings.json中,套用於所有工作區。 - 專案:儲存在專案根目錄的
.bob/mcp.json中,可透過版本控制與團隊共用。專案層級設定會覆寫全域設定。
設定自動核准
在 Bob 聊天中,確認聊天輸入欄位下方的自動核准權限僅設為「Read」。此設定讓 Bob 可以檢視你的檔案和目錄內容,同時在執行每個指令前請求你的審查和核准。
開啟專案目錄
如果你有專案的偏好目錄,請在 IDE 中開啟它。你也可以在聊天視窗中請 Bob 來執行此步驟。
設定 Python 虛擬環境
建立 Python 虛擬環境是隔離專案相依性的常見做法,可避免不同專案之間的衝突。將 Bob 切換至 Agent 模式(此模式可讀取、寫入和執行終端機指令),然後建立環境。
建立並啟動虛擬環境
在 Bob 聊天面板中輸入以下 prompt:
In this directory, activate a Python virtual environment.Bob 會執行一系列終端機指令。在每次提示時核准。這些指令會在 venv/ 目錄中建立新的虛擬環境並將其啟動。
產生 MCP 伺服器建構計畫
切換至 Plan 模式
點擊聊天輸入欄位下方的按鈕,將互動模式變更為 Plan。此模式讓 Bob 在撰寫任何程式碼之前,為 MCP 伺服器產生結構化計畫。
提交伺服器需求
在虛擬環境啟動的情況下,向 Bob 提交以下 prompt。提前提供具體需求,讓 Bob 在撰寫任何程式碼之前有足夠的情境來制定完整計畫:
Create an MCP server named arxiv-server that provides read-only access to arXiv. The server should:
- Expose one tool, search_papers, for querying arXiv papers by keyword
- Accept a query string and an optional max_results parameter (default 5, max 20)
- Limit results to paper metadata and abstracts (no PDFs)
- Return title, authors, publication date, abstract, and arXiv URL for each result
- Normalize responses into a clean, structured JSON schema
- Handle API errors and empty results gracefully, returning a clear message instead of failing
- Use TypeScript/Node.js with the stdio transport
- Use the arXiv API v2, which requires no authenticationBob 會產生結構化的待辦事項清單,涵蓋專案架構、MCP 伺服器實作、相依性安裝、伺服器設定和測試。注意,Bob 會自動規劃錯誤處理和驗證考量。即使目標 API(arXiv)不需要金鑰,Bob 也會標記需要驗證的伺服器中憑證的注入位置。
如果 Bob 提出釐清問題,請盡量回答,或告訴 Bob 做出合理假設。
建構和審查 MCP 伺服器
審查並核准計畫後,切換至 Agent 模式以執行每個步驟。由於 Bob 即時產生回應,你的輸出和順序可能與以下範例略有不同。
用以下 prompt 告訴 Bob 開始建構伺服器:
Implement the plan.首先,Bob 建立專案結構並執行 mkdir -p arxiv-server/src 建立專案目錄。
接下來,Bob 產生 arxiv-server/package.json——Node.js 設定中心,用於宣告專案的中繼資料、指令碼和相依性:
{
"name": "arxiv-server",
"version": "0.1.0",
"description": "MCP server for read-only access to arXiv papers",
"type": "module",
"bin": {
"arxiv-server": "./build/index.js"
},
"scripts": {
"build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"",
"prepare": "npm run build",
"watch": "tsc --watch"
},
"keywords": ["mcp", "arxiv", "research", "papers"],
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.4",
"axios": "^1.7.9",
"zod": "^3.24.1"
},
"devDependencies": {
"@types/node": "^22.10.5",
"typescript": "^5.7.3"
}
}Bob 也會建立 arxiv-server/tsconfig.json 來設定 TypeScript 編譯器:
{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"outDir": "./build",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "build"]
}接下來,Bob 在 arxiv-server/src/index.ts 建立主要伺服器檔案。此檔案使用 MCP SDK 註冊 search_arxiv 工具,為 arXiv 的 API 回應實作 XML 轉 JSON 剖析,強制執行結果限制,並在 STDIO transport 上啟動伺服器——STDIO 是適合在與 MCP 主機相同機器上執行的伺服器的本機低延遲傳輸類型。
MCP SDK 的 server.tool() 呼叫是主要整合點,它將工具公開給任何 MCP 用戶端。
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import axios from 'axios';
interface ArxivEntry {
id: string;
title: string;
summary: string;
authors: Array<{ name: string }>;
published: string;
updated: string;
categories: string[];
primary_category: string;
links: Array<{ href: string; rel: string; type?: string }>;
}
interface ArxivSearchResult {
entries: ArxivEntry[];
totalResults: number;
startIndex: number;
itemsPerPage: number;
}
const server = new McpServer({ name: "arxiv-server", version: "0.1.0" });
const arxivApi = axios.create({
baseURL: 'http://export.arxiv.org/api',
timeout: 30000,
});
server.tool(
"search_arxiv",
{
query: z.string().describe("Search query (supports arXiv query syntax)"),
max_results: z.number().min(1).max(50).optional()
.describe("Maximum results to return (1–50, default: 10)"),
start: z.number().min(0).optional()
.describe("Starting index for pagination (default: 0)"),
sort_by: z.enum(["relevance", "lastUpdatedDate", "submittedDate"]).optional(),
sort_order: z.enum(["ascending", "descending"]).optional()
},
async ({ query, max_results = 10, start = 0, sort_by = "relevance", sort_order = "descending" }) => {
try {
const params: Record<string, string | number> = {
search_query: query,
start: Math.max(start, 0),
max_results: Math.min(max_results, 50),
...(sort_by && { sortBy: sort_by }),
...(sort_order && { sortOrder: sort_order }),
};
const response = await arxivApi.get('/query', { params });
return {
content: [{ type: "text", text: formatSearchResults(parseArxivXML(response.data)) }],
};
} catch (error) {
if (axios.isAxiosError(error)) {
return {
content: [{ type: "text", text: `arXiv API error: ${error.response?.data?.message ?? error.message}` }],
isError: true,
};
}
throw error;
}
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('arXiv MCP server running on stdio');catch 區塊中的 isError: true 旗標是 MCP 的標準錯誤處理模式。它向 MCP 用戶端發出工具呼叫失敗的訊號,而不會使伺服器處理程序崩潰。
下一步,Bob 透過執行 cd arxiv-server && npm install 在 arxiv-server 目錄中安裝相依性。
在專案範圍內註冊伺服器
Bob 不會自動註冊新伺服器。明確告訴 Bob 新增它,並指定專案範圍,使設定儲存在 .bob/mcp.json 中,並可透過版本控制與團隊共用。
告訴 Bob 註冊伺服器
在 Bob 聊天面板中輸入以下 prompt:
Register the arxiv-server as an MCP server at project scope. Build it first if needed, then add it to .bob/mcp.json.審查產生的設定
Bob 將以下內容寫入專案根目錄的 .bob/mcp.json。command 和 args 欄位告訴 MCP 用戶端如何使用 STDIO transport 啟動伺服器處理程序。
{
"mcpServers": {
"arxiv-server": {
"command": "node",
"args": ["${workspaceFolder}/arxiv-server/build/index.js"]
}
}
}確認伺服器已載入
Bob 寫入此檔案後會自動重新載入 MCP 設定。開啟 MCP 設定面板(齒輪圖示 > MCP)確認 arxiv-server 伺服器已列出並啟用,然後再繼續。如果未顯示,請點擊伺服器清單旁的重新載入圖示。
重新啟動 Bob
重新啟動 Bob 以確保伺服器正在執行並準備好接受查詢。
測試 MCP 伺服器
註冊伺服器後,Bob 會自動對 search_arxiv 工具執行兩個驗證查詢。
第一個測試查詢三篇按相關性排序的量子運算論文,第二個查詢兩篇按提交日期降冪排列的機器學習論文。兩個查詢均成功執行,確認工具可存取,且伺服器的錯誤處理可正確管理不同的參數組合。
現在執行你自己的查詢,驗證 Bob 是否能從自然語言中擷取正確的參數。可以將以下範例 prompt 貼到 Bob 聊天面板中:
What are the latest papers on LLM agent tracing?為伺服器建立文件
開源 MCP 伺服器實作通常包含文件,讓其他人能夠快速上手。請 Bob 來產生:
In this directory, create a README.md file to document this MCP server.
Include setup and usage instructions.Bob 會產生一份完整的 README.md,涵蓋安裝、多個 MCP 主機的設定(IBM Bob、Claude Desktop、Cursor、Claude Code)、需要 API 金鑰的伺服器的驗證指南、本機檔案存取模式和疑難排解提示。
清除資源
本教學會建立本機檔案和伺服器註冊。如果你不打算繼續使用 arXiv MCP 伺服器,請將其移除。
在 Bob 中開啟 MCP 設定面板(齒輪圖示 > MCP),停用或刪除 arxiv-server 項目。或者,直接從 mcp_settings.json(全域範圍)或 .bob/mcp.json(專案範圍)中移除 arxiv-server 區塊。
後續步驟
在本教學中,你使用 IBM Bob 建構了一個 TypeScript MCP 伺服器,使用 STDIO transport 進行設定,並透過即時 arXiv 查詢進行測試——所有這些都透過自然語言 prompt 完成。
同樣的工作流程適用於更複雜的 MCP 伺服器實作:連接到資料庫、本機檔案或任何其他外部資料來源的伺服器。需要驗證的伺服器需要將憑證作為環境變數注入 MCP 設定 JSON 中。對於遠端部署,請將 STDIO transport 替換為 SSE。
- 了解 Bob 的 Code review 功能,在提交伺服器程式碼之前找出問題。
- 了解模式,理解何時使用 Advanced、Code、Ask 和其他 Bob 角色。
- 探索 MCP 設定,深入了解全域與專案範圍、自動核准工具和 SSE transport 設定。
- 繼續學習 IBM Bob 入門教學系列。