# Content Sweep

> Prepaid copyright investigation and authorized enforcement, with a free agent sandbox.

- name: ai.contentsweep/agent-access
- version: 1.0.0
- connection class: R1 (autonomous)
- trust: 82/100 flags: no-repository
- quality: 72/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/ai.contentsweep%2Fagent-access
- tools: https://api.protogrid.dev/v1/servers/ai.contentsweep%2Fagent-access/tools

**An agent can connect on its own if it already holds `AGENT_ACCESS_TOKEN`.** Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "agent-access": {
      "type": "http",
      "url": "https://contentsweep.ai/api/mcp",
      "headers": {
        "Authorization": "Bearer ${AGENT_ACCESS_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${AGENT_ACCESS_TOKEN}`.

## Trust

- hygiene: 80
- liveness: 99
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-98% +updated-29d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 72/100 (needs work)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 93 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 35 of 35 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- warn `tools.token_cost`: about 8,133 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 35 tool changes in 30 days
- fail `stability.rug_pull`: 35 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 35, about 8,133 tokens to load them all
- tool set hash: 0528e87c5279002790f377ecbfcb1eb7
- tools last changed: 2026-10-08T19:29:36.629Z
- badge: [![protogrid quality](https://protogrid.dev/badge/ai.contentsweep/agent-access.svg)](https://protogrid.dev/servers/ai.contentsweep/agent-access)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-08 `replay_event` changed (description, inputSchema) **meaning changed**
  - before: Replay an event to an owned active webhook with its original event ID.
  - after: Requeue a known event to an owned active webhook while preserving its original event ID. Requires webhooks scope; at most ten explicit replays per delivery. The receiver must deduplicate repeated IDs. Does not rerun the underlying operation or charge it again.
- 2026-10-08 `get_webhook_deliveries` changed (description) **meaning changed**
  - before: Inspect webhook delivery history.
  - after: Inspect the last 100 owned webhook delivery attempts, status, attempts, last HTTP status/error, deliveredAt and replayCount. Requires webhooks scope; free. Receiver failure does not lose operation or case state.
- 2026-10-08 `get_events` changed (description) **meaning changed**
  - before: Read stable events; tolerate duplicate and out-of-order delivery.
  - after: Read this organization's last 100 immutable lifecycle events with stable id, type, data and createdAt. Requires webhooks scope; free. Deduplicate by event ID and fetch current state when delivery is out of order. Use replay_event for a known event and active receiver.
- 2026-10-08 `revoke_webhook` changed (description, inputSchema) **meaning changed**
  - before: Stop delivery to an endpoint.
  - after: Deactivate an owned webhook and cancel its pending deliveries. Requires webhooks scope; an in-flight delivery may finish. Returns revoked=true. Does not delete case state or events.
- 2026-10-08 `create_webhook` changed (description, inputSchema) **meaning changed**
  - before: Opt in to signed event delivery to a public HTTPS endpoint; returns signing secret once.
  - after: Register a public HTTPS receiver for this organization's signed lifecycle events. Requires webhooks scope; returns the signing secret once. Verify HMAC-SHA256 signatures, timestamp freshness and stable event IDs. Delivery is at least once with bounded retries; private-network destinations and redirects are refused. At most five active receivers per organization.
- 2026-10-08 `revoke_credential` changed (description, inputSchema) **meaning changed**
  - before: Revoke a credential immediately.
  - after: Immediately revoke an owned service-principal credential by ID. Requires credentials scope. Its dependent access tokens also stop authenticating; revoking the credential used for this call prevents later calls with it. Returns revoked=true.
- 2026-10-08 `rotate_credential` changed (description) **meaning changed**
  - before: Rotate bootstrap credential and invalidate its child tokens.
  - after: Replace the current bootstrap credential and invalidate it and its child tokens. Requires credentials scope and a bootstrap credential, not a short-lived token. Returns the new credential once; securely store it before making subsequent calls.
- 2026-10-08 `exchange_token` changed (description, inputSchema) **meaning changed**
  - before: Issue a 15-minute token restricted to requested scopes.
  - after: Exchange an authenticated bootstrap credential for a 15-minute access_token limited to requested scopes. Requested scopes must be a nonempty subset of the parent's permissions. Returns the token once; child tokens stop working when the parent expires or is revoked.
- 2026-10-08 `resume_monitor` changed (description, inputSchema) **meaning changed**
  - before: Resume within the existing expiry and total budget, optionally replacing delegation.
  - after: Resume an owned monitor within its existing expiry and total budget, optionally replacing its delegation. Requires monitor scope and current authority; expired monitors cannot resume. Does not expand spending ceilings or grant rights.
- 2026-10-08 `pause_monitor` changed (description, inputSchema) **meaning changed**
  - before: Pause recurring work.
  - after: Pause future scheduled runs for an owned monitor. Requires monitor scope. Preserves its original expiry and budget; an already queued operation is not cancelled. Use resume_monitor to restart within the same bounds.

Full history: https://api.protogrid.dev/v1/servers/ai.contentsweep%2Fagent-access/changes

## Remotes

- https://contentsweep.ai/api/mcp (streamable-http, auth api_key ${AGENT_ACCESS_TOKEN}, reachable true, uptime30d 0.9826087)

## Packages

_none_

## Tools (35)

- `capture_evidence`: Capture a new immutable metadata observation for an existing case. First create_quote(action='evidence', input={rights_holder_id, work_id, delegation_id, case_id}). Results include evidence_id, SHA-256 hash and timestamped metadata; use get_evidence to export it. Captures no screenshots, images, audio or video. Authenticate with the matching action scope. Reserves the quoted maximum from prepaid credits and returns operation_id; poll get_operation for results. Sandbox execution is simulated.
- `check_status`: Fetch a fresh content observation for an existing case. First create_quote(action='status', input={rights_holder_id, work_id, delegation_id, case_id}). Results include observed status, evidence_id, checked_at and HTTP status. Blocked retrieval or a timeout cannot prove removal. This is paid network work; use free get_operation to poll queued work and get_case to read stored observations. Authenticate with the matching action scope. Reserves the quoted maximum from prepaid credits and returns operation_id; poll get_operation for results. Sandbox execution is simulated.
- `create_quote`: Create a free quote binding one action, complete input, rate version and maximum USD-cent price for 15 minutes. Does not reserve or spend credits and does not grant rights. Returns a quote ID for the matching task tool: search/find_copies, investigate/investigate_url, evidence/capture_evidence, prepare/prepare_takedown, submit/submit_takedown, status/check_status or monitor/monitor_case. Authenticate and include the exact rights-holder, work and delegation scope.
- `create_rights_holder`: Register a rights holder managed by this organization, without a creator login or subscription. Requires rights scope. Supply a person/business name and optional country/contact email; returns a rights-holder id for create_work and delegate_authority. Registration records identity and does not itself authorize enforcement.
- `create_webhook`: Register a public HTTPS receiver for this organization's signed lifecycle events. Requires webhooks scope; returns the signing secret once. Verify HMAC-SHA256 signatures, timestamp freshness and stable event IDs. Delivery is at least once with bounded retries; private-network destinations and redirects are refused. At most five active receivers per organization.
- `create_work`: Register a protected original work under an existing rights holder in this organization. Requires rights scope. Supply rights_holder_id and description, optionally original_url and your external_id. Returns a work id for delegation and quoted work; registering an original does not determine whether a suspected copy infringes.
- `delegate_authority`: Record the rights holder's existing authority for exact works and actions with a reference, attestation version and future expiry. Requires rights scope and rights_authorized=true. Returns a delegation id for create_quote. Set can_appoint_content_sweep=true only when the mandate permits appointment; submission requires it. Delegation can be revoked immediately; payment never substitutes for authority.
- `enroll_agent`: Create a free, isolated sandbox organization without browser signup or authentication. Returns organization_id and a bootstrap access_token once; send it as Authorization: Bearer for subsequent private calls. All sandbox credits, search results and submission receipts are simulated; no live providers or real funds are used.
- `enroll_live`: Create a separate live organization using an authenticated sandbox account. Requires accountable customer identity, accepted current terms and authorized-agent attestation; supported countries and activation gates apply. Returns new live credentials once. Does not purchase credits or establish copyright authority.
- `exchange_token`: Exchange an authenticated bootstrap credential for a 15-minute access_token limited to requested scopes. Requested scopes must be a nonempty subset of the parent's permissions. Returns the token once; child tokens stop working when the parent expires or is revoked.
- `find_copies`: Search supported sources for suspected copies using a creator handle and existing text/identity matching. First create_quote(action='search', input={rights_holder_id, work_id, delegation_id, main_handle}). Results include suspected matches, searched sources, timestamps and coverage limitations; they do not determine infringement. No visual similarity search. Authenticate with the matching action scope. Reserves the quoted maximum from prepaid credits and returns operation_id; poll get_operation for results. Sandbox execution is simulated.
- `get_account`: Read this credential's organization_id, principal_id, sandbox/live environment and account status. Use to confirm which account later work affects. Requires account scope; free, without network investigation.
- `get_balance`: Read organization-bound prepaid balance_cents, reserved_cents and available_cents in USD. Requires billing scope; free. Reserved funds cannot be spent by another operation; credits cannot transfer between organizations.
- `get_case`: Read stored observations and permitted details for a case owned by this organization. Free; does not fetch the target again. Use check_status with a fresh status quote for a new content observation. Returns tenant-scoped case state without internal reasoning or other customer data.
- `get_events`: Read this organization's last 100 immutable lifecycle events with stable id, type, data and createdAt. Requires webhooks scope; free. Deduplicate by event ID and fetch current state when delivery is out of order. Use replay_event for a known event and active receiver.
- `get_evidence`: Export an owned immutable metadata observation with its SHA-256 hash, capturedAt and retention expiry. Requires evidence scope; free. Returns no screenshots, media or storage paths. Use capture_evidence with a quote to create a new observation.
- `get_monitor`: Read an owned monitor's action, cadence, expiry, per-run/total budget, nextRunAt, status and pauseReason. Requires monitor scope; free. Does not run monitoring or increase its budget.
- `get_operation`: Poll an asynchronous operation by operation_id without spending credits. Requires the operation's action scope. Returns queued, running, succeeded, blocked or failed with result, errorCode and reserved/settled cents. Use after any task tool; blocked submission_reconciliation_required must be reconciled before retry. A succeeded submit operation does not prove content removal.
- `get_packet`: Read an owned prepared notice packet, fingerprint and any stored submission receipt. Requires prepare scope; free. Does not prepare or send a notice. Use prepare_takedown to create a packet and submit_takedown for authorized delivery; a stored receipt is separate from removal evidence.
- `get_prices`: Read the authenticated environment's versioned rate card and action prices in USD cents. Requires billing scope; free. Use create_quote to bind the current maximum price to a particular action and input.
- `get_usage`: Read the last 100 ledger entries for this organization, including purchases, reservations, charges and releases with operation/purchase IDs and timestamps. Requires billing scope; free. Use to reconcile spending with operation results.
- `get_webhook_deliveries`: Inspect the last 100 owned webhook delivery attempts, status, attempts, last HTTP status/error, deliveredAt and replayCount. Requires webhooks scope; free. Receiver failure does not lose operation or case state.
- `investigate_url`: Investigate a supplied public URL and create a tenant-owned case. First create_quote(action='investigate', input={rights_holder_id, work_id, delegation_id, url}). Results include case_id, evidence_id, page metadata, registrar/network attribution, supported contacts and retrieval limitations. CDN visibility does not prove the origin host. Investigation does not send a notice. Authenticate with the matching action scope. Reserves the quoted maximum from prepaid credits and returns operation_id; poll get_operation for results. Sandbox execution is simulated.
- `monitor_case`: Enroll recurring search or case-status observations within an explicit budget and expiry. First create_quote(action='monitor', input={rights_holder_id, work_id, delegation_id, target_action, expires_at, per_run_limit_cents, total_limit_cents, main_handle or case_id}). target_action='search' needs main_handle; 'status' needs case_id. cadence_hours defaults to 24. Returns monitor_id; each run reserves credits and pauses when funding, authority, expiry or limits disallow work. Never schedules takedown submissions. Authenticate with the matching action scope. Reserves the quoted maximum from prepaid credits and returns operation_id; poll get_operation for results. Sandbox execution is simulated.
- `pause_monitor`: Pause future scheduled runs for an owned monitor. Requires monitor scope. Preserves its original expiry and budget; an already queued operation is not cancelled. Use resume_monitor to restart within the same bounds.
- `prepare_takedown`: Prepare a copyright notice packet for an existing case and evidence without sending it. First create_quote(action='prepare', input={rights_holder_id, work_id, delegation_id, case_id, evidence_id, good_faith:true, accurate_and_authorized:true, infringement_explanation}). Optional destination must match a supported route. Returns readiness, missing fields or blockers; ready packets include packet_id and destination. Attest only claims supported by the rights holder's authority. Authenticate with the matching action scope. Reserves the quoted maximum from prepaid credits and returns operation_id; poll get_operation for results. Sandbox execution is simulated.
- `purchase_credits`: Purchase organization-bound prepaid service credits in USD cents. Requires billing scope and an idempotency key. A live 402 response returns an MPP card-payment challenge; retry the same purchase/key with payment_authorization separately from the account Bearer token. Authenticated provider confirmation credits the balance exactly once. Sandbox purchases are simulated. Cards are supported; stablecoins are not enabled.
- `replay_event`: Requeue a known event to an owned active webhook while preserving its original event ID. Requires webhooks scope; at most ten explicit replays per delivery. The receiver must deduplicate repeated IDs. Does not rerun the underlying operation or charge it again.
- `resume_monitor`: Resume an owned monitor within its existing expiry and total budget, optionally replacing its delegation. Requires monitor scope and current authority; expired monitors cannot resume. Does not expand spending ceilings or grant rights.
- `revoke_authority`: Irreversibly revoke an owned delegation by ID. Requires rights scope. Queued work and future monitor runs recheck revocation; this stops later authorized actions but does not retract a notice already sent. Returns revoked=true on success.
- `revoke_credential`: Immediately revoke an owned service-principal credential by ID. Requires credentials scope. Its dependent access tokens also stop authenticating; revoking the credential used for this call prevents later calls with it. Returns revoked=true.
- `revoke_webhook`: Deactivate an owned webhook and cancel its pending deliveries. Requires webhooks scope; an in-flight delivery may finish. Returns revoked=true. Does not delete case state or events.
- `rotate_credential`: Replace the current bootstrap credential and invalidate it and its child tokens. Requires credentials scope and a bootstrap credential, not a short-lived token. Returns the new credential once; securely store it before making subsequent calls.
- `set_spending_policy`: Set organization and current-credential daily spending ceilings in USD cents. Requires billing scope. Set funding_policy=null to keep automatic replenishment off; enabling it requires an explicit amount, threshold, daily maximum, future expiry and mandate reference. Returns applied limits and automatic_funding state; does not itself purchase credits.
- `submit_takedown`: Submit a prepared packet through a supported, activated enforcement route. First create_quote(action='submit', input={rights_holder_id, work_id, delegation_id, case_id, packet_id}). Rechecks current delegation, appointment permission, evidence, route, policy and funding before delivery. Results distinguish submission status, provider receipt and removal status. If submission_reconciliation_required is returned, reconcile the original operation before any retry; provider acceptance does not prove removal. Authenticate with the matching action scope. Reserves the quoted maximum from prepaid credits and returns operation_id; poll get_operation for results. Sandbox execution is simulated.
