Skip to main content
Glama
README.md
# AtlasForge-WebProxy

Self-hosted web search/fetch proxy plus stdio MCP server for AI agents. It
provides Brave-backed search, page fetch with retries and browser-like
user-agent fallback, old.reddit hardening, response caching, paper PDF fetch,
image search/download, and SSRF guards.

## Quickstart

```bash
./install.sh
mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/atlasforge-webproxy"
$EDITOR "${XDG_CONFIG_HOME:-$HOME/.config}/atlasforge-webproxy/config.env"
chmod 600 "${XDG_CONFIG_HOME:-$HOME/.config}/atlasforge-webproxy/config.env"
```

Set `BRAVE_API_KEY` in that file. Get a key at
`https://brave.com/search/api/`. Without a key, the proxy falls back to DDG/DDGS
where available.

Run directly:

```bash
.venv/bin/python -m atlasforge_webproxy.service --host 127.0.0.1 --port 8765
curl http://127.0.0.1:8765/health
```

Wire MCP into a client:

```json
{
  "mcpServers": {
    "atlasforge-web-proxy": {
      "command": "/path/to/AtlasForge-WebProxy/.venv/bin/python",
      "args": ["-m", "atlasforge_webproxy.mcp_server"],
      "env": {}
    }
  }
}
```

## Config

Priority: environment variables, then
`${XDG_CONFIG_HOME:-~/.config}/atlasforge-webproxy/config.env`, then defaults.
For migration, `~/.config/atlasforge/web-proxy.env` is read only when the new
file does not exist, and a deprecation warning is logged.

| Setting | Default | Purpose |
| --- | --- | --- |
| `BRAVE_API_KEY` | empty | Brave Search API key. |
| `ATLASFORGE_WEB_PROXY_HOST` | `127.0.0.1` | Flask bind host. |
| `ATLASFORGE_WEB_PROXY_PORT` | `8765` | Flask bind port. |
| `ATLASFORGE_WEB_PROXY_URL` | host/port above | MCP/client target URL. |
| `ATLASFORGE_WEB_PROXY_CACHE_DIR` | XDG cache | Search/fetch/image cache. |
| `ATLASFORGE_WEB_PROXY_PAPER_DIR` | XDG cache | Paper PDF/text artifacts. |
| `ATLASFORGE_WEB_PROXY_PROVIDER` | `auto` | `auto`, `brave`, `duckduckgo`, or `ddgs`. |
| `ATLASFORGE_WEB_PROXY_TIMEOUT_S` | `20` | Service outbound timeout. |
| `ATLASFORGE_WEB_PROXY_CLIENT_TIMEOUT_S` | `30` | Python client timeout. |
| `ATLASFORGE_WEB_PROXY_MCP_TIMEOUT_S` | `30` | MCP-to-service timeout. |
| `ATLASFORGE_WEB_PROXY_SEARCH_TTL_S` | `1800` | Search cache TTL. |
| `ATLASFORGE_WEB_PROXY_FETCH_TTL_S` | `86400` | Page fetch cache TTL. |
| `ATLASFORGE_WEB_PROXY_PAPER_TTL_S` | `604800` | Paper fetch cache TTL. |
| `ATLASFORGE_WEB_PROXY_RETRY_ATTEMPTS` | `3` | Fetch retry attempts. |
| `ATLASFORGE_WEB_PROXY_RETRY_BASE_S` | `0.5` | Retry base delay. |
| `ATLASFORGE_WEB_PROXY_RETRY_AFTER_MAX_S` | `60` | Max `Retry-After` delay. |
| `ATLASFORGE_WEB_PROXY_RETRY_JITTER` | `1` | Enable retry jitter. |
| `ATLASFORGE_WEB_PROXY_UA_RETRY_ON_403` | `1` | Retry 403 with browser UA. |
| `ATLASFORGE_WEB_PROXY_REDDIT_OLD_FALLBACK` | `1` | Try old.reddit fallback. |
| `WEB_PROXY_ALLOW_DNS_FAIL` | `0` | Legacy DNS fail-open mode. |
| `ATLASFORGE_WEB_PROXY_ENABLE_INVESTIGATION_CAPTURE` | `0` | Optional AtlasForge JSON mirroring. |
| `ATLASFORGE_WEB_PROXY_ENABLE_ATLASFORGE_TOOLS` | `0` | Optional AtlasForge stage tools. |

See `config.env.example` for the full list, including user-agent and size-limit
knobs.

## systemd

`./install.sh` creates `.venv`, installs the package, copies
`config.env.example` if no config exists, installs
`~/.config/systemd/user/atlasforge-webproxy.service`, and runs
`systemctl --user daemon-reload`.

It does not enable or start the service unless passed `--start`:

```bash
./install.sh --start
systemctl --user status atlasforge-webproxy.service
```

## Tests

```bash
.venv/bin/python -m pip install -e ".[test]"
.venv/bin/python -m pytest
```

Use an unused non-8765 port for live smoke tests:

```bash
ATLASFORGE_WEB_PROXY_PORT=8799 .venv/bin/python -m atlasforge_webproxy.service --port 8799
```

TDQS

A4.2/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a distinct purpose: image search, paper download, generic URL fetch, web search, and combined search+fetch. Clear boundaries prevent confusion.

Naming Consistency5/5

All names follow a consistent pattern: noun (Image, Paper, Web) + action verb (Search, Fetch, Research). No mixing of styles.

Tool Count5/5

5 tools is well-scoped for a web proxy. Each tool covers a specific need without redundancy or overwhelming number.

Completeness4/5

Core operations (search, fetch, image search, paper download, combined research) are present. Minor gap: no dedicated video search or social media extraction, but reasonable for general web access.

Maintenance

ActivityStale
ResponsivenessNo issues