DataImpulse MCP Proxy
README.md
# DataImpulse MCP Proxy
Use DataImpulse residential proxy targeting from Claude Code or OpenCode without routing the rest of your system through a proxy. This educational MCP server provides bounded access to public HTTP(S) pages with best-effort SSRF safeguards.
> [!WARNING]
> Never configure `HTTP_PROXY` or `HTTPS_PROXY` globally. This server creates a DataImpulse `ProxyAgent` for each MCP request, so other terminals, editors, package managers, and MCP servers remain unaffected.
## Quick Start
**Prerequisites:** Node.js 22.19.0 or later and a DataImpulse account with a username and password.
```bash
git clone https://github.com/Gentleman-Programming/dataimpulse-mcp.git
cd dataimpulse-mcp
npm install
```
The server reads only `DI_USER` and `DI_PASS` at runtime. Copy `.env.example` for local reference if useful, but configure credentials in your MCP client rather than committing a `.env` file.
## Connect Clients
### Claude Code
Run this from the checked-out repository, replacing the placeholders and path:
```bash
claude mcp add di-proxy --scope user \
--env DI_USER=your_dataimpulse_username \
--env DI_PASS=your_dataimpulse_password \
-- node /absolute/path/to/dataimpulse-mcp/index.js
```
`--scope user` makes the server available to your local Claude Code user. Claude Code stores this configuration, including the supplied credentials, in `~/.claude.json`; protect that file and never commit or share it.
### OpenCode
Add this entry to your OpenCode configuration, replacing the placeholders and absolute path:
```json
{
"mcp": {
"di-proxy": {
"type": "local",
"command": ["node", "/absolute/path/to/dataimpulse-mcp/index.js"],
"environment": {
"DI_USER": "your_dataimpulse_username",
"DI_PASS": "your_dataimpulse_password"
}
}
}
}
```
Restart OpenCode after saving the configuration so it starts the stdio server with the new environment.
## Tool Reference
### `fetch_page`
Fetches a public HTTP(S) page through DataImpulse. By default, it returns cleaned, readable text; set `raw` to `true` when the caller needs HTML.
| Parameter | Required | Description |
| --- | --- | --- |
| `url` | Yes | Public HTTP(S) URL, up to 2,048 characters. URLs with credentials and local/private destinations are rejected. |
| `country` | No | Two-letter ISO country code, such as `US` or `ES`. |
| `city` | No | City token using letters, numbers, hyphens, or underscores. Requires `country`. |
| `session` | No | Stable session token using letters, numbers, hyphens, or underscores. |
| `raw` | No | Set to `true` to return HTML instead of cleaned text. |
```json
{
"url": "https://example.com",
"country": "US",
"session": "research-001"
}
```
```json
{
"url": "https://example.com",
"country": "ES",
"city": "Madrid",
"raw": true
}
```
### `check_exit_ip`
Checks the public exit IP selected by DataImpulse without fetching a target page. Use it to verify country or session targeting before a workflow.
| Parameter | Required | Description |
| --- | --- | --- |
| `country` | No | Two-letter ISO country code. |
| `session` | No | Session token to check a stable route. |
```json
{
"country": "US",
"session": "research-001"
}
```
## Targeting And Errors
**Targeting practices**
- Use an explicit `country` for geo-specific content.
- Reuse the same `session` across multi-step flows that need a consistent route.
- Use `city` only when necessary: DataImpulse charges city targeting at double the normal rate.
- Avoid blind retries. Change one variable, observe the result, and stop when the target rejects the request.
**Error actions**
| Response | Meaning | Action |
| --- | --- | --- |
| `407 TRAFFIC_EXHAUSTED` | DataImpulse traffic credit is exhausted. | Add traffic credit, then retry. |
| `407 THREADS_EXHAUSTED` | The account has more than 2,000 active connections. | Reduce concurrent requests, then retry. |
| `503 NO_RAY` | No proxy IP matches the requested targeting. | Remove city targeting and retain only the country. |
| `403` | The destination blocked the request. | Try another country or a fixed session once; respect the site's rules. |
| `429` | The destination applied rate limiting or anti-bot controls. | Try one new session or another country once. If it persists, access the target site directly or use another search engine. Do not retry blindly. |
## Security Model
- **Best-effort SSRF safeguards:** every initial URL and redirect target is checked for an HTTP(S) scheme, no credentials, a permitted hostname, and public-only local DNS resolution. Local, private, metadata, credentialed, and mixed-resolution hosts are rejected, with a maximum of 10 redirects.
- **Remote proxy resolution:** `ProxyAgent` sends the hostname to the remote proxy, which performs its own DNS resolution. DNS rebinding or split-horizon DNS can therefore differ from local validation. Do not use this tool with untrusted URLs in high-security environments; if exposing it to untrusted users, prefer a domain allowlist.
- **Credentials:** `DI_USER` and `DI_PASS` are read only at startup and are never logged or returned to MCP clients.
- **Response bounds:** bodies with an advertised `Content-Length` above 1,048,576 bytes (1 MiB) are rejected before reading; streaming bodies are cancelled once they exceed that limit. Successful and error output is then limited to 60,000 characters.
- **Timeout:** every request has a 45-second timeout; each per-request proxy agent is destroyed after use.
## License
This project is licensed under the [MIT License](LICENSE).
TDQS
B3.3/5.0
Scored across 2 tools
Disambiguation5/5
The two tools have completely distinct purposes: one fetches a page through the proxy, the other reports the proxy's exit IP. There is no overlap or ambiguity between them.
Naming Consistency5/5
Both tool names follow a consistent verb_noun pattern: 'fetch_page' and 'check_exit_ip'. This makes the API predictable and easy to learn.
Tool Count3/5
With only 2 tools, the server feels slightly thin for a typical MCP server, but the scope is narrow and focused on basic proxy operations. The count is borderline but not excessive.
Completeness4/5
The server covers the essential proxy workflow: fetching a page and verifying the proxy IP. Minor gaps exist, such as no session management or request customization, but the core purpose is adequately served.
Maintenance
ActivitySlowing
ResponsivenessNo issues