MCP Server
Any MCP-compatible agent can capture web pages and verify evidence without writing HTTP client code. WRL exposes all core operations -- capture, retrieve, list, and verify -- as MCP tools that agents call like any other function.
The MCP server uses Streamable HTTP transport. Configure your client once, then let your agent handle the rest.
Setup
Claude Code
claude mcp add wrl --transport http \
--header "Authorization: Bearer YOUR_API_KEY" \
https://api.webresourceledger.com/mcp
Replace YOUR_API_KEY with a key that has at least read scope. Add capture scope if your agent needs to submit new captures.
Cursor
Add to .cursor/mcp.json in your project directory for project-level access, or ~/.cursor/mcp.json globally:
{
"mcpServers": {
"wrl": {
"url": "https://api.webresourceledger.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json. Windsurf uses serverUrl instead of url:
{
"mcpServers": {
"wrl": {
"serverUrl": "https://api.webresourceledger.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Generic MCP client
Configure your client with:
- Endpoint:
https://api.webresourceledger.com/mcp - Transport: Streamable HTTP (POST)
- Authorization:
Bearer YOUR_API_KEYheader on every request
Available tools
capture_page
Capture a web page as tamper-evident evidence. Takes a screenshot, saves rendered HTML and HTTP headers, and creates a cryptographically signed WACZ bundle. Returns a capture ID -- use get_capture to check progress.
Requires: capture scope
| Parameter | Type | Required | Description |
|---|---|---|---|
url |
string | yes | The URL to capture (http:// or https://) |
Example output:
Capture submitted for: https://example.com
Capture ID: cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
Use get_capture to check status. Captures typically complete in 5-15 seconds.
Status URL: https://api.webresourceledger.com/v1/captures/cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6/status
get_capture
Get the status and details of a capture by ID. Returns pending, complete, or failed. When complete, includes artifact URLs for screenshot, HTML, headers, WACZ bundle, and a verification link.
Requires: read scope
| Parameter | Type | Required | Description |
|---|---|---|---|
capture_id |
string | yes | The capture ID (cap_ followed by 32 hex characters) |
Example output (complete):
Capture cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 is complete.
URL: https://example.com
Created: 2026-03-22T10:30:00.000Z
Completed: 2026-03-22T10:30:12.481Z
Render quality: full
Artifacts:
Screenshot: https://api.webresourceledger.com/v1/captures/cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6/artifacts/screenshot
HTML: https://api.webresourceledger.com/v1/captures/cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6/artifacts/html
Headers: https://api.webresourceledger.com/v1/captures/cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6/artifacts/headers
WACZ bundle: https://api.webresourceledger.com/v1/captures/cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6/artifacts/wacz (2847362 bytes)
Verify integrity: https://api.webresourceledger.com/v1/verify/cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
Or use the verify_capture tool with this capture ID.
list_captures
List recent captures with an optional status filter. Returns summaries in reverse chronological order. Use get_capture with a specific ID for full artifact details.
Requires: read scope
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | no | Filter by status: pending, complete, or failed |
limit |
integer | no | Number of results (1--100, default 20) |
cursor |
string | no | Pagination cursor from a previous list_captures response |
verify_capture
Verify the cryptographic integrity of a capture. Checks artifact hashes, WACZ bundle hash, Ed25519 signature, and RFC 3161 timestamp. Confirms the evidence has not been tampered with since capture.
Requires: read scope
| Parameter | Type | Required | Description |
|---|---|---|---|
capture_id |
string | yes | The capture ID to verify |
Example output (all checks passing):
Verification PASSED for capture cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6.
Captured URL: https://example.com
Captured: 2026-03-22T10:30:00.000Z
Completed: 2026-03-22T10:30:12.481Z
Checks:
artifactHashes: PASS
bundleHash: PASS
signature: PASS
timestamp: PASS
Signing metadata:
Signed at: 2026-03-22T10:30:12.350Z
Timestamp: 2026-03-22T10:30:12.481Z
TSA: http://timestamp.digicert.com
batch_capture
Submit multiple URLs for capture in a single call. Returns a result for each URL -- some may succeed while others fail. Use get_capture to poll each accepted ID individually.
Requires: capture scope
| Parameter | Type | Required | Description |
|---|---|---|---|
urls |
array of strings | yes | URLs to capture (maximum 100) |
For full details on batch results and error handling, see the Batch Captures guide.
Tutorial: capture and verify in 3 tool calls
This walkthrough shows the complete evidence workflow using MCP tools.
Step 1: Submit the capture
Call capture_page with the URL you want to preserve.
Tool: capture_page
Input: { "url": "https://example.com/important-page" }
Capture submitted for: https://example.com/important-page
Capture ID: cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
Use get_capture to check status. Captures typically complete in 5-15 seconds.
Note the capture ID. You will need it for the next steps.
Step 2: Wait for completion
Wait a few seconds, then call get_capture.
Tool: get_capture
Input: { "capture_id": "cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" }
If still processing, you will see is pending -- call get_capture again in a few seconds. When the capture completes, the response includes all artifact URLs and a verification link.
If the capture is still pending after 30 seconds, it may have stalled. Call get_capture once more to see if a failure record is now written, then resubmit with a new capture_page call if the error is retryable.
Step 3: Verify cryptographic integrity
Tool: verify_capture
Input: { "capture_id": "cap_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" }
All four checks passing confirms: the screenshot, HTML, and HTTP headers match what was captured; the WACZ bundle has not been altered; the Ed25519 signature is valid; and an independent RFC 3161 timestamp authority recorded the capture time.
Example agent workflows
Before deploying, preserve evidence of the current state:
"Capture the current production homepage and store the capture ID. If anything looks wrong after deploy, we have proof of what it looked like before."
Verify a capture before citing it in a report:
"Before I include this capture URL in the audit report, verify it hasn't been tampered with."
Compliance audit across multiple pages:
"Capture these 12 policy pages for the quarterly compliance record." -- use
batch_captureand thenget_capturefor each ID. See the Batch Captures guide for the polling pattern.
Troubleshooting
"Insufficient scope: API key does not grant 'capture' scope"
Your API key has read scope but not capture scope. list_captures, get_capture, and verify_capture work with read scope. capture_page and batch_capture require capture scope. Contact your WRL operator to provision a key with the required scopes. See Authentication.
"Rate limit exceeded. Try again in 60 seconds."
WRL enforces per-tenant rate limits. Wait 60 seconds and retry. If you need higher throughput, contact your WRL operator.
"Service is at capacity. Retry in 10 seconds."
A global capacity limit applies across all tenants. Retry after 10 seconds.
Capture stuck in pending
Captures normally complete in 5--15 seconds. If get_capture returns pending after 30 seconds:
- Call
get_captureone more time -- it may have just completed, or the failure record may now be written. - If still pending, the background job may have been dropped. Submit a new capture with
capture_page.
"Capture not found or not yet complete"
verify_capture only works on complete captures. If you call it while a capture is still pending, wait for completion and try again. If the ID does not exist, confirm you are using the correct capture ID.
"WACZ bundle exceeds maximum verifiable size (100 MB)"
The page produced a WACZ bundle larger than 100 MB. Verification is not available for captures this large via the MCP tool. Use the REST API's /v1/verify/{id} endpoint directly, or contact your WRL operator about increased size limits.