{"name":"io.github.ericlovold/sanction","slug":"ericlovold-sanction","title":"Sanction","description":"The wallet an AI agent carries — mandate, budget, vault, and audit. Counterparties verify first.","url":"https://mcp.market/server/ericlovold-sanction","rating":null,"grade":"B","score":75,"certified":false,"status":"active","category":"ai","tags":["ai"],"presence":{"score":33,"stars":3,"forks":0,"downloads_week":56,"last_push_at":"2026-09-19T20:13:58.000Z","license":"NOASSERTION"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ericlovold/sanction","website":"https://getsanction.com","version":"0.9.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"sanction-mcp","version":"0.9.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Agent API key (pxy_...). Create one at https://getsanction.com or via POST /api/v1/wallets then POST /api/v1/agents.","isRequired":true,"isSecret":true,"name":"SANCTION_API_KEY"},{"description":"Optional override for sanction_wallet_status; by default the wallet derives from the agent key.","name":"SANCTION_WALLET_ID"},{"description":"Sanction API base URL.","default":"https://getsanction.com/api/v1","name":"SANCTION_API_URL"}]}],"tools":[{"name":"sanction_authorize","description":"ALWAYS call this before any purchase, subscription, API credit top-up, or money transfer. Sanction enforces the wallet owner's spend policy: amounts under the auto-approve threshold return immediately; amounts over the escalation threshold pause for human approval; blocked categories are hard-denied. Returns authorized:true with a request_id on approval, or authorized:false with a machine-readable","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_authorize_capability","description":"Call this BEFORE acquiring any new capability \\u2014 installing a skill or plugin, enabling an integration, or calling an API you haven't used before. Sanction enforces the wallet owner's capability policy: blocked capabilities are hard-denied, capabilities off the allow-list are denied, and sensitive ones return escalated for human approval. Returns authorized:true to proceed, or authorized:false","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_authorize_provision","description":"ALWAYS call this before provisioning any resource \\u2014 user seats, software licenses, cloud infrastructure, subscriptions with unit counts. One call governs both the resource (the wallet's resource allow/block/escalate lists) and the dollars (the same spend ladder and daily budget as purchases). Amounts or resources over the line pause for human approval; approval mints a one-use grant \\u2014 re","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_authorize_tool","description":"Call this BEFORE invoking any other tool or external action (a different MCP tool, a shell command, a deploy, an email send). Sanction enforces the wallet owner's tool-governance policy: blocked tools are hard-denied, tools off the allow-list are denied, and sensitive tools return escalated for human approval. Returns authorized:true to proceed, or authorized:false with a machine-readable code (TO","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_check_authorization","description":"Poll an authorization request that returned 'escalated', to see whether the wallet owner has approved it yet. Pass the request_id from the escalated authorize/provision/tool response. While pending, status stays 'escalated' \\u2014 wait and poll again. Once the owner approves, status becomes 'approved' and a one-use grant_id is returned: retry the ORIGINAL authorize call with the identical fields p","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_inject_credential","description":"Retrieve a decrypted credential value using a scoped execution JWT. Every injection is audit-logged with timestamp, agent ID, and credential label \\u2014 raw values are never logged. Use the credential value immediately and do not store it in memory, files, or logs. Fails if the JWT is expired, revoked, or if the requested credential label was not in the original scope.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_log_outcome","description":"Record a business outcome (an enrollment, booking, signed engagement, conversion) against this wallet. Outcomes are what the wallet's spend answers to: Sanction computes cost-per-outcome over a rolling window and, when the wallet has a cost_per_outcome ceiling configured, throttles further spend to human-gated once the ceiling is crossed. Call this when your system confirms a real outcome \\u2014 n","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_log_tokens","description":"Call this after every LLM inference call (Claude, GPT-4, Gemini, Llama, etc.) to record token consumption. It is metered against three budget horizons \\u2014 the seat's daily budget, the seat's monthly budget, and the pooled per-department daily token cap \\u2014 and returns a 402 budget error naming which horizon was hit if any is exceeded; on a budget error the agent should stop making LLM calls ","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_request_execution","description":"Mint a short-lived mandate (signed JWT) for a child agent, subprocess, or counterparty: credential scope plus a hard spend cap. Pass the JWT \\u2014 never the root pxy_ key. Default 15 min, wallet-bound, freeze-aware. The other party verifies it at POST /mandate/verify with no API key. Required before sanction_inject_credential.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sanction_wallet_status","description":"Check the wallet's current spend and token budget consumption. Returns today's and month-to-date LLM token costs and real-money spend, plus a count of authorization requests pending human approval. Call this at the start of long agentic tasks to confirm budget headroom before initiating expensive operations, or when a prior authorize/log_tokens call returns a budget error.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":75,"grade":"B","scanned_at":"2026-09-20T21:00:43.723Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T21:00:43.531Z","components":{"code":{"score":20,"max":25,"notes":["3 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"mcp-server.js: …ode, sch); const makeValidate = new Function(`${names_1.default.self}`, `${names_1.de…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"sanction-mcp","version":"0.9.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":0,"publishedAt":"2026-08-28T13:26:34.143Z","repositoryUrl":"git+https://github.com/ericlovold/sanction.git","weeklyDownloads":56}],"repo":{"found":true,"owner":"ericlovold","repo":"sanction","archived":false,"pushedAt":"2026-09-19T20:13:58Z","stars":3,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/140542120?v=4","ownerCreatedAt":"2023-07-25T17:12:38Z","license":"NOASSERTION"},"icon":{"url":"https://getsanction.com/icon.svg?icon.2srgc-_9n77u5.svg","source":"site"},"presence":{"stars":3,"forks":0,"downloadsWeek":56,"license":"NOASSERTION","lastPushAt":"2026-09-19T20:13:58.000Z","score":33}}}},"grade_history":[],"reviews":[]}