Tremelay

io.github.CharitonMedia由 GitHub 帳號 CharitonMedia 發布v1.0.3更新於 Oct 24, 2026

Local MCP broker: agents call credentials through a daemon without seeing secrets.

已驗證STDIO僅桌面開發者工具安全與監控

概覽

AI 產生的概覽

本機憑證代理:讓 AI 代理透過限定範圍、會到期的授權使用 API 金鑰與 SSH 金鑰,而始終看不到金鑰本身。

可以做什麼
  • 列出、檢視並呼叫授予某個代理的能力,讓它能用已存憑證執行代理式 HTTP 請求
  • 透過 ssh-agent 通訊端完成 SSH 簽章,私鑰始終留在守護程式內
  • 在命令列管理保險庫、憑證、代理與授權,包括簽發、輪替與撤銷代理權杖
  • 檢視並驗證記錄允許與拒絕嘗試的雜湊鏈稽核日誌
適用情境
當你希望代理用真實憑證呼叫 API 或透過 SSH 推送,但不想把權杖貼進設定檔、環境變數或 MCP 伺服器設定,並且想讓每個代理只擁有範圍窄、可撤銷的授權時使用。
執行需求
以本機程序在使用者機器上執行;清單列出各平台的 MCP Bundle 套件,README 說明以固定版本的 Go 工具鏈安裝。需要本機保險庫檔案、以保險庫路徑啟動的守護程式,以及通關語(在終端機提示輸入,或透過 TREMELAY_PASSPHRASE 提供)。每個代理需要自己的 bearer 權杖檔案。不需帳號、伺服器或網路傳輸。
安裝前請注意
保險庫保存真實密鑰;不建議用 TREMELAY_PASSPHRASE 傳通關語,優先使用終端機提示。守護程式解鎖期間,以你的使用者身分執行的任何程式碼都能使用代理已獲授權的能力。代理式回應會回傳最多 32 KiB 的內容,代理會讀到其中資料,可能含有提示注入。檔案上傳會被拒絕。目前沒有簽章發行與第三方稽核,遺留的 v1 之前授權可能導致保險庫無法解鎖。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Tremelay,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Tremelay

A local credential broker, so your AI agents can use your credentials without ever seeing them.

You already give agents real authority: read these issues, push this branch, call that API. Today that means pasting a token into a config file, an environment variable, or an MCP server, and hoping nothing logs it, echoes it, or wanders off to the wrong host with it.

Tremelay splits possession of a secret from authority to use it. You keep credentials in a local encrypted vault. Each agent gets its own identity and its own narrow, expiring, revocable grants — "GET anything under https://api.github.com/repos/you/yourrepo with this token", "authenticate to git.example.com as git with this SSH key". The agent asks Tremelay to perform the operation; Tremelay performs it with the credential and returns only the result the grant allows. The agent never receives the secret, there is no getSecret tool to call, and every attempt — allowed or denied — lands in a hash-chained audit log.

The broker possesses secrets. Agents possess capabilities.

Agents connect over MCP (list_capabilities, describe_capability, invoke_capability), or over an ssh-agent socket for SSH signing. Everything is local: one SQLite vault file, one user-only socket or named pipe, no server, no account, no telemetry.

Demo

A real session against a throwaway vault. The secret is the literal string dummy-demo-secret. Every command except vault create also writes one vault_unlock id=… result=allowed line to stderr; those are trimmed here, nothing else is.

$ tremelay vault create --path demo.dbvault_create id=d8df6f8230cf55a9a8b1b7c7df424f1a result=allowedvault 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=allowed3a0f2de100565eb2e4be158fdb9a8201
$ 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=alloweda0f8b04d64d8ece4a56130feb2607ce9
$ tremelay capability list --path demo.db --agent $AGENTcapability_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/Tremelaycapability_authorize agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=allowedallowed a0f8b04d64d8ece4a56130feb2607ce9
$ tremelay capability authorize --path demo.db --agent $AGENT --credential $CRED \    --operation http_broker --resource https://api.github.com/repos/someone/elsecapability_authorize agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=denied_scopedenied_scope
$ tremelay grant revoke --path demo.db --id $GRANTgrant_revoke agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=alloweda0f8b04d64d8ece4a56130feb2607ce9
$ tremelay capability authorize --path demo.db --agent $AGENT --credential $CRED \    --operation http_broker --resource https://api.github.com/repos/CharitonMedia/Tremelaycapability_authorize agent=3a0f2de100565eb2e4be158fdb9a8201 grant=a0f8b04d64d8ece4a56130feb2607ce9 result=denied_revokeddenied_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.db84d0bf149dc187c9517fd9a0afce2571fb4fad648cac25ebb5298e5cf68e27a4

Both denials exited non-zero, and no row carries a secret. The passphrase came from TREMELAY_PASSPHRASE; interactively you get a no-echo prompt instead.

Install

Tremelay needs the pinned Go toolchain (1.26.9, see go.mod); go install switches to it for you.

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

From a clone, make build or go build -o tremelay ./cmd/tremelay does the same thing. Check the build with tremelay version (or tremelay --version).

The v1.0.3 release carries per-platform archives named tremelay_<version>_<os>_<arch>.tar.gz (or .zip on Windows). Each archive unpacks to a binary named tremelay (tremelay.exe on Windows) plus LICENSE, along with a CycloneDX SBOM and a SHA256SUMS file — a checksum detects a corrupt download, not a substituted release. It also carries one MCP Bundle per platform, tremelay-mcp_<version>_<os>_<arch>.mcpb, for clients that install MCP Bundles (see the generic MCP quickstart). Signed releases are not in v1. make release-dry builds those artifacts locally; see ADR 0027. Download the archive you want and SHA256SUMS into one directory, then check that archive by name:

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

On macOS, shasum -a 256 -c - in place of sha256sum -c -.

Name the file you downloaded. sha256sum -c --ignore-missing SHA256SUMS over the whole list exits 0 when your archive is the one that failed to download and some other listed file is present.

Quickstarts

Copy-paste setup from install to first successful call, one page per client: docs/quickstarts/ (Claude Code, Codex, Hermes, generic MCP).

The shape is the same everywhere. tremelay daemon --vault PATH prompts for your passphrase at a terminal (non-empty TREMELAY_PASSPHRASE works without a prompt but is not recommended; see passphrase from the environment) and then serves agents on a user-only local socket; tremelay agent create --token-file FILE gives each agent its own bearer token file, and tremelay agent token issue|rotate|revoke manage it later without recreating the agent; tremelay mcp --daemon --token-file FILE is the stdio command the client launches. tremelay lock, the idle timeout, or losing the process zeroises the key. See the headless daemon guide, or local stdio MCP for the per-launch pinentry path instead. For SSH, tremelay ssh-agent publishes an SSH_AUTH_SOCK that signs with a key that never leaves the daemon.

What it does not do

Read this before you trust it with anything.

  • One human. Single user, single vault. No multi-user, no orgs, no shared vaults, no team policy.
  • One machine. A user-only Unix socket or Windows named pipe, and stdio; there is no network or remote MCP transport. tremelay ssh-agent is Linux and macOS only and fails closed on Windows.
  • The agent still reads broker responses. An http_broker grant returns the status code, an allowlisted set of response headers, and up to 32 KiB of the body with the credential redacted in its common encodings (raw, URL, base64, hex, JSON-escaped). The agent never sees the credential, but it does see the data that credential unlocks — and anything in that body can be prompt injection (H1). A hostile upstream that deliberately re-encodes or splits the credential is not caught; grant only origins you trust with the credential.
  • No file uploads through the broker. A brokered request with a multipart body (multipart/form-data, file uploads) is refused as denied_malformed. Send JSON or a urlencoded form instead.
  • An unlocked daemon trusts your uid. While it is unlocked, any code running as you can use your agents' granted capabilities. It still cannot read a credential, change a grant, or learn your passphrase, and everything it does is audited — but that is the boundary.
  • No OAuth refresh brokering, no database session brokering, no browser form fill, no TOTP, no provider-assisted rotation. These are in VISION.md and on the roadmap, not in v1.
  • No third-party audit. No independent security review and no signed releases yet. The audit chain is tamper-evident to you; nobody else checkpoints it.
  • credential get prints the raw secret. That is the human control plane, by design — it is not reachable from any agent interface.
  • Legacy GitHub issue grants block unlock (H2). A vault that still holds a pre-v1 github_issue_state grant will not unlock until that grant is revoked with the pre-v1 binary.

Security

Docs

ARCHITECTURE.md · VISION.md · ADRs · vault lifecycle · HTTP broker · SSH signing · measured client integrations · what is in v1 · milestone history

tremelay --help prints the full command list.

Contributing

CONTRIBUTING.md. Apache License 2.0; see LICENSE.

來源:README.md,提交 09d7216

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v1.0.3最新Oct 16, 2026
  2. v1.0.2Oct 16, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。