Membangun server MCP dengan IBM Bob
Pelajari cara menggunakan IBM Bob untuk membangun server Model Context Protocol (MCP) kustom yang menghubungkan model AI ke alat dan sumber data eksternal. Mencakup mode lanjutan, alur kerja persetujuan, dan konfigurasi MCP dalam tutorial langsung ini.
Dalam tutorial ini, kamu menggunakan IBM Bob untuk membangun server MCP kustom yang menyediakan akses hanya-baca ke arXiv, sebuah repositori konten akses terbuka untuk makalah ilmiah. Secara opsional, kamu dapat memperluas server untuk diintegrasikan dengan agen AI watsonx Orchestrate.
Model Context Protocol (MCP) adalah standar terbuka yang memungkinkan large language model (LLM) berkomunikasi dengan alat eksternal, sumber data, dan repositori konten melalui arsitektur klien-server yang terpadu. Sebelum MCP, setiap asisten AI membutuhkan integrasi khusus tersendiri untuk setiap alat eksternal, menggunakan function calling tanpa interoperabilitas. MCP mendefinisikan satu protokol JSON-RPC 2.0 yang dapat digunakan oleh host MCP mana pun untuk terhubung ke server MCP mana pun.
Prasyarat
Tutorial ini membangun server MCP TypeScript yang mengkueri API arXiv. Tutorial ini tidak memerlukan pengalaman TypeScript atau integrasi MCP sebelumnya.
Untuk menyelesaikan tutorial ini, kamu membutuhkan:
IBM Bob IDE
Unduh dan instal aplikasi IBM Bob di komputermu. Bob adalah aplikasi IDE mandiri, bukan ekstensi.
Node.js
Instal Node.js 22 atau yang lebih baru untuk membangun dan menjalankan server MCP TypeScript secara lokal.
Menyiapkan workspace
Jalankan IBM Bob, buka panel pengaturan MCP, dan siapkan direktori kerja untuk proyek server.
Jalankan IBM Bob
Jalankan aplikasi IBM Bob di komputermu.
Buka panel chat Bob
Jika panel chat belum terbuka, klik ikon Bob di sebelah bilah navigasi atau gunakan pintasan Option + Command + B (Mac) atau Ctrl + Alt + B (Windows).
Buka panel pengaturan MCP
Klik ikon roda gigi di sudut kanan atas jendela chat, lalu pilih MCP dari bilah sisi kiri.
Panel pengaturan MCP memungkinkanmu mengelola kontrol akses dengan mengaktifkan atau menonaktifkan server, menyetujui otomatis alat tertentu, dan membangun integrasi kustom dengan MCP SDK.
- Global: Disimpan di
mcp_settings.json, diterapkan di semua workspace. - Proyek: Disimpan di
.bob/mcp.jsondi root proyek, dapat dibagikan dengan timmu melalui version control. Pengaturan tingkat proyek menggantikan pengaturan global.
Konfigurasikan persetujuan otomatis
Di chat Bob, pastikan izin persetujuan otomatis tepat di bawah kolom input chat diatur ke "Read" saja. Konfigurasi ini memungkinkan Bob melihat file dan konten direktorimu, sambil meminta ulasan dan persetujuanmu sebelum Bob menjalankan setiap perintah.
Buka direktori proyekmu
Jika kamu memiliki direktori pilihan untuk proyek, buka di IDE. Kamu juga dapat meminta Bob melakukannya di jendela chat.
Menyiapkan virtual environment Python
Membuat virtual environment Python adalah praktik umum untuk mengisolasi dependensi proyek agar proyek yang berbeda tidak saling bertentangan. Alihkan Bob ke mode Agent, mode yang dapat membaca, menulis, dan menjalankan perintah terminal, lalu buat environment.
Buat dan aktifkan virtual environment
Di panel chat Bob, masukkan prompt berikut:
In this directory, activate a Python virtual environment.Bob menjalankan serangkaian perintah terminal. Setujui setiap perintah saat diminta. Perintah-perintah tersebut membuat virtual environment baru di direktori venv/ dan mengaktifkannya.
Membuat rencana pembangunan server MCP
Beralih ke mode Plan
Klik tombol tepat di bawah kolom input chat untuk mengubah mode interaksi ke Plan. Mode ini memungkinkan Bob membuat rencana terstruktur untuk server MCP sebelum menulis kode apa pun.
Kirimkan persyaratan server
Dengan virtual environment aktif, kirimkan prompt berikut ke Bob. Memberikan persyaratan spesifik di awal memberi Bob cukup konteks untuk merumuskan rencana lengkap sebelum menulis kode apa pun:
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 menghasilkan daftar tugas terstruktur yang mencakup scaffolding proyek, implementasi server MCP, instalasi dependensi, konfigurasi server, dan pengujian. Perhatikan bahwa Bob secara otomatis merencanakan penanganan error dan pertimbangan autentikasi. Bahkan ketika API target (arXiv) tidak memerlukan kunci, Bob mencatat di mana kredensial akan diinjeksi untuk server yang membutuhkannya.
Jika Bob mengajukan pertanyaan klarifikasi, jawab sebaik mungkin atau minta Bob membuat asumsi yang wajar.
Membangun dan meninjau server MCP
Setelah meninjau dan menyetujui rencana, beralih ke mode Agent untuk menjalankan setiap langkah. Output dan urutan mungkin sedikit berbeda dari contoh berikut, karena Bob menghasilkan respons secara real time.
Beritahu Bob untuk mulai membangun server dengan prompt berikut:
Implement the plan.Pertama, Bob membuat scaffolding struktur proyek dan menjalankan mkdir -p arxiv-server/src untuk membuat direktori proyek.
Selanjutnya, Bob menghasilkan arxiv-server/package.json, pusat konfigurasi Node.js yang mendeklarasikan metadata, skrip, dan dependensi proyek:
{
"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 juga membuat arxiv-server/tsconfig.json untuk mengkonfigurasi compiler 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"]
}Selanjutnya, Bob membuat file server utama di arxiv-server/src/index.ts. File ini mendaftarkan alat search_arxiv dengan MCP SDK, mengimplementasikan parsing XML-ke-JSON untuk respons API arXiv, menerapkan batas hasil, dan memulai server pada transport STDIO—jenis transport lokal dengan latensi rendah yang cocok untuk server yang berjalan di mesin yang sama dengan host MCP.
Panggilan server.tool() dari MCP SDK adalah titik integrasi utama. Ini mengekspos alat ke klien MCP mana pun.
#!/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');Flag isError: true di blok catch adalah pola penanganan error standar MCP. Ini memberi sinyal ke klien MCP bahwa panggilan alat gagal tanpa menghentikan proses server.
Sebagai langkah berikutnya, Bob menginstal dependensi di dalam direktori arxiv-server dengan menjalankan cd arxiv-server && npm install.
Daftarkan server di cakupan proyek
Bob tidak mendaftarkan server baru secara otomatis. Beritahu Bob untuk menambahkannya secara eksplisit, dan tentukan cakupan proyek agar konfigurasi tersimpan di .bob/mcp.json dan dapat dibagikan dengan timmu melalui version control.
Minta Bob mendaftarkan server
Di panel chat Bob, masukkan prompt berikut:
Register the arxiv-server as an MCP server at project scope. Build it first if needed, then add it to .bob/mcp.json.Tinjau konfigurasi yang dihasilkan
Bob menulis hal berikut ke .bob/mcp.json di root proyekmu. Field command dan args memberi tahu klien MCP cara memulai proses server menggunakan transport STDIO.
{
"mcpServers": {
"arxiv-server": {
"command": "node",
"args": ["${workspaceFolder}/arxiv-server/build/index.js"]
}
}
}Konfirmasi server telah dimuat
Bob memuat ulang konfigurasi MCP secara otomatis setelah menulis file ini. Buka panel pengaturan MCP (ikon roda gigi > MCP) untuk mengonfirmasi server arxiv-server terdaftar dan diaktifkan sebelum melanjutkan. Jika tidak muncul, klik ikon muat ulang di sebelah daftar server.
Mulai ulang Bob
Mulai ulang Bob untuk memastikan server berjalan dan siap menerima kueri.
Menguji server MCP
Dengan server terdaftar, Bob secara otomatis menjalankan dua kueri validasi terhadap alat search_arxiv.
Tes pertama mengkueri tiga makalah komputasi kuantum yang diurutkan berdasarkan relevansi. Yang kedua mengkueri dua makalah machine learning yang diurutkan berdasarkan tanggal pengiriman secara menurun. Keduanya berhasil dijalankan, mengonfirmasi bahwa alat dapat dijangkau dan penanganan error server mengelola kombinasi parameter yang berbeda dengan benar.
Sekarang jalankan kuerimu sendiri untuk memverifikasi bahwa Bob mengekstrak parameter yang benar dari bahasa alami. Contoh prompt yang bisa kamu tempel ke panel chat Bob:
What are the latest papers on LLM agent tracing?Mendokumentasikan server
Implementasi server MCP open source biasanya menyertakan dokumentasi agar orang lain dapat memulai dengan cepat. Minta Bob untuk menghasilkannya:
In this directory, create a README.md file to document this MCP server.
Include setup and usage instructions.Bob menghasilkan README.md yang komprehensif mencakup instalasi, konfigurasi untuk beberapa host MCP (IBM Bob, Claude Desktop, Cursor, Claude Code), panduan autentikasi untuk server yang memerlukan API key, pola akses file lokal, dan tips pemecahan masalah.
Membersihkan resource
Tutorial ini membuat file lokal dan registrasi server. Hapus jika kamu tidak berencana terus menggunakan server MCP arXiv.
Buka panel pengaturan MCP di Bob (ikon roda gigi > MCP) dan nonaktifkan atau hapus entri arxiv-server. Atau, hapus blok arxiv-server dari mcp_settings.json (cakupan global) atau .bob/mcp.json (cakupan proyek) secara langsung.
Langkah selanjutnya
Dalam tutorial ini, kamu menggunakan IBM Bob untuk membangun server MCP TypeScript, mengkonfigurasinya dengan transport STDIO, dan mengujinya dengan kueri arXiv langsung—semuanya melalui prompt bahasa alami.
Alur kerja yang sama berlaku untuk implementasi server MCP yang lebih kompleks: server yang terhubung ke database, file lokal, atau sumber data eksternal lainnya. Server yang memerlukan autentikasi membutuhkan kredensial yang diinjeksi sebagai variabel lingkungan dalam JSON konfigurasi MCP. Untuk deployment jarak jauh, ganti transport STDIO dengan SSE.
- Pelajari tentang fitur Code review Bob untuk mendeteksi masalah sebelum meng-commit kode servermu.
- Pelajari tentang mode untuk memahami kapan menggunakan mode Advanced, Code, Ask, dan persona Bob lainnya.
- Jelajahi konfigurasi MCP untuk detail tentang cakupan global vs. proyek, alat yang disetujui otomatis, dan pengaturan transport SSE.
- Ikuti seri tutorial Get started with IBM Bob untuk terus belajar.
Modernisasi aplikasi Node.js
Pelajari cara menggunakan IBM Bob untuk modernisasi aplikasi dengan mengupgrade Node.js Express API dari versi 16 ke 22. Coba AI-assisted development dengan modes, approvals, dan literate coding dalam tutorial hands-on ini.
Audit kode dan buat laporan
Gunakan IBM Bob untuk membuat reusable security audit skill, pindai aplikasi terhadap persyaratan OWASP ASVS, dan hasilkan laporan SARIF dan OSCAL yang bisa ditindaklanjuti oleh developer dan agen AI.