Skip to main content
Glama
oschwald

MaxMindDB MCP Server

MaxMindDB MCP Server

License: ISC

Look up IP locations and network ownership in GeoIP2, GeoLite2, and custom MMDB databases from your AI assistant. Search networks, compare databases, and download new databases through MCP.

This is an unofficial project and is not endorsed by MaxMind Inc. For official products and support, visit maxmind.com.

Try asking:

  • "Using MaxMindDB, identify the country and autonomous system for 8.8.8.8."

  • "Find the networks belonging to AS13335 within 1.0.0.0/8 in my ASN database."

  • "Which databases are available, and when were they built?"

Answers come from your databases. IP geolocation is an estimate, not a device's precise location. ASN data describes network ownership, not the identity of a person using an address.

What you need

Provide either existing .mmdb files or a MaxMind account ID and license key with access to the editions you want. Databases and credentials are not bundled.

The server runs on your computer and requires a client that supports local MCP servers.

Related MCP server: geolocation-mcp

Installation

Claude Desktop

Install and configure the server through Claude Desktop. No terminal, Go installation, or config file is required.

  1. Download the latest MCPB. The single file includes native builds for all supported platforms.

  2. Open Settings → Extensions → Advanced settings → Install Extension in Claude Desktop and select the file.

  3. Choose how to provide databases in the extension settings:

    • Download databases: Enter your MaxMind account ID and license key. The default editions are GeoLite2-City and GeoLite2-ASN.

    • Use existing files: Turn off Download and update MaxMind databases and select the folder containing your .mmdb files.

  4. Enable the extension and ask: "Using MaxMindDB, list my databases and look up 8.8.8.8."

The first download runs in the background. Ask Claude to check database status if lookups are not ready yet. Enter license keys in extension settings, not in chat.

Upgrading from v0.2.0 or earlier: Remove the old extension, install the new one, and configure it again. Your database files remain in place. See upgrades, settings, and supported platforms.

Standalone executable

On macOS, install with Homebrew:

brew install --cask oschwald/tap/maxminddb-mcp

For other platforms, or without Homebrew, download an archive or Linux package from GitHub Releases. See standalone setup for installation and checksums. Then configure the server and connect your client below.

Go developers can also build from source.

Connect a client

Choose your client for step-by-step setup.

Client

Setup requirements

ChatGPT desktop

Installed executable and configuration; local threads only

Codex

Installed executable; config file or environment settings

Claude Code

Installed executable and configuration, or Docker plugin

Antigravity CLI (agy)

Installed executable and configuration

Zed

Installed executable and configuration

Docker

Docker engine and a config file readable by the container

ChatGPT desktop plugin (experimental)

Codex CLI registration and existing server configuration; desktop UI unverified

Claude Cowork plugin (experimental)

Native plugin ZIP; installation and settings UI unverified

Cursor plugin (unverified)

Docker engine; installation and settings UI unverified

Gemini CLI (legacy)

Continued Gemini CLI access; native extension prompts for account settings

Configuration

Claude Desktop users can manage settings in the extension. For standalone installations, the configuration guide covers:

  • Downloads using MaxMind credentials.

  • Existing MMDB folders or GeoIP.conf.

  • Environment settings, config discovery, and logging.

If setup fails, start with troubleshooting.

Tools

Your assistant discovers the tools automatically. You can ask it to look up IPs, search or summarize networks, compare and inspect databases, or install and update databases.

The tool reference documents arguments, results, filters, pagination, limits, and errors.

Help and development

License

ISC.

Available Tools

10 tools
compare_databasesCompare databasesA
Read-onlyIdempotent

Compare lookup answers in two loaded databases within a CIDR, for example before and after an update. Returns paginated added, removed, and changed address ranges. Equal answers with different network boundaries are unchanged. Pages scan at most 10,000 segments and can contain no changes while has_more is true. Continue until has_more is false.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkYesCIDR to compare. Use an IPv4 prefix length of 8 or greater, or a native IPv6 prefix length of 32 or greater. Repeat on each page.
max_resultsNoMaximum changed address ranges to return on this page.
new_databaseYesComparison database's exact filename from list_databases. Supplies the after values. Both databases must be loaded.
old_databaseYesBaseline database's exact filename from list_databases. Supplies the before values.
resume_tokenNoToken from the previous page. Omit on the first request. Repeat both database names and network. If either loaded database changed, start a new comparison.

Output Schema

ParametersJSON Schema
NameRequiredDescription
changesYes
has_moreYes
resume_tokenYes
scanned_segmentsYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, yet the description still adds non-obvious context: pages scan at most 10,000 segments, may legitimately return no changes while has_more is true, and equal answers with differing network boundaries count as unchanged. These are exactly the pitfalls an agent would otherwise misread as failure.

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?

Front-loads the purpose and then layers result and pagination semantics efficiently. The closing 'Continue until has_more is false' slightly overlaps the preceding sentence about has_more being true, a small redundancy in an otherwise tight definition.

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?

An output schema exists, so return values need no enumeration, yet the description still characterizes the result (added, removed, changed ranges, unchanged on boundary differences) and the pagination contract. Nothing needed to invoke it correctly is missing.

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%, so every parameter (network, max_results, both database names, resume_token) is already fully documented with constraints and restart rules. The description's 'before and after' framing restates the old/new semantics rather than extending them, so the baseline 3 applies.

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?

States a specific verb ('compare'), a precise resource ('lookup answers in two loaded databases within a CIDR'), and the motivating scenario ('before and after an update'). This is unmistakably distinct from the lookup_*, inspect_database, and verify_database siblings.

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?

Gives a clear motivating context ('for example before and after an update') and operational guidance for iterating pages. It stops short of naming when to pick verify_database or inspect_database instead, so the when-not side is left implicit.

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

inspect_databaseInspect a databaseA
Read-onlyIdempotent

Read MMDB metadata and sample field paths, types, and examples. Use this to choose fields, filter paths, or a summarize_network group_by field. Sampling starts at the first network record, so observed fields are not a complete schema. Use verify_database to check file integrity.

ParametersJSON Schema
NameRequiredDescriptionDefault
databaseYesExact filename of a loaded database from list_databases.
sample_sizeNoMaximum network records to sample. Larger samples may reveal more fields. Sampling can stop early at internal field limits.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fieldsYes
databaseYes
metadataYes
sample_limitYes
sampled_recordsYes
schema_completeYes
fields_truncatedYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds genuinely non-obvious behavioral context that annotations cannot express: sampling starts at the first network record and observed fields are not a complete schema. It stops short of explaining output shape or field-limit behavior in depth, but the key sampling caveat is disclosed.

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 short sentences, each earning its place: capability first, usage/routing second, and the sampling limitation that governs interpretation of results third. Front-loaded and waste-free.

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?

An output schema exists so return values needn't be explained. The description covers purpose, use cases, sibling routing, and the sampling caveat that an agent needs to interpret results correctly, which is complete for this read-only inspection tool.

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%, with both 'database' and 'sample_size' fully documented including default, min/max, and the early-stop caveat. The description only vaguely alludes to sampling ('sample field paths') and adds no syntax or meaning beyond the schema, so baseline 3 applies.

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?

States a specific verb and resource ('Read MMDB metadata and sample field paths, types, and examples') and clearly differentiates itself from siblings by naming summarize_network (for group_by field selection) and verify_database (for integrity). An agent can distinguish it from lookup_* and compare_databases tools without opening any schema.

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 when to use it ('choose fields, filter paths, or a summarize_network group_by field') and routes the integrity-checking case to verify_database. It also names the prerequisite indirectly by pointing to loaded databases via the schema's list_databases reference, leaving nothing to inference.

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

install_databaseInstall a database from a URLA
Destructive

Download and load a database from an HTTP or HTTPS URL. Accepts MMDB, gzip, tar, tar.gz, or ZIP with exactly one MMDB. Downloads and expanded data are limited to 1 GiB. Uses the configured download folder, or the first folder in directory mode. Does not use MaxMind credentials or save the URL for updates.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesDatabase download URL. Requests can reach any HTTP(S) host accessible to this server.
databaseYesDestination filename ending in .mmdb, without a directory path.
overwriteNoReplace an existing database with this name. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sizeNo
errorNo
updatedYes
databaseYes
last_updateYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already flag the write/destructive/open-world profile, and the description materially extends that: 1 GiB limits on download and expanded data, the requirement of exactly one MMDB inside archives, where files land (configured download folder vs. first folder in directory mode), and that no MaxMind credentials are used. It does not spell out what happens on name collisions beyond the schema's overwrite flag, so not a full 5.

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?

Four tight sentences, front-loaded with the operation and immediately followed by format acceptance, size limits, and destination behavior. No sentence is filler; each carries a constraint an agent would otherwise have to discover by trial.

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 destructive install operation, the description covers formats, size ceilings, destination logic, and credential behavior, and an output schema exists so return values need no explanation. Nothing essential to correct invocation is missing.

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%, so url, database, and overwrite are already documented in the schema. The description adds the destination-folder resolution rule, but url and overwrite semantics are left essentially to the schema. Baseline 3 is appropriate when the schema does the heavy lifting.

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?

Opens with a precise verb+resource+source: 'Download and load a database from an HTTP or HTTPS URL.' This operation is unmistakably distinct from the read-only siblings (verify_database, compare_databases, inspect_database, list_databases, lookup_*), none of which install anything.

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?

Gives clear context for when this applies (loading a DB from a URL, with the accepted archive formats and size ceiling) and clarifies a common misconception by noting it does not use MaxMind credentials or persist the URL for updates. It stops short of explicitly naming alternative tools or exclusion conditions, so it stays below 5.

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

list_databasesList databasesA
Read-onlyIdempotent

List loaded databases, their metadata, download status, and setup instructions. Call this first to choose exact database filenames for other tools. An empty list can mean the initial download is still running. If status is downloading, wait and call again without starting another update.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
updateNo
messageYes
databasesYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description still adds genuine operational context the annotations cannot express: the meaning of an empty list and the retry-vs-restart behavior during an active download. It stops short of covering return format or any rate/pagination behavior, so a 4 rather than 5.

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 short sentences with no filler. The primary use case is front-loaded in sentence one, and the failure/edge-case guidance follows in priority order.

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?

An output schema exists, so return values need no elaboration, and the description's summary of what is listed is sufficient. For a no-arg, read-only discovery tool with full annotation coverage, nothing an agent needs to call it correctly is missing.

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?

The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to clarify about argument semantics. It correctly adds no redundant parameter prose.

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?

States a specific verb and resource (list loaded databases) plus the payload it returns: metadata, download status, and setup instructions. It also positions itself against the siblings by being the prerequisite discovery step ('Call this first to choose exact database filenames for other tools'), so an agent can separate it from inspect_database, install_database, or verify_database without opening a schema.

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?

Gives explicit ordering guidance ('Call this first'), explains how to interpret an empty result (download may still be running), and prescribes the correct action when status is downloading (wait and re-call rather than kick off another update — implicitly steering away from install_database). Both when-to-use and when-not-to-act are covered.

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

lookup_ipLook up an IP addressA
Read-onlyIdempotent

Look up one IP address in local MMDB databases. Returns the matching record and network, with found=false when no record matches. Use lookup_ips for a batch of addresses or lookup_network to enumerate records in a CIDR.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYesIPv4 or IPv6 address, for example 8.8.8.8 or 2001:4860:4860::8888.
fieldsNoOptional field paths. Returns an object keyed by each selected path. Use dots for map keys, numeric array indexes, or $ for the whole record. Omit or use [] for full records. Repeat on each page.
databaseNoExact filename from list_databases. Omit to query all loaded databases.

Output Schema

ParametersJSON Schema
NameRequiredDescription
ipYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, non-open-world, so the safety profile is covered. The description adds genuinely new behavior: matching record and network are returned and a found=false sentinel signals no match, plus 'local MMDB' implies offline/no-auth lookup. Strong added context without contradicting 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?

Three sentences with zero filler; the core action and return semantics come first, and the sibling routing is packed into a single final sentence. Every sentence earns its place.

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?

An output schema exists, so the description need not enumerate return fields, yet it still supplies the not-found sentinel and offline DB context. Combined with annotations and full schema coverage, an agent has everything needed to call it correctly.

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%, so all three parameters (ip, fields, database) are already documented including format examples and dotted-path semantics. The description adds nothing parameter-specific, so the baseline 3 for schema-does-the-work applies.

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?

States a specific verb (look up) and resource (one IP address) with scope 'one' that distinguishes it from batch and CIDR siblings. Names the specific alternatives (lookup_ips, lookup_network) so an agent can route without opening either schema.

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 says to use lookup_ips for a batch of addresses and lookup_network to enumerate a CIDR, giving clear when-to-use-this vs when-to-use-alternative conditions. No inference required from the agent.

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

lookup_ipsLook up IP addressesA
Read-onlyIdempotent

Look up a batch of IP addresses in local MMDB databases. Each result contains the matching record and network, found=false for no match, or an error for that address. Other addresses are still processed after an error. Use lookup_ip for a single address.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipsYesIPv4 or IPv6 addresses to look up. Results preserve input order, including duplicate addresses.
fieldsNoOptional field paths. Returns an object keyed by each selected path. Use dots for map keys, numeric array indexes, or $ for the whole record. Omit or use [] for full records. Repeat on each page.
databaseNoExact filename from list_databases. Omit to query all loaded databases.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, but the description adds genuinely new contract details: per-address failure isolation ('Other addresses are still processed after an error') and the found=false semantics for misses. It does not cover pagination or result-size limits, which keeps it from a 5.

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 tight sentences, front-loaded with the primary action and scope, followed by result semantics and the sibling routing note. Every sentence carries information and none repeats the schema.

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?

An output schema exists, so return-value structure need not be described, yet the description still gives the key outcome variants (match record+network, found=false, per-address error). Combined with annotations and full schema coverage, an agent has everything needed to call it correctly.

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%, and all three parameters (ips, fields, database) are documented in the schema itself, including ordering/duplicate behavior and field-path syntax. The description adds no parameter-level detail beyond the schema, so baseline 3 applies.

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?

States a specific verb (look up), resource (batch of IP addresses), and scope (local MMDB databases). It also distinguishes itself from the sibling lookup_ip by explicitly noting the single-address alternative, so an agent can route without opening either schema.

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?

Directly names the alternative tool ('Use lookup_ip for a single address') along with the condition that selects it (batch vs. single). The batch framing plus the explicit alternative leaves no ambiguity about when this tool is the right choice.

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

lookup_networkQuery a networkA
Read-only

Find stored network records overlapping a CIDR, with optional filters and field selection. Returned networks may extend beyond the requested CIDR. Use lookup_range for start/end bounds or summarize_network for grouped counts. Repeat the network and database on each page. Stop when has_more is false.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoOptional field paths. Returns an object keyed by each selected path. Use dots for map keys, numeric array indexes, or $ for the whole record. Omit or use [] for full records. Repeat on each page.
filtersNoConditions on record fields. For example, [{"field":"autonomous_system_number","operator":"equals","value":13335}]. Omit for no filtering on a new query. On paginated queries, omit to retain the original filters.
networkYesIPv4 or IPv6 CIDR to scan, for example 192.168.1.0/24 or 2001:db8::/32. Broad queries may scan many records.
databaseNoExact filename from list_databases. Required when more than one database is loaded. Repeat the same name on each page.
filter_modeNoCombine filters with and (all must match) or or (any can match). Defaults to and for a new query. Omit when paging to retain the original mode.
iterator_idNoID from the previous page. Omit on the first request. Send with the latest resume_token to continue if the iterator expires.
max_resultsNoMaximum matching records to return on this page. Use a smaller page to reduce response size.
resume_tokenNoToken from the previous page, used if iterator_id is missing or expired. Omit on the first request. If the database build changed, start a new query.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
has_moreYes
iterator_idYes
resume_tokenYes
total_matchedYes
total_processedYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered by structured data. The description adds genuinely non-obvious behavior beyond that: results may extend past the requested CIDR, pagination state must be carried forward by repeating network/database, and termination is signalled by has_more.

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?

Four sentences, each load-bearing: purpose, an important behavioral caveat, sibling routing, then pagination contract. It is front-loaded with the identity of the tool and contains no filler.

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?

The tool has 8 parameters and an output schema, so return-shape explanation is unnecessary. The description still covers the pagination lifecycle and the overlap semantics that an agent must know to call and iterate correctly, and annotations carry the safety profile.

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 description coverage is 100%, so the baseline is 3. The description earns above baseline by adding cross-parameter semantics the schema does not: iterator/network/database must be repeated across pages, and pagination terminates on has_more rather than a result count.

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 opening sentence gives a precise verb and resource ('Find stored network records overlapping a CIDR') and immediately scopes the tool: overlap semantics rather than containment. It also names the two nearest siblings, lookup_range and summarize_network, so an agent can distinguish it without opening schemas.

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?

Explicit routing is provided: 'Use lookup_range for start/end bounds or summarize_network for grouped counts.' Pagination guidance is also given ('Repeat the network and database on each page. Stop when has_more is false.'), covering both the selection decision and the invocation loop.

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

lookup_rangeQuery an address rangeA
Read-only

Find stored network records overlapping an inclusive start/end IP range, with optional filters and field selection. Use lookup_network when the bounds are a CIDR. Returns each overlapping network once, including networks extending beyond the bounds. Repeat the endpoints and database on each page. Stop when has_more is false.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_ipYesLast address to include, for example 192.0.2.200. Must be at or after start_ip in the same address family, without a zone identifier.
fieldsNoOptional field paths. Returns an object keyed by each selected path. Use dots for map keys, numeric array indexes, or $ for the whole record. Omit or use [] for full records. Repeat on each page.
filtersNoConditions on record fields. For example, [{"field":"autonomous_system_number","operator":"equals","value":13335}]. Omit for no filtering on a new query. On paginated queries, omit to retain the original filters.
databaseNoExact filename from list_databases. Required when more than one database is loaded. Repeat the same name on each page.
start_ipYesFirst IPv4 or IPv6 address to include, for example 192.0.2.10. Zone identifiers are not supported.
filter_modeNoCombine filters with and (all must match) or or (any can match). Defaults to and for a new query. Omit when paging to retain the original mode.
iterator_idNoID from the previous page. Omit on the first request. Send with the latest resume_token to continue if the iterator expires.
max_resultsNoMaximum matching records to return on this page. Use a smaller page to reduce response size.
resume_tokenNoToken from the previous page, used if iterator_id is missing or expired. Omit on the first request. If the database build changed, start a new query.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
has_moreYes
iterator_idYes
resume_tokenYes
total_matchedYes
total_processedYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, non-idempotent), so the description's real contribution is non-obvious semantics: results are deduplicated ('each overlapping network once') and may include networks extending beyond the bounds. It also discloses the pagination termination condition. It stops short of stating rate limits or what happens on iterator expiry, keeping it at a 4.

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?

Four dense sentences, each carrying distinct information: purpose, sibling routing, result semantics, and pagination protocol. No filler and the core purpose is front-loaded.

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 9-parameter paginated read tool with a full output schema, the description covers the remaining agent-facing gaps: dedup behavior, out-of-bounds inclusion, sibling routing, and page continuation. Return-value shape is already handled by the output schema, so nothing essential is missing.

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 description coverage is 100%, so the baseline is 3; the description earns an extra point by adding cross-page parameter behavior not obvious from the schema ('Repeat the endpoints and database on each page'), which tells the agent how start_ip/end_ip/database must be re-sent during iteration.

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?

States a specific verb (Find) and resource (stored network records) scoped to an inclusive start/end IP range, and explicitly distinguishes itself from lookup_network by naming the CIDR-bound case as the sibling's territory. An agent can route between lookup_range and lookup_network without opening either schema.

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?

Gives an explicit alternative with its selecting condition ('Use lookup_network when the bounds are a CIDR') and adds pagination guidance ('Repeat the endpoints and database on each page. Stop when has_more is false'), covering both when to pick this tool and how to drive it.

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

summarize_networkSummarize a networkA
Read-onlyIdempotent

Group matching records by a scalar field, such as country.iso_code or autonomous_system_number. Count records and covered addresses within a CIDR. Use lookup_network to retrieve individual records. IPv4 aliases are excluded. Exceeding 10,000 scanned records or 100 groups returns an error. Use a smaller CIDR if a limit is reached.

ParametersJSON Schema
NameRequiredDescriptionDefault
filtersNoConditions on record fields. For example, [{"field":"autonomous_system_number","operator":"equals","value":13335}]. Omit for no filtering on a new query. On paginated queries, omit to retain the original filters.
networkYesCIDR to summarize. Use an IPv4 prefix length of 8 or greater, or a native IPv6 prefix length of 32 or greater.
databaseYesExact filename of a loaded database from list_databases.
group_byYesPath to a scalar field, for example country.iso_code or autonomous_system_number. Use inspect_database to find paths. Supports numeric array indexes and $ for a scalar record. Missing fields form a separate group.
filter_modeNoCombine filters with and (all must match) or or (any can match). Defaults to and for a new query. Omit when paging to retain the original mode.

Output Schema

ParametersJSON Schema
NameRequiredDescription
groupsYes
networkYes
databaseYes
group_byYes
matched_recordsYes
scanned_recordsYes
total_addressesYes
matched_addressesYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is established. The description adds meaningful operational detail beyond annotations: 'IPv4 aliases are excluded,' 'Exceeding 10,000 scanned records or 100 groups returns an error,' and the mitigation advice. This is valuable transparency about limits and data scope, though it doesn't explain output shape—but an output schema exists, so that's acceptable.

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?

Six sentences, each carrying distinct information: purpose, an example, an alternative tool pointer, a data caveat, a hard limit, and remediation advice. It's front-loaded with the core action and has no wasted words.

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

Completeness4/5

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

For a read-only aggregation tool with full schema coverage and an output schema, the description covers purpose, usage boundaries, data exclusions, and error thresholds. The only minor gap is not explicitly stating that results are returned as grouped counts (though 'Count records and covered addresses' implies it), but overall it gives an agent enough to invoke the tool correctly and understand its limits.

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%, so all five parameters are fully documented in the schema with examples and enum explanations. The description mentions 'scalar field' and examples like country.iso_code, but adds no additional semantic meaning beyond what the schema already provides. Baseline 3 is appropriate when the schema does the heavy lifting.

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 opens with a specific verb and resource: 'Group matching records by a scalar field... Count records and covered addresses within a CIDR.' This clearly distinguishes summarize_network from lookup_network and lookup_range, which retrieve individual records rather than aggregate counts.

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?

It explicitly says 'Use lookup_network to retrieve individual records,' which routes the agent away from this tool for single-record lookups. It also gives practical guidance for hitting limits ('Use a smaller CIDR if a limit is reached'). It could be stronger by stating when to use summarize_network versus compare_databases, but the primary alternative is covered.

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

verify_databaseVerify a databaseA
Read-onlyIdempotent

Check a loaded MMDB for structural corruption, such as after importing a database or encountering decode errors. Returns valid=true on success or a verification error. Use inspect_database for metadata and field samples. Only one verification runs at a time. Cancellation can stop a queued request, but verification runs to completion once started.

ParametersJSON Schema
NameRequiredDescriptionDefault
databaseYesExact filename of a loaded database from list_databases.

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYes
databaseYes
completed_after_cancellationYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds non-obvious operational traits: only one verification runs at a time, cancellation can only stop a queued request, and a started verification runs to completion. It also states the success signal (valid=true) versus a verification error, which is behavior rather than schema restatement.

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?

Four tight sentences, front-loaded with purpose, then error context, then the sibling routing, then concurrency/cancellation limits. Each sentence carries distinct information an agent needs before calling.

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?

An output schema exists, so return values need not be explained, and the description nonetheless signals success/failure shape. Combined with the usage trigger, sibling routing, and concurrency/cancellation semantics, nothing needed to invoke this correctly is missing.

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?

There is a single parameter and schema coverage is 100%, so the schema already documents 'database' fully, including that it must be an exact filename from list_databases. The description adds no syntax, format, or default information beyond the schema, so the baseline of 3 applies.

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?

States a specific verb and resource — checking a loaded MMDB for structural corruption — and immediately distinguishes itself from the sibling 'inspect_database for metadata and field samples'. An agent can tell verify_database apart from inspect_database without opening either schema.

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?

Gives explicit triggers ('after importing a database or encountering decode errors') and names the alternative tool plus the condition that selects it (metadata/field samples → inspect_database). Nothing about when to choose this tool is left to inference.

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. 8 tool updatesv0.3.1
    • Changedcompare_databases5 fields changed
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum changed address ranges to return on this page."
      • changedInput schema / properties / network / description
        Previous value: -"IPv4 /8 or smaller, or IPv6 /32 or smaller"New value: +"CIDR to compare. Use an IPv4 prefix length of 8 or greater, or a native IPv6 prefix length of 32 or greater. Repeat on each page."
      • addedInput schema / properties / new_database / description
        Added value: +"Comparison database's exact filename from list_databases. Supplies the after values. Both databases must be loaded."
      • addedInput schema / properties / old_database / description
        Added value: +"Baseline database's exact filename from list_databases. Supplies the before values."
      • addedInput schema / properties / resume_token / description
        Added value: +"Token from the previous page. Omit on the first request. Repeat both database names and network. If either loaded database changed, start a new comparison."
    • Changedinspect_database2 fields changed
      • addedInput schema / properties / database / description
        Added value: +"Exact filename of a loaded database from list_databases."
      • addedInput schema / properties / sample_size / description
        Added value: +"Maximum network records to sample. Larger samples may reveal more fields. Sampling can stop early at internal field limits."
    • Changedlookup_ip2 fields changed
      • changedInput schema / properties / database / description
        Previous value: -"Specific database to query (optional)"New value: +"Exact filename from list_databases. Omit to query all loaded databases."
      • changedInput schema / properties / ip / description
        Previous value: -"IP address to lookup"New value: +"IPv4 or IPv6 address, for example 8.8.8.8 or 2001:4860:4860::8888."
    • Changedlookup_ips2 fields changed
      • changedInput schema / properties / database / description
        Previous value: -"Specific database from list_databases (optional)"New value: +"Exact filename from list_databases. Omit to query all loaded databases."
      • addedInput schema / properties / ips / description
        Added value: +"IPv4 or IPv6 addresses to look up. Results preserve input order, including duplicate addresses."
    • Changedlookup_network10 fields changed
      • changedInput schema / properties / database / description
        Previous value: -"Database name from list_databases; required when more than one is loaded"New value: +"Exact filename from list_databases. Required when more than one database is loaded. Repeat the same name on each page."
      • changedInput schema / properties / filter_mode / description
        Previous value: -"How to combine filters: 'and' or 'or' (default: 'and')"New value: +"Combine filters with and (all must match) or or (any can match). Defaults to and for a new query. Omit when paging to retain the original mode."
      • changedInput schema / properties / filters / description
        Previous value: -"Filters for a new query; omit to keep filters when continuing a query"New value: +"Conditions on record fields. For example, [{\"field\":\"autonomous_system_number\",\"operator\":\"equals\",\"value\":13335}]. Omit for no filtering on a new query. On paginated queries, omit to retain the original filters."
      • addedInput schema / properties / filters / items / properties / field / description
        Added value: +"Field path from inspect_database, such as country.iso_code. Use dots for nested keys or numeric array indexes, or $ for the whole record."
      • addedInput schema / properties / filters / items / properties / operator / description
        Added value: +"Comparison to apply. eq, ne, gt, lt, gte, and lte are aliases for the corresponding equality and ordering operators."
      • addedInput schema / properties / filters / items / properties / value / description
        Added value: +"Comparison value. Use an array for in/not_in, a Go regular expression string for regex, or a substring for contains. For exists, true tests for a non-null field and false tests for a missing or null field. Ordering comparisons use numbers."
      • changedInput schema / properties / iterator_id / description
        Previous value: -"Resume existing iterator (fast path)"New value: +"ID from the previous page. Omit on the first request. Send with the latest resume_token to continue if the iterator expires."
      • changedInput schema / properties / max_results / description
        Previous value: -"Page size from 1 to 1000"New value: +"Maximum matching records to return on this page. Use a smaller page to reduce response size."
      • changedInput schema / properties / network / description
        Previous value: -"CIDR network to scan (e.g., '192.168.1.0/24')"New value: +"IPv4 or IPv6 CIDR to scan, for example 192.168.1.0/24 or 2001:db8::/32. Broad queries may scan many records."
      • changedInput schema / properties / resume_token / description
        Previous value: -"Fallback token if iterator expired"New value: +"Token from the previous page, used if iterator_id is missing or expired. Omit on the first request. If the database build changed, start a new query."
    • Changedlookup_range11 fields changed
      • changedInput schema / properties / database / description
        Previous value: -"Database name from list_databases; required when more than one is loaded"New value: +"Exact filename from list_databases. Required when more than one database is loaded. Repeat the same name on each page."
      • addedInput schema / properties / end_ip / description
        Added value: +"Last address to include, for example 192.0.2.200. Must be at or after start_ip in the same address family, without a zone identifier."
      • changedInput schema / properties / filter_mode / description
        Previous value: -"How to combine filters: 'and' or 'or' (default: 'and')"New value: +"Combine filters with and (all must match) or or (any can match). Defaults to and for a new query. Omit when paging to retain the original mode."
      • changedInput schema / properties / filters / description
        Previous value: -"Filters for a new query; omit to keep filters when continuing a query"New value: +"Conditions on record fields. For example, [{\"field\":\"autonomous_system_number\",\"operator\":\"equals\",\"value\":13335}]. Omit for no filtering on a new query. On paginated queries, omit to retain the original filters."
      • addedInput schema / properties / filters / items / properties / field / description
        Added value: +"Field path from inspect_database, such as country.iso_code. Use dots for nested keys or numeric array indexes, or $ for the whole record."
      • addedInput schema / properties / filters / items / properties / operator / description
        Added value: +"Comparison to apply. eq, ne, gt, lt, gte, and lte are aliases for the corresponding equality and ordering operators."
      • addedInput schema / properties / filters / items / properties / value / description
        Added value: +"Comparison value. Use an array for in/not_in, a Go regular expression string for regex, or a substring for contains. For exists, true tests for a non-null field and false tests for a missing or null field. Ordering comparisons use numbers."
      • changedInput schema / properties / iterator_id / description
        Previous value: -"Resume existing iterator (fast path)"New value: +"ID from the previous page. Omit on the first request. Send with the latest resume_token to continue if the iterator expires."
      • changedInput schema / properties / max_results / description
        Previous value: -"Page size from 1 to 1000"New value: +"Maximum matching records to return on this page. Use a smaller page to reduce response size."
      • changedInput schema / properties / resume_token / description
        Previous value: -"Fallback token if iterator expired"New value: +"Token from the previous page, used if iterator_id is missing or expired. Omit on the first request. If the database build changed, start a new query."
      • addedInput schema / properties / start_ip / description
        Added value: +"First IPv4 or IPv6 address to include, for example 192.0.2.10. Zone identifiers are not supported."
    • Changedsummarize_network8 fields changed
      • addedInput schema / properties / database / description
        Added value: +"Exact filename of a loaded database from list_databases."
      • changedInput schema / properties / filter_mode / description
        Previous value: -"How to combine filters: 'and' or 'or' (default: 'and')"New value: +"Combine filters with and (all must match) or or (any can match). Defaults to and for a new query. Omit when paging to retain the original mode."
      • changedInput schema / properties / filters / description
        Previous value: -"Filters for a new query; omit to keep filters when continuing a query"New value: +"Conditions on record fields. For example, [{\"field\":\"autonomous_system_number\",\"operator\":\"equals\",\"value\":13335}]. Omit for no filtering on a new query. On paginated queries, omit to retain the original filters."
      • addedInput schema / properties / filters / items / properties / field / description
        Added value: +"Field path from inspect_database, such as country.iso_code. Use dots for nested keys or numeric array indexes, or $ for the whole record."
      • addedInput schema / properties / filters / items / properties / operator / description
        Added value: +"Comparison to apply. eq, ne, gt, lt, gte, and lte are aliases for the corresponding equality and ordering operators."
      • addedInput schema / properties / filters / items / properties / value / description
        Added value: +"Comparison value. Use an array for in/not_in, a Go regular expression string for regex, or a substring for contains. For exists, true tests for a non-null field and false tests for a missing or null field. Ordering comparisons use numbers."
      • changedInput schema / properties / group_by / description
        Previous value: -"Field path, array index, or $ for a scalar record. Missing fields form a separate group."New value: +"Path to a scalar field, for example country.iso_code or autonomous_system_number. Use inspect_database to find paths. Supports numeric array indexes and $ for a scalar record. Missing fields form a separate group."
      • changedInput schema / properties / network / description
        Previous value: -"IPv4 /8 or smaller, or IPv6 /32 or smaller"New value: +"CIDR to summarize. Use an IPv4 prefix length of 8 or greater, or a native IPv6 prefix length of 32 or greater."
    • Changedverify_database1 field changed
      • addedInput schema / properties / database / description
        Added value: +"Exact filename of a loaded database from list_databases."
  2. 10 tool updatesv0.1.0
    • First observedcompare_databases
    • First observedinspect_database
    • First observedinstall_database
    • First observedlist_databases
    • First observedlookup_ip
    • First observedlookup_ips
    • First observedlookup_network
    • First observedlookup_range
    • First observedsummarize_network
    • First observedverify_database

TDQS

A4.5/5.0

Scored across 10 tools

Disambiguation4/5

Tools are mostly distinct and descriptions explicitly cross-reference alternatives, e.g. lookup_ip vs lookup_ips and lookup_network vs lookup_range. Minor overlap remains between lookup_range/lookup_network and inspect_database/list_databases, but guidance reduces misselection.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern: lookup_range, summarize_network, compare_databases, inspect_database, list_databases, lookup_ip, lookup_ips, lookup_network, verify_database, install_database. Pluralization is predictable and no mixed conventions appear.

Tool Count5/5

Ten tools are well-scoped for a MaxMindDB server covering lookup, summarization, comparison, inspection, verification, listing, and installation. Each tool has a clear role without excessive surface area.

Completeness4/5

The surface covers core read/lookup operations plus database installation, listing, inspection, and verification. A minor gap exists for unloading/removing databases or updating an already-loaded database, but agents can work around this via reinstall.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A Model Context Protocol server that retrieves detailed geographic information about IP addresses using the ipinfo.io API, helping determine user location and network details.
    5
    40 PyPI
    44
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A Model Context Protocol server that enables LLMs to perform IP geolocation, reverse geocoding, and detect the host's public IP without requiring API keys.
    3
    8 npm
    MIT