
I Checked the Egress IPs of Web Fetch and MCP Connector on Claude Platform on AWS
This page has been translated by machine translation. View original
When Claude Platform on AWS's Web Fetch and MCP Connector access external sites, where do the requests originate from? I observed the egress IP from the access logs of a Lambda function URL and verified through actual measurement whether it stays within the AWS network.
Previous articles:
TL;DR
Observation results (as of May 13, 2026):
| Feature | egress IP | Registered organization | Origin ASN |
|---|---|---|---|
| Web Fetch | 34.162.xxx.xxx |
Google LLC | AS396982 GOOGLE-CLOUD-PLATFORM |
| MCP Connector | 160.79.106.xxx |
Anthropic, PBC | AS396982 GOOGLE-CLOUD-PLATFORM |
- Both are Columbus, Ohio (US) according to GeoIP
- No difference in egress IP was observed between
inference_geo: usandglobal
Background
In the previous article, I presented a decision flowchart comparing it with Bedrock, and concluded "if data residency requirements are strict, choose Bedrock." Bedrock has a clear data boundary and management model as an AWS service.
On the other hand, for Claude Platform on AWS's Web Fetch / MCP Connector, the official documentation does not explicitly state where the egress is for external communication. In this article, I verify this through actual measurement.
inference_geo: A parameter of the Anthropic API that specifies the geographic routing of inference processing. As of May 2026, only"us"and"global"can be selected.
Verification Method
I created two Lambda function URLs in my own verification account in us-east-1, and invoked them from Claude Platform on AWS's Web Fetch / MCP Connector.
- echo-headers: Returns
requestContext.http.sourceIp, the headers, and a timestamp - mcp-echo-server: A minimal implementation that responds to MCP initialize / tools/list / tools/call
The egress IP in this article refers to the IP observed as requestContext.http.sourceIp contained in the Lambda function URL event.
Verification patterns: 3 models (Opus 4.7 = claude-opus-4-7, Sonnet 4.6 = claude-sonnet-4-6, Opus 4.6 = claude-opus-4-6) × 2 geo (us, global) = 6 patterns. All of them are models that support Web Fetch / MCP Connector.
Lambda function: echo-headers
import json, logging, time
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def handler(event, context):
body = {
"source_ip": event.get("requestContext", {}).get("http", {}).get("sourceIp"),
"headers": event.get("headers", {}),
"timestamp_ms": int(time.time() * 1000)
}
logger.info(json.dumps(body))
return {
"statusCode": 200,
"headers": {"content-type": "application/json", "cache-control": "no-store, max-age=0"},
"body": json.dumps(body, indent=2)
}
Lambda function: mcp-echo-server
import json, logging, time
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def handler(event, context):
source_ip = event.get("requestContext", {}).get("http", {}).get("sourceIp")
headers = event.get("headers", {})
ts_ms = int(time.time() * 1000)
logger.info(json.dumps({"source_ip": source_ip, "headers": headers, "timestamp_ms": ts_ms}))
if event.get("requestContext", {}).get("http", {}).get("method") != "POST":
return {"statusCode": 405, "body": "Method not allowed"}
req = json.loads(event.get("body", "{}"))
req_id = req.get("id")
method = req.get("method", "")
if method == "initialize":
result = {"protocolVersion": "2025-11-25", "capabilities": {"tools": {}},
"serverInfo": {"name": "echo-mcp", "version": "1.0.0"}}
elif method == "tools/list":
result = {"tools": [{"name": "get_server_info", "description": "Returns caller IP and headers",
"inputSchema": {"type": "object", "properties": {}, "required": []}}]}
elif method == "tools/call":
result = {"content": [{"type": "text", "text": json.dumps(
{"caller_ip": source_ip, "caller_headers": headers, "timestamp_ms": ts_ms})}]}
elif method.startswith("notifications/"):
return {"statusCode": 202, "body": ""}
else:
return {"statusCode": 200, "headers": {"content-type": "application/json"},
"body": json.dumps({"jsonrpc": "2.0", "id": req_id,
"error": {"code": -32601, "message": f"Unknown: {method}"}})}
return {
"statusCode": 200,
"headers": {"content-type": "application/json", "cache-control": "no-store, max-age=0"},
"body": json.dumps({"jsonrpc": "2.0", "id": req_id, "result": result})
}
Web Fetch Observation Results
Request Example
curl -X POST "https://aws-external-anthropic.us-east-1.api.aws/v1/messages" \
-H "x-api-key: ${ANTHROPIC_AWS_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-workspace-id: ${ANTHROPIC_WORKSPACE_ID}" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"inference_geo": "us",
"tools": [{"type": "web_fetch_20250910", "name": "web_fetch", "max_uses": 1}],
"messages": [{"role": "user", "content": "Fetch https://xxxxx.lambda-url.us-east-1.on.aws/?t=<timestamp>"}]
}'
Results of the 6 Patterns
| Model | inference_geo | egress IP |
|---|---|---|
| claude-opus-4-7 | us | 34.162.xxx.xxx |
| claude-opus-4-7 | global | 34.162.xxx.xxx |
| claude-sonnet-4-6 | us | 34.162.xxx.xxx |
| claude-sonnet-4-6 | global | 34.162.xxx.xxx |
| claude-opus-4-6 | us | 34.162.xxx.xxx |
| claude-opus-4-6 | global | 34.162.xxx.xxx |
The egress IP was the same even when changing the model or inference_geo.
IP details:
| Item | Value |
|---|---|
| PTR reverse lookup | *.bc.googleusercontent.com |
| whois OrgName | Google LLC (NetName: GOOGL-2) |
| Origin ASN | AS396982 GOOGLE-CLOUD-PLATFORM |
| GeoIP | Columbus, Ohio, US |
| User-Agent | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +claude-user@anthropic.com) |
Note that behavior that appeared to be caching was seen with the same URL, so I avoided it by adding a timestamp to the query parameter.
MCP Connector Observation Results
Request Example
curl -X POST "https://aws-external-anthropic.us-east-1.api.aws/v1/messages" \
-H "x-api-key: ${ANTHROPIC_AWS_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-client-2025-11-20" \
-H "anthropic-workspace-id: ${ANTHROPIC_WORKSPACE_ID}" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"inference_geo": "us",
"mcp_servers": [{"type": "url", "url": "https://xxxxx.lambda-url.us-east-1.on.aws/", "name": "echo-mcp"}],
"tools": [{"type": "mcp_toolset", "mcp_server_name": "echo-mcp"}],
"messages": [{"role": "user", "content": "Call get_server_info"}]
}'
Results of the 6 Patterns
| Model | inference_geo | egress IP |
|---|---|---|
| claude-opus-4-7 | us | 160.79.106.xxx |
| claude-opus-4-7 | global | 160.79.106.xxx |
| claude-sonnet-4-6 | us | 160.79.106.xxx |
| claude-sonnet-4-6 | global | 160.79.106.xxx |
| claude-opus-4-6 | us | 160.79.106.xxx |
| claude-opus-4-6 | global | 160.79.106.xxx |
Unlike Web Fetch, the last octet varied with each request. However, all of them fell within 160.79.106.0/24.
IP details:
| Item | Value |
|---|---|
| PTR reverse lookup | No record |
| whois OrgName | Anthropic, PBC (NetName: AP-2440) |
| Origin ASN | AS396982 GOOGLE-CLOUD-PLATFORM |
| GeoIP | Columbus, Ohio, US |
| User-Agent | Claude-User |
| Accept | application/json, text/event-stream |
| MCP Client Info | Anthropic/API 1.0.0 (params.clientInfo of initialize) |
Comparison Table
For reference, I also checked the case of accessing the same URL from Claude Code, which runs locally.
| Item | Web Fetch | MCP Connector | Claude Code (reference) |
|---|---|---|---|
| egress IP | 34.162.xxx.xxx |
160.79.106.xxx |
Egress IP of the device in use |
| Registered organization | Google LLC | Anthropic, PBC | ISP, etc. |
| Origin ASN | AS396982 | AS396982 | — |
| User-Agent | Claude-User/1.0 | Claude-User | Claude-User (claude-code/2.1.139) |
Summary
Based on the whois / PTR / Origin ASN results, the egress IPs used when Claude Platform on AWS's Web Fetch / MCP Connector access external sites were observed as IP ranges related to Google LLC / Anthropic, PBC, rather than AWS. However, this verification does not directly prove the execution platform or the physical placement of the inference processing itself.
The egress IP may change on the service side in the future. If data residency requirements are strict, it seems best to prioritize considering Amazon Bedrock, which has a clear data boundary and management model as an AWS service. On the other hand, if you value Claude Platform features such as Web Fetch and MCP Connector, it would be good to consider Claude Platform on AWS while taking the egress behavior found this time into account.
