{"$schema":"https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json","version":"1.0","protocolVersion":"2025-03-26","serverInfo":{"name":"seoreport","title":"SEOReport","version":"1.0.0"},"description":"Run SEOReport website audits from an AI agent: start a report for a URL, poll its status, read the findings and score, and download the full report as PDF, Markdown, text or JSON. Requires an SEOReport plan and an API key.","iconUrl":"https://seoreport.dev/logo.png","documentationUrl":"https://seoreport.dev/api/agents.md","transport":{"type":"streamable-http","endpoint":"https://seoreport.dev/mcp"},"capabilities":{"tools":{"listChanged":false}},"authentication":{"required":true,"schemes":["bearer"]},"instructions":"Ask the user to create an API key at https://seoreport.dev/dashboard/api-keys (API keys require an active SEOReport plan) and configure this connector to send it on every request as \"Authorization: Bearer <api-key>\". Keep the key in the connector's settings or a secret store, not in chat.","tools":[{"name":"seoreport_create_report","title":"Create SEO report","description":"Start a technical SEO audit of a website. Use when the user wants a site or page audited; SEOReport fetches the URL, so it must be publicly reachable. Pass wait=true to get the finished report back in the same call (reports take up to about 30 seconds); otherwise you get a job ID to poll with seoreport_get_report_status. Each report uses one credit from the account plan (seoreport_get_account shows the balance); without an active plan, use seoreport_list_plans and seoreport_start_checkout first.","inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"The website or page URL to audit, e.g. https://example.com. Without a scheme, https:// is assumed."},"wait":{"type":"boolean","description":"If true, wait up to about 30 seconds and return the finished report (score and top findings) inline. If it is not finished by then, poll seoreport_get_report_status with the returned jobId. Default false."}},"required":["url"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"title":"Create SEO report"},"outputSchema":{"type":"object","properties":{"jobId":{"type":"string","description":"Report job ID; pass it to seoreport_get_report_status and seoreport_get_report."},"status":{"type":"string","description":"Job status when the call returned."},"ready":{"type":"boolean","description":"True when the report is finished and can be read."},"pollAfterMs":{"type":"number","description":"Milliseconds to wait before polling seoreport_get_report_status."},"routeUrl":{"type":"string","description":"Path of the report page on seoreport.dev."},"creditCharged":{"type":"boolean","description":"True when this request used a report credit."},"creditsRemaining":{"type":"number","description":"Report credits left this period, when the request reserved one."},"cached":{"type":"boolean","description":"True when an existing completed audit was reused."},"report":{"type":"object","description":"With wait=true and a finished report: the score and the top findings, shaped like seoreport_get_report.","properties":{"jobId":{"type":"string","description":"Report job ID."},"targetUrl":{"type":"string","description":"The audited URL."},"status":{"type":"string","description":"Job status: queued, running, completed, failed, dead_lettered or cancelled."},"isSnapshotReady":{"type":"boolean","description":"True when the report is finished."},"auditedAt":{"type":["string","null"],"description":"When the audit ran (ISO 8601); null until it has."},"score":{"type":"object","description":"The overall score.","properties":{"overall":{"type":["number","null"],"description":"Overall score from 0 to 100; null until scored."},"band":{"type":["string","null"],"description":"Score band: strong, stable, mixed or urgent."}},"required":["overall","band"]},"areas":{"type":"array","description":"Score per report area, 0 to 100.","items":{"type":"object","properties":{"id":{"type":"string","description":"Area id; pass it as area to filter findings."},"name":{"type":"string","description":"Area name."},"score":{"type":"number","description":"Area score from 0 to 100."}},"required":["id","name","score"],"additionalProperties":false}},"pagesAnalyzed":{"type":["number","null"],"description":"How many pages of the site were analysed."},"openIssues":{"type":"object","description":"Open issues (failed or warning) in the whole report, by severity.","properties":{"critical":{"type":"number","description":"Critical issues."},"high":{"type":"number","description":"High-severity issues."},"medium":{"type":"number","description":"Medium-severity issues."},"low":{"type":"number","description":"Low-severity issues."},"total":{"type":"number","description":"All open issues."}},"required":["critical","high","medium","low","total"]},"findings":{"type":"array","description":"Findings in fix order, after filters and limit.","items":{"type":"object","properties":{"rank":{"type":"number","description":"Position in fix order across the whole report; 1 is the first thing to fix."},"title":{"type":"string","description":"What was found."},"status":{"type":"string","description":"fail, warn, info or pass."},"severity":{"type":["string","null"],"description":"critical, high, medium or low.","enum":["critical","high","medium","low",null]},"area":{"type":"object","description":"The report area this finding belongs to.","properties":{"id":{"type":"string","description":"Area id; pass it as area to filter."},"name":{"type":"string","description":"Area name."}},"required":["id","name"]},"whyItMatters":{"type":["string","null"],"description":"Why this affects search or AI visibility."},"fix":{"type":["string","null"],"description":"How to fix it."},"verification":{"type":"array","description":"How to confirm the fix worked, for the fix-plan findings.","items":{"type":"string"}},"evidence":{"type":"array","description":"What the audit observed, including affected URLs where relevant.","items":{"type":"string"}},"pages":{"type":"array","description":"Pages this finding was observed on.","items":{"type":"string"}}},"required":["rank","title","status","severity","area","whyItMatters","fix","verification","evidence","pages"],"additionalProperties":false}},"matchingFindings":{"type":"number","description":"Findings that matched the filters before the limit was applied."},"message":{"type":"string","description":"Present when there are no findings to read yet, and why."}},"required":["jobId","targetUrl","status","isSnapshotReady","auditedAt","score","areas","pagesAnalyzed","openIssues","findings","matchingFindings"],"additionalProperties":false}},"required":["jobId","status","ready","pollAfterMs","routeUrl","creditCharged","cached"]}},{"name":"seoreport_get_report_status","title":"Get report status","description":"Check whether a report started with seoreport_create_report has finished. Returns its status, stage and isSnapshotReady; once isSnapshotReady is true, read the findings with seoreport_get_report or download it with seoreport_get_report_download. Poll no faster than the pollAfterMs seoreport_create_report returned. Only this account's reports are visible.","inputSchema":{"type":"object","properties":{"jobId":{"type":"string","description":"The report job ID returned by seoreport_create_report or seoreport_list_reports."}},"required":["jobId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get report status"},"outputSchema":{"type":"object","properties":{"jobId":{"type":"string","description":"Report job ID."},"status":{"type":"string","description":"Job status: queued, running, completed, failed, dead_lettered or cancelled."},"stage":{"type":"string","description":"Current processing stage."},"isSnapshotReady":{"type":"boolean","description":"True when the finished report can be read."},"targetUrl":{"type":"string","description":"The audited URL."},"paidUnlock":{"type":"object","description":"Which report sections this account can read.","properties":{"sectionKeys":{"type":"array","description":"Sections included in the full report.","items":{"type":"string"}},"lockedSectionKeys":{"type":"array","description":"Sections this account cannot read yet.","items":{"type":"string"}},"unlockEligible":{"type":"boolean","description":"True when the account could unlock the locked sections."},"unlocked":{"type":"boolean","description":"True when the full report, including downloads, is available."}},"required":["unlocked"]}},"required":["jobId","status","stage","isSnapshotReady","targetUrl","paidUnlock"]}},{"name":"seoreport_get_report","title":"Get report findings","description":"Read a finished report: the overall score, the score per area, and the issues in fix order, each with severity, why it matters, how to fix it, what the audit observed and the pages affected. Use once the report is ready (seoreport_get_report_status shows isSnapshotReady). By default only open issues are returned, most important first; filter by severity or area, or set includePassed to see everything. For a file to keep or share, use seoreport_get_report_download.","inputSchema":{"type":"object","properties":{"jobId":{"type":"string","description":"The report job ID returned by seoreport_create_report or seoreport_list_reports."},"severity":{"type":"string","enum":["critical","high","medium","low"],"description":"Lowest severity to include, e.g. high returns critical and high issues. Omit for all severities."},"area":{"type":"string","description":"Only findings in this area: an id from the areas list in an earlier response, e.g. security or structured_data."},"includePassed":{"type":"boolean","description":"If true, include passed and informational results as well as issues. Default false."},"limit":{"type":"number","description":"How many findings to return, from 1 to 200 (default 25). matchingFindings gives the total."}},"required":["jobId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get report findings"},"outputSchema":{"type":"object","properties":{"jobId":{"type":"string","description":"Report job ID."},"targetUrl":{"type":"string","description":"The audited URL."},"status":{"type":"string","description":"Job status: queued, running, completed, failed, dead_lettered or cancelled."},"isSnapshotReady":{"type":"boolean","description":"True when the report is finished."},"auditedAt":{"type":["string","null"],"description":"When the audit ran (ISO 8601); null until it has."},"score":{"type":"object","description":"The overall score.","properties":{"overall":{"type":["number","null"],"description":"Overall score from 0 to 100; null until scored."},"band":{"type":["string","null"],"description":"Score band: strong, stable, mixed or urgent."}},"required":["overall","band"]},"areas":{"type":"array","description":"Score per report area, 0 to 100.","items":{"type":"object","properties":{"id":{"type":"string","description":"Area id; pass it as area to filter findings."},"name":{"type":"string","description":"Area name."},"score":{"type":"number","description":"Area score from 0 to 100."}},"required":["id","name","score"],"additionalProperties":false}},"pagesAnalyzed":{"type":["number","null"],"description":"How many pages of the site were analysed."},"openIssues":{"type":"object","description":"Open issues (failed or warning) in the whole report, by severity.","properties":{"critical":{"type":"number","description":"Critical issues."},"high":{"type":"number","description":"High-severity issues."},"medium":{"type":"number","description":"Medium-severity issues."},"low":{"type":"number","description":"Low-severity issues."},"total":{"type":"number","description":"All open issues."}},"required":["critical","high","medium","low","total"]},"findings":{"type":"array","description":"Findings in fix order, after filters and limit.","items":{"type":"object","properties":{"rank":{"type":"number","description":"Position in fix order across the whole report; 1 is the first thing to fix."},"title":{"type":"string","description":"What was found."},"status":{"type":"string","description":"fail, warn, info or pass."},"severity":{"type":["string","null"],"description":"critical, high, medium or low.","enum":["critical","high","medium","low",null]},"area":{"type":"object","description":"The report area this finding belongs to.","properties":{"id":{"type":"string","description":"Area id; pass it as area to filter."},"name":{"type":"string","description":"Area name."}},"required":["id","name"]},"whyItMatters":{"type":["string","null"],"description":"Why this affects search or AI visibility."},"fix":{"type":["string","null"],"description":"How to fix it."},"verification":{"type":"array","description":"How to confirm the fix worked, for the fix-plan findings.","items":{"type":"string"}},"evidence":{"type":"array","description":"What the audit observed, including affected URLs where relevant.","items":{"type":"string"}},"pages":{"type":"array","description":"Pages this finding was observed on.","items":{"type":"string"}}},"required":["rank","title","status","severity","area","whyItMatters","fix","verification","evidence","pages"],"additionalProperties":false}},"matchingFindings":{"type":"number","description":"Findings that matched the filters before the limit was applied."},"message":{"type":"string","description":"Present when there are no findings to read yet, and why."}},"required":["jobId","targetUrl","status","isSnapshotReady","auditedAt","score","areas","pagesAnalyzed","openIssues","findings","matchingFindings"],"additionalProperties":false}},{"name":"seoreport_list_reports","title":"List my reports","description":"List this account's most recent reports, newest first, with job ID, target URL, status and whether each is ready. Use it to find a job ID for seoreport_get_report or seoreport_get_report_download, or to check for an earlier report before starting a new one.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"How many reports to return, from 1 to 50 (default 10)."}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"List my reports"},"outputSchema":{"type":"object","properties":{"reports":{"type":"array","description":"Reports, newest first. The text content carries the same list as a bare JSON array.","items":{"type":"object","properties":{"jobId":{"type":"string","description":"Report job ID."},"targetUrl":{"type":"string","description":"The audited URL."},"status":{"type":"string","description":"Job status."},"stage":{"type":"string","description":"Current processing stage."},"isSnapshotReady":{"type":"boolean","description":"True when the report is finished."},"createdAt":{"type":"string","description":"When the report was requested (ISO 8601)."}},"required":["jobId","targetUrl","status","stage","isSnapshotReady","createdAt"]}}},"required":["reports"]}},{"name":"seoreport_get_report_download","title":"Get report download link","description":"Get a download URL for a finished report as PDF, Markdown, plain text or JSON. Use when the user wants a file to keep or share; to discuss the findings in the conversation, use seoreport_get_report instead. The report must be finished (seoreport_get_report_status shows isSnapshotReady). Fetch the URL with the same API key in the Authorization header.","inputSchema":{"type":"object","properties":{"jobId":{"type":"string","description":"The report job ID returned by seoreport_create_report or seoreport_list_reports."},"format":{"type":"string","enum":["pdf","markdown","text","json"],"description":"File format: pdf (default), markdown, text or json."}},"required":["jobId"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get report download link"},"outputSchema":{"type":"object","properties":{"downloadUrl":{"type":"string","description":"API URL of the file; send the API key as a Bearer token."},"jobId":{"type":"string","description":"Report job ID."},"format":{"type":"string","description":"File format.","enum":["pdf","markdown","text","json"]}},"required":["downloadUrl","jobId","format"]}},{"name":"seoreport_get_account","title":"Get my account","description":"Show the account this API key acts for: name and email, the active plan with its status and renewal date, and the report credits used and remaining this period with when they reset. Use it to confirm which account you are working for, before starting several reports, or when seoreport_create_report says the credits are used up.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"Get my account"},"outputSchema":{"type":"object","properties":{"account":{"type":"object","description":"The account that owns this API key.","properties":{"id":{"type":"string","description":"Account ID."},"email":{"type":"string","description":"Account email address."},"name":{"type":["string","null"],"description":"Display name."}},"required":["id","email","name"]},"plan":{"type":["object","null"],"description":"The active plan; null when the account has none (see seoreport_list_plans).","properties":{"name":{"type":"string","description":"Plan name, e.g. Pro."},"status":{"type":"string","description":"Subscription status, e.g. active."},"currentPeriodEnd":{"type":["string","null"],"description":"When the current billing period ends (ISO 8601)."}},"required":["name","status"]},"credits":{"type":["object","null"],"description":"Report credits for this period; null when the account has no credit-metered plan.","properties":{"perPeriod":{"type":"number","description":"Credits included each period."},"used":{"type":"number","description":"Credits used this period."},"remaining":{"type":"number","description":"Credits left; each report uses one."},"resetsAt":{"type":"string","description":"When the credits reset (ISO 8601)."},"unavailable":{"type":"boolean","description":"True when the balance could not be read just now; retry shortly."}}}},"required":["account","plan","credits"]}},{"name":"seoreport_list_plans","title":"List subscription plans","description":"List the SEOReport subscription plans from the live catalog: plan ID, name, billing interval, monthly report credits and included features. Use when the account has no active plan or wants to change plan; pass the chosen plan ID to seoreport_start_checkout.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"title":"List subscription plans"},"outputSchema":{"type":"object","properties":{"plans":{"type":"array","description":"Available plans.","items":{"type":"object","properties":{"id":{"type":"string","description":"Plan ID for seoreport_start_checkout."},"name":{"type":"string","description":"Plan name."},"priceCents":{"type":"number","description":"Price in the smallest currency unit."},"currency":{"type":"string","description":"ISO 4217 currency code."},"billingInterval":{"type":"string","description":"Billing interval, e.g. monthly or annual."},"description":{"type":["string","null"],"description":"What the plan is for."},"creditsPerMonth":{"type":"number","description":"Report credits included each month."},"creditCostPerReport":{"type":"number","description":"Credits one report uses."}},"required":["id","name","billingInterval","creditsPerMonth"]}}},"required":["plans"]}},{"name":"seoreport_start_checkout","title":"Start plan checkout","description":"Create a checkout link for a subscription plan. Use after the user picks a plan from seoreport_list_plans. The user must open the returned URL in a browser and pay there; the agent cannot complete payment. Once paid, the plan is active and seoreport_create_report works.","inputSchema":{"type":"object","properties":{"planId":{"type":"string","description":"The plan ID from seoreport_list_plans, e.g. 'pro-monthly'."}},"required":["planId"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Start plan checkout"},"outputSchema":{"type":"object","properties":{"checkoutUrl":{"type":"string","description":"Checkout page for the user to open in a browser."},"message":{"type":"string","description":"What the user needs to do."}},"required":["checkoutUrl","message"]}},{"name":"seoreport_submit_feedback","title":"Send feedback","description":"Send feedback to the SEOReport team: a feature request, bug report, question, praise or complaint. Use when the user voices a need or a problem with SEOReport during the session, and tell them you are sending it. Requires an active plan. Identical text sent again within a few minutes is refused as a duplicate.","inputSchema":{"type":"object","properties":{"content":{"type":"string","description":"The feedback in the user's own words, 10 to 2000 characters."},"category":{"type":"string","enum":["feature_request","bug_report","question","praise","complaint","other"],"description":"What kind of feedback this is; omit when unsure."}},"required":["content"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"title":"Send feedback"},"outputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Feedback ID; quote it if you contact support about this feedback."},"status":{"type":"string","description":"Review status; new when submitted."},"source":{"type":"string","description":"Where the feedback came from (mcp)."},"agentName":{"type":["string","null"],"description":"The agent that sent it, when known."}},"required":["id","status","source"]}}],"resources":[],"prompts":[]}