{"jsonrpc":"2.0","result":{"tools":[{"name":"list_projects","description":"Returns all website projects registered under the authenticated user\u0027s Orbirank account, with each project\u0027s current SEO health score (0\u2013100) and optimization ladder stage. Use when the user has not specified a project ID and you need to find which project to operate on, or when the user asks \u0027what sites are you tracking\u0027, \u0027show me all my projects\u0027, or \u0027which project should I look at\u0027. Always call this first if you do not yet have a project_id.","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_project_status","description":"Returns the current optimization status and ladder stage for a single website project. Shows: current ladder stage (Crawling, Technical Audit, On-Page Fixes, Content Analysis, etc.), overall SEO health score (0\u2013100), number of open and fixed issues, last crawl date, and next recommended action in plain English. Use when the user asks \u0027what stage is my site at\u0027, \u0027how is my SEO doing\u0027, \u0027what is my progress\u0027, or \u0027what should I do next\u0027. This is the best first tool to call when the user asks a general question about a specific project.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID. Obtain from list_projects if unknown."}},"required":["project_id"]}},{"name":"run_audit","description":"Triggers a full technical SEO audit for a website project. The audit crawls the site and checks 20\u002B technical factors (canonical tags, redirect chains, Core Web Vitals via PageSpeed Insights, mobile-first compliance, HTTPS / security headers, structured data, sitemap validity, robots.txt, AI-crawler access, hreflang). Returns an audit job ID immediately; use get_audit_issues to retrieve findings once the audit completes (typically 2\u201310 minutes depending on site size). Use when the user wants to start a new audit, refresh an existing one, or asks \u0027what is wrong with my site\u0027. Do NOT use this to fetch existing results \u2014 use get_audit_issues for that. Counts against the daily run_audit quota for the plan tier.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID to audit."}},"required":["project_id"]}},{"name":"get_audit_issues","description":"Returns the prioritized list of technical SEO issues from the most recent completed audit for a project. Issues are grouped by severity (Critical, High, Medium, Low) and include: issue type, affected URL, plain-English description, estimated ranking impact, and current fix status (Open / Applied / Verified / Regressed). Supports optional filters. Use when the user asks \u0027what issues does my site have\u0027, \u0027what needs fixing\u0027, \u0027show me my SEO problems\u0027, \u0027how many critical issues do I have\u0027, or \u0027which issues are still open\u0027. Do NOT use this to trigger a new audit \u2014 use run_audit for that.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID."},"severity":{"type":"string","description":"Filter by severity. Omit to return all severities.","enum":["Critical","High","Medium","Low"]},"status":{"type":"string","description":"Filter by fix status. Omit to return all statuses.","enum":["Open","Applied","Verified","Regressed"]},"page":{"type":"integer","description":"1-based page number (default 1).","default":1},"page_size":{"type":"integer","description":"Results per page (default 20, max 50).","default":20}},"required":["project_id"]}},{"name":"get_rank_positions","description":"Returns current and historical keyword rank positions for a project, with trend data for the specified number of days. Shows: keyword, current position, delta vs 7 days ago, delta vs 30 days ago, whether in top-3 / top-10, and the data source (GSC Search Console or SerpBear). Data is only available when rank tracking is enabled for the plan and keywords are being tracked. Use when the user asks \u0027where does my site rank\u0027, \u0027what position am I in for keyword X\u0027, \u0027am I on page 1\u0027, \u0027show me my ranking progress\u0027, or \u0027which keywords improved\u0027. Do NOT use this to manage which keywords are tracked.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID."},"history_days":{"type":"integer","description":"Number of days of history to return (max 90, default 90).","default":90}},"required":["project_id"]}},{"name":"get_keyword_opportunities","description":"Returns the content gap analysis for a project: specific keywords and topic areas where the site is missing content compared to top-ranking competitors. Each gap includes: keyword, brief_json (when already generated), and a priority score derived from estimated search volume and keyword difficulty. Results are ordered by priority_score descending. The content_gap_id from each result is required by get_content_brief. Use when the user asks \u0027what keywords should I target\u0027, \u0027what content am I missing\u0027, \u0027what topics should I write about\u0027, or \u0027show me content gaps\u0027. Call this before get_content_brief to obtain valid content_gap_ids. Do NOT call ITopicClusterService.AnalyseAsync here \u2014 this reads existing gaps, it does not trigger a new analysis run.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID."},"limit":{"type":"integer","description":"Maximum number of gaps to return, ranked by priority (default 20, max 50).","default":20}},"required":["project_id"]}},{"name":"get_content_brief","description":"Generates or retrieves an AI-written content brief for a specific content gap keyword. The brief specifies: recommended word count, H1/H2/H3 outline, 5-10 semantic keywords to include, target reading grade, E-E-A-T requirements, internal linking slots, and schema type recommendation. Brief generation uses daily LLM budget (not article credits). Returns Degraded=true when LLM is unavailable or budget exhausted. Use when the user asks \u0027write me a brief for keyword X\u0027, \u0027what should I write about for this keyword\u0027, or \u0027create a content plan\u0027. Requires a content_gap_id from get_keyword_opportunities. Do NOT use this to generate the actual article \u2014 use generate_content for that.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID."},"content_gap_id":{"type":"string","format":"uuid","description":"ID of the content gap to brief, obtained from get_keyword_opportunities."}},"required":["project_id","content_gap_id"]}},{"name":"generate_content","description":"Runs the 6-stage AI content generation pipeline to produce a publish-ready article from a content brief (Outline \u2192 Sections \u2192 Editorial \u2192 Quality gates \u2192 E-E-A-T gate \u2192 Information gain gate). Consumes 1 article credit from the account balance. Returns the pipeline status and a stage-by-stage result; poll get_project_status or check the Orbirank dashboard for completion. IMPORTANT: requires a pre-existing content_variants row (variant_id). Create a variant from the Orbirank dashboard or via the Content tab before calling this. Use when the user says \u0027write the article\u0027, \u0027generate the content\u0027, or \u0027create the blog post\u0027. Do NOT call this if the account has 0 article credits or if the user only wants a brief \u2014 use get_content_brief instead. Do NOT call on the free tier (0 article credits on free).","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID."},"variant_id":{"type":"string","format":"uuid","description":"Content variant ID to generate. Must be created via the Orbirank dashboard first."}},"required":["project_id","variant_id"]}},{"name":"get_backlink_profile","description":"Returns the current backlink profile for a project: referring domain count, estimated domain authority (labeled as \u0027estimated\u0027 when based on OpenPageRank), top referring domains, and available data sources. Data sources: Google Search Console links report (when GSC connected), OpenPageRank API (when API key configured). HasData=false in the response means no data sources are configured \u2014 connect GSC first. DO NOT claim authority scores are precise if the response labels them as estimated. Use when the user asks \u0027how many backlinks do I have\u0027, \u0027what sites link to me\u0027, \u0027show me my backlink profile\u0027, or \u0027what is my domain authority\u0027. Do NOT use this to find link building opportunities \u2014 use get_keyword_opportunities for content-led link opportunities.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID."}},"required":["project_id"]}},{"name":"get_bing_query_stats","description":"Returns Bing search query performance data (clicks, impressions, average position, CTR) for an Orbirank project from Bing Webmaster Tools. Data is per-query and per-page-traffic for the given date range (default last 28 days). Requires the project to have a verified site in Bing Webmaster Tools and a BYOK API key stored in Orbirank project settings. Returns a degraded response (WasDegraded=true) when credentials are absent or the site is not verified \u2014 never fabricates data. Use when the user asks \u0027how is my site performing on Bing\u0027, \u0027what are my Bing rankings\u0027, \u0027show me Bing impressions\u0027, or \u0027what queries bring traffic from Bing\u0027. Do NOT use this to get crawl health data \u2014 that is not exposed via this tool. Do NOT use this if the user only wants Google data \u2014 use get_rank_positions instead.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"The Orbirank project ID. Obtain from list_projects if unknown."},"from":{"type":"string","format":"date","description":"Start date in yyyy-MM-dd format (default: 28 days ago)."},"to":{"type":"string","format":"date","description":"End date in yyyy-MM-dd format (default: today)."}},"required":["project_id"]}}]}}