developer preview — apache 2.0

Your devices,
approved routes for
your agents.

freeproxy is an open-source, local-first proxy rota for AI agents. Run it on devices you own or administer, expose local HTTP/SOCKS5 and MCP interfaces, and route requests through explicit policy over a private mesh. Logs and configuration stay local unless you export them.

M5 backend complete tsnet mesh validated local logs by default
~/agents/research-bot — freeproxy live
$freeproxy up
admin dashboard 127.0.0.1:7776 http proxy 127.0.0.1:7777 socks5 proxy 127.0.0.1:7778 mesh provider tailscale tsnet policy route node_tags = ["mobile"]
agent>fetch https://api.ipify.org
selected node freeproxy-exit-sh5g tunnel event recorded host, bytes, duration
$

The open web was built on the principle that any user could reach any page.

Agents need network access, but the default choices are usually a shared cloud proxy or no policy at all.

Your devices already sit in trust zones you understand: home, office, mobile, lab, server.

freeproxy lets you expose those approved paths to your own agents with scoped keys, route policy, SSRF protections, and local observability.

The goal is not stealth or challenge bypass. It is user-owned routing with explicit controls.

/// freeproxy — a tool for the user-side of the agent web

Pool the connections you already have. Rotate them through a private mesh.

STEP 01 — install

Add nodes from anywhere you have internet.

Run the daemon on a laptop, a Raspberry Pi at home, a mini PC on mobile broadband, or a VPS you administer. Nodes join through tsnet today; Headscale and other transports are designed as follow-ons.

[home]─┐ ├─→ rota [phone]┘
STEP 02 — rotate

Requests are dispatched across nodes per a policy you control.

Round-robin. Sticky-by-domain. Least-loaded. Fastest. Deny. Tag nodes as home, work, mobile, or trusted and keep route decisions explicit.

round-robin ─── fastest sticky ─── least-loaded deny ─── tag-filter
registered node failed health probe removed / standby prototype diagram
STEP 03 — connect

Point your agent at a single endpoint.

HTTP/SOCKS5 proxy on localhost:7777, or speak MCP directly. Works with Claude Desktop, Cursor, Cline, custom Python — anything that can use a proxy or call a tool.

claude ─→ mcp ─→ rota ─→ web cursor ─┘ python ─┘
STEP 04 — observe

Inspect traffic without pretending to decrypt tunnels.

Tunnel rows show host, node, agent, bytes, duration, and error class. MCP fetch rows can include HTTP status because freeproxy performs that request directly. Logs stay local; exports are explicit.

[•] tunnel example.com:443 [•] fetch status=200 [!] route policy_denied

Nine guarantees. One binary.

/01

Open source. Self-hostable.

Apache 2.0. Audit the binary, fork the protocol, run the whole stack on your own metal. No mandatory cloud.

/02

Free as in freedom.

Not a freemium tier waiting to be metered. The right framing is civic, not commercial: your access, extended.

/03

Use the access you already pay for.

Your home fiber, lab box, mobile uplink, or VPS. Existing connections become explicitly tagged routes for your agents.

/04

Policy before traffic.

Every request is evaluated against your route table before a node is selected. Deny rules never dispatch.

/05

First-class MCP integration.

Native Model Context Protocol server. Current tools: fetch, choose_node, and list_nodes. Crawler/session tools stay gated for later releases.

/06

tsnet mesh foundation.

Tailscale tsnet is the default transport. Headscale is planned next; Cloudflare-style mesh is opt-in only because it changes metadata visibility.

/07

Your traffic stays yours.

No central proxy. No shared exit pool. No telemetry. Logs are local-first; export only if you say so.

/08

Multi-device by design.

One control plane, many trust zones. Tag nodes home, work, school, mobile and route by tag.

/09

Agent-first, not browser-first.

Designed for headless workloads: long-lived sessions, structured retries, deterministic IP selection, programmable from the agent side.

A dashboard that treats your nodes like infrastructure, not contacts.

freeproxy.local /dashboard ~admin
Overview

registered nodes · scoped keys · route policy · local traffic log

TRAFFIC EVENTS
local
SQLite, exportable CSV
AUTH
scoped
admin, proxy, MCP keys
MESH HEALTH
probed
node-agent /healthz
RETENTION
30d
configurable, purgeable
NODELOCATIONSTATUSP95 LATENCYLOADRPS
home-fiber SF, US · 1Gb healthy 142 ms
23/s
mobile-uplink SF, US · T-Mo healthy 98 ms
11/s
lab-wifi NYC, US degraded 412 ms
2/s
work-laptop NYC, US healthy 71 ms
14/s
spare-vps Miami, US offline
0/s
This is a product preview. The daemon now ships a compact embedded dashboard; this page mirrors the intended full UI direction. open dashboard

Enough detail to install it, run it, and know where the sharp edges are.

quickstart

Start local, then add keys.

The first key should usually be created with the CLI before leaving the daemon running.

curl -fsSL https://freeproxy.app/install.sh | sh
freeproxy keys create --label claude \
  --scopes proxy:use,mcp:fetch,mcp:list_nodes,mcp:choose_node
freeproxy up
routes

Route by host, method, and node tag.

Rules are evaluated top-to-bottom. Deny rules stop before dispatch; hostname rules require the proxy to see a hostname.

[[route]]
name = "research"
hosts = ["arxiv.org", "docs.python.org"]
strategy = "sticky-by-domain"
node_tags = ["home", "trusted"]

[[route]]
name = "blocked"
hosts = ["social.example"]
strategy = "deny"
self-hosting

One coordinator, many registered exits.

Joined nodes register through the coordinator admin API, then node-agent health checks decide whether they stay eligible for policy selection.

freeproxy join create \
  --label mobile-uplink \
  --tags mobile,trusted \
  --coord-admin-url http://100.x.y.z:7776

freeproxy join FP-....-....
security model

Local-first does not mean unauthenticated.

Admin, proxy, and MCP calls use scoped keys. Mesh dispatch uses a separate node-agent token. SSRF protections block loopback, private ranges, metadata IPs, and local names by default.

  • Traffic logs stay in local SQLite and export only on request.
  • CONNECT tunnel events do not claim upstream HTTP status.
  • MCP fetch records status because freeproxy performs the request.
current release

Developer preview surface.

M0 through M6 are implemented and verified. Current release artifacts are Linux amd64 tarball and deb; Docker scaffolding is present; macOS and Homebrew are planned.

freeproxy version
freeproxy status
freeproxy keys list
curl -H "Authorization: Bearer $FP_KEY" \
  http://127.0.0.1:7776/api/traffic?format=csv
install paths

Pick installer or package by deployment style.

The curl installer is for ad-hoc/dev use. For systemd-managed Linux hosts, use the deb so the service file and package layout match.

# ad-hoc
curl -fsSL https://freeproxy.app/install.sh | sh

# managed host
sudo dpkg -i freeproxy_*.deb

Speak MCP natively — or any HTTP/SOCKS5 client works.

/// example
{
  "mcpServers": {
    "freeproxy": {
      "command": "freeproxy",
      "args": ["mcp"],
      "env": {
        "FP_KEY": "fp_live_••••••••••••"
      }
    }
  }
}
// exposes tools: fetch, choose_node, list_nodes

One config. Three tools today. Room to grow.

Drop the snippet into Claude Desktop, Cursor, Cline, or any MCP-aware client. Your agent gets policy-aware fetches and node introspection without leaving your local control plane.

  • fetch — single request with route policyrecords status, bytes, duration, retries, node, and agent key
  • choose_node — explicit selectionby tag or name, using registered healthy nodes
  • list_nodes — introspect the rotaso the agent knows what is available
  • ·
    crawl — deferredsafety gate exists; tool remains disabled until a later release
  • ·
    authed_session — plannednot part of the current shipped MCP surface

fetch

Fetches one absolute HTTP or HTTPS URL through route policy, rate limits, SSRF protections, and the selected node.

{
  "url": "https://example.com",
  "method": "GET",
  "headers": { "accept": "text/html" }
}
Returns status_code, response headers, body text, bytes down, duration, retry count, and node id.

choose_node

Selects a registered node by name/id or by a required tag set, using the local node table.

{
  "tags": ["mobile", "trusted"]
}
Useful when an agent should decide whether a route is available before issuing a fetch.

list_nodes

Returns the coordinator's current view of registered nodes, tags, health, load score, and source.

{}
Agents can inspect available exits without receiving direct mesh credentials.

Install the local rota,
then add nodes deliberately.

$ curl -fsSL https://freeproxy.app/install.sh | sh
open dashboard view source current artifacts: linux/amd64 tarball + deb · docker scaffold · macOS/Homebrew planned
// freeproxy developer preview — built where the policy is explicit ©2026 — released to the commons