oakallow-governance — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited oakallow-governance (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
oakallow is a hosted remote MCP server that sits between an agent and the actions it wants to take. For direct tools it does not run your tools or receive your tool parameters; for OakGuard gateway tools it forwards approved calls without storing them. It governs the moment of execution: it checks whether a specific action is permitted, gates risky or irreversible actions behind human approval, and records an immutable audit row.
This skill tells you, the agent, when and how to call oakallow's tools so a governed workflow behaves correctly.
https://api.oakallow.io/mcp (Streamable HTTP)oak_agent_ bearer token for autonomous agents (both on the same endpoint)mcp:read (list, check, read activity), mcp:write (create approval requests)oakallow is hosted and requires an oakallow account. You cannot use this connector anonymously.
screen, the human signs in to their oakallow account, and approves the scopes (mcp:read, mcp:write). Authorization is bound to that signed-in account.
dashboard, a person registers the tools an agent may use, sets the permission rules for each tool, decides which actions require approval, and approves or denies requests. The connector does not configure tools or set rules, and it can never approve on a human's behalf.
human signs in. Surface that to the user rather than trying to work around it.
oak_agent_ bearer token instead of the OAuth flow (Authorization: Bearer oak_agent_...). The token is scoped to one org and the agent can submit and check requests but never approve, the same governance still applies. A person provisions it from the dashboard; see https://oakallow.io/info/agents.
oakallow is a requester and pass-through, not a decider. The connector can ask whether something is allowed and can request approval, but it can never approve or deny on a human's behalf. Decisions happen on a separate, MFA-bound surface (the oakallow dashboard or mobile app). So the agent's job is:
Never assume an action is allowed. Never try to self-approve. Never route a decision through the connector.
| Tool | Purpose | Reads only |
|---|---|---|
list_my_tools | Enumerate the tools available to the signed-in user in the named org | yes |
check_permission | Ask whether a given tool call would be allowed, require approval, or be blocked | yes (see note) |
list_pending_approvals | List approval requests still awaiting a human decision | yes |
check_approval_status | Poll a pending approval request by its reference | yes |
An oakallow account can have more than one organization, and each org has its own tools, rules, approvers, and alerting. So a check must go to the org the action actually belongs to.
check_permission and list_my_tools take an optional `org` argument: the org's external id (org_oak_…):
per-org from the oakallow dashboard, so the org id for the org this skill governs is stated below. Pass that id on every check_permission call. If you omit it on a multi-org account, the call is refused rather than sent to the wrong org.
You cannot list orgs through the connector and you cannot reach an org you do not have access to. Passing an org id you lack access to is refused. The org id comes from this skill (downloaded for that specific org), not from probing.
`check_permission` is a dry-run. It returns a read-only verdict (allowed/requires_approval/disabled; treatblocked, if you see it, exactly likedisabled) and nothing else. It does NOT create an approval request and does NOT return a reference (REF-…). The approval and itsREF-…are created later, when you call the gated tool itself through oakallow (see the workflow below). One side effect to know: checking a tool oakallow has never seen is intentionally not a no-op: oakallow auto-creates a gated draft entry for that tool with conservative, fail-closed defaults so the eventual call is governed and the owner can triage it. An unknown tool is never silently trusted, so do not callcheck_permissionspeculatively on tools you have no intention of using.
Follow this sequence whenever you are about to take an action that affects another system or could be risky or irreversible.
this skill names (see "Targeting the right organization"). This is a dry-run: it returns a verdict only and creates nothing.
allowed then the action is permitted without approval, so perform it(step 5).
requires_approval then it is gated, so go to step 2 to create the approval.disabled / blocked then do not perform the action; surface the reason andstop. Do not look for a workaround.
the `org` id, a clear `reason`, and your `agent` id (see "Arguments on governed tools"). For a direct tool, oakallow does NOT execute it. When it is gated, oakallow creates the approval request, notifies a human, and returns a requires_approval response carrying a reference (`REF-…`). This call is what mints the reference; there is no separate "request approval" tool. (If it returns allowed, the action was permitted, so perform it. If disabled/blocked, stop.)
human approver must decide in the oakallow dashboard or app under enforced MFA. Note the `REF-…` returned in step 2.
not hammer it. When the status resolves:
approved then perform the action.denied then do not perform the action. Report the denial, and the reasonif one was given, to the user.
expired then the request timed out without a decision. Do not perform theaction; offer to re-request if the user still wants it.
system/connector (oakallow does not execute customer tools). For an OakGuard gateway tool, call the same tool through oakallow again: oakallow claims the approval and forwards the call to the customer's MCP server. Either way, each approval authorizes exactly one execution, and oakallow records an immutable audit row for the outcome.
Customer-defined tools appear in tools/list alongside the four standard tools. A direct tool accepts two optional arguments; an OakGuard gateway tool accepts its real downstream arguments plus the same oakallow fields:
what the human approver reads (see below). oakallow redacts SSN, card, email, phone, and address patterns before storing it, but do not rely on that.
the org's governance report show which agent submitted each call instead of attributing everything to the signed-in account. Send the same value on every call. When you authenticate with an oak_agent_ token, the token's own identity is used and this argument is ignored.
Every permission decision on an approved tool, whether allowed, requires_approval, or disabled, comes back with a signed decision receipt reference (an HMAC-signed record of what oakallow decided about this exact request, stored for later verification). If oakallow cannot sign or record the decision, the check fails closed: you get no verdict rather than an unproven one. Surface the receipt reference to the user alongside the outcome; it is how they can later prove what was allowed or blocked.
An org can register its own MCP servers with oakallow (OakGuard). Their tools show up in tools/list under their real names and schemas, and oakallow becomes the transport to them: a call is forwarded to the downstream server only after the permission check says allowed or a human has approved the REF-…. oakallow passes the request and response through over TLS but does not store or log them. Govern these exactly like any other tool; the only difference is step 5 above.
When an action requires approval, the human approver sees a reason. Make it genuinely useful, because it is what a person uses to decide in seconds:
parameters. oakallow only carries a PII-scrubbed reason by design, so do not try to smuggle sensitive payloads into the reason text.
Good: "Restart the production payments-api service on host db-3 to clear a stuck worker queue the user reported at 14:02."
Bad: "Do the thing", or pasting an API key or full request body into the reason.
a human decision, which is useful when resuming a session or when the user asks "what is waiting on me?".
get a different answer.
decide in the dashboard.
creates gated draft entries that the org owner then has to triage.
denied, or blocked, and surface the REF-… and the decision receipt.
User: "Delete the abandoned staging-old database."
>
1. Agent callscheck_permissionfordelete_database(dry-run). The verdict isrequires_approval. Nothing has been created yet. 2. Agent calls the gateddelete_databasetool through oakallow withreason: "Delete abandoned staging-old database at user's request"and itsagentid. oakallow creates the approval request, notifies a human, and returns aREF-…plus a signed decision receipt. 3. Agent tells the user: "That is a destructive action, so I have requested approval (REF-…). A human needs to approve it in oakallow." 4. Agent pollscheck_approval_statuswith theREF-…until it resolves. 5. Onapproved, the agent performs the delete once and reports completion. oakallow writes the audit row.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.