MCP server

StackShield for AI assistants

Connect ChatGPT, Claude, Cursor, VS Code, Codex or Claude Code to your StackShield team and ask it what is exposed, why a scan failed, or to fix the middleware behind a finding. 16 tools, one URL, on every plan and the trial.

POST https://stackshield.io/mcp
  • OAuth 2.1 with PKCE
  • Team API keys accepted
  • Streamable HTTP
  • 16 tools, 3 resources, 2 prompts
  • Every plan and the trial

What you can ask

Security findings get acted on in the editor, in the incident channel and in the deploy checklist, not on a dashboard. With StackShield connected, the assistant reads the finding where you are working and can fix the code in the same session.

“Which of our domains have unresolved critical issues right now?”

Filters by severity and status across every monitored domain, newest first.

Calls list_issues

“Why did the last scan of app.example.com fail and what do I fix first?”

Finds the scan, reads each failed test with its finding and remediation, and orders the fixes by severity.

Calls list_scans get_scan get_scan_test

“Scan staging.example.com now and tell me when it is done.”

Starts an on-demand scan and polls it, then summarises what changed since the last one.

Calls trigger_scan get_scan

“Start monitoring api.example.com with hourly scans and the default checks.”

Adds the domain the same way the dashboard does, within your plan's application limit.

Calls create_check

“I fixed the three CSP issues on example.com in the last deploy. Mark them resolved.”

Shows you the exact issues first, then resolves them together once you confirm.

Calls list_issues bulk_resolve_issues

“Export every unresolved issue to CSV for the audit.”

The same export the dashboard produces, handed to the assistant as a file.

Calls export_issues_csv

“Give me a security review of example.com.”

A built-in prompt that walks the assistant through checks, issues and recommendations in the right order.

Calls security_review

“Our security headers test is failing. Fix the Laravel middleware.”

In Cursor, VS Code or Claude Code the assistant reads the finding and edits the code in the same session.

Calls get_scan_test

Connect in a minute

Every client needs the URL and a sign-in. Clients with a browser use OAuth: the first tool call sends you to a consent screen, you approve once, and the assistant gets a token limited to the team you picked. Clients without one use a team API key from Settings.

Claude Code

claude mcp add -s user --transport http stackshield https://stackshield.io/mcp
claude mcp login stackshield

The -s user flag registers the server for every project. The second command opens the consent screen. To skip the browser, pass --header "Authorization: Bearer YOUR_API_KEY" to claude mcp add instead.

Codex

codex mcp add stackshield --url https://stackshield.io/mcp
codex mcp login stackshield

Or add to .cursor/mcp.json:

{
    "mcpServers": {
        "stackshield": {
            "url": "https://stackshield.io/mcp"
        }
    }
}

Cursor asks you to sign in the first time it uses the server. For a team API key add "headers": { "Authorization": "Bearer YOUR_API_KEY" } to the entry.

Or add to .vscode/mcp.json:

{
    "servers": {
        "stackshield": {
            "type": "http",
            "url": "https://stackshield.io/mcp"
        }
    }
}

Or run MCP: Add Server from the command palette, choose HTTP and paste the URL.

ChatGPT

  1. Open Settings, then Connectors, then Create. Developer mode has to be on under Advanced settings.
  2. Name it StackShield, paste the server URL, leave authentication on OAuth and save.
  3. Click Connect and approve on the StackShield consent screen. Pick the team if you belong to more than one.

Server URL: https://stackshield.io/mcp

Claude

  1. Open Settings, then Connectors, then Add custom connector.
  2. Name it StackShield and paste the server URL. Leave the client ID and secret empty.
  3. Click Add, then Connect, and approve on the consent screen.

Server URL: https://stackshield.io/mcp

Works on claude.ai and in Claude Desktop.

Gemini CLI

gemini mcp add --transport http -s user stackshield https://stackshield.io/mcp

Scripts and CI

npx @modelcontextprotocol/inspector "https://stackshield.io/mcp" --header "Authorization: Bearer YOUR_API_KEY"

Anything without a browser can pass a team API key as a bearer token, or as an api_key query parameter when it cannot set headers. It is the same key the REST API uses.

Any other client that speaks Streamable HTTP works with the same URL. Full setup notes, the team picker and troubleshooting are in the MCP documentation.

Tools

This list is read from the running server, so it is exactly what a connected assistant sees. Every tool carries hints that tell the assistant whether it only reads, changes something, or cannot be undone, and the two that cannot be undone ask for an explicit confirmation.

Monitored domains

list_checks

List Checks Read only

List all monitored domains for your team with optional filtering by status, search, and sorting.

status
Filter by active/inactive status
search
Search domains by partial match
sort
Sort field
direction
Sort direction
page
Page number

get_check

Get Check Read only

Get detailed information about a specific monitored domain including its schedule and latest scan.

check_id*
UUID of the check

create_check

Create Check Writes Every plan, within the plan's application limit

Add a new domain to monitor for security vulnerabilities. Requires domain, schedule frequency, and which tests to enable.

domain*
Domain or URL to monitor (e.g. "example.com")
schedule_frequency*
How often to scan
schedule_time
Time to scan in HH:MM format (required unless HOURLY)
tests*
Map of test keys to booleans, e.g. {"ssl_certificate": true}

update_check

Update Check Writes

Update settings for a monitored domain. All fields are optional; only include fields you want to change.

check_id*
UUID of the check to update
domain
New domain or URL
is_active
Enable or disable the check
schedule_frequency
schedule_time
Time in HH:MM format
tests
Map of test keys to booleans

delete_check

Delete Check Destructive, needs confirm

Remove a monitored domain and its test configurations. Use this only when the user has explicitly asked to stop monitoring a domain; scan history for it becomes unreachable. Requires confirm=true.

check_id*
UUID of the check to delete
confirm*
Must be true. Confirms the user asked for this domain to be removed.

Scans

list_scans

List Scans Read only

List security scans with optional filters by check, status, and critical issues.

check_id
Filter scans by check UUID
status
Filter by scan status
has_critical_issues
Filter to scans with/without critical issues
page
Page number

get_scan

Get Scan Read only

Get the status and results of a security scan, including all individual test results.

scan_id*
UUID of the scan

trigger_scan

Trigger Scan Writes Runs a scan Every plan, within the plan's on-demand scan limit

Start a security scan for a monitored domain. The check must be active. The scan runs asynchronously; use get_scan to monitor progress. This reaches out to the domain being scanned.

check_id*
UUID of the check to scan

get_scan_test

Get Scan Test Read only

Get detailed results of a specific security test including findings, remediation steps, and technical details.

scan_id*
UUID of the scan
scan_test_id*
UUID of the scan test

Issues

list_issues

List Issues Read only

List security issues found across your monitored domains. Filter by severity, resolution status, domain, test type, or search text.

severity
Filter by severity level
status
Filter by resolution status
check_id
Filter issues by check UUID
test_type
Filter by security test type (e.g. ssl_certificate)
search
Search in issue title and description
page
Page number

get_issue

Get Issue Read only

Get detailed information about a security issue including its check domain and the last 10 related scans.

issue_id*
UUID of the issue

resolve_issue

Resolve Issue Writes

Mark a security issue as resolved with optional resolution notes.

issue_id*
UUID of the issue to resolve
resolution_notes
Optional notes about how the issue was resolved

unresolve_issue

Unresolve Issue Writes

Re-open a previously resolved security issue.

issue_id*
UUID of the issue to re-open

bulk_resolve_issues

Bulk Resolve Issues Writes, needs confirm

Resolve or unresolve multiple security issues at once. Use this after the user has reviewed the list; prefer resolve_issue for a single issue. Only issues belonging to your team are affected. Requires confirm=true.

issue_ids*
Array of issue UUIDs to update
action*
Action to perform
confirm*
Must be true. Confirms the user has seen which issues will change.

export_issues_csv

Export Issues CSV Read only

Export all security issues as CSV text. Returns the CSV content as a string.

No inputs.

Dashboard

get_dashboard_stats

Get Dashboard Stats Read only

Get an overview of your security posture: total domains monitored, active scans, priority issues (critical + high), and domains at risk.

No inputs.

Resources and prompts

Resources are snapshots an assistant can read without calling a tool. Prompts are ready-made workflows that chain the tools in the right order.

Resource

Monitored Domains

stackshield://checks

All domains being monitored for security vulnerabilities with their current status.

Resource

Critical Security Issues

stackshield://issues/critical

All unresolved critical and high severity security issues across your monitored domains.

Resource

Dashboard Statistics

stackshield://stats

Security posture overview: total domains, active scans, priority issues, and domains at risk.

Prompt

Security Review

security_review domain*

Review the security posture of a domain and provide actionable recommendations for fixing issues.

Prompt

Scan Report

scan_report domain*

Generate a comprehensive summary report of the latest security scan for a domain.

What it will and will not do

Scoped to one team

You pick the team on the consent screen and the token only ever sees that team's domains, scans and issues. A team API key is scoped the same way.

OAuth for people, keys for scripts

Assistants with a browser sign in through OAuth 2.1 with PKCE and get a token that expires after an hour and refreshes silently for up to 90 days. Scripts and CI pass a team API key instead.

Revoke in one click

Every connected assistant is listed under Connected Assistants on the API keys page. Disconnect revokes its tokens immediately; deleting a key does the same for scripts.

Confirmation before anything irreversible

delete_check and bulk_resolve_issues refuse to run until the assistant passes an explicit confirm, so it has to show you what will change first.

No account or billing changes

It cannot create or delete API keys, invite people, change your plan or touch billing. Those stay on the dashboard.

Same limits as the dashboard

Domains and on-demand scans count against your plan exactly as they do in the app, and the server has its own rate limiter so a runaway agent loop cannot flood your scan queue.

Connect an assistant to your trial

MCP access is included from the first minute of the 14-day trial. No card needed to start, and the free scanner needs no account at all.