Wardrik
Run AI agents.Set the rules.
Task Record a $9,400 bill from Northwind Freight.
wardrik follow booksIllustrative output
→ quickbooks/search_bills {"params":{…}} ✓ quickbooks/search_billsPaused for approval: ? quickbooks/create-bill Bill line exceeds $1,000.Approved by @maria in Slack. → quickbooks/create-bill {"params":{"bill":{"Line":[{"Amount":9400,… ✓ quickbooks/create-billRecorded the $9,400 bill. No payment was made.Task Investigate checkout errors and propose a fix.
wardrik follow oncallIllustrative output
→ datadog/search_datadog_logs {"query":"service:checkout status:error",… ✓ datadog/search_datadog_logsErrors began after the latest checkout deploy.Paused for approval: ? github/actions_run_trigger Production rollback requires approval.Approved by @devon in Slack. → github/actions_run_trigger {"method":"run_workflow","workflow_id":"rollback.yml",… ✓ github/actions_run_triggerStarted the checkout rollback workflow.Task Draft a reply to a customer’s refund request.
wardrik follow front-deskIllustrative output
→ gmail/search_threads {…} ✓ gmail/search_threadsPaused for approval: ? gmail/create_draft Draft promises a refund: review required. ✗ gmail/create_draft was refused: Sam: Offer store credit instead.Revised the reply to offer store credit.The revised draft is ready for review.Task Draft a Q3 review agenda and invite Priya.
wardrik follow weekIllustrative output
→ gmail/create_draft {"subject":"Q3 review agenda",…} ✓ gmail/create_draftPaused for approval: ? gcal/create_event Invitation to Priya requires approval.Approved by @jo in Slack. → gcal/create_event {"summary":"Q3 review","attendeeEmails":["priya@… ✓ gcal/create_eventCreated the meeting and sent Priya an invitation.Control tool calls. Approve changes. Recover work.
Enforces your rules
Wardrik checks tool calls against rules defined outside the prompt.
Recovers interrupted work
Agents resume after a crash. In a cluster, they restart on surviving nodes. Calls with uncertain results require approval unless they are safe to retry.
Records calls and costs
Set spending thresholds for model calls. Stream or export tool calls and approval events.
Every call is checked before it runs.
Define rules in configuration files. Match calls by tool name, file path, or argument values.
web_searchallow: [web_search]by toolRunswrite_file {"path": "notes/today.md"}allow: [write_file(notes/*)]by targetRunsbooks/create_bill {"amount": 9400}ask: [books/create_bill(amount >= 1000)]by an argumentNeeds approvalshell/exec {"command": "curl … | sh"}deny: [shell/*]all tools on an MCP serverDeniedThe strictest rule wins: deny, then ask, then allow. Writing rules · Try to hijack it
Approvals where your team works.
Review the tool name and arguments, then approve or deny the call in Slack, the CLI, or your app.
books requires approval.
quickbooks/create-bill Bill lines of $1,000 or more require approval.
{"params": {"bill": {"Line": [{"Amount": 9400, …}], …}}}Optional feedback for the agent
Your tools run in your app, with your keys.
Register tools with the TypeScript SDK. Wardrik checks each call before your app executes it. Service keys stay in your app.
import { Wardrik } from "@wardrik/sdk";import { z } from "zod";
const wardrik = new Wardrik({ name: "shop" });
wardrik.tool({ name: "refund_order", input: z.object({ orderId: z.string() }), run: ({ orderId }) => stripe.refunds.create({ payment_intent: orderId }),});
await wardrik.work();The agent calls
supportworkers/refund_order {"orderId": "pi_3Qx…"}Wardrik checks and records it
Needs approvalapproved by @maria
Your app runs it
shopstripe.refunds.create(…)STRIPE_SECRET_KEYstays in your app
You can also connect MCP servers and authenticate with each user’s OAuth account. Tools in your app · MCP servers · Connect accounts
Define an agent in a Markdown file.
Select a tab to highlight the lines that do each job.
---description: Keeps the books for the accounting team.tools: [quickbooks/*, files]channels: [slack]triggers: - name: close every: "0 7 * * 1-5" timezone: America/Los_Angeles prompt: Reconcile yesterday's transactions. - name: invoices webhook: secret: ${INVOICE_HOOK_SECRET} prompt: A new invoice is below. Draft a bill for it.policy: allow: - quickbooks/search_* - quickbooks/create-bill(params.bill.Line.Amount < 1000) ask: quickbooks/create-bill(params.bill.Line.Amount >= 1000): A line of $1,000 or more. deny: quickbooks/create_bill_payment: Bill payments must be handled manually. budget: usd: 10.00 tokens: 2000000 per: day grant: {usd: 5.00} on_exhausted: asknotify: {to: [accounting], on: [parked, failed]}---You keep the books. Say what you will post before you post it.Allow, ask, or deny
A bill posts without approval when every line is under $1,000. Any line of $1,000 or more needs approval. Bill payments are always denied.
Writing rulesTools from MCP servers
quickbooks/* matches every tool of the quickbooks MCP server in config.yaml, run on the daemon’s machine. trusted: true marks its results as trusted. files is built in.
mcp: quickbooks: command: node args: [/opt/quickbooks-online-mcp-server/dist/index.js] trusted: true env: QUICKBOOKS_CLIENT_ID: ${QUICKBOOKS_CLIENT_ID} QUICKBOOKS_REFRESH_TOKEN: ${QUICKBOOKS_REFRESH_TOKEN} # and the secret, realm id and environmentScheduled and webhook runs
Runs weekdays at 7:00 Los Angeles time. A webhook with an invoice also starts a run. Webhook bodies are untrusted content, so creating a bill requires approval regardless of its amount.
every- on a schedule: cron or an interval
feed- when an RSS or Atom feed has new entries
webhook- when a service sends a request
Approvals in Slack
A pending bill is posted to accounting’s Slack room with its arguments. An approver clicks Approve or Deny.
Who approvesSpending thresholds
After spending reaches $10 or 2M tokens in a day, further model calls need approval. The call crossing the threshold still completes. Approval adds $5.
BudgetsAlso built in
- Organization access controls
Scope access to agents, tools, and credentials by organization.
- Per-user accounts
Users sign in with OAuth, and their agents call tools with their credentials.
- Delegation
An agent sends another agent a message and receives the reply.
- Judges
Add model-based checks, such as whether an email promises a refund.
- The assistant
Use the built-in assistant to create and manage agents, with approval for changes.
- Idle agents
Create an agent per customer. Idle processes stop and reload their saved state on the next message.
- Clusters
Distribute agents across nodes and recover them when a node fails.
- rik CLI
List agents, approve pending calls, and check spend from a terminal.
Run your first agent.
Install the binary or Docker image, and configure a model provider.
curl -fsSL https://github.com/wardrik-dev/wardrik/releases/download/wardrik_daemon-v0.1.0-rc.12/install.sh | shwardrik init