ブログ • Claude Code / MCP

Claude Code 2.1.318 に上げ、managed settings の deniedMcpServers に URL 规则があるとき、Anthropic 托管 MCP と cloud connector の JSON ログ停点は?

2026年11月4日 Anthropic は Claude Code 2.1.318 をリリース。managed settings の deniedMcpServers に serverUrl があると Anthropic 托管 MCP も upstreamUrl で拒否され、cloud と self-hosted runner の connector は connectorUrl を先に照合し、だめなら serverName で拒否。

会话 server メタデータ JSON に serverKind、upstreamUrl、connectorUrl、serverName、sessionSurface。拒否された MCP tool 呼び出しの監査 JSON に decision denied、reason mcp_server_denied、matchedRule、matchedPattern、upstreamUrl。mcp_url_deny_gate の schema、deny_by_url、deny_by_connector_url、deny_by_name、allow と照合し serverCommand env-only と混ぜない。

serverCommand 拒否は MCP env allowlist と serverCommand。MCP セキュリティ基線は MCP セキュリティ。非対話 elicitation タイムアウト停点は MCP elicitation timeout JSON。本記事は 2.1.318 の deniedMcpServers URL 拡張、managed settings JSON、会话 server メタデータ、MCP tool 呼び出し、mcp_server_denied 監査、mcp_url_deny_gate 五分支のみ。

先にこれだけ:2.1.318 が拡張するのは deniedMcpServers URL による托管 MCP と cloud connector の一致と mcp_server_denied 監査であり serverCommand env-only 表の書き換えではない。以下 changelog、managed settings JSON、会话メタデータ、MCP 呼び出し、監査表、mcp_url_deny_gate、JSONNote 検証。

2.1.318 は deniedMcpServers URL を托管 MCP と cloud connector へどう拡張するか

変更は Claude Code changelog、タグは v2.1.318 release。以前はユーザー自配 MCP 中心だったが、2.1.318 では serverUrl が Anthropic 托管 MCP の upstreamUrl にも効く。cloud と self-hosted runner の connector は connectorUrl を先に照合し、だめなら serverName。

拒否は MCP tool 呼び出し前。監査 JSON に decision denied、reason mcp_server_denied、matchedRule、matchedPattern、upstreamUrl を残し、URL 规则で SIEM 帰属する。

managed settings の deniedMcpServers に serverUrl と serverName をどう書くか

組織 managed settings の deniedMcpServers に serverUrl グロブと serverName を書ける。2.1.318 から serverUrl は Anthropic 托管 MCP の upstreamUrl と cloud connector の connectorUrl にも効く。

managed settings:serverUrl グロブと serverName 各1件。
{
  "deniedMcpServers": [
    {
      "serverUrl": "https://mcp.example.com/v1/*"
    },
    {
      "serverName": "slack-connector"
    }
  ]
}

serverUrl が文字列でない、deniedMcpServers が配列でないなら schema が先に失敗。形状错误を allow と混同しない。

会话 server メタデータ JSON の upstreamUrl と sessionSurface

MCP サーバー解決時にメタデータ JSON を書く。serverKind で anthropic_hosted と user_configured を分け、upstreamUrl、connectorUrl、serverName、sessionSurface を載せる。

会话メタデータ:serverKind、upstreamUrl、connectorUrl、serverName、sessionSurface。
{
  "serverKind": "anthropic_hosted",
  "upstreamUrl": "https://mcp.example.com/v1/tools",
  "connectorUrl": "https://connect.example.com/slack",
  "serverName": "analytics-mcp",
  "sessionSurface": "cloud"
}

upstreamUrl と connectorUrl は非空文字列、sessionSurface は enum 内。serverKind 欠落や余分なキーなら schema。规则未命中で allow。

会话メタデータ JSON Schema:形状を通してから mcp_url_deny_gate。
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "required": ["serverKind", "upstreamUrl", "connectorUrl", "serverName", "sessionSurface"],
  "properties": {
    "serverKind": { "type": "string", "enum": ["anthropic_hosted", "user_configured", "connector"] },
    "upstreamUrl": { "type": "string", "minLength": 1 },
    "connectorUrl": { "type": "string", "minLength": 1 },
    "serverName": { "type": "string", "minLength": 1 },
    "sessionSurface": { "type": "string", "enum": ["cloud", "local", "self_hosted_runner"] }
  }
}

MCP tool 呼び出し JSON と规则未命中 server メタデータの照合

upstreamUrl が serverUrl に一致すると tool JSON に mcp__analytics-mcp__search と arguments。MCP tool は実行せず decision denied。CALL_OUTSIDE は allow。

规则命中:MCP tool 呼び出し deny。
{
  "tool": "mcp__analytics-mcp__search",
  "arguments": {
    "query": "quarterly revenue"
  }
}
规则未命中:server メタデータ allow。
{
  "serverKind": "anthropic_hosted",
  "upstreamUrl": "https://other.example.com/v1/tools",
  "connectorUrl": "https://connect.example.com/other",
  "serverName": "other-mcp",
  "sessionSurface": "cloud"
}

監査ログの decision denied と mcp_server_denied の書き方

upstreamUrl または connectorUrl が规则に一致すると decision denied、reason mcp_server_denied、matchedRule、matchedPattern、upstreamUrl。connectorUrl も cloud 帰属用に残す。serverCommand env-only と URL deny を同一 reason に混ぜない。

監査ログ:decision denied、reason mcp_server_denied、matchedRule、matchedPattern、upstreamUrl。
{
  "decision": "denied",
  "reason": "mcp_server_denied",
  "matchedRule": "serverUrl",
  "matchedPattern": "https://mcp.example.com/v1/*",
  "upstreamUrl": "https://mcp.example.com/v1/tools"
}
セッションまたは URL 信号mcp_url_deny_gate 戻り運用対応
upstreamUrl が serverUrl グロブに一致deny_by_urldecision denied、matchedRule serverUrl、matchedPattern、upstreamUrl に合わせる。
connectorUrl が serverUrl に一致し upstream は不一致deny_by_connector_urlmatchedRule serverUrl を書き connectorUrl を残して cloud 帰属。
serverName が deniedMcpServers 名称规则に一致deny_by_namereason mcp_server_denied と matchedRule serverName を書く。
メタデータ JSON 形状错误或 deny リスト欠落schemamanaged settings または ctx を直してから deny 分支。

mcp_url_deny_gate は schema と五 deny 分支をどう選ぶか

順序:CTX_SCHEMA で serverKind、upstreamUrl、connectorUrl、serverName、sessionSurface を検証;deniedMcpServers を走査し upstreamUrl が serverUrl に一致なら deny_by_url、connectorUrl 一致なら deny_by_connector_url、serverName 一致なら deny_by_name、否则 allow。

deny_by_url と deny_by_connector_url を mcp_denied 一つに畳まない。cloud connector は deny_by_connector_url を分離、托管 MCP は deny_by_url、名称は deny_by_name。

mcp_url_deny_gate:schema、deny_by_url、deny_by_connector_url、deny_by_name、allow。
def actual_type(data: object) -> str:
    if data is None:
        return "null"
    if isinstance(data, bool):
        return "boolean"
    if isinstance(data, list):
        return "array"
    if isinstance(data, int):
        return "integer"
    if isinstance(data, float):
        return "number"
    if isinstance(data, str):
        return "string"
    if isinstance(data, dict):
        return "object"
    raise TypeError(type(data))

def validate(data: object, schema: dict) -> list[str]:
    errors: list[str] = []
    if not isinstance(schema, dict):
        return errors
    types = schema.get("type")
    if isinstance(types, str):
        types = [types]
    actual = actual_type(data)
    if types and not any(t == actual or (t == "number" and actual == "integer") for t in types):
        errors.append("type")
    if "enum" in schema and not any(value == data for value in schema["enum"]):
        errors.append("enum")
    if isinstance(data, str) and "minLength" in schema and len(data) < schema["minLength"]:
        errors.append("minLength")
    if isinstance(data, dict) and schema.get("properties"):
        for key in schema.get("required") or []:
            if key not in data:
                errors.append(f"required:{key}")
        if schema.get("additionalProperties") is False:
            for key in data:
                if key not in schema["properties"]:
                    errors.append(f"additional:{key}")
        for key, sub in schema["properties"].items():
            if key in data and data[key] is not None:
                errors.extend(validate(data[key], sub))
    return errors

def url_match(url: str, pattern: str) -> bool:
    return fnmatch(url, pattern)

def mcp_url_deny_gate(ctx: dict, deny_doc: dict, schema: dict) -> str:
    if validate(ctx, schema):
        return "schema"
    entries = deny_doc.get("deniedMcpServers")
    if not isinstance(entries, list):
        return "schema"
    upstream = ctx.get("upstreamUrl", "")
    connector = ctx.get("connectorUrl", "")
    name = ctx.get("serverName", "")
    for entry in entries:
        if not isinstance(entry, dict):
            continue
        pat = entry.get("serverUrl")
        if isinstance(pat, str):
            if upstream and url_match(upstream, pat):
                return "deny_by_url"
            if connector and url_match(connector, pat):
                return "deny_by_connector_url"
        rule_name = entry.get("serverName")
        if isinstance(rule_name, str) and rule_name and rule_name == name:
            return "deny_by_name"
    return "allow"

JSONNote で managed settings、会话メタデータ、監査ログをどう検証するか

  1. 1
    Schema で deny リスト形状を固定

    開く JSON Schema。1欄に deniedMcpServers schema、2欄に serverUrl と serverName サンプル。required や型错误を先に表示し、形状错误で deny_by_url や allow を返さない。

  2. 2
    フォーマットで MCP tool 呼び出しを確認

    開く JSON フォーマット。MCP tool 呼び出し JSON を貼る。tool と arguments を確認し、mcp_url_deny_gate が deny_by_url か allow か照合する。

  3. 3
    Diff で allow と denied 監査ログを比較

    開く JSON Diff。左に CALL_OUTSIDE allow サンプル、右に decision denied と reason mcp_server_denied サンプル。Diff で光る matchedPattern が SIEM 规则の键行。

よくある質問

serverUrl 规则と旧版の自配 MCP のみ拒否との違いは?

旧版 serverUrl は主にユーザー自配 HTTP MCP。2.1.318 から upstreamUrl の Anthropic 托管 MCP にも効き、cloud では connectorUrl を先に照合。

deny_by_url と deny_by_connector_url をログでどう区別するか?

deny_by_url は matchedRule serverUrl と upstreamUrl。deny_by_connector_url は connectorUrl 命中で upstream 不一致可、connectorUrl と sessionSurface を残す。

serverName 规则と serverUrl 规则はどちらが先か?

mcp_url_deny_gate は serverUrl を先に走査。upstreamUrl→deny_by_url、connectorUrl→deny_by_connector_url、serverName→deny_by_name。serverName に URL グロブを書かない。

URL deny と serverCommand env-only deny の関係は?

serverCommand は stdio 起動と env 占位用で serverUrl による upstream 拒否の代わりにならない。JSON は分離し mcp_url_deny_gate は URL と serverName のみ。

本篇は攻击や bypass 教程か?

いいえ。2.1.318 deniedMcpServers URL 拡張の JSON 形状、mcp_server_denied 監査、mcp_url_deny_gate 五分支の説明のみ。URL や connector で管控を bypass する手順は書かない。

まとめ

Claude Code 2.1.318 は deniedMcpServers URL を拡張し、托管 MCP upstream と cloud connector を照合し、監査 JSON に decision denied、reason mcp_server_denied、matchedRule、matchedPattern、upstreamUrl を書く。managed settings、会话メタデータ、MCP 呼び出し、denied 監査の四样本で mcp_url_deny_gate を動かす。

結論:メタデータ JSON が schema 不通 → schema。upstreamUrl が serverUrl → deny_by_url。connectorUrl が serverUrl → deny_by_connector_url。serverName → deny_by_name。不一致 → allow。deny 監査は decision denied、reason mcp_server_denied、matchedRule、matchedPattern、upstreamUrl。

次:Schema で deniedMcpServers とメタデータを固定し、MCP 呼び出しをフォーマットで見て、allow と denied 監査ログを Diff し、deny_by_url、deny_by_connector_url、deny_by_name、allow を分けて集計。

ブログへ戻る