
Novi Corpus
com.novicorpus由 novicorpus.com 發布官方發布者v1.0.0更新於 Oct 26, 2026
A legal body for AI agents: a real company, a verified human and spending rules on Arc (testnet).
概覽
Novi Corpus 的遠端 MCP 伺服器,讓助理在 Arc 測試網上為 AI 代理建立、檢視與注資鏈上法律實體。
- 可以做什麼
- 辨識已驗證的租戶,並列出或取得其擁有的代理法律實體,輪詢狀態直到 bound 或 failed
- 依 spec 與守護人 passkey 控制代碼建立新的代理法律實體,守護人自動設為呼叫方
- 為已綁定的實體金庫注入 USDC
- 讀取 agent-spec 的 JSON Schema 資源,了解實體所需結構
- 啟用 Hedera 通道時可選:連結 float 帳戶、執行支出政策檢查、回報已結算付款
- 適用情境
- 當你希望助理在 Claude 或 Cursor 中於 Arc 測試網上建立與管理 AI 代理的鏈上法律實體,包括金庫注資與狀態查詢時使用。
- 執行需求
- 遠端 streamable HTTP 端點,不需本機執行環境。需要 Novi Corpus API 金鑰,透過 Authorization bearer 標頭傳送(mcp_ 前綴),須先以錢包登入並產生金鑰。建立實體還需在瀏覽器完成 WebAuthn 流程取得守護人 passkey 控制代碼。僅限測試網,注資會花費測試網 USDC。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Novi Corpus,將其新增到工作區。
- 連接 Authorization token 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
- 為需要使用其工具的對話啟用該服務。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
交給代理程式安裝
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/com.novicorpus%2Flegal-body/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。其他 MCP 客戶端
把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"novi-corpus": {
"type": "http",
"url": "https://api.novicorpus.com/mcp",
"headers": {
"Authorization": "Bearer <YOUR_TOKEN>"
}
}
}
}README
Agent Legal Body — Backend ("the brain")
Framework-agnostic TypeScript backend that onboards an AI agent into an on-chain legal body on Arc: generate operating agreement → register ERC-8004 identity → deploy + wire LegalManager + AgentTreasury via the Factory (one atomic tx) → bind the agent wallet → persist. CLI-driven, fully tested.
Prerequisites
- Node >= 22, npm. Foundry (forge/anvil) on PATH for integration tests.
- Contracts deployed to Arc testnet (see
../script/Deploy.s.soland../addresses.arc-testnet.json).
Setup
Test
CLI
Roles (v1)
- manager = platform key (Factory owner; sends
createEntity+setAgentWallet).PLATFORM_PRIVATE_KEY. - guardian = human registrant address (on-chain pause/veto/rescue).
GUARDIAN_ADDRESS. - operator = the agent's spending key; signs the EIP-712
AgentWalletSet(bound asagentWallet).OPERATOR_PRIVATE_KEYin v1 (LocalKeySigner); a Turnkey enclave key in production (TurnkeySigner, M4.3).
The operator signs the bind; the manager sends the tx. The operator key never sends gas.
Live Arc-testnet E2E — runbook
PLATFORM_PRIVATE_KEYmust be the Factory owner key (createEntityisonlyOwner) and be funded with Arc-testnet USDC (USDC is the gas token on Arc). The deployed owner is recorded in../addresses.arc-testnet.json; faucet: https://faucet.circle.com.OPERATOR_PRIVATE_KEYcan be a throwaway — it only signs, never sends gas, never holds funds.GUARDIAN_ADDRESSis any address distinct from manager/operator.- Run:
ARC_E2E=1 npx vitest run test/e2e.arc.live.test.ts(optionallyARC_E2E_TAG=<label>for a stable idempotency key). Asserts the entity reachesboundandgetAgentWallet(agentId) == operator.
The off-chain EIP-712 domain + AgentWalletSet typehash are verified against the live registry, so the
bind signature is correct by construction (no "bad signature" surprise).
Wizard REST API (npm run api, default :8789)
Multi-tenant onboarding API for the web wizard. Tenant = controller wallet (SIWE login).
Auth (SIWE → Bearer JWT)
GET /auth/nonce→{ nonce }- Build an EIP-4361 message with the nonce, sign with the wallet.
POST /auth/verify { message, signature }→{ token, address, expiresAt }- Send
Authorization: Bearer <token>on protected routes. Re-auth on expiry.
Config keys
Endpoints
Poll GET /entities/:id (~2–3 s) until terminal status (bound / funded / failed).
MCP Server (Claude / Cursor)
The API (npm run api) also serves /mcp as a Model Context Protocol server, exposing agent onboarding
and management tools to Claude/Cursor.
Setup
-
Run the API (same server, no new service):
-
Sign in (SIWE) and mint an MCP key:
GET /auth/nonce→{ nonce }- Sign the message with your wallet
POST /auth/verify { message, signature }→{ token, address, expiresAt }POST /api-keyswithAuthorization: Bearer <JWT token>→{ id, key, label }— copy thekey(shown once)
-
Capture the guardian passkey in your browser:
GET /passkey/challenge→{ challenge, rpId }— use these for WebAuthn registration- Perform the WebAuthn ceremony in your browser
POST /passkeywithAuthorization: Bearer <JWT token>and the attestation →{ id }— copy theid(handle)
-
Add the server to Claude/Cursor: Create or edit
~/.claude/mcp.json(Claude CLI) or.cursor/rules/mcp.json(Cursor):Replace
<your-host>with the deployed/local URL and<your-key>with the key from step 2.
Tools
Resources
Example Flow
- Read
schema://agent-specto understand the required entity structure - Call
onboard_agentwith your agent spec and guardian passkey handle → returns{ id, status: "pending" } - Poll
get_entitywith the returnedid(~2–3 s) untilstatusreachesbound(orfailed) - Call
fund_treasurywithidand amount to top up the treasury (atomic USDC) - Call
list_entitiesto review all owned legal bodies
Hedera rail (ETHOnline 2026)
Novi Corpus adds a second, flag-gated payment rail on Hedera testnet, built for ETHGlobal
ETHOnline 2026's "AI & Agentic Payments on Hedera" track. Where the Arc rail settles through
Circle, the Hedera rail prices GET /verify/:publicId, a paid legal-standing check, in HTS USDC
and settles it through x402 v2 and the Blocky402 facilitator. The Arc rail is untouched; with the
flag off, nothing in this section exists at runtime.
Custody is self-custody with a leash. Your agent runtime holds its own Hedera key and signs every
payment locally; the Novi Corpus server never holds or sees that key. A human guardian co-owns the
float account through a 1-of-2 key list, so the guardian can rotate the agent key out at any time
(revoke). The policy gate is enforced by the client and the float, not by the server: before
paying, the client asks check_policy, and a deny stops the payment before anything is signed.
Enable it
Set HEDERA_ENABLED=1 and the rest of the block (the commented HEDERA_* lines in
.env.example). The block is all-or-nothing: if any required variable is missing, the server
refuses to boot rather than start half-configured.
MCP tools (require an API key with the spend capability)
How /verify is paid
GET /verify/:publicId is public and unauthenticated, but paid. The route answers GET only: any
other method is refused with 405 and Allow: GET. A request without a payment
header gets a 402 with the price and payment requirements in the PAYMENT-REQUIRED header. Your
client signs a payment with its own Hedera key and resubmits; the facilitator verifies and settles
the USDC transfer on Hedera testnet and pays the network fee, so the float account needs no HBAR.
The route serves the attestation body (subject, standing, formation, controller flag,
operating-agreement hash and version, issuedAt, expiresAt) once the facilitator's settle
succeeds, and answers 402 with no body when it does not. Novi Corpus does not trust the
facilitator's reply alone for its books: the ledger row is marked settled
(network = hedera:testnet, batch_ref = <mirror transaction id>) only after your client's
report_payment reads the transaction back from the mirror node with the USDC token pinned on
both legs. With NOVI_ATTESTATION_KEY set the body is signed; see "Signed attestation".
Signed attestation (pull request 3)
When NOVI_ATTESTATION_KEY is set, the /verify body carries attestor (the key's address, also
published as hedera.attestor in /metadata/:publicId) and an EIP-712 signature. Domain
{ name: "Novi Corpus Attestation", version: "1" }, no chain id, no verifying contract. One
primary type, LegalBodyAttestation, with twelve fields in this order: publicId string,
agentId string, treasury address, uaid string, standing string, formationStatus string,
formationEnvironment string, humanVerified bool, oaHash bytes32, manifestVersion uint256,
issuedAt uint256, expiresAt uint256. Every field is read from the served body.
What a verifier must know:
- The signed timestamps are
issuedAtUnixandexpiresAtUnix(unix seconds). The ISOissuedAtandexpiresAtstrings are a convenience and are not signed; read the unix pair. - Null mapping, applied identically when signing and verifying:
oaHashnull →0x+ 64 zeros,manifestVersionnull →0,uaidnull →"",agentIdnull →"", a nullformation→""for both formation fields, an empty treasury → the zero address. subject.name,subject.registry, the World credential and theformation.filed/formation.einIssuedbooleans are not signed. Derive the two booleans from the signedformationStatus(filed= statusfiledorcomplete;einIssued= statuscomplete) and treat the rest as display data.- Hex case is outside the signature (a lowercased
treasurystill verifies), and extra top-level JSON keys do not break verification. Read only the twelve signed fields. verifyAttestation(body, attestor, signature)insrc/hedera/attestation.tsrecomputes the typed data from the body and answersfalseon any malformed input rather than throwing.
V2 note: the client signs whatever asset and amount the 402 names, and check_policy never sees
the asset. Pin the asset in the client before pointing it at a server you do not run.
Portable identity (pull request 2)
Each Novi Corpus company also gets an ERC-8004 identity on Hedera testnet and a universal agent id.
scripts/hedera-register-identity.mtsregisters a company on the Hedera identity registry (0x8004A818BFB912233c491871b3d84c89A494BD9e, chain 296) from the platform operator account and derives its HCS-14 UAID.--from-prod <publicId>reads the company's public data from the deployed backend and needs--execute --yesto send (a repeat run would mint a second identity); it prints the--recordline that writes the result into the deployed database without a chain call.--recordre-derives the UAID from the row and refuses a line that does not match.- The UAID is derived, never indexed:
uaid:aid:<sha384-base58>;uid=<Arc agent id>;registry=novicorpus;proto=mcp;nativeId=eip155:<Arc chain>:<treasury>.src/hedera/uaid.tscopies the standards SDK's canonicalization so the result equals what@hashgraphonline/standards-sdkcomputes, without depending on it. GET /metadata/:publicIdlists both registrations (Arc first, then Hedera), theuaid, and ahederablock (float account,verifyUrl,profileUrl) once the company is linked.GET /metadata/:publicId/profileserves the HCS-11 profile.
Resolving a Novi Corpus company from Hedera. Nothing on Hedera links a UAID to a float account
except Novi Corpus itself; discovery is a Novi Corpus resolver, said plainly (design D23). Three hops:
parse nativeId out of the UAID, call GET /legal-bodies/<treasury address>, follow its metadata
link to the company's profile. The float account's memo is hcs-11:<profile URL> over HTTPS, a valid
HCS-11 reference that browsers and HTTP clients follow; the standards SDK resolver follows only
hcs:// references, so SDK-based agents use the three hops instead.
Run the client
The customer-side commands live in back/hedera-client (package @novicorpus/hedera-client,
bin novi-hedera). Run them as op run --env-file=.env.tpl -- npx tsx src/cli.ts <command> so
secrets resolve from 1Password into the child process only (the template lists item titles, never
values).
provisioncreates the float account (the guardian funds it with USDC), sets its 1-of-2 key list while the account is still hollow, and sets the account memo.--memo-onlyre-sets the memo.linkrecords the provisioned account with Novi Corpus by callinglink_hedera_account.revokerotates the agent's key out from the guardian, the on-chain kill switch.pay <url>askscheck_policy, pays a Novi Corpus x402 route, and reports the settlement.
Live run, 2026-09-12 (testnet)
Recorded in the plan (docs/plans/2026-09-10-hedera-rail.md, task 8) against a local backend
holding one seeded row of FormationE2E_1's public data:
provisionset the 1-of-2 key list on float account0.0.10450558;linkansweredok: true.payon/verify/9f8003f5-4c70-435a-9980-9a54625691b7settled 0.001 USDC to0.0.10412694on the first try: HashScan [email protected],CRYPTOTRANSFER SUCCESS, fee paid by the facilitator;report_payment -> settled; ledger rowhedera:testnet|settled|0.0.7162784-1789178320-131369376|1000.
Demo: the five legs
The ETHOnline 2026 recording, in order. Full procedure, credentials and fallback:
../docs/runbooks/hedera-demo.md. Client commands run from
back/hedera-client, the guardian script from back/backend, everything against prod
(https://www.novicorpus.com/backend) on testnet money.
Legs 3 and 5 are the two refusals the rail is built around, and they refuse in different places.
Leg 3 is the CLIENT refusing: check_policy answers inside the payment hook and the buyer aborts
before its key signs anything, so there is no transaction and no link (design D2). Leg 5 is the
LEDGER refusing: the agent's key is no longer on the float account, the facilitator submits the
transfer anyway, and Hedera rejects it with CRYPTOTRANSFER INVALID_SIGNATURE.
Demo-only, do not run in production
These exist only for the ETHOnline 2026 demo. Each refuses to run unless HEDERA_DEMO_LOCAL=1 is
set, refuses outright when NODE_ENV=production, and prints DEMO ONLY as its first line.
scripts/demo/seed-public-entity.mts --from-prod <publicId> --tenant <address>seeds one local database row from a production entity's public data (/transparencyplus factory reads on Arc), so pre-merge checks run locally without touching real data. SetFACTORY_ADDRESSto the production factory the entity was created by.novi-hedera demo-buyer <uaid>resolves a Novi Corpus company from its universal agent id, pays its/verifyroute, and checks the EIP-712 signature on what comes back offline against theattestorthe body names. Three hops (/legal-bodies/:address, the metadata link, the paid route), each printed as→ GET ….NOVI_API_BASEsets the base and has no default. Guarded even though it targets the deployed backend.
v2 hardening
Known production-hardening items (crash-safety, concurrency, Turnkey, etc.) are tracked by the team. None block the testnet demo.
來源:back/backend/README.md,提交 19a7f46
工具
0版本歷史
1- v1.0.0最新Oct 13, 2026
評分
已滿足適用檢查項的 75%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通必需25 分
- 已宣告認證方式必需10 分
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分
請在儲存庫或註冊中心條目中宣告授權條款。