Warda

io.github.ArtyKOMarkets由 GitHub 帳號 ArtyKOMarkets 發布v0.4.2更新於 Oct 24, 2026

Economic authority for autonomous agents on Kaspa L1. Never holds a key.

已驗證Streamable HTTP可網頁執行金融開發者工具

概覽

AI 產生的概覽

Warda 讓助理在 Kaspa 上掌握代理的支出權限,並建構未簽章的交易,用於支出、委派、結算、撤銷或復原授權。

可以做什麼
檢視授權:錢包檢視、目前支出權限、推導出的鏈上地址,以及從花用過該授權的交易中復原授權。動作前先檢查:依契約規則驗證擬議付款或擬議子授權,被拒時給出具體原因。建構未簽章交易:支出、委派、結算與退出(撤銷或取回),回傳待簽章的摘要。在 Warda 服務登錄中依能力與最高價格篩選可付款的服務。
適用情境
當代理框架需要在 Kaspa 上依 Warda 契約規劃與執行付款、又不想自行撰寫 Kaspa 整合時使用:查詢可用額度、避免鏈上會拒絕的交易、把權限細分給子代理,或復原本地紀錄已過期的授權。
執行需求
可作為遠端端點執行,也可透過 npx 從 npm 套件 @warda_protocol/mcp 在本機執行(需要 Node.js)。伺服器本身不需要 Kaspa 節點或金鑰。選用環境變數 WARDA_TEMPLATE 可覆寫契約範本路徑。呼叫端需提供授權描述與目前 UTXO;簽章與廣播在伺服器之外完成。
安裝前請注意
它會建構真正轉移資金的交易;簽章與廣播由你完成,簽章前請核對位元組。'permitted' 結論僅供參考,不具強制力。收款方不在允許清單中時它會拒絕建構支出。授權地址在每次支出後都會變動,過期紀錄或 UTXO 可能導致資金無法取回。WARDA_TEMPLATE 必須與授權的契約版本一致,不一致會默默推導出錯誤地址。

安裝

在 SourceWeft 中

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

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.ArtyKOMarkets%2Fwarda/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "warda": {
      "type": "http",
      "url": "https://mcp.wardaprotocol.com/mcp"
    }
  }
}

README

@warda_protocol/mcp

An MCP server that lets an agent framework reason about its own economic authority, and drive a grant's whole life — spend, delegate, settle, revoke, and find it again when the record goes stale — without a Kaspa integration.

Nothing to install and no Kaspa of your own. Put this in your client's config — claude_desktop_config.json for Claude Desktop, .cursor/mcp.json for Cursor — and restart it:

json
{  "mcpServers": {    "warda": { "command": "npx", "args": ["-y", "@warda_protocol/mcp"] }  }}

Cold, with an empty npm cache, that is about seven seconds to eleven tools.

bash
npx -y @warda_protocol/mcp     # the same thing, by hand, speaking stdio

From a checkout instead:

bash
node --experimental-strip-types src/server.ts    # stdionpm test                                          # 34 tests, real transport

That last pair used to be the whole of this section, which was the wrong instruction for the only readers this file has: people who arrive from the MCP registry and will never clone anything.

It builds. It does not sign, and it does not enforce.

warda_build_spend returns an unsigned transaction and the digest to sign. This server never sees a key. Whoever holds the agent key signs the digest wherever that key lives, splices the 65 bytes into the fixed-width slot, and broadcasts. An MCP server that signed would be a custodian, and the point of Warda is that nobody has to be.

A test asserts the signature slot in every built transaction is still 65 zero bytes, and that no key material appears anywhere in the response.

This does not enforce anything

An agent is free to ignore every answer this server gives, build the transaction anyway, and broadcast it. The covenant will refuse it. Warda's security has never depended on the agent asking permission first — that is the entire premise, and a server that implied otherwise would contradict the protocol it serves.

Every response says so, in a field called enforcement, and a test asserts it is there.

So what is it for

  • Headroom. An agent planning a purchase needs the largest payment it may currently make. That is not any single field — it is the minimum of remaining budget, epoch headroom, and per-transaction cap. warda_grant_authority computes it.
  • Not wasting transactions. A spend the covenant will refuse costs a fee and a round trip. Checking first is cheaper.
  • Rejections in words. On-chain, every failed rule collapses into one opaque script error. Here a refusal names the rule and says what to do about it — "larger than the per-transaction cap; split it or ask the principal to raise the cap" rather than VerifyError.
  • Discovery. A framework speaking MCP finds Warda without a custom integration, which is the point of §20 in the spec.

The rules live in one place

Every verdict comes from @warda_protocol/core — the same code the covenant was verified against, sharing the same 45 tests. This server carries no copy of the protocol rules.

That constraint is deliberate. A second implementation of the rules would drift, and the failure mode is bad in both directions: telling an agent it may spend when the chain will refuse wastes money, and telling it that it may not when the chain would allow it silently strands funds. One source, or none.

Tools

ToolAnswers
warda_walletThe whole wallet view: address, limits, spending power, allowlist.
warda_grant_authorityWhat may this agent spend right now?
warda_grant_addressWhere does this grant live?
warda_check_spendWould this payment be accepted, and if not, why?
warda_check_delegationIs this child grant a legal narrowing?
warda_build_spendBytes to sign for this payment.
warda_build_delegationBytes to sign to subdivide this grant.
warda_build_settlementBytes to sign to collapse a child back into its parent.
warda_build_exitBytes to sign to revoke this grant, or reclaim it after expiry.
warda_recover_grantFind a grant again from a transaction that spent it.

Four of these were missing for a while, and the shape of the gap is worth stating: an agent could ask what it may spend and get a spend built, and nothing else in a grant's life was reachable. A monitor that noticed misbehaviour could file a report and not act on it. A caller whose record had fallen behind had no way back to the grant at all.

It says "wallet", and then says what it is not

warda_wallet uses the word a developer arrives with, and the moment a tool does that the obvious next field is a balance. This server has no node. Every figure it returns comes from the descriptor it was handed, so an on-chain balance is deliberately absent and says so in the response rather than being quietly omitted — a balance derived from a stale record is the failure this protocol keeps meeting, and it is the one that looks most like success.

A test asserts the absence, so that giving this server a node later is a decision somebody makes rather than something autocomplete does.

It composes warda_grant_address and warda_grant_authority and computes nothing new. Two calls that every framework was going to assemble slightly differently is one implementation of the accounting too many.

Where a grant lives, and why that keeps moving

A grant's address is a hash of its state, so it changes after every spend and every delegation. Yesterday's address holds nothing today, and an empty address is indistinguishable from a grant that was never funded. This is the single fact that trips up every integration, so warda_grant_address exists to answer it directly, and every builder returns where the grant lands next.

Finding a grant you have lost

Kaspa's P2SH requires the covenant script to travel in the clear inside the signature script of every transaction that spends it — the network cannot check the hash otherwise — and a grant's state is spliced into that script at known offsets. So every spend publishes the grant it spent, whether the spender meant to or not. warda_recover_grant reads it back and walks forward to where the grant is now.

Without that, a grant is reachable only through a record on somebody's disk: lose it and the coin is perfectly valid on chain and simply unreachable. A protocol whose argument is that limits live in consensus should not have its recoverability live in a filesystem.

Settlement, and why it is not the same as waiting

A child grant that expires returns its balance to the principal — to the human. A child that is settled returns its unspent remainder to the parent agent's budget, charging the parent only what the child actually spent. That difference is the whole reason settlement exists: an agent halfway through a task cannot use money that has gone back to its owner.

warda_build_settlement returns two digests, deliberately unmerged. The parent's half is signed by the parent's agent key; the child's by the revocation key, because collapsing a grant is a revocation of it and a sub-agent must not be able to end its own grant on terms it picks.

It needs one number that cannot be derived from anything on chain: the parent's reserve root from before that child was pushed. The reserve is a hash chain, and popping one means supplying the preimage. warda_build_delegation returns it as parentReserveRootBefore — keep it.

warda_build_spend builds the transaction even when the advisory verdict says no, and reports the verdict alongside. That direction is deliberate: a local rule that is too strict must not be able to block a payment the chain would accept. Refusing costs a fee; blocking costs a capability.

It does refuse one thing outright — a payee that is not on the allowlist. No proof places it in the tree, so no valid transaction exists; fabricating a borrowed proof would make the covenant's rejection look like a bug in the tree rather than a payee that is not on the list.

Wiring it up

json
{  "mcpServers": {    "warda": {      "command": "npx",      "args": ["-y", "@warda_protocol/mcp"]    }  }}

Where the bytes come from

warda_build_spend assembles through @warda_protocol/kaspa, which is checked against golden-spend.json — a reference transaction produced by the same Rust path that put a spend on testnet-10. mcp/test/build.test.ts closes the last gap: it describes that same grant the way an agent framework would, in decimal KAS and named recipients, and requires the result to come out byte-identical.

That matters because three things sit between the two vocabularies — a decimal parser, a Merkle tree built by different code than the SDK's, and a struct laid out by field order. None of them is a rule, so none can wrongly permit a spend. All of them can produce bytes the chain refuses, silently, and only when real money is at stake.

Not built yet

No chain access. The server cannot find the grant's current UTXO — you pass it in. A grant's address moves after every spend, so a stale UTXO will simply not be found. (@warda_protocol/kaspa will find it for you: NodeClient.open takes a node URL, a list of them, or a Kaspa Resolver, and refuses a node that would answer wrongly.)

No broadcasting. A built spend is an ordinary transaction; submit it with whatever node client you already have.

The template is not a parameter, on purpose. It is loaded from disk (WARDA_TEMPLATE overrides the path). A caller-supplied template is the softest attack surface in the protocol: swap it and every address is wrong, so the grant pays into a script nobody can ever spend.

來源:mcp/README.md,提交 7beecde

工具

11

warda_grant_authority

What may this agent spend?

The agent's spending power right now: budget left, epoch headroom, per-transaction cap, and the largest single payment currently permitted. This is what an agent wallet's spending limit would tell you, except that it is not a setting — the covenant enforces these whether or not you ask. Use it before planning a purchase. NOT a chain balance: this server never reads the chain. It reports what the grant you passed says, so a stale descriptor gives a confident wrong number.

輸入參數grant必填daaScore必填

warda_check_spend

Would this payment be allowed?

Check a proposed payment against every rule the covenant enforces, and return the same verdict the chain would. Builds the recipient proof for you. ADVISORY: a 'permitted' answer is not permission — it means the covenant would accept this transaction. A 'refused' answer means no valid transaction exists, so broadcasting one would only waste a fee.

輸入參數grant必填daaScore必填amountKas必填recipient必填

warda_check_delegation

Would this delegation be allowed?

Check whether a proposed child grant is a legal narrowing of this one. A child may only ever be more restrictive than its parent, and the parent must reserve exactly what the child receives — authority is subdivided, never created. Advisory.

輸入參數parent必填daaScore必填childAgentKey必填childBudgetKas必填childEpochLimitKas必填childMaxPerSpendKas必填

warda_build_spend

Build a payment for me to sign

Assemble an unsigned Kaspa transaction that spends from this grant, and return the digest to sign. THIS SERVER NEVER SEES YOUR KEY and never signs: it hands back bytes, and you sign the digest wherever your key lives. It also returns the advisory verdict, but it builds the transaction either way — a local rule that is too strict must not be able to block a payment the chain would accept. If the verdict says refused, broadcasting will cost a fee and fail.

輸入參數utxo必填grant必填daaScore必填feeSompiamountKas必填recipient必填computeBudget

warda_wallet

Show me this agent's wallet

The whole wallet view in one call: the grant's current address, its spending limits, the largest payment permitted right now, and every address it is allowed to pay. This is the agent-wallet shape — address, limits, spending power — with one difference worth knowing: the limits are not settings this server or your code applies. They are in the script that unlocks the coin, so a payment outside them is not refused, it is a transaction that does not exist. NO CHAIN READ: this server never connects to a node. Every figure comes from the grant descriptor you passed, so an on-chain balance is deliberately absent — reporting one from a stale record is the failure this whole protocol keeps meeting.

輸入參數grant必填prefixdaaScore必填

warda_grant_address

Where does this grant live right now?

Derive the on-chain address of a grant from its terms and current state. A grant's address is a HASH of its state, so it MOVES after every spend and every delegation — an address that worked yesterday holds nothing today. Use this to know which address to fund, watch, or look up.

輸入參數grant必填prefix

warda_recover_grant

Find a grant again from a transaction that spent it

Read a grant's full state back out of any transaction that spent it, and work out where it went. Use this when a grant's recorded state is stale, wrong, or lost and its address turns up empty. Kaspa's P2SH requires the covenant script to travel in the clear inside every spending transaction, and the grant's state is spliced into that script — so every spend publishes the grant it spent. Pass the transaction as wire JSON, or just the redeem script hex if that is all you have.

輸入參數prefixtransactionredeemScriptHex

warda_build_delegation

Build a delegation for me to sign

Assemble an unsigned transaction that subdivides this grant into a child for a sub-agent, and return the digest to sign with the PARENT's agent key. THIS SERVER NEVER SEES YOUR KEY. A child can only ever be more restrictive than its parent, and the parent reserves exactly what the child receives — authority is subdivided, never created. Narrowing the child's allowlist needs the parent's full member list, because the witness is a path through the parent's tree and a root alone cannot produce one.

輸入參數utxo必填parent必填prefixfeeSompichildAgentKey必填computeBudgetchildBudgetKas必填childExpiresAtchildNotBeforechildRecipientsparentRecipientschildEpochLimitKas必填另有 2 個

warda_build_settlement

Build a settlement, collapsing a child back into its parent

Assemble an unsigned transaction that ends a child grant and returns its UNSPENT remainder to the parent's budget, charging the parent only what the child actually spent. This is the other half of delegation: letting a child expire instead returns the money to the PRINCIPAL — to the human — which is no use to an agent mid-task. Returns TWO digests: the parent's half is signed by the parent's agent key, the child's by the revocation key. THIS SERVER NEVER SEES EITHER. prevRoot is the parent's reserve root from before this child was pushed; warda_build_delegation returns it as parentReserveRootBefore. It cannot be derived from anything on chain — a hash chain pops by preimage.

輸入參數child必填parent必填prefixfeeSompiprevRoot必填childUtxo必填parentUtxo必填computeBudget

warda_build_exit

Build a revocation or a reclaim

Assemble an unsigned transaction that ENDS this grant and sweeps its balance to the principal. 'revoke' is the emergency stop, signed by the revocation key, effective the moment it confirms — the agent cannot stop it and cannot outrun it beyond the limits it already had. 'reclaim' is the same sweep after the window has closed, signed by the principal key; the covenant enforces the timing with a CLTV, so a reclaim built early simply will not run. THIS SERVER NEVER SEES A KEY. This is the tool a monitor calls when a grant is behaving badly and something has to act.

輸入參數kind必填utxo必填grant必填feeSompilockTimecomputeBudget

warda_find_service

What can this agent buy, and for how much?

Search the Warda service registry for endpoints an agent holding a grant can pay. Filters are a conjunction: a service must offer EVERY capability asked for and be at or under maxPrice. WHAT IS VERIFIED: that the operator controls the key the service is paid at, and that the listing was served from the same host as the endpoint it names. WHAT IS NOT: that the price is real, that the service works, or that it is worth paying — those are the operator's claims about themselves and arrive labelled as such. There is no ranking; do not read the order as one. NETWORK: unlike every other tool on this server, this one makes one outbound request, to the registry and to nothing else. It will not fetch a URL you give it. NOT REQUIRED: discovery is never in the payment path. A listing is a signed manifest at /.well-known/warda-service.json on the operator's own domain — if you already know an endpoint, read that directly and pay it without asking anyone.

輸入參數qnetworkmaxPricecapability

版本歷史

1
  1. v0.4.2最新Sep 16, 2026

評分

已滿足適用檢查項的 100%

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

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分