InternetData MCP Server
Read-only MCP server for inspecting InternetData IP/ASN databases, your organization’s license status, database contents, checksums, and recent download attempts.
list_databases: list every database family visible to your API key, with licensestanding(licensed,expired,unlicensed), license type/term, Open-database status, and available versions/formats.database_metadata: inspect one versioned database before fetching it: columns and types, sample rows, row count, build date, update frequency, and file/sample sizes.database_checksum: get published MD5, SHA-1, SHA-256, and SHA-512 digests for a database file to verify a copy or detect build changes.list_downloads: view your organization’s recent download attempts, newest first, including refusals with outcomes and HTTP statuses; limited to at most 200 rows.It does not download database files; use metadata to estimate transfer cost and the InternetData API or client libraries to move the bytes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@InternetData MCP Serverwhich IP databases are we licensed for, and how big is the latest VPN build?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
InternetData MCP Server
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@internetdataEither 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 internetdataEither 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 |
| Every database we publish, with its |
| A database's columns, sample rows, row count, build date and file sizes. |
| The published digests for one database file. |
| 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 toolsdatabase_checksumGet a database's checksumsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | Which published file to digest. | |
| dataset_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| checksums | Yes |
TDQS
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.
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.
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.
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.
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.
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 databaseARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| size | Yes | Bytes per format. |
| sample | No | A few real rows, keyed by format. |
| schema | Yes | Columns, keyed by format. |
| entries | Yes | Row count in the current build. |
| updated | Yes | ISO-8601 date (YYYY-MM-DD) the published build was generated on. |
| sample_size | No | Bytes per format of the evaluation sample, where one is published. |
| update_freq | No | How often a new build is published. |
| sample_entries | No | Row count in the evaluation sample. |
TDQS
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.
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.
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.
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.
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.
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 databasesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| databases | Yes |
TDQS
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.
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.
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.
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.
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.
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 attemptsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many attempts to return, newest first. At most 200; the API defaults to 50. |
Output Schema
| Name | Required | Description |
|---|---|---|
| downloads | Yes |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v3.1.10- Changed
database_checksum1 field changed- changed
Input schema / properties / dataset_id / descriptionPrevious 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."
- Changed
database_metadata1 field changed- changed
Input schema / properties / dataset_id / descriptionPrevious 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."
- Changed
list_databases3 fields changed- changed
Output schema / properties / databases / items / descriptionPrevious 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" - changed
Output schema / properties / databases / items / properties / versions / items / properties / formats / descriptionPrevious 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" - changed
Output schema / properties / databases / items / properties / versions / items / properties / id / descriptionPrevious value: -"The versioned id. Pass this to `download`, `checksum` and `metadata`."New value: +"The versioned ID. Pass this to `download`, `checksum` and `metadata`."
4 tool updates
v3.1.3- Changed
database_checksum1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
database_metadata1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_databases3 fields changed- added
Input schema / propertiesAdded value: +{} - added
Output schema / properties / databases / items / properties / openAdded 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" +} - changed
Output schema / properties / databases / items / requiredPrevious 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" +]
- Changed
list_downloads3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / properties / downloads / items / properties / openAdded value: +{ + "description": "A download of an Open database.\n", + "type": "boolean" +} - changed
Output schema / properties / downloads / items / requiredPrevious 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" +]
4 tool updates
v2.2.0- Changed
database_checksum1 field changed- changed
Input schema / properties / dataset_id / descriptionPrevious 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."
- Changed
database_metadata3 fields changed- changed
Input schema / properties / dataset_id / descriptionPrevious 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." - added
Output schema / properties / sample_entriesAdded value: +{ + "description": "Row count in the evaluation sample.", + "type": "integer" +} - added
Output schema / properties / sample_sizeAdded value: +{ + "additionalProperties": { + "format": "int64", + "type": "integer" + }, + "description": "Bytes per format of the evaluation sample, where one is published.", + "type": "object" +}
- Changed
list_databases18 fields changed- changed
Output schema / properties / databases / items / descriptionPrevious 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" - changed
Output schema / properties / databases / items / properties / base / descriptionPrevious 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." - changed
Output schema / properties / databases / items / properties / expires / descriptionPrevious 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." - removed
Output schema / properties / databases / items / properties / expires / nullableRemoved value: -true - changed
Output schema / properties / databases / items / properties / expires / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / databases / items / properties / license_type / descriptionPrevious 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" - removed
Output schema / properties / databases / items / properties / license_type / nullableRemoved value: -true - changed
Output schema / properties / databases / items / properties / license_type / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Output schema / properties / databases / items / properties / notice_due_at / nullableRemoved value: -true - changed
Output schema / properties / databases / items / properties / notice_due_at / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / databases / items / properties / renews_at / descriptionPrevious 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." - removed
Output schema / properties / databases / items / properties / renews_at / nullableRemoved value: -true - changed
Output schema / properties / databases / items / properties / renews_at / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / databases / items / properties / standing / descriptionPrevious 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" - removed
Output schema / properties / databases / items / properties / starts / nullableRemoved value: -true - changed
Output schema / properties / databases / items / properties / starts / typePrevious value: -"string"New value: +[ + "string", + "null" +] - added
Output schema / properties / databases / items / properties / versions / items / properties / formats / items / descriptionAdded value: +"A file format a database version is published in." - added
Output schema / properties / databases / items / properties / versions / items / properties / sample_formatsAdded 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" +}
- Changed
list_downloads12 fields changed- removed
Output schema / properties / downloads / items / properties / apikey_id / nullableRemoved value: -true - changed
Output schema / properties / downloads / items / properties / apikey_id / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Output schema / properties / downloads / items / properties / bytes / nullableRemoved value: -true - changed
Output schema / properties / downloads / items / properties / bytes / typePrevious value: -"integer"New value: +[ + "integer", + "null" +] - removed
Output schema / properties / downloads / items / properties / client_ip / nullableRemoved value: -true - changed
Output schema / properties / downloads / items / properties / client_ip / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Output schema / properties / downloads / items / properties / http_status / nullableRemoved value: -true - changed
Output schema / properties / downloads / items / properties / http_status / typePrevious value: -"integer"New value: +[ + "integer", + "null" +] - added
Output schema / properties / downloads / items / properties / sampleAdded value: +{ + "description": "The evaluation sample rather than the database itself.", + "type": "boolean" +} - removed
Output schema / properties / downloads / items / properties / user_agent / nullableRemoved value: -true - changed
Output schema / properties / downloads / items / properties / user_agent / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / downloads / items / requiredPrevious 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 tool updates
v1.0.0- First observed
database_checksum - First observed
database_metadata - First observed
list_databases - First observed
list_downloads
TDQS
Scored across 4 tools
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'.
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.
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.
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
Related MCP Connectors
IP intelligence, network diagnostics, and AI service availability tools for AI agents.
Free, no-API-key network lookups for AI agents — IP geolocation, DNS, WHOIS, HTTP and SSL/TLS certificate checks, and full domain health reports.
Read-only search of 2,189 AI agent tools (MCP servers, x402 APIs) with daily automated trust scores.
A read-only verified record of agent-operable GTM tools: search, fetch, compare, track changes.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceProvides read-only database access for AI agents, enabling table listing, schema inspection, and filtered row queries through MCP tools.-
- AlicenseNot gradedqualityCmaintenanceEnables 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
- AlicenseAqualityBmaintenanceEnables 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.4MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to securely discover database schemas and execute read-only SQL queries through guardrailed tools that block mutations and clamp result sizes.MIT