Bastion: External Attack Surface Monitoring
officialAsk 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_scanon a verified hostname and return thescanIdfor tracking. - Review scan results — Pull full findings, evidence, remediation steps, and posture score via
get_scanfor any completed scan. - Monitor the change feed — Use
list_changesto 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_reportto render a completed scan as a downloadable PDF, or poll withcheck_reportif it runs long. - Manage domains — Claim new domains with
add_domain, verify ownership viaverify_domain, and list all claimed domains withlist_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
| Endpoint | https://mcp.bastionscan.com/mcp |
|---|---|
| Transport | Streamable HTTP (stateless; SSE not required) |
| Authentication | OAuth 2.1: authorization code + PKCE, dynamic client registration (RFC 7591), discovery via RFC 9728 / RFC 8414. No API keys. |
| Scope | account: delegated access as the user who approves the connection |
| Pricing | Included on every plan (plan quotas apply). Plans start with a 7-day trial, no card required. |
| Revocation | In-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.
| Tool | What it does |
|---|---|
| get_account | Plan, subscription status and usage against limits |
| list_domains | Claimed domains, verification status and the DNS TXT record each needs |
| add_domain | Claim a domain; returns the TXT record to publish (nothing is scanned yet) |
| verify_domain | Check the DNS TXT ownership token right now |
| start_scan | Queue a passive scan of a verified hostname; returns a scanId |
| get_scan | Full results for one scan: findings, evidence, remediation, posture score |
| list_scans | Recent scans with summary scores, newest first |
| get_report | Render a completed scan as a PDF and return a download link |
| check_report | Poll a PDF job that outran get_report's inline wait |
| list_changes | What moved across the estate: subdomains, DNS, ports, certificates, findings |
| list_lookalikes | Registered typosquats of your domains (observed via DNS and CT logs only) |
| list_triage | Per-finding triage states, including lapsed suppressions |
| set_triage | Acknowledge, mute or accept a finding on one target |
| list_clients | Client workspaces and their domain counts (MSP plans) |
| add_client | Create a client workspace to file domains under (MSP plans, admin) |
| assign_domain_client | File a domain under a client: grouping only, ownership rules unchanged |
| get_branding | The white-label identity stamped onto PDF reports (MSP plans) |
| set_branding | Set 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.