Bastion: External Attack Surface Monitoring

official

Ask your AI assistant about your attack surface: run scans, catch expiring certificates and domains, triage findings, and generate reports.

What can you do with Bastion External Attack Surface Monitoring MCP?

  • Run on-demand scans — Ask your assistant to start_scan on a verified hostname and return the scanId for tracking.
  • Review scan results — Pull full findings, evidence, remediation steps, and posture score via get_scan for any completed scan.
  • Monitor the change feed — Use list_changes to see what moved across subdomains, DNS, ports, certificates, and findings.
  • Triage findings — Acknowledge, mute, or accept a finding on a target with set_triage, including lapsed suppressions.
  • Generate PDF reports — Request get_report to render a completed scan as a downloadable PDF, or poll with check_report if it runs long.
  • Manage domains — Claim new domains with add_domain, verify ownership via verify_domain, and list all claimed domains with list_domains.

Documentation

Docs: MCP server

Connect your AI assistant to your attack surface.

Bastion ships a hosted MCP server, so Claude and other AI agents can run scans, read findings, watch the change feed, triage and pull PDF reports. All of it in chat, against the domains your account has verified, with nothing to install and no API keys to manage.

Start free trial Connection guide ↓

Server details

Endpointhttps://mcp.bastionscan.com/mcp
TransportStreamable HTTP (stateless; SSE not required)
AuthenticationOAuth 2.1: authorization code + PKCE, dynamic client registration (RFC 7591), discovery via RFC 9728 / RFC 8414. No API keys.
Scopeaccount: delegated access as the user who approves the connection
PricingIncluded on every plan (plan quotas apply). Plans start with a 7-day trial, no card required.
RevocationIn-app: Team → Connected apps → Disconnect. Effective on the next request.

Connect a client

Every client follows the same handshake: point it at the endpoint, a browser window opens Bastion's consent page, sign in and click Allow access. You need a Bastion account (the trial works) but no keys or extra setup.

Claude (web, desktop, mobile)

Settings → Connectors → Add custom connector, then paste the endpoint URL. Claude discovers the OAuth configuration and walks you through approval.

https://mcp.bastionscan.com/mcp

Claude Code

claude mcp add --transport http bastion https://mcp.bastionscan.com/mcp

Then run /mcp inside a session to complete the sign-in.

ChatGPT

Custom MCP connectors require developer mode (Pro, Plus, Business, Enterprise and Edu plans, on the web app): Settings → Apps → Advanced settings → Developer mode. Then Settings → Connectors → Create, paste the endpoint URL and choose OAuth as the authentication method. On workspace plans an admin may need to allow custom connectors first.

OpenAI Codex

codex mcp add bastion --url https://mcp.bastionscan.com/mcp
codex mcp login bastion

The login command runs the OAuth flow in your browser. Configuration lands in~/.codex/config.toml if you prefer to manage it there.

Hermes

Add the server in the dashboard (hermes dashboard → MCP servers), or in~/.hermes/config.yaml:

mcp_servers:
  bastion:
    url: "https://mcp.bastionscan.com/mcp"
    auth: oauth

A browser window opens for authorization on first connect.

Manus

Settings → Connectors → + Add Connectors → Custom MCP → Direct Configuration. Name it Bastion, choose the HTTP transport, paste the endpoint URL and save; Manus verifies the connection and walks you through sign-in.

OpenClaw

openclaw mcp add bastion --url https://mcp.bastionscan.com/mcp \
  --transport streamable-http --auth oauth
openclaw mcp login bastion

The login command prints the authorization URL and finishes the token exchange once you approve in the browser. Check with openclaw mcp status.

Cursor and other MCP clients

Add the server to your client's MCP configuration:

{
  "mcpServers": {
    "bastion": { "url": "https://mcp.bastionscan.com/mcp" }
  }
}

Try it

Once connected, ask your assistant things like:

  • “Scan bastionscan.com and summarize anything new since last week.”
  • “Which of our certificates expire in the next 30 days?”
  • “Mute the missing-HSTS finding on staging until March, with a note.”
  • “Generate the PDF report for yesterday's scan.”
  • “File these three domains under the Acme client and summarize that estate's posture.” (MSP plans)

Available tools

The connected client always sees the live list via tools/list; this table is the human-readable summary.

ToolWhat it does
get_accountPlan, subscription status and usage against limits
list_domainsClaimed domains, verification status and the DNS TXT record each needs
add_domainClaim a domain; returns the TXT record to publish (nothing is scanned yet)
verify_domainCheck the DNS TXT ownership token right now
start_scanQueue a passive scan of a verified hostname; returns a scanId
get_scanFull results for one scan: findings, evidence, remediation, posture score
list_scansRecent scans with summary scores, newest first
get_reportRender a completed scan as a PDF and return a download link
check_reportPoll a PDF job that outran get_report's inline wait
list_changesWhat moved across the estate: subdomains, DNS, ports, certificates, findings
list_lookalikesRegistered typosquats of your domains (observed via DNS and CT logs only)
list_triagePer-finding triage states, including lapsed suppressions
set_triageAcknowledge, mute or accept a finding on one target
list_clientsClient workspaces and their domain counts (MSP plans)
add_clientCreate a client workspace to file domains under (MSP plans, admin)
assign_domain_clientFile a domain under a client: grouping only, ownership rules unchanged
get_brandingThe white-label identity stamped onto PDF reports (MSP plans)
set_brandingSet the report company name and accent color (MSP plans, admin)

Questions

Do I need an API key?

No. The server uses standard MCP OAuth: your client registers itself, your browser opens Bastion's consent page, you sign in with your normal account and click Allow. There is nothing to copy out of a dashboard and nothing long-lived to leak into a config file.

What can a connected agent do (and not do)?

It acts as the person who approved the connection: it can add and verify domains, run scans, read findings and reports, watch the change feed and triage findings. On MSP plans it can also organize client workspaces and manage report branding. It cannot touch billing, manage the team, or see any other account's data. Access can be revoked at any time in the app under Team → Connected apps, and revocation takes effect on the connection's next request.

Can it scan arbitrary websites?

No. The MCP surface passes the exact same gate as the app: a hostname is scannable only after the account proves control of its domain with a DNS TXT record, and that proof is re-checked nightly. Asking a connected agent to scan someone else's infrastructure fails the same way it would in the UI.

Does it cost extra?

No. The MCP server is included on every plan, including the free trial. Scans started over MCP count against the same monthly quota as scans started in the app, and PDF reports generated on the no-card signup trial carry the same TRIAL watermark.

Which clients are supported?

Anything that speaks MCP over Streamable HTTP with OAuth: Claude (web, desktop and mobile connectors), Claude Code, ChatGPT (developer mode), OpenAI Codex, Hermes, Manus, OpenClaw, Cursor, and other MCP clients that support remote servers with dynamic client registration. If your client can add a remote MCP server by URL, it can connect to Bastion, and the connection guide covers each one.

Is the connection safe to leave in place?

Tokens are short-lived, stored only as hashes on our side, and bound to a connection you can see and revoke in the app, with the person who authorized it and when it was last used. If a team member leaves, their connections stop working the moment their membership ends.