VPNDetection

io.vpndetection由 vpndetection.io 发布官方发布者v6.2.6更新于 Nov 6, 2026

VPN, proxy, Tor, hosting and CDN detection for any IP address, from the VPNDetection API.

已验证Streamable HTTP可网页运行安全与监控数据与分析

概览

AI 生成的概览

VPNDetection 可判断 IP 地址是否属于 VPN、代理、Tor、托管或 CDN,并提供数据库目录与授权状态查询。

可以做什么
  • 对单个 IPv4 或 IPv6 地址分类:VPN、住宅/数据中心/移动/公共代理、Tor 节点、中继、托管商或 CDN,并给出已知的提供商名称
  • 一次批量分类整份地址列表,结果按地址为键返回
  • 查询 API 密钥的权益:套餐、字段层级、已用请求数、额度及重置时间
  • 浏览数据库目录及各数据库家族的授权状态,并查看列信息、示例行、行数与文件大小
  • 查询数据库文件的已发布校验值,并查看本组织近期的下载尝试记录(含被拒记录)
适用场景
适合需要判断访问流量、注册或日志是否来自匿名化基础设施的场景,也用于解释查询结果为何缺少某些字段。在发起大批量查询前核对套餐用量与数据库授权状态时同样有用。
运行要求
可使用 mcp.vpndetection.io 远程端点并通过 OAuth 登录 VPNDetection 账户,或在本地以 Node.js 22 及以上运行 npm 包 vpndetection-mcp。可通过环境变量 VPNDETECTION_API_KEY 提供密钥;无密钥时查询仅返回 ip 与 is_vpn,每个来源地址每天上限 1000 次。VPNDETECTION_BASE_URL 可覆盖接口地址。数据库相关工具需要具备 db.download 权限的密钥。
安装前请注意
需要 VPNDetection 账户,完整字段需付费套餐,用量按订阅周年而非自然月计算。结果中缺失的字段表示套餐未包含,而非“未发现”,因此必须结合 coverage 信息解读。所有工具均为只读,且不提供下载工具,数据库文件需另行获取。API 密钥属于凭据,应仅放在环境变量中,不要外泄。

安装

在 SourceWeft 中

  1. 打开 控制台中的 VPNDetection,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.vpndetection%2Fmcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "vpndetection": {
      "type": "http",
      "url": "https://mcp.vpndetection.io/mcp"
    }
  }
}

README

[VPNDetection] VPNDetection MCP Server

[npm] [license]

The official Model Context Protocol server for the VPNDetection API.

It gives an AI agent seven read-only tools for anonymity detection: whether an address belongs to a VPN, a residential, datacenter, mobile or public proxy, a Tor node, a privacy relay or web gateway, a hosting provider or a CDN, plus the database catalog and where your organization's license for each one stands.

Getting Started

We host it at https://mcp.vpndetection.io/mcp, and you sign in to it with your VPNDetection account. It also runs on your own machine from npm.

In Claude

In claude.ai, the desktop app or Cowork, add https://mcp.vpndetection.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:

console
/plugin marketplace add vpndetection-io/claude-plugin/plugin install vpndetection@vpndetection

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

In ChatGPT and Codex

In ChatGPT on the web, add https://mcp.vpndetection.io/mcp as a custom MCP server under Plugins and choose OAuth. In Codex, install our plugin, which adds the server with skills:

console
codex plugin marketplace add vpndetection-io/openai-plugincodex plugin add vpndetection@vpndetectioncodex mcp login vpndetection

Either way you sign in with your VPNDetection account, and neither sees your API key. The steps: docs.vpndetection.io/integrations/chatgpt and docs.vpndetection.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.vpndetection.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

No API key needed to start. Without a key, a lookup answers ip and is_vpn, up to 1000 a day per source address. A free key adds Tor and relay detection, where the address is and the AS that announces it, and every paid plan answers every field.

Add this to your MCP client's config:

json
{  "mcpServers": {    "vpndetection": {      "command": "npx",      "args": ["-y", "vpndetection-mcp"]    }  }}

Requires Node.js 22 or newer.

A key unlocks the provider name, the classification databases and the proxy families. Put it in the environment:

json
{  "mcpServers": {    "vpndetection": {      "command": "npx",      "args": ["-y", "vpndetection-mcp"],      "env": { "VPNDETECTION_API_KEY": "your-key" }    }  }}

VPNDETECTION_BASE_URL overrides the endpoint if you need to point somewhere else.

Tools

ToolWhat it answers
lookup_ipClassify one address.
lookup_ipsClassify a whole list of addresses in one call, keyed by address. A long list is batched for you.
my_entitlementWhat this key is entitled to and what it has spent: plan, field tier, requests so far, allowance, and when it resets.
list_databasesEvery database we publish, with its standing for your organization: licensed, expired or unlicensed.
database_metadataA database's columns, sample rows, row count, build date and file sizes.
database_checksumThe published digests for one database file.
list_downloadsYour organization's recent download attempts, refusals included.

The database tools need a key with the db.download scope, which your organization's Default key has.

Every tool is read-only. There is deliberately no download tool: the databases run to several GB, which is not something an agent should pull into a conversation. Fetch them with the client libraries or the API instead.

There is deliberately no my_ip tool, although every client library has one. Over a hosted transport the address our edge observes belongs to whatever proxied the call - Claude's infrastructure, not the person asking - so the tool would answer confidently and wrongly for the only reading anyone would put on it. my_entitlement has no such problem and is the same answer from any transport, because it describes the credential rather than the connection. A test pins the tool's absence so it cannot be added back by accident.

Usage counts against the anniversary of the subscription, not the calendar month and not the billing period. A null hard_limit means we never stop serving; it is not a limit of zero.

Reading a result

Each lookup comes back with a coverage block beside it:

json
{  "result": { "ip": "45.83.91.1", "is_vpn": true },  "coverage": {    "included": ["ip", "is_vpn"],    "not_included": ["is_hosting", "is_tor", "hosting", "tor", "..."],    "note": "The fields in not_included were not returned, because this API key's plan does not include them. ..."  }}

This matters more here than in a normal client library. A field missing from a result means your plan doesn't include it, never "we checked and found nothing" - and a model reading the result on its own will otherwise treat the absence as a negative answer. coverage states the difference explicitly so it can't.

Other Libraries

There are official VPNDetection client libraries available for many languages including PHP, Python, Go, Java, Ruby, and many popular frameworks such as Django, Rails, and Laravel. See our GitHub at https://github.com/vpndetection-io for more.

About VPNDetection

VPN Detection API: Accurate anonymity detection identifying VPNs, residential proxies, hosting servers, Tor nodes, CDNs, relays and more.

[VPNDetection]

License

This project is licensed under the MIT License.

来源:README.md,提交 f3dba4c

工具

7

lookup_ip

Look up an IP address

Classify a single IPv4 or IPv6 address: whether it belongs to a VPN, a residential, datacenter, mobile or public proxy, a Tor node, a privacy relay or web gateway, a hosting provider or a CDN, with the provider name where we have one. Private and reserved addresses are answered locally, without calling the API. Always read `coverage.note` before concluding anything from a field that is not in the result.

输入参数ip必填

lookup_ips

Look up several IP addresses

Classify a list of addresses in one call, returning a map keyed by address so duplicates collapse and the order you passed them stops mattering. Pass the whole list rather than splitting it yourself: a long one is batched for you. Prefer this over repeated `lookup_ip` calls when you already have the list, for example when triaging a log file. An address that fails carries its error in place of a result rather than failing the batch. Always read `coverage.note` before concluding anything from a field that is not in the result.

输入参数ips必填

my_entitlement

Plan and usage for this key

What this API key is entitled to and how much of it has been used: the plan, the field tier that decides how much of a lookup answer comes back, the requests counted so far, the allowance, and when it resets. Use it to explain why a field is missing from a lookup, or before a large batch. Usage counts against the anniversary of the subscription rather than the calendar month, and can lag a few seconds behind. A null `hard_limit` means we never stop serving - it is NOT a limit of zero.

无需输入参数。

list_databases

List databases

The 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 the license names, and a `versions` array whose `id` is what the other database tools take - pass `versions[].id` (`cdn_ip_v1`), never the `base` (`cdn_ip`). Ask again rather than holding on to this: it is answered per key and is not the same for everyone.

无需输入参数。

database_metadata

Describe a database

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.

输入参数dataset_id必填

database_checksum

Get a database's checksums

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`.

输入参数format必填dataset_id必填

list_downloads

List recent download attempts

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.

输入参数limit

版本历史

8
  1. v6.2.6最新Nov 5, 2026
  2. v6.2.5Nov 4, 2026
  3. v6.2.4Nov 3, 2026
  4. v6.2.2Oct 30, 2026
  5. v6.2.1Oct 26, 2026
  6. v6.2.0Oct 20, 2026
  7. v6.1.4Oct 19, 2026
  8. v6.1.2Oct 19, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Vpndetection 集成