shipcheck
ShipCheck v0
Независимый QA по preview URL для агентов, пишущих код. Агент отправляет POST-запросом публичный https preview URL и приёмочные сценарии. Мы запускаем эвристики Playwright, делаем скриншот каждого сценария и возвращаем комплект доказательств с результатом pass/fail. Неудачные результаты остаются в статусе needs_review, пока человек (или этот агент, просматривающий страницу) не добавит короткое примечание.
Модель, написавшая UI, — плохой судья для этого UI. В этом и заключается продукт.
Playwright MCP бесплатен; это не облачный браузер. Это независимая проверка с участием человека при неудаче. Screenshot API дают пиксели. ShipCheck отвечает на вопрос: «действительно ли сработал сценарий 3?»
Запуск
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 8787venv уже существует на этой машине. По умолчанию процесс API также обрабатывает дисковую очередь (встроенный воркер). Чтобы разделить:
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_xxxxxxxxxxxxПроверка состояния: GET http://127.0.0.1:8787/health
Публичный URL (быстрый туннель Cloudflare, эта машина, среда, 19 августа 2026): https://realtor-all-enclosed-altered.trycloudflare.com
Тот же процесс обслуживает GET / (лендинг), REST и POST /mcp. URL также указан в PUBLIC_URL.txt. Быстрые туннели перестают работать, если cloudflared останавливается.
Задачи хранятся в /workspace/shipcheck/queue/{job_id}.json. Отчёты и скриншоты — в /workspace/shipcheck/reports/.
Пример запроса / ответа
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"
}'Ответ:
{
"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_ab12cd34ef56Итоговые статусы: pass (все эвристики зелёные, человек не требуется) или needs_review (перечислены ошибки эвристик; последующий проход добавляет human_note через POST /qa_note/{job_id} или MCP qa_note). error — проблема нашей инфраструктуры (таймаут, сбой, небезопасный URL) и не тарифицируется.
Опциональные заголовки для будущего биллинга: Authorization: Bearer <key> или X-Api-Key. v0 принимает отсутствующие ключи и не списывает средства.
Опциональные шаги сценария (в противном случае трактуются как примечания): click:css=.buy, click:text=Sign in, fill:#email|user@example.com, wait:1000, see:Order total.
См. examples/sample_report.json — там описан формат комплекта доказательств.
Безопасность
Только https. Localhost, RFC1918, link-local, CGNAT, IP-адреса метаданных (169.254.169.254), file://, встроенные учётные данные и redirect-to-private отклоняются. Каждый запрос Playwright перепроверяется. Таймаут навигации — 20 секунд, лимит задачи — 4 минуты. Подробности в PRODUCT.md.
SSRF-тесты (живая цель не требуется):
cd /workspace/shipcheck
python -m pytest tests/test_ssrf.py tests/test_api.py -qCursor mcp.json
Streamable-HTTP MCP доступен на POST /mcp (тот же процесс, что и REST). Инструменты: qa_preview, qa_status, qa_get_report, qa_note. Добавьте это в .cursor/mcp.json или ~/.cursor/mcp.json (опустите type; Cursor рассматривает url как streamable HTTP):
{
"mcpServers": {
"shipcheck": {
"url": "https://realtor-all-enclosed-altered.trycloudflare.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}v0 принимает отсутствующий ключ и не списывает средства. Тот же файл лежит в examples/mcp.json. Сервер должен быть запущен (python -m shipcheck serve --host 127.0.0.1 --port 8787). Публичный URL — это быстрый туннель Cloudflare перед этим процессом.
Лендинг: GET / (HTML в shipcheck/landing.html). Лимит публичных preview-задач: 20 qa_preview задач/день/IP (loopback без ограничений). SHIPCHECK_PREVIEW_LIMIT_PER_IP переопределяет лимит; 0 отключает.
Цены
Задумано, но пока не взимается: $6 десктоп / $10 оба вьюпорта (или 5–8 сценариев) за один прогон. Предоплаченные кредиты Polar — позже. Хук: shipcheck/billing.py.
Следующие шаги
Кредитные пакеты Polar + лицензионный ключ в качестве
Authorization: Bearer; списание только при успехе.Пинг в Slack/Telegram, когда статус —
needs_review; человек пишетhuman_note(RESTPOST /qa_note/{job_id}и MCPqa_noteуже принимают примечание).Разместить в PulseMCP / Glama / официальном реестре MCP (обнаружение, а не маркетплейс).
Публичный пример отчёта +
llms.txtиз 30 строк.
Не добавляйте дашборд, GitHub App или криптовалютный платёжный канал.
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