Skip to main content
Glama
DINAKAR-S

keywarden

by DINAKAR-S

keywarden

Ваш ИИ-агент может использовать ваши API-ключи. Но никогда не сможет их прочитать.

keywarden — это локальное зашифрованное хранилище учётных данных, которое говорит на MCP. Claude Code, Claude Desktop, Cursor или любой MCP-клиент подключается к нему и получает две возможности: совершать аутентифицированный API-вызов и запускать команду с учётными данными в своём окружении. Ни одна из них никогда не помещает сами учётные данные в контекст модели.

Инструмента get_secret не существует. Это отсутствие и есть весь продукт.

   agent                keywarden                    upstream
     |                     |                          |
     |  "POST /v1/chat     |                          |
     |   using openai/prod"|                          |
     |-------------------->|                          |
     |                     | check policy             |
     |                     | decrypt key              |
     |                     | attach Authorization     |
     |                     |------------------------->|
     |                     |<-------------------------|
     |  response only      | scrub any key from body  |
     |<--------------------| append to audit log      |

Зачем

Сейчас обычный способ дать агенту использовать ваш OpenAI-ключ — положить ключ в файл .env и позволить агенту прочитать его. Как только он это делает, ключ оказывается в контекстном окне модели. Оттуда он попадает в логи провайдера, возможно, в обучающий набор, возможно, в отчёт о сбое, и уж точно — в вашу собственную историю транскриптов, которую вы вставите в отчёт об ошибке через полгода.

Ротация ключа — это неприятно. Не знать, утёк ли он, — ещё хуже.

keywarden убирает тот шаг, на котором модель вообще видит ключ.

Related MCP server: Echo Vault

Установка

npm install -g keywarden

Node 20.10 или новее. Две зависимости времени выполнения: MCP SDK и zod. Никаких нативных модулей, компилятора и демона.

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

keywarden init --passphrase
keywarden add openai/prod --provider openai
keywarden mcp-config

init создаёт ~/.keywarden/ с зашифрованным хранилищем и политикой «запрещено по умолчанию». add запрашивает каждое поле, поэтому ничего не попадает в историю вашей оболочки. mcp-config выводит блок для вставки в ваш MCP-клиент.

Затем в Claude Code:

Вызови endpoint моделей OpenAI с моим прод-ключом и скажи, к каким из них у меня есть доступ.

Модель вызывает http_request с ref: "openai/prod". keywarden подставляет ключ, совершает вызов и возвращает ответ. Попросите её напечатать ключ — она ответит, что не может.

Инструменты, которые получает агент

Инструмент

Что делает

list_secrets

Только метаданные: refs, провайдеры, имена полей, последнее использование. Никогда значения.

describe_secret

Одно учётное данное плюс как его можно использовать, какие хосты, какие переменные окружения.

list_providers

Встроенные пресеты и что ожидает каждый из них.

http_request

Аутентифицированный HTTPS-вызов. keywarden подставляет учётные данные.

run

Запускает локальный процесс с учётными данными, внедрёнными как переменные окружения.

audit_tail

Последние записи из журнала, защищённого от подделки.

Установите KEYWARDEN_DISABLE_EXEC=1, чтобы полностью убрать run и оставить только HTTP-прокси.

Три поверхности, одна модель авторизации

Одно и то же хранилище, механизм политик, гранты и журнал аудита доступны тремя способами. То, какой из них вы используете, ничего не меняет в том, что разрешено.

поверхность

для

как идентифицируется вызывающий

MCP (stdio)

Claude Code, Claude Desktop, Cursor

клиент, который запустил сервер

CLI

вы, в терминале

доступ к файловой системе хранилища

HTTP (loopback)

любой язык, CI, скрипт, веб-интерфейс

ограниченный API-ключ keywarden

HTTP-поверхность — это то, что делает keywarden пригодным для кода, который не говорит на MCP, и это первое место, где keywarden может отличить одного вызывающего от другого:

keywarden apikey create ci-runner --ref 'openai/**' --http --audit --ttl 30d
keywarden serve --port 8787
curl -s http://127.0.0.1:8787/v1/proxy/openai%2Fprod \
  -H "Authorization: Bearer kw_live_..." \
  -H "content-type: application/json" \
  -d '{"method":"POST","url":"/v1/chat/completions","body":{"model":"gpt-4o","messages":[]}}'

Вызывающий держит ключ keywarden с областью действия openai/**, несущий только те возможности, которые были предоставлены, истекающий через 30 дней, отзываемый одной командой. Он никогда не содержит OpenAI-ключ. Маршруты: /v1/secrets, /v1/secrets/:ref, /v1/proxy/:ref, /v1/run, /v1/audit, /v1/usage, /v1/whoami, /healthz.

Сервер привязывается к 127.0.0.1 и отказывается работать на маршрутизируемом интерфейсе без --allow-remote, потому что любой, кто может дотянуться до этого порта, получает оракул авторизации для каждого учётного данного, которое покрывает ключ.

Кто что использовал и сколько это стоило

Каждая запись в журнале аудита называет субъекта, и субъект находится внутри хэша, поэтому атрибуцию нельзя переписать, не разорвав цепочку. Каждый проксированный ответ разбирается для извлечения количества токенов, сообщённого провайдером.

keywarden usage --since 7d
CREDENTIAL        CALLS          IN         OUT       TOTAL
openai/prod         142     418,220      96,410     514,630
anthropic/prod       38      92,004      31,887     123,891

ACTOR             CALLS          IN         OUT       TOTAL
http:ci-runner      118     356,900      74,220     431,120
mcp:mcp-client       62     153,324      54,077     207,401

keywarden записывает токены, а не деньги. Цены меняются, различаются по контрактам, и устаревшая захардкоженная ставка даёт уверенно неверное число в финансовом отчёте. Обратите внимание, что run нельзя тарифицировать: как только учётные данные оказываются внутри дочернего процесса, keywarden видит код возврата, а не количество токенов.

Два способа использовать учётные данные

Прокси — для HTTP API. Агент описывает запрос, keywarden подставляет учётные данные и совершает вызов. Работает для OpenAI, Anthropic, Stripe, GitHub, Slack, Cloudflare, Vercel, Supabase и любого API, которое аутентифицируется через заголовок или query-параметр.

// what the agent sends
{ "ref": "openai/prod", "method": "POST", "url": "/v1/chat/completions", "body": { "model": "gpt-4o", "messages": [] } }

Инъекция — для всего остального. AWS требует подписи запросов SigV4, Postgres URL — это вообще не HTTP, а terraform apply хочет настоящие переменные окружения. keywarden сам запускает процесс:

{ "command": "aws", "args": ["s3", "ls"], "inject": ["aws/prod"] }

Дочерний процесс получает AWS_ACCESS_KEY_ID и остальных. Модель получает stdout, причём любые учётные данные, появляющиеся в нём, маскируются на выходе.

Политика

~/.keywarden/policy.json определяет, какое учётное данное может быть использовано, какой возможностью и против чего. Правила оцениваются сверху вниз, побеждает первое совпадение, а по умолчанию — запрет.

{
  "version": 1,
  "default": "deny",
  "redactResponses": true,
  "rules": [
    {
      "ref": "openai/**",
      "http": { "allow": true, "methods": ["POST"], "paths": ["/v1/**"] },
      "exec": { "allow": false, "commands": [] },
      "rateLimitPerMinute": 30
    },
    {
      "ref": "aws/prod",
      "http": { "allow": false },
      "exec": { "allow": true, "commands": ["aws", "terraform"] },
      "rateLimitPerMinute": 10,
      "expiresAt": "2026-12-31T00:00:00.000Z"
    }
  ]
}

Или из CLI:

keywarden policy allow "openai/**" --http --path "/v1/**" --method POST
keywarden policy allow aws/prod --exec aws --exec terraform --arg-deny "s3://*"
keywarden policy test aws/prod exec terraform

* совпадает внутри одного сегмента пути, ** охватывает несколько сегментов. expiresAt делает правило временным.

Просто назвать команду недостаточно. Разрешите aws для aws s3 ls — и тот же бинарник сделает aws s3 cp в чужой бакет. Это разрыв на уровне последовательности, на который постоянно указывает литература по угрозам MCP: каждый отдельный вызов авторизован, а их комбинация — это эксфильтрация. Поэтому правила ограничивают и аргументы:

"exec": {
  "allow": true,
  "commands": ["aws"],
  "argsDeny": ["s3://*", "--endpoint-url"],   // any match refuses the call
  "argsAllow": ["s3", "ls", "--region", "*"]  // if set, every argument must match
}

Гранты: временный, истекающий, ограниченный по использованию доступ

Политика — это постоянная конфигурация. Она не подходит для сценария «позволь агенту сделать вот это, сейчас, на пятнадцать минут», который сегодня означает расширение правила и забывание снова его сузить.

Грант — это возможность, которая несёт собственные ограничения, заимствованная из традиции macaroon и biscuit, и выдаётся вами в терминале:

keywarden grant aws/prod --exec aws --ttl 15m --uses 5 --arg-deny "s3://*"
keywarden grant openai/prod --http --path "/v1/chat/**" --method POST --ttl 1h --uses 20
keywarden grant list
keywarden grant revoke <id>

Гранты истекают сами, умирают, когда заканчивается их бюджет использования, и подписываются HMAC-ключом, производным от вашего хранилища, поэтому отредактированный вручную grants.json отклоняется, а не принимается. Отклонённая попытка не сжигает использование.

Установите "requireGrant": true в правиле политики — и постоянная конфигурация становится необходимой, но не достаточной: ничего не происходит, пока вы не выдадите грант. Это шаг одобрения с участием человека, без необходимости интерактивного запроса внутри stdio-сервера.

политика

грант

результат

разрешает, без requireGrant

—

разрешить

разрешает, с requireGrant

действующее совпадение

разрешить

разрешает, с requireGrant

нет

запретить

запрещает

действующее совпадение

разрешить

запрещает

нет

запретить

Целостность конфигурации

Шифрование секретов — это половина дела. policy.json решает, можно ли использовать учётное данное, а providers.json решает, куда оно отправляется. Оба — обычные файлы. Тот, кто не может расшифровать ни одного байта, всё равно может добавить провайдера, чьи хосты принадлежат ему, и перенаправить ваше учётное данное на него.

Поэтому хранилище фиксирует хэш обоих файлов и отказывается работать с любым из них, пока вы не посмотрите на изменение:

keywarden trust show    # what drifted
keywarden trust         # review, then pin the current contents

Сам файл хранилища снабжается MAC-кодом целиком, а не только по полям, потому что замена provider: "openai" на что-то другое никогда не затрагивает шифротекст и в противном случае прошла бы проверку чисто.

Что keywarden действительно обеспечивает

  • Нет инструмента, возвращающего открытый текст. В MCP-поверхности нет пути кода, который возвращает значение учётного данного.

  • Разрешающий список исходящих. Учётное данное может быть отправлено только на хосты, объявленные его провайдером, плюс те, что вы добавили в политику. Инъекция в промпт, говорящая агенту отправить ваш ключ на attacker.example, проваливается на проверке хоста, ещё до обращения к сети.

  • Только HTTPS, без перехода по редиректам. 302 на другой origin не повторит ваш заголовок Authorization вне хоста.

  • Защита от SSRF. Loopback, частные диапазоны, CGNAT и link-local (что покрывает endpoint метаданных облака 169.254.169.254) блокируются, а адрес проверяется в том DNS-запросе, который реально использует сокет, поэтому DNS-ребinding не открывает окно.

  • Никакого шелла. run передаёт массив argv в spawn с shell: false. Нет разбора метасимволов, в который можно внедриться.

  • Сконструированное окружение дочернего процесса. Дочерний процесс получает разрешающий список унаследованных переменных плюс внедрённые. Ваши остальные секреты и собственная парольная фраза keywarden не наследуются.

  • Редактирование вывода. Каждый результат инструмента сканируется на известные значения учётных данных, их base64 и URL-encoded формы и около дюжины известных форм ключей. Это эшелонированная защита, а не основной контроль.

  • Аудит, защищённый от подделки. Каждое решение — разрешение или запрет — добавляется в журнал с хэш-цепочкой. keywarden audit verify пересчитывает цепочку и сообщает о первой изменённой или удалённой записи.

  • Целостность всего файла. Хранилище снабжается MAC-кодом, включая метаданные, поэтому учётное данное нельзя перенаправить другому провайдеру без обнаружения. policy.json и providers.json привязаны по хэшу к хранилищу и отклоняются при изменении вне полосы.

  • Усиление окружения. Сервер отказывается запускаться, когда установлены NODE_TLS_REJECT_UNAUTHORIZED=0, NODE_OPTIONS или SSLKEYLOGFILE, и предупреждает о NODE_EXTRA_CA_CERTS и HTTPS_PROXY. CVE-2026-21852 против Claude Code был одним переопределением окружения, которое перенаправляло исходящий трафик с прикреплённым заголовком Authorization; процесс, чья работа — прикреплять учётные данные, не должен запускаться, когда путь запроса находится под чужим контролем.

  • Ограничения аргументов. argsAllow / argsDeny сужают какие именно вызовы разрешённой команды допустимы, а не только какой бинарник.

  • Ослабленные гранты. Истекающие, ограниченные по использованию, выдаваемые оператором возможности, устойчивые к подделке благодаря MAC, производному от хранилища.

  • Обрамление недоверенных данных. Тела проксированных ответов помечаются как недоверенное содержимое от указанного хоста, поэтому внедрённая инструкция в API-ответе подаётся модели как данные.

Криптография

Конвертное шифрование, всё из node:crypto, никаких сторонних криптобиблиотек.

  • Случайный 256-битный ключ данных шифрует каждое поле с помощью AES-256-GCM, используя ref и имя поля учётного данного как дополнительные аутентифицированные данные, поэтому шифротекст нельзя переместить между записями хранилища.

  • Ключ данных оборачивается ключом, производным от вашей парольной фразы, с помощью scrypt при N=2^17, r=8, около 128 MiB и примерно секунда на попытку. Это сделано намеренно: файл хранилища — это то, с чем уходит атакующий, поэтому офлайн-подбор должен быть дорогим.

  • Ротация парольной фразы переоборачивает 32 байта. Она не перешифровывает каждый секрет.

Режимы хранилища

--passphrase — это надёжный режим. MCP-серверу нужен KEYWARDEN_PASSPHRASE в его окружении, чтобы разблокироваться без запроса.

--keyfile записывает случайный ключ в ~/.keywarden/masterkey, чтобы ничто не требовало запроса. Это удобно, но означает, что любой, кто может читать ваш домашний каталог, сможет открыть хранилище. Это всё равно гораздо лучше, чем разбросанные по проектам файлы .env в открытом виде, потому что ключ находится в одном месте, его использование ограничено политикой, и каждое использование логируется. Знайте, на какой компромисс вы пошли. keywarden doctor вам напомнит.

В Windows режимы файлов устанавливаются, но не соблюдаются так, как POSIX соблюдает 0600. См. THREAT_MODEL.md.

CLI

keywarden init --passphrase|--keyfile   create the vault
keywarden doctor                        check the install, flag weak settings
keywarden trust [show]                  re-pin policy.json + providers.json after reviewing a change
keywarden grant <ref> ...               issue a temporary, use-capped capability
keywarden grant list | revoke <id>
keywarden add <ref> --provider <id>     store a credential (prompts for each field)
keywarden list                          metadata only
keywarden describe <ref>                metadata plus how it can be used
keywarden reveal <ref>                  print plaintext, asks first, always audited
keywarden rm <ref> [--field f]          delete
keywarden exec <ref[,ref]> -- <cmd>     run a command with credentials injected
keywarden policy show|init|allow|deny|test
keywarden audit [tail|verify]
keywarden passphrase                    rotate
keywarden providers                     built-in presets
keywarden mcp-config                    print the MCP client config
keywarden doctor                        check the install, flag weak settings

Пользовательские провайдеры

Всё, что не встроено, помещается в ~/.keywarden/providers.json. См. docs/PROVIDERS.md.

{
  "acme": {
    "label": "Acme Internal API",
    "hosts": ["api.acme.internal", "*.acme.io"],
    "baseUrl": "https://api.acme.io",
    "fields": ["token", "tenant"],
    "required": ["token"],
    "auth": { "type": "header", "name": "X-Acme-Key", "template": "{{token}}" },
    "env": { "ACME_TOKEN": "{{token}}", "ACME_TENANT": "{{tenant}}" }
  }
}

От чего keywarden вас не защищает

Прочтите THREAT_MODEL.md, прежде чем доверить ему что-либо дорогое. Краткая версия:

  • Если агент может выполнять произвольные локальные команды через какой-либо другой инструмент, он сможет прочитать ваш файл хранилища и, в режиме ключевого файла, ваш мастер-ключ. keywarden защищает контекст модели, а не ваш диск.

  • run передаёт учётные данные реальному процессу. Если вы внесёте в список разрешённых команду, которую можно направить на извлечение собственного окружения, учётные данные уйдут. Вносите в список разрешённых узко.

  • Редактирование — это страховочная сетка с дырами. Учётные данные, которые API возвращает в перекодированном виде, который мы не распознаём, не будут обнаружены.

  • keywarden не мешает агенту сделать что-то дорогостоящее или разрушительное с учётными данными, которые ему разрешено использовать. Для этого существуют политики ограничения и лимиты скорости.

Разработка

npm install
npm run build
npm test          # 89 unit tests + 46 end-to-end checks against the real CLI, MCP and HTTP servers

Набор e2e-тестов управляет реальными бинарными файлами во временной KEYWARDEN_HOME и проверяет, в частности, что ни один ответ инструмента не содержит учётные данные.

Чтение

  • THREAT_MODEL.md — что входит в область применения, а что честно нет

  • docs/RESEARCH.md — литература 2026 года, на которой основан этот дизайн, что было принято, а что рассмотрено и отклонено

  • docs/COMPETITORS.md — ландшафт, и в чём keywarden действительно отличается, а не просто по-другому маркетируется

  • docs/TEAM.md — многопользовательская архитектура: идентичность, обмен ключами без читаемого сервера, процесс утверждения, учёт затрат и порядок сборки

  • docs/PROVIDERS.md — написание собственного провайдера

Хостинговая версия

Планируется хостинговая версия для тех, кто хочет командное хранилище, управление через браузер и синхронизацию между машинами, с той же гарантией нулевой экспозиции. Всё в этом репозитории остаётся под лицензией MIT и полностью пригодным для автономного использования. См. docs/HOSTED.md.

Лицензия

MIT

Available Tools

6 tools
audit_tailA

Recent entries from keywarden's tamper-evident audit log: which credential was used, by which capability, against which host or command, and whether it was allowed or denied.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoOptional: only entries for this credential ref.
limitNoHow many entries. Default 20, max 200.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. It discloses that the tool returns recent entries, that the source log is tamper-evident, and what fields an entry contains. It does not explicitly discuss ordering, permissions, or read-only guarantees, but the audit-tail nature and field list make the behavior reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly written sentence that immediately states the resource and the most important properties of the returned entries. Every phrase earns its place and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple two-optional-parameter contract and a fully documented schema, the description covers everything needed for both selection and correct invocation. It explains what the tool does, what an entry includes, and the recent-history nature of the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters (ref and limit) are already fully described in the input schema, so the description adds no additional parameter meaning. The description reinforces the overall audit-log scope but does not go beyond what the schema already provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the exact resource: recent entries from the tamper-evident audit log, and enumerates the kinds of information the entries contain. It is easily distinguished from the sibling tools because it is about audit history, not secret lookup, provider listing, HTTP calls, or command execution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is clearly implied: the agent should use this when it needs recent audit log entries about credential use, capability, target host/command, and allow/deny results. It does not explicitly name alternatives or define when-not-to-use conditions, but the context is not ambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_secretB

Metadata for one credential plus how it can be used: whether it can be proxied over HTTP, which hosts it may reach, and which environment variables it maps to when injected.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesCredential ref, e.g. "openai/prod".

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry some behavioral burden. It reveals what information the tool returns at a high level (proxying, hosts, env vars) but does not disclose things like whether it exposes secrets themselves, side effects, or auth requirements. It adds some value beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one clear sentence, front-loaded with the main intent and then enumerating the specific metadata categories. No waste, though it could be slightly more structured with a colon or list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one well-documented parameter and no output schema, the description covers the main purpose and key return aspects. However, it does not mention whether it returns the secret value itself, which could be relevant for an agent deciding between this and list_secrets. That gap leaves it merely adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the ref parameter with 100% coverage including an example. The description does not add further meaning beyond referring to the credential, so it doesn't push above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: retrieving metadata for one credential and its usage characteristics. It specifies the resource (credential) and the relevant aspects (HTTP proxying, reachable hosts, environment variable mappings). It doesn't explicitly differentiate from sibling tools, but the focus is specific enough to avoid major confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage is for inspecting a credential's metadata and how it can be used. It doesn't explicitly state when to use this over alternatives like list_secrets, nor does it provide exclusions. Context is clear but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

http_requestA

Make an authenticated HTTPS request using a vaulted credential. keywarden attaches the credential itself; you never see it. The destination must be an allowed host for that credential. Redirects are not followed and non-HTTPS is refused.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesCredential ref, e.g. "openai/prod".
urlYesAbsolute https URL, or a path resolved against the provider base URL (e.g. "/v1/models").
bodyNoRequest body. An object is JSON-encoded automatically; a string is sent verbatim.
methodNoHTTP method. Defaults to GET.
headersNoExtra request headers. Auth headers are managed by keywarden and will be rejected here.
timeout_msNoPer-request timeout. Default 60000.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and excels: it discloses that the credential is attached by keywarden and invisible to the caller, that the host must be allow-listed, that redirects are not followed, and that non-HTTP requests are rejected. This exceeds the typical transparency and preempts common failure modes, giving the agent a realistic picture of runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences front-load the core purpose and immediately follow with critical behavioral constraints. Every clause adds unique value—no redundant or fluff content—making it easy to parse and highly digestible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers authentication, host authorization, redirects, and HTTPS enforcement, which are the most critical behavioral aspects. However, since there is no output schema, the absence of any mention of response format or error handling is a minor gap—an agent might wonder what the tool returns. Still, for a generic HTTP client, the description is largely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all parameters with 100% coverage (ref, url, body, method, headers, timeout_ms). The description adds general behavioral context (auth, host restrictions) but does not elaborate on parameter-specific semantics beyond what the schema provides. This meets the baseline for full schema coverage without adding parametric nuance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool makes an authenticated HTTPS request using a vaulted credential. It differentiates itself from sibling tools (audit_tail, list_secrets, etc.) by focusing on outgoing requests, and the scope is crisply defined: a single request with auth handled internally. The verb 'Make' plus the resource 'authenticated HTTPS request' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool, emphasizing the need for a vaulted credential and an allowed host, and explicitly notes restrictions (redirects not followed, non-HTTPS refused). It does not explicitly name alternatives or provide when-not-to-use guidance, but given the distinct sibling tools, the context is sufficient. A minor deduction for not explicitly contrasting with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_providersA

List known provider presets (openai, aws, stripe, ...) with their allowed hosts, expected field names, and env-var mappings. Useful before asking the user to add a new credential.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the burden. The verb 'list' strongly implies a read-only, side-effect-free operation, which is a core behavioral trait. However, it does not explicitly confirm a read-only nature, nor does it disclose any network calls, authentication dependencies, or failure modes, leaving some uncertainty.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that moves from the general operation to specific examples and output attributes. It is highly compact, with no redundant words. Every phrase adds value, and the essential 'List known provider presets' is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description takes responsibility for defining what is returned; it does so by naming permitted hosts, expected field names, and environment variable mappings. It also adds a practical use-case with clear context. It does not mention edge cases like empty providers or exact formatting, but these are not strongly demanded for such a simple read-only tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero properties, so there are no parameters to describe. The description correctly focuses on the operation and its output without mentioning input requirements. According to the baseline rule for zero-parameter tools, a score of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the verb ('List'), the resource ('provider presets'), and the output contents ('allowed hosts, expected field names, and env-var mappings'). It clearly distinguishes itself from sibling secret-related tools by focusing on the provider domain. There is no tautology; it goes beyond merely restating the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear when-to-use signal: 'Useful before asking the user to add a new credential.' This grounds the tool as a prerequisite step in a credential-adding workflow. It does not explicitly name alternative tools or state when-not-to-use, but the given context is sufficient for most cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_secretsA

List every credential in the vault as metadata only: ref, provider, description, which field names exist, when it was last used. Never returns credential values. Start here.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional: only secrets carrying this tag.
providerNoOptional: only secrets for this provider id.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and meaningfully discloses that the tool only returns metadata and never credential values. It also surfaces the output fields and last-use flag, which is useful behavioral context. It does not mention edge behaviors such as pagination or permission failures, but those are minor for this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences front-load the main action and output format, then add the critical safety note and a usage cue. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple optional-filter list tool with no output schema, the description sufficiently covers the return shape, the read-only metadata behavior, and the intended starting point. The schema covers the parameters, and no critical calling information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both optional filters already have clear descriptions in the schema (filter by tag, filter by provider). The description adds no additional meaning to the parameters, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Describes a specific verb ('List') and resource ('every credential in the vault'), and explains the metadata-only output fields (ref, provider, description, field names, last used). It distinguishes itself from sibling tools by explicitly disclaiming credential values, so an agent can tell it apart from describe_secret.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Start here' gives a clear entry-point cue for exploring the vault, and the metadata-only behavior makes it appropriate for discovery before retrieving a single secret. It does not explicitly name alternatives or state when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

runA

Run a local command with one or more vaulted credentials injected as environment variables (e.g. aws, terraform, gh, psql, a build script). The command is executed directly with no shell, so pass arguments as an array. Output is scanned and any credential appearing in it is masked before you see it.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoWorking directory. Defaults to the server's cwd.
envNoExtra non-secret environment variables.
argsNoArguments as separate strings, e.g. ["s3", "ls"]. No shell parsing happens.
stdinNoOptional text written to the process stdin.
injectYesCredential refs to inject, e.g. ["aws/prod"].
commandYesExecutable name or path, e.g. "aws".
timeout_msNoWall-clock limit. Default 60000.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses the no-shell execution model, the need to pass arguments as an array, and the key credential-masking behavior. It does not mention exit-code or error-handling behavior, but the most important safety-relevant traits are surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences deliver the core behavior, execution model, and output masking with no filler. The most important information is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema documents all seven parameters in detail, and the description covers the core execution semantics and output privacy behavior. It stops the short of explicitly describing the full output contract, such as stdout/stderr or exit-code handling, but for its complexity the definition is still reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the structured parameter descriptions already handle most meaning. The prose adds marginal clarification by tying 'inject' to environment variables and 'args' to the no-shell array convention, but it does not substantially go beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: run a local command with vaulted credentials injected as environment variables. It gives concrete examples (aws, terraform, gh, psql) and clearly positions itself as a local command runner, distinguishing it from the secret-management and HTTP sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: running local CLIs or scripts that need injected secrets. It does not explicitly state exclusions or compare against siblings, but the 'local command' framing and examples make the intended use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.3.0
    • First observedaudit_tail
    • First observeddescribe_secret
    • First observedhttp_request
    • First observedlist_providers
    • First observedlist_secrets
    • First observedrun

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a clearly distinct concern: auditing, listing all secrets, inspecting one secret, listing provider presets, making an HTTP request, and running a local command. Even http_request and run, which both consume credentials, are clearly separated by remote HTTP vs local execution.

Naming Consistency3/5

list_secrets, list_providers, and describe_secret follow a readable verb_noun pattern, but audit_tail, http_request, and run break it: audit_tail is noun-first, http_request is a noun phrase, and run is a bare verb. The set is understandable but mixes conventions.

Tool Count5/5

Six tools is a well-scoped size for a credential vault/usage server. Each tool covers a meaningful part of the workflow without redundancy or bloat.

Completeness4/5

The server covers the core credential-usage workflow well: list, describe, use over HTTP, use locally, and audit past use. Credential creation/update/delete is absent, but the descriptions suggest new credentials may be added by the user outside the tool set, so this is a minor workaround gap rather than a fatal one.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to securely access authenticated services (HTTP, SSH, SMTP) without exposing secrets, by acting as a server-side proxy that injects authentication.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to securely use credentials for GitHub, Cloudflare, OpenAI, Stripe, and xAI without ever reading the secret values, including credential health, rotation, and audit features.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to call external endpoints under per-endpoint policy enforcement, with credentials and personal data kept inside a hardware enclave and every allowed or denied attempt recorded to an immutable audit ledger.
    2
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to invoke upstream APIs without ever holding reusable credentials, using short-lived scoped capabilities and server-side secret injection. Also provides execution controls and x402 facilitator routing for secure agent actions.
    -