Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Enforced budgets for agents paying x402 APIs: the gateway holds the wallet, not the agent.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
AGENTPAY_URL, AGENTPAY_API_KEY비밀로 표시된 값은 내 계정의 열쇠예요. 절대 다른 사람과 공유하거나 채팅에 붙여 넣지 마세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"agentpay": {
"command": "npx",
"args": [
"-y",
"agentpay-gateway"
],
"env": {
"AGENTPAY_URL": "your-value",
"AGENTPAY_API_KEY": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add agentpay --env AGENTPAY_URL=your-value --env AGENTPAY_API_KEY=your-value -- npx -y agentpay-gateway실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"agentpay": {
"command": "npx",
"args": [
"-y",
"agentpay-gateway"
],
"env": {
"AGENTPAY_URL": "your-value",
"AGENTPAY_API_KEY": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"agentpay": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"agentpay-gateway"
],
"env": {
"AGENTPAY_URL": "your-value",
"AGENTPAY_API_KEY": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
AGENTPAY_URL env이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 6일 점검
레지스트리 이름이 GitHub 계정 Hellotravisss 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
입력해야 할 값: AGENTPAY_API_KEY
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.9.0)은 36일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Node.js도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, Apify MCP Server
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Extract data from any website with thousands of scrapers, crawlers, and automations on Apify Store ⚡
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
A cross-rail spend-policy gateway for AI agent payments. It sits between your agents and anything that charges them money — x402-style paid APIs, Alipay/WeChat-style agent payments, whatever comes next — and answers the question every company deploying paying agents will have to answer:
*"How do I let my agent spend money — across several payment rails — without giving it my wallets?"*
Agents never hold payment credentials. They call paid resources through the gateway, which:
402 Payment Required handshake and collects every payment option the merchant accepts, ┌────────────────────────────────────────────────┐ ─▶ paid API (x402, USDC)
agent ──HTTP──▶ │ gateway │ (no keys, no wallet) │ policy ─ fx ─ router ─ ledger ─ audit ─ rails │ ─▶ paid API (Alipay, CNY) └────────────────────────────────────────────────┘ ─▶ ...
The built-in dashboard ( GET /admin ) — live spend vs. budgets, per-rail breakdown, and one-click approve/reject on held payments.
For how it's built and *why* — design principles, the full 402 request lifecycle, and where the simple parts grow — see docs/ARCHITECTURE.md.
The platforms are racing to let agents spend, and each is building a closed loop: Alipay's ACT delegated-payment protocol, WeChat Pay's isolated "AI card" with user-set authorization scope and spend limits, x402 for crypto-native APIs. Every platform wants agents spending inside *its* wallet, on *its* rail — and the design they keep converging on (a wallet isolated from your real account, scoped authorization, per-spend limits, big payments held for confirmation, a full audit trail) is exactly the control surface this project is built around. The thesis is no longer speculative; it's where the giants are pointing their capex.
But a company running real agents doesn't get to live in one loop. Its agents pay an x402 API in USDC, a vendor in CNY, the next thing in whatever ships next quarter — and no single platform gives it one neutral view across all of them: one base-currency budget, one audit trail, one policy, one place where the agent never holds a credential. The more these closed loops fragment, the more that spanning layer is missing.
That layer is agentpay. It sits *above* the rails — x402, Alipay, WeChat, mock — behind a two-method interface (rails/rail.ts), so budget, policy, FX, routing, and audit are written once and every rail plugs in underneath. It's rail-neutral and self-hosted by design: the value is precisely the part no platform racing to own its own loop will build for you.
npx agentpay-gateway # gateway on http://127.0.0.1:4020, dashboard at /admin (mock rails)
From source:
npm install
npm test # 110 tests: money, FX, policy, x402 v1+v2, MCP, persistence, approvals, security, e2e npm run demo # walkthrough: 2 rails, 2 currencies, 1 unified USD budget, human-in-the-loop npm run dev # start the gateway on :4020 (dashboard at http://localhost:4020/admin)
The demo runs a merchant that accepts USDC (x402-style) or CNY (Alipay-style); two agents with different rail preferences get routed differently, and one USD budget governs both — a 0.36 CNY purchase consumes ~0.0504 USD of it. Per-transaction caps, payee blocklists, budget exhaustion, the per-rail spend breakdown, and the audit trail are all shown.
There's a ready-to-install agent skill in skill/ — a step-by-step runbook an AI assistant (Claude Code, OpenClaw, …) follows to set agentpay up *for* you: install + self-test, write a deny-by-default policy, launch the gateway, reroute the agent's paid calls through `/proxy`, then operate it (spend, audit, approvals, live policy edits) and harden for production. It bundles policy templates and a troubleshooting + API reference. Point your assistant at skill/SKILL.md, or install it from a skill marketplace.
Try it in two minutes: npx -p agentpay-gateway agentpay-demo starts a gateway (mock money) plus a toy paid API. Ready-made agents for the Claude Agent SDK, Vercel AI SDK, OpenAI Agents SDK and LangChain are in examples/.
Give an MCP agent a budget it cannot exceed. The agentpay-mcp server holds only the agent's gateway API key — the wallet and the limits stay in the gateway. Unlike honor-system budget tools, the agent is never *asked* to check its budget; a payment over the limit simply isn't signed.
{
"mcpServers": { "agentpay": { "command": "npx", "args": ["-y", "-p", "agentpay-gateway", "agentpay-mcp"], "env": { "AGENTPAY_URL": "http://127.0.0.1:4020", "AGENTPAY_API_KEY": " " } } } }
Tools: paid_fetch(url, method?, body?) — fetch any URL; the gateway pays x402/402 within policy. Denials and approval holds come back as tool errors the model can explain. check_budget() — spent today/this month vs limits (via the agent-scoped GET /v1/budget, which shows an agent only its own numbers).
Policies are deny-by-default: an agent with no policy entry cannot spend at all. See policies/example.json:
{
"fxRates": { "USDC:USD": "1", "CNY:USD": "0.14" }, // directional pairs, exact decimals "defaults": { "currency": "USD", "perTransactionMax": "1.00", "dailyBudget": "10.00" }, "agents": [ { "agentId": "research-bot", "enabled": true, "currency": "USD", // base currency for ALL limits below "railPreference": ["alipay-act", "x402"], // routing order when merchants accept several rails "perTransactionMax": "0.25", // cap on any single payment, in base currency "dailyBudget": "0.15", // UTC calendar day, across all rails/currencies "monthlyBudget": "3.00", // UTC calendar month "maxTransactionsPerDay": 200, "requireApprovalOver": "0.50", // hold payments >= this for human review (base ccy) "payeeBlocklist": ["merchant-shady"] // or "payeeAllowlist": [...] to whitelist instead } ] }
All money is exact decimal (bigint micro-units, 6 dp — USDC precision); FX conversions round up so budgets are enforced conservatively. No floats anywhere near amounts. Payments in a currency with no configured rate to the base currency are denied (no_fx_rate).
| Endpoint | Purpose | |
|---|---|---|
ANY /proxy?url= | Proxy a request; routes + pays on 402 if policy allows. Identify the agent via Authorization: Bearer (when keys are configured) or X-Agent-Id. | |
GET /admin | Web dashboard (single self-contained page) — live spend, pending approvals with approve/reject buttons, the audit trail, and inline policy editing. | |
GET /admin/policy | The full live policy config. | |
GET /admin/agents | Configured agents with their resolved limits. | |
PUT /admin/agents/:id | Create or replace an agent's policy (validated). Takes effect on the next request; written back to the policy file. | |
DELETE /admin/agents/:id | Remove an agent (reverts to deny-by-default). | |
GET /admin/keys · POST /admin/keys · DELETE /admin/keys/:id | Multi-tenant API keys: list, mint (secret returned once), revoke. | |
GET /admin/spend/:agentId | Unified spend vs. limits in the base currency, plus a per-rail breakdown in native currencies. | |
GET /admin/audit?agent=&limit= | Audit trail of every allow/deny/failure/hold. | |
GET /admin/approvals?status= | List payments held for human review (filter pending/approved/rejected). | |
POST /admin/approvals/:id | Decide a held payment: body `{ "decision": "approve" \ | "reject" }`. |
GET /healthz | Liveness. |
Successful paid responses carry X-Gateway-Payment-Id, X-Gateway-Rail, and X-Gateway-Payment-Amount headers. Denials return 403 with the violated rule id (per_transaction_max, daily_budget, payee_blocklisted, no_fx_rate, approval_rejected, ...) so the agent can explain itself or back off.
Set requireApprovalOver on an agent and any policy-approved payment at or above that base-currency amount is held instead of executed: the proxy returns 202 with an approvalId rather than paying. An operator approves or rejects via POST /admin/approvals/:id; the agent's retry then executes (approved) or is denied with approval_rejected. Each approval is single-use, so it unlocks exactly one payment. Budgets are still re-checked at execution time on the retry.
By default the ledger, audit log, and approvals live in memory. Point any of them at a file to make state survive restarts — .sqlite selects a transactional SQLite backend (Node's built-in node:sqlite, no extra dependency), anything else is append-only JSONL:
LEDGER_FILE=./ledger.sqlite AUDIT_FILE=./audit.jsonl APPROVALS_FILE=./approvals.sqlite APIKEYS_FILE=./keys.sqlite npm run dev
FixedRateProvider is fine for static pairs; CachingRateProvider wraps any async rate source (a RateFetcher, default httpRateFetcher hits exchangerate.host) with a TTL and a hard staleness limit. Past that limit a cached rate is refused (no_fx_rate) rather than used — a payment is never priced on a stale rate. Stablecoin pegs can be pinned so they never expire or fetch.
Policies change at runtime — no restart. The PolicyManager owns the live config; every decision reads through it, so an edit takes effect on the next request. Two ways in, kept in sync:
PUT/DELETE /admin/agents/:id (the dashboard's edit pencils and "add agent" button drive these). Each edit is validated, audited as policy_changed, and written back to the policy file.npm run dev watches the policy file and hot-reloads out-of-band edits. The write-back and the watcher don't fight: reload() no-ops when the file is byte-identical to the in-memory state, so a self-write doesn't trigger a reload loop. (fxRates are built once at startup and not hot-reloaded.)Agents authenticate with Authorization: Bearer . Keys are minted per agent (an agent can hold several, for rotation) via POST /admin/keys or the dashboard — the raw secret is returned exactly once;
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요