Skip to main content
Glama
eweley95

mcp-ip2location

by eweley95
README.md
# mcp-ip2location

**Give your AI assistant a sense of place.**

An [MCP](https://modelcontextprotocol.io) (Model Context Protocol) server
that lets Claude Desktop, Claude Code, or any MCP-compatible client perform
IP geolocation, proxy detection, and domain WHOIS lookups natively — powered
by [IP2Location.io](https://www.ip2location.io) and
[IP2WHOIS](https://www.ip2whois.com).

Once connected, you can simply ask your assistant things like:

> *"Where are these 5 IPs from my nginx log located, and are any of them proxies?"*
> *"How old is the domain in this suspicious invoice email?"*
> *"Which of these login IPs are outside Malaysia?"*

…and it answers with real data instead of guessing.

## Tools provided

| Tool | What it does |
|---|---|
| `ip_geolocation` | Country, region, city, coordinates, timezone, ASN for one IP (plus ISP, usage type, mobile carrier and more on paid plans) |
| `proxy_check` | Is this IP a known proxy/VPN/anonymizer? |
| `whois_lookup` | Domain age, registrar, expiry, nameservers, registrant |
| `bulk_geolocate` | Up to 50 IPs in one request — ideal for pasted log excerpts |
| `hosted_domains` | Reverse-IP lookup: list domains hosted on a given IP |

## Setup

```bash
git clone https://github.com/eweley95/mcp-ip2location
cd mcp-ip2location
npm install
npm run build
```

Get a free API key at <https://www.ip2location.io> (50,000 IP queries +
500 WHOIS queries per month — the same key covers both).

### Add to Claude Desktop

The easiest and most reliable way to find the config file is from inside the
app: open **Settings → Developer → Edit Config**. This opens the correct
`claude_desktop_config.json` (creating it if needed), wherever your install
keeps it — you don't have to hunt for the path.

If you'd rather open it manually, the location depends on how Claude Desktop
was installed:

- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows (installer / .exe version):**
  `%APPDATA%\Claude\claude_desktop_config.json`
  (i.e. `C:\Users\<you>\AppData\Roaming\Claude\`)
- **Windows (Microsoft Store version):** the file lives under the packaged
  app data instead, e.g.
  `C:\Users\<you>\AppData\Local\Packages\Claude_<id>\LocalCache\Roaming\Claude\claude_desktop_config.json`
  The `Claude_<id>` folder name varies per machine — using **Edit Config**
  avoids having to find it.

Add the `mcpServers` block to that file. If the file already has other keys
or other servers, merge this entry in rather than overwriting it:

```json
{
  "mcpServers": {
    "ip2location": {
      "command": "node",
      "args": ["C:\\path\\to\\mcp-ip2location\\dist\\index.js"],
      "env": { "IP2LOCATION_API_KEY": "YOUR_KEY" }
    }
  }
}
```

> **Before saving, replace the two placeholders with your own values:**
> 1. `C:\\path\\to\\mcp-ip2location\\dist\\index.js` → the **full absolute
>    path** to `dist\index.js` in the folder where you cloned this project
>    (e.g. `C:\\src\\IP2\\mcp-ip2location\\dist\\index.js`). Keep the doubled
>    backslashes.
> 2. `YOUR_KEY` → your real IP2Location.io API key from your account
>    dashboard.
>
> The server won't start until both are correct.

Notes for Windows:

- Use the **full absolute path** to `dist\index.js` and **double the
  backslashes** (`\\`) — JSON treats a single `\` as an escape character.
- Run `npm install` and `npm run build` first, so `dist\index.js` actually
  exists before you point at it.
- A stray comma or missing brace will silently stop all servers from
  loading, so validate the JSON if the tools don't appear.

Then **fully quit** Claude Desktop (right-click the system-tray icon → Quit,
not just closing the window) and reopen it. The five tools appear
automatically. Try it with: *"Where is the IP 8.8.8.8 located?"*

### Works with other MCP clients

MCP is an open standard (governed by the Linux Foundation), so this server
isn't tied to Claude — the same `dist/index.js` works with any MCP-compatible
host. Common ones include **Claude Desktop & Claude Code, OpenAI ChatGPT,
Google Gemini, GitHub Copilot / VS Code, Cursor, Windsurf, Zed**, and local
runners like **Ollama** and **LM Studio**.

The server definition is the same everywhere (`command`, `args`, `env`) — only
*where* you register it differs per app. A few examples:

**Cursor** — create `.cursor/mcp.json` in your project (or the global
`~/.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "ip2location": {
      "command": "node",
      "args": ["C:\\path\\to\\mcp-ip2location\\dist\\index.js"],
      "env": { "IP2LOCATION_API_KEY": "YOUR_KEY" }
    }
  }
}
```

**VS Code (Copilot / Agent mode)** — add to `.vscode/mcp.json`:

```json
{
  "servers": {
    "ip2location": {
      "command": "node",
      "args": ["C:\\path\\to\\mcp-ip2location\\dist\\index.js"],
      "env": { "IP2LOCATION_API_KEY": "YOUR_KEY" }
    }
  }
}
```

**Claude Code** (CLI):

```bash
claude mcp add ip2location \
  --env IP2LOCATION_API_KEY=YOUR_KEY \
  -- node /absolute/path/to/mcp-ip2location/dist/index.js
```

For other hosts (ChatGPT, Gemini, Ollama, LM Studio, etc.), consult that
app's "MCP servers" or "connectors" settings and supply the same three values.
Remember to replace the path and `YOUR_KEY` in every case.

## Examples

Once connected, just ask in plain language — Claude picks the right tool.
Here is one example per tool:

**`ip_geolocation`** — where is a single IP?

```
You:    Where is the IP 8.8.8.8 located?
Claude: [calls ip_geolocation]
        8.8.8.8 is in Mountain View, California, United States (AS15169,
        Google LLC). Not flagged as a proxy.
```

**`proxy_check`** — can I trust this IP?

```
You:    Is 185.220.101.45 a proxy or VPN?
Claude: [calls proxy_check]
        Yes — 185.220.101.45 is flagged as a proxy/VPN/anonymizer. It's in
        Germany on AS60729, a range well known for Tor exit nodes.
```

**`whois_lookup`** — how old / trustworthy is a domain?

```
You:    How old is the domain example.com?
Claude: [calls whois_lookup]
        example.com was first registered on 1995-08-14 (about 30 years ago),
        last updated 2024-08-14, and expires 2025-08-13. Registrar: RESERVED
        — Internet Assigned Numbers Authority. A long-established domain.
```

**`bulk_geolocate`** — analyse a list of IPs at once

```
You:    Where are these from, and any proxies?
        185.220.101.45, 8.8.8.8, 175.139.142.25
Claude: [calls bulk_geolocate]
        185.220.101.45 — Germany, AS60729 — flagged as proxy (Tor range)
        8.8.8.8        — United States, Google LLC — not flagged
        175.139.142.25 — Malaysia, TM Net — not flagged
```

**`hosted_domains`** — what else is on this server? (reverse IP)

```
You:    What domains are hosted on the IP 104.26.10.78?
Claude: [calls hosted_domains]
        That IP hosts 1,240 domains across 25 pages (it's a shared
        Cloudflare address). The first page includes example1.com,
        example2.net, ... — want me to pull a specific page?
```

> The exact values above are illustrative; live results depend on current
> data and your plan's detail level.

## Notes

- The server speaks MCP over **stdio**; no port is opened.
- **Plan-dependent fields.** The free plan returns country, region, city,
  coordinates, timezone, ASN and the `is_proxy` flag. Richer fields (ISP,
  domain, usage type, mobile carrier, elevation, detailed proxy typing, etc.)
  are returned only on paid IP2Location.io plans — `ip_geolocation` includes
  them automatically when your plan provides them, and omits them otherwise.
- `bulk_geolocate` uses the dedicated bulk endpoint (one request for all IPs)
  and falls back to per-IP lookups if that endpoint isn't on your plan.
- Errors (invalid IP, quota exceeded) are returned to the assistant as tool
  errors so it can explain them to you rather than failing silently.

## License

MIT

TDQS

A4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: single IP geolocation, bulk geolocation, proxy detection, domain WHOIS, and reverse IP lookup. The overlap between ip_geolocation and bulk_geolocate is resolved by the batch vs. single distinction, so no ambiguity exists.

Naming Consistency2/5

Tool names follow mixed conventions: 'ip_geolocation' is a noun phrase, 'proxy_check' and 'whois_lookup' are object-verb, 'bulk_geolocate' is modifier-verb, and 'hosted_domains' is a noun phrase. There is no consistent verb_noun or resource_action pattern, making the naming unpredictable.

Tool Count5/5

With 5 tools, the server is well-scoped for an IP intelligence service. Each tool provides a distinct and necessary capability without unnecessary redundancy, and the count is within the ideal 3-15 range.

Completeness4/5

The tool surface covers the primary IP lookup domain: geolocation, proxy detection, bulk geolocation, WHOIS for domains, and reverse IP. Minor gaps exist, such as no direct domain-to-IP resolution or standalone ASN lookup, but these can be worked around with existing tools.

Maintenance

ActivityInactive
ResponsivenessNo issues