Model Context Protocol (MCP) adalah standar terbuka untuk menghubungkan agen AI ke alat dan sumber data eksternal. Dengan MCP, agen Anda dapat menanyakan database, mengintegrasikan dengan API seperti Slack dan GitHub, dan terhubung ke layanan lain tanpa menulis implementasi alat khusus.
Server MCP dapat berjalan sebagai proses lokal, terhubung melalui HTTP, atau dieksekusi langsung dalam aplikasi SDK Anda.
Contoh ini terhubung ke server MCP dokumentasi Claude Code menggunakan transport HTTP dan menggunakan allowedTools dengan wildcard untuk mengizinkan semua alat dari server.
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Use the docs MCP server to explain what hooks are in Claude Code",
options: {
mcpServers: {
"claude-code-docs": {
type: "http",
url: "https://code.claude.com/docs/mcp"
}
},
allowedTools: ["mcp__claude-code-docs__*"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Agen terhubung ke server dokumentasi, mencari informasi tentang hooks, dan mengembalikan hasilnya.
Anda dapat mengonfigurasi server MCP dalam kode saat memanggil query(), atau dalam file .mcp.json yang dimuat SDK secara otomatis.
Teruskan server MCP langsung dalam opsi mcpServers:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "List files in my project",
options: {
mcpServers: {
"filesystem": {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
}
},
allowedTools: ["mcp__filesystem__*"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Buat file .mcp.json di root proyek Anda. SDK memuat ini secara otomatis:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
}
}
}Alat MCP memerlukan izin eksplisit sebelum Claude dapat menggunakannya. Tanpa izin, Claude akan melihat bahwa alat tersedia tetapi tidak akan dapat memanggilnya.
Alat MCP mengikuti pola penamaan mcp__<server-name>__<tool-name>. Misalnya, server GitHub bernama "github" dengan alat list_issues menjadi mcp__github__list_issues.
Gunakan allowedTools untuk menentukan alat MCP mana yang dapat digunakan Claude:
options: {
mcpServers: { /* your servers */ },
allowedTools: [
"mcp__github__*", // All tools from the github server
"mcp__db__query", // Only the query tool from db server
"mcp__slack__send_message" // Only send_message from slack server
]
}Wildcard (*) memungkinkan Anda mengizinkan semua alat dari server tanpa mencantumkan masing-masing secara individual.
Alih-alih mencantumkan alat yang diizinkan, Anda dapat mengubah mode izin untuk memberikan akses yang lebih luas:
permissionMode: "acceptEdits": Secara otomatis menyetujui penggunaan alat (masih meminta operasi destruktif)permissionMode: "bypassPermissions": Melewati semua prompt keamanan, termasuk operasi destruktif seperti penghapusan file atau menjalankan perintah shell. Gunakan dengan hati-hati, terutama dalam produksi. Mode ini menyebar ke subagen yang dihasilkan oleh alat Task.options: {
mcpServers: { /* your servers */ },
permissionMode: "acceptEdits" // No need for allowedTools
}Lihat Permissions untuk detail lebih lanjut tentang mode izin.
Untuk melihat alat apa yang disediakan server MCP, periksa dokumentasi server atau terhubung ke server dan periksa pesan init system:
for await (const message of query({ prompt: "...", options })) {
if (message.type === "system" && message.subtype === "init") {
console.log("Available MCP tools:", message.mcp_servers);
}
}Server MCP berkomunikasi dengan agen Anda menggunakan protokol transport yang berbeda. Periksa dokumentasi server untuk melihat transport mana yang didukungnya:
npx @modelcontextprotocol/server-github), gunakan stdioProses lokal yang berkomunikasi melalui stdin/stdout. Gunakan ini untuk server MCP yang Anda jalankan di mesin yang sama:
Gunakan HTTP atau SSE untuk server MCP yang dihosting cloud dan API jarak jauh:
Untuk HTTP (non-streaming), gunakan "type": "http" sebagai gantinya.
Tentukan alat khusus langsung dalam kode aplikasi Anda alih-alih menjalankan proses server terpisah. Lihat panduan alat khusus untuk detail implementasi.
Ketika Anda memiliki banyak alat MCP yang dikonfigurasi, definisi alat dapat mengonsumsi bagian signifikan dari jendela konteks Anda. Pencarian alat MCP menyelesaikan ini dengan memuat alat secara dinamis sesuai permintaan alih-alih memuat semuanya sebelumnya.
Pencarian alat berjalan dalam mode otomatis secara default. Ini diaktifkan ketika deskripsi alat MCP Anda akan mengonsumsi lebih dari 10% dari jendela konteks. Ketika dipicu:
defer_loading: true daripada dimuat ke konteks sebelumnyaPencarian alat memerlukan model yang mendukung blok tool_reference: Sonnet 4 dan yang lebih baru, atau Opus 4 dan yang lebih baru. Model Haiku tidak mendukung pencarian alat.
Kontrol perilaku pencarian alat dengan variabel lingkungan ENABLE_TOOL_SEARCH:
| Nilai | Perilaku |
|---|---|
auto | Diaktifkan ketika alat MCP melebihi 10% konteks (default) |
auto:5 | Diaktifkan pada ambang 5% (sesuaikan persentasenya) |
true | Selalu diaktifkan |
false | Dinonaktifkan, semua alat MCP dimuat sebelumnya |
Atur nilai dalam opsi env:
const options = {
mcpServers: { /* your MCP servers */ },
env: {
ENABLE_TOOL_SEARCH: "auto:5" // Enable at 5% threshold
}
};Sebagian besar server MCP memerlukan autentikasi untuk mengakses layanan eksternal. Teruskan kredensial melalui variabel lingkungan dalam konfigurasi server.
Gunakan bidang env untuk meneruskan kunci API, token, dan kredensial lainnya ke server MCP:
Lihat Daftar masalah dari repositori untuk contoh kerja lengkap dengan logging debug.
Untuk server HTTP dan SSE, teruskan header autentikasi langsung dalam konfigurasi server:
Spesifikasi MCP mendukung OAuth 2.1 untuk otorisasi. SDK tidak menangani alur OAuth secara otomatis, tetapi Anda dapat meneruskan token akses melalui header setelah menyelesaikan alur OAuth dalam aplikasi Anda:
// After completing OAuth flow in your app
const accessToken = await getAccessTokenFromOAuthFlow();
const options = {
mcpServers: {
"oauth-api": {
type: "http",
url: "https://api.example.com/mcp",
headers: {
Authorization: `Bearer ${accessToken}`
}
}
},
allowedTools: ["mcp__oauth-api__*"]
};Contoh ini terhubung ke server MCP GitHub untuk mencantumkan masalah terbaru. Contoh ini mencakup logging debug untuk memverifikasi koneksi MCP dan panggilan alat.
Sebelum menjalankan, buat token akses pribadi GitHub dengan cakupan repo dan atur sebagai variabel lingkungan:
export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxximport { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "List the 3 most recent issues in anthropics/claude-code",
options: {
mcpServers: {
"github": {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-github"],
env: {
GITHUB_TOKEN: process.env.GITHUB_TOKEN
}
}
},
allowedTools: ["mcp__github__list_issues"]
}
})) {
// Verify MCP server connected successfully
if (message.type === "system" && message.subtype === "init") {
console.log("MCP servers:", message.mcp_servers);
}
// Log when Claude calls an MCP tool
if (message.type === "assistant") {
for (const block of message.content) {
if (block.type === "tool_use" && block.name.startsWith("mcp__")) {
console.log("MCP tool called:", block.name);
}
}
}
// Print the final result
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Contoh ini menggunakan server MCP Postgres untuk menanyakan database. String koneksi diteruskan sebagai argumen ke server. Agen secara otomatis menemukan skema database, menulis kueri SQL, dan mengembalikan hasilnya:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Connection string from environment variable
const connectionString = process.env.DATABASE_URL;
for await (const message of query({
// Natural language query - Claude writes the SQL
prompt: "How many users signed up last week? Break it down by day.",
options: {
mcpServers: {
"postgres": {
command: "npx",
// Pass connection string as argument to the server
args: ["-y", "@modelcontextprotocol/server-postgres", connectionString]
}
},
// Allow only read queries, not writes
allowedTools: ["mcp__postgres__query"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Server MCP dapat gagal terhubung karena berbagai alasan: proses server mungkin tidak terinstal, kredensial mungkin tidak valid, atau server jarak jauh mungkin tidak dapat dijangkau.
SDK mengirimkan pesan system dengan subtype init di awal setiap kueri. Pesan ini mencakup status koneksi untuk setiap server MCP. Periksa bidang status untuk mendeteksi kegagalan koneksi sebelum agen mulai bekerja:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Process data",
options: {
mcpServers: {
"data-processor": dataServer
}
}
})) {
if (message.type === "system" && message.subtype === "init") {
const failedServers = message.mcp_servers.filter(
s => s.status !== "connected"
);
if (failedServers.length > 0) {
console.warn("Failed to connect:", failedServers);
}
}
if (message.type === "result" && message.subtype === "error_during_execution") {
console.error("Execution failed");
}
}Periksa pesan init untuk melihat server mana yang gagal terhubung:
if (message.type === "system" && message.subtype === "init") {
for (const server of message.mcp_servers) {
if (server.status === "failed") {
console.error(`Server ${server.name} failed to connect`);
}
}
}Penyebab umum:
env cocok dengan apa yang diharapkan server.npx, verifikasi paket ada dan Node.js ada di PATH Anda.Jika Claude melihat alat tetapi tidak menggunakannya, periksa bahwa Anda telah memberikan izin dengan allowedTools atau dengan mengubah mode izin:
options: {
mcpServers: { /* your servers */ },
allowedTools: ["mcp__servername__*"] // Required for Claude to use the tools
}SDK MCP memiliki batas waktu default 60 detik untuk koneksi server. Jika server Anda membutuhkan waktu lebih lama untuk memulai, koneksi akan gagal. Untuk server yang memerlukan waktu startup lebih lama, pertimbangkan:
allowedTools dan disallowedToolsWas this page helpful?