Model Context Protocol (MCP) muncul dari masalah ketidakcocokan. Dalam kehidupan kita sehari-hari, ketidakcocokan membuat kita tidak nyaman dengan berbagai cara.
Pernahkah Anda membawa alat penata rambut atau perangkat elektronik saat bepergian ke luar negeri, lalu menyadari bahwa stekernya tidak cocok dengan stopkontak di sana? Dari perspektif pengembang, masalah ini sama sulitnya dengan membangun API dan alat pengembangan untuk agen AI Anda yang tampaknya tidak dapat terhubung atau dipanggil dengan benar. Di situlah MCP mengurangi masalah ketidakcocokan ini.
Model Context Protocol (MCP), yang diperkenalkan oleh Anthropic pada tahun 2024, berfungsi sebagai lapisan standardisasi untuk aplikasi AI agar dapat berkomunikasi secara efektif dengan layanan eksternal, seperti alat, sumber data/kumpulan data, dan templat yang telah ditentukan sebelumnya. MCP pada dasarnya berfungsi sebagai standar terbuka dan konektor untuk interaksi alat AI. Arsitektur MCP dapat dibagi menjadi tiga komponen arsitektur utama:
Pertama, apa itu IBM Bob? IBM Bob adalah lingkungan pengembangan integrasi (IDE) dan asisten modernisasi yang didukung oleh AI generatif pengembangan integrasi. Think of Bob sebagai IDE dan pengembang pasangan pertama AI Anda: alat yang memahami maksud Anda, basis kode Anda, dan standar organisasi Anda.
Membangun server MCP Anda sendiri dari awal bisa memakan waktu, terutama untuk pengembang pemula. Sebagai gantinya, dalam tutorial ini, kita akan menelusuri cara memulai alur kerja ini dengan IBM menggunakan beberapa prompt bahasa alami sederhana.
Integrasi MCP memperluas fungsionalitas Bob dengan menghubungkan ke alat dan layanan eksternal, dapat dikonfigurasi secara global (berlaku di semua ruang kerja) atau level proyek (dapat dibagikan tim lewat .bob/mcp.json) . MCP mendukung dua jenis transportasi: input/output standar (STDIO) untuk lokal, server latensi rendah dan server-sent event (SSE) untuk server MCP jarak jauh yang dapat diakses melalui HTTP/HTTPS. Pengguna dapat mengonfigurasi server dengan file JSON di menu pengaturan Bob, menentukan perintah, variabel lingkungan, dan alat yang disetujui secara otomatis. Kedua jenis transportasi memungkinkan Anda untuk mengaktifkan atau menonaktifkan server, menyetujui secara otomatis alat tertentu, dan mengelola operasi melalui panel pengaturan MCP Bob.
Mari kita mulai. Jika Anda lebih suka mengikuti tutorial ini di GitHub, lihat repositori kami .
1. Silakan dan buka IBM Bob IDE yang Anda instal sebagai prasyarat dan biasakan diri dengan tata letak pendamping AI Coding baru Anda.
2. Untuk mengakses panel pengaturan MCP, klik 3 titik di sebelah ikon roda gigi di sudut kanan atas jendela obrolan. Kemudian, pilih server MCP dari menu dropdown.
Di sini, kita dapat mengaktifkan atau menonaktifkan MCP secara global atau per server dan mengelola alat (misalnya, persetujuan otomatis, penghapusan atau restart). Kami juga dapat menjelajahi server komunitas melalui Bob Marketplace atau membangun server kami sendiri dengan MCP SDK.
Jika Anda memilih untuk menginstal server dari pasar digital, Anda akan melihat bahwa konfigurasi dapat diatur pada dua tingkat: global (disimpan di
Pengaturan tingkat proyek mengesampingkan pengaturan global, memberi Anda fleksibilitas untuk menyesuaikan perilaku MCP untuk berbagai contoh penggunaan. Untuk mengelola konfigurasi ini, Anda dapat mengedit file JSON langsung melalui menu pengaturan Bob, di mana Anda menentukan detail server seperti perintah, variabel lingkungan, dan alat yang disetujui secara otomatis. Dalam tutorial ini, kita akan menggunakan SDK.
3. Pastikan pengaturan Aktifkan Pembuatan Server MCP aktif untuk membuat server MCP kustom dengan Bob.
4. Jika Anda memiliki direktori pilihan untuk mengatur proyek Anda, Anda dapat membukanya sendiri di dalam IDE atau meminta Bob melakukannya untuk Anda di jendela obrolan.
3. Ini adalah praktik umum untuk membuat lingkungan Python virtual untuk mengisolasi dependensi proyek, sehingga proyek yang berbeda tidak saling bertentangan. Untuk melakukannya, masukkan prompt: “Di direktori ini, aktifkan lingkungan virtual Python”.
4. Anda akan melihat Bob berjalan melalui serangkaian perintah terminal. Perintah-perintah ini kemungkinan akan menyerupai:
Sebaiknya Anda menonaktifkan tombol memiliki persetujuan otomatis sehingga Anda dapat menyetujui atau menolak setiap perintah sebelum Bob menjalankannya secara real-time.
Hebat. Bob berhasil membuat dan mengaktifkan lingkungan virtual baru di direktori
Dengan pengaturan lingkungan virtual kami, kami sekarang dapat melompat ke pembuatan server MCP. Saat meminta Bob untuk membuat kode, atau model AI atau asisten AI apa pun dalam hal ini, akan sangat membantu untuk menyertakan detail penting. Untuk melihat Bob beraksi, mari kita kirim prompt:
“Buat server MCP yang menyediakan akses hanya baca ke arXiv. Server harus:
Dengan satu prompt sederhana ini, Bob memiliki informasi yang cukup untuk memahami tugas dan merumuskan "daftar tugas" langkah-langkah untuk menyelesaikan tugas. Perhatikan bahwa daftar tersebut tidak hanya mencakup pembuatan server MCP tetapi juga konfigurasi dan pengujiannya. Rapi.
Catatan, kami menggunakan arXiv API dalam tutorial ini sebagai contoh sederhana yang tidak memerlukan kunci API atau autentikasi apa pun untuk memulai. Namun, ini adalah contoh dan Bob juga dibekali untuk menangani server yang lebih kompleks dengan izin yang diperlukan.
Sebelum setiap perintah dieksekusi, kita dapat menyetujui atau menolak tindakan tersebut. Jika Anda melihat bahwa perintah dieksekusi secara otomatis, mungkin Anda telah mengaktifkan opsi persetujuan otomatis.
2. Selanjutnya, Bob membuat file
{
"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"
},
"files": [
"build"
],
"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"
}
}
arxiv-server/tsconfig.json{
"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"]
}
4. Kemudian, implementasi server utama dengan fungsi pencarian arXiv disimpan di
#!/usr/bin/env node
impor { McpServer } dari "@modelcontextprotocol/sdk/server/mcp.js";
impor { StdioServerTransport } dari "@modelcontextprotocol/sdk/server/stdio.js";
impor { z } from "zod";
impor axios dari 'axios';
// Tentukan tipe respons API arXiv
antarmuka ArxivEntry {
id: string;
title: string;
summary: string;
authors: Array<{ name: string }>;
diterbitkan: string;
diperbarui: string;
kategori: string[];
primary_category: string;
tautan: Array<{ href: string; rel: string; type?: string }>;
}
antarmuka ArxivSearchResult {
entries: ArxivEntry[];
totalResults: number;
startIndex: number;
itemsPerPage: number;
}
// Buat server MCP
const server = new McpServer({
name: "arxiv-server",
version: "0.1.0"
});
// Buat instance axios untuk arXiv API
const arxivApi = axios.create({
baseURL: 'http://export.arxiv.org/api',
timeout: 30000,
});
/**
* Parse arXiv API XML response to JSON
*/
function parseArxivXML(xmlData: string): ArxivSearchResult {
const entries: ArxivEntry[] = [];
// Extract total results
const totalResultsMatch = xmlData.match(/<opensearch:totalResults[^>]*>(\d+)<\/opensearch:totalResults>/);
const totalResults = totalResultsMatch ? parseInt(totalResultsMatch[1]) : 0;
const startIndexMatch = xmlData.match(/<opensearch:startIndex[^>]*>(\d+)<\/opensearch:startIndex>/);
const startIndex = startIndexMatch ? parseInt(startIndexMatch[1]) : 0;
const itemsPerPageMatch = xmlData.match(/<opensearch:itemsPerPage[^>]*>(\d+)<\/opensearch:itemsPerPage>/);
const itemsPerPage = itemsPerPageMatch ? parseInt(itemsPerPageMatch[1]) : 0;
// Extract entries
const entryRegex = /<entry>([\s\S]*?)<\/entry>/g;
let entryMatch;
while ((entryMatch = entryRegex.exec(xmlData)) !== null) {
const entryXml = entryMatch[1];
// Extract ID
const idMatch = entryXml.match(/<id>([^<]+)<\/id>/);
const id = idMatch ? idMatch[1] : '';
// Extract title
const titleMatch = entryXml.match(/<title>([^<]+)<\/title>/);
const title = titleMatch ? titleMatch[1].trim().replace(/\s+/g, ' ') : '';
// Extract summary
const summaryMatch = entryXml.match(/<summary>([^<]+)<\/summary>/);
const summary = summaryMatch ? summaryMatch[1].trim().replace(/\s+/g, ' ') : '';
// Extract authors
const authors: Array<{ name: string }> = [];
const authorRegex = /<author>\s*<name>([^<]+)<\/name>/g;
let authorMatch;
sementara ((authorMatch = authorRegex.exec(entryXml)) !== null) {
authors.push({ name: authorMatch[1].trim() }); } // Ekstrak tanggal publikasi const publishingMatch = entryXml.match(/<published>([^<]+)<\/published>/);
constpublished =publishMatch ? publishMatch[1] : ''; // Ekstrak tanggal yang diperbarui const updatedMatch = entryXml.match(/<updated>([^<]+)<\/updated>/);
const updated = updatedMatch ? updatedMatch[1] : ''; // Ekstrak kategori const Categories: string[] = []; const categoryRegex = /<category[^>]+term="([^"]+)"/g; let categoryMatch; sementara ((categoryMatch = categoryRegex.exec(entryXml)) !== null) {
categories.push(categoryMatch[1]);
} const primary_category = kategori[0] || ''; // Ekstrak tautan const links: Array<{ href: string; rel: string; type?: string }> = []; const linkRegex = /<link[^>]+href="([^"]+)"[^>]+rel="([^"]+)"(?:[^>]+type="( [^"]+)")?/g; let linkMatch; while ((linkMatch = linkRegex.exec(entryXml)) !== null) {
links.push({
href: linkMatch[1],
rel: linkMatch[2],
type: linkMatch[3]
}); } entries.push({
id,
title,
summary,
authors,
published,
updated,
categories,
primary_category,
links
});
}
return {
entries,
totalResults,
startIndex,
itemsPerPage
};
}
/**
* Format hasil pencarian untuk tampilan
*/
function formatSearchResults(result: ArxivSearchResult): string {
let output = `Found ${result.totalResults} hasil (menampilkan ${result.entries.length})\n\n`;
result.entries.forEach((entry, index) => {
output += `${index + 1}. ${entry.title}\n`; output += ` ID: ${entry.id}\n`; output += ` Penulis: ${entry.authors.map(a => a.name).join(', ')}\n`; output += ` Published: ${entry.published}\n`; output += ` Categories: ${entry.categories.join(', ')}\n`; output += ` Abstrak: ${entry.summary.substring(0, 300)}${entry.summary.length > 300 ? '...' : ''}\n`; // Temukan tautan abstrak (bukan PDF) const abstractLink = entry.links.find(l => l.rel === 'alternate'); if (abstractLink) {
output += ` URL: ${abstractLink.href}\n`; } output += '\n'; }); mengembalikan output; } // Tambahkan alat untuk mencari arXiv paper 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 number of 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().describe("Sort order (default: relevance)"),
sort_order: z.enum(["ascending", "descending"]).optional().describe("Sort direction (default: descending)")
}, async ({ query, max_results = 10, start = 0, sort_by = "relevance", sort_order = "descending" }) => {
try {
// Enforce reasonable limits
const limitedMaxResults = Math.min(max_results, 50);
const limitedStart = Math.max(start, 0);
// Build query parameters
const params: Record<string, string | number> = {
search_query: query,
start: limitedStart,
max_results: limitedMaxResults,
}; if (sort_by) {
params.sortBy = sort_by;
} if (sort_order) {
params.sortOrder = sort_order;
} const response = menunggu arxivApi.get('/query', { params });
// Parse XML response
hasil const = parseArxivXML(response.data);
// Format Hasil
const formattedResults = formatSearchResults(result);
return {
content: [
{
type: "text",
text: formattedResults,
},
],
};
} catch (error) {
if (axios.isAxiosError(error)) {
return {
content: [
{
type: "text",
text: `arXiv API error: ${error.response?.data?.message ?? error.message}`,
},
],
isError: true,
};
}
throw error;
}
}
);
// Mulai menerima pesan di stdin dan mengirim pesan di stdout
const transport = new StdioServerTransport();
menunggu server.connect(transport);
console.error('arXiv Server MCP berjalan di stdio');
// Dibuat dengan Bob
Pada tahap ini, jika server Anda memerlukan kunci API, Bob akan memintanya.
5. Sebagai langkah selanjutnya, Bob menginstal dependensi dalam direktori arxiv-server dengan menjalankan perintah berikut.
mcp_settings.json.Bob/mcp.json{
"mcpServers": {}
"mcpServers": {
"arxiv": {
"command": "node",
"args": [ "/here/is/the/path/to/arxiv-server/build/index.js"
],
"disabled": false,
"alwaysAllow": [],
"disabledTools": []
}
}
}
Informasi ini melengkapi serangkaian langkah yang diambil Bob untuk mengatur server MCP.
Untuk menyelesaikan serangkaian tugas “daftar tugas”, Bob menguji server MCP. Seperti yang terlihat pada tangkapan layar sebelumnya, Bob menanyakan
Setelah eksekusi berhasil, yang dapat Anda lihat dengan mengklik wortel ke bawah untuk memperluas jendela, Bob menjalankan tes lain. Kali ini, kuerinya adalah untuk 2 makalah machine learning yang diurutkan berdasarkan tanggal pengiriman yang menurun. Bahkan dengan penggunaan parameter yang berbeda, panggilan alat MCP ini juga berhasil dijalankan.
Mengingat tes yang berhasil, Bob sekarang telah menyelesaikan semua subtugas.
Bob sudah menguji server MCP untuk kita. Namun, mari kita coba beberapa pertanyaan kita sendiri di jendela obrolan untuk melihat apakah Bob dapat mengekstrapolasi istilah pencarian yang benar dan parameter yang diperlukan.
Tanyakan Bob, “Apa makalah terbaru tentang pelacakan agen LLM?”
Dengan sendirinya, Bob mengekstrak kueri yang benar dari prompt kami dan menambahkan beberapa kata kunci tambahan untuk meningkatkan pencarian. Bob juga menetapkan jumlah maksimum hasil menjadi 10 dan mengurutkan makalah berdasarkan relevansi. Bagus.
Mari kita coba satu kueri lagi.
Menariknya, Bob secara otomatis mengubah permintaan kueri setelah melihat hasil yang tidak diinginkan. Bob tidak secara membabi buta menjalankan panggilan alat melainkan, berkolaborasi dengan pengguna sebagai agen yang membantu. Setelah dua iterasi ini, Bob mengembalikan beberapa makalah yang selaras dengan tugas awal kami.
Banyak server MCP sumber terbuka juga menyertakan dokumen bagi orang lain untuk memulai dengan mudah. Mari kita tempelkan prompt ini ke jendela obrolan:
“Di direktori ini, buat file README.md untuk mendokumentasikan server MCP ini. Sertakan petunjuk pengaturan dan penggunaan.”
Dengan satu prompt sederhana, Bob menciptakan dokumen
Mungkin Anda tertarik untuk membangun agen AI khusus riset dengan watsonx Orchestrate™ yang dapat mengakses server MCP ini? Bob dapat membuat agen hanya dengan satu prompt sederhana. Pertama, instal server watsonx Orchestrate ADK yang dibangun sebelumnya dari pasar digital yang ditemukan di panel pengaturan MCP yang kami jelajahi pada langkah 1. Kemudian, kirimkan perintah ini:
"Buat agen watsonx Orchestrate yang menggunakan server MCP arxiv ini."
Jika Anda memiliki layanan watsonx Orchestrate yang berjalan secara lokal, Bob akan menjalankan perintah yang diperlukan untuk Anda. Jika Anda lebih suka menjalankan perintah sendiri nanti, Bob akan menulis skrip dan mendokumentasikan perintah apa pun yang diperlukan.
Mari kita lihat setiap file untuk lebih memahami apa yang dihasilkan Bob. Berikut adalah file toolkit-config.yaml
Jenis: mcp
nama: arxiv-toolkit
deskripsi: Toolkit untuk mencari riset arXiv. Menyediakan akses ke metadata kertas, abstrak, dan informasi publikasi dari database arXiv.
package_root: /lokal/jalur/ke/arxiv-server
bahasa: node
perintah: node /lokal/jalur/ke/arxiv-server/arxiv-server/build/index.js
alat:
- "*"
# Dibuat dengan Bob
Selanjutnya, mari kita buka file riset-assistant-agent.yaml
nama: asisten riset
jenis: asli
deskripsi: Asisten riset AI yang membantu menemukan dan meringkas makalah akademisi dari arXiv. Mengkhususkan diri dalam mencari literatur ilmiah, menjelaskan temuan riset, dan memberikan kutipan.
judul: Asisten Peneliti
instruksi: |
Anda adalah asisten peneliti ahli yang mengkhususkan diri dalam pencarian literatur akademik di arXiv.
## Kemampuan Anda
- Mencari makalah di arXiv mengenai topik ilmiah apa pun
- Merangkum temuan penelitian dari abstrak dalam bahasa yang mudah dipahami
- Mengidentifikasi penulis utama dan tren penelitian
- Merekomendasikan makalah dan topik terkait
- Menyertakan kutipan yang tepat beserta ID arXiv dan URL
## Saat Menanggapi Pengguna
1. Selalu cantumkan ID arXiv dan URL langsung ke makalah
2. Ringkas abstrak dalam bahasa yang mudah dipahami
3. Soroti kontribusi dan temuan utama
4. Sarankan pencarian lanjutan jika relevan
5. Jelaskan secara ringkas namun informatif
## Menggunakan Alat search_arxiv
Parameter yang tersedia:
- Kueri (wajib): Kueri pencarian menggunakan sintaks arXiv
- max_results (opsional): 1-50 makalah, default 10
- start (opsional): Indeks awal untuk paginasi, default 0
- sort_by (opsional): “relevance”, “submittedDate”, atau "lastUpdatedDate"
- sort_order (opsional): “ascending” atau “descending”
## Sintaks Pencarian Lanjutan
Anda dapat menggunakan operator berikut dalam kueri:
- ti:keyword - Mencari di judul
- au:author - Mencari berdasarkan nama penulis
- abs:keyword - Mencari di abstrak
- cat:category - Menyaring berdasarkan kategori (misalnya, cs.AI, quant-ph, math.CO)
- AND, OR, ANDNOT - Operator Boolean
Contoh:
- “ti:transformer AND cat:cs.LG” - Makalah tentang Transformer dalam machine learning
- “au:Hinton” - Makalah oleh Geoffrey Hinton
- “quantum computing AND cat:quant-ph” - Komputasi kuantum dalam fisika kuantum
## Kategori Umum
- cs.AI - Kecerdasan Buatan
- cs.LG - Machine Learning
- cs.CL - Komputasi dan Bahasa
- cs.CV - Computer Vision
- quant-ph - Fisika Kuantum
- math.CO - Kombinatorika
- stat.ML - Machine learning (Statistik)## Format Tanggapan
Saat menyajikan makalah, gunakan format berikut:
**“Judul Makalah”**
- Penulis: [Nama penulis]
- Diterbitkan: [Tanggal]
- Kategori: [Kategori]
- Ringkasan: [Ringkasan singkat abstrak]
- [Lihat makalah](URL arXiv)
## Penanganan Kasus Khusus
- Jika tidak ditemukan hasil: Sarankan istilah pencarian alternatif atau kueri yang lebih luas
- Jika hasil terlalu banyak: Sarankan untuk mempersempit pencarian dengan kategori atau filter tanggal
- Jika pengguna meminta PDF: Jelaskan bahwa Anda hanya menyediakan metadata, tetapi sertakan URL tempat mereka dapat mengakses makalah tersebut
- Jika kueri tidak jelas: Ajukan pertanyaan klarifikasi mengenai bidang penelitian atau minat spesifik
tools
:- search_arxiv
config:
hidden: false
enable_cot: true
tags:
- penelitian
- akademik
- makalah
- arxiv
- pencarian-literatur
# Dibuat dengan Bob
File YAML ini mengonfigurasi asisten riset kami, agen AI khusus yang menyederhanakan penelitian akademis dengan mencari arXiv, merangkum makalah, dan memberikan kutipan dalam format terstruktur. Termasuk di dalamnya adalah petunjuk terperinci yang memandu perilaku agen, mulai dari sintaks kueri dan penggunaan alat hingga pemformatan respons dan penanganan kasus-kasus khusus. Semua informasi ini dijelaskan selagi memanfaatkan alat search_arxiv untuk mengambil dan menyajikansetup-instructions.md
Dalam tutorial ini, kami menggunakan IBM Bob, IDE yang mengutamakan AI sekaligus asisten pair programming, untuk menyederhanakan integrasi MCP dalam riset akademis. Anda secara efisien membangun server MCP yang dapat diskalakan yang mampu mencari dan mengambil kertas dari repositori arXiv.org. Sekarang, solusi Anda siap produksi, apakah Anda memilih untuk sumber terbuka untuk komunitas riset atau menerapkan dalam aplikasi perusahaan Anda untuk meningkatkan penemuan pengetahuan.
Keunggulan utama IBM Bob terletak pada kemampuannya mengubah tugas pengembangan yang kompleks menjadi alur kerja berbasis prompt yang intuitif. Hanya dengan beberapa input strategis, Bob mempercepat pembuatan prototipe, mengurangi kode boilerplate dan bahkan menyarankan pengoptimalan, memberdayakan Anda untuk fokus pada inovasi daripada implementasi.
Saat Anda terus mengeksplorasi kemampuannya, pertimbangkan bagaimana Bob dapat menyempurnakan server MCP Anda lebih lanjut. Beberapa manfaat yang dapat kami tambahkan mencakup penyaringan lanjutan, pembaruan secara real-time, dan integrasi dengan basis data akademis lain, seperti PubMed atau IEEE Xplore. Semua kemungkinan ini, dan banyak lagi lainnya, dapat dilakukan dengan beberapa prompt sederhana menggunakan IBM Bob.
Siap ambil langkah selanjutnya? Bereksperimenlah dengan menyesuaikan server MCP Anda atau pelajari lebih dalam fitur Bob untuk membuka lebih banyak potensi otomatisasi. Selamat melakukan pengodean!
Bangun, terapkan, dan kelola asisten dan agen AI yang kuat yang mengotomatiskan alur kerja dan proses dengan AI generatif.
Bangun masa depan bisnis Anda dengan solusi AI yang dapat Anda percaya.
Layanan IBM Consulting AI membantu merancang ulang cara kerja bisnis dengan AI untuk transformasi.