okrapdf — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited okrapdf (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.
Use this skill when the user is looking at a PDF in OkraPDF and wants the agent to act on the selected page region, table, block, or text.
This is the MagicPath pattern for PDFs:
okra bridge serve starts a loopback viewer and selection bridge.http://127.0.0.1:7373/viewer?doc=<docId>.okra select --json.okra ask --selection / okra extract --selection when document reasoning or typed extraction is needed.For command details, see references/cli-reference.md.
Treat the bridge selection as a visual pointer, not as a final answer. A bbox may point at logos, a chart, a table, a paragraph, or whitespace. When the user asks "what is this?", "give me JSON", "extract this", or otherwise refers to a highlighted region, do this in order:
okra select --json.okra ask --selection or okra extract --selection only after the crop confirms the selected region and when semantic document context is useful.Do not rely on okra ask --selection alone to identify the selected region; it can answer from nearby document context. The crop is the source of truth for "what did the user highlight?"
Check the CLI and auth state:
okra auth statusIf okra is missing, install it:
npm install -g okrapdfIf auth is missing, run:
okra auth loginStart the bridge in a background terminal/session:
okra bridge serveThe bridge listens only on 127.0.0.1:7373. It serves a local viewer, proxies OkraPDF page/status data with the CLI's API key server-side, accepts local selection posts, and exposes the latest selection at GET /selection.
Do not expose the bridge through a tunnel or bind it to a public interface.
Then open the local viewer in the IDE/browser pane:
http://127.0.0.1:7373/viewer?doc=<docId>The user should drag on a PDF page to select a bbox before selection-aware commands are run. When the selection is accepted, the viewer displays "Selection synced to Codex bridge."
For an existing OkraPDF document id:
https://app.okrapdf.com/documents?document=<docId>&view=review&embed=codexOpen that URL in the IDE/browser pane. The user should select a PDF bbox, table, or text block in the review surface before selection-aware commands are run.
If the user has a local PDF instead of a document id:
okra upload ./report.pdf --jsonThen open the returned document id with the embed URL above.
Before acting on phrases like "this table", "the selected section", "that number", or "extract this", read the active selection:
okra select --jsonExpected shape:
{
"docId": "doc-abc123",
"page": 2,
"nodeId": "node-42",
"bbox": { "x": 0.12, "y": 0.34, "width": 0.52, "height": 0.18 },
"text": "Selected text or table payload",
"selectedAt": "2026-05-18T12:00:00.000Z",
"source": "https://app.okrapdf.com"
}If no selection is available, tell the user to click a region in the OkraPDF panel, then retry okra select --json.
If the user says "this", "that", "the highlighted region", "the selected table", or similar, do not ask them to paste coordinates. Run okra select --json first and use the returned docId, page, and bbox.
Preferred helper:
node <skill-dir>/scripts/crop-selection.mjs --out /tmp/okra-selection.pngThen inspect /tmp/okra-selection.png with the agent's image viewer and answer from that visual crop.
The helper prints JSON like:
{
"selection": { "docId": "doc-...", "page": 1, "bbox": { "x": 0.1, "y": 0.2, "width": 0.3, "height": 0.1 } },
"cropPath": "/tmp/okra-selection.png",
"crop": { "x": 108, "y": 320, "width": 420, "height": 180 }
}If the helper is unavailable, reproduce the same logic manually: fetch the current page image from http://127.0.0.1:7373/viewer/doc/<docId>/pages/<page>/image, convert the normalized bbox to pixels, crop it, inspect the image, then answer.
Use this for natural-language questions about the selected region:
okra ask "What is this table saying?" --selection --jsonFor streaming text:
okra ask "Summarize the selected section." --selection --streamThe CLI reads the selected docId, page, node id, bbox, and text from the bridge and appends them as explicit context to the document question.
Use this when the user wants JSON, CSV-ready fields, line items, table rows, or a typed answer from the selected region:
okra extract --selection --schema ./schema.json --jsonInline schema is also allowed:
okra extract --selection \
--schema '{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object"}}}}' \
--jsonPrefer a narrow schema that matches the user's requested output. Keep the user-facing answer focused on the returned JSON or the saved output file.
okra select --json
node <skill-dir>/scripts/crop-selection.mjs --out /tmp/okra-selection.pngInspect the crop. If it is a table, return JSON directly from the visible rows/columns, or run okra extract --selection --schema ./table.schema.json --json after the crop confirms the target region.
okra select --json
node <skill-dir>/scripts/crop-selection.mjs --out /tmp/okra-selection.png
okra ask "Explain the selected paragraph in plain English." --selectionokra upload ./report.pdf --jsonOpen:
http://127.0.0.1:7373/viewer?doc=<docId>Then:
okra select --jsonokra select --json whenever the user refers to "this", "that", "selected", "highlighted", or a visible PDF region.okra ask --selection for explanation, verification, summarization, and QA.okra extract --selection --schema ... for structured output.okra bridge serve bound to anything other than loopback.okra-curl; for generated PDFs, use okra-create; for parser bake-offs, use pdf-parse-qa.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.