MCP Server Overview¶
The Authentic8 MCP Server exposes the entire Silo SDK as 73 structured tools that AI assistants can invoke directly through the Model Context Protocol.
Quick start for most users
If you're using Claude Desktop or Claude Code, jump straight to Setup. The remote (HTTP) tab is only needed for team deployments.
What is MCP?¶
Model Context Protocol (MCP) is an open standard for connecting AI assistants to external tools and data sources. The Authentic8 MCP Server implements this protocol, allowing AI assistants like Claude Desktop, Cursor, and other MCP-compatible clients to:
- Manage Silo browsing isolation contexts
- Upload, download, and organize files in Silo storage
- Create and monitor web harvesting tasks
- Administer user accounts and organizations
- Extract and decrypt audit logs
Instead of writing SDK wrapper code, you describe what you want and the AI calls the appropriate tool automatically.
Architecture¶
The MCP server is a thin wrapper around the SDK. Each SDK method becomes an MCP tool with the same parameters and return types.
flowchart TD
A["<b>AI Assistant</b><br/>Claude · Cursor · other MCP clients"]
B["<b>Authentic8 MCP Server</b><br/>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br/><b>Tool Registry — 73 tools</b><br/><code>a8_create_context</code> · <code>a8_list_users</code> · <code>a8_upload_file</code><br/><code>a8_extract_logs</code> · <code>a8_health_check</code> · <i>68 more</i>"]
C["<b>Silo SDK</b><br/>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br/>BrowsingAPI · UserManagementAPI · OrgManagementAPI<br/>FileAPI · LogExtractionAPI · HarvesterAPI"]
D["<b>Authentic8 Silo API</b><br/>extapi.authentic8.com"]
A -->|"MCP Protocol (JSON-RPC)"| B
B -->|"SDK method calls"| C
C -->|"HTTPS"| D
style A fill:#e8f4fd,stroke:#1976d2,color:#0d1117
style B fill:#fff8e1,stroke:#f57c00,color:#0d1117
style C fill:#e8f5e9,stroke:#388e3c,color:#0d1117
style D fill:#fce4ec,stroke:#c62828,color:#0d1117
Transport Modes¶
The MCP server supports two deployment patterns:
stdio (Local)¶
- Use case: Individual developers with their own credentials
- Client: One AI assistant per server process
- Credentials: Loaded from
.envfile or environment variables - Connection: AI assistant spawns server as subprocess, communicates via stdin/stdout
- Best for: Claude Desktop, Claude Code, local development
HTTP (Remote)¶
- Use case: Team environments with shared infrastructure
- Client: Multiple AI assistants connect to one server
- Credentials: Per-client credential store (
credentials.yaml) - Connection: HTTP server at
http://host:8080/mcp(--transport streamable-http), clients authenticate with Bearer tokens - Best for: Production deployments, multi-tenant environments
sse is the legacy transport
--transport sse is still accepted and serves at /sse instead of /mcp. It remains
available for older clients that cannot speak Streamable HTTP; use streamable-http
for anything new.
Available Tools¶
The MCP server provides 73 tools organized by API category:
Browsing Isolation (6 tools)¶
| Tool | Description |
|---|---|
a8_create_context |
Create a secure browsing isolation context; returns browse_context_id and launch_url |
a8_get_context |
Retrieve context details |
a8_update_context |
Update context properties (max_uses, name, expires, enabled, context_data) |
a8_delete_context |
Delete a browsing context |
a8_create_research_session |
Create a Silo for Research context with egress selection, connectivity, browser profile, and protocol options |
a8_list_egress_locations |
List egress locations by region; returns enriched connectivity, availability, and protocol metadata by default (include_details=True) |
a8_create_research_session parameters
In addition to url, username, egress_region, and max_uses, this tool accepts:
connectivity—"datacenter","isp","fixed-wireless", or"wireless-carrier"availability—"public"or"private"protocol—"direct"or"tor"browser_os—"win","mac","linux","android","android phone","ios","iphone","ipad"browser_type—"chrome","firefox","edge","safari","tor"
When max_uses is omitted, the tool reads DEFAULT_MAX_USES from configuration
(set via A8_DEFAULT_MAX_USES env var; defaults to 1). See
Configuration for details.
File Storage (8 tools)¶
| Tool | Description |
|---|---|
a8_upload_file |
Upload a file from a local path (file_path) or inline string (content). bucket_id defaults to the configured BUCKET_ID when omitted. |
a8_download_file |
Download a file to a specified path or temp directory (auto-generates filename from metadata when output_path omitted) |
a8_read_file_content |
Download a small file (< 1 MB) and return its text content directly |
a8_find_files |
Search for files by name, path, type, date, size, or metadata |
a8_list_files |
List all files in a bucket |
a8_modify_file |
Change file name, path, expiry, or content type |
a8_delete_file |
Delete a file |
a8_get_file_info |
Get detailed file information |
Web Harvesting (9 tools)¶
| Tool | Description |
|---|---|
a8_create_harvest_task |
Create a harvest task (asset/visual/video/single) |
a8_find_harvest_task |
Get task status and details |
a8_list_harvest_tasks |
Look up multiple tasks by ID with optional status/finished filters |
a8_delete_harvest_task |
Delete a harvest task |
a8_wait_for_harvest_task |
Poll until a task completes or times out |
a8_download_harvest_result |
Download the output ZIP to a path or temp directory (saves as harvest_<task_id>.zip when omitted) |
a8_get_valid_task_types |
List valid task type strings |
a8_get_valid_task_params |
List valid parameters for a given task type |
a8_list_egress_categories |
List egress location availability by task type (asset-restricted) |
User Management (12 tools)¶
| Tool | Description |
|---|---|
a8_list_users |
List all users in an organization |
a8_get_user |
Get user details (by username or email) |
a8_find_user |
Search users by partial email or name (case-insensitive) |
a8_add_user |
Add a new user; returns the existing user record with _already_exists=true and _hint if the user already exists |
a8_bulk_add_users |
Add multiple users in a single call with per-user error tolerance; returns created, failed, results, and errors counts |
a8_modify_user |
Modify user attributes |
a8_delete_user |
Delete a user |
a8_suspend_user |
Suspend a user account |
a8_unsuspend_user |
Restore a suspended account |
a8_reset_pin |
Reset PIN / generate temporary password |
a8_promote_user_to_admin |
Promote a user to admin for an organization |
a8_list_users_recursive |
Recursively list users across an org and all sub-orgs |
Organization Management (22 tools)¶
| Tool | Description |
|---|---|
a8_get_org |
Get organization details |
a8_get_org_children |
List sub-organizations (pass recursive=true to get flat list of all descendants) |
a8_create_org |
Create a new organization; returns the existing org record with _already_exists=true and _hint if the org already exists |
a8_update_org |
Update organization properties |
a8_delete_org |
Delete an organization |
a8_get_session_report |
Get session/isolation usage report |
a8_org_usage_report |
Org-level usage report across hierarchy (provisioned users, active users, session counts, duration stats) |
a8_user_usage_report |
Per-user usage report across hierarchy (username, session counts, duration stats) |
a8_create_partner_sso_config |
Create org with federated SSO (IdP partner) |
a8_get_partner_sso_config |
Get SSO configuration |
a8_update_partner_sso_config |
Update SSO configuration |
a8_enable_partner_sso_config |
Enable SSO |
a8_disable_partner_sso_config |
Disable SSO |
a8_delete_partner_sso_config |
Delete SSO config and associated org |
a8_get_proxy_policy |
Get proxy objects for an org |
a8_set_proxy_policy |
Replace the entire proxy list for an org |
a8_add_proxy_policy |
Append proxy objects to an org's policy |
a8_delete_proxy_policy |
Remove named proxy objects from an org |
a8_clear_proxy_policy |
Fetch all proxy objects and delete them in one call |
a8_parse_saml_metadata |
Parse SAML IdP metadata XML into structured config |
a8_get_org_tree |
Return the full org hierarchy as a nested dict |
a8_resolve_org |
Resolve an ambiguous org name to its canonical full path |
Log Extraction (4 tools)¶
| Tool | Description |
|---|---|
a8_extract_logs |
Extract audit logs by type and sequence |
a8_get_log_sequence_info |
Get available log sequence metadata |
a8_get_valid_log_types |
List all 26 valid log type strings |
a8_get_extract_logs_info |
Get log sequence info via extractlog probe |
Valid log types (26): A8SS, ADMIN_AUDIT, APP_LAUNCH, AUTH, BLOCKED_URL,
CASE_MANAGER, CLIPBOARD, COOKIES, DOWNLOAD, ENC, EVENT, EXPLOIT,
EXTENSION, HARVEST, ISOLATE_BYPASS, LAUNCHER, LOCATION_CHANGE, NEXUS,
POST_DATA, PRINT, SESSION, SMS, TRAFFICMAN, TRANSLATION, UPLOAD, URL
Note
Four log types use spaces on the wire: BLOCKED URL, CASE MANAGER,
LOCATION CHANGE, POST DATA. Pass the underscore form — the SDK converts
automatically.
Note
ENC (encrypted) entries have no fixed field structure. All other 25 types have
canonical CSV column schemas used by a8_export_logs_csv to determine column order.
a8_extract_logs advanced parameters
The backend serializes log extraction and may return a lock-contention error when multiple jobs run concurrently. Optional parameters for resilience:
retry_on_lock— Settrueto retry automatically on lock contention (default:false)retry_delay— Seconds to wait between retries (default:60)max_retries— Maximum number of retry attempts (default:3)fallback_per_type— Settrueto retry each log type individually when the combined request fails; results are aggregated and any per-type errors appear in thetype_errorsfield of the response (default:false)
Batch Requests (3 tools)¶
| Tool | Description |
|---|---|
a8_batch_request |
Execute multiple wire-format commands in a single batch POST; token_type selects which token authenticates the batch |
a8_batch_suspend_users |
Suspend multiple users in a single API round-trip |
a8_batch_delete_users |
Delete multiple users in a single API round-trip; known API false-errors are surfaced as "deleted (unconfirmed)" with a verification note |
Diagnostics (4 tools)¶
| Tool | Description |
|---|---|
a8_health_check |
Probe all 5 tokens with lightweight API calls; returns per-token status, latency (ms), and the list of tools available for each healthy token |
a8_validate_config |
Check all required config keys without making API calls; lists missing, present, and optional keys |
a8_get_api_info |
Return API endpoint URL, SDK version, total tool count, detected environment (prod/qa/eng), and bucket configuration status |
a8_debug_payload |
Show the wire-format JSON payload for any command with token redacted — no API call made |
Compound Workflows (5 tools)¶
| Tool | Description |
|---|---|
a8_harvest_url |
Create a harvest task, wait for completion (up to max_wait_seconds; default 1800), and return task status and result_file_id in a single call |
a8_create_browsing_url |
Create an isolation context and return the launch_url directly; accepts all a8_create_context parameters |
a8_org_summary |
Rich one-call org summary: org info, user list, child orgs, and proxy policies; partial results returned if any section fails |
a8_stream_logs |
Auto-paginate log extraction using is_more/next_seq until all pages are retrieved; enforces a 10,000-log cap (truncated: true when hit) |
a8_export_logs_csv |
Auto-paginate log extraction and write all rows to a local CSV file; cap defaults to 100,000 rows; returns output_path, total_rows, columns, and truncated |
Error Handling and Resilience¶
The MCP server includes structured error handling across all tools:
- Mapped errors: SDK exceptions are converted to
ValueError(bad parameters or configuration) orRuntimeError(API failures), each with an actionable message explaining what to check or try next. - Idempotency hints:
a8_add_useranda8_create_orgcatch "already exists" responses and return the existing resource with_already_exists: trueand a_hintfield instead of raising an error. This allows agent workflows to proceed without explicit duplicate checks. - Rate limit retry:
a8_extract_logsand log sequence tools automatically retry once on rate limit errors before surfacing the failure. - Lock contention retry:
a8_extract_logsacceptsretry_on_lock=trueto automatically retry when the backend returns a concurrent-extraction lock error. The lock expires after 10 minutes;retry_delay(default 60s) andmax_retries(default 3) are configurable. - Per-type fallback:
a8_extract_logsacceptsfallback_per_type=trueto retry each log type individually when a combined request fails, aggregating partial results and reporting per-type errors in thetype_errorsfield. - Input sanitization: Tools that accept
orgortask_idstrings reject blank or whitespace-only values with a clearValueErrorbefore making any API call.
Security¶
Credential Safety
Never commit .env, credentials.yaml, or any files containing real API tokens. These files are gitignored by default.
- Token scope: Each API category requires specific tokens (ADMIN_TOKEN, SYNC_TOKEN, FILE_TOKEN, etc.). Tools that lack the required token will raise
ConfigurationErrorwhen invoked. - HTTP mode: The HTTP endpoint should be deployed behind a reverse proxy with TLS termination in production.
- Network: The MCP server makes outbound HTTPS calls to
extapi.authentic8.com. Ensure network egress is permitted. - HTTP mode credential scope: An instance serves exactly one client's credentials and refuses to start if
credentials.yamllists more than one. Serving several clients means one instance per client, behind a gateway that routes each Bearer token to its own instance. See Setup for details.
Next Steps¶
Setup Guide — covers both local (stdio) and remote (HTTP) deployment modes
CLI Reference¶
After installing with pip install "silo-sdk[mcp-server]", the silo-sdk-mcp command is available directly in your virtual environment:
Alternatively, invoke via the Python module:
Upgrading from 0.13.x
The Python package was renamed silo_mcp → silo_sdk_mcp in 0.14.0, with no
compatibility shim. An existing checkout needs a reinstall, and HTTP deployments
need their credentials.yaml moved by hand. See
Upgrading from 0.13.x.
Options:
--transport {stdio,sse,streamable-http}- Transport mode (default: stdio)--host HOST- HTTP server bind address (default: 0.0.0.0, i.e. every interface)--port PORT- HTTP server port (default: 8080)--credentials PATH- Path to credentials.yaml, HTTP transports only (default:credentials.yamlnext to the installedsilo_sdk_mcppackage, not the current working directory)--list-tools- Print all registered tools and exit--log-level {DEBUG,INFO,WARNING,ERROR}- Logging level (default: INFO)
The default --host binds every interface
0.0.0.0 is the default because the server normally runs inside a container, where
the container runtime decides what is published. Running it directly on a host with
the default reaches the whole network over plain HTTP. Pass --host 127.0.0.1 (or
publish only to loopback in Docker) and put a TLS-terminating reverse proxy in front
of anything that needs to be reachable off the machine.
Examples:
# List all available tools
silo-sdk-mcp --list-tools
# Start stdio server (for Claude Desktop integration)
silo-sdk-mcp --transport stdio
# Start an HTTP server on port 8080
silo-sdk-mcp --transport streamable-http --port 8080
--transport sse also works, but Streamable HTTP supersedes it — prefer
streamable-http for anything new.