Skip to main content
Glama
Un1u6ky

agent-security-gateway

by Un1u6ky
README.md
# Agent Security Gateway

MCP‑слой безопасности для AI‑агентов: каждый вызов tool проходит через **allow / confirm / deny** и пишется в audit.

```
Cursor / Claude
      ↓
Agent Security Gateway  ← политики + очередь confirm
      ↓                    + UI аппрувов (:8787)
sandbox tools              + SQLite audit
```

## Быстрый старт

```bash
npm install
npm test
npm run demo          # демо (UI + allow/deny/confirm)
# или
npm run dev           # MCP по stdio + UI для Cursor
```

- UI аппрувов и аудита: http://127.0.0.1:8787  
- MCP работает по **stdio** (логи только в stderr)

### Подключение в Cursor

```json
{
  "mcpServers": {
    "agent-security-gateway": {
      "command": "npm",
      "args": ["run", "dev", "-w", "@agent-security/gateway"],
      "cwd": "/Users/daniildudarev/Downloads/agent-security-gateway"
    }
  }
}
```

### Сценарий confirm

1. Агент вызывает `write_file` → `safe/hello.txt`
2. Открываешь UI → **Approve**
3. Агент смотрит результат через `get_pending` / `list_audit`

## Зачем это нужно

Агенту дают «руки» (tools): файлы, API, БД. Без ограничений он может удалить не то, уйти в цикл или сделать необратимое действие.

Этот gateway стоит **между IDE‑агентом и tools**:

| Решение | Что происходит |
|---------|----------------|
| **allow** | действие выполняется сразу |
| **deny** | блокируется, пишется в audit |
| **confirm** | ждёт человека в UI, потом execute / reject |

По умолчанию — **fail‑closed**: неизвестный tool запрещён.

## Docker

```bash
docker compose up --build
```

UI: http://127.0.0.1:8787

## Переменные окружения

| Переменная | По умолчанию | Назначение |
|------------|--------------|------------|
| `ASG_POLICY_PATH` | `policies/default.yaml` | Файл политик |
| `ASG_APPROVE_HOST` | `127.0.0.1` | Адрес bind (`0.0.0.0` в Docker) |
| `ASG_APPROVE_PORT` | `8787` | Порт UI |
| `ASG_APPROVE_URL` | вычисляется | URL, который видит агент |
| `ASG_DATA_DIR` | `./data` | Каталог SQLite |

## Политики

Файл `policies/default.yaml` — **первое совпадение побеждает**, иначе deny.

| Действие | Путь | Решение |
|----------|------|---------|
| list/read | sandbox | allow |
| write/delete | `prod/**` | deny |
| write/delete | `safe/**` | confirm → UI |
| неизвестный tool | — | deny |

## Sandbox

```
sandbox/
  safe/notes.txt      # безопасный демо‑файл
  prod/users.db       # «прод» — мутации запрещены
```

Все файловые tools работают только внутри `sandbox/`, выход через `..` режется.

## Tools

| Tool | Назначение |
|------|------------|
| `gateway_status` | статус, пути, URL UI |
| `list_dir` / `read_file` | чтение sandbox |
| `write_file` / `delete_file` | мутации (под политикой) |
| `list_pending` / `get_pending` | очередь confirm |
| `list_audit` | история решений |

## Демо

```bash
npm run demo
```

Подробнее: [docs/DEMO.md](./docs/DEMO.md)

> Агентам нужны руки (tools). Руки без ограждения опасны. Этот MCP‑gateway стоит между IDE‑агентом и tools, решает allow/confirm/deny и для рискованных действий ждёт человека — с полным audit trail.

---

# Agent Security Gateway (English)

MCP security layer for AI agents: every tool call goes through **allow / confirm / deny** + audit.

```
Cursor / Claude
      ↓
Agent Security Gateway  ← policy + pending queue
      ↓                    + approve UI (:8787)
sandbox tools              + SQLite audit
```

## Quick start

```bash
npm install
npm test
npm run demo          # demo (UI + allow/deny/confirm)
# or
npm run dev           # MCP stdio + UI for Cursor
```

- Approve / Audit UI: http://127.0.0.1:8787  
- MCP on stdio (logs on stderr)

### Connect from Cursor

```json
{
  "mcpServers": {
    "agent-security-gateway": {
      "command": "npm",
      "args": ["run", "dev", "-w", "@agent-security/gateway"],
      "cwd": "/Users/daniildudarev/Downloads/agent-security-gateway"
    }
  }
}
```

### Confirm flow

1. Agent: `write_file` → `safe/hello.txt`
2. Open UI → **Approve**
3. Agent: `get_pending` / `list_audit`

## Why it exists

Agents get hands (tools): files, APIs, databases. Without guardrails they can delete the wrong thing, loop on expensive calls, or take irreversible actions.

This gateway sits **between the IDE agent and tools**:

| Decision | What happens |
|----------|----------------|
| **allow** | execute immediately |
| **deny** | block + write audit |
| **confirm** | wait for a human in the UI, then execute / reject |

Default is **fail-closed**: unknown tools are denied.

## Docker

```bash
docker compose up --build
```

UI: http://127.0.0.1:8787

## Env

| Variable | Default | Meaning |
|----------|---------|---------|
| `ASG_POLICY_PATH` | `policies/default.yaml` | Policy file |
| `ASG_APPROVE_HOST` | `127.0.0.1` | Bind address (`0.0.0.0` in Docker) |
| `ASG_APPROVE_PORT` | `8787` | Approve UI port |
| `ASG_APPROVE_URL` | derived | URL shown to agents |
| `ASG_DATA_DIR` | `./data` | SQLite DB directory |

## Policy model

`policies/default.yaml` — first match wins, default fail-closed deny.

| Action | Path | Decision |
|--------|------|----------|
| list/read | sandbox | allow |
| write/delete | `prod/**` | deny |
| write/delete | `safe/**` | confirm → human UI |
| unknown tool | — | deny |

## Sandbox

```
sandbox/
  safe/notes.txt      # harmless demo file
  prod/users.db       # fake "prod" — mutations denied
```

All filesystem tools are rooted at `sandbox/` and reject `..` escapes.

## Tools

| Tool | Purpose |
|------|---------|
| `gateway_status` | status, paths, UI URL |
| `list_dir` / `read_file` | read sandbox |
| `write_file` / `delete_file` | mutations (policy-gated) |
| `list_pending` / `get_pending` | confirm queue |
| `list_audit` | decision history |

## Demo

```bash
npm run demo
```

Details: [docs/DEMO.md](./docs/DEMO.md)

> Agents need hands (tools). Hands without a guardrail are dangerous. This MCP gateway sits between the IDE agent and tools, decides allow/confirm/deny, and for risky actions waits for a human — with a full audit trail.