{"id":"bbfa93ca-aba1-4f6c-a64d-8f8a94d5a860","slug":"sitedoctor","kind":"mcp","name":"sitedoctor","summary":"SEO site audits, issue search, Google visibility checks and improvement plans for your sites.","owner":"CloudCorpRecords","repoUrl":"https://github.com/CloudCorpRecords/sitedoctor","license":"MIT","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-11-04T08:22:53.000Z","addedAt":"2026-11-05T20:06:06.742Z","logoUrl":"https://avatars.githubusercontent.com/u/95189389?u=8e277e1a24ff84ae7b49c89e6897fa44178a5c34&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["search","writing"],"tags":[],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-11-05T22:05:03.931Z","sample":false,"url":"https://conduits.dev/tools/sitedoctor","language":"TypeScript","transports":["stdio"],"install":{"npm":"@reneturcios/sitedoctor"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# sitedoctor\n\nsitedoctor is a small local bridge to DrUrls, a hosted\nservice that audits websites for search visibility and\non-page health. Instead of crawling anything itself,\nthis package stands in front of the service's remote\nMCP endpoint: it presents the upstream tool list\nlocally, exactly as captured, and passes each call\nthrough, returning whatever the upstream returns.\n\nThat split matters in practice. Scores, issue groups,\nvisibility verdicts and fix plans all come from\nDrUrls' own crawls and data, so an answer you get\nthrough sitedoctor is the service's answer, not a\nlocal approximation. The bridge adds no scoring of\nits own and rewrites nothing on the way back.\n\n## Tools\n\nThis build serves a **labelled subset** of the\ncaptured surface: 10 of the 11 tools seen in the live\ncapture. The omitted tool is `hire_tester`, which\nplaces a paid order for a human test; purchase\nexecution is out of scope for this program, so the\ntool is deliberately absent, and a test asserts that\nabsence. `list_tester_offers` remains — browsing the\ncatalogue is a read, ordering from it is not.\n\n- `list_tester_offers` — browse the human-testing\n  catalogue: mobile UX on a real handset, checkout\n  runs, screen-reader passes, translation review and\n  similar offers, each with its credit price,\n  turnaround and deliverables. No arguments.\n- `list_sites` — every site in the organisation with\n  its latest completed audit: score, grade, issues,\n  pages crawled, last scan time, and whether a scan\n  is running. No arguments.\n- `get_site_report` — a deeper look at one site\n  (`domain`, required): latest score, issue counts\n  by severity, the most frequent issue types, and\n  social-network presence.\n- `find_issues` — search open issues across all\n  sites, or narrow with `domain` and with\n  `severity` (`CRITICAL`, `HIGH`, `MEDIUM`, `LOW`\n  or `INFO`). Results are grouped by site and issue\n  type, with affected-page counts and an example.\n- `check_google_visibility` — whether Google can\n  index each site: noindex tags, robots blocks,\n  sitemap errors, canonical problems, redirect\n  chains and broken internal links from the last\n  crawl. Optional `domain` for a single site.\n- `get_improvement_plan` — the highest-impact fixes\n  right now, ranked by severity and reach, with\n  how-to-fix guidance. Optional `domain`.\n- `start_scan` — launch a fresh audit of a site\n  (`url`, required). The site is created in the\n  organisation if needed, and the upstream plan\n  quota is enforced upstream.\n- `get_scan_status` — what is running now plus the\n  last 10 finished or failed scans, with scores and\n  errors. No arguments.\n- `generate_report` — compile a full SEO report for\n  one site (`domain`), or, without a domain, for\n  the whole organisation.\n- `free_page_check` — a free single-page audit of\n  any public URL (`url`, required), with no account\n  needed at the upstream, plus an `upgrade` field\n  describing what the authenticated tools add.\n\n## Configuration\n\n- `DRURLS_MCP_URL` (optional) — override the\n  upstream endpoint. Defaults to\n  `https://drurls.com/mcp`. (The override hook is\n  this rebuild's own labelled reconstruction.)\n- `DRURLS_API_KEY` (optional) — when set, every\n  upstream request carries\n  `Authorization: Bearer <key>`. When it is not set,\n  no auth header is sent, matching the keyless\n  capture this rebuild is based on. (The header\n  behaviour is a labelled reconstruction; the\n  registry record declares an Authorization header\n  for the remote, but the capture was taken without\n  one.) Account-scoped tools are served upstream\n  under the caller's own credential.\n\n### Forwarding mechanics\n\nOn the first tool call the client opens a\nstreamable HTTP session upstream: a JSON-RPC\n`initialize` request (protocolVersion `2025-03-26`,\nclientInfo name `sitedoctor`), then a\n`notifications/initialized` notification, then the\n`tools/call` request carrying the caller's\narguments unchanged. When the upstream answers\n`initialize` with an `Mcp-Session-Id` header, that\nvalue rides on every later request, and the session\nis reused for the life of the process. Replies may\narrive as plain JSON or as server-sent events; both\nare read, and the message with the matching id wins.\n\nSuccessful upstream results pass through verbatim,\nincluding any `isError` flag the upstream sets and\nany extra fields it adds. Failures — a JSON-RPC\nerror, a non-2xx status, an unreadable response, or\na request that cannot be completed — come back as\nan `isError` result whose text starts with\n`sitedoctor error:` (this rendering is this\nrebuild's own labelled reconstruction).\n\n## CLI\n\nEach tool is also a subcommand taking one JSON\nargument string (omit it for tools that take none):\n\n```bash\nnpx @reneturcios/sitedoctor list_sites\nnpx @reneturcios/sitedoctor get_site_report '{\"domain\":\"example.com\"}'\nnpx @reneturcios/sitedoctor free_page_check '{\"url\":\"https://example.com\"}'\nnpx @reneturcios/sitedoctor --version\n```\n\nExit codes: `0` on success, `1` on an `isError`\nresult, `2` on a usage error.\n\n## MCP server\n\n```bash\nnpx -y @reneturcios/sitedoctor mcp\n```\n\nMCP client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"sitedoctor\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@reneturcios/sitedoctor\", \"mcp\"]\n    }\n  }\n}\n```\n\n## Docker\n\n```bash\ndocker run -i ghcr.io/cloudcorprecords/sitedoctor\ndocker run --rm ghcr.io/cloudcorprecords/sitedoctor --version\n```\n\nThe container's default command is `mcp`, so the first\nform is a stdio MCP server; any other arguments reach\nthe CLI normally.\n\n## Development\n\n```bash\nnpm install\nnpm run build\nnpm test\nnpm run dev\n```\n\nThe test suite runs entirely against a stubbed\nJSON-RPC upstream — no live network calls.\n\n## License\n\nMIT — see `LICENSE`.\n"}