Skip to main content
Glama
internetdata

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

In ChatGPT on the web, add https://mcp.internetdata.io/mcp as a custom MCP server under Plugins and choose OAuth. In Codex, install our plugin, 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: DB MCP Demo

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.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context: the licensing constraint ('a database this key cannot download is refused here too') and the fact that lookups are not recorded as downloads. These are non-obvious traits that go beyond the safety hints.

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?

Three tight sentences that front-load the core purpose and reply to each subsequent question (license parity, download-listing side effect). No filler, though the third sentence slightly restates the sibling-separation point.

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?

With an output schema covering return values and rich annotations covering the safety profile, the description supplies everything else an agent needs: what it returns, the licensing gate, and the non-download side effect. Nothing material 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 the schema already documents both parameters, including the versioned vs. unversioned dataset_id distinction. The description reinforces the licensing implication of dataset_id but adds little syntax beyond the schema. 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 ('published digests for one database file') and explicitly distinguishes itself from the sibling 'list_downloads' by noting lookups don't appear there. An agent can identify this as the checksum/hash retrieval tool without opening the 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 triggers for use ('verifying a copy you already hold or deciding whether a build has changed since you last fetched it') and one explicit exclusion (not a download, not in list_downloads). It doesn't position itself against database_metadata or list_databases, but the usage context is concrete.

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.3/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive, openWorld, so the safety profile is covered. The description adds useful non-obvious context the annotations cannot: that this is a cheap preview whose purpose is to avoid multi-GB downloads and to size a transfer.

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, front-loaded with the payload contents and immediately followed by the reason to use it. No filler or restatement of the name/title.

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 spelled out, and the description still covers content shape, cost/size caveat, and intent. For a single-parameter read-only tool this is complete.

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 dataset_id description is unusually rich (versioned vs unversioned id, source of the value, an example). The description itself adds no parameter guidance, so the schema carries this dimension; baseline 3 is correct.

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 (describe/what is inside) and enumerates exactly what is returned: columns and types per format, sample rows, row count, build date, file sizes. The 'without downloading it' framing contrasts it cleanly with the download/checksum 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 two clear use cases - answering content questions without downloading, and budgeting a transfer before starting one - plus the implicit exclusion that downloading multi-GB files is the alternative. It stops short of naming a sibling tool explicitly, so it is strong context rather than full when/when-not routing.

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.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuinely non-annotated behavior: results are scoped to the calling key's organization and are volatile, so the agent should re-query rather than hold the result.

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-loaded with the core purpose, then the standing enum, then the critical id rule, then the caching caveat. Dense and mostly earned, though the middle sentence is long and packs several distinct concepts together.

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?

With zero parameters, full annotation coverage, and an output schema, the description only needs to supply meaning the structured fields cannot. It does exactly that by defining the standing enum values and warning which id field downstream tools accept.

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?

There are no input parameters, so the baseline is 4. The description spends its space on output semantics instead (standing values, base vs versions ids), which is beyond the schema's scope and useful, though it is not parameter semantics per se.

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 (list) and resource (the IP database catalog), and pins down the unit of return: one entry per database FAMILY. It also disambiguates itself from siblings implicitly by describing the catalog view, not metadata, checksums, or downloads.

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 gives real operational guidance — answer per key, do not cache, ask again — but never states when to call this versus database_metadata or list_downloads, nor that it is the prerequisite step for discovering the ids other tools need. Usage is implied rather than directed.

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.4/5.0
Behavior4/5

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

Annotations cover read-only/idempotency safety, but the description adds behavior they cannot express: refusals are included rather than filtered, denial rows carry outcome and http_status, and results are a bounded 200-row window. The explicit warning against interpreting absence as 'never downloaded' is exactly the kind of negative-inference caveat that prevents agent error, though ordering/pagination beyond 'newest first' is left implicit.

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-loaded with what the tool returns and its key differentiator before the caveat. It is dense and does earn most of its sentences, though the capitalized emphasis and the quoted 'it stopped working' phrasing add rhetorical weight rather than 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?

For a single-optional-parameter read tool with an output schema, this covers everything an agent needs: what rows appear, that denials are present, the maximum window size, and the misreading to avoid. Return-value shape is correctly left to the output schema.

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 limit parameter already documents the 200 cap and the API's 50-row default. The description reinforces the window bound as a semantic constraint but adds no new syntax or meaning for the parameter itself, 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 and resource (list this organization's download attempts), plus scope (own, newest first) and a distinguishing property (refusals included). An agent can tell instantly that this is the only tool returning per-attempt outcome/http_status data versus the metadata/checksum siblings.

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 three explicit trigger scenarios — explain a failing fetch, confirm a transfer ran, check whether a request was theirs — and notes that no other tool here can supply the denial details. That is concrete when-to-use guidance tied to a differentiator.

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. 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"
        +]
  2. 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"
        +]
  3. 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 action: listing the catalog, inspecting one database's contents, fetching one file's digests, and reviewing download history. The main risk is mild overlap between list_databases/database_metadata and database_metadata/database_checksum, since both pairs concern 'a database,' but the descriptions make the schema-vs-digest distinction clear.

Naming Consistency3/5

All names use snake_case, which is readable, but the convention is mixed: two tools use a list_ verb prefix while the other two use a bare database_ noun prefix. The pattern shifts depending on whether the tool is a list operation or a per-database lookup.

Tool Count4/5

Four tools is on the lean side but each covers a genuinely distinct facet of a data-catalog domain (catalog, metadata, checksums, download history). Nothing feels padded or redundant.

Completeness4/5

The surface covers catalog browsing, pre-fetch inspection, integrity verification, and transfer history, which is a coherent lifecycle for a licensed-dataset store. The only notable gap is the absence of an explicit download/initiation tool, though the text implies fetching happens out-of-band, plus no search/filter operation.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Exposes a SQLite database to AI assistants with structured, read-safe access. Includes five tools for schema exploration, querying, and sampling data.
    -
  • 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
    A
    quality
    C
    maintenance
    Enables AI agents to inspect real databases through MCP with tools for listing tables, describing schemas, sampling rows, running queries, and explaining execution plans, all with engine-enforced read-only access to SQLite and MySQL.
    5
    1 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to classify IP addresses through the VPNDetection API with read-only tools that detect VPNs, residential and datacenter proxies, Tor nodes, relays, hosting providers and CDNs, in single or bulk lookups of up to 100 addresses. It also exposes which datasets an organisation is licensed for, along with their metadata and published checksums.
    7
    197 npm
    1
    MIT