{
  "markdown": "# vibe-test\n\n[![npm version](https://img.shields.io/npm/v/vibe-testing.svg)](https://www.npmjs.com/package/vibe-testing)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](https://nodejs.org)\n[![MCP](https://img.shields.io/badge/MCP-compatible-blue.svg)](https://modelcontextprotocol.io)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![CI](https://github.com/AishwaryShrivastav/vibe-testing/actions/workflows/ci.yml/badge.svg)](https://github.com/AishwaryShrivastav/vibe-testing/actions)\n\n**Code-aware browser testing agent for AI-powered editors.**\n\nReads your codebase, understands every route and form, opens a real Playwright browser, explores every element, and reports what works and what breaks — with screenshots.\n\nWorks as an **MCP server** that gives your AI editor (Claude Code, Cursor, Windsurf, VS Code Copilot) 13 browser testing tools — or as a **standalone CLI**.\n\n---\n\n## Install in Any Project (One Command)\n\n```bash\ncd /path/to/your/project\nnpx vibe-testing@latest init\n```\n\nThis command:\n- Detects which AI editors you have installed\n- Registers vibe-test in **global** editor configs (`~/.claude/settings.json`, `~/.cursor/mcp.json`, etc.) so the tools are available in **every project, every session**\n- Creates project-level MCP configs and AI instruction files\n- Auto-detects your app's URL (reads `.env`, `vite.config`, framework defaults)\n- Creates `VIBE.md` (edit with your test credentials) and `vibe.config.json`\n\nThen open your editor and say:\n\n> \"Scan this codebase and test it against http://localhost:3000\"\n\nYour AI will pick up the tools automatically and start testing.\n\n---\n\n## Contents\n\n- [How It Works](#how-it-works)\n- [MCP Setup (per editor)](#mcp-setup)\n- [MCP Tools Reference](#mcp-tools-reference)\n- [Recommended Workflow](#recommended-workflow)\n- [init Command](#init-command)\n- [CLI Commands](#cli-commands)\n- [VIBE.md — Project Guidance](#vibemd--project-guidance)\n- [Configuration (vibe.config.json)](#configuration)\n- [Supported Frameworks](#supported-frameworks)\n- [FAQ](#faq)\n\n---\n\n## How It Works\n\n```\nnpx vibe-testing@latest init\n       ↓\nRegisters 13 MCP tools in your editor\n       ↓\nYou ask: \"Test the checkout flow\"\n       ↓\nAI calls: scan_codebase → get_context(\"checkout\") → login → explore_page → execute_scenario → generate_report\n       ↓\nHTML report opens in browser with screenshots of every step\n```\n\n**No test cases to write.** The AI reads your source code to understand real field names and routes, opens a browser, tests everything, and shows you what's broken.\n\n---\n\n## MCP Setup\n\n### Option 1 — Automatic (recommended)\n\n```bash\nnpx vibe-testing@latest init\n```\n\nDetects and configures all installed editors. Done.\n\n---\n\n### Option 2 — Manual per editor\n\n#### Claude Code\n\nAdd to `~/.claude/settings.json` (global — works in every project):\n\n```json\n{\n  \"mcpServers\": {\n    \"vibe-test\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"vibe-testing@latest\", \"--mcp\"]\n    }\n  }\n}\n```\n\nOr add to `.mcp.json` in your project root (project-level only):\n\n```json\n{\n  \"mcpServers\": {\n    \"vibe-test\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"vibe-testing@latest\", \"--mcp\"]\n    }\n  }\n}\n```\n\n#### Cursor\n\nAdd to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project):\n\n```json\n{\n  \"mcpServers\": {\n    \"vibe-test\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"vibe-testing@latest\", \"--mcp\"]\n    }\n  }\n}\n```\n\n#### Windsurf\n\nAdd to `~/.codeium/windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"vibe-test\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"vibe-testing@latest\", \"--mcp\"]\n    }\n  }\n}\n```\n\n#### VS Code (GitHub Copilot)\n\nAdd to `.vscode/mcp.json` in your project:\n\n```json\n{\n  \"servers\": {\n    \"vibe-test\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"vibe-testing@latest\", \"--mcp\"]\n    }\n  }\n}\n```\n\n#### Roo Code / Cline\n\nAdd to `.roo/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"vibe-test\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"vibe-testing@latest\", \"--mcp\"]\n    }\n  }\n}\n```\n\n#### From local build (development)\n\n```json\n{\n  \"mcpServers\": {\n    \"vibe-test\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/vibe-testing/dist/mcp-server.js\"]\n    }\n  }\n}\n```\n\n---\n\n## MCP Tools Reference\n\n13 tools available to your AI editor after setup:\n\n| Tool | When to call | Returns |\n|------|-------------|---------|\n| `scan_codebase` | **Always first.** Reads source code, finds routes/forms/tests/gaps | Routes, forms, coverage map, generated scenarios, `route_changes` since last scan |\n| `get_context` | **Before writing test steps.** Returns source files for a feature | Actual source code with real field names and selectors |\n| `login` | When app requires authentication | Post-login screenshot, token state, API calls observed |\n| `scan_page_elements` | To see all interactive elements on a page | Element list with selectors + page screenshot |\n| `explore_page` | Broad \"does everything work?\" testing | Interaction results, API calls, errors, screenshot |\n| `execute_scenario` | Run specific test steps | Step-by-step logs + screenshots |\n| `get_coverage` | View coverage map and untested routes | Coverage entries, gaps, available scenarios |\n| `suggest_tests` | Find coverage gaps after exploration | Prioritized, ready-to-run scenarios with steps |\n| `take_screenshot` | Quick visual verification | Screenshot of any URL |\n| `generate_report` | Build HTML report (auto-opens) | Report path + summary |\n| `run_full_test` | One-shot: scan → execute → explore → report | Full results + `snapshot_diff` vs last run |\n| `run_converge` | Iterative testing until thresholds | Summary across all rounds + `snapshot_diff` vs last run |\n| `cleanup` | Close browsers, free resources | — |\n\n### Tool Inputs\n\n**`scan_codebase`**\n```json\n{\n  \"codebase_path\": \"/path/to/project\",\n  \"url\": \"http://localhost:3000\",\n  \"mode\": \"deep\"\n}\n```\n\n**`get_context`**\n```json\n{ \"feature\": \"login\" }\n{ \"feature\": \"/checkout\" }\n{ \"feature\": \"user profile form\" }\n```\n\n**`login`**\n```json\n{\n  \"email\": \"test@example.com\",\n  \"password\": \"TestPass123!\",\n  \"login_url\": \"/login\"\n}\n```\n\n**`scan_page_elements`** / **`explore_page`**\n```json\n{\n  \"route\": \"/dashboard\",\n  \"authenticated\": true\n}\n```\n\n**`execute_scenario`**\n```json\n{\n  \"scenario\": {\n    \"id\": \"create-item\",\n    \"name\": \"Create a new item\",\n    \"route\": \"/items\",\n    \"steps\": [\n      { \"action\": \"navigate\", \"url\": \"/items\", \"description\": \"Open items page\" },\n      { \"action\": \"click\", \"selector\": \"text=Add Item\", \"description\": \"Open create form\" },\n      { \"action\": \"fill\", \"selector\": \"[name='title']\", \"value\": \"Test Item\", \"description\": \"Fill title\" },\n      { \"action\": \"fill\", \"selector\": \"[name='description']\", \"value\": \"Test description\", \"description\": \"Fill description\" },\n      { \"action\": \"click\", \"selector\": \"button[type='submit']\", \"description\": \"Submit form\" }\n    ],\n    \"expected_outcome\": \"New item appears in the list\",\n    \"requires_auth\": true\n  }\n}\n```\n\nStep actions: `navigate`, `fill`, `click`, `select`, `wait`, `assert`, `upload`\n\n**`take_screenshot`**\n```json\n{ \"url\": \"/settings\", \"authenticated\": true, \"full_page\": false }\n```\n\n**`run_full_test`**\n```json\n{ \"url\": \"http://localhost:3000\", \"codebase_path\": \"/path/to/project\", \"mode\": \"deep\" }\n```\n\n**`run_converge`**\n```json\n{\n  \"url\": \"http://localhost:3000\",\n  \"max_followup_rounds\": 4,\n  \"target_pass_rate\": 0.92,\n  \"max_high_severity_gaps\": 2\n}\n```\n\n---\n\n## Recommended Workflow\n\n### Full test session\n\nTell your AI editor:\n\n```\nScan this codebase and test it against http://localhost:3000.\nLog in with test@example.com / pass123. Explore the dashboard and\nsettings pages, run the suggested tests, and generate a report.\n```\n\nThe AI will:\n1. `scan_codebase` — understand routes, forms, existing tests\n2. `get_context(\"login\")` — read actual login form source code\n3. `login` — authenticate in a real browser\n4. `explore_page(\"/dashboard\")` — click everything, observe what breaks\n5. `explore_page(\"/settings\")` — same\n6. `suggest_tests` — find coverage gaps\n7. `execute_scenario` × N — run targeted test flows\n8. `generate_report` — HTML report opens automatically\n9. `cleanup` — close browsers\n\n### Test a specific feature\n\n```\nTest the checkout flow using vibe-test. Get context for checkout,\nthen run the full purchase flow with card number 4242424242424242.\n```\n\nThe AI will:\n1. `scan_codebase` (if not already done)\n2. `get_context(\"checkout\")` — read `CheckoutForm.tsx`, `api/orders/route.ts` etc.\n3. `login` — authenticate\n4. `execute_scenario` — fill the real form fields from source code\n5. `generate_report`\n\n### Verify a bug fix\n\n```\nI fixed the login redirect bug. Use vibe-test to confirm it's working.\n```\n\nThe AI will:\n1. `login` — test the login flow\n2. `take_screenshot` — visual confirmation of the post-login state\n3. Report back what it sees\n\n### Find what's broken\n\n```\nExplore every page and tell me what's broken.\n```\n\nThe AI will run `explore_page` on every route, collecting API errors, broken elements, and failed interactions, then `suggest_tests` with the broken items marked as high priority.\n\n---\n\n## init Command\n\n```bash\nnpx vibe-testing@latest init [options]\n```\n\n**What it creates:**\n\n| File | Where | Purpose |\n|------|-------|---------|\n| `.mcp.json` | Project root | Claude Code MCP config (project-level) |\n| `~/.claude/settings.json` | Global | Claude Code MCP config (all projects) |\n| `.cursor/mcp.json` | Project root | Cursor MCP config |\n| `~/.cursor/mcp.json` | Global | Cursor MCP config (all projects) |\n| `.cursor/rules/vibe-test.mdc` | Project | Cursor rules — `alwaysApply: true` |\n| `.windsurfrules` | Project | Windsurf instructions |\n| `~/.codeium/windsurf/mcp_config.json` | Global | Windsurf MCP config (all projects) |\n| `.vscode/mcp.json` | Project | VS Code Copilot MCP config |\n| `.github/copilot-instructions.md` | Project | GitHub Copilot instructions |\n| `.roo/mcp.json` | Project | Roo Code MCP config |\n| `CLAUDE.md` | Project | Claude Code session instructions |\n| `AGENTS.md` | Project | Universal agent instructions (Codex, Devin, Zed) |\n| `VIBE.md` | Project | Test guidance — edit with your credentials |\n| `vibe.config.json` | Project | Config — URL auto-detected from your project |\n\n**Options:**\n\n```bash\nnpx vibe-testing@latest init                     # auto-detect editors, register globally + project\nnpx vibe-testing@latest init --no-global         # project-level only, skip global registration\nnpx vibe-testing@latest init --editor cursor     # only configure Cursor\nnpx vibe-testing@latest init --editor claude-code windsurf\n```\n\n**After init**, edit `VIBE.md` with your login URL and test credentials.\n\n---\n\n## CLI Commands\n\n```bash\n# Set up in current project\nnpx vibe-testing@latest init\n\n# Run tests against a URL\nnpx vibe-testing@latest run http://localhost:3000\nnpx vibe-testing@latest run https://staging.myapp.com --mode deep\nnpx vibe-testing@latest run http://localhost:3000 --codebase /path/to/project --scope /login /dashboard\n\n# Iterative testing until coverage thresholds\nnpx vibe-testing@latest converge http://localhost:3000\nnpx vibe-testing@latest converge http://localhost:3000 --max-rounds 6 --target-pass-rate 0.95\n\n# Open last report in browser\nnpx vibe-testing@latest report\n\n# Reset memory and screenshots for a clean run\nnpx vibe-testing@latest reset\n```\n\n### `run` options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `--mode fast\\|deep` | `deep` | `fast`: quick scan. `deep`: full feature extraction + exploration |\n| `--no-headed` | — | Run browser headless (default: visible) |\n| `--codebase <path>` | cwd | Path to project root |\n| `--scope <routes...>` | all | Test only specific routes |\n| `-c <path>` | `vibe.config.json` | Config file path |\n\n### `converge` options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `--max-rounds <n>` | `4` | Max follow-up rounds after baseline |\n| `--target-pass-rate <r>` | `0.92` | Stop when pass rate ≥ this (0–1) |\n| `--max-gaps <n>` | `2` | Stop when critical+important gaps ≤ this |\n\n---\n\n## VIBE.md — Project Guidance\n\nCreate `VIBE.md` in your project root. Vibe Test reads it automatically on every run.\n\n```markdown\n## Login URL\n/login\n\n## Test Credentials\n- Email: test@example.com\n- Password: TestPass123!\n\n## Never Automate\n- delete account\n- cancel subscription\n- [data-testid=\"danger-zone\"]\n- .billing-section\n\n## Known Flaky\n- /notifications (WebSocket dependent — skip or expect retry)\n- /live-feed\n\n## Notes\n- Admin panel at /admin — use admin@example.com / adminpass\n- Dashboard data loads async — wait for [data-loaded=\"true\"]\n- Profile page: click \"Edit Profile\" before form fields appear\n```\n\nSee [`VIBE.example.md`](./VIBE.example.md) for the full template.\n\n---\n\n## Configuration\n\n### vibe.config.json\n\nCreated automatically by `init` with auto-detected URL. Edit as needed:\n\n```json\n{\n  \"url\": \"http://localhost:3000\",\n  \"mode\": \"deep\",\n  \"auth\": {\n    \"strategy\": \"credentials\",\n    \"login_url\": \"/login\",\n    \"credentials\": {\n      \"email\": \"test@example.com\",\n      \"password\": \"TestPass123!\"\n    }\n  },\n  \"never_interact\": [\n    \"delete account\",\n    \"cancel subscription\",\n    \"[data-testid='danger-zone']\"\n  ],\n  \"scope\": {\n    \"include\": [\"/**\"],\n    \"exclude\": [\"/admin/**\", \"/api/**\"],\n    \"max_routes\": 30,\n    \"seed_routes\": [\"/live/dev-mode-a-now\"]\n  },\n  \"browser\": {\n    \"headed\": true,\n    \"slowMo\": 40,\n    \"timeout\": 30000\n  }\n}\n```\n\n| Key | Description |\n|-----|-------------|\n| `url` | App URL — localhost or staging. Auto-detected by `init`. |\n| `mode` | `fast` (heuristic scan) or `deep` (full extraction + exploration) |\n| `auth.strategy` | `credentials` (form login), `basic` (HTTP Basic Auth), or `skip` |\n| `auth.credentials` | Login credentials — persisted across runs once used |\n| `never_interact` | Text patterns or CSS selectors to skip during exploration |\n| `scope.exclude` | Route patterns to exclude from testing |\n| `scope.max_routes` | Cap how many routes are tested per run |\n| `scope.seed_routes` | Concrete URLs for dynamic-segment routes the parser can't enumerate (e.g. `/live/[slug]` → `/live/dev-mode-a-now`). Each seeded route inherits `requires_auth` and the source file from its dynamic parent. |\n| `browser.headed` | `true` = visible browser. CLI default `true`, MCP server default `false` (headless) so editor sessions aren't disrupted by pop-up windows. |\n| `browser.slowMo` | Milliseconds between actions (useful for debugging) |\n| `routes` | `auto` (default) discovers routes from the codebase. `config` uses only routes explicitly listed in config. |\n\n---\n\n## Supported Frameworks\n\n| Framework | Routes | API endpoints | Forms |\n|-----------|--------|---------------|-------|\n| Next.js App Router | ✅ | ✅ | ✅ |\n| Next.js Pages Router | ✅ | ✅ | ✅ |\n| Next.js (src/ variant) | ✅ | ✅ | ✅ |\n| React SPA (react-router) | ✅ | — | ✅ |\n| Vue + Vite (vue-router) | ✅ | — | ✅ |\n| Nuxt | ✅ | ✅ | ✅ |\n| SvelteKit | ✅ | ✅ | ✅ |\n| Express / Fastify | — | ✅ | ✅ |\n| Monorepos (Turborepo, pnpm, Lerna) | ✅ | ✅ | ✅ |\n\nExisting test files are also read to build a coverage map:\n\n| Test runner | Supported |\n|-------------|-----------|\n| Jest / Vitest | ✅ |\n| Playwright | ✅ |\n| Cypress | ✅ |\n\n---\n\n## Self-Improvement\n\nVibe Test learns across runs and stores intelligence in `.vibe/`:\n\n- **Working selectors** — remembers `[name='email']` worked on `/login`, uses it next run\n- **Route timings** — adjusts timeouts based on measured load times\n- **Auth credentials** — saved after first login, reused automatically\n- **Flaky routes** — tracks high fail-rate routes, marks them for retry\n- **Skip routes** — routes that consistently error (need URL params) are auto-skipped\n- **Route manifest** (`.vibe/route-manifest.json`) — every scan diffs against the previous one; new and removed routes are surfaced as `route_changes` on `scan_codebase` results so the AI can immediately cover them\n- **Run snapshot** (`.vibe/run-snapshot.json`) — every run captures per-route pass/fail status and diffs against the prior run; `snapshot_diff` flags `newly_passing` (fixes), `newly_failing` (regressions), `still_failing`, plus added/removed routes\n\nReset with `npx vibe-testing@latest reset` to start fresh.\n\n### Regression detection in action\n\nAfter a second run, the console and `VibeRunResult` include a snapshot diff:\n\n```\n─── Changes since last run ───\n  ✓ Fixed:      /login\n  ✗ Regression: /checkout\n  ℹ New:        /admin/users\n```\n\n```json\n{\n  \"snapshot_diff\": {\n    \"newly_passing\": [\"/login\"],\n    \"newly_failing\": [\"/checkout\"],\n    \"still_failing\": [],\n    \"new_routes\": [\"/admin/users\"],\n    \"removed_routes\": []\n  }\n}\n```\n\n`run_converge` returns the same shape, so iterative runs in your editor highlight what you just broke.\n\n---\n\n## How the AI Uses These Tools\n\nWhen you ask your editor to \"test the login flow\", here is exactly what it does:\n\n```\nUser: \"Test the login flow\"\n\nAI calls:\n  scan_codebase({ codebase_path: \".\", url: \"http://localhost:3000\" })\n    → Finds /login route, LoginForm component, POST /api/auth/login endpoint\n    → Returns 8 generated test scenarios\n\n  get_context({ feature: \"login\" })\n    → Returns src/app/login/page.tsx (has email, password fields, name=\"email\", name=\"password\")\n    → Returns src/app/api/auth/login/route.ts (POST handler, returns { token })\n    → AI now knows the REAL selectors: [name='email'], [name='password']\n\n  login({ email: \"test@example.com\", password: \"pass123\" })\n    → Opens Chromium, navigates to /login\n    → Fills email and password fields\n    → Clicks submit\n    → Returns: { success: true, final_url: \"/dashboard\", tokens_found: 2 }\n    → Returns screenshot of post-login dashboard\n\n  execute_scenario({\n    scenario: {\n      name: \"Login with invalid password\",\n      steps: [\n        { action: \"navigate\", url: \"/login\" },\n        { action: \"fill\", selector: \"[name='email']\", value: \"test@example.com\" },\n        { action: \"fill\", selector: \"[name='password']\", value: \"wrongpassword\" },\n        { action: \"click\", selector: \"button[type='submit']\" }\n      ],\n      expected_outcome: \"Error message shown\"\n    }\n  })\n    → Returns screenshot showing error state\n\n  generate_report()\n    → Writes .vibe/report.html\n    → Opens in browser automatically\n\nAI reports: \"Login works. Invalid password shows an error. All 3 login scenarios passed.\"\n```\n\n---\n\n## FAQ\n\n**Does vibe-test use an AI/LLM internally?**\nNo. It uses heuristic verification (URL changes, toast detection, API errors). Your editor's AI (Claude, GPT-4, etc.) is the brain — it sees screenshots and decides what to test next.\n\n**What's the difference between `explore_page` and `execute_scenario`?**\n`explore_page` is broad — it clicks every button and input it finds and reports the results. `execute_scenario` is precise — you give it specific steps and it follows them exactly. Use `explore_page` to find what's on a page, then `execute_scenario` to test specific flows.\n\n**What's `get_context` for?**\nIt returns the actual source code for a feature — so the AI knows `[name='email']` instead of guessing `#email-input`. Always call it before writing test steps for a specific feature.\n\n**Does it handle SPAs with client-side routing?**\nYes. Playwright navigates the real browser, so client-side routing (React Router, Vue Router, etc.) works naturally.\n\n**Does it handle login / authentication?**\nYes. The `login` tool fills credentials in a real browser, captures auth tokens from localStorage/cookies, and keeps that session alive for authenticated tests. Credentials are persisted in `.vibe/memory/` and reused automatically.\n\n**Will it click \"Delete Account\" or other destructive buttons?**\nNo. Set `never_interact` in `vibe.config.json` or `VIBE.md` to blocklist dangerous actions. Any button whose text or selector matches is skipped during exploration.\n\n**Can I use it without an AI editor?**\nYes — `vibe-test run https://your-app.com` runs standalone. It scans, generates scenarios, executes them, and produces an HTML report without needing an editor.\n\n**How do I test a staging environment?**\nSet `url` in `vibe.config.json` to your staging URL, or pass it as a CLI argument: `npx vibe-testing@latest run https://staging.myapp.com`.\n\n**Does it work with monorepos?**\nYes. `init` detects Turborepo/pnpm/yarn workspaces and finds the frontend app automatically.\n\n---\n\n## Requirements\n\n- **Node.js** ≥ 20 (the test suite uses vitest 4.x which requires Node 20+)\n- **Playwright Chromium** — install once with:\n  ```bash\n  npx playwright install chromium\n  ```\n  (vibe-test will prompt you if it's missing)\n\n### Docker\n\nA Node 20 + Chromium image is included for environments that prefer container-based MCP servers (and for Glama.ai quality scoring):\n\n```bash\ndocker build -t vibe-test .\n# wire into your editor's MCP config:\n# { \"command\": \"docker\", \"args\": [\"run\", \"--rm\", \"-i\", \"vibe-test\"] }\n```\n\n---\n\n## Contributing\n\n```bash\ngit clone https://github.com/AishwaryShrivastav/vibe-testing.git\ncd vibe-testing\nnpm install\nnpx playwright install chromium\nnpm run build   # tsc → dist/\nnpm run dev     # run CLI without building\nnpm run mcp     # run MCP server without building\n```\n\nSee [CHANGELOG.md](./CHANGELOG.md) for version history.\n\n---\n\n## License\n\nMIT — [Aishwary Shrivastav](https://github.com/AishwaryShrivastav)\n\n---\n\n## Links\n\n- **npm:** https://www.npmjs.com/package/vibe-testing\n- **GitHub:** https://github.com/AishwaryShrivastav/vibe-testing\n- **Issues:** https://github.com/AishwaryShrivastav/vibe-testing/issues\n- [Model Context Protocol](https://modelcontextprotocol.io)\n- [Playwright](https://playwright.dev)\n",
  "bytes": 21663,
  "sha": "8e1be52c85d2d900866654c28a797bd404b5db3a18859649ce78f36307c39261",
  "repo_slug": "aishwaryshrivastav/vibe-testing",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_aishwaryshrivastav_vibe_testin_c32284d3/readme"
}