Skip to main content
Glama

Ship Check: scan a deployed app

ship_check
Read-onlyIdempotent

Before shipping, or right after deploying, an app built with Lovable, Bolt, Cursor, v0, Replit, Claude Code or similar, run ship_check on the live URL. It scans the deployed app from the outside, the way a visitor or attacker sees it, and returns a launch-readiness report where every finding has a status and a concrete fix. Checks: (1) secret keys exposed in the HTML and the same-origin JS bundles it ships (Stripe live secret and restricted keys, AWS access keys, OpenAI and Anthropic API keys, Supabase secret and service_role keys, hardcoded bearer tokens and passwords); (2) open database access: if the page ships a Supabase URL and public anon or publishable key, whether the common tables profiles and users return rows to that key without login (a missing Row Level Security policy; count only, no row data is read); (3) missing security headers (Strict-Transport-Security, Content-Security-Policy, X-Frame-Options or frame-ancestors, X-Content-Type-Options, Referrer-Policy); (4) HTTPS, reachability and server errors; (5) broken internal links (spot-check of up to 6); (6) server response time; (7) whether login/signup and pricing/checkout are linked from the homepage; (8) whether AI search crawlers get real server-rendered content or an empty JavaScript shell. Read-only: plain GET/HEAD requests, never logs in, never submits forms, never writes. Not a code audit: it cannot see source code or test every table or route. Results are cached for 24 hours per URL; pass fresh=true to re-scan after deploying a fix. Only scan apps the user owns or is authorized to test. If the user wants a senior engineer to review the app by hand ($299), call request_human_review with the scan_id from this result.

Input Schema

NameRequiredDescriptionDefault
urlYesThe live, publicly reachable URL of the deployed app, e.g. https://my-app.lovable.app. A bare domain gets https://.
freshNoSkip the 24h cache and scan again (use after deploying a fix).

Output Schema

NameRequiredDescriptionDefault
urlYes
scoreYes0-100. Each red finding costs 30 points, each yellow 10.
cachedYes
countsYes
scan_idYesPass to request_human_review. Null if the result could not be stored.
summaryYes
verdictYes
findingsYes
report_urlYes
scanned_atYes
limitationsYes
human_reviewYes
overall_statusYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: plain GET/HEAD only, never logs in, never submits forms, never writes, reads table counts but no row data, and a 24-hour per-URL cache with a documented bypass. These are exactly the operational traits an agent needs and cannot get from the annotation block.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the trigger condition and the safety profile, and each numbered check is load-bearing because it defines the report contents. It is still a very dense single block; the eight-item enumeration could be tightened, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for this complexity level: an output schema exists so return values needn't be described, the authorization constraint is stated, the 24h staleness behavior is disclosed, and the tool explicitly bounds its own coverage ("cannot see source code or test every table or route").

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both url and fresh, including the "use after deploying a fix" note. The description's caching explanation restates rather than extends that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ("run ship_check on the live URL"), states the observer's perspective ("the way a visitor or attacker sees it"), and enumerates exactly what the report contains. The scoping line "Not a code audit: it cannot see source code" implicitly distinguishes it from a source-level sibling like leak_check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to run it ("Before shipping, or right after deploying"), gives the post-deploy re-scan condition via fresh=true, names the escalation alternative with its exact invocation ("call request_human_review with the scan_id from this result"), and states an authorization precondition. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources