Skip to main content
Glama
InternetData MCP Server

InternetData MCP Server

by internetdata

InternetData MCP Server

npm license

The official Model Context Protocol server for the InternetData API.

InternetData publishes IP and ASN databases: geolocation, anonymity, ownership and network data, as gzipped CSV and as MMDB. This server gives an AI agent four read-only tools over them - every database we publish and where your organization's license for each one stands, what is inside one, the digests to verify a copy you already hold, and your recent download history.

Getting Started

We host it at https://mcp.internetdata.io/mcp, and you sign in to it with your InternetData account. It also runs on your own machine from npm. Either way it sees where your organization's license for each database stands. Databases are licensed by contract. The Open ones, tor_ip_v1 among them, are licensed to every organization from the start and are free under CC BY-SA 4.0. For the rest, see the API documentation, or request an evaluation if your organization doesn't have a license yet.

In Claude

In claude.ai, the desktop app or Cowork, add https://mcp.internetdata.io/mcp as a custom connector and choose Use Claude's published identity when asked. In Claude Code, install our plugin, which adds the server with skills:

/plugin marketplace add internetdata/claude-plugin
/plugin install internetdata@internetdata

Either way you sign in with your InternetData account, and Claude never sees your API key. The steps, the skills and how to disconnect: docs.internetdata.io/integrations/claude.

In ChatGPT and Codex

InternetData is in the plugin directory ChatGPT and Codex share: add it from its listing. Codex also installs our plugin from the command line, which adds the server with skills:

codex plugin marketplace add internetdata/openai-plugin
codex plugin add internetdata@internetdata
codex mcp login internetdata

Either way you sign in with your InternetData account, and neither sees your API key. The steps: docs.internetdata.io/integrations/chatgpt and docs.internetdata.io/integrations/codex. On the OpenAI API, the Responses API's mcp tool takes the server as its server_url and your key as its authorization.

In any other MCP client

Point it at https://mcp.internetdata.io/mcp. A client that supports MCP authorization signs in the same way. One that doesn't can send a key instead, as Authorization: Bearer your-key.

On your own machine

You need an API key carrying the db.download scope. Add this to your MCP client's config:

{
  "mcpServers": {
    "internetdata": {
      "command": "npx",
      "args": ["-y", "internetdata-mcp"],
      "env": { "INTERNETDATA_API_KEY": "your-key" }
    }
  }
}

Requires Node.js 22 or newer. INTERNETDATA_BASE_URL overrides the endpoint if you need to point somewhere else.

Related MCP server: Private Database MCP

Tools

Tool

What it answers

list_databases

Every database we publish, with its standing for your organization (licensed, expired or unlicensed) and the type and term of any license.

database_metadata

A database's columns, sample rows, row count, build date and file sizes.

database_checksum

The published digests for one database file.

list_downloads

Your organization's recent download attempts, refusals included.

Every tool is read-only.

Two spellings of a database ID

list_databases answers a base ID and a versions array:

{
  "base": "vpn_ip",
  "standing": "licensed",
  "open": false,
  "versions": [{ "id": "vpn_ip_v1", "version": 1, "formats": ["csvgz", "mmdb"] }]
}

The base is what a license names. versions[].id is what a download names, and it is the one database_metadata and database_checksum accept. The tools say so in their own descriptions, so an agent generally gets this right on its own; it is worth knowing when you read a transcript where one was refused.

There is no download tool, deliberately

The published builds run to several GB, which is not something an agent should pull into a conversation. database_metadata is how you find out what a transfer would cost, and the client libraries or the API are how you actually move the bytes.

Reading the download history

list_downloads is a bounded window - at most 200 attempts, newest first - and it lists refusals alongside successes, because a denial and its http_status are what answer "it stopped working". A database missing from the answer means it is not in that window, never that it was never fetched.

Other Libraries

There are official InternetData client libraries available for many languages including PHP, Python, Go, Java, and Ruby. See our GitHub at https://github.com/internetdata for more.

About InternetData

Geolocation, anonymity, ownership and network databases for IP addresses and AS numbers, licensed as files you download and query yourself.

License

This project is licensed under the MIT License.

Available Tools

4 tools
database_checksumGet a database's checksumsA
Read-onlyIdempotent
Inspect

The published digests for one database file, for verifying a copy you already hold or deciding whether a build has changed since you last fetched it. It is licensed like the download itself, so a database this key cannot download is refused here too. Looking up a checksum is not a download and does not appear in list_downloads.

NameRequiredDescriptionDefault
formatYesWhich published file to digest.
dataset_idYesA VERSIONED database ID, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base ID is a license reference and is not accepted here.

Output Schema

NameRequiredDescription
checksumsYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent and closed-world semantics, yet the description adds genuinely non-obvious behavior: the lookup is licensed like the download itself, so unauthorized databases are refused, and the call is not recorded in `list_downloads`. That authorization and audit-trail nuance is exactly the kind of context structured fields cannot express.

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: purpose and use cases first, licensing constraint second, sibling disambiguation last. No filler, and the most decision-relevant clause 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?

An output schema exists, so return values need no explanation; annotations cover the safety profile; the schema fully documents both parameters. The remaining gaps an agent would care about — authorization gating and whether the call is a download — are covered in the text.

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 the schema itself carries the important nuance (versioned ID from `versions[].id`, not the base ID; the csvgz/mmdb enum). The description adds no parameter-level detail beyond what the schema already says, 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 resource (the published digests for one database file) and two concrete purposes (verifying a held copy, detecting whether a build changed). It also explicitly separates itself from a sibling: 'Looking up a checksum is not a download and does not appear in `list_downloads`.' An agent can pick this over database_metadata/list_downloads 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 Guidelines4/5

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

Gives clear selecting conditions — verify a copy you already have, or check if a build changed since last fetch — and rules out confusion with download listing. It lacks an explicit pointer to the sibling that would be the alternative (e.g. database_metadata for descriptive info), so it stops short of full routing guidance.

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

database_metadataDescribe a databaseA
Read-onlyIdempotent
Inspect

What is inside one database before you fetch it: the columns in each published format with their types, a few sample rows, the row count, the build date and the file sizes. Use this to answer questions about what a database contains without downloading it - the files reach several GB - and to budget a transfer before starting one.

NameRequiredDescriptionDefault
dataset_idYesA VERSIONED database ID, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base ID is a license reference and is not accepted here.

Output Schema

NameRequiredDescription
idYes
sizeYesBytes per format.
sampleNoA few real rows, keyed by format.
schemaYesColumns, keyed by format.
entriesYesRow count in the current build.
updatedYesISO-8601 date (YYYY-MM-DD) the published build was generated on.
sample_sizeNoBytes per format of the evaluation sample, where one is published.
update_freqNoHow often a new build is published.
sample_entriesNoRow count in the evaluation sample.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds genuinely useful behavior beyond them: the call avoids a download of multi-GB files and returns bounded sample rows rather than full data, which is exactly the cost/risk context an agent needs. It doesn't mention rate limits, auth, or pagination of samples.

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 sentences, zero filler, with the payload contents front-loaded and the 'why use this' rationale trailing. Every clause carries information.

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 shape is covered elsewhere, yet the description still summarizes what's inside at a level that lets an agent decide whether to call at all. With one fully documented parameter and full annotation coverage, nothing an agent needs 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% and the single dataset_id parameter is documented in detail in the schema, including the versioned-vs-unversioned distinction. The description adds nothing about the parameter, so the baseline of 3 applies.

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

Purpose4/5

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

The description names a specific resource (one database) and enumerates concretely what it exposes: columns and types per published format, sample rows, row count, build date, file sizes. An agent can immediately tell this is a read-only inspector rather than a fetcher. It stops short of naming the differentiating siblings (list_databases, database_checksum, list_downloads), so the boundary is inferred rather than stated.

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 gives two explicit use cases: answering content questions without downloading, and budgeting a transfer before starting one. The 'without downloading it' framing implicitly tells the agent this is the cheap pre-flight step, but no alternative tool is named and no explicit when-not-to-use case is given.

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
Inspect

The IP database catalog as this API key's organization may see it, one entry per database FAMILY, with standing saying where their license stands: licensed if the family is theirs today, expired if the term has ended, unlicensed if it is published but has never been bought. Each entry has a base ID, which is what a license names, and a versions array whose id is what the other tools take - pass versions[].id (bogon_ip_v1), never the base (bogon_ip). Ask again rather than holding on to this: it is answered per key and is not the same for everyone.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
databasesYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent, non-destructive behavior. The description adds meaningful context beyond them: the response is organization-scoped and per API key, may differ for other callers, and should be re-queried rather than cached. It also defines the standing values, which is useful behavioral information.

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 front-loaded with the catalog scope and then layers standing definitions, ID guidance, and a freshness warning. Every clause is informative, though the single dense paragraph could be easier to scan as structured bullets; it is not padded with redundant restatements.

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 zero-parameter catalog tool with an output schema, the definition covers the important context an agent needs: organization scoping, license standing states, the base-versus-version ID trap, and the risk of caching per-key results. The output schema handles return structure, so the description is complete enough to call correctly.

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 has zero input parameters, so the baseline is 4; there are no input names or enums needing explanation. The description instead spends its space on output-field semantics (base, versions[].id, standing), which is appropriate but does not alter the parameter score.

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 identifies the resource precisely: an IP database catalog scoped to the caller's organization, with one entry per database family. It also distinguishes base IDs from version IDs and names versions[].id as the value other tools take, which separates its role from sibling tools like database_metadata.

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

Usage Guidelines3/5

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

It implies the tool is the discovery step for IDs used by other tools, and it tells the caller not to retain a cached copy because results are per key. However, it does not explicitly state when to choose this over database_metadata, database_checksum, or list_downloads, nor does it give when-not-to-use guidance.

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

list_downloadsList recent download attemptsA
Read-only
Inspect

This organization's own recent download attempts, newest first, REFUSALS INCLUDED - a denial carries the outcome and http_status that answer "it stopped working", which nothing else here can. Use it to explain a failing fetch, to confirm a transfer ran, or to check whether a request was theirs. This is a bounded WINDOW of at most 200 rows, so a database missing from the answer means it is not in this window - never that it was never downloaded.

NameRequiredDescriptionDefault
limitNoHow many attempts to return, newest first. At most 200; the API defaults to 50.

Output Schema

NameRequiredDescription
downloadsYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover readOnly/non-destructive/closed-world, but the description adds substantive traits on top: results are ordered newest-first, include refusals, and are capped at a 200-row window with the inferential consequence spelled out. That window caveat is exactly the kind of behavioral limitation the annotations cannot express.

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, front-loaded with scope and ordering, then use cases, then the limitation. The quoted 'it stopped working' is the only flourish and it maps directly to a real agent diagnosis scenario, so 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?

Output schema exists, so return-shape explanation is unnecessary; annotations cover the safety profile; the one parameter is documented in schema. The remaining risk for this tool is misreading a bounded window as completeness, and the description closes that gap explicitly.

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% and the single limit parameter is fully documented there (max 200, default 50), so the schema does the heavy lifting. The description reinforces the 200 ceiling and newest-first ordering but adds no new syntax or semantics for the parameter itself, which is the baseline-3 case for one well-documented param.

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?

It names a concrete verb and resource (recent download attempts, newest first) and scopes it to 'this organization's own', which separates it from the database-inventory siblings. 'REFUSALS INCLUDED' is an explicit statement of what is in the result set that an agent could not infer from the name.

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?

It gives three concrete triggering situations (explain a failing fetch, confirm a transfer ran, check whether a request was theirs) and asserts that denials here carry outcome/http_status 'which nothing else here can', effectively naming the alternatives. It also supplies the key when-not: absence from this bounded window does not prove a download never happened.

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 updatesv3.1.10
    • Changeddatabase_checksum1 field changed
      • changedInput schema / properties / dataset_id / description
        Previous value: -"A VERSIONED database id, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base id is a license reference and is not accepted here."New value: +"A VERSIONED database ID, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base ID is a license reference and is not accepted here."
    • Changeddatabase_metadata1 field changed
      • changedInput schema / properties / dataset_id / description
        Previous value: -"A VERSIONED database id, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base id is a license reference and is not accepted here."New value: +"A VERSIONED database ID, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base ID is a license reference and is not accepted here."
    • Changedlist_databases3 fields changed
      • changedOutput schema / properties / databases / items / description
        Previous value: -"One database FAMILY, with your organization's license beside it. A\nlicense covers the family, while a download names a specific version,\nso the ids passed to `download` and `checksum` come from `versions`.\n"New value: +"One database FAMILY, with your organization's license beside it. A\nlicense covers the family, while a download names a specific version,\nso the IDs passed to `download` and `checksum` come from `versions`.\n"
      • changedOutput schema / properties / databases / items / properties / versions / items / properties / formats / description
        Previous value: -"The formats this version is BUILT in. Asking for another is a 400,\nnot a gap - the `_provider` catalogs are keyed by provider id, so no\nMMDB exists for them.\n"New value: +"The formats this version is BUILT in. Asking for another is a 400,\nnot a gap - the `_provider` catalogs are keyed by provider ID, so no\nMMDB exists for them.\n"
      • changedOutput schema / properties / databases / items / properties / versions / items / properties / id / description
        Previous value: -"The versioned id. Pass this to `download`, `checksum` and `metadata`."New value: +"The versioned ID. Pass this to `download`, `checksum` and `metadata`."
  2. 4 tool updatesv3.1.3
    • Changeddatabase_checksum1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeddatabase_metadata1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_databases3 fields changed
      • addedInput schema / properties
        Added value: +{}
      • addedOutput schema / properties / databases / items / properties / open
        Added value: +{
        +  "description": "An Open database: free under CC BY-SA 4.0 (credit InternetData,\nhttps://internetdata.io, and share what you build from it under\nthe same license). Every organization holds a `standard` license\nto it from the start, which `standing` and `license_type` report\nlike any other.\n",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / databases / items / required
        Previous value: -[
        -  "base",
        -  "name",
        -  "summary",
        -  "standing",
        -  "license_type",
        -  "starts",
        -  "expires",
        -  "renews_at",
        -  "notice_due_at",
        -  "versions"
        -]New value: +[
        +  "base",
        +  "name",
        +  "summary",
        +  "standing",
        +  "open",
        +  "license_type",
        +  "starts",
        +  "expires",
        +  "renews_at",
        +  "notice_due_at",
        +  "versions"
        +]
    • Changedlist_downloads3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / downloads / items / properties / open
        Added value: +{
        +  "description": "A download of an Open database.\n",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / downloads / items / required
        Previous value: -[
        -  "dataset_id",
        -  "format",
        -  "outcome",
        -  "sample",
        -  "bytes",
        -  "http_status",
        -  "apikey_id",
        -  "client_ip",
        -  "user_agent",
        -  "created"
        -]New value: +[
        +  "dataset_id",
        +  "format",
        +  "outcome",
        +  "sample",
        +  "open",
        +  "bytes",
        +  "http_status",
        +  "apikey_id",
        +  "client_ip",
        +  "user_agent",
        +  "created"
        +]
  3. 4 tool updatesv2.2.0
    • Changeddatabase_checksum1 field changed
      • changedInput schema / properties / dataset_id / description
        Previous value: -"A VERSIONED database id, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base id is a licence reference and is not accepted here."New value: +"A VERSIONED database id, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base id is a license reference and is not accepted here."
    • Changeddatabase_metadata3 fields changed
      • changedInput schema / properties / dataset_id / description
        Previous value: -"A VERSIONED database id, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base id is a licence reference and is not accepted here."New value: +"A VERSIONED database id, from `versions[].id` in `list_databases` - `bogon_ip_v1`, not `bogon_ip`. The unversioned base id is a license reference and is not accepted here."
      • addedOutput schema / properties / sample_entries
        Added value: +{
        +  "description": "Row count in the evaluation sample.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / sample_size
        Added value: +{
        +  "additionalProperties": {
        +    "format": "int64",
        +    "type": "integer"
        +  },
        +  "description": "Bytes per format of the evaluation sample, where one is published.",
        +  "type": "object"
        +}
    • Changedlist_databases18 fields changed
      • changedOutput schema / properties / databases / items / description
        Previous value: -"One database FAMILY, with your organization's licence beside it. A\nlicence covers the family, while a download names a specific version,\nso the ids passed to `download` and `checksum` come from `versions`.\n"New value: +"One database FAMILY, with your organization's license beside it. A\nlicense covers the family, while a download names a specific version,\nso the ids passed to `download` and `checksum` come from `versions`.\n"
      • changedOutput schema / properties / databases / items / properties / base / description
        Previous value: -"The family, e.g. `vpn_ip`. What a licence is held against."New value: +"The family, e.g. `vpn_ip`. What a license is held against."
      • changedOutput schema / properties / databases / items / properties / expires / description
        Previous value: -"A hard stop. Null when the licence has no end date, which is the normal case for a rolling agreement, and when there is no licence. A rolling licence reports its turnover date in renews_at instead."New value: +"A hard stop. Null when the license has no end date, which is the normal case for a rolling agreement, and when there is no license. A rolling license reports its turnover date in renews_at instead."
      • removedOutput schema / properties / databases / items / properties / expires / nullable
        Removed value: -true
      • changedOutput schema / properties / databases / items / properties / expires / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / databases / items / properties / license_type / description
        Previous value: -"What your licence permits you to do with the data. Null when there\nis no licence.\n"New value: +"What your license permits you to do with the data. Null when there\nis no license, which is every family with standing `unlicensed`.\n"
      • removedOutput schema / properties / databases / items / properties / license_type / nullable
        Removed value: -true
      • changedOutput schema / properties / databases / items / properties / license_type / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / databases / items / properties / notice_due_at / nullable
        Removed value: -true
      • changedOutput schema / properties / databases / items / properties / notice_due_at / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / databases / items / properties / renews_at / description
        Previous value: -"When a rolling licence next renews. Null when the licence has no defined term, when expires sets a hard stop instead, and when there is no licence."New value: +"When a rolling license next renews. Null when the license has no defined term, when expires sets a hard stop instead, and when there is no license."
      • removedOutput schema / properties / databases / items / properties / renews_at / nullable
        Removed value: -true
      • changedOutput schema / properties / databases / items / properties / renews_at / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / databases / items / properties / standing / description
        Previous value: -"`licensed` is a live grant, `expired` one whose term has ended, and\n`unlicensed` a database published but never bought.\n"New value: +"Where your license for a database family stands today. `licensed` is a\nlive grant, `expired` one whose term has ended, and `unlicensed` a\ndatabase published but never bought.\n"
      • removedOutput schema / properties / databases / items / properties / starts / nullable
        Removed value: -true
      • changedOutput schema / properties / databases / items / properties / starts / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / databases / items / properties / versions / items / properties / formats / items / description
        Added value: +"A file format a database version is published in."
      • addedOutput schema / properties / databases / items / properties / versions / items / properties / sample_formats
        Added value: +{
        +  "description": "The formats an evaluation sample is published in, if any.",
        +  "items": {
        +    "description": "A file format a database version is published in.",
        +    "enum": [
        +      "csvgz",
        +      "mmdb"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedlist_downloads12 fields changed
      • removedOutput schema / properties / downloads / items / properties / apikey_id / nullable
        Removed value: -true
      • changedOutput schema / properties / downloads / items / properties / apikey_id / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / downloads / items / properties / bytes / nullable
        Removed value: -true
      • changedOutput schema / properties / downloads / items / properties / bytes / type
        Previous value: -"integer"New value: +[
        +  "integer",
        +  "null"
        +]
      • removedOutput schema / properties / downloads / items / properties / client_ip / nullable
        Removed value: -true
      • changedOutput schema / properties / downloads / items / properties / client_ip / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / downloads / items / properties / http_status / nullable
        Removed value: -true
      • changedOutput schema / properties / downloads / items / properties / http_status / type
        Previous value: -"integer"New value: +[
        +  "integer",
        +  "null"
        +]
      • addedOutput schema / properties / downloads / items / properties / sample
        Added value: +{
        +  "description": "The evaluation sample rather than the database itself.",
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / downloads / items / properties / user_agent / nullable
        Removed value: -true
      • changedOutput schema / properties / downloads / items / properties / user_agent / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / downloads / items / required
        Previous value: -[
        -  "dataset_id",
        -  "format",
        -  "outcome",
        -  "bytes",
        -  "http_status",
        -  "apikey_id",
        -  "client_ip",
        -  "user_agent",
        -  "created"
        -]New value: +[
        +  "dataset_id",
        +  "format",
        +  "outcome",
        +  "sample",
        +  "bytes",
        +  "http_status",
        +  "apikey_id",
        +  "client_ip",
        +  "user_agent",
        +  "created"
        +]
  4. 4 tool updatesv1.0.0
    • First observeddatabase_checksum
    • First observeddatabase_metadata
    • First observedlist_databases
    • First observedlist_downloads

TDQS

A4.1/5.0

Scored across 4 tools

Disambiguation4/5

Each tool targets a distinct object: the catalog (list_databases), a single database's contents (database_metadata), its digests (database_checksum), and the org's download history (list_downloads). The only mild overlap is that metadata and checksum both inspect one database without downloading, but the descriptions clearly separate 'what's inside / how big' from 'verify this copy'.

Naming Consistency4/5

Two predictable patterns are used: list_* for collection views (list_databases, list_downloads) and database_* for per-database lookups (database_metadata, database_checksum). It is consistent and readable, though the mix of verb_noun and noun_noun across the set is a minor deviation from a single convention.

Tool Count4/5

Four tools for a narrow, read-only catalog purpose is on the lean side but each one has a clear job, and none are redundant. It sits just under the ideal band rather than feeling padded or truncated.

Completeness3/5

The surface covers discovery, inspection, verification, and history, but several descriptions reference actually fetching files ('before you fetch it', 'budget a transfer before starting one', 'confirm a transfer ran') with no download tool present, which is a notable dead end. There is also no way to query a single database's license standing short of pulling the full catalog, so agents must work around gaps.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only database access for AI agents, enabling table listing, schema inspection, and filtered row queries through MCP tools.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to explore and query approved portions of local SQLite snapshots through denylist-free, policy-restricted typed MCP tools, including schema inspection, safe SELECT queries, table statistics, and schema-fingerprint verification. Sanitizes unmasked outputs and denies undeclared tables and sensitive columns so disclosures stay limited even during advanced queries.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to explore and query SQLite databases through read-only, sandboxed tools for listing tables, describing schemas, fetching DDL, and running a single capped SELECT statement. Also supports plain-English questions that are converted to SQL and routed through the same sandbox.
    4
    MIT