ブログ • 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 五分支のみ。
- managed settings の deniedMcpServers に serverUrl グロブと serverName を併記可。2.1.318 から serverUrl は Anthropic 托管 MCP の upstreamUrl にも効く。
- 会话メタデータ JSON に serverKind、upstreamUrl、connectorUrl、serverName、sessionSurface が必須。欠落や enum 誤りなら mcp_url_deny_gate は schema を先に返す。
- deny 分支の監査ログに decision denied、reason mcp_server_denied、matchedRule、matchedPattern、upstreamUrl。SIEM は matchedRule で集計し serverCommand deny と混ぜない。
- cloud と self-hosted runner では connector は connectorUrl で serverUrl を先に照合し、だめなら serverName で deny_by_name。一致なしは allow。
先にこれだけ: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 にも効く。
{
"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": "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。
{
"$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。
{
"tool": "mcp__analytics-mcp__search",
"arguments": {
"query": "quarterly revenue"
}
}
{
"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": "serverUrl",
"matchedPattern": "https://mcp.example.com/v1/*",
"upstreamUrl": "https://mcp.example.com/v1/tools"
}
| セッションまたは URL 信号 | mcp_url_deny_gate 戻り | 運用対応 |
|---|---|---|
| upstreamUrl が serverUrl グロブに一致 | deny_by_url | decision denied、matchedRule serverUrl、matchedPattern、upstreamUrl に合わせる。 |
| connectorUrl が serverUrl に一致し upstream は不一致 | deny_by_connector_url | matchedRule serverUrl を書き connectorUrl を残して cloud 帰属。 |
| serverName が deniedMcpServers 名称规则に一致 | deny_by_name | reason mcp_server_denied と matchedRule serverName を書く。 |
| メタデータ JSON 形状错误或 deny リスト欠落 | schema | managed 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。
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、会话メタデータ、監査ログをどう検証するか
- 1Schema で deny リスト形状を固定
開く JSON Schema。1欄に deniedMcpServers schema、2欄に serverUrl と serverName サンプル。required や型错误を先に表示し、形状错误で deny_by_url や allow を返さない。
- 2フォーマットで MCP tool 呼び出しを確認
開く JSON フォーマット。MCP tool 呼び出し JSON を貼る。tool と arguments を確認し、mcp_url_deny_gate が deny_by_url か allow か照合する。
- 3Diff で 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 を分けて集計。