pcurl: безопасный curl для AI-агентов и не только

Сколько раз вы копировали токены из каких-то несохранённых текстовых файлов, чатов в мессенджерах или еще откуда? Если повезло, то вместо этого всего был password manager (например op run -- curl https://api.com -H "Authorization: Bearer $TOKEN" через 1Password CLI). Но в реальной жизни, по моим наблюдениям, обычно не так.

И дальше токены попадают в .bash_history, во временные скрипты, которые обладают свойством “нет ничего более постоянного”. Еще бывает так, что токены хранятся в .env, и потом условный curl принимает $TOKEN. “Никогда не читай файл .env”

А потом наступает лень (то есть Claude Code, Codex, Cursor, Copilot), и ты запускаешь curl прямиком через команду в чате curl с -H 'Authorization: Bearer ...' – и токен уже “общественный”.

Вот это все немного надоело, и спустя 2 часа AI-coding сессии получился pcurl (p – private, б – безопасность).

Какую проблему решаем

Любой “оператор консоли или локального ai-чата”, работающий с HTTP API, рано или поздно сталкивается с одним и тем же:

  • Копирование токенов — каждый раз открываем браузер, копируем Authorization заголовок, вставляем в терминал.
  • Небезопасное хранение — секреты оседают в .env, .sh файлах, истории shell, тикетах, чатах.
  • AI-агенты видят секреты — при выполнении curl с заголовками авторизации токены попадают в контекст LLM и логи чата.

Хотелось получить инструмент, который:

  1. Работает как обычный curl (drop-in replacement).
  2. Хранит секреты в системном хранилище (OS Keychain).
  3. Никогда не показывает секреты в терминале, логах или контексте AI-агента.

Как это работает

pcurl — обёртка над curl, написанная на Go. Секреты хранятся в системном хранилище (macOS Keychain, Linux secret-service, Windows Credential Manager) и передаются в curl через stdin (curl --config -). Агент или пользователь видит только имя профиля.

graph LR
    A[Пользователь
или агент] -->|pcurl @profile| B[pcurl] B -->|curl --config -| C[curl] B -->|читает секреты| D[(OS Keychain)]

Именованные профили

Ключевая абстракция — профили. Каждый профиль привязан к хосту и содержит набор заголовков или кук:

# добавляем профиль — pcurl сам определит секретные заголовки
pcurl add https://api.example.com/data \
  -H 'Authorization: Bearer mytoken' \
  -H 'Accept: application/json'

# используем — просто добавляем @имя перед URL
pcurl @example https://api.example.com/data
pcurl @example https://api.example.com/data -X POST -d '{"key": 1}'

# без @ — обычный curl, без инъекции секретов
pcurl https://httpbin.org/get

При добавлении профиля pcurl интерактивно предлагает выбрать, куда сохранить каждый заголовок:

ХранилищеКогда использовать
keychain:<key>Секретные заголовки (Authorization, Cookie, API Key)
env:<VAR>Значение из переменной окружения
plain textНесекретные заголовки (Accept, Content-Type)

Браузерные шумовые заголовки (sec-ch-*, sec-fetch-*, sentry-trace) автоматически отфильтровываются.

Самый частый usecase – pcurl add <paste from Chrome: Copy as cURL>. Пробел перед командой важен, он не сохраняет команду в .bash_history. Если вызвать снова эту команду, она предложит обновить данные.

Управление профилями

pcurl show              # список всех профилей
pcurl show github       # детали профиля (секреты замаскированы)
pcurl edit              # редактирование в $EDITOR
pcurl delete github     # удаление профиля

Или через конфиг (можно получить путь через pcurl --help, например будет лежать тут ~/.config/pcurl/profiles.toml).

Интеграция с AI-агентами

Киллер-фича: когда AI-агент исполняет обычный curl:

# агент видит и отправляет на сервер LLM:
curl https://api.example.com/data -H 'Authorization: Bearer sk-abc123secret'

С pcurl агент видит только:

pcurl @example https://api.example.com/data

Секрет не попадает ни в контекст, ни в логи, ни в историю чата. Агент не может получить доступ к значению токена, даже если захочет (но если очень захочет, и пользователь дал доступ до системы – агент сам может сходить в keychain).

Автоматическая установка правил

pcurl install

Эта команда создаёт правила для агентов в:

  • ~/.claude/CLAUDE.md — Claude Code
  • ~/.cursor/rules/pcurl.mdc — Cursor
  • ~/.windsurf/rules/pcurl.md — Windsurf

Правила содержат список доступных профилей и инструкции: использовать pcurl @profile вместо curl с заголовками авторизации.

При добавлении или удалении профилей правила обновляются автоматически.

Установка

# Homebrew
brew install vmkteam/tap/pcurl

# Go
go install github.com/vmkteam/pcurl/cmd/pcurl@latest

Требования: curl в PATH, доступ к системному хранилищу ключей. Работает на macOS, Linux и Windows.

Сравнение с альтернативами

РешениеСекрет виден агентуРаботает офлайнDrop-in для curlПроизвольные заголовки
pcurlНетДаДаДа
curl -HДаДаДа
~/.netrcНетДа--netrcНет (только login/password)
keychains.devНетНет (SaaS)ДаДа
op run (1Password)НетДаНет (op run --)Да

Пример из жизни

Допустим, вам нужно проверить Grafana dashboard или посмотреть issue в Sentry. Раньше:

# копируем токен из браузера, вставляем...
# токен в истории shell, в контексте агента, возможно в Slack
curl https://grafana.example.com/api/dashboards/home \
  -H 'Authorization: Bearer glsa_abc123...'

Теперь:

# один раз настроили профиль
pcurl add https://grafana.example.com/api/dashboards/home \
  -H 'Authorization: Bearer glsa_abc123...'

# используем — безопасно, удобно, навсегда
pcurl @grafana https://grafana.example.com/api/dashboards/home
pcurl @grafana https://grafana.example.com/api/datasources -s | jq .

Профили, по факту, это каталог всех сервисов, к которым у вас есть доступ. pcurl show — и вы видите полную картину.

Чего pcurl не делает

Важно понимать границы:

  • Не защищает от вредоносного агента, который целенаправленно читает profiles.toml или обращается к keychain.
  • Нет TTL или автоматической ротации токенов.
  • При выборе хранилища “Config” (вместо Keychain) секреты хранятся в открытом виде.

Но это всё равно на порядок лучше, чем токены в bash history.

Еще pcurl версии v0.0.1 тестировался только на macOS. It works on my machine :) Поэтому фидбэк приветствуется. Бинарники из homebrew пока без подписей, поэтому go install пока предпочтительный выбор.

Почему стоит

  • Если вы работаете с API из терминала — pcurl экономит время.
  • Если вы используете AI-агентов — pcurl защищает секреты.
  • Если у вас в команде больше одного человека — стандартизируйте подход к авторизации в CLI.
  • Установка занимает 30 секунд, добавление первого профиля — ещё 30.
  • После: перевыпустите уже все токены со сроком жизни 30 дней.

И нестареющая классика: ставьте лайки vmkteam/pcurl, подписывайтесь на наш канал