Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
spendctl은 AI 에이전트를 위한 지출 정책 제어 플레인입니다
spendctl is the spend-policy control plane for AI agents: budgets, approvals, receipts and chain tracing across every wallet and every HTTP 402 protocol — enforced in a sidecar you run, never by holdi
금융Python · TypeScriptGitHub @miraistudio온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Open-source clients for the spendctl sidecar (Apache-2.0). The sidecar itself is proprietary.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Open-source clients for the spendctl sidecar.
spendctl is the spend-policy control plane for AI agents: budgets, approvals, receipts and chain tracing across every wallet and every HTTP 402 protocol — enforced in a sidecar you run, never by holding your keys or funds.
This repository holds the thin clients that talk to that sidecar. They are Apache-2.0 and expose only the wire protocol. The sidecar, CLI and MCP server themselves are proprietary and ship on npm as spendctl; their docs live at https://spendctl.dev/docs/.
Status: @spendctl/client is on npm (npm i @spendctl/client); spendctl-sdk for Python is on PyPI (pip install spendctl-sdk). The sidecar they talk to ships as spendctl on npm; the hosted control plane is in private beta (https://spendctl.dev).
| Package | Language | Registry | Status |
|---|---|---|---|
@spendctl/client | TypeScript, zero dependencies | npm | available |
spendctl-sdk | Python 3.10+, zero dependencies (optional httpx / requests integrations); import name spendctl_sdk | PyPI | available |
spendctl-sandbox, spendctl | Claude Code and Cursor plugins (MCP config + skill) | this repo is the marketplace | available |
The repository is also a plugin marketplace for Claude Code and Cursor (plugins/): spendctl-sandbox connects to the login-free sandbox, spendctl to the sidecar you run.
claude plugin marketplace add miraistudio/spendctl-sdk
claude plugin install spendctl-sandbox@spendctl
npx spendctl init && npx spendctl start.fetch wrapper, or the MCP server.import { wrapFetch, readRefusal } from "@spendctl/client";
const pay = wrapFetch({ agent: "researcher" }); // reads SPENDCTL_URL / SPENDCTL_AGENT by default
const res = await pay("https://api.example.com/paid");
const refusal = await readRefusal(res); // undefined when paid; otherwise why spendctl refused or is waiting for a human
from spendctl_sdk import httpx_client, read_refusal
with httpx_client(agent="researcher") as http: # same env vars; requests_session() and pay() also exist
res = http.get("https://api.example.com/paid")
refusal = read_refusal(res) # None when paid
Signing happens in the sidecar you run, against a wallet you own — a Coinbase CDP server wallet or your own key. spendctl never holds keys or funds.
The clients are small because the protocol is small. Anyone can write one in another language from this table.
Gateway (agent → sidecar). Send the request you would have sent to the seller to the sidecar's base URL (default http://127.0.0.1:8402/) and put the real destination in a header.
| Header | Direction | Meaning |
|---|---|---|
x-spendctl-target | request | Absolute URL of the seller endpoint |
x-spendctl-agent | request | Agent name as defined in spendctl.yaml |
x-spendctl-token | request | Per-agent token, when the sidecar runs with agentAuth: token |
x-spendctl-approval | request | Approval id to attach to a retry after a human approved |
x-spendctl-decision | response | Outcome of the attempt: settled, denied, pending_approval, failed, expired or dry-run |
x-spendctl-attempt | response | Ledger id of the attempt |
x-spendctl-amount | response | Amount paid, formatted in USD |
When the sidecar refuses, needs approval, or is in dry-run it answers 402 with a JSON body { error, message, attempt?, decision?, amount?, approval?, reasons? } where error is one of spendctl_denied, spendctl_approval_required, spendctl_dry_run. A paid response is the seller's response with the x-spendctl-* headers added.
Agent API (read-only, identified by x-spendctl-agent / x-spendctl-token). GET /_spendctl/agent/budget, GET /_spendctl/agent/receipts?limit=, GET /_spendctl/agent/approvals/:id.
Admin API (Authorization: Bearer <admin token> from .spendctl/admin.token). GET /_spendctl/admin/pending, POST /_spendctl/admin/approvals/:id/approve|deny, GET /_spendctl/admin/ledger, GET /_spendctl/admin/export?format=csv|json, GET /_spendctl/admin/trace/:id, GET /_spendctl/admin/summary, POST /_spendctl/admin/ledger/:id/resolve.
The protocol is versioned with the sidecar; this README tracks sidecar v0.1.
Issues and pull requests are welcome here — see CONTRIBUTING.md. Contributions are accepted under Apache-2.0 (inbound = outbound); no CLA.
Security reports for the clients or the sidecar: [email protected], not a public issue. See SECURITY.md.
Code in this repository is licensed under the Apache License 2.0. See NOTICE.
"spendctl" and the spendctl logo are trademarks of Mirai Studio, Inc. The licence does not grant permission to use the name for forks or derived services; call yours something else and say it is compatible with spendctl.
© Mirai Studio, Inc. (株式会社みらいスタジオ), Tokyo.