{"apiVersion":"v1","directorySlug":"layer8app-mcp-221ec3c3f7","title":"Layer8app","description":null,"pageUrl":"https://www.mcpbundles.com/skills/layer8app-mcp-221ec3c3f7","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.layer8app.com/mcp","hostedMcpUrl":null,"toolCount":64,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.layer8app/layer8app-mcp-221ec3c3f7","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"layer8_get_task_status","description":"READ-ONLY: Retrieve the current lifecycle status of an existing OpenClaw task. Returns status, execution readiness, UCB verdict, timestamps, and artifact paths. This tool does NOT create, queue, modify, or execute anything.","inputSchema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_task_status","displayName":"layer8_get_task_status","title":"layer8_get_task_status"},{"name":"layer8_get_task_result","description":"READ-ONLY: Retrieve the final result artifact for a completed or blocked OpenClaw task. Returns full result payload including status, summary, blocker, UCB verdict. This tool does NOT create, queue, modify, or execute anything.","inputSchema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_task_result","displayName":"layer8_get_task_result","title":"layer8_get_task_result"},{"name":"layer8_list_recent_tasks","description":"READ-ONLY: List the most recent OpenClaw tasks across inbox/claims/outbox. Returns task status summaries ordered by recency. This tool does NOT create, queue, modify, or execute anything.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":10,"maximum":100,"minimum":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_list_recent_tasks","displayName":"layer8_list_recent_tasks","title":"layer8_list_recent_tasks"},{"name":"layer8_get_incident","description":"READ-ONLY: Retrieve a normalized incident artifact for a quarantined Layer 8 task. Returns taxonomy, lease snapshot, artifact snapshot, and evidence fields. This tool does NOT create, queue, modify, or execute anything.","inputSchema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_incident","displayName":"layer8_get_incident","title":"layer8_get_incident"},{"name":"layer8_list_recent_incidents","description":"READ-ONLY: List the most recent normalized incident artifacts for quarantined or failed Layer 8 tasks. This tool does NOT create, queue, modify, or execute anything.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":10,"maximum":50,"minimum":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_list_recent_incidents","displayName":"layer8_list_recent_incidents","title":"layer8_list_recent_incidents"},{"name":"layer8_read_file","description":"READ-ONLY: Read contents of a source file from the Layer 8 repo by path. Supports optional start_line/end_line for reading ranges of large files. Cannot read binary files, .git, or node_modules. Max 256KB. This tool does NOT modify anything.","inputSchema":{"type":"object","required":["path"],"properties":{"path":{"type":"string","minLength":1},"end_line":{"type":"integer","minimum":1},"start_line":{"type":"integer","minimum":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_read_file","displayName":"layer8_read_file","title":"layer8_read_file"},{"name":"layer8_list_directory","description":"READ-ONLY: List files and subdirectories at a repo path. Excludes .git, node_modules, __pycache__. Max depth 4, max 500 entries. This tool does NOT modify anything.","inputSchema":{"type":"object","properties":{"path":{"type":"string","default":"."},"max_depth":{"type":"integer","default":2,"maximum":4,"minimum":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_list_directory","displayName":"layer8_list_directory","title":"layer8_list_directory"},{"name":"layer8_search_code","description":"READ-ONLY: Search for a regex or literal pattern across source files. Returns matching lines with file path, line number, and text. Excludes .git, node_modules, binary files. Max 100 results. This tool does NOT modify anything.","inputSchema":{"type":"object","required":["pattern"],"properties":{"pattern":{"type":"string","minLength":1},"file_glob":{"type":"string"},"max_results":{"type":"integer","default":50,"maximum":100,"minimum":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_search_code","displayName":"layer8_search_code","title":"layer8_search_code"},{"name":"layer8_queue_inbox_task","description":"WRITE: Queue a new bounded OpenClaw task for execution by the Droplet runner. Creates a task artifact in GitHub and syncs the local checkout so reads see it immediately. MCP queue defaults to PR-native publish mode (pull_request) unless explicitly overridden. envelope_id is REQUIRED (runtime-enforced) for any payload carrying bounded mutations; submissions without it fail closed with missing_envelope_id. A repeated envelope_id dedupes to the original task (no new artifact). A bounded mutation se","inputSchema":{"type":"object","properties":{"goal":{"type":"string"},"task":{"type":"object"},"execution":{"type":"object"},"mutations":{"type":"array","items":{"type":"object"}},"policy_ref":{"type":"string"},"envelope_id":{"type":"string"},"mutation_op":{"enum":["replace_in_file","write_file"],"type":"string"},"mutation_set":{"type":"array","items":{"type":"object"}},"publish_mode":{"enum":["pull_request","direct_main"],"type":"string","default":"pull_request"},"allowed_paths":{"type":"array","items":{"type":"string"}},"base_head_sha":{"type":"string"},"files_to_read":{"type":"array","items":{"type":"string"}},"mutation_path":{"type":"string"},"test_commands":{"type":"array","items":{"type":"string"}},"policy_verdict":{"enum":["allow","deny"],"type":"string"},"mutation_content":{"type":"string"},"mutation_new_text":{"type":"string"},"mutation_old_text":{"type":"string"},"files_allowed_to_edit":{"type":"array","items":{"type":"string"}},"mutation_expected_before":{"type":"string"}},"additionalProperties":false},"logicalName":"layer8_queue_inbox_task","displayName":"layer8_queue_inbox_task","title":"layer8_queue_inbox_task","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_validate_queue_task","description":"READ-ONLY: Validate a bounded queue task contract without writing issues or repo artifacts. Runs the SAME shared decision logic as layer8_queue_inbox_task (envelope, size, and contract guards): ok:true guarantees the identical payload queues as exactly one task. envelope_id is REQUIRED for bounded mutation payloads (missing_envelope_id otherwise); oversized sets return mutation_set_too_large_for_single_task, identically to the queue path. Also validates the claude_code review_only development ex","inputSchema":{"type":"object","properties":{"goal":{"type":"string"},"task":{"type":"object"},"execution":{"type":"object"},"mutations":{"type":"array","items":{"type":"object"}},"policy_ref":{"type":"string"},"envelope_id":{"type":"string"},"mutation_op":{"enum":["replace_in_file","write_file"],"type":"string"},"mutation_set":{"type":"array","items":{"type":"object"}},"publish_mode":{"enum":["pull_request","direct_main"],"type":"string","default":"pull_request"},"allowed_paths":{"type":"array","items":{"type":"string"}},"base_head_sha":{"type":"string"},"files_to_read":{"type":"array","items":{"type":"string"}},"mutation_path":{"type":"string"},"test_commands":{"type":"array","items":{"type":"string"}},"policy_verdict":{"enum":["allow","deny"],"type":"string"},"mutation_content":{"type":"string"},"mutation_new_text":{"type":"string"},"mutation_old_text":{"type":"string"},"files_allowed_to_edit":{"type":"array","items":{"type":"string"}},"mutation_expected_before":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_validate_queue_task","displayName":"layer8_validate_queue_task","title":"layer8_validate_queue_task"},{"name":"layer8_dev_handoff_create","description":"DEV_TOOLING WRITE: Create a repo-backed development handoff artifact. Internal tooling only; not product behavior.","inputSchema":{"type":"object","required":["created_by","title"],"properties":{"status":{"enum":["open","in_progress","blocked","complete","abandoned"],"type":"string","default":"open"},"summary":{"type":"string"},"created_by":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_dev_handoff_create","displayName":"layer8_dev_handoff_create","title":"layer8_dev_handoff_create","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_dev_handoff_read","description":"DEV_TOOLING READ: Read a repo-backed development handoff artifact by ID.","inputSchema":{"type":"object","required":["handoff_id"],"properties":{"handoff_id":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_dev_handoff_read","displayName":"layer8_dev_handoff_read","title":"layer8_dev_handoff_read"},{"name":"layer8_dev_handoff_append","description":"DEV_TOOLING WRITE: Append an event to a repo-backed development handoff artifact.","inputSchema":{"type":"object","required":["handoff_id","actor","event_type","message"],"properties":{"actor":{"type":"string","minLength":1},"status":{"enum":["open","in_progress","blocked","complete","abandoned"],"type":"string"},"message":{"type":"string","minLength":1},"metadata":{"type":"object"},"event_type":{"enum":["note","proposal","critique","decision","blocker","result","handoff"],"type":"string"},"handoff_id":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_dev_handoff_append","displayName":"layer8_dev_handoff_append","title":"layer8_dev_handoff_append","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_dev_handoff_list","description":"DEV_TOOLING READ: List recent repo-backed development handoff artifacts.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":20,"maximum":100,"minimum":1},"status":{"enum":["open","in_progress","blocked","complete","abandoned"],"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_dev_handoff_list","displayName":"layer8_dev_handoff_list","title":"layer8_dev_handoff_list"},{"name":"layer8_dev_command_profiles","description":"DEV_TOOLING READ: List fixed command profiles available to the prototype-build command runner.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_dev_command_profiles","displayName":"layer8_dev_command_profiles","title":"layer8_dev_command_profiles"},{"name":"layer8_dev_command_run","description":"DEV_TOOLING WRITE: Run one fixed prototype-build command profile and return structured evidence.","inputSchema":{"type":"object","required":["requested_by","profile_id"],"properties":{"profile_id":{"type":"string","minLength":1},"requested_by":{"enum":["claude","chatgpt","operator","dcc-service","openclaw"],"type":"string"}},"additionalProperties":false},"logicalName":"layer8_dev_command_run","displayName":"layer8_dev_command_run","title":"layer8_dev_command_run","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_dev_router_profiles","description":"DEV_TOOLING READ: List fixed handoff-to-task router profiles.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_dev_router_profiles","displayName":"layer8_dev_router_profiles","title":"layer8_dev_router_profiles"},{"name":"layer8_dev_route_handoff_preview","description":"DEV_TOOLING READ: Preview the bounded queue task contract generated from a dev handoff.","inputSchema":{"type":"object","required":["handoff_id","requested_by"],"properties":{"handoff_id":{"type":"string","minLength":1},"profile_id":{"type":"string","default":"handoff_evidence_task"},"requested_by":{"enum":["claude","chatgpt","operator","dcc-service","openclaw"],"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_dev_route_handoff_preview","displayName":"layer8_dev_route_handoff_preview","title":"layer8_dev_route_handoff_preview"},{"name":"layer8_dev_route_handoff_queue","description":"DEV_TOOLING WRITE: Route a dev handoff into a bounded OpenClaw queue task.","inputSchema":{"type":"object","required":["handoff_id","requested_by"],"properties":{"handoff_id":{"type":"string","minLength":1},"profile_id":{"type":"string","default":"handoff_evidence_task"},"requested_by":{"enum":["claude","chatgpt","operator","dcc-service","openclaw"],"type":"string"}},"additionalProperties":false},"logicalName":"layer8_dev_route_handoff_queue","displayName":"layer8_dev_route_handoff_queue","title":"layer8_dev_route_handoff_queue","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_sync_repo","description":"SYNC: Force the local repo checkout to sync with GitHub (git fetch + git pull --ff-only). Use this if reads seem stale or after external changes to the repo. Returns the new HEAD SHA and sync status. Safe to call anytime.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"layer8_sync_repo","displayName":"layer8_sync_repo","title":"layer8_sync_repo","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_get_service_status","description":"OPS READ-ONLY: Get systemctl status for an allowlisted droplet service. Returns service state (running/inactive/failed), active line, and recent output. Allowed services: openclaw-runner, layer8-mcp-gateway, caddy, bridge-mcp-server-read/queue. This tool does NOT modify anything.","inputSchema":{"type":"object","required":["service_name"],"properties":{"service_name":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_service_status","displayName":"layer8_get_service_status","title":"layer8_get_service_status"},{"name":"layer8_get_service_journal","description":"OPS READ-ONLY: Get recent journal/log entries for an allowlisted droplet service. Returns the last N lines from journalctl. Max 200 lines. This tool does NOT modify anything.","inputSchema":{"type":"object","required":["service_name"],"properties":{"lines":{"type":"integer","default":50,"maximum":200,"minimum":1},"service_name":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_service_journal","displayName":"layer8_get_service_journal","title":"layer8_get_service_journal"},{"name":"layer8_restart_service","description":"OPS WRITE: Restart an allowlisted droplet service via systemctl restart. Returns the service state after restart. Use this ONLY when a service is confirmed unhealthy and needs recovery. Requires sudo access for the gateway user.","inputSchema":{"type":"object","required":["service_name"],"properties":{"service_name":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_restart_service","displayName":"layer8_restart_service","title":"layer8_restart_service","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_get_droplet_state","description":"OPS READ-ONLY: Get a structured summary of the droplet's current state. Returns git HEAD/branch/dirty status, index.lock presence, key service states, disk usage, and inbox/claims/outbox queue depth. This tool does NOT modify anything. Use as a health check.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_droplet_state","displayName":"layer8_get_droplet_state","title":"layer8_get_droplet_state"},{"name":"layer8_list_stuck_tasks","description":"OPS READ-ONLY: Find inbox tasks that are stuck in 'queued' status with no claim or result. These tasks were queued but never picked up by the runner. Returns task IDs, creation timestamps, and inbox paths. This tool does NOT modify anything.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_list_stuck_tasks","displayName":"layer8_list_stuck_tasks","title":"layer8_list_stuck_tasks"},{"name":"layer8_stop_active_task","description":"OPS WRITE: Stop an actively claimed task by task_id, write an incident artifact, and transition the claim out of active lease state without removing inbox or claim artifacts. Use this before quarantining a task that is stuck in an active reclaim loop.","inputSchema":{"type":"object","required":["task_id"],"properties":{"reason":{"type":"string"},"task_id":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_stop_active_task","displayName":"layer8_stop_active_task","title":"layer8_stop_active_task","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_quarantine_failed_task","description":"OPS WRITE: Quarantine a failed task by task_id, optionally restore specific tracked repo paths, remove the matching inbox/claim artifacts, commit the cleanup, and push it. Use this for known failed-task cleanup paths instead of shell access.","inputSchema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"string","minLength":1},"restore_paths":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"logicalName":"layer8_quarantine_failed_task","displayName":"layer8_quarantine_failed_task","title":"layer8_quarantine_failed_task","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_set_runtime_secret","description":"OPS WRITE: Set an allowlisted runtime secret in an allowlisted env file, return only redacted metadata, and optionally restart the associated service.","inputSchema":{"type":"object","required":["target","key","value"],"properties":{"key":{"type":"string","minLength":1},"value":{"type":"string"},"target":{"type":"string","minLength":1},"restart":{"type":"boolean","default":true}},"additionalProperties":false},"logicalName":"layer8_set_runtime_secret","displayName":"layer8_set_runtime_secret","title":"layer8_set_runtime_secret","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_get_runtime_secret_status","description":"OPS READ-ONLY: Return redacted presence metadata for an allowlisted runtime secret without revealing the value.","inputSchema":{"type":"object","required":["target","key"],"properties":{"key":{"type":"string","minLength":1},"target":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_runtime_secret_status","displayName":"layer8_get_runtime_secret_status","title":"layer8_get_runtime_secret_status"},{"name":"layer8_validate_postgres_compose_runtime","description":"Bounded PostgreSQL Compose runtime check.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"layer8_validate_postgres_compose_runtime","displayName":"layer8_validate_postgres_compose_runtime","title":"layer8_validate_postgres_compose_runtime","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_validate_scope1a_docker_packaging","description":"OPS BOUNDED: Run the Scope 1A Docker packaging validation against the production image build. All operational paths/project/service names are hardcoded constants — this tool accepts no caller-provided command, path, repo path, clone path, compose file, compose project, service name, or URL. Only an optional `dry_run: boolean` is accepted (for contract-mode testability without Docker). Fails closed on missing Docker daemon, stale pre-#191 HEAD, missing builder stage, missing required dist artifac","inputSchema":{"type":"object","properties":{"dry_run":{"type":"boolean"}},"additionalProperties":false},"logicalName":"layer8_validate_scope1a_docker_packaging","displayName":"layer8_validate_scope1a_docker_packaging","title":"layer8_validate_scope1a_docker_packaging","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_start_scope1a_docker_packaging_validation","description":"OPS BOUNDED: Start ONE Scope 1A Docker packaging validation job and return immediately with a validation_id. Single-flight — refuses if a validation is already running. All operational paths/project/service names are hardcoded constants; accepts no caller-provided command, path, compose project, service name, or URL. Only an optional `dry_run: boolean` is accepted. Poll with the status/result tools. This is a bounded validation job control, not arbitrary shell execution. [Discovery: scope1a / Sc","inputSchema":{"type":"object","properties":{"dry_run":{"type":"boolean"}},"additionalProperties":false},"logicalName":"layer8_start_scope1a_docker_packaging_validation","displayName":"layer8_start_scope1a_docker_packaging_validation","title":"layer8_start_scope1a_docker_packaging_validation","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_get_scope1a_docker_packaging_validation_status","description":"OPS READ-ONLY: Return current structured evidence and state for a Scope 1A Docker packaging validation job. Accepts only a validation_id (strictly validated; cannot escape the job directory). Does not mutate anything except deterministic reconciliation of an abandoned job to a terminal state. [Discovery: scope1a / Scope 1A / docker / packaging / validation / status. Sibling tools: layer8_start_scope1a_docker_packaging_validation (start), layer8_get_scope1a_docker_packaging_validation_result (res","inputSchema":{"type":"object","required":["validation_id"],"properties":{"validation_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_scope1a_docker_packaging_validation_status","displayName":"layer8_get_scope1a_docker_packaging_validation_status","title":"layer8_get_scope1a_docker_packaging_validation_status"},{"name":"layer8_get_scope1a_docker_packaging_validation_result","description":"OPS READ-ONLY: Return final structured evidence for a Scope 1A Docker packaging validation job once it is terminal. While still running, returns ok:null and state:'running' without blocking. Accepts only a validation_id (strictly validated; cannot escape the job directory). [Discovery: scope1a / Scope 1A / docker / packaging / validation / result. Sibling tools: layer8_start_scope1a_docker_packaging_validation (start), layer8_get_scope1a_docker_packaging_validation_status (status), layer8_valida","inputSchema":{"type":"object","required":["validation_id"],"properties":{"validation_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_scope1a_docker_packaging_validation_result","displayName":"layer8_get_scope1a_docker_packaging_validation_result","title":"layer8_get_scope1a_docker_packaging_validation_result"},{"name":"layer8_run_validation_check","description":"OPS READ-ONLY: Run one allowlisted validation check against the repo/runtime and return structured output. This does NOT provide arbitrary shell access.","inputSchema":{"type":"object","required":["check_name"],"properties":{"check_name":{"type":"string","minLength":1}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_run_validation_check","displayName":"layer8_run_validation_check","title":"layer8_run_validation_check"},{"name":"layer8_product_get_state","description":"OPS READ-ONLY: Get a structured summary of the app-serving layer8-product droplet. Returns product repo HEAD, dirty state, build artifact metadata, and Caddy status. Fails closed if the bounded product channel is not configured.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_product_get_state","displayName":"layer8_product_get_state","title":"layer8_product_get_state"},{"name":"layer8_product_normalize_checkout","description":"OPS WRITE: Normalize the layer8-product checkout using a bounded allowlist only. Removes allowlisted build artifacts, restores explicitly allowlisted generated tracked files, and fails closed if unexpected dirty paths remain.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"layer8_product_normalize_checkout","displayName":"layer8_product_normalize_checkout","title":"layer8_product_normalize_checkout","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_product_deploy_backend","description":"OPS WRITE: Run the bounded layer8-product backend promotion path only. Fetches current main, restarts the allowlisted product backend service, writes a backend promotion marker, and returns service evidence. Fails closed on dirty overlap, missing product config, or deploy errors.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"layer8_product_deploy_backend","displayName":"layer8_product_deploy_backend","title":"layer8_product_deploy_backend","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_product_m8_work_primary_preflight","description":"OPS READ-ONLY: Secret-redacted readiness proof for the explicitly authorized M8 work_primary live validation. Checks exact source, backend, Bitwarden configuration presence, Playwright, UCB configuration and first-party reachability; never fetches or returns secret material.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_product_m8_work_primary_preflight","displayName":"layer8_product_m8_work_primary_preflight","title":"layer8_product_m8_work_primary_preflight"},{"name":"layer8_product_deploy_frontend","description":"OPS WRITE: Run the bounded layer8-product frontend deployment path only. Fetches current main, performs an allowlisted frontend build, reloads Caddy, and returns artifact evidence. Fails closed on dirty overlap, missing product config, or deploy errors.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"layer8_product_deploy_frontend","displayName":"layer8_product_deploy_frontend","title":"layer8_product_deploy_frontend","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_product_validate_live_api","description":"OPS READ-ONLY: Validate the live public incident API against the bounded product channel. Checks /api/incidents/recent and one incident detail path, and returns structured validation evidence. Fails closed if the bounded product channel or public URL is not configured.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_product_validate_live_api","displayName":"layer8_product_validate_live_api","title":"layer8_product_validate_live_api"},{"name":"layer8_product_validate_live_ui","description":"OPS READ-ONLY: Compare the layer8-product local build artifacts with the live public app response. Returns local vs live asset references and whether they match. Fails closed if the bounded product channel or public URL is not configured.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_product_validate_live_ui","displayName":"layer8_product_validate_live_ui","title":"layer8_product_validate_live_ui"},{"name":"layer8_auto_heal","description":"OPS: Run automatic self-healing for known droplet failure modes. Clears stale git locks, removes bytecode and backup artifacts, resets dirty working tree, and restarts unhealthy services. Returns a structured report of every action taken. Safe to call anytime — idempotent and non-destructive to real state. Use this FIRST when any other tool returns errors or when the runner is unhealthy.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"layer8_auto_heal","displayName":"layer8_auto_heal","title":"layer8_auto_heal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_get_pr_status","description":"DEV_TOOLING READ: Read-only PR status (state, draft, base/head branches, head SHA, mergeable_state, changed files, required-check status) for the hardcoded repo jessonmoo-layer8/layer8-platform. Computes ready_for_operator_merge against the operator-merge gate (PR open, not draft, base=main, mergeable_state=clean, all required checks terminal/success, expected_head_sha matches when provided). Never invokes `gh pr merge` and never writes to GitHub.","inputSchema":{"type":"object","required":["pr_number"],"properties":{"pr_number":{"type":"integer","minimum":1},"expected_head_sha":{"type":"string","maxLength":40,"minLength":7}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_pr_status","displayName":"layer8_get_pr_status","title":"layer8_get_pr_status"},{"name":"layer8_record_pr_review","description":"DEV_TOOLING WRITE (proposals critique): Append durable PR review evidence (pr_number, head_sha, changed_files, checks, summary) and a verdict (accept_recommended / revise / reject_recommended) to an existing proposal via the proposals critique system. Reuses the proposals storage, identity rules (planning-only), and timestamping; no parallel evidence store. Identifier-only — no merge, no deploy, no service restart.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","proposal_id","pr_number","head_sha","changed_files","checks","verdict","summary","authority_level_checked"],"properties":{"checks":{"type":"array","items":{"type":"object"}},"summary":{"type":"string","minLength":1},"verdict":{"enum":["accept_recommended","revise","reject_recommended"],"type":"string"},"head_sha":{"type":"string","maxLength":40,"minLength":7},"pr_number":{"type":"integer","minimum":1},"proposal_id":{"type":"string","minLength":1},"changed_files":{"type":"array","items":{"type":"string"}},"caller_identity":{"enum":["chatgpt","claude","dcc-service"],"type":"string"},"principal_credential":{"type":"string","minLength":1},"authority_level_checked":{"type":"integer","maximum":8,"minimum":1}},"additionalProperties":false},"logicalName":"layer8_record_pr_review","displayName":"layer8_record_pr_review","title":"layer8_record_pr_review","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_merge_pr","description":"DEV_TOOLING WRITE: Operator-authorized squash merge of a PR in the hardcoded repo jessonmoo-layer8/layer8-platform. proposal_id is MANDATORY — there is no unlinked merge path. Refuses unless ALL hold: explicit operator_authorization; a known operator-accepted proposal (status=accepted with operator adjudication decision=accepted, operator_identity=operator, valid decided_at); at least one PR-review evidence record matching this pr_number and the EXACT FULL current head SHA with verdict=accept_re","inputSchema":{"type":"object","required":["pr_number","expected_head_sha","expected_base_branch","operator_authorization","proposal_id","principal_credential"],"properties":{"pr_number":{"type":"integer","minimum":1},"proposal_id":{"type":"string","minLength":1},"expected_head_sha":{"type":"string","pattern":"^[0-9a-fA-F]{40}$"},"expected_base_branch":{"enum":["main"],"type":"string"},"principal_credential":{"type":"string","minLength":1},"operator_authorization":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_merge_pr","displayName":"layer8_merge_pr","title":"layer8_merge_pr","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_get_pr_check_log","description":"DEV_TOOLING READ-ONLY: Bounded, secret-redacted tail of a completed GitHub Actions check-run job log for the hardcoded repo jessonmoo-layer8/layer8-platform, bound to an EXACT full 40-char PR head SHA. Fresh GET /pulls/{n} first; on live-head mismatch fails closed with head_sha_mismatch and fetches nothing. Fails closed with check_name_ambiguous or job_selection_ambiguous (with disclosed candidate identifiers) when run or job binding is not deterministic. Otherwise returns run/job identifiers, p","inputSchema":{"type":"object","required":["pr_number","expected_head_sha","check_name"],"properties":{"pr_number":{"type":"integer","minimum":1},"check_name":{"type":"string","minLength":1},"max_tail_bytes":{"type":"integer","maximum":16384,"minimum":1},"expected_head_sha":{"type":"string","pattern":"^[0-9a-fA-F]{40}$"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_pr_check_log","displayName":"layer8_get_pr_check_log","title":"layer8_get_pr_check_log"},{"name":"layer8_get_pr_diff","description":"DEV_TOOLING READ: Fetch a PR's diff for the hardcoded repo jessonmoo-layer8/layer8-platform, bound to an EXACT full 40-char head SHA. Fresh GET /pulls/{n} → enforce pr.head.sha == expected_head_sha (else pr_head_changed). IMMUTABLE-REF fetch via GET /compare/{base_sha}...{head_sha} with Accept: application/vnd.github.v3.diff — both refs are pinned commit SHAs, so the served diff cannot change if the PR head later moves. The mutable /pulls/{n}.diff endpoint is NEVER used. Belt-and-braces: after t","inputSchema":{"type":"object","required":["pr_number","expected_head_sha"],"properties":{"pr_number":{"type":"integer","minimum":1},"expected_head_sha":{"type":"string","pattern":"^[0-9a-fA-F]{40}$"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_get_pr_diff","displayName":"layer8_get_pr_diff","title":"layer8_get_pr_diff"},{"name":"layer8_read_pr_file","description":"DEV_TOOLING READ: Read a single file from a PR's bound head for the hardcoded repo jessonmoo-layer8/layer8-platform, bound to an EXACT full 40-char head SHA. Path validation BEFORE any GitHub call: refuses non-string/empty path, absolute paths (leading '/'), drive/scheme prefixes (any ':'), backslashes, URL-encoded separators or dots (%2e/%2f, case-insensitive), '..' segments, and whitespace-only segments — verbatim, no normalization. Fresh GET /pulls/{n} → enforce pr.head.sha == expected_head_s","inputSchema":{"type":"object","required":["pr_number","expected_head_sha","path"],"properties":{"path":{"type":"string","minLength":1},"end_line":{"type":"integer","minimum":1},"pr_number":{"type":"integer","minimum":1},"start_line":{"type":"integer","minimum":1},"expected_head_sha":{"type":"string","pattern":"^[0-9a-fA-F]{40}$"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_read_pr_file","displayName":"layer8_read_pr_file","title":"layer8_read_pr_file"},{"name":"layer8_open_pr_evidence","description":"DEV_TOOLING WRITE: Open OR idempotently reuse a pull request in the hardcoded repo jessonmoo-layer8/layer8-platform with base branch main only. Authority derives from a GATEWAY-VERIFIED principal (principal_credential), NOT from caller_identity/requested_by, which are metadata only. Requires expected_head_sha (full 40-char); the live branch head is re-verified to equal it immediately before reuse or creation, failing closed with head_sha_mismatch and NO GitHub mutation on mismatch. Idempotent: i","inputSchema":{"type":"object","required":["principal_credential","head_branch","expected_head_sha","title"],"properties":{"body":{"type":"string"},"head_branch":{"type":"string","minLength":1},"caller_identity":{"type":"string"},"expected_head_sha":{"type":"string","pattern":"^[0-9a-fA-F]{40}$"},"principal_credential":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_open_pr_evidence","displayName":"layer8_open_pr_evidence","title":"layer8_open_pr_evidence","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_review_scan_item","description":"DEV_TOOLING OPERATOR WRITE: Transition exactly one fixed-repository scan issue from needs-review to approved, deferred, or rejected after an explicit operator decision. Requires a gateway-verified operator credential and fresh issue-state proof. Reject closes that issue; other decisions keep it open. Never bulk-transitions or promotes an item to the priority queue. Intentionally unavailable to planning OAuth principals.","inputSchema":{"type":"object","required":["principal_credential","caller_identity","issue_number","decision"],"properties":{"decision":{"enum":["approve","defer","reject"],"type":"string"},"issue_number":{"type":"integer","minimum":1},"reviewer_note":{"type":"string","maxLength":4000},"caller_identity":{"enum":["operator"],"type":"string"},"principal_credential":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_review_scan_item","displayName":"layer8_review_scan_item","title":"layer8_review_scan_item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_propose_change","description":"DEV TOOLING WRITE: submit an inert proposal for operator review.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","spec","kind","authority_level_checked"],"properties":{"kind":{"enum":["architecture","critique_response","mutation_contract","patch","spec"],"type":"string"},"spec":{"type":"string","minLength":1},"responds_to":{"type":"string"},"caller_identity":{"enum":["chatgpt","claude","dcc-service"],"type":"string"},"principal_credential":{"type":"string","minLength":1},"authority_level_checked":{"type":"integer","maximum":8,"minimum":1}},"additionalProperties":false},"logicalName":"layer8_propose_change","displayName":"layer8_propose_change","title":"layer8_propose_change","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_list_proposals","description":"DEV TOOLING READ: list shared proposal summaries.","inputSchema":{"type":"object","required":["caller_identity"],"properties":{"kind":{"enum":["architecture","critique_response","mutation_contract","patch","spec"],"type":"string"},"since":{"type":"string"},"status":{"enum":["accepted","open","rejected"],"type":"string"},"caller_identity":{"enum":["chatgpt","claude","dcc-service","operator"],"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_list_proposals","displayName":"layer8_list_proposals","title":"layer8_list_proposals"},{"name":"layer8_critique_proposal","description":"DEV TOOLING WRITE: append advisory critique; status is unchanged.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","proposal_id","findings","verdict","authority_level_checked"],"properties":{"verdict":{"enum":["accept_recommended","reject_recommended","revise"],"type":"string"},"findings":{"type":"array","items":{"type":"object"},"minItems":1},"proposal_id":{"type":"string","minLength":1},"caller_identity":{"enum":["chatgpt","claude","dcc-service"],"type":"string"},"principal_credential":{"type":"string","minLength":1},"authority_level_checked":{"type":"integer","maximum":8,"minimum":1}},"additionalProperties":false},"logicalName":"layer8_critique_proposal","displayName":"layer8_critique_proposal","title":"layer8_critique_proposal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_read_proposal","description":"DEV TOOLING READ: read proposal with critiques.","inputSchema":{"type":"object","required":["caller_identity","proposal_id"],"properties":{"proposal_id":{"type":"string","minLength":1},"caller_identity":{"enum":["chatgpt","claude","dcc-service","operator"],"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"layer8_read_proposal","displayName":"layer8_read_proposal","title":"layer8_read_proposal"},{"name":"layer8_accept_proposal","description":"DEV TOOLING WRITE: operator marks proposal accepted.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","proposal_id","reason"],"properties":{"reason":{"type":"string","minLength":1},"proposal_id":{"type":"string","minLength":1},"caller_identity":{"enum":["chatgpt","claude","dcc-service","operator"],"type":"string"},"principal_credential":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_accept_proposal","displayName":"layer8_accept_proposal","title":"layer8_accept_proposal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_reject_proposal","description":"DEV TOOLING WRITE: operator marks proposal rejected.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","proposal_id","reason"],"properties":{"reason":{"type":"string","minLength":1},"proposal_id":{"type":"string","minLength":1},"caller_identity":{"enum":["chatgpt","claude","dcc-service","operator"],"type":"string"},"principal_credential":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_reject_proposal","displayName":"layer8_reject_proposal","title":"layer8_reject_proposal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_stage_proposal_candidate","description":"DEV TOOLING WRITE (PLANNING-principal-gated): stage ONE exact immutable proposal candidate. The gateway-verified planning principal BECOMES author_identity; the caller cannot supply an author. The spec is preserved byte-for-byte (never stripped or normalized); raw byte count, raw sha256, and trailing-newline-normalized sha256 are computed server-side and returned. No proposal is filed; no adjudication occurs.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","spec","kind","authority_level_checked"],"properties":{"kind":{"enum":["architecture","critique_response","mutation_contract","patch","spec"],"type":"string"},"spec":{"type":"string","minLength":1},"responds_to":{"type":"string"},"caller_identity":{"enum":["chatgpt","claude","dcc-service"],"type":"string"},"principal_credential":{"type":"string","minLength":1},"authority_level_checked":{"type":"integer","maximum":8,"minimum":1}},"additionalProperties":false},"logicalName":"layer8_stage_proposal_candidate","displayName":"layer8_stage_proposal_candidate","title":"layer8_stage_proposal_candidate","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_review_staged_proposal_candidate","description":"DEV TOOLING WRITE (PLANNING-principal-gated): record ONE independent pre-filing review of a staged proposal candidate. The gateway-verified planning principal BECOMES reviewer_identity; the caller cannot supply a reviewer, and the reviewer must differ from the staged author. The review is immutably bound to the candidate id and its exact raw/normalized sha256. No proposal is filed.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","candidate_id","findings","verdict","authority_level_checked"],"properties":{"verdict":{"enum":["accept_recommended","reject_recommended","revise"],"type":"string"},"findings":{"type":"array","items":{"type":"object"},"minItems":1},"candidate_id":{"type":"string","minLength":1},"caller_identity":{"enum":["chatgpt","claude","dcc-service"],"type":"string"},"principal_credential":{"type":"string","minLength":1},"authority_level_checked":{"type":"integer","maximum":8,"minimum":1}},"additionalProperties":false},"logicalName":"layer8_review_staged_proposal_candidate","displayName":"layer8_review_staged_proposal_candidate","title":"layer8_review_staged_proposal_candidate","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_authorize_proposal_candidate","description":"DEV TOOLING WRITE (OPERATOR-ONLY via gateway principal gate): create a byte-bound, single-use, TTL-bounded authorization to file ONE staged proposal candidate that passed an authenticated independent pre-filing review (accept_recommended only, authenticated reviewer != authenticated author). The operator references ONLY the immutable candidate and review artifacts; author, reviewer, verdict, bytes, kind, and authority level are all DERIVED from those artifacts, never operator-supplied. No propos","inputSchema":{"type":"object","required":["caller_identity","principal_credential","candidate_id","candidate_review_id"],"properties":{"ttl_seconds":{"type":"integer","maximum":3600,"minimum":60},"candidate_id":{"type":"string","minLength":1},"caller_identity":{"enum":["chatgpt","claude","dcc-service","operator"],"type":"string"},"candidate_review_id":{"type":"string","minLength":1},"principal_credential":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_authorize_proposal_candidate","displayName":"layer8_authorize_proposal_candidate","title":"layer8_authorize_proposal_candidate","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_file_authorized_proposal","description":"DEV TOOLING WRITE (deterministic filing executor): file the exact proposal bound by a prior gateway-verified operator authorization. Accepts ONLY filing_authorization_id — the caller cannot select identity, bytes, kind, target, or authority level. Single-use with idempotent replay (a retry returns the same proposal id); fails closed on unknown, expired, or conflicting authorization state. Filing grants ZERO acceptance or adjudication authority; the proposal status remains open.","inputSchema":{"type":"object","required":["filing_authorization_id"],"properties":{"filing_authorization_id":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_file_authorized_proposal","displayName":"layer8_file_authorized_proposal","title":"layer8_file_authorized_proposal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_stage_critique_candidate","description":"DEV TOOLING WRITE (PLANNING-principal-gated): stage ONE exact immutable advisory critique candidate against an OPEN proposal. The gateway-verified planning principal BECOMES critiquer_identity; the caller cannot supply a critiquer, and the critiquer must differ from the proposal author. The critique itself is the independent review artifact; its canonical-JSON payload sha256 is computed server-side (optionally checked against expected_payload_sha256). No critique is appended.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","proposal_id","findings","verdict","authority_level_checked"],"properties":{"verdict":{"enum":["accept_recommended","reject_recommended","revise"],"type":"string"},"findings":{"type":"array","items":{"type":"object"},"minItems":1},"proposal_id":{"type":"string","minLength":1},"caller_identity":{"enum":["chatgpt","claude","dcc-service"],"type":"string"},"principal_credential":{"type":"string","minLength":1},"authority_level_checked":{"type":"integer","maximum":8,"minimum":1},"expected_payload_sha256":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}},"additionalProperties":false},"logicalName":"layer8_stage_critique_candidate","displayName":"layer8_stage_critique_candidate","title":"layer8_stage_critique_candidate","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_authorize_critique_candidate","description":"DEV TOOLING WRITE (OPERATOR-ONLY via gateway principal gate): create a byte-bound (canonical-JSON sha256), single-use, TTL-bounded authorization to append ONE staged critique candidate. The operator references ONLY the immutable staged critique artifact; critiquer identity, target, findings, verdict, and authority level are all DERIVED from it, never operator-supplied. No critique is appended by this call.","inputSchema":{"type":"object","required":["caller_identity","principal_credential","critique_candidate_id"],"properties":{"ttl_seconds":{"type":"integer","maximum":3600,"minimum":60},"caller_identity":{"enum":["chatgpt","claude","dcc-service","operator"],"type":"string"},"principal_credential":{"type":"string","minLength":1},"critique_candidate_id":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_authorize_critique_candidate","displayName":"layer8_authorize_critique_candidate","title":"layer8_authorize_critique_candidate","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"layer8_file_authorized_critique","description":"DEV TOOLING WRITE (deterministic filing executor): append the exact advisory critique bound by a prior gateway-verified operator authorization. Accepts ONLY filing_authorization_id. Never alters proposal status; single-use with idempotent replay; fails closed on unknown, expired, or conflicting authorization state.","inputSchema":{"type":"object","required":["filing_authorization_id"],"properties":{"filing_authorization_id":{"type":"string","minLength":1}},"additionalProperties":false},"logicalName":"layer8_file_authorized_critique","displayName":"layer8_file_authorized_critique","title":"layer8_file_authorized_critique","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Layer8app&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AubGF5ZXI4YXBwLmNvbS9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Layer8app%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.layer8app.com%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Layer8app%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.layer8app.com%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Layer8app&connectorUrl=https%3A%2F%2Fmcp.layer8app.com%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Layer8app\" --url \"https://mcp.layer8app.com/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/layer8app-mcp-221ec3c3f7","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/layer8app-mcp-221ec3c3f7/tools/{tool}","mcpServerUrl":"https://mcp.layer8app.com/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/layer8app-mcp-221ec3c3f7?live=1"}