This release includes 1 breaking change for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Affected surfaces
Summary
AI summaryBreaking change: ipinfo_generate_map_url now returns a structured MapResult instead of a bare URL string.
Full changelog
This release reshapes the tool surface for better agent ergonomics: structured
error envelopes with stable codes, a split between "look up my IP" and
"look up these IPs", a typed MapResult, and an ipinfo_* naming prefix.
The previous tool names remain as forwarding aliases scheduled for removal in
0.6.0.
Added
ipinfo_lookup_my_ip()— no-args tool for the calling client's own IP.ipinfo_lookup_ips(ips, detail="full")— list lookup with adetail
toggle ("summary"nulls heavy nested blocks —continent,country_flag*,
country_currency,abuse,domains— for batch token savings while
preserving shape parity).ipinfo_check_residential_proxy(ip)— renamed fromget_residential_proxy_info;
taggedenterprisewithmeta.plan_required = "residential_proxy_addon".ipinfo_generate_map_url(ips)— renamed fromget_map_url; returns the
new structuredMapResult(url,mapped_ip_count,skipped_ips,
skipped_count,truncated) instead of a bare URL string.skipped_ips
is capped at 100 entries withtruncated=Truesignaling overflow.ToolErrorEnvelopewith stable codes (invalid_ip_address,
special_ip_unsupported,no_valid_ips,too_many_ips,auth_invalid,
auth_insufficient_scope,quota_exceeded,timeout,api_error,
unknown_error); JSON-encoded into everyToolErrorso agents branch on
codeinstead of parsing prose. Each envelope carriestemporary,
optionalretry_after_ms, and arepairhint.ResidentialProxyDetails.is_residential_proxy— a Pydantic
@computed_fieldreturningTrueiffservice is not None; serialized
to JSON output so agents see an explicit boolean instead of all-None
fields.MapResultandSkippedIPPydantic models.- Per-tool metadata:
meta={"introduced_in": "0.5.0"}on every new tool;
tags={"enterprise"}onipinfo_check_residential_proxy. - Schema-level constraints on
ipsarrays:minItems=1,maxItems=500_000. - httpx exception classification covering
httpx.TimeoutException→
timeoutandhttpx.HTTPStatusError→ status-aware codes (401 →
auth_invalid, 403 →auth_insufficient_scope, 429 →quota_exceeded,
5xx → temporaryapi_error, other 4xx → non-temporaryapi_error). - Map-tool timeouts:
httpx.AsyncClient(timeout=30s)at the HTTP layer plus
@mcp.tool(timeout=60s)as framework-level defense-in-depth. IPINFO_CACHE_SIZEenvironment variable for tuning the cache's max-entry
count (default4096).- Expanded server
instructionswith a "what this server does NOT do"
section, per-plan-tier capability list, cache TTL/size +ts_retrieved
freshness semantics, stdio transport caveat foripinfo_lookup_my_ip,
and the structured error contract. - Field-level documentation on
IPDetails.bogon(typically null because
bogon-like inputs are filtered at the boundary as
special_ip_unsupported) andts_retrievedon bothIPDetailsand
ResidentialProxyDetails(clarifying that cachedIPDetailsrecords
preserve the original lookup time, while residential-proxy lookups are
not cached). token=andtimeout=keyword-only arguments on the internal
ipinfo_get_map_urlhelper; both must now be passed by name.
Changed
- Breaking for direct callers of
ipinfo_generate_map_url: the tool
returnsMapResultinstead of a bare URL string. The deprecated
get_map_urlalias preserves the bare-URLstrreturn for 0.4.x
cached-client parity. - Tool errors no longer collapse credential failures: missing/invalid
token surfaces asauth_invalid, insufficient plan as
auth_insufficient_scope. Quota and timeout failures carry
temporary: trueso agents know to retry. - Per-IP
ctx.warning()emissions during input filtering are capped at
100 with an aggregated summary; a 500K batch with all entries filtered
no longer floods logs or risks tripping the 60s tool-level timeout.
Deprecated
get_ip_details,get_residential_proxy_info,get_map_urlare
forwarding aliases taggeddeprecatedwithmeta.replaced_byset —
scheduled for removal in 0.6.0.
Fixed
ipinfo_generate_map_urlnow sources the IPInfo token from the handler
captured at startup (handler.access_token) instead of re-reading
IPINFO_API_TOKENon every call; a runtime env mutation can no longer
cause the lookup and map paths to disagree on which token is in use._filter_valid_ipsnow records empty/placeholder values ("",
"null","undefined","0.0.0.0","::") and duplicates as explicit
SkippedIPentries with readable reasons;MapResult.mapped_ip_count + skipped_countnow matches the input length.
Breaking Changes
- `ipinfo_generate_map_url` now returns a `MapResult` object (`url`, `mapped_ip_count`, `skipped_ips`, `skipped_count`, `truncated`) instead of a bare URL string.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About briandconnelly/mcp-server-ipinfo
IP address geolocation and network information using IPInfo API
Related context
Related tools
Beta — feedback welcome: [email protected]