SatGate
Observe, control and admit AI agent traffic
Every allow or deny comes with a signed receipt
Why •
Build •
Features •
Quick Start •
Docs •
Website •
Blog
---
SatGate is a gateway in front of APIs and MCP tools. It meters agent and MCP traffic (**Observe**), enforces owner budgets before work runs (**Control**), and charges external agents on the routes you choose (**Admit**; the Charge policy in the dashboard). Every allow or deny comes with a signed receipt.
Try it as an agent. This hosted route returns HTTP 402 with a Lightning invoice and a macaroon. The price is 10 sats, and one payment buys access until the `credential_expires_at` time in that response, not just one request:
```bash
curl -i -H "X-SatGate-Tenant: satgate-demo" https://api.satgate.io/paid/agent-demo
```
Agent instructions are in [llms.txt](https://satgate.io/llms.txt).
## Build Agents with SatGate
SatGate's developer primitive is three calls: `issue()`, `pay()`, and `verify()`.
```python
import os
from satgate import SatGate
satgate = SatGate(api_key=os.getenv("SATGATE_API_KEY"))
capability = satgate.issue(
task="research market prices",
agent="research-agent",
allow=["mcp:web.search", "api:prices.read"],
budget_usd=25,
expires_in="1h",
)
receipt = satgate.pay(
upstream="https://api.example.com/search",
capability=capability,
max_usd=4.20,
)
verified = satgate.verify(receipt)
print(verified.decision, verified.evidence_pack_id)
```
Install today:
```bash
pip install satgate
npm install @satgate/sdk
```
The public packages install today; the `issue/pay/verify` API namespace is in private beta. Calls without private-beta access raise a structured error instead of returning fake receipts:
```text
SatGateAuthError: This API namespace requires private beta access. Visit cloud.satgate.io/docs to request access.
```
Runnable examples:
- `examples/python/issue_pay_verify.py`
- `examples/node/issue-pay-verify.mjs`
Works with: MCP · OpenAI tools · Anthropic tools · LangChain · CrewAI · Raw HTTP
---
### 🎬 See SatGate in Action
---
### ☁️ Don't want to self-host? Try SatGate Cloud
**Managed SaaS — zero setup, multi-tenant isolation, enterprise dashboard.**
Free Observe tier. No credit card required.
---
## The Problem
AI agents are making API calls autonomously. They spawn sub-agents, call MCP tools, and run overnight while you sleep.
Your existing stack answers: *"Is this request authenticated?"*
Nobody answers: **"Should this agent have authority to spend, delegate, or invoke this paid resource?"**
```
✓ Network Firewall → "Can this packet enter?"
✓ Application Firewall → "Is this request safe?"
? Economic Firewall → "Should this agent act, spend, or pay?"
```
That's the gap. SatGate fills it.
## What is SatGate?
SatGate is an **Economic Firewall** for AI agent requests. Drop it in front of your APIs and MCP tools to enforce scoped authority, budgets, paid-rail context, and Evidence Pack receipts before agents act.
**Not another routing layer.** Routing gateways (Bifrost, LiteLLM, Portkey) optimize *which provider* handles a call. SatGate governs *whether the call should happen at all* based on authority, policy, budget, and paid-rail context.
Use them together:
```
Agent → SatGate (economic governance) → Routing Gateway → LLM Providers
```
## Features
- 🛡️ **Capability Tokens (Macaroons)** — Cryptographic credentials with built-in caveats, delegation, and next-request revocation. Not API keys — tokens that agents can safely sub-delegate.
- 🎯 **MCP-Aware** — Parses MCP JSON-RPC tool calls. Know that Agent X spent $47 on `search_database` and $12 on `send_email` — not just "1,000 requests."
- 💰 **Budget Enforcement** — Hard stops per agent, team, or API. When the budget hits zero, requests are *blocked*. Not logged. Not alerted. Blocked.
- ⚡ **Paid-Rail Governance** — Govern paid API access across L402, x402, API-key billing, and enterprise ledgers without making any one rail the control plane.
- 🔒 **Default-Deny** — All routes require valid credentials unless explicitly public. Zero Trust by design.
- 🚀 **<50ms Overhead** — Lightweight Go proxy. Adds governance without adding latency.
- 📦 **Self-Hosted** — Your infrastructure, your rules. Single binary, Docker, or Kubernetes.
- 🔌 **Drop-in** — Works with any HTTP backend. REST, GraphQL, MCP servers. No code changes.
## Quick Start
### 60-Second Demo
```bash
# Run from a clone. The example config is examples/gateway.yaml in this repo.
# macOS Apple Silicon. Other v0.5.2 assets: satgate-darwin-amd64, satgate-linux-amd64,
# satgate-linux-arm64, satgate-windows-amd64.exe
git clone https://github.com/SatGate-io/satgate.git
cd satgate
curl -L https://github.com/SatGate-io/satgate/releases/download/v0.5.2/satgate-darwin-arm64 -o satgate
chmod +x satgate
# Mock Lightning. Demo mode prints:
# SECURITY WARNING: Using ephemeral root key. Set CAPABILITY_ROOT_KEY for production use.
# That warning is expected. Tokens do not persist across restarts.
export ADMIN_TOKEN=my-secret-token
export LIGHTNING_BACKEND=mock
./satgate --config examples/gateway.yaml
```
**Try the three policies:**
```bash
# 1. Public — no auth needed
curl http://localhost:8080/health
# 2. Protected — mint a capability token, then use it
curl -X POST http://localhost:8080/api/capability/mint \
-H "X-Admin-Token: my-secret-token" \
-H "Content-Type: application/json" \
-d '{"scope": "api:read", "duration": "1h"}'
# Use the token:
curl -H "Authorization: Bearer YOUR_CAPABILITY_TOKEN" \
http://localhost:8080/api/capability/ping
# 3. Paid — get a payment challenge (L402 today; x402/other rails as governed context)
curl http://localhost:8080/api/micro
```
Public → Protected → Paid. Three policies, one gateway; paid rails are governed context, not the product boundary.
Hosted paid demo (Admit; Charge in the dashboard). No local Lightning node:
```bash
curl -i -H "X-SatGate-Tenant: satgate-demo" https://api.satgate.io/paid/agent-demo
```
Unpaid calls return 402 with a Lightning invoice and a macaroon. The price is 10 sats, and one payment buys access until the `credential_expires_at` time in that response, not just one request. For Lightning, show the invoice to the owner, poll payment status, then retry. Poll rules are in [llms.txt](https://satgate.io/llms.txt).
📖 **[Full Quick Start Guide →](docs/getting-started/quickstart.md)**
### Other Install Methods
```bash
# Release binary. ghcr.io/satgate-io/satgate:latest is private; anonymous pulls get 401.
# Assets: satgate-darwin-arm64, satgate-darwin-amd64, satgate-linux-amd64,
# satgate-linux-arm64, satgate-windows-amd64.exe
curl -L https://github.com/SatGate-io/satgate/releases/download/v0.5.2/satgate-darwin-arm64 -o satgate
chmod +x satgate
# Build from source
git clone https://github.com/SatGate-io/satgate.git
cd satgate && go build -o satgate ./cmd/satgate
```
## Configuration
```yaml
version: 1
server:
listen: ":8080"
admin:
capabilityRootKey: "${CAPABILITY_ROOT_KEY}"
lightning:
provider: "${LIGHTNING_BACKEND}"
config:
connectionString: "${NWC_CONNECTION_STRING}"
upstreams:
api:
url: "http://localhost:3000"
routes:
- name: public-health
match:
pathPrefix: /health
upstream: api
policy:
kind: public
- name: protected-api
match:
pathPrefix: /api/
upstream: api
policy:
kind: capability
scope: "api:read"
- name: premium-api
match:
pathPrefix: /premium/
upstream: api
policy:
kind: l402 # paid-rail policy; use payment_context to preserve L402/x402/ledger evidence
priceSats: 100
```
## Policy Types
| Policy | Description | Use Case |
|--------|-------------|----------|
| `public` | No authentication | Health checks, docs, webhooks |
| `capability` | Requires valid Macaroon | Protected API endpoints |
| `l402` | Requires Lightning payment and records paid-rail context | Monetized endpoints; x402/ledger context can be preserved in Evidence Packs |
## How It's Different
| | SatGate | Routing Gateways | Traditional API Gateways |
|---|---|---|---|
| **Primary concern** | Economic governance | Provider routing | Traffic management |
| **Budget enforcement** | Hard caps (blocked at limit) | Soft alerts only | ❌ |
| **MCP cost attribution** | Per-tool granularity | ❌ | ❌ |
| **Credential model** | Macaroons (delegatable) | API keys | API keys / OAuth |
| **Agent delegation** | Sub-tokens with reduced budgets | ❌ | ❌ |
| **Paid-rail governance** | L402, x402, API-key billing, enterprise ledgers | ❌ | ❌ |
| **Works alongside** | — | ✅ Use together | ✅ Use together |
## Architecture
```
┌──────────────────────────────────────────────────┐
│ SatGate │
│ │
│ Request → Route Match → Policy Check → Proxy │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ │ │ │ │
│ [public] [capability] [paid rail] │
│ pass verify token verify │
│ check budget payment │
│ log MCP tool context │
└──────────────────────────────────────────────────┘
```
**Key Concepts:**
- **Macaroons**: Bearer tokens with embedded caveats (expiry, scope, budget, IP). Not API keys — they support *delegation* without server roundtrips.
- **Delegation**: Agent A gives Agent B a sub-token with reduced permissions and a $50 budget cap. B can't escalate.
- **MCP Parsing**: SatGate reads MCP JSON-RPC payloads to attribute costs to specific tool calls, not just HTTP endpoints.
- **Paid-rail context**: SatGate treats L402, x402, API-key billing, and enterprise ledgers as rails to govern around. Evidence Packs preserve which rail was involved without making the rail the product.
## SDKs
| Language | Package | Docs |
|----------|---------|------|
| Python | `pip install satgate` | [README](sdk/python/README.md) |
| JavaScript | `npm install @satgate/sdk` | [README](sdk/nodejs/README.md) |
## MCP Proxy (NEW)
SatGate now includes a native **MCP proxy** that governs tool calls for any MCP-compatible agent:
```bash
# Run MCP proxy with 1000-credit budget
satgate-mcp --config satgate-mcp.yaml
```
- **Budget enforcement**: Hard 402 when agents exhaust their allocation
- **Delegation**: Parent agents mint sub-agent tokens with carved budgets
- **Per-tool costs**: `web_search: 5`, `dalle_generate: 50` (wildcard patterns supported)
- **Two transports**: stdio (local sidecar) or SSE/HTTP (remote multi-agent)
- **Three auth modes**: none, static token, macaroon (HMAC chain)
See [`pkg/mcpserver/README.md`](pkg/mcpserver/README.md) for full documentation.
## Documentation
- [Architecture Overview](docs/ARCHITECTURE.md)
- [Quick Start Guide](docs/getting-started/quickstart.md)
- [Configuration Reference](docs/reference/configuration.md)
- [Production Checklist](docs/operations/production-checklist.md)
- [Kubernetes Deployment](docs/guides/kubernetes.md)
- [LangChain Integration](docs/guides/langchain-integration.md)
- [MCP Gateway Guide](docs/guides/mcp-gateway.md)
## ☁️ SatGate Cloud & Enterprise
> **Self-hosting not your thing?** [SatGate Cloud](https://cloud.satgate.io) is the fully managed version — same gateway, zero ops.
The open-source gateway handles protection, budgets, and paid-rail enforcement. SatGate Cloud adds the control plane:
- 📊 **Observe** — Real-time dashboards, usage attribution, cost center tagging
- 🎚️ **Control** — Budget and policy enforcement before agent requests execute
- 🤖 **SatGate Mint** — Zero-touch agent provisioning (K8s, AWS, OIDC)
- 🏢 **Multi-tenant** — Team isolation, RBAC, SSO/SCIM
- 📝 **Audit** — Tamper-evident logging, compliance exports
Start Free → (Observe is free, up to a fair-use cap)
## Contributing
We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
```bash
git clone https://github.com/satgate-io/satgate.git
cd satgate
go mod download
go test ./...
go build -o satgate ./cmd/satgate
```
## License
Apache License 2.0 — see [LICENSE](LICENSE) for details.
## Links
- 🌐 [satgate.io](https://satgate.io) — Website
- 📝 [Blog](https://satgate.io/blog) — Technical articles
- 🏢 [Enterprise Governance](https://satgate.io/govern) — CISO/CFO/CTO use cases
- 💰 [Pricing](https://satgate.io/pricing) — Free Observe tier, Pro for enforcement
- 🔒 [Security Model](https://satgate.io/security) — Architecture & compliance
- 🧪 [Sandbox](https://satgate.io/sandbox) — Try without signup
- 📊 [ROI Calculator](https://satgate.io/roi-calculator) — Estimate savings
- ⚖️ [Compare](https://satgate.io/compare) — SatGate vs Zuplo, Bifrost, cloud-native
- 📧 [contact@satgate.io](mailto:contact@satgate.io)
---
Built with ⚡ by SatGate — The Economic Firewall