
Arcaeon Adapter
io.arcaeon由 arcaeon.io 發布v0.2.0更新於 Oct 24, 2026
MCP stdio proxy that logs the tool-call seam to the ledger without the agent's cooperation
概覽
一個本機 stdio 代理,位於 MCP 用戶端與伺服器之間,不需代理配合即可把每次工具呼叫記錄到雜湊鏈帳本。
- 可以做什麼
- 它包裝任意 MCP 伺服器指令,逐位元組轉送 JSON-RPC,並為每次 tools/call 寫入一列雜湊鏈紀錄:呼叫的工具、參數與結果的摘要、成功或錯誤、以及耗時。它也會記錄工作階段開始與結束、initialize 和 tools/list 事件,並記錄始終未獲回應的呼叫。預設只保存摘要而非原始酬載,--raw 選項會嵌入原始酬載。產生的日誌可用搭配的 arcaeon-ledger 命令列工具驗證,能指出鏈斷裂的具體行。
- 適用情境
- 當你希望自動、可防竄改地記錄經過某個 MCP 接縫的全部內容,而不是依賴代理自行記錄其動作時,可以使用它。它適用於對被包裝的 MCP 伺服器的工具呼叫進行稽核或複核。它只涵蓋被包裝的那一個接縫,不涵蓋其他工具或直接發起的網路呼叫。
- 執行需求
- 以本機程序在使用者機器上執行(僅桌面端,stdio 傳輸)。透過 pip 安裝(arcaeon-adapter,可選 arcaeon-ledger)。未宣告任何帳號、API 金鑰、環境變數或標頭,執行時也不進行網路呼叫。設定方式是用 --ledger 路徑包裝現有的 MCP 伺服器指令。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Arcaeon Adapter,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
arcaeon-adapter
arcaeon-ledger proves a record wasn't altered. It can't prove the record is complete — because the agent decides what to write. This moves the pen.
arcaeon-adapter is a stdio proxy that sits between an MCP client and an MCP
server. It forwards JSON-RPC byte-for-byte, and on every tools/call it writes
one hash-chained row to its own ledger: which tool, digests of the arguments and
the result, ok or error, how long it took.
It runs in its own OS process. The agent is not consulted, cannot skip it, and cannot see it.
Wrap any MCP server's command — one line of config, zero code:
Or straight from a shell:
What lands in the log
Real rows, from wrapping arcaeon-ledger's own MCP server (the ledger logging
itself through the ledger), trimmed for width. Captured on adapter 0.1.0 with
ledger 0.5.7; a current run stamps the installed versions in seam_impl and
ledger_backend:
In that same run, the wrapped server's own log — the diary it keeps when the
agent remembers to call ledger_append — had one row. The seam log had six.
That difference is the entire product.
Digests, not payloads, by default. The row proves which bytes crossed the
seam without keeping them. An audit log that quietly becomes a copy of every
prompt and every result is a liability, not an asset — and a person-free core is
much easier to retain for years. --raw embeds the payloads for deployers who
own that risk; the digests stay either way.
A call that never gets an answer still gets a row (status: "unanswered").
Otherwise "kill the server mid-call" would be a way to make an action leave no
trace at the seam, which is the exact hole this exists to close.
Verify it
The seam log is an ordinary arcaeon-ledger file:
Edit a row, delete one, reorder them — every later link breaks and verify names
the exact line.
The honest limit
An adapter on one seam logs that seam completely — and nothing else. An agent can still act around it: a direct HTTP call, an un-wrapped MCP server, a shell command never crosses this proxy and never hits this ledger. The second-set-of-books problem does not go away; no logging layer can force total honesty. What the adapter guarantees is narrower and real: everything that crossed the instrumented seam is in the record, automatically, and the record proves itself. Honesty is forced at the seams, not everywhere — not a lock, a neighborhood.
Specifically blind to:
- your harness's built-in tools (Bash, file edits, web fetch) — they never touch MCP
- any MCP server you did not wrap
- HTTP the agent makes natively
- the model's reasoning, which is not an action and leaves no wire trace
- frames larger than
--max-frame(relayed fine; counted and reported insession_endasoversize_frames_unlogged, never a silent gap)
And on compliance, plainly: this does not make anyone compliant with anything. Regulations like the EU AI Act's Art. 12 place duties on a provider or deployer, and duties land on people, not libraries. What this is: a mechanism that makes recording at one seam automatic rather than voluntary, which is a thing you would otherwise have to build. Retention policy, log semantics, risk classification, and every other obligation remain yours. Anyone selling you a package that "makes you compliant" is selling you a story.
Whoever controls the config can also remove the wrapper. That is the same class of limit every logging layer has, and it is stated here rather than in a footnote.
Fidelity is the P0 property
A proxy that corrupts, reorders, or delays a customer's JSON-RPC is worse than no proxy at all. So the design puts fidelity ahead of observation, structurally:
- Bytes are forwarded first, observed second, from a copy. A parsing defect here cannot alter or withhold traffic; the worst it can do is produce a wrong row.
- Raw binary end to end. No text mode anywhere — on Windows that would rewrite
\nas\r\nand silently alter every frame. - No reframing, ever. We never parse a frame and re-emit it. The classic proxy
bug is
json.dumps(json.loads(frame)): semantically identical, byte-different. - One thread per direction, so ordering within a direction is the OS's.
- The child's stderr is inherited, not piped. Its diagnostics land exactly where they did unwrapped, and the proxy itself prints nothing on an honest run.
- Malformed frames are relayed untouched and not logged. A server that prints a stray line to stdout keeps working; we don't guess, because a guess in an audit record is fiction.
- The child's exit code is the proxy's exit code.
This is tested by running a scripted client against a synthetic MCP server directly, then through the proxy, and requiring the two stdout streams to be identical bytes — including a 4 MB frame spanning ~64 pipe reads, unicode, embedded CRLF, malformed lines, a notification with no id, and a final frame with no trailing newline.
Prove the checks can fail
An instrument that has never failed proves nothing. Every case runs GREEN on a
clean fixture, then mutates and requires the same check to go RED — with a
no-op guard in between, because a mutation that changes nothing proves nothing
either. Output abridged (two header lines and the tail of each PASS line cut;
the drop_byte length differs by a byte or two between runs):
The fidelity mutations are injected into the real relay, not a mock, so what's proven is that the comparison would catch a regression in the shipping code path.
Options
Install and dependencies
Stdlib only at runtime. arcaeon-ledger is the intended writer and is what makes
a row provable — but it is not a hard dependency, on purpose: this gets
wrapped around somebody else's working MCP server by editing one line of config,
and a missing package must never be why their server fails to start. Without it,
rows are written by a byte-compatible fallback and session_begin says so in
ledger_backend, so a reviewer never has to guess which writer produced a chain.
(That byte-compatibility is asserted in the test suite, not just claimed here.)
No network calls at runtime. Ever.
Status
v0. Works, tested, dogfooded on our own MCP server. Deliberately not yet built:
--authority stamping, --bind-inputs artefact binding, --auto-pin witness
publication, and harness-hook / HTTP-gateway seams. See CHANGELOG.md.
MIT.
來源:adapter/README.md,提交 4aaceaf
工具
0版本歷史
2- v0.2.0最新Sep 23, 2026
- v0.1.4Sep 23, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分
