Agents

PwrSnap can hand a local AI agent — PwrAgent, a coding agent in your terminal, anything that speaks MCP — a controlled door into your Library. The agent can search captures, read pixels, ask for edits, cut recordings, make copies, and build Sizzle Reels, and every one of those actions runs through PwrSnap rather than around it.

It’s off until you turn it on, and once on, every connecting agent still has to get past a consent window you answer by hand.

What it is

PwrSnap runs a small MCP server on the loopback interface:

http://127.0.0.1:51729/mcp

Loopback only. Nothing on your network can reach it, and PwrSnap rejects any request that didn’t arrive addressed to 127.0.0.1:51729.

The point of routing agents through a server instead of just letting them read ~/Documents/PwrSnap/ is that a file is a file — a request is checkable. Going through PwrSnap means:

Turn it on

Go to Settings → Local Agents. The page is titled Authorization graph, and the first card is MCP server:

Enable local-agent access — “When off, PwrSnap does not listen for MCP connections. Saved Sessions and roles remain available. When on, every connection still requires native approval and an assigned RBAC role.”

Flip it on and PwrSnap starts listening. A badge next to the header shows the live listener state, so you can tell “switched on” from “actually accepting connections” — if the port is busy, the switch staying on is not a claim that the door is open.

Once it’s listening, the next card, Claude Code and Codex, shows the connect command for each with a Copy button (see Connect an agent).

Turning it back off stops the listener. Your saved sessions and roles survive; they just have nothing to attach to.

Connect an agent

Point your agent at http://127.0.0.1:51729/mcp and let it do the normal MCP OAuth handshake. PwrSnap registers the client dynamically — there’s nothing to paste, no key to generate.

Your agent opens the authorization page in your browser as usual, but nothing is approved there. The page reads Continue in PwrSnap and waits, and PwrSnap opens its own window:

A local MCP client wants to access PwrSnap

Your library can contain private screen content. Choose exactly what this local agent may search, read, create, or change.

Underneath, in order:

  1. Client-reported label: <name> — what the agent calls itself. It’s display metadata, not identity: any local process can claim any name, so treat it as a hint about which window you’re looking at, not proof of who’s asking.
  2. Session Name — “Use a unique name you will recognize later in Access Control.” This is the handle you’ll revoke by, so name it after the thing that’s connecting, not after the task.
  3. Choose an access role — a radio list of the built-in roles that fit inside what the agent asked for, plus Custom role (“Pick individual permissions and a limit on how far back the agent can see.”).
  4. If you pick Custom: a Capture history horizon — Last 7 days / Last 30 days / Last 90 days / Last year / All time — and a checkbox per requested permission, each showing its label, what it actually does, and the raw capability id.
  5. Deny or Allow access. The footer reminds you: “Access can be changed or revoked later in PwrSnap Settings.”
PwrSnap's native consent window. The heading reads “A local MCP client wants to access PwrSnap”, over the line “Your library can contain private screen content. Choose exactly what this local agent may search, read, create, or change.” Below it are the client-reported label, Claude Code (pwrsnap); a Session Name field filled with Claude Code (pwrsnap) and the hint “Use a unique name you will recognize later in Access Control.”; and Choose an access role, offering Search Only (last 7 days, 1 permission, search capture metadata without reading image pixels), Search + Previews (last 7 days, 2 permissions, search and read edited composites with visible redactions applied), which is selected, and Custom role (pick individual permissions and a limit on how far back the agent can see). The footer says access can be changed or revoked later in PwrSnap Settings, beside Deny and Allow access buttons.
Claude Code asking for access, with Search + Previews picked. The label is whatever the client says it is; the Session Name is what you'll revoke by.

Once you answer, the browser page hands the result back to the agent and you can close it. An authorization request expires after five minutes if you don’t answer it; start the agent’s login again to get a fresh one.

The agent’s side of this is ordinary MCP. The exact commands for Claude Code and Codex CLI, the PwrAgent button, and what any other MCP client needs are on Connect an agent.

Roles

A role is a bundle of permissions plus two limits: how far back in your history the agent can see, and how much it can do in a rolling 24 hours. Six ship built in:

Role What it can do History Budgets
Search Only Search capture metadata without reading image pixels 7 days 50 / 1 / 1 / 1 / 1
Search + Previews Search, and read edited composites with visible redactions applied 7 days 50 / 200 / 1 / 1 / 1
Full Media Search, read edited and original pixels, and create exports 30 days 500 / 2000 / 250 / 1 / 1
Image Editor Full Media, plus PwrSnap-owned image edits 30 days 500 / 2000 / 250 / 100 / 1
Sizzle Producer Search, read edited previews, compose reels, render previews 30 days 500 / 2000 / 1 / 100 / 1
Full Access Every permission, including originals, Trash, and full-resolution renders unlimited 1000 / 2000 / 250 / 200 / 100

Budgets read searches / preview images / full-res images / edits / trash moves, each per rolling 24 hours. A 1 is not a typo — it’s the smallest non-zero allowance, enough that a misrouted call fails visibly rather than silently succeeding.

Custom roles. Hit + New custom role on the Local Agents page, or Duplicate a built-in and edit the copy. The role editor takes a name, a description, a Capture history (Last 7 / 14 / 30 / 90 days, or All time), a checkbox per permission, and Sliding-window budgets: a limit and a window in hours for each of the five budgets. A fresh custom role starts at 7 days of history and 50 / 200 / 25 / 25 / 10 per 24 hours. A Custom role picked in the approval window is saved as a role of its own, named after the Session.

Built-ins are drift-checked: if a built-in role’s definition ever doesn’t match what PwrSnap expects, every session bound to it fails closed rather than running with the wrong permissions. Edit a duplicate, not the original.

Permissions

Nine capabilities, with the labels you’ll see in the consent window and on the Settings page:

Permission What it lets an agent do Tier
Search library Search capture metadata inside the role’s history limit standard
Read edited previews Fetch pixels after PwrSnap edits and redactions standard
Read original images Fetch original pixels that may bypass visible redactions sensitive
Export captures Write out a capture at a chosen size and format sensitive
Edit images Change a capture through PwrSnap-owned edit commands sensitive
Move to Trash Move a capture to the recoverable PwrSnap Trash destructive
Compose Sizzles Create and update Sizzle compositions sensitive
Read Sizzle previews Render preview-quality Sizzle media sensitive
Read full Sizzles Render full-resolution Sizzle media destructive

The composite / original split is the one to understand. “Read edited previews” gets the picture as you see it, redactions baked in. “Read original images” gets what was underneath. They’re deliberately separate permissions, and every role below Full Media grants only the first — so an agent without Read original images can’t see under a redaction you drew.

Nothing short of Full Access grants Move to Trash or Read full Sizzles, and nothing at all exposes a permanent delete — the Trash is as far as an agent can go, and the Trash is recoverable.

Sessions, budgets, and audit

Each approval becomes a named, durable Session. The Local Agents page draws them as a graph — Session → role → permissions, with allowed paths in the accent color and rejected ones in red — and every Session card carries the client’s self-reported label, an active/revoked badge, a role dropdown you can change on the spot, when it was last used, and Revoke.

Settings, Local Agents, the authorization graph, under a legend for allowed paths (solid) and rejected sessions (dashed) and a + New custom role button. Three columns. Sessions, 2: Claude Code, self-reported, active, with Full Media in its role dropdown, used Oct 7 at 2:20 PM, and Revoke; Codex CLI, self-reported, active, with Search + Previews, used Oct 7 at 2:20 PM, and Revoke; and a Rejected box for revoked or invalid-role sessions. PwrSnap roles, 6, each marked built-in with its description, history limit, permission count, and a Duplicate link: Search Only (last 7 days, 1 permission), Search + Previews (last 7 days, 2), Full Media (last 30 days, 4), Image Editor (last 30 days, 5), Sizzle Producer (last 30 days, 4), and Full Access (all capture history, 9). Permissions and limits, 9: History, last 30 days; Search library, Read edited previews, Read original images, and Export captures checked; Edit images, Move to Trash, Compose Sizzles, Read Sizzle previews, and Read full Sizzles dimmed. Orange lines trace the path from Claude Code through Full Media to its history limit and four permissions.
Claude Code selected. The lit path is exactly what its Full Media grant reaches; everything else is dimmed.

Policy is re-resolved on every single call. Revoking a session or narrowing its role takes effect on the agent’s next request, not at its next restart — and anything ambiguous fails closed.

Session Names are unique while active. A second connection under a name that’s still active is refused with invalid_grant until you revoke the old session or pick a different name. To reconnect an agent under the same name, revoke its old Session first, then run its connect recipe again.

Budgets are sliding windows, shown with used-vs-limit bars under a LIVE SCOPE card for the selected session:

Each reads used / limit over its rolling window: 24 hours for the built-in roles, whatever you set for a custom one. Alongside them, Capture history shows the horizon: “Searches and direct resource reads are checked against this moving horizon.”

Audit. A collapsed Recent agent actions card shows the last 50 protected-media and mutation actions — what was done, which Session did it, which capture, when, and whether it succeeded. Reads that aren’t protected don’t clutter it: “Protected media and mutation actions appear here.”

What an agent can do

The tools PwrSnap exposes, in plain English. Each needs the permission in brackets, or it doesn’t run. A tool the Session’s role can’t use is refused with a missing_capability error naming what’s missing.

Finding things

Reading pixels

Changing images

Recordings

Copies

Sizzle Reels

Media comes back as a link the agent’s client hands to its media handler: an MCP resource with a pwrsnap:// address for clients that read resources, or a short-lived signed URL on the same loopback server. Either way the grant is checked again before the bytes move, and the history horizon applies to direct reads as well as searches.

Privacy

Not yet