{"record":{"id":"45990fbeeb9d8ac7","repo":"BerriAI/litellm","slug":"mcp-security-guardrail-name-is-required","errorCode":null,"errorMessage":"MCP Security: guardrail_name is required","messagePattern":"MCP Security: guardrail_name is required","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/proxy/guardrails/guardrail_hooks/mcp_security/__init__.py","lineNumber":21,"sourceCode":"import litellm\nfrom litellm.proxy.guardrails.guardrail_hooks.mcp_security.mcp_security_guardrail import (\n    MCPSecurityGuardrail,\n)\nfrom litellm.types.guardrails import SupportedGuardrailIntegrations\n\nif TYPE_CHECKING:\n    from litellm import Router\n    from litellm.types.guardrails import Guardrail, LitellmParams\n\n\ndef initialize_guardrail(\n    litellm_params: \"LitellmParams\",\n    guardrail: \"Guardrail\",\n    llm_router: Optional[\"Router\"] = None,\n):\n    guardrail_name: Final = guardrail.get(\"guardrail_name\")\n    if not guardrail_name:\n        raise ValueError(\"MCP Security: guardrail_name is required\")\n\n    on_violation: Final[Literal[\"block\", \"alert\"]] = cast(\n        Literal[\"block\", \"alert\"],\n        getattr(litellm_params, \"on_violation\", \"block\"),\n    )\n\n    mcp_security_guardrail: Final = MCPSecurityGuardrail(\n        guardrail_name=guardrail_name,\n        event_hook=litellm_params.mode,\n        default_on=litellm_params.default_on or False,\n        on_violation=on_violation,\n    )\n\n    litellm.logging_callback_manager.add_litellm_callback(mcp_security_guardrail)\n    return mcp_security_guardrail\n\n\nguardrail_initializer_registry: Final = {","sourceCodeStart":3,"sourceCodeEnd":39,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/guardrails/guardrail_hooks/mcp_security/__init__.py#L3-L39","documentation":"initialize_guardrail() for the MCP security guardrail requires guardrail_name on the guardrail entry and raises ValueError without it. As with other guardrail init errors, it fires at proxy startup or config reload when the mcp_security entry is malformed.","triggerScenarios":"A guardrails config entry enabling the mcp_security guardrail without a guardrail_name key.","commonSituations":"Hand-assembled guardrail YAML missing the name line; config templating that drops empty-name entries; entries written by mirroring other guardrails' minimal forms.","solutions":["Add guardrail_name: <unique-name> to the mcp_security guardrail entry","Add a config lint step that asserts every guardrails entry has a non-empty guardrail_name"],"exampleFix":"# before\n guardrails:\n   - guardrail: mcp_security\n     litellm_params:\n       mode: pre_call\n\n# after\n guardrails:\n   - guardrail: mcp_security\n     guardrail_name: mcp-security\n     litellm_params:\n       mode: pre_call","handlingStrategy":"validation","validationCode":"for g in config.get(\"guardrails\", []):  \n    assert g.get(\"guardrail_name\"), f\"guardrail {g.get('guardrail')!r} missing guardrail_name\"","typeGuard":"def has_guardrail_name(entry: object) -> bool:  \n    return isinstance(entry, dict) and isinstance(entry.get(\"guardrail_name\"), str) and bool(entry[\"guardrail_name\"].strip())","tryCatchPattern":null,"preventionTips":["Lint guardrail YAML in CI: every entry needs a non-empty guardrail_name","Generate configs from typed schemas so required fields cannot be silently dropped"],"tags":["mcp","guardrail","config","startup"],"backgroundTag":"config-validation-failed","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}