mcpField
T
Tremelay

Tremelay

ローカル
github.com/CharitonMediaセキュリティ12 週間前に更新

Tremelay について

Tremelayは、AIエージェントに秘密情報を渡さずに認証情報を使わせるローカルブローカーです。暗号化された保管庫に認証情報を保存し、範囲を限定した取り消し可能な操作を仲介して監査ログに記録します。

主な機能

  1. 01ローカルの暗号化認証情報保管庫
  2. 02エージェントごとのIDと権限
  3. 03期限付きで取り消し可能なアクセス
  4. 04許可・拒否の試行を記録
  5. 05エージェントソケット経由のSSH署名

活用シーン

  1. 01トークンを開示せずにエージェントへAPIリクエストを許可
  2. 02リポジトリへの限定的な一時アクセスを付与
  3. 03鍵を共有せずにSSH鍵で署名

MCP 対応

エージェントはMCP経由で`list_capabilities`、`describe_capability`、`invoke_capability`を使用して接続します。Tremelayは保存した認証情報で許可された操作を実行し、認可された結果を返します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
mcpbtremelay-mcp_v1.0.3_linux_amd64.mcpb
mcpbtremelay-mcp_v1.0.3_linux_arm64.mcpb
mcpbtremelay-mcp_v1.0.3_darwin_amd64.mcpb
mcpbtremelay-mcp_v1.0.3_darwin_arm64.mcpb
mcpbtremelay-mcp_v1.0.3_windows_amd64.mcpb
mcpbtremelay-mcp_v1.0.3_windows_arm64.mcpb

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

Tremelay

AI エージェントが認証情報を見ることなく利用できる、ローカルの認証情報ブローカーです。

エージェントに、すでに実際の権限を与えています。たとえば、この課題を読む、このブランチをプッシュする、あの API を呼び出す、といった権限です。現状では、設定ファイルや環境変数、MCP サーバーにトークンを貼り付けて、ログに記録されたり、表示されたり、誤ったホストに持ち出されたりしないことを願うしかありません。

Tremelay は、シークレットの保有と、それを使う権限を切り分けます。認証情報はローカルの暗号化された保管庫に保存します。各エージェントには個別の ID と、対象を限定でき、有効期限があり、取り消し可能な権限を付与します。たとえば、「このトークンを使って https://api.github.com/repos/you/yourrepo 以下のすべてに対して GET を実行する」「この SSH キーを使って git として git.example.com に認証する」といった権限です。エージェントは Tremelay に操作を依頼し、Tremelay が認証情報を使って操作を実行し、権限で許可された結果だけを返します。エージェントがシークレットを受け取ることはなく、呼び出せる getSecret ツールもありません。許可された試行も拒否された試行も、すべてハッシュチェーン形式の監査ログに記録されます。

ブローカーはシークレットを保有します。エージェントはケイパビリティを保有します。

エージェントは MCP(list_capabilities、describe_capability、invoke_capability)または SSH 署名用の ssh-agent ソケット経由で接続します。すべてローカルで動作します。SQLite の保管庫ファイルが 1 つ、ユーザー専用のソケットまたは名前付きパイプが 1 つだけで、サーバーもアカウントもテレメトリーもありません。

デモ

使い捨ての保管庫を使った実際のセッションです。シークレットは文字列 dummy-demo-secret です。vault create 以外の各コマンドは、stderr に vault_unlock id=… result=allowed の行も 1 行出力します。ここではその行だけを省略しており、ほかは何も省略していません。

$ tremelay vault create --path demo.db
vault_create id=d8df6f8230cf55a9a8b1b7c7df424f1a result=allowed
vault created

$ CRED=$(tremelay credential put --path demo.db --label "demo api key" --type api_key --secret-file ./secret)
credential_put id=649cee93880ae731b17ea858a439d7fe type=api_key result=allowed reasons=
health_assess id=649cee93880ae731b17ea858a439d7fe type=api_key result=allowed reasons=
649cee93880ae731b17ea858a439d7fe

$ AGENT=$(tremelay agent create --path demo.db --label claude-code)
agent_create agent=3a0f2de100565eb2e4be158fdb9a8201 grant= result=allowed
3a0f2de100565eb2e4be158fdb9a8201

$ GRANT=$(tremelay grant create --path demo.db --agent $AGENT --credential $CRED \
    --operation http_broker --resource https://api.github.com/repos/CharitonMedia/Tremelay \
    --method GET --inject bearer --expires 2030-01-01T00:00:00Z)
grant_create agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=allowed
a0f8b04d64d8ece4a56130feb2607ce9

$ tremelay capability list --path demo.db --agent $AGENT
capability_list agent=3a0f2de100565eb2e4be158fdb9a8201 grant= result=allowed
{"grant_id":"a0f8b04d64d8ece4a56130feb2607ce9","agent_id":"3a0f2de100565eb2e4be158fdb9a8201","credential_id":"649cee93880ae731b17ea858a439d7fe","operations":["http_broker"],"resource":"https://api.github.com/repos/CharitonMedia/Tremelay","created_at":"2026-10-14T04:20:00.618845291Z","expires_at":"2030-01-01T00:00:00Z","status":"active"}

$ tremelay capability authorize --path demo.db --agent $AGENT --credential $CRED \
    --operation http_broker --resource https://api.github.com/repos/CharitonMedia/Tremelay
capability_authorize agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=allowed
allowed a0f8b04d64d8ece4a56130feb2607ce9

$ tremelay capability authorize --path demo.db --agent $AGENT --credential $CRED \
    --operation http_broker --resource https://api.github.com/repos/someone/else
capability_authorize agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=denied_scope
denied_scope

$ tremelay grant revoke --path demo.db --id $GRANT
grant_revoke agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=allowed
a0f8b04d64d8ece4a56130feb2607ce9

$ tremelay capability authorize --path demo.db --agent $AGENT --credential $CRED \
    --operation http_broker --resource https://api.github.com/repos/CharitonMedia/Tremelay
capability_authorize agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=denied_revoked
denied_revoked

$ tremelay audit list --path demo.db --agent $AGENT --action capability_authorize
{"seq":12,"time":"2026-10-14T04:20:00.755379639Z","action":"capability_authorize","credential_id":"649cee93880ae731b17ea858a439d7fe","credential_type":"api_key","result":"allowed","agent_id":"3a0f2de100565eb2e4be158fdb9a8201","grant_id":"a0f8b04d64d8ece4a56130feb2607ce9","operation":"http_broker","class":"routine","severity":"info","hash":"bcf38c87bf3038dafc6f1b0c52be3cb6b213cd202096d481370373e3abf847ab"}
{"seq":14,"time":"2026-10-14T04:20:00.821094153Z","action":"capability_authorize","credential_id":"649cee93880ae731b17ea858a439d7fe","credential_type":"api_key","result":"denied_scope","agent_id":"3a0f2de100565eb2e4be158fdb9a8201","grant_id":"a0f8b04d64d8ece4a56130feb2607ce9","operation":"http_broker","class":"expected_denial","severity":"low","hash":"2d2432203b7bbacf562c4f0433090f0647037d746e6d689492c44f25e3b2d2b1"}
{"seq":18,"time":"2026-10-14T04:20:00.951247858Z","action":"capability_authorize","credential_id":"649cee93880ae731b17ea858a439d7fe","credential_type":"api_key","result":"denied_revoked","agent_id":"3a0f2de100565eb2e4be158fdb9a8201","grant_id":"a0f8b04d64d8ece4a56130feb2607ce9","operation":"http_broker","class":"replay","severity":"high","hash":"f8b19ee681e76b1b6fc813116232e732e57644d47ebd3afbefab0a8e23ce2cf1"}

$ tremelay audit verify --path demo.db
84d0bf149dc187c9517fd9a0afce2571fb4fad648cac25ebb5298e5cf68e27a4

どちらの拒否もゼロ以外の終了コードを返し、シークレットを含む行はありません。パスフレーズは TREMELAY_PASSPHRASE から取得しました。対話形式では、入力が表示されないプロンプトが使われます。

インストール

Tremelay には固定された Go ツールチェーン(1.26.9、go.mod を参照)が必要です。go install を使うと、適切なツールチェーンに自動で切り替わります。

go install github.com/CharitonMedia/Tremelay/cmd/[email protected]

クローンしたリポジトリから make build または go build -o tremelay ./cmd/tremelay を実行しても同じです。tremelay version(または tremelay --version)でビルドを確認してください。

v1.0.3 リリースには、プラットフォームごとのアーカイブ tremelay_<version>_<os>_<arch>.tar.gz(Windows では .zip)が含まれています。各アーカイブを展開すると、tremelay という名前のバイナリ(Windows では tremelay.exe)と LICENSE、CycloneDX SBOM、SHA256SUMS ファイルが展開されます。チェックサムで検出できるのはダウンロードの破損であり、リリースの差し替えではありません。また、MCP Bundle をインストールできるクライアント向けに、プラットフォームごとの MCP Bundle tremelay-mcp_<version>_<os>_<arch>.mcpb も含まれています(MCP の一般的なクイックスタートを参照)。v1 では署名付きリリースはありません。make release-dry を実行すると、これらの成果物をローカルでビルドできます。ADR 0027を参照してください。ダウンロードするアーカイブと SHA256SUMS を同じディレクトリに置き、アーカイブの名前を指定して検証します。

grep tremelay_v1.0.3_linux_amd64.tar.gz SHA256SUMS | sha256sum -c - &&
  tar -xzf tremelay_v1.0.3_linux_amd64.tar.gz &&
  ./tremelay version

macOS では、sha256sum -c - の代わりに shasum -a 256 -c - を使います。

ダウンロードしたファイルの名前を指定してください。リスト全体に対して sha256sum -c --ignore-missing SHA256SUMS を実行すると、アーカイブのダウンロードに失敗し、リストにある別のファイルが存在している場合でも、終了コード 0 が返されます。

クイックスタート

インストールから最初の呼び出しが成功するまでの設定をコピー&ペーストで行えます。クライアントごとに 1 ページです: docs/quickstarts/(Claude Code、Codex、Hermes、汎用 MCP)。

どのクライアントでも手順は同じです。tremelay daemon --vault PATH はターミナルでパスフレーズを求め(空でない TREMELAY_PASSPHRASE を設定すればプロンプトなしで動作しますが、推奨しません。環境変数からのパスフレーズを参照してください)、ユーザー専用のローカルソケットでエージェントにサービスを提供します。tremelay agent create --token-file FILE は各エージェントに専用のベアラートークンファイルを作成します。tremelay agent token issue|rotate|revoke を使えば、エージェントを再作成せずに後からトークンを管理できます。tremelay mcp --daemon --token-file FILE は、クライアントが起動する stdio コマンドです。tremelay lock、アイドルタイムアウト、またはプロセスの終了により、鍵はゼロ化されます。ヘッドレスデーモンガイド、または代わりに起動ごとに pinentry を使用する場合はローカル stdio MCPを参照してください。SSH では、tremelay ssh-agent が SSH_AUTH_SOCK を公開し、デーモンから外に出ることのない鍵で署名します。

このツールが行わないこと

何かを任せる前に、こちらをお読みください。

  • 1 人の人間向けです。 単一ユーザー、単一の保管庫です。マルチユーザー、組織、共有保管庫、チームポリシーには対応していません。
  • 1 台のマシン向けです。 ユーザー専用の Unix ソケットまたは Windows 名前付きパイプと stdio を使用します。ネットワークやリモート MCP トランスポートはありません。tremelay ssh-agent は Linux と macOS のみ対応しており、Windows ではフェイルクローズします。
  • エージェントはブローカーの応答を引き続き読み取れます。 http_broker の許可は、ステータスコード、許可リストにある応答ヘッダー、および一般的なエンコーディング(生データ、URL、base64、hex、JSON エスケープ)で認証情報を秘匿した最大 32 KiB の本文を返します。エージェントが認証情報そのものを見ることはありませんが、その認証情報でアクセスできるデータは見えます。また、本文内の情報はすべてプロンプトインジェクション(H1)になり得ます。意図的に認証情報を再エンコードしたり分割したりする悪意ある上流サービスは検出されません。認証情報を信頼して預けられるオリジンのみを許可してください。
  • ブローカー経由のファイルアップロードには対応していません。 マルチパート本文(multipart/form-data、ファイルアップロード)を含むブローカー経由のリクエストは、denied_malformed として拒否されます。代わりに JSON または URL エンコードされたフォームを送信してください。
  • ロック解除中のデーモンは、ユーザーの uid を信頼します。 ロック解除中は、あなたとして実行される任意のコードが、エージェントに許可された機能を利用できます。それでも認証情報の読み取り、許可の変更、パスフレーズの取得はできず、すべての操作は監査されます。ただし、これが信頼境界です。
  • OAuth 更新のブローカー処理、データベースセッションのブローカー処理、ブラウザでのフォーム入力、TOTP、プロバイダー支援によるローテーションには対応していません。 これらは VISION.md とロードマップに記載されており、v1 には含まれません。
  • 第三者による監査はありません。 独立したセキュリティレビューも、署名付きリリースもまだありません。監査チェーンが改ざんされていないことを確認できるのはあなただけで、ほかの誰もチェックポイントを記録しません。
  • credential get は生のシークレットを表示します。 これは意図された人間向けの制御プレーンであり、どのエージェントインターフェースからもアクセスできません。
  • レガシーな GitHub issue の許可があると、ロック解除が阻止されます(H2)。 v1 より前の github_issue_state の許可が残っている保管庫は、v1 より前のバイナリでその許可を取り消すまでロック解除できません。

セキュリティ

ドキュメント

ARCHITECTURE.md · VISION.md · ADR · 保管庫のライフサイクル · HTTP ブローカー · SSH 署名 · 実測済みクライアント統合 · v1 に含まれるもの · マイルストーンの履歴

tremelay --help でコマンド一覧全体を表示できます。

コントリビューション

CONTRIBUTING.md。Apache License 2.0。詳しくは LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。