generated: '2026-08-04' method: derived status: candidate source: openapi/malwarebytes-threatdown-nebula-openapi.json note: 'Malwarebytes / ThreatDown publishes NO MCP server. Searched the ThreatDown docs and support portal, npm, PyPI, GitHub (malwarebytes and ThreatDown orgs) and the public MCP registries; nothing exists. POST tools/list was probed anonymously against every plausible endpoint and every one missed. The tools below are a CANDIDATE surface derived from real Nebula operations — what an MCP server for this API could expose, each tool inheriting its input schema from the referenced operation''s parameters and request body. This is a design artifact, NOT a provider claim: no MCPServer pointer is wired into apis.yml, and none should be until ThreatDown actually ships one.' server: published: false url: null transport: null probes: - url: https://api.threatdown.com/mcp method: POST tools/list http_status: 404 body: '{"message":"Route POST:/mcp not found","error":"Not Found","statusCode":404}' - url: https://mcp.threatdown.com/mcp method: POST tools/list http_status: 0 result: DNS/connection failure — host does not resolve - url: https://mcp.malwarebytes.com/mcp method: POST tools/list http_status: 0 result: DNS/connection failure — host does not resolve - url: https://cloud.malwarebytes.com/mcp method: POST tools/list http_status: 403 result: edge block, not an MCP endpoint - url: https://api.threatdown.com/graphql method: POST introspection http_status: 404 result: no GraphQL surface either auth_model_if_built: type: oauth2 flow: clientCredentials token_url: https://api.threatdown.com/oauth2/token scopes: - read - write - execute additional: Beyond the OAuth scope, each operation also requires a granular user_permission held by the user who created the OAuth application. An MCP server would have to surface permission failures distinctly from scope failures — both currently return a bare 403. tenant_header: accountid (UUID, required on 433 of 440 Nebula operations) candidate_tools: - name: search_endpoints description: Search the protected endpoint estate with filters, grouping and cursor pagination. maps_to: POST /nebula/v1/endpoints operation_id: api.v2.nebula.post.endpoints scope: read user_permission: endpoints.view consequence: read - name: get_endpoint description: Get a single endpoint by id, including agent state, OS info and protection status. maps_to: GET /nebula/v1/endpoints/{id} operation_id: api.v2.nebula.get.endpoint.id scope: read user_permission: endpoints.view consequence: read - name: get_endpoint_assets description: Get the software and hardware inventory collected from an endpoint. maps_to: GET /nebula/v1/endpoints/{id}/assets operation_id: api.v2.nebula.get.endpoint.id.assets scope: read user_permission: softwareInventory.view consequence: read - name: get_endpoint_status description: Get the current status of an endpoint. maps_to: GET /nebula/v1/endpoints/{id}/status operation_id: api.v2.rmm.get.endpoint.id.status scope: read user_permission: endpoints.view consequence: read - name: search_detections description: Search malware, ransomware and exploit detections across the estate. maps_to: POST /nebula/v1/detections operation_id: api.v2.nebula.search.detections scope: read user_permission: detections.view consequence: read - name: get_detection description: Get full detail for a single detection by id. maps_to: GET /nebula/v1/detections/{id} operation_id: api.v2.nebula.get.detections.id scope: read user_permission: detections.view consequence: read - name: submit_false_positive description: Submit a false-positive request for a detection. maps_to: POST /nebula/v1/detections/submit-fp operation_id: api.v2.nebula.detections.submit.fp scope: write user_permission: detections.performActions consequence: write - name: search_vulnerabilities description: Search CVEs observed across the software inventory of the estate. maps_to: POST /nebula/v1/cve operation_id: api.nebula.search.cve scope: read user_permission: vulnerabilities.view consequence: read - name: get_vulnerability description: Get CVE detail by id. maps_to: GET /nebula/v1/cve/{id} operation_id: api.nebula.get.cve.id scope: read user_permission: vulnerabilities.view consequence: read - name: get_endpoint_suspicious_activity description: List EDR suspicious-activity findings on an endpoint. maps_to: GET /nebula/v1/endpoints/{id}/sa operation_id: api.nebula.endpoint.id.sa scope: read user_permission: edr.view consequence: read - name: search_quarantine description: Search quarantined items across the estate. maps_to: POST /nebula/v1/quarantine/search operation_id: api.nebula.post.quarantine-search scope: read user_permission: detections.view consequence: read - name: list_groups description: List endpoint groups. maps_to: GET /nebula/v1/groups operation_id: api.nebula.get.groups scope: read user_permission: groups.view consequence: read - name: list_policies description: List protection policies. maps_to: GET /nebula/v1/policies operation_id: api.nebula.get.policy scope: read user_permission: policies.view consequence: read - name: search_jobs description: Search issued jobs and their statuses. maps_to: POST /nebula/v1/jobs/search operation_id: api.v2.nebula.search.jobs scope: read user_permission: tasks.view consequence: read - name: get_job description: Get details about a single job, including its status. maps_to: GET /nebula/v1/jobs/{id} operation_id: api.v2.nebula.get.jobs.id scope: read user_permission: tasks.view consequence: read - name: issue_job description: 'Issue a job against an endpoint — Scan, Isolate, Remediate or Reboot. High consequence: this takes real action on a production machine.' maps_to: POST /nebula/v1/jobs operation_id: api.v2.nebula.post.jobs scope: execute user_permission: endpoints.performActions consequence: destructive escalation: human-approval-required note: Not idempotent — there is no idempotency key, so an agent retrying an ambiguous timeout can issue the action twice. See conventions/malwarebytes-conventions.yml. - name: create_webhook_subscription description: Register a webhook handler URL for one of the 18 supported event types. maps_to: POST /nebula/v1/webhooks/subscriptions operation_id: api.v2.nebula.post.webhooks.subscriptions scope: write user_permission: notifications.createOwn consequence: write excluded_from_candidate_surface: note: Deliberately NOT proposed as agent tools despite existing in the API. Each is destructive, irreversible, or discloses a secret, and none should be reachable by an autonomous agent without an explicit human gate. operations: - operation_id: api.v2.nebula.delete.endpoint reason: deletes an endpoint from management - operation_id: api.v2.nebula.delete.endpoints.bulk reason: bulk endpoint deletion - operation_id: api.nebula.post.endpoint.id.drives.volume_id.reveal reason: reveals a drive encryption recovery key - operation_id: api.nebula.get.policy.secret.id reason: discloses the tamper-protection password - operation_id: api.nebula.delete.policy reason: removes protection configuration from the estate - operation_id: api.v2.nebula.post.jobs.bulk reason: fans a destructive action out across many machines at once coverage: nebula_operations_total: 440 candidate_tools: 17 approach: Curated, not one-per-operation. 440 operations is far past what an agent can select from; the candidate set covers the read-and-triage path an analyst agent would actually walk (search estate, inspect detections and vulnerabilities, check job status) plus the two writes that path needs. deployment: mode: none verified: derived checked: '2026-08-12' source: catalog MCP census