מדריך קלוד קוד בעברית

תיעוד 138

התחברות לכלים חיצוניים באמצעות MCP

הגדרת שרתי MCP כדי להרחיב את הסוכן שלך עם כלים חיצוניים. מכסה סוגי תעבורה, חיפוש כלים עבור ערכות כלים גדולות, אימות וטיפול בשגיאות.

הפרוטוקול Model Context Protocol (MCP) הוא תקן פתוח לחיבור סוכני AI לכלים חיצוניים ולמקורות נתונים. באמצעות MCP, הסוכן שלך יכול לתשאל מסדי נתונים, לבצע אינטגרציה עם ממשקי API כמו Slack ו-GitHub, ולהתחבר לשירותים אחרים מבלי לכתוב מימושי כלים מותאמים אישית.

שרתי MCP יכולים לרוץ כתהליכים מקומיים, להתחבר מעל HTTP, או לרוץ ישירות בתוך יישום ה-SDK שלך.

הערה: דף זה מכסה הגדרת MCP עבור ה-Agent SDK. כדי להוסיף שרתי MCP ל-CLI של Claude Code כך שייטענו בכל פרויקט, ראה טווחי התקנה של MCP.

#מדריך מהיר

דוגמה זו מתחברת לשרת ה-MCP של התיעוד של Claude Code באמצעות תעבורת HTTP ומשתמשת ב-allowedTools עם תו כללי (wildcard) כדי לאפשר את כל הכלים מהשרת.

TypeScript:

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);
  }
}

Python:

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage


async def main():
    options = ClaudeAgentOptions(
        mcp_servers={
            "claude-code-docs": {
                "type": "http",
                "url": "https://code.claude.com/docs/mcp",
            }
        },
        allowed_tools=["mcp__claude-code-docs__*"],
    )

    async for message in query(
        prompt="Use the docs MCP server to explain what hooks are in Claude Code",
        options=options,
    ):
        if isinstance(message, ResultMessage) and message.subtype == "success":
            print(message.result)


asyncio.run(main())

הסוכן מתחבר לשרת התיעוד, מחפש מידע על hooks, ומחזיר את התוצאות.

#הוספת שרת MCP

באפשרותך להגדיר שרתי MCP בקוד בעת קריאה ל-query(), או בקובץ .mcp.json הנטען באמצעות settingSources.

#בקוד

העבר שרתי MCP ישירות באפשרות mcpServers. דוגמה זו מפעילה שרת MCP מקומי של מערכת קבצים עבור /Users/me/projects. החלף נתיב זה בספריה במחשב שלך:

TypeScript:

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);
  }
}

Python:

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage


async def main():
    options = ClaudeAgentOptions(
        mcp_servers={
            "filesystem": {
                "command": "npx",
                "args": [
                    "-y",
                    "@modelcontextprotocol/server-filesystem",
                    "/Users/me/projects",
                ],
            }
        },
        allowed_tools=["mcp__filesystem__*"],
    )

    async for message in query(prompt="List files in my project", options=options):
        if isinstance(message, ResultMessage) and message.subtype == "success":
            print(message.result)


asyncio.run(main())

#מתוך קובץ תצורה

צור קובץ .mcp.json בשורש הפרויקט שלך. הקובץ נקלט כאשר מקור ההגדרות project מופעל, כפי שמוגדר כברירת מחדל באפשרויות של query(). אם אתה מגדיר את settingSources במפורש, כלול את "project" כדי שקובץ זה ייטען. החלף את /Users/me/projects בספריה במחשב שלך:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
    }
  }
}

#תזמון התחברות

Claude Code רושם את השרתים שאתה מעביר ב-options.mcpServers בעת ההפעלה ופולט את הודעת ה-init ברגע שההמתנה לתור הראשון, אם קיימת, מסתיימת. ללא options.mcpServers, Claude Code ממתין 2 שניות לשרתים ממתינים לפני התור הראשון, כך ששרתים הנטענים מתוך קבצי הגדרות כגון .mcp.json מציגים לרוב pending ב-init. מתי כל שרת מ-options.mcpServers מתחבר, והאם הוא מעכב את התור הראשון, תלוי בסוג שלו:

סוג שרתמעכב את התור הראשון?פסק זמן להמתנה בתור הראשון
שרת stdio, או שרת HTTP/SSE ללא רשימת כלים שנשמרה במטמוןכן, עד שהוא מתחברMCP_TIMEOUT, 30 שניות כברירת מחדל, החיבור נכשל במועד יעד זה
שרת מרוחק עם רשימת כלים במטמון, שנשמרה על ידי Claude Code מחיבור קודםלא, הכלים שבמטמון זמינים כבר מהתור הראשוןללא, מתחבר בקריאת הכלי הראשונה שלו, ולחיבור נדחה זה יש פסק זמן משלו
שרת SDK בתוך התהליךלא, לעולם אינו מעכב את התור הראשוןללא

כדי לחסום את ההפעלה עצמה בשלב נפרד ומוקדם יותר מאשר ההמתנה לתור הראשון, לפני שהודעת ה-init נשלחת:

  • הגדר את MCP_CONNECTION_NONBLOCKING ל-0 כדי לחסום עבור כל אצוות החיבורים. Claude Code מגביל המתנה זו ל-5 שניות כברירת מחדל. כוונן את המגבלה באמצעות משתנה הסביבה MCP_CONNECT_TIMEOUT_MS, במילישניות. שרתים שעדיין ממתינים במועד יעד זה ימשיכו להתחבר ברקע.
  • הגדר alwaysLoad: true בתצורת השרת כדי להפוך את הכלים שלו לזמינים עם הסכמות המלאות שלהם בתור הראשון, בפטור מדחיית חיפוש כלים. Claude Code ממתין בעת ההפעלה לכלים של אותו שרת, מוגבל לאותו מועד יעד, בעוד שרתים אחרים ממשיכים להתחבר ברקע. שרת מרוחק עם רשימת כלים במטמון מספק אותם מבלי להתחבר, בהתאם לטבלה שלעיל.

הודעת system עם תת-סוג init מדווחת על הסטטוס של כל שרת ברגע שהיא נפלטת. ראה טיפול בשגיאות לקריאת סטטוסים אלה.

#התרת כלי MCP

כלי MCP דורשים הרשאה מפורשת לפני ש-Claude יכול להשתמש בהם. ללא הרשאה, Claude יראה שהכלים זמינים אך לא יוכל לקרוא להם.

#מוסכמת שמות הכלים

כלי MCP פועלים לפי תבנית השמות mcp__<server-name>__<tool-name>. לדוגמה, שרת GitHub בשם "github" עם כלי בשם list_issues הופך ל-mcp__github__list_issues.

#אישור אוטומטי באמצעות allowedTools

השתמש ב-allowedTools כדי לאשר אוטומטית כלי MCP ספציפיים, כך ש-Claude יוכל להשתמש בהם ללא בקשת אישור:

TypeScript:

const _ = {
  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
    ]
  }
};

Python:

options = ClaudeAgentOptions(
    mcp_servers={
        
# your servers
    },
    allowed_tools=[
        "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
    ],
)

תווים כלליים (*) מאפשרים לך לאשר את כל הכלים משרת מסוים מבלי לציין כל אחד מהם בנפרד.

הערה: העדף את allowedTools על פני מצבי הרשאות עבור גישת MCP. permissionMode: "acceptEdits" אינו מאשר אוטומטית כלי MCP (אלא רק עריכות קבצים ופקודות Bash של מערכת הקבצים). permissionMode: "bypassPermissions" אכן מאשר אוטומטית כלי MCP, אך גם משבית את רוב בקשות הבטיחות האחרות, וזה רחב יותר מהנדרש. ראה כיצד נבדקות הרשאות עבור הבקשות שנשארות. תו כללי ב-allowedTools מעניק גישה בדיוק לשרת ה-MCP שאתה רוצה ותו לא. ראה מצבי הרשאות להשוואה מלאה.

#גילוי כלים זמינים

כדי לראות אילו כלים שרת MCP מספק, בדוק את התיעוד של השרת או בדוק את מערך ה-tools בהודעת ה-init מסוג system. שמות כלי MCP מתחילים ב-mcp__.

Claude Code פולט את הודעת ה-init לאחר ההמתנה לחיבור בתור הראשון עבור שרתים שהועברו ב-options.mcpServers, כך שמערך ה-tools מפרט את כלי ה-mcp__ של כל שרת שהתחבר עד אז, בנוסף לאלה של שרתים בעלי רשימת כלים במטמון, אשר מתחברים בשימוש הראשון. כלים של כל שרת אחר שלא התחבר אינם מופיעים. ראה טיפול בשגיאות לקריאת הסטטוס של כל שרת.

סינון זה מדפיס את שמות כלי ה-MCP:

TypeScript:

import { query } from "@anthropic-ai/claude-agent-sdk";

const options = {
  mcpServers: {
    // your servers
  },
};

for await (const message of query({ prompt: "...", options })) {
  if (message.type === "system" && message.subtype === "init") {
    const mcpTools = message.tools.filter((name) => name.startsWith("mcp__"));
    console.log("Available MCP tools:", mcpTools);
  }
}

Python:

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, SystemMessage


async def main():
    options = ClaudeAgentOptions(
        mcp_servers={
            
# your servers
        },
    )
    async for message in query(prompt="...", options=options):
        if isinstance(message, SystemMessage) and message.subtype == "init":
            mcp_tools = [t for t in message.data.get("tools", []) if t.startswith("mcp__")]
            print("Available MCP tools:", mcp_tools)


asyncio.run(main())

באפשרותך גם לבקש מ-Claude לפרט את הכלים הזמינים משרת מסוים.

#סוגי תעבורה

שרתי MCP מתקשרים עם הסוכן שלך באמצעות פרוטוקולי תעבורה שונים. בדוק את התיעוד של השרת כדי לראות באיזו תעבורה הוא תומך:

  • אם התיעוד מספק לך פקודה להרצה (כמו npx @modelcontextprotocol/server-filesystem), השתמש ב-stdio
  • אם התיעוד מספק לך כתובת URL, השתמש ב-HTTP או ב-SSE
  • אם אתה בונה כלים משלך בקוד, השתמש בשרת SDK MCP

#שרתי stdio

תהליכים מקומיים המתקשרים דרך stdin/stdout. השתמש בזה עבור שרתי MCP שאתה מריץ באותו מחשב. עבור תצורת .mcp.json, השתמש באותם שדות המוצגים ב-מתוך קובץ תצורה. בקוד, העבר את הפקודה ואת הארגומנטים שלה. החלף את /Users/me/projects בספריה במחשב שלך:

TypeScript:

const _ = {
  options: {
    mcpServers: {
      filesystem: {
        command: "npx",
        args: ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
      }
    },
    allowedTools: ["mcp__filesystem__read_file", "mcp__filesystem__list_directory"]
  }
};

Python:

options = ClaudeAgentOptions(
    mcp_servers={
        "filesystem": {
            "command": "npx",
            "args": [
                "-y",
                "@modelcontextprotocol/server-filesystem",
                "/Users/me/projects",
            ],
        }
    },
    allowed_tools=["mcp__filesystem__read_file", "mcp__filesystem__list_directory"],
)

#שרתי HTTP/SSE

השתמש ב-HTTP או ב-SSE עבור שרתי MCP המאוחסנים בענן וממשקי API מרוחקים. עבור תצורת .mcp.json, השתמש באותם שדות כמו בדוגמה ב-כותרות HTTP עבור שרתים מרוחקים, עם "type": "sse" עבור שרת SSE. בקוד, העבר את כתובת ה-URL של השרת:

TypeScript:

const _ = {
  options: {
    mcpServers: {
      "remote-api": {
        type: "sse",
        url: "https://api.example.com/mcp/sse",
        headers: {
          Authorization: `Bearer ${process.env.API_TOKEN}`
        }
      }
    },
    allowedTools: ["mcp__remote-api__*"]
  }
};

Python:

options = ClaudeAgentOptions(
    mcp_servers={
        "remote-api": {
            "type": "sse",
            "url": "https://api.example.com/mcp/sse",
            "headers": {"Authorization": f"Bearer {os.environ['API_TOKEN']}"},
        }
    },
    allowed_tools=["mcp__remote-api__*"],
)

עבור תעבורת HTTP עם תמיכה בהזרמה (streamable HTTP), השתמש ב-"type": "http" במקום זאת. ב-.mcp.json ובקובצי תצורה אחרים של JSON, הערך "streamable-http" מתקבל ככינוי עבור "http". הטיפוס McpHttpServerConfig בערכות ה-SDK מגדיר רק "http", לכן השתמש ב-"http" עבור שרתים שאתה מעביר בקוד.

#שרתי SDK MCP

הגדר כלים מותאמים אישית ישירות בקוד היישום שלך במקום להריץ תהליך שרת נפרד. ראה את המדריך לכלים מותאמים אישית לפרטי המימוש.

שרת SDK MCP שנרשם באמצעות בקשת בקרה initialize מתחיל להתחבר ברגע ש-Claude Code מעבד את הבקשה.

#חיפוש כלי MCP

כאשר מוגדרים אצלך כלי MCP רבים, הגדרות הכלים יכולות לצרוך חלק ניכר מחלון ההקשר שלך. חיפוש כלים פותר זאת על ידי מניעת כניסתן של הגדרות הכלים להקשר וטעינה רק של הכלים ש-Claude זקוק להם עבור כל תור.

חיפוש כלים מופעל כברירת מחדל. ראה חיפוש כלים עבור אפשרויות תצורה, שיטות מומלצות ושימוש בחיפוש כלים עם כלי SDK מותאמים אישית.

#אימות

רוב שרתי ה-MCP דורשים אימות כדי לגשת לשירותים חיצוניים. העבר פרטי אימות באמצעות משתני סביבה בתצורת השרת.

#העברת אישורים דרך משתני סביבה

השתמש בשדה env כדי להעביר מפתחות API, אסימונים ופרטי אימות אחרים לשרת ה-MCP:

בקוד:

const _ = {
  options: {
    mcpServers: {
      "api-server": {
        command: "npx",
        args: ["-y", "@your-org/api-mcp-server"],
        env: {
          API_KEY: process.env.API_KEY
        }
      }
    },
    allowedTools: ["mcp__api-server__*"]
  }
};
options = ClaudeAgentOptions(
    mcp_servers={
        "api-server": {
            "command": "npx",
            "args": ["-y", "@your-org/api-mcp-server"],
            "env": {"API_KEY": os.environ["API_KEY"]},
        }
    },
    allowed_tools=["mcp__api-server__*"],
)

בתוך .mcp.json:

{
  "mcpServers": {
    "api-server": {
      "command": "npx",
      "args": ["-y", "@your-org/api-mcp-server"],
      "env": {
        "API_KEY": "${API_KEY}"
      }
    }
  }
}

התחביר ${API_KEY} מרחיב משתני סביבה בזמן ריצה.

#כותרות HTTP עבור שרתים מרוחקים

עבור שרתי HTTP ו-SSE, העבר כותרות אימות ישירות בתצורת השרת:

בקוד:

const _ = {
  options: {
    mcpServers: {
      "secure-api": {
        type: "http",
        url: "https://api.example.com/mcp",
        headers: {
          Authorization: `Bearer ${process.env.API_TOKEN}`
        }
      }
    },
    allowedTools: ["mcp__secure-api__*"]
  }
};
options = ClaudeAgentOptions(
    mcp_servers={
        "secure-api": {
            "type": "http",
            "url": "https://api.example.com/mcp",
            "headers": {"Authorization": f"Bearer {os.environ['API_TOKEN']}"},
        }
    },
    allowed_tools=["mcp__secure-api__*"],
)

בתוך .mcp.json:

{
  "mcpServers": {
    "secure-api": {
      "type": "http",
      "url": "https://api.example.com/mcp",
      "headers": {
        "Authorization": "Bearer ${API_TOKEN}"
      }
    }
  }
}

התחביר ${API_TOKEN} מרחיב משתני סביבה בזמן ריצה.

לדוגמה מלאה ועובדת של שרת מרוחק המאומת באמצעות כותרות, ראה הצגת רשימת issues ממאגר.

#אימות OAuth2

ה-מפרט של MCP תומך ב-OAuth 2.1 לצורך הרשאה. ה-SDK אינו פותח דפדפן ואינו מריץ תהליך OAuth אינטראקטיבי. כאשר שרת מוגדר מחזיר אתגר הרשאה (authorization challenge) ואין אסימון שמור זמין, ריצת הסוכן נמשכת ללא הכלים של אותו שרת, והשרת מדווח על סטטוס needs-auth. מערך ה-mcp_servers של הודעת ה-system מסוג init עשוי עדיין להציג pending עבור אותו שרת בעת פליטת ההודעה. כדי לאמת אם שרת זקוק לאישורים, בצע תשאול (poll) של mcpServerStatus() ב-SDK של TypeScript או של get_mcp_status() ב-Python.

כדי לספק אישורים, השלם את תהליך ה-OAuth ביישום שלך והעבר את אסימון הגישה שהתקבל בכותרות headers של השרת:

TypeScript:

// After completing OAuth flow in your app.
// Implement getAccessTokenFromOAuthFlow for your OAuth provider.
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__*"]
};

Python:

# After completing OAuth flow in your app.
# Implement get_access_token_from_oauth_flow for your OAuth provider.
access_token = await get_access_token_from_oauth_flow()

options = ClaudeAgentOptions(
    mcp_servers={
        "oauth-api": {
            "type": "http",
            "url": "https://api.example.com/mcp",
            "headers": {"Authorization": f"Bearer {access_token}"},
        }
    },
    allowed_tools=["mcp__oauth-api__*"],
)

#דוגמאות

#הצגת רשימת issues ממאגר

דוגמה זו מתחברת ל-שרת ה-MCP המרוחק של GitHub כדי להציג את רשימת ה-issues האחרונים. הדוגמה כוללת רישום יומן לניפוי שגיאות כדי לאמת את חיבור ה-MCP ואת קריאות הכלים.

לפני ההרצה, צור אסימון גישה אישי של GitHub (PAT) עם הרשאת קריאה למאגרים שברצונך לתשאל, והגדר אותו כמשתנה סביבה:

export GITHUB_TOKEN=YOUR_GITHUB_PAT

TypeScript:

import { 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: {
        type: "http",
        url: "https://api.githubcopilot.com/mcp/",
        headers: {
          Authorization: `Bearer ${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.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);
  }
}

Python:

import asyncio
import os
from claude_agent_sdk import (
    query,
    ClaudeAgentOptions,
    ResultMessage,
    SystemMessage,
    AssistantMessage,
)


async def main():
    options = ClaudeAgentOptions(
        mcp_servers={
            "github": {
                "type": "http",
                "url": "https://api.githubcopilot.com/mcp/",
                "headers": {"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"},
            }
        },
        allowed_tools=["mcp__github__list_issues"],
    )

    async for message in query(
        prompt="List the 3 most recent issues in anthropics/claude-code",
        options=options,
    ):
        
# Verify MCP server connected successfully
        if isinstance(message, SystemMessage) and message.subtype == "init":
            print("MCP servers:", message.data.get("mcp_servers"))

        
# Log when Claude calls an MCP tool
        if isinstance(message, AssistantMessage):
            for block in message.content:
                if hasattr(block, "name") and block.name.startswith("mcp__"):
                    print("MCP tool called:", block.name)

        
# Print the final result
        if isinstance(message, ResultMessage) and message.subtype == "success":
            print(message.result)


asyncio.run(main())

בשורה MCP servers:, סטטוס של connected עבור github מאשר שהאסימון עובד. אם ל-Claude Code יש רשימת כלים במטמון עבור השרת, הסטטוס עשוי להופיע כ-pending במקום זאת, והשרת יתחבר בקריאת הכלי הראשונה שלו. אם הסטטוס הוא failed או needs-auth, ראה טיפול בשגיאות לפני שתסתמך על התוצאה, מכיוון ש-Claude עשוי לחזור לשימוש בכלים מובנים כאשר השרת אינו זמין.

#תשאול מסד נתונים

דוגמה זו משתמשת ב-DBHub כדי לתשאל מסד נתונים מסוג Postgres. הסוכן מגלה באופן אוטומטי את סכמת מסד הנתונים, כותב את שאילתת ה-SQL ומחזיר את התוצאות.

הכלי execute_sql של DBHub מריץ כל הוראת SQL שהסוכן פולט, כולל כתיבה, אלא אם תגביל אותו. הגדרת readonly = true ב-קובץ התצורה של DBHub גורמת ל-DBHub לדחות הוראות INSERT, UPDATE, DELETE והוראות DDL, כך שהדוגמה אינה יכולה לשנות את הנתונים שלך גם אם הסוכן פולט פעולת כתיבה. DBHub מחלץ את ${DATABASE_URL} מסביבת התהליך בעת טעינת התצורה, כך שמחרוזת החיבור נשארת מחוץ לקובץ. צור קובץ dbhub.toml זה לצד הסקריפט שלך:

[[sources]]
id = "production"
dsn = "${DATABASE_URL}"

[[tools]]
name = "execute_sql"
source = "production"
readonly = true

לאחר מכן הסקריפט מפנה את DBHub אל קובץ התצורה במקום להעביר מחרוזת חיבור ישירות. לפני ההרצה, הגדר את משתנה הסביבה DATABASE_URL למחרוזת החיבור שלך. החלף את ערכי המציין (placeholders) בפרטי מסד הנתונים שלך:

export DATABASE_URL=postgresql://user:password@localhost:5432/mydb

TypeScript:

import { query } from "@anthropic-ai/claude-agent-sdk";

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",
        // dbhub.toml sets readonly = true, so execute_sql rejects writes
        args: ["-y", "@bytebase/dbhub", "--config", "dbhub.toml"]
      }
    },
    allowedTools: ["mcp__postgres__execute_sql"]
  }
})) {
  if (message.type === "result" && message.subtype === "success") {
    console.log(message.result);
  }
}

Python:

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage


async def main():
    options = ClaudeAgentOptions(
        mcp_servers={
            "postgres": {
                "command": "npx",
                
# dbhub.toml sets readonly = true, so execute_sql rejects writes
                "args": [
                    "-y",
                    "@bytebase/dbhub",
                    "--config",
                    "dbhub.toml",
                ],
            }
        },
        allowed_tools=["mcp__postgres__execute_sql"],
    )

    
# Natural language query - Claude writes the SQL
    async for message in query(
        prompt="How many users signed up last week? Break it down by day.",
        options=options,
    ):
        if isinstance(message, ResultMessage) and message.subtype == "success":
            print(message.result)


asyncio.run(main())

#טיפול בשגיאות

שרתי MCP יכולים להיכשל בהתחברות ממגוון סיבות: ייתכן שתהליך השרת אינו מותקן, ייתכן שפרטי האימות אינם תקפים, או ששרת מרוחק אינו נגיש.

Claude Code פולט הודעת system עם תת-סוג init בתחילת כל שאילתה. הודעה זו כוללת את סטטוס החיבור עבור כל שרת MCP. השדה status יכול להיות "pending", "connected", "failed", "needs-auth" או "disabled". Claude Code פולט את הודעת ה-init לאחר ההמתנה לחיבור בתור הראשון עבור שרתים שהועברו ב-options.mcpServers, כך ששרת כזה שהתחבר בתוך חלון ההמתנה מציג "connected".

בהודעת ה-init, אל תתייחס ל-"pending" כאל כשל כשלעצמו. הוא יכול להעיד על כל אחד מהמקרים הבאים:

בדוק אם קיים ערך "failed" או "needs-auth" כדי לזהות שרתים שלא יהיו שמישים:

TypeScript:

import { query } from "@anthropic-ai/claude-agent-sdk";

try {
  for await (const message of query({
    prompt: "Process data",
    options: {
      mcpServers: {
        // Replace dataServer with your server configuration
        "data-processor": dataServer
      }
    }
  })) {
    if (message.type === "system" && message.subtype === "init") {
      const unavailableServers = message.mcp_servers.filter(
        (s) => s.status === "failed" || s.status === "needs-auth"
      );

      if (unavailableServers.length > 0) {
        console.warn("Unavailable MCP servers:", unavailableServers);
      }
    }

    if (message.type === "result" && message.subtype === "error_during_execution") {
      console.error("Execution failed");
    }
  }
} catch (error) {
  // A single-shot query() throws after yielding an error result. If the
  // failure was an error result, the error subtype branch above has
  // already run; a failure to start or reach the Claude Code process
  // yields no result message. MCP servers that fail to connect don't
  // throw: use the status check above, and note that servers still
  // "pending" at init need a later status check.
  console.log(`Session ended with an error: ${error}`);
}

Python:

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, SystemMessage, ResultMessage


async def main():
    
# Replace data_server with your server configuration
    options = ClaudeAgentOptions(mcp_servers={"data-processor": data_server})

    try:
        async for message in query(prompt="Process data", options=options):
            if isinstance(message, SystemMessage) and message.subtype == "init":
                unavailable_servers = [
                    s
                    for s in message.data.get("mcp_servers", [])
                    if s.get("status") in ("failed", "needs-auth")
                ]

                if unavailable_servers:
                    print(f"Unavailable MCP servers: {unavailable_servers}")

            if (
                isinstance(message, ResultMessage)
                and message.subtype == "error_during_execution"
            ):
                print("Execution failed")
    except Exception as error:
        
# A single-shot query() raises after yielding an error result. If the
        
# failure was an error result, the error subtype branch above has
        
# already run; a failure to start or reach the Claude Code process
        
# yields no result message. MCP servers that fail to connect don't
        
# raise: use the status check above, and note that servers still
        
# "pending" at init need a later status check.
        print(f"Session ended with an error: {error}")


asyncio.run(main())

סטטוס של שרת מרוחק יכול להשתנות גם לאחר שהוא מדווח על "connected". כאשר החיבור אליו מתנתק באמצע ההפעלה, Claude Code מחזיר את השרת לסטטוס "pending" בזמן חיבור מחדש. קריאה מאוחרת יותר ל-mcpServerStatus() ב-TypeScript, או ל-ClaudeSDKClient.get_mcp_status() ב-Python, יכולה לדווח על "pending" עבור שרת שראית קודם לכן כמחובר, ללא שום שינוי תצורה מצדך.

לאחר חמישה ניסיונות חיבור מחדש שנכשלו, השרת מדווח על "failed", או על "needs-auth" כאשר הוא זקוק להרשאה מחדש. כדי לנסות שוב באופן ידני, קרא ל-reconnectMcpServer() ב-TypeScript או ל-ClaudeSDKClient.reconnect_mcp_server() ב-Python.

#פתרון בעיות

#שרת מציג סטטוס "failed"

בדוק את הודעת ה-init כדי לראות אילו שרתים נכשלו בהתחברות:

TypeScript:

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`);
    }
  }
}

Python:

if isinstance(message, SystemMessage) and message.subtype == "init":
    for server in message.data.get("mcp_servers", []):
        if server.get("status") == "failed":
            print(f"Server {server['name']} failed to connect")

סטטוס "pending" אינו אומר שהשרת נכשל. ראה טיפול בשגיאות עבור המקרים שהוא מכסה ב-init. כדי לקבל סטטוסים מעודכנים בשלב מאוחר יותר בהפעלה, קרא למתודה mcpServerStatus() של השאילתה ב-SDK של TypeScript, או ל-ClaudeSDKClient.get_mcp_status() ב-Python.

גורמים נפוצים:

  • משתני סביבה חסרים: ודא שאסימונים ופרטי אימות נדרשים מוגדרים. עבור שרתי stdio, ודא שהשדה env תואם למה שהשרת מצפה לו.
  • שרת אינו מותקן: עבור פקודות npx, ודא שהחבילה קיימת וש-Node.js נמצא ב-PATH שלך.
  • מחרוזת חיבור לא תקינה: עבור שרתי מסדי נתונים, ודא את פורמט מחרוזת החיבור וכי מסד הנתונים נגיש.
  • בעיות רשת: עבור שרתי HTTP/SSE מרוחקים, בדוק שה-URL נגיש ושחומות אש כלשהן מאפשרות את החיבור.

#כלים אינם נקראים

אם Claude רואה כלים אך אינו משתמש בהם, בדוק שהענקת הרשאה באמצעות allowedTools:

TypeScript:

const _ = {
  options: {
    mcpServers: {
      // your servers
    },
    allowedTools: ["mcp__servername__*"] // Auto-approve calls from this server
  }
};

Python:

options = ClaudeAgentOptions(
    mcp_servers={
        
# your servers
    },
    allowed_tools=["mcp__servername__*"],  
# Auto-approve calls from this server
)

#פסק זמן בחיבור

חיבורי שרת MCP מגיעים לפסק זמן לאחר 30 שניות כברירת מחדל. כדי לשנות את משך הזמן שקריאת כלי פעילה רשאית להימשך, הגדר את MCP_TOOL_TIMEOUT. אם השרת שלך זקוק לזמן רב יותר להפעלה, החיבור נכשל. הגדל את מגבלת החיבור באמצעות משתנה הסביבה MCP_TIMEOUT, במילישניות. עבור שרתים הזקוקים לזמן אתחול ארוך יותר, שקול גם:

  • שימוש בשרת קל משקל יותר אם זמין
  • חימום מוקדם של השרת לפני הפעלת הסוכן שלך
  • בדיקת יומני השרת לגילוי גורמים לאתחול איטי

ב-TypeScript, באפשרותך להגדיר את מגבלת קריאת הכלי עבור שרת SDK MCP בודד על ידי העברת timeout ל-createSdkMcpServer().

#פלט כלי חורג ממספר האסימונים המרבי המותר

ה-SDK מחיל את אותה מגבלת פלט MCP כמו Claude Code. כאשר תוצאת כלי גדולה מ-25,000 אסימונים, הפלט המלא נשמר בקובץ ותוצאת הכלי מוחלפת בהודעת שגיאה המציינת את נתיב הקובץ, כך שהסוכן יכול לקרוא את הפלט בחזרה בחלקים. הגדל את המגבלה באמצעות משתנה הסביבה MAX_MCP_OUTPUT_TOKENS. ראה מגבלות פלט ואזהרות של MCP להתנהגות המלאה, כולל כיצד שרת יכול להצהיר על מגבלה גבוהה יותר עבור כלי ספציפי באמצעות ההערה anthropic/maxResultSizeChars.

#משאבים קשורים