IPinfo MCP server for AI agents

Live

BEARER TOKEN

IP INTELLIGENCE

Developer Tools

IPinfo gives your agent IP intelligence: look up geolocation and network details for an IP, detect VPNs, proxies, and Tor, identify the company or carrier behind an address, and run batch lookups.

  • Per-user credentials: each call uses the actual user's access token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
IPinfo
agent · Acme Q3
Run
Is 185.220.101.4 a VPN or a Tor exit node?
S
ipinfo_get_privacy
74ms
Security agent
185.220.101.4 is flagged as a Tor exit node and as hosting. It is not flagged as a VPN.
Sources: IPinfo privacy detection
ipinfo
1 IP
18:29
Message Claude...

Tools your security agent reaches for on IPinfo, scoped per user.

CALL ANY TOOL
13 tools for IP intelligence on IPinfo: look up geolocation and ASN details, detect VPNs, proxies, and residential proxies, find companies, carriers, and abuse contacts, and batch up to 1,000 lookups.
ipinfo_batch_lookup
Batch lookup
Look up as many as 1,000 IP addresses or IPinfo lookup paths in one request. Returns one JSON object keyed by each input string, whose value is that lookup's result: a full record, a sub-object such as geo or anonymous, or a single value such as a country name. Use this instead of repeated single lookups. Choose the endpoint that matches the token: batch (Core, Plus or Max), batch/lite (free tokens) or batch/legacy (older plans and Privacy Extended data). Entries can also be paths like 8.8.8.8/geo, lite/8.8.8.8/country, AS15169, ranges/nytimes.com, domains/1.1.1.1 or resproxy/1.1.1.1, each billed as one request.
Parameters
Name
Type
Required
Description
ips
array
Required
The IP addresses or IPinfo lookup paths to resolve, 1 to 1,000 entries. A bare address uses the endpoint's default lookup. A path adds a field or another API: 8.8.8.8/geo, 8.8.8.8/as/asn, lite/8.8.8.8/country_code, AS15169, ranges/nytimes.com, domains/1.1.1.1, resproxy/1.1.1.1, places/65.144.40.106. Every entry must contain an IP address or an ASN (or be a ranges/<domain> lookup); entries such as "me", "lite/me" or a bare field name like "city" are rejected, because IPinfo would describe the Scalekit server's own address. Example: ["8.8.8.8", "1.1.1.1/geo", "AS15169"]
endpoint
string
Optional
Which batch endpoint to call. batch (default) runs bare addresses through the Core, Plus or Max lookup and needs a paid token. batch/lite runs them through the free Lite API, so use it with a free token. batch/legacy uses the older ipinfo.io response shape and is the only one that returns Privacy Extended fields. Example: batch/lite. One of: `batch`, `batch/lite`, `batch/legacy`. Default: `batch`.
filter
integer
Optional
Set to 1 to drop entries that have no result (null) from the response, for example addresses with no hostname. Leave empty to keep every entry. Example: 1. One of: `1`.
ipinfo_get_abuse_contact
Get abuse contact
ipinfo_get_asn
Get asn
ipinfo_get_carrier
Get carrier
ipinfo_get_company
Get company
ipinfo_get_ip_ranges
Get ip ranges
ipinfo_get_place
Get place
ipinfo_get_privacy
Get privacy
ipinfo_get_residential_proxy
Get residential proxy
ipinfo_get_token_info
Get token info
ipinfo_list_hosted_domains
List hosted domains
ipinfo_lookup_ip
Lookup ip
ipinfo_lookup_ip_lite
Lookup ip lite
Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// IPinfo tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ipinfo"], toolNames: [
    "ipinfo_lookup_ip",
    "ipinfo_get_privacy",
    "ipinfo_batch_lookup"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Check whether 185.220.101.4 is a VPN or Tor exit node" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ipinfo"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Check whether 185.220.101.4 is a VPN or Tor exit node" }],
  tools,
});

// Execute the tool call with the user's vaulted IPinfo access token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ipinfo"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Check whether 185.220.101.4 is a VPN or Tor exit node" }],
  tools,
});

// Tool call runs with the user's vaulted IPinfo access token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ipinfo"] }, pageSize: 100,
});

const agent = new Agent({
  name: "security_agent",
  model: "gemini-2.5-pro",
  instruction: "IPinfo tools scoped to this user",
  tools,
});

await agent.run("Check whether 185.220.101.4 is a VPN or Tor exit node");
Try these prompts
Copy any prompt into your agent. Each maps directly to a IPinfo tool. Click to copy, paste into your agent, done.
Lookups
Copy the prompt
Copied
Where is 8.8.8.8 located and which ASN owns it?
Copy the prompt
Copied
Look up these 200 IPs from our signup log in one batch.
Copy the prompt
Copied
Which country and ASN is 203.0.113.7 in, using the Lite API?
Risk signals
Copy the prompt
Copied
Is 185.220.101.4 a VPN, proxy, or Tor exit node?
Copy the prompt
Copied
Has 198.51.100.23 been seen in a residential proxy network?
Copy the prompt
Copied
Who is the abuse contact for 45.33.32.156?
Networks and companies
Copy the prompt
Copied
Which company operates 104.16.0.1?
Copy the prompt
Copied
List the IP ranges assigned to stripe.com.
Copy the prompt
Copied
Show details for AS13335.
SEE HOW AUTH WORKS
Each user connects their own IPinfo access token once, and Scalekit sends it with every call. Tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
IPinfo
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
IPinfo
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
IPinfo
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
IPinfo
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other developer tools and analytics connectors.
Engineering Teams
DevOps assistant agent
Polls GitHub for failing checks and stale PRs, opens Linear issues for the ones that need work, and posts a daily digest to Slack. It acts as the engineer, not a shared service account.
Test other agents
See the same per-user auth pattern across other developer tools and analytics connectors.
ENGINEERING
DevOps assistant agent
Poll GitHub for failing checks and stale pull requests, open Linear issues for the ones that need work, and digest to Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared IPinfo access token looks fine in a demo. In production every IP lookup looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
IPinfo today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access IPinfo as the user or through a shared access token?
As the user. Each user connects their own IPinfo access token once, and Scalekit sends it with every call. Every lookup the agent runs is attributed to that user in your audit trail, not a shared service account.
Where is the IPinfo access token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new access token. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in IPinfo?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example only ipinfo_lookup_ip_lite and ipinfo_get_privacy for a signup risk check. None of the 13 tools changes data in IPinfo; ipinfo_batch_lookup runs many lookups in one request. Scalekit also enforces scope checks before every API call.
What happens when a user revokes IPinfo access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
How does the agent check its IPinfo request limits?
ipinfo_get_token_info returns the connected token's daily and monthly request counts, the remaining limit, and which IPinfo APIs it can access. Check it before a large ipinfo_batch_lookup, which takes up to 1,000 IPs or lookup paths in one request.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""ipinfo"": {
""url"": ""https://mcp.scalekit.com/ipinfo"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.ipinfo]
url = ""https://mcp.scalekit.com/ipinfo""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""ipinfo"": {
""url"": ""https://mcp.scalekit.com/ipinfo"",
""type"": ""http""
}
}
}