IPinfo MCP Server
OfficialYou can query IPinfo data for public IP addresses through six MCP tools.
Look up full IP data, including geolocation, network, ASN, and metadata, with optional detailed results.
Geolocate IPs by country, continent, and optionally city, region, coordinates, timezone, and postal code.
Look up ASN/network ownership, including ISP/hosting/business/education type and last-changed date when detailed.
Check privacy and anonymity signals such as VPN, proxy, relay, Tor, anycast, hosting, mobile, and satellite.
Detect residential proxies, including service name, last-seen date, and percent days seen.
Check API usage and remaining quota.
Batch up to 1000 IPs per page, paginate results, get validation errors for invalid/private IPs, and benefit from in-memory caching.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@IPinfo MCP ServerWhat's the geolocation and ASN for 8.8.8.8?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
IPinfo MCP Server
The official IPinfo MCP Server lets AI assistants such as Claude answer questions about IP addresses. Ask where an IP is located, which company or network it belongs to, or whether it's a VPN, proxy, Tor exit node, or residential proxy, and the assistant looks it up with IPinfo data.
It implements the Model Context Protocol (MCP), the open standard AI assistants use to connect to external tools, so it works with any MCP-compatible client. It supports the IPinfo Lite, Core, Plus, and Residential Proxy plans.
For the full guide, see the official documentation.
Related MCP server: mcp-ipinfo
Installation
You need an IPinfo account. Sign up for free at ipinfo.io/signup.
Hosted server
Point your MCP client at https://mcp.ipinfo.io/ (Streamable HTTP). The first time it connects, it asks you to sign in with your IPinfo account through OAuth.
Local server (PyPI)
The server is published on PyPI as ipinfo-mcp-server and runs over stdio, authenticating with your API token. With uv installed, add it to your MCP client configuration:
{
"mcpServers": {
"ipinfo": {
"command": "uvx",
"args": ["ipinfo-mcp-server"],
"env": {
"IPINFO_TOKEN": "<your-ipinfo-token>"
}
}
}
}Claude Desktop extension
Download mcp.mcpb from the latest GitHub release and open it with Claude Desktop. You'll be asked for your API token during installation.
MCP Registry
The server is listed in the MCP Registry as io.github.ipinfo/mcp.
The server is also listed on LightNow.
Tools
Tool | Description | Plan requirement |
| Full IP data: geolocation, network, and metadata | Any; |
| Geographic location | Any; |
| Autonomous system (network ownership) | Any; |
| VPN, proxy, relay, Tor, hosting, anycast, mobile, satellite flags | Paid plan |
| Residential proxy detection | Residential Proxy access |
| API usage and remaining quota | Any |
Tools that lack access for the token's plan return an ACCESS_DENIED error.
Common parameters
All tools except ipinfo_quota take a list of IPs and are paginated:
Parameter | Type | Default | Description |
|
| required | Public IPv4 or IPv6 addresses. Private, loopback, reserved, multicast, and bogon addresses are rejected and reported in |
|
|
| 1-based page of the result set. Values below 1 are clamped to 1. |
|
|
| IPs resolved per page, up to 1000. Only IPs on the requested page are fetched, so smaller pages consume less quota per call. |
ipinfo_lookup, ipinfo_geolocate, and ipinfo_asn also take:
Parameter | Type | Default | Description |
|
|
|
|
Common output
IP-based tools return:
Field | Description |
| Object keyed by IP with the tool-specific data below. |
| Object keyed by IP for IPs the API returned an error for. These IPs are left out of |
| Object keyed by input for values that aren't valid public IPs. Only present when there are any. |
|
|
|
|
If the whole request fails (for example a missing or invalid token), the tool returns an error object instead, with code (ACCESS_DENIED, RATE_LIMITED, INVALID_TOKEN, NO_TOKEN, API_ERROR, or UNKNOWN), message, and suggestion.
ipinfo_lookup
Returns the raw IPinfo API response for each IP.
detailed: false(Lite):ip,asn,as_name,as_domain,country,country_code,continent,continent_code.detailed: true(full lookup):ip,hostname,geo(city, region, country, continent, coordinates, timezone, postal code),as(ASN, name, domain, type),anonymous(proxy, relay, Tor, VPN),mobile, and theis_anonymous,is_anycast,is_hosting,is_mobile,is_satelliteflags. Some fields are only available on Plus.
ipinfo_geolocate
Returns, per IP: ip, country, country_code, continent, continent_code. With detailed: true, also city, region, region_code, latitude, longitude, timezone, postal_code.
ipinfo_asn
Returns, per IP: ip, asn, name, domain. With detailed: true, also type (isp, hosting, business, education) and last_changed.
ipinfo_check_privacy
Returns, per IP: ip, is_anonymous, anonymous (is_proxy, is_relay, is_tor, is_vpn), is_anycast, is_hosting, is_mobile, is_satellite.
ipinfo_check_residential_proxy
Returns, per IP: ip and is_residential_proxy. For residential proxies, also service (proxy service name), last_seen (date), and percent_days_seen.
ipinfo_quota
Takes no parameters. Returns token (omitted when connected with OAuth), requests (day, month, limit, remaining), and per-feature quotas under features.
Configuration
The server is configured through environment variables:
Variable | Default | Description |
| API token (stdio transport; over HTTP the token comes from the request) | |
|
| Base URL for |
|
| Base URL for legacy |
|
| Seconds a cached IP result stays fresh |
|
| Transport type ( |
|
| HTTP host (only for |
|
| HTTP port (only for |
| OAuth issuer whose access tokens are accepted; OAuth is off when unset | |
| Public URL of this server, required with | |
|
| Where the issuer publishes its signing keys |
| Token served at |
With the http transport, each request authenticates with its own Authorization: Bearer <token> header.
Setting IPINFO_OAUTH_ISSUER turns on OAuth for the http transport. The server then advertises the issuer at /.well-known/oauth-protected-resource, answers requests without a valid credential with 401 Unauthorized, and verifies access tokens against the issuer's signing keys. A verified access token is sent to the IPinfo API in place of an API token. API tokens keep working as before.
Feedback
Bugs and feature requests: open an issue on GitHub Issues.
Security vulnerabilities: don't open a public issue; follow the security policy.
Questions about your IPinfo account or plan: contact support@ipinfo.io.
Contributing
Contributions are welcome. See CONTRIBUTING.md for the workflow and the requirements a change has to meet.
Development
Prerequisites
Python 3.14+
Setup
uv sync --dev
cp .env.example .env
# Add your IPinfo token to .envRunning the server
The server supports two transports: stdio (default) and HTTP.
# stdio (default, used by MCP clients)
uv run ipinfo-mcp-server
# HTTP
IPINFO_TRANSPORT=http HOST=0.0.0.0 PORT=8000 uv run ipinfo-mcp-serverTests
# All tests
uv run pytest
# Integration tests (requires IPINFO_TOKEN)
uv run pytest tests/integration/Integration tests hit the real IPinfo API and validate response structure only (no exact value assertions). They require IPINFO_TOKEN to be set and are skipped otherwise.
Type checking
uv run pyrightLinting
uv run ruff check .
uv run ruff format .Available Tools
6 toolsipinfo_asnASN LookupARead-onlyIdempotentInspect
Get autonomous system (network ownership) information for IP addresses.
By default queries the IPinfo Lite endpoint, which returns ASN, name, and domain. Set detailed=True to query the full lookup endpoint, which also includes the network type (e.g. isp, hosting, business, education).
Results are paginated.
If the API reports an error for specific IPs, those IPs are listed in errors with the reason and left out of results.
Results are cached in memory for the session, so repeat lookups of the same IP are served from cache without consuming API quota. You do not need to maintain your own cache or deduplicate IPs before calling this tool. The _meta field reports api_calls_made and from_cache counts.
| Name | Required | Description | Default |
|---|---|---|---|
| ips | Yes | Public IP addresses to query, IPv4 or IPv6, e.g. ["8.8.8.8", "2001:4860:4860::8888"]. Private, loopback, reserved, multicast, and bogon addresses are rejected: they are reported under validation_errors and left out of results. | |
| page | No | Page of the result set to return, 1-based. Values below 1 are clamped to 1, and a page past the last one returns no results. | |
| detailed | No | Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns the ASN, name, and domain. Set to true to use the full lookup endpoint, which also returns the network type (isp, hosting, business, education) and when the AS record last changed; it requires an IPinfo plan that includes that data, otherwise the call fails with ACCESS_DENIED. | |
| page_size | No | How many IPs to resolve and return per page. Clamped to a maximum of 1000, the API batch limit. Only the IPs on the requested page are fetched, so a smaller page size consumes less quota per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations it discloses pagination, per-IP error collection into an errors list, in-memory session caching that avoids quota consumption, and the _meta counters (api_calls_made, from_cache). It also warns that detailed=True fails with ACCESS_DENIED without the right plan — exactly the kind of failure-mode context annotations can't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the default endpoint, then layered detail in short paragraphs. The caching/_meta paragraph is slightly redundant with the quota framing but each point is actionable, so only minor trimming is warranted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage, the description just needs to cover behavior the structured fields can't: error handling, pagination, caching, and quota. All four are addressed, so an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the detailed endpoint tradeoff and page_size quota impact is already documented in the schema. The description reinforces the Lite/detailed distinction and caching but adds little parameter semantics the schema doesn't already provide; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Get autonomous system (network ownership) information for IP addresses' — with a clarifying gloss on what ASN means. It is distinguishable from ipinfo_geolocate or ipinfo_check_privacy by domain, but it never names the sibling closest to it (ipinfo_lookup) and even refers to a 'full lookup endpoint', which could blur the line with that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: default Lite endpoint vs detailed=True, the plan requirement for detailed data, and the explicit instruction not to maintain your own cache or deduplicate IPs. What's missing is sibling routing — nothing says when to choose this over ipinfo_lookup or ipinfo_geolocate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ipinfo_check_privacyPrivacy DetectionARead-onlyIdempotentInspect
Check whether IP addresses are using privacy or anonymity services.
Returns privacy flags for each IP: whether it is anonymous, using a VPN, proxy, relay, or Tor, and whether it is an anycast, hosting, mobile, or satellite address.
Requires an IPinfo plan that includes privacy detection. Results are paginated.
If the API reports an error for specific IPs, those IPs are listed in errors with the reason and left out of results. Do not treat a missing result as "no privacy services detected": check errors.
Results are cached in memory for the session, so repeat checks of the same IP are served from cache without consuming API quota. You do not need to maintain your own cache or deduplicate IPs before calling this tool. The _meta field reports api_calls_made and from_cache counts.
| Name | Required | Description | Default |
|---|---|---|---|
| ips | Yes | Public IP addresses to query, IPv4 or IPv6, e.g. ["8.8.8.8", "2001:4860:4860::8888"]. Private, loopback, reserved, multicast, and bogon addresses are rejected: they are reported under validation_errors and left out of results. | |
| page | No | Page of the result set to return, 1-based. Values below 1 are clamped to 1, and a page past the last one returns no results. | |
| page_size | No | How many IPs to resolve and return per page. Clamped to a maximum of 1000, the API batch limit. Only the IPs on the requested page are fetched, so a smaller page size consumes less quota per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the description is free to add the things annotations can't: a plan/licensing prerequisite, the errors-vs-missing-result trap, session-level caching that preserves quota, and _meta reporting api_calls_made and from_cache. That is substantive behavior an agent could not infer otherwise.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence states the purpose, then flags, then prerequisites, then failure semantics, then caching — a sensible front-loaded order with no filler. It is slightly long, and the errors warning and caching note could be tightened, but each paragraph carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batched, paginated, quota-metered lookup, the description covers the prerequisite plan, pagination, failure handling, and caching. With an output schema present, it correctly does not spend words enumerating return fields beyond the flag list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description adds a little on top by noting results are paginated and pointing at the errors field alongside results. It does not add per-parameter syntax or clamping detail beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('check whether IP addresses are using privacy or anonymity services') and enumerates the flags returned (anonymous, VPN, proxy, relay, Tor, anycast, hosting, mobile, satellite), which sharply scopes it. It does not explicitly contrast with the overlapping sibling ipinfo_check_residential_proxy, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies real operational context: the IPinfo plan must include privacy detection, pagination is in effect, errors must be inspected rather than treated as 'no privacy detected', and repeat calls are cached. It stops short of naming when to prefer ipinfo_lookup or ipinfo_check_residential_proxy instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ipinfo_check_residential_proxyResidential Proxy DetectionARead-onlyIdempotentInspect
Check whether IP addresses are known residential proxies.
Returns whether each IP is a residential proxy and, if so, the proxy service name, the date it was last seen, and the percentage of days the IP was observed as a proxy.
Requires an IPinfo plan with residential proxy access. Results are paginated.
If the API reports an error for specific IPs, those IPs are listed in errors with the reason and left out of results. Do not treat a missing result as "not a residential proxy": check errors.
Results are cached in memory for the session, so repeat checks of the same IP are served from cache without consuming API quota. You do not need to maintain your own cache or deduplicate IPs before calling this tool. The _meta field reports api_calls_made and from_cache counts.
| Name | Required | Description | Default |
|---|---|---|---|
| ips | Yes | Public IP addresses to query, IPv4 or IPv6, e.g. ["8.8.8.8", "2001:4860:4860::8888"]. Private, loopback, reserved, multicast, and bogon addresses are rejected: they are reported under validation_errors and left out of results. | |
| page | No | Page of the result set to return, 1-based. Values below 1 are clamped to 1, and a page past the last one returns no results. | |
| page_size | No | How many IPs to resolve and return per page. Clamped to a maximum of 1000, the API batch limit. Only the IPs on the requested page are fetched, so a smaller page size consumes less quota per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses plan requirements, pagination behavior, error handling semantics, and in-memory caching that avoids quota consumption. It also warns that missing results must not be interpreted as negative proxy status, which is crucial behavioral context not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and return values, then moves to prerequisites, error semantics, and caching. Every paragraph adds actionable information, and there is no redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations and output schema, the description fills the remaining gaps: plan requirement, pagination, error behavior, cache behavior, and _meta reporting. An agent has enough context to call the tool correctly and interpret partial failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents ips, page, and page_size thoroughly. The description reinforces pagination and notes that deduplication is unnecessary, but it does not add substantial parameter-level semantics beyond the schema. A baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: checking IP addresses for known residential proxy status. It also describes the returned fields, making the tool's purpose unambiguous. It does not explicitly distinguish itself from siblings such as ipinfo_check_privacy, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by describing what the tool checks and its plan requirement, but it never says when to choose this tool over alternatives like ipinfo_check_privacy or ipinfo_lookup. The error-handling note is useful operational guidance, but it is not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ipinfo_geolocateIP GeolocationARead-onlyIdempotentInspect
Get geographic location data for one or more IP addresses.
By default queries the IPinfo Lite endpoint, which returns country and continent. Set detailed=True to query the full lookup endpoint, which adds city, region, coordinates, timezone, and postal code.
Results are paginated.
If the API reports an error for specific IPs, those IPs are listed in errors with the reason and left out of results.
Results are cached in memory for the session, so repeat lookups of the same IP are served from cache without consuming API quota. You do not need to maintain your own cache or deduplicate IPs before calling this tool. The _meta field reports api_calls_made and from_cache counts.
| Name | Required | Description | Default |
|---|---|---|---|
| ips | Yes | Public IP addresses to query, IPv4 or IPv6, e.g. ["8.8.8.8", "2001:4860:4860::8888"]. Private, loopback, reserved, multicast, and bogon addresses are rejected: they are reported under validation_errors and left out of results. | |
| page | No | Page of the result set to return, 1-based. Values below 1 are clamped to 1, and a page past the last one returns no results. | |
| detailed | No | Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns country and continent only. Set to true to use the full lookup endpoint, which also returns city, region, latitude and longitude, timezone, and postal code; it requires an IPinfo plan that includes that data, otherwise the call fails with ACCESS_DENIED. | |
| page_size | No | How many IPs to resolve and return per page. Clamped to a maximum of 1000, the API batch limit. Only the IPs on the requested page are fetched, so a smaller page size consumes less quota per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnly/idempotent annotations: discloses pagination, per-IP error handling into an errors list, session-scoped in-memory caching with quota implications, and the _meta counters api_calls_made/from_cache. This is exactly the kind of behavior an agent needs to size batch calls and avoid redundant work.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and endpoint choice, then layers pagination, errors, and caching in short paragraphs. Slightly long, with mild restatement between 'served from cache without consuming API quota' and 'You do not need to maintain your own cache'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't document return shapes, and it correctly focuses on the non-obvious parts: error partitioning, pagination, cache accounting, and access-plan failure mode. An agent has everything needed to call it correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description nonetheless adds value by explaining the quota tradeoff of page_size (only the requested page is fetched) and the plan requirement behind detailed. It stops short of restating clamping rules, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get geographic location data for one or more IP addresses') and immediately disambiguates the two internal endpoints via the detailed flag. It does not, however, distinguish itself from the sibling ipinfo_lookup, which an agent must still infer from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: default Lite endpoint vs detailed=True, the ACCESS_DENIED consequence if the plan lacks data, and explicit instruction not to pre-deduplicate because of caching. Missing only an explicit comparison to ipinfo_lookup for single-IP cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ipinfo_lookupIP LookupARead-onlyIdempotentInspect
Look up geolocation, network, and metadata for one or more IP addresses.
By default queries the IPinfo Lite endpoint, which returns country, continent, and ASN info. Set detailed=True to query the full lookup endpoint, which adds city-level geolocation, privacy flags (VPN, proxy, Tor, hosting, anycast), and richer AS data.
Results are paginated. Use page and page_size to control which slice is returned.
If the API reports an error for specific IPs, those IPs are listed in errors with the reason and left out of results.
Results are cached in memory for the session, so repeat lookups of the same IP are served from cache without consuming API quota. You do not need to maintain your own cache or deduplicate IPs before calling this tool. The _meta field reports api_calls_made and from_cache counts.
| Name | Required | Description | Default |
|---|---|---|---|
| ips | Yes | Public IP addresses to query, IPv4 or IPv6, e.g. ["8.8.8.8", "2001:4860:4860::8888"]. Private, loopback, reserved, multicast, and bogon addresses are rejected: they are reported under validation_errors and left out of results. | |
| page | No | Page of the result set to return, 1-based. Values below 1 are clamped to 1, and a page past the last one returns no results. | |
| detailed | No | Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns country, continent, and basic ASN. Set to true to use the full lookup endpoint, which also returns city-level geolocation, privacy flags (VPN, proxy, Tor, hosting, anycast), and richer AS data; it requires an IPinfo plan that includes that data, otherwise the call fails with ACCESS_DENIED. | |
| page_size | No | How many IPs to resolve and return per page. Clamped to a maximum of 1000, the API batch limit. Only the IPs on the requested page are fetched, so a smaller page size consumes less quota per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing per-call quota consumption driven by page/page_size, in-memory session caching behavior, the _meta counters (api_calls_made, from_cache), and that failed IPs land in errors rather than results. These are exactly the operational traits an agent needs before spending quota.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then short focused paragraphs each covering one concern: endpoint choice, pagination, error routing, caching. No sentence is filler and each maps to a decision the caller must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return shapes, yet it still covers the non-obvious parts of the response (errors list, _meta counts). For a 4-parameter batch tool with caching and quota side effects, nothing material is left unsaid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema doesn't fully convey: page_size directly controls quota per call and that only the requested page is fetched. The detailed flag's dependency on plan entitlement is likewise reiterated with consequences.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('look up geolocation, network, and metadata for one or more IP addresses') and clarifies the two endpoint modes. It never names the specialized siblings (ipinfo_geolocate, ipinfo_asn, ipinfo_check_privacy), so the agent must infer that this is the batch/general-purpose counterpart rather than one of those narrow tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for the detailed=True vs default Lite path, including the consequence (ACCESS_DENIED without the right plan). It also proactively tells the agent not to pre-deduplicate or maintain its own cache. The only gap is no explicit routing vs sibling tools such as ipinfo_geolocate or ipinfo_asn.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ipinfo_quotaAPI QuotaARead-onlyIdempotentInspect
Check your IPinfo API usage and remaining quota.
Returns daily and monthly request counts, the plan limit, and how many requests remain.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds useful behavioral context by naming the returned usage dimensions: daily and monthly counts, plan limit, and remaining requests.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is short and front-loaded, with two sentences that directly cover purpose and return contents. No sentence is wasted or repetitive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, a complete read-only annotation profile, and an output schema present, the description supplies enough context for an agent to call this tool correctly. It also usefully summarizes the returned quota information despite the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to explain. The baseline for a parameterless tool is 4, and nothing in the description creates ambiguity about invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: check API usage and remaining quota. It clearly distinguishes this monitoring tool from sibling lookup, geolocation, privacy, proxy, and ASN tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case clear: checking current API usage, plan limits, and remaining requests. It does not explicitly name when not to use it or route to alternatives, but no sibling appears to overlap with quota checking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.2.2- Changed
ipinfo_asn1 field changed- changed
Input schema / properties / detailed / descriptionPrevious value: -"Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns the ASN, name, and domain. Set to true to use the full lookup endpoint, which also returns the network type (isp, hosting, business, education) and when the AS record last changed; it requires a token whose plan includes that data, otherwise the call fails with ACCESS_DENIED."New value: +"Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns the ASN, name, and domain. Set to true to use the full lookup endpoint, which also returns the network type (isp, hosting, business, education) and when the AS record last changed; it requires an IPinfo plan that includes that data, otherwise the call fails with ACCESS_DENIED."
- Changed
ipinfo_geolocate1 field changed- changed
Input schema / properties / detailed / descriptionPrevious value: -"Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns country and continent only. Set to true to use the full lookup endpoint, which also returns city, region, latitude and longitude, timezone, and postal code; it requires a token whose plan includes that data, otherwise the call fails with ACCESS_DENIED."New value: +"Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns country and continent only. Set to true to use the full lookup endpoint, which also returns city, region, latitude and longitude, timezone, and postal code; it requires an IPinfo plan that includes that data, otherwise the call fails with ACCESS_DENIED."
- Changed
ipinfo_lookup1 field changed- changed
Input schema / properties / detailed / descriptionPrevious value: -"Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns country, continent, and basic ASN. Set to true to use the full lookup endpoint, which also returns city-level geolocation, privacy flags (VPN, proxy, Tor, hosting, anycast), and richer AS data; it requires a token whose plan includes that data, otherwise the call fails with ACCESS_DENIED."New value: +"Which IPinfo endpoint to query. Leave false to use the Lite endpoint, which returns country, continent, and basic ASN. Set to true to use the full lookup endpoint, which also returns city-level geolocation, privacy flags (VPN, proxy, Tor, hosting, anycast), and richer AS data; it requires an IPinfo plan that includes that data, otherwise the call fails with ACCESS_DENIED."
- Changed
ipinfo_quota1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "properties": { - "features": { - "additionalProperties": { - "properties": { - "daily": { - "type": "integer" - }, - "firmographics": { - "type": "boolean" - }, - "monthly": { - "type": "integer" - }, - "org_additional": { - "type": "boolean" - }, - "result_limit": { - "type": "integer" - }, - "vpn_provider": { - "type": "boolean" - } - }, - "required": [ - "daily", - "monthly" - ], - "type": "object" - }, - "type": "object" - }, - "requests": { - "properties": { - "day": { - "type": "integer" - }, - "limit": { - "type": "integer" - }, - "month": { - "type": "integer" - }, - "remaining": { - "type": "integer" - } - }, - "required": [ - "day", - "month", - "limit", - "remaining" - ], - "type": "object" - }, - "token": { - "type": "string" - } - }, - "required": [ - "token", - "requests" - ], - "type": "object" - }, - { - "properties": { - "code": { - "enum": [ - "ACCESS_DENIED", - "RATE_LIMITED", - "INVALID_TOKEN", - "NO_TOKEN", - "API_ERROR", - "UNKNOWN" - ], - "type": "string" - }, - "message": { - "type": "string" - }, - "suggestion": { - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "properties": { + "features": { + "additionalProperties": { + "properties": { + "daily": { + "type": "integer" + }, + "firmographics": { + "type": "boolean" + }, + "monthly": { + "type": "integer" + }, + "org_additional": { + "type": "boolean" + }, + "result_limit": { + "type": "integer" + }, + "vpn_provider": { + "type": "boolean" + } + }, + "required": [ + "daily", + "monthly" + ], + "type": "object" + }, + "type": "object" + }, + "requests": { + "properties": { + "day": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "month": { + "type": "integer" + }, + "remaining": { + "type": "integer" + } + }, + "required": [ + "day", + "month", + "limit", + "remaining" + ], + "type": "object" + }, + "token": { + "type": "string" + } + }, + "required": [ + "requests" + ], + "type": "object" + }, + { + "properties": { + "code": { + "enum": [ + "ACCESS_DENIED", + "RATE_LIMITED", + "INVALID_TOKEN", + "NO_TOKEN", + "API_ERROR", + "UNKNOWN" + ], + "type": "string" + }, + "message": { + "type": "string" + }, + "suggestion": { + "type": "string" + } + }, + "type": "object" + } +]
6 tool updates
v0.1.13- Changed
ipinfo_asn1 field changed- removed
Output schema / descriptionRemoved value: -"Generic wrapper for non-object return types."
- Changed
ipinfo_check_privacy1 field changed- removed
Output schema / descriptionRemoved value: -"Generic wrapper for non-object return types."
- Changed
ipinfo_check_residential_proxy1 field changed- removed
Output schema / descriptionRemoved value: -"Generic wrapper for non-object return types."
- Changed
ipinfo_geolocate1 field changed- removed
Output schema / descriptionRemoved value: -"Generic wrapper for non-object return types."
- Changed
ipinfo_lookup1 field changed- removed
Output schema / descriptionRemoved value: -"Generic wrapper for non-object return types."
- Changed
ipinfo_quota1 field changed- removed
Output schema / descriptionRemoved value: -"Generic wrapper for non-object return types."
6 tool updates
v0.1.12- First observed
ipinfo_asn - First observed
ipinfo_check_privacy - First observed
ipinfo_check_residential_proxy - First observed
ipinfo_geolocate - First observed
ipinfo_lookup - First observed
ipinfo_quota
TDQS
Scored across 6 tools
ipinfo_lookup is an umbrella tool that returns geolocation, ASN, and (in detailed mode) privacy flags, overlapping heavily with ipinfo_geolocate, ipinfo_asn, and ipinfo_check_privacy. An agent could reasonably reach for either the broad lookup or the focused tool for the same data, creating misselection risk, though the descriptions do clarify the specialized scopes.
All tools share an ipinfo_ prefix with snake_case, giving a predictable namespace. There's minor inconsistency in verb style (lookup, check_privacy, geolocate vs bare nouns asn, quota), but overall readable and coherent.
Six tools is a well-scoped, digestible set for an IP intelligence server. The count is reasonable, though the presence of both an umbrella lookup and three specialized subset tools means a couple could arguably be merged.
The surface covers core IP intelligence: general lookup, geolocation, ASN, privacy, residential proxy, and quota. It's fairly complete for the domain, with minor gaps like company/carrier ownership data that IPinfo offers, but core workflows are covered.
Maintenance
Related MCP Connectors
IPInfo MCP — wraps ipinfo.io (free tier, no auth required for basic usage)
IP Lookup MCP — ip-api.com (free, no auth for basic usage)
IPStack MCP Adapter turns IPStack's REST APIs into Model Context Protocol tools so any MCP-compatible client can call them directly in conversation. The first release ships IPStack IP geolocation and security lookups (single IP, caller's IP, and bulk). Additional APILayer services are added by registering them in a single config file, so the catalog grows without client-side changes.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server providing IP address lookup capabilities. Enables AI assistants to fetch details about public IP addresses or the user's current device IP.141 npmISC
- AlicenseNot gradedqualityBmaintenanceProvides IP geolocation data via ipinfo.io, enabling querying IP addresses for location, ISP, and other details through natural language.483 npmMIT
- FlicenseAqualityDmaintenanceProvides IP address geolocation and related info via an API, with MCP server integration for easy use in AI tools.1-
- FlicenseNot gradedqualityCmaintenanceEnables IP address information lookup through natural language, including current public IP, geolocation, ISP, coordinates, and IPv4/IPv6 details via MCP stdio.-