shipcheck
ShipCheck v0
QA independiente de URL de vista previa para agentes de codificación. Un agente envía una URL de vista previa pública https más historias de aceptación. Ejecutamos heurísticas de Playwright, capturamos cada historia y devolvemos un paquete de evidencia con aprobado/reprobado. Las fallas permanecen needs_review hasta que un humano (o este agente mirando la página) añade una nota breve.
El mismo modelo que escribió la interfaz es un mal juez de la interfaz. Ese es el producto.
Playwright MCP es gratuito; esto no es un navegador alojado. Es una verificación independiente con un humano en las fallas. Las APIs de capturas dan píxeles. ShipCheck responde "¿la historia 3 realmente funcionó?"
Ejecutar
cd /workspace/shipcheck
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/playwright install chromium
.venv/bin/python -m shipcheck serve --host 0.0.0.0 --port 8787El venv ya existe en esta máquina. Por defecto: el proceso de la API también drena la cola de trabajos (worker en línea). Para dividir:
SHIPCHECK_INLINE_WORKER=0 .venv/bin/python -m shipcheck serve --port 8787
.venv/bin/python -m shipcheck worker
.venv/bin/python -m shipcheck run-job sc_xxxxxxxxxxxxSalud: GET http://127.0.0.1:8787/health
Público (túnel rápido de Cloudflare, esta máquina, mié 19 ago 2026): https://realtor-all-enclosed-altered.trycloudflare.com
El mismo proceso sirve GET / (página de aterrizaje), REST y POST /mcp. La URL también está en PUBLIC_URL.txt. Los túneles rápidos mueren si cloudflared se detiene.
Los trabajos viven en /workspace/shipcheck/queue/{job_id}.json. Los informes y capturas en /workspace/shipcheck/reports/.
Ejemplo de solicitud / respuesta
curl -sS -X POST https://realtor-all-enclosed-altered.trycloudflare.com/qa_preview \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com/",
"stories": [
{"id": "home", "steps": ["open homepage"], "expect": "Example Domain"}
],
"viewport": "desktop"
}'Respuesta:
{
"job_id": "sc_ab12cd34ef56",
"status": "queued",
"price_usd": 6,
"billed": false,
"message": "queued. poll GET /qa_status/{job_id}; fetch GET /qa_get_report/{job_id} when status is pass or needs_review."
}curl -sS https://realtor-all-enclosed-altered.trycloudflare.com/qa_status/sc_ab12cd34ef56
curl -sS https://realtor-all-enclosed-altered.trycloudflare.com/qa_get_report/sc_ab12cd34ef56Estados terminales: pass (todas las heurísticas en verde, sin necesidad de humano) o needs_review (fallas de heurísticas listadas; una pasada posterior añade human_note vía POST /qa_note/{job_id} o MCP qa_note). error es nuestra infraestructura (tiempo de espera agotado, fallo, URL no segura) y no se factura.
Cabeceras opcionales para facturación posterior: Authorization: Bearer <key> o X-Api-Key. v0 acepta claves faltantes y no hace cargos.
Pasos opcionales (tratados como notas): click:css=.buy, click:text=Sign in, fill:#email|user@example.com, wait:1000, see:Order total.
Ver examples/sample_report.json para la forma del paquete de evidencia.
Seguridad
Solo https. Localhost, RFC1918, enlace-local, CGNAT, IPs de metadatos (169.254.169.254), file://, credenciales incrustadas y redirección a privado son rechazados. Cada solicitud de Playwright se re-verifica. Tiempo de espera de navegación de 20s, límite de trabajo de 4 minutos. Detalles en PRODUCT.md.
Pruebas SSRF (sin objetivo en vivo requerido):
cd /workspace/shipcheck
python -m pytest tests/test_ssrf.py tests/test_api.py -qCursor mcp.json
MCP Streamable-HTTP se sirve en POST /mcp (mismo proceso que REST). Herramientas: qa_preview, qa_status, qa_get_report, qa_note. Añade esto a .cursor/mcp.json o ~/.cursor/mcp.json (omite type; Cursor trata una url como streamable HTTP):
{
"mcpServers": {
"shipcheck": {
"url": "https://realtor-all-enclosed-altered.trycloudflare.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}v0 acepta una clave faltante y no hace cargos. El mismo archivo vive en examples/mcp.json. El servidor debe estar ejecutándose (python -m shipcheck serve --host 127.0.0.1 --port 8787). URL pública es un túnel rápido de Cloudflare delante de ese proceso.
Página de aterrizaje: GET / (HTML en shipcheck/landing.html). Límite de tasa de vista previa pública: 20 trabajos qa_preview/día/IP (loopback ilimitado). SHIPCHECK_PREVIEW_LIMIT_PER_IP lo anula; 0 lo desactiva.
Precios
Intención, aún no cobrado: $6 escritorio / $10 ambas vistas (o 5–8 por ejecución) por historia. Créditos prepagados de Polar más adelante. Gancho: shipcheck/billing.py.
Próximos pasos
Créditos de Polar + paquetes de licencia como
Authorization: Bearer; cargo solo al éxito.Ping de Slack/Telegram cuando el estado sea
needs_review; el humano escribehuman_note(RESTPOST /qa_note/{job_id}y MCPqa_noteya aceptan la nota).Listar en PulseMCP / Glama / registro oficial de MCP (descubrimiento, no un mercado).
Informe de muestra público + un
llms.txtde 30 líneas.
No añadir un tablero, una app de GitHub ni un riel de cripto.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Website QA for your coding agent: audit SEO, performance, security, accessibility over MCP.
Browser-backed QA with evidence and fix-ready reports for coding agents.
Verifies AI agent work end to end: real artifacts and outcomes checked, not self-reported success.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wtaylorwilson/shipcheck-preview-qa'
If you have feedback or need assistance with the MCP directory API, please join our Discord server