Skip to main content
Glama
briandconnelly

IP Geolocation MCP Server

IPジオロケーション MCPサーバー

PyPI CI License: MIT

これは、ipinfo.io APIを使用してIPアドレスに関する詳細情報を取得するシンプルなModel Context Protocolサーバーです。 これを使用すると、ユーザーの(おおよその)所在地や使用しているネットワークを特定できます。

mcp-server-ipinfoを使用した会話例

インストール

IPInfo APIを使用するにはトークンを作成する必要があります。 まだお持ちでない場合は、https://ipinfo.io/signup から無料アカウントに登録できます。

各クライアントで指定方法は異なりますが、一般的には以下の値を使用します:

フィールド

値

コマンド

uvx

引数

mcp-server-ipinfo

環境変数

IPINFO_API_TOKEN = <YOUR TOKEN>

開発版

最新の機能を使用したい場合は、GitHubから直接サーバーを取得できます。 --from 引数を追加するだけです:

フィールド

値

コマンド

uvx

引数

--from, git+https://github.com/briandconnelly/mcp-server-ipinfo, mcp-server-ipinfo

環境変数

IPINFO_API_TOKEN = <YOUR TOKEN>

Related MCP server: GeoIP MCP Server

コンポーネント

ツール

  • get_ip_details: 場所、ISP、ネットワークの詳細を含む、1つまたは複数のIPアドレスに関する詳細情報を取得します。

    • 入力: ips (オプション): 分析するIPアドレスのリスト(IPv4またはIPv6)。指定がない場合は、リクエスト元のクライアントのIPアドレスを分析します。

    • 出力: 場所、組織、タイムゾーンなどを含む IPDetails のリスト。

    • 注意: バッチ検索(複数のIP)には IPINFO_API_TOKEN が必要です。

  • get_residential_proxy_info: IPアドレスが住宅用プロキシサービスに関連付けられているかどうかを確認します。

    • 入力: ip: 住宅用プロキシの使用状況を確認するIPアドレス。

    • 出力: プロキシサービス名、最終確認日、アクティビティ率を含む ResidentialProxyDetails。

    • 注意: 住宅用プロキシデータへのアクセス権を持つ IPINFO_API_TOKEN が必要です。

  • get_map_url: IPアドレスのインタラクティブな地図視覚化へのURLを生成します。

    • 入力: ips: 視覚化するIPアドレスのリスト(最大500,000件)。

    • 出力: 地理的な場所を示すipinfo.io上のインタラクティブな地図へのURL。

    • 注意: トラフィックやユーザーの地理的分布を視覚化するのに便利です。

設定

環境変数

変数

説明

デフォルト

IPINFO_API_TOKEN

プレミアム機能用のIPInfo APIトークン

なし(基本検索のみ)

IPINFO_CACHE_TTL

キャッシュのTTL(秒単位)

3600(1時間)

ライセンス

MITライセンス - 詳細は LICENSE ファイルを参照してください。リリース履歴については CHANGELOG.md を参照してください。

免責事項

このプロジェクトは IPInfo とは提携していません。

Available Tools

5 tools
ipinfo_check_residential_proxyCheck Residential ProxyA
Read-onlyIdempotent

Classify whether an IP is a known residential-proxy exit node.

Returns ResidentialProxyDetails with is_residential_proxy (the canonical yes/no), and — when true — service, last_seen (YYYY-MM-DD), and percent_days_seen over a 7-day window. Useful for fraud, bot, and ad-fraud detection. This is distinct from the general privacy flags on ipinfo_lookup_ips (VPN / Tor / open web proxy / hosting): use this tool only to detect residential-proxy networks that route traffic through real residential IPs. Requires IPINFO_API_TOKEN with the Enterprise residential-proxy add-on; absence surfaces as auth_insufficient_scope (distinct from auth_invalid for a missing/wrong token).

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYesIPv4/IPv6 address to classify.

Output Schema

ParametersJSON Schema
NameRequiredDescription
ipYes
last_seenNo
percent_days_seenNo
serviceNo
ts_retrievedNo
is_residential_proxyYesWhether the IP is a known residential-proxy exit node. Derived from ``service``: the IPInfo residential-proxy add-on returns a non-null ``service`` only for IPs it has classified as proxies, so ``service is not None`` is the canonical "yes/no" signal. Surfaces in JSON output so agents can branch on a stable boolean instead of inspecting all-None fields.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint, idempotentHint, openWorldHint. The description adds details on return structure (ResidentialProxyDetails with fields), and error conditions (auth_insufficient_scope vs auth_invalid). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: purpose, return fields, use cases, sibling distinction, auth requirements. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple tool (one parameter, output schema exists, rich annotations), the description is complete. It covers purpose, usage context, behavioral nuances, and authentication, leaving no gaps for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'ip' parameter (includes description, format, examples). The description does not add parameter-specific details beyond the schema, but baseline 3 is appropriate for this high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Classify whether an IP is a known residential-proxy exit node.' This is a specific verb-resource combination and distinguishes it from the sibling 'ipinfo_lookup_ips' which provides general privacy flags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use ('fraud, bot, and ad-fraud detection') and when-not-to-use ('distinct from the general privacy flags on ipinfo_lookup_ips'). Also mentions alternative tool for VPN/Tor/hosting detection. Authentication requirements and error distinctions are clearly specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ipinfo_generate_map_urlGenerate IP Map URLA
Read-onlyIdempotent

Build an interactive ipinfo.io map for a set of IPs.

Returns MapResult{url, mapped_ip_count, skipped_ips, skipped_count, truncated}. skipped_ips is a list of {ip, reason} entries for filtered inputs, capped at 100; truncated flags overflow. skipped_count is the true total even when the list is capped, so mapped_ip_count + skipped_count equals the input length. Errors raise ToolError with a JSON-encoded envelope.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipsYesIPv4/IPv6 addresses to plot. Invalid or special-use IPs are filtered.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
mapped_ip_countYes
skipped_ipsNo
skipped_countYes
truncatedYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds valuable behavioral context: the structure of the returned MapResult (url, mapped_ip_count, skipped_ips, etc.), how skipped_ips are capped at 100, the meaning of truncated, and error handling with ToolError. This goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (two paragraphs) and front-loaded with the main purpose. Each sentence adds value, explaining the return value and error behavior. It could be slightly more structured, but it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity (one parameter, rich annotations, output schema present), the description is complete. It explains the return structure, handling of filtered IPs, and error reporting. No missing information is needed for proper use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage for the single parameter (ips), with a clear description and examples. The tool description does not add additional meaning beyond what the schema already provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Build an interactive ipinfo.io map for a set of IPs.' This is a specific verb+resource that distinguishes it from sibling tools like ipinfo_lookup_ips and ipinfo_summarize_ips.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for mapping IPs but provides no explicit guidance on when to use this tool versus alternatives, nor does it mention when not to use it. No examples of use cases or exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ipinfo_lookup_ipsLook Up IPsA
Read-onlyIdempotent

Geolocate one or more IPs and return ISP/ASN details.

Returns a list in input order (after dedup and invalid-IP filtering); match results back to your input via the ip field. IPs that fail upstream are omitted and logged; if the batch resolves no IPs at all the failure is raised rather than masked — auth_insufficient_scope when the upstream returned nothing (token tier likely lacks /batch access; look IPs up one at a time or upgrade to Core+), otherwise a retryable api_error. Defaults to detail="summary" (heavy nested blocks omitted); pass detail="full" for every field. Capped at 1,000 IPs per call (too_many_ips above that): this tool returns one record per IP, so for larger batches use ipinfo_summarize_ips (fixed-size aggregates) or ipinfo_generate_map_url. Higher plan tiers populate more fields; see the server instructions for the Lite/Core/Plus/Enterprise tier mapping. For VPN/Tor/open-proxy/hosting detection read the privacy flags on each record; for residential-proxy exit-node classification use the separate ipinfo_check_residential_proxy tool. Typically completes in seconds; bounded by a 120s tool timeout that surfaces as a timeout envelope. Errors raise ToolError with a JSON-encoded envelope.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipsYesIPv4/IPv6 addresses to look up. Invalid or special-use IPs are filtered.
detailNo'summary' (default) OMITS heavy nested blocks (continent, country_flag*, country_currency, abuse, domains) for batch token savings; 'full' returns every IPDetails field.summary

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses rich behavioral details: dedup/filtering of invalid IPs, output order, omission of failed IPs, error conditions (auth_insufficient_scope, api_error, timeout), default detail level, cap at 1000 IPs, and performance characteristics. Annotations only indicate readOnlyHint, idempotentHint, and openWorldHint, so the description adds substantial value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but well-structured, starting with the core purpose followed by bullet-like points on behavior, errors, limits, and alternatives. It is front-loaded with essential information. While it is long, every sentence adds value, and the complexity warrants the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (batch lookup, error handling, token tiers, output structure, limits, related tools), the description is comprehensive. It covers input handling, output format, error scenarios, performance, and alternatives. An output schema exists, but the description complements it well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions and examples for both parameters. The description adds context: the 'detail' parameter's impact on response size and block omission, and that 'ips' are filtered. While schema alone is adequate, the description clarifies behavior beyond schema, justifying a score above baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Geolocate one or more IPs and return ISP/ASN details.' It uses a specific verb and resource, and distinguishes from siblings by naming alternatives for different use cases (e.g., ipinfo_summarize_ips for larger batches, ipinfo_check_residential_proxy for proxy detection).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool (for batch IP lookup with per-IP details) and when not (for >1000 IPs, use ipinfo_summarize_ips or ipinfo_generate_map_url; for residential proxy, use ipinfo_check_residential_proxy). It also covers token tier issues and fallback strategies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ipinfo_lookup_my_ipLook Up My IPA
Read-onlyIdempotent

Geolocate the calling client's own IP. No arguments.

On stdio transports the result is this server's outbound IP, not the end user's. Use ipinfo_lookup_ips when the caller already has a specific IP. Errors raise ToolError with a JSON-encoded envelope.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
ipYes
hostnameNo
cityNo
regionNo
region_codeNo
countryNo
country_nameNo
locNo
latitudeNo
longitudeNo
postalNo
timezoneNo
continentNo
country_flagNo
country_flag_urlNo
country_currencyNo
isEUNo
orgNo
asnNo
privacyNo
anycastNo
bogonNo
carrierNo
companyNo
domainsNo
abuseNo
ts_retrievedNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already include readOnlyHint, idempotentHint, openWorldHint. Description adds critical context: on stdio transports the result is the server's outbound IP, not the end user's, and errors raise ToolError with JSON envelope, which annotations don't cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each providing essential information: purpose, transport caveat, and alternative usage. No redundant or superfluous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument tool with output schema and comprehensive annotations, the description covers edge cases (stdio transport) and error format, making it fully sufficient for proper invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters; schema coverage is 100% (empty schema). Description confirms 'No arguments.' Baseline for 0 parameters is 4, as no additional meaning is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool geolocates the calling client's own IP, with no arguments. It distinguishes from sibling 'ipinfo_lookup_ips' for when a specific IP is available.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states no arguments needed, warns about stdio transport behavior (server's outbound IP vs end user's IP), and directs to alternative tool if caller has a specific IP. Also mentions error handling via ToolError with JSON envelope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ipinfo_summarize_ipsSummarize IPsA
Read-onlyIdempotent

Aggregate one or more IP lookups into counts and percentages.

Uses the same validation, deduplication, cache, and upstream batch lookup path as ipinfo_lookup_ips, but returns fixed-size summary buckets instead of per-IP records. This is the preferred tool for large log-analysis tasks such as "where did visitors come from?" when the caller does not need the underlying records. Percentages are based on mapped_ip_count; filtered and failed IPs are counted separately. Errors raise ToolError with a JSON-encoded envelope.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipsYesIPv4/IPv6 addresses to aggregate. Invalid or special-use IPs are filtered.
group_byNoSummary dimensions to include. Empty returns only mapped, skipped, and failed counts.
top_nNoMaximum buckets to return per requested group. truncated_groups reports the true distinct count when capped.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mapped_ip_countYes
skipped_countYes
failed_countYes
by_countryNo
by_continentNo
by_asnNo
by_privacyNo
truncated_groupsNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnly/ idempotent annotations, it details shared processing path with sibling, filtering/failed IP handling, and error format. Beneficial context that annotations alone don't provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise paragraphs with front-loaded purpose. Every sentence adds value—no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 3 params and an output schema, description covers purpose, behavior, error handling, and relationships thoroughly. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good descriptions and examples. Description adds no extra per-param details, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it aggregates IP lookups into counts and percentages. Distinguishes from sibling ipinfo_lookup_ips by emphasizing summary output and large log-analysis use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says this is preferred for large log-analysis when underlying records are not needed, and clarifies percentage basis. Could be improved by stating when not to use it, but context is clear.

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.

  1. 3 tool updatesv0.7.0
    • Changedipinfo_generate_map_url2 fields changed
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / skipped_ips / items / additionalProperties
        Added value: +false
    • Changedipinfo_lookup_ips1 field changed
      • changedInput schema / properties / ips / maxItems
        Previous value: -500000New value: +1000
    • Changedipinfo_summarize_ips5 fields changed
      • addedOutput schema / additionalProperties
        Added value: +false
      • changedOutput schema / properties / by_asn / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "description": "A counted summary bucket for a group in ``SummaryResult``.",
        -      "properties": {
        -        "count": {
        -          "type": "integer"
        -        },
        -        "key": {
        -          "type": "string"
        -        },
        -        "percent": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [
        -        "key",
        -        "count",
        -        "percent"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "A counted summary bucket for a group in ``SummaryResult``.",
        +      "properties": {
        +        "count": {
        +          "type": "integer"
        +        },
        +        "key": {
        +          "type": "string"
        +        },
        +        "percent": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "key",
        +        "count",
        +        "percent"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / by_continent / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "description": "A counted summary bucket for a group in ``SummaryResult``.",
        -      "properties": {
        -        "count": {
        -          "type": "integer"
        -        },
        -        "key": {
        -          "type": "string"
        -        },
        -        "percent": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [
        -        "key",
        -        "count",
        -        "percent"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "A counted summary bucket for a group in ``SummaryResult``.",
        +      "properties": {
        +        "count": {
        +          "type": "integer"
        +        },
        +        "key": {
        +          "type": "string"
        +        },
        +        "percent": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "key",
        +        "count",
        +        "percent"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / by_country / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "description": "A counted summary bucket for a group in ``SummaryResult``.",
        -      "properties": {
        -        "count": {
        -          "type": "integer"
        -        },
        -        "key": {
        -          "type": "string"
        -        },
        -        "percent": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [
        -        "key",
        -        "count",
        -        "percent"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "A counted summary bucket for a group in ``SummaryResult``.",
        +      "properties": {
        +        "count": {
        +          "type": "integer"
        +        },
        +        "key": {
        +          "type": "string"
        +        },
        +        "percent": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "key",
        +        "count",
        +        "percent"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / by_privacy / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "description": "A counted summary bucket for a group in ``SummaryResult``.",
        -      "properties": {
        -        "count": {
        -          "type": "integer"
        -        },
        -        "key": {
        -          "type": "string"
        -        },
        -        "percent": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [
        -        "key",
        -        "count",
        -        "percent"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": false,
        +      "description": "A counted summary bucket for a group in ``SummaryResult``.",
        +      "properties": {
        +        "count": {
        +          "type": "integer"
        +        },
        +        "key": {
        +          "type": "string"
        +        },
        +        "percent": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "key",
        +        "count",
        +        "percent"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  2. 5 tool updatesv0.6.0
    • Addedipinfo_check_residential_proxy
    • Addedipinfo_generate_map_url
    • Addedipinfo_lookup_ips
    • Addedipinfo_lookup_my_ip
    • Addedipinfo_summarize_ips
  3. 3 tool updatesv0.5.0
    • Removedget_ip_details
    • Removedget_map_url
    • Removedget_residential_proxy_info
  4. 4 tool updatesv0.4.0
    • Changedget_ip_details4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / ip
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "The IP address to analyze (IPv4 or IPv6). If None or not provided, analyzes the requesting client's IP address.",
        -  "examples": [
        -    "8.8.8.8",
        -    "2001:4860:4860::8888",
        -    null
        -  ],
        -  "title": "Ip"
        -}
      • addedInput schema / properties / ips
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "IP address(es) to analyze (IPv4 or IPv6). Pass a list of one or more IPs. If not provided, analyzes the requesting client's IP address.",
        +  "examples": [
        +    [
        +      "8.8.8.8"
        +    ],
        +    [
        +      "8.8.8.8",
        +      "1.1.1.1",
        +      "208.67.222.222"
        +    ]
        +  ]
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "items": {
        +        "description": "Comprehensive IP address information including geolocation, network, and metadata.\n\nFields available depend on your IPinfo plan:\n- IPinfo Lite (free): country, country_code, continent, asn basics\n- IPinfo Core: Full geolocation, ASN details, privacy detection\n- IPinfo Plus: Adds carrier info, accuracy radius, company data\n- IPinfo Enterprise: Adds domains, abuse contacts, WHOIS data",
        +        "properties": {
        +          "abuse": {
        +            "anyOf": [
        +              {
        +                "description": "Abuse contact information for reporting malicious activity.\n\nAvailable in: IPinfo Enterprise",
        +                "properties": {
        +                  "address": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "country": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "email": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "name": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "network": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "phone": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "anycast": {
        +            "anyOf": [
        +              {
        +                "type": "boolean"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "asn": {
        +            "anyOf": [
        +              {
        +                "description": "Autonomous System Number (ASN) information.\n\nAvailable in: IPinfo Core, IPinfo Plus, IPinfo Enterprise",
        +                "properties": {
        +                  "asn": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "domain": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "name": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "route": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "type": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "bogon": {
        +            "anyOf": [
        +              {
        +                "type": "boolean"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "carrier": {
        +            "anyOf": [
        +              {
        +                "description": "Mobile carrier/operator information for cellular IPs.\n\nAvailable in: IPinfo Plus, IPinfo Enterprise",
        +                "properties": {
        +                  "mcc": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "mnc": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "name": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "city": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "company": {
        +            "anyOf": [
        +              {
        +                "description": "Company/organization information for the IP owner.\n\nAvailable in: IPinfo Plus, IPinfo Enterprise",
        +                "properties": {
        +                  "domain": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "name": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "type": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "continent": {
        +            "anyOf": [
        +              {
        +                "description": "Continent information.",
        +                "properties": {
        +                  "code": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "name": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "country": {
        +            "anyOf": [
        +              {
        +                "pattern": "^[A-Z]{2}$",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "country_currency": {
        +            "anyOf": [
        +              {
        +                "description": "Country currency information.",
        +                "properties": {
        +                  "code": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "symbol": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "country_flag": {
        +            "anyOf": [
        +              {
        +                "description": "Country flag information.",
        +                "properties": {
        +                  "emoji": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "unicode": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "country_flag_url": {
        +            "anyOf": [
        +              {
        +                "format": "uri",
        +                "maxLength": 2083,
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "country_name": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "domains": {
        +            "anyOf": [
        +              {
        +                "description": "Hosted domains (reverse IP) information.\n\nShows domains hosted on this IP address.\n\nAvailable in: IPinfo Enterprise",
        +                "properties": {
        +                  "domains": {
        +                    "anyOf": [
        +                      {
        +                        "items": {
        +                          "type": "string"
        +                        },
        +                        "type": "array"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "ip": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "total": {
        +                    "anyOf": [
        +                      {
        +                        "type": "integer"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "hostname": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "ip": {
        +            "format": "ipvanyaddress",
        +            "type": "string"
        +          },
        +          "isEU": {
        +            "anyOf": [
        +              {
        +                "type": "boolean"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "latitude": {
        +            "anyOf": [
        +              {
        +                "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "loc": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "longitude": {
        +            "anyOf": [
        +              {
        +                "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "org": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "postal": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "privacy": {
        +            "anyOf": [
        +              {
        +                "description": "Privacy and anonymity detection information.\n\nIdentifies whether an IP is using VPN, proxy, Tor, relay services,\nor belongs to a hosting/cloud provider.\n\nAvailable in: IPinfo Core, IPinfo Plus, IPinfo Enterprise",
        +                "properties": {
        +                  "hosting": {
        +                    "anyOf": [
        +                      {
        +                        "type": "boolean"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "proxy": {
        +                    "anyOf": [
        +                      {
        +                        "type": "boolean"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "relay": {
        +                    "anyOf": [
        +                      {
        +                        "type": "boolean"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "service": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "tor": {
        +                    "anyOf": [
        +                      {
        +                        "type": "boolean"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  },
        +                  "vpn": {
        +                    "anyOf": [
        +                      {
        +                        "type": "boolean"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ],
        +                    "default": null
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "region": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "region_code": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "timezone": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          },
        +          "ts_retrieved": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null
        +          }
        +        },
        +        "required": [
        +          "ip"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Removedget_ipinfo_api_token
    • Addedget_map_url
    • Addedget_residential_proxy_info
  5. 2 tool updatesv1.0.0
    • First observedget_ip_details
    • First observedget_ipinfo_api_token

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool performs a distinct function: residential proxy detection, map generation, IP lookup (batch), own IP lookup, and summary aggregation. Their purposes are clearly separated with no overlap.

Naming Consistency5/5

All tools follow the consistent 'ipinfo_verb_noun' pattern (e.g., ipinfo_lookup_ips, ipinfo_summarize_ips), making the naming predictable and easy to understand.

Tool Count5/5

With 5 tools covering geolocation, map visualization, and specialized proxy detection, the count is well-scoped for an IP geolocation service without unnecessary bloat.

Completeness4/5

The set covers core operations (lookup, self-lookup, batch, summary, map) and residential proxy detection. Minor gaps like WHOIS or IP range queries are absent but reasonable for the domain.

Maintenance

ActivityInactive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP (Multi-Agent Conversation Protocol) server that enables natural language interaction with the AbstractAPI geolocation service, allowing users to retrieve geographic information about IP addresses.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that provides IP geolocation services using MaxMind's GeoIP2 databases, allowing users to retrieve geographical information for single or multiple IP addresses including country, city, coordinates, and ASN details.
    GPL 3.0
  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that provides access to the Netdetective API for querying information about IP addresses. It enables users to retrieve metadata for a specified IP address or the connecting client's default IP address.
    1
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server for IP geolocation lookups using ipinfo.io, with single, own, and batch queries.
    1
    MIT