harborrank
Server Details
SEO for AI agents: keywords, SERPs, backlinks, rank tracking, audits, Search Console, Analytics
- Status
- Healthy
- Uptime
- 98.7% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- winsley-jeune/harborrank-skills
- GitHub Stars
- 0
TDQS
Scored across 35 tools
Most tools target a distinct resource+action, and descriptions cross-reference each other well (e.g. get_domain_overview vs get_ranked_keywords vs get_domain_keyword_suggestions). However there are genuine overlaps: get_domain_keyword_suggestions and get_ranked_keywords both return keywords a domain ranks for, and get_serp_results/search_local_businesses/prospect_leads all search listings/SERPs with only subtle differences. These pairs could cause misselection.
Names follow a consistent snake_case verb_noun pattern (create_project, list_projects, get_audit_issues, run_site_audit, research_keywords, set_lead_top_issues, update_lead). The only variation is the idiomatic whoami, which is a standard single-token command. No camelCase/snake_case mixing.
35 tools is heavy and forces the agent to scan a large surface before acting. The underlying domain (SEO, local SERP, backlinks, audits, lead-gen, Search Console) is genuinely broad so each tool is defensible, but the set sits above the comfortable 3-15 range.
Coverage is deep: full project lifecycle (create/list/delete), audits with status+issues+pages, keyword research/save/list, backlinks, SERP, Search Console, and a rich lead pipeline (prospect, research, teardown, set competitors/serp/issues, update). Minor gaps remain — no project update, no keyword or audit deletion — but agents can work around them.
Available Tools
38 toolscreate_projectCreate projectInspect
Create a new project in the user's organization. Provide a name, and optionally a domain and default market (locationCode/languageCode; a languageCode requires a locationCode). Returns the created {id, name, domain, locationCode, languageCode, url}; pass the returned id as projectId to other HarborRank tools. Call list_projects first to avoid creating a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project name (1-120 characters). | |
| domain | No | Optional root domain for the project, e.g. "example.com" (host only, no scheme or path). Sets the default target for domain, backlink, and rank tools. | |
| languageCode | No | Optional language code (e.g. "en", "fr"). Requires locationCode; derived from the location when omitted. | |
| locationCode | No | Optional DataForSEO location code for the project's default market (e.g. 2840 = United States, 2504 = Morocco). Falls back to the organization default when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| project | Yes |
delete_projectDelete projectDestructiveInspect
PERMANENTLY deletes a project and everything in it: saved keywords, rank trackers and their history, site audits, leads, brand tracking, and its Search Console connection. Cannot be undone. Only call this after the user has explicitly asked to delete this specific project by name; if they may want the data later, tell them to archive it from the dashboard instead. Pass the project's exact name as confirmName — a mismatch refuses the delete. Returns the deleted {id, name}.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Id of the project to delete, from list_projects. | |
| confirmName | Yes | The project's exact name, as list_projects returns it. The delete is refused if it does not match. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| deleted | Yes |
find_serp_competitorsFind SERP competitorsRead-onlyInspect
Compares domains competing in Google results for a supplied keyword set in a country-level DataForSEO Labs market. Accepts location/language codes; not radius-based local SEO.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum competitors to return (1-100). Defaults to 50. | |
| market | No | Legacy US selector. Prefer locationCode/languageCode for any Labs market. Explicit locationCode takes precedence; otherwise omitted = the project's default market. | |
| offset | No | Rows to skip for pagination. | |
| sortBy | No | Sort order for returned competitors. Defaults to visibility. | |
| keywords | Yes | Keywords whose SERPs are compared (1-100). | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| resultTypes | No | SERP result types to include. Defaults to organic and local_pack. | |
| languageCode | No | Language for locationCode. Defaults to that location's primary language when locationCode overrides the project market. | |
| locationCode | No | Country-level DataForSEO Labs location code. Defaults to the project's market; takes precedence over the legacy market object. | |
| excludeDomains | No | Domains to exclude from results (e.g. the user's own site). | |
| includeSubdomains | No | Count subdomains as part of the same competitor domain. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| competitors | Yes |
get_ai_referral_trafficGet AI assistant referral trafficARead-onlyInspect
Measure real visits the site gets from AI assistants — ChatGPT, Perplexity, Gemini, Copilot, Claude, DeepSeek, Grok and others — from Google Analytics: sessions, engagement, key events (conversions) and revenue per assistant, the share of all traffic AI now drives, and optionally which landing pages they cite. Combines GA4's built-in AI Assistant channel with referrer matching, so it also covers assistants and history the built-in channel misses. Use it to prove AI-search visibility pays off, track its growth with compareTo, and pick pages to optimize for AI answers.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Explicit end (YYYY-MM-DD, property time zone). Use with startDate. | |
| rowLimit | No | Rows to return (default 100). | |
| compareTo | No | Add a comparison window. Each metric then gets <metric>_previous and <metric>_change (relative, -0.25 = down 25%). Use previous_period to explain a traffic drop, previous_year to strip out seasonality. | |
| dateRange | No | Convenience window ending yesterday (default last_28_days). Ignored if startDate+endDate are given. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| startDate | No | Explicit start (YYYY-MM-DD, property time zone). Use with endDate. | |
| byLandingPage | No | Also split by landing page, to see which pages AI assistants send people to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| meta | No | |
| rows | No | |
| reason | No | |
| aiShare | No | |
| endDate | No | |
| startDate | No | |
| aiSessions | No | |
| connectUrl | No | |
| propertyId | No | |
| allSessions | No | |
| dataQuality | No | |
| propertyName | No | |
| compareEndDate | No | |
| compareStartDate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/openWorld/non-destructive safety, so the description only needs to add context. It does, usefully: it discloses the data provenance (GA4's AI Assistant channel plus referrer matching) and notes it covers assistants and history the built-in channel misses. It omits auth/rate-limit behavior, but the sourcing detail is genuine added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that is front-loaded with the core purpose and then layers scope, sourcing, and use cases. Nearly every clause earns its place, though the provider list and closing tips make it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it supplies scope, data source, differentiating coverage, and usage intent. An agent has everything needed to select and call this tool correctly, including the required projectId pointer via list_projects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description references compareTo and the landing-page split, and clarifies what metrics surface (revenue per assistant, AI's share of all traffic), but the parameter-specific semantics (formats, enums, defaults) already live in the schema, so this adds only marginal meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (measure) and resource (AI assistant referral traffic) with named scope: sessions, engagement, key events, revenue per assistant. It is unmistakably distinct from broad siblings like get_analytics_report or get_landing_page_performance because it names the AI-assistant channel and its providers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage contexts — prove AI-search visibility pays off, track growth with compareTo, and pick pages to optimize — which tells the agent when this tool is the right pick. It stops short of naming an alternative tool or an explicit when-not condition against get_analytics_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analytics_reportGet Google Analytics reportARead-onlyInspect
Query the project's connected Google Analytics 4 property: sessions, users, engagement, key events (conversions) and revenue, broken down by channel, source, landing page, page, device, country or date, with optional period-over-period comparison. This is what happens after the click — use it to see which traffic actually converts, explain traffic drops, and back recommendations with business outcomes. Pair with get_search_console_performance for the before-click half, or use get_landing_page_performance to get both joined per page.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Pagination offset. | |
| endDate | No | Explicit end (YYYY-MM-DD, property time zone). Use with startDate. | |
| filters | No | AND-combined. Organic only: [{dimension:'sessionDefaultChannelGroup',operator:'equals',expression:'Organic Search'}]. | |
| metrics | No | Default ['sessions']. keyEvents are the conversions the site owner marked (leads, calls, purchases); totalRevenue needs ecommerce tracking. | |
| orderBy | No | Sort rows by this metric, descending (default the first metric). | |
| rowLimit | No | Rows per call (default 100, max 1000). Paginate with offset when hasMore is true. | |
| compareTo | No | Add a comparison window. Each metric then gets <metric>_previous and <metric>_change (relative, -0.25 = down 25%). Use previous_period to explain a traffic drop, previous_year to strip out seasonality. | |
| dateRange | No | Convenience window ending yesterday (default last_28_days). Ignored if startDate+endDate are given. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| startDate | No | Explicit start (YYYY-MM-DD, property time zone). Use with endDate. | |
| dimensions | No | Break rows down by these. Omit for site totals. ['sessionDefaultChannelGroup'] for channel mix, ['landingPage'] for entry pages, ['date'] for a trend, ['sessionSourceMedium'] for referrers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| meta | No | |
| rows | No | |
| reason | No | |
| endDate | No | |
| hasMore | No | |
| rowCount | No | |
| startDate | No | |
| connectUrl | No | |
| nextOffset | No | |
| propertyId | No | |
| dataQuality | No | |
| propertyName | No | |
| totalRowCount | No | |
| compareEndDate | No | |
| compareStartDate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety and data-source scope are covered structurally. The description adds the prerequisite that a GA4 property must be connected to the project and that comparisons can be requested, but says nothing about rate limits, quota, or what happens when no property is connected. Adequate but not rich beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the resource and scope, then usage guidance, then sibling routing. Only mild filler ('This is what happens after the click') and every sentence carries routing or semantic value, so it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, full schema description coverage, an output schema, and read-only annotations, the description supplies the intent, routing and prerequisite context an agent needs to select and call it. It does not need to explain return values, and the remaining gap (connection/auth failure behavior) is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including compareTo, rowLimit, filters and dimensions is already documented with examples in the schema. The description restates the breakdown dimensions and period-over-period comparison but adds no syntax or constraint detail the schema lacks, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Query the project's connected Google Analytics 4 property') and enumerates the exact metric families (sessions, users, engagement, key events, revenue) and breakdown dimensions, so an agent can tell it apart from get_search_console_performance or get_landing_page_performance without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames when to use it ('what happens after the click — see which traffic actually converts, explain traffic drops, back recommendations with business outcomes') and names two alternatives with the condition that selects each: get_search_console_performance for the before-click half, get_landing_page_performance for the joined view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audit_issuesGet site audit issuesRead-onlyInspect
Read the prioritized issue report from a completed site audit. Every issue carries a how_to_fix with concrete remediation steps an agent can act on. Omit auditId for the most recent audit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max issues to return (default 200). | |
| auditId | No | Audit ID. If omitted, uses the project's most recent audit. | |
| severity | No | Only return issues of this severity. | |
| issueType | No | Only return issues of this type. One of: blocked-page, server-error, broken-internal-link, missing-title, broken-page, duplicate-title, duplicate-meta-description, duplicate-content, missing-meta-description, missing-h1, multiple-h1, redirect-chain, redirect-loop, canonical-conflict, thin-content, images-missing-alt, orphan-page, no-outgoing-links, title-too-long, title-too-short, meta-description-too-long, meta-description-too-short, heading-order-skip, slow-response, noindex-page, canonicalized-page, deep-page | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| issues | Yes | |
| summary | Yes |
get_audit_pagesGet site audit pagesRead-onlyInspect
List crawled pages from a site audit with per-page SEO data (status, title, description, word count, indexability, crawl depth, link counts) and, for pages Lighthouse checked, mobile and desktop scores (performance, accessibility, best practices, SEO) and LCP, CLS, INP and TTFB. Omit auditId for the most recent audit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max pages to return (default 100). | |
| auditId | No | Audit ID. If omitted, uses the project's most recent audit. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| fetchClass | No | Filter by fetch outcome ("blocked" = the site's bot protection challenged the crawler). | |
| statusCode | No | Filter by exact HTTP status code. | |
| urlContains | No | Filter to URLs containing this substring. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| pages | Yes | |
| total | Yes |
get_audit_statusGet site audit statusRead-onlyInspect
Check the progress of a site audit (phase, pages crawled, Lighthouse progress). Omit auditId for the most recent audit.
| Name | Required | Description | Default |
|---|---|---|---|
| auditId | No | Audit ID. If omitted, uses the project's most recent audit. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| status | Yes |
get_backlinks_overviewGet backlinks overviewRead-onlyInspect
Returns a backlinks profile summary (total backlinks, referring domains, top referring domains). On the hosted Free plan it returns a preview instead (totals and the top 3 referring domains); the full overview needs a paid plan. Self-hosted deployments need the Backlinks API enabled on their DataForSEO account.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | 'domain' analyzes the whole domain; 'page' analyzes a specific URL. Defaults to 'domain'. | |
| target | Yes | Domain or URL to analyze (e.g. 'example.com' or 'https://example.com/blog'). | |
| hideSpam | No | Filter out spammy referring domains. Defaults to true. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| overview | Yes | |
| referringDomains | Yes |
get_backlinks_profileGet backlinks profileRead-onlyInspect
Returns one bounded page of detailed backlink rows for a domain or page: linking URLs, target URLs, anchors, dofollow/nofollow, authority/spam signals, and lost/broken status. Supports filters, sorting, one_per_domain/as_is mode, and pagination. On the hosted Free plan it returns a preview instead (totals and the top 3 referring domains); backlink rows need a paid plan. Self-hosted deployments need the Backlinks API enabled on their DataForSEO account.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | DataForSEO backlink grouping: one_per_domain returns each referring domain's strongest link; as_is returns individual backlink rows. | one_per_domain |
| page | No | 1-indexed results page. Defaults to 1. | |
| scope | No | 'domain' analyzes the whole domain; 'page' analyzes a specific URL. Defaults to 'domain'. | |
| target | Yes | Domain or URL to analyze (e.g. 'example.com' or 'https://example.com/blog'). | |
| filters | No | Backlink row filters: include/exclude source URL terms, authority/spam ranges, dofollow/nofollow, lost/broken visibility, or exact domainFrom. | |
| hideSpam | No | Filter out spammy backlinks. Defaults to true. | |
| pageSize | No | Rows per page. Allowed values: 50, 100, or 200. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| sortField | No | Backlink row sort field. | rank |
| sortOrder | No | Sort direction. | desc |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| backlinks | Yes |
get_domain_keyword_suggestionsGet domain keyword opportunitiesRead-onlyInspect
Returns the organic keywords a domain ranks for, including position and available metrics. Use after get_domain_overview when you want the detailed keyword opportunity list for a competitor or reference domain. Cached for 12 hours.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Competitor or reference domain to extract keywords from. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| languageCode | No | Language code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects). | |
| locationCode | No | DataForSEO location code. Defaults to the project's default market (see list_projects; editable in project settings). See dataforseo.com/help-center/locations. Some countries (e.g. Iceland, 2352) are served from Google Ads data: keyword volume/CPC/trends work, but keyword difficulty, search intent, and domain analytics are unavailable. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| keywords | Yes |
get_domain_overviewGet domain overviewRead-onlyInspect
Returns a high-level view of a domain's organic footprint: estimated organic traffic, organic keyword count, backlinks, and referring domains. Use this first for domain research; for the detailed ranked-keyword list, call get_domain_keyword_suggestions next. Cached for 12 hours per domain.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to analyze (e.g. 'example.com'). | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| languageCode | No | Language code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects). | |
| locationCode | No | DataForSEO location code. Defaults to the project's default market (see list_projects; editable in project settings). See dataforseo.com/help-center/locations. Some countries (e.g. Iceland, 2352) are served from Google Ads data: keyword volume/CPC/trends work, but keyword difficulty, search intent, and domain analytics are unavailable. | |
| includeSubdomains | No | Include subdomains in the domain's metrics. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| domain | No | |
| backlinks | No | |
| organicTraffic | No | |
| organicKeywords | No | |
| referringDomains | No |
get_google_business_questionsGet Google business questionsRead-onlyInspect
Fetches Google Business Profile questions and answers for one business keyword near a coordinate. Run this only when Q&A evidence is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| near | Yes | Coordinate and radius to search around. | |
| depth | No | Maximum Q&A rows to fetch (1-100). Defaults to 20. | |
| keyword | Yes | Business name or search phrase identifying the Google Business Profile. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| languageCode | No | Language code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects). |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| questions | Yes |
get_keyword_metricsGet keyword metricsRead-onlyInspect
Hydrate up to 700 known keywords with search volume, keyword difficulty (KD), search intent, CPC, competition, and monthly trends in a single call. Use it to score candidate or known keywords — including Search Console striking-distance queries — by real demand and ranking difficulty. For countries served from Google Ads data (e.g. Iceland), KD and intent are null.
| Name | Required | Description | Default |
|---|---|---|---|
| sortBy | No | Sort order for returned rows. Defaults to search_volume. | |
| keywords | Yes | Keywords to fetch metrics for (1-700). | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| languageCode | No | Language code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects). | |
| locationCode | No | DataForSEO location code. Defaults to the project's default market (see list_projects; editable in project settings). See dataforseo.com/help-center/locations. Some countries (e.g. Iceland, 2352) are served from Google Ads data: keyword volume/CPC/trends work, but keyword difficulty, search intent, and domain analytics are unavailable. | |
| includeMonthlyTrends | No | Include monthly search-volume trend rows. Defaults to true. | |
| includeClickstreamData | No | Refine search volumes with clickstream data, which disaggregates Google Ads' grouped close-variant volumes (plurals/misspellings). Use only when plural or misspelling variants need separate volumes. Default false. No effect for countries served from Google Ads data. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| keywords | Yes |
get_landing_page_performanceGet SEO landing page performance (Search Console + Analytics)ARead-onlyInspect
The full SEO funnel per page in one call: Google Search Console clicks, impressions and position joined with Google Analytics organic sessions, engagement, key events (conversions) and revenue for each landing page. Answers 'which pages bring customers, not just clicks?', finds pages that rank but don't convert (fix the page) and pages that convert but barely rank (worth pushing), and flags pages earning Google clicks that Analytics never records (broken tracking). Best starting point for SEO prioritization, content audits and client reporting. Works with Analytics alone if Search Console isn't connected.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Explicit end (YYYY-MM-DD, property time zone). Use with startDate. | |
| rowLimit | No | Landing pages to return, by organic sessions (default 50). | |
| dateRange | No | Convenience window ending yesterday (default last_28_days). Ignored if startDate+endDate are given. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| startDate | No | Explicit start (YYYY-MM-DD, property time zone). Use with endDate. | |
| pathContains | No | Only landing pages whose path contains this, e.g. '/blog/'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| meta | No | |
| rows | No | |
| reason | No | |
| endDate | No | |
| siteUrl | No | |
| startDate | No | |
| connectUrl | No | |
| propertyId | No | |
| dataQuality | No | |
| propertyName | No | |
| searchConsole | No | |
| pagesMissingFromAnalytics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral value beyond that: the join semantics across two data sources, the degraded mode without Search Console, and diagnostic flags such as clicks Analytics never records. It does not mention auth, rate limits or pagination, but the additions are meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Opens with the core operation and keeps the value proposition front-loaded. The remaining sentences each carry distinct diagnostic or use-case information, though the description is dense and runs long relative to what most agents need to disambiguate the call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile. The description supplies the join behavior, the fallback condition, and the intended analytical scenarios, leaving no essential gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (dateRange enum, startDate/endDate, pathContains, rowLimit, projectId) are already fully documented in the schema. The description adds no parameter syntax or format detail beyond what is structured, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and pins down the scope precisely: per-page SEO funnel joining Search Console clicks/impressions/position with Analytics sessions, engagement, key events and revenue. This clearly distinguishes it from siblings like get_search_console_performance and get_analytics_report, which each cover only one half of the join.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context ('best starting point for SEO prioritization, content audits and client reporting') and names concrete analytical intents. It also discloses a degraded operating mode ('works with Analytics alone if Search Console isn't connected'). It stops short of naming the sibling alternatives it competes with, so it is not a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lead_teardownGet lead teardownRead-onlyInspect
Returns the Markdown teardown research_lead generated for a lead: pack positions from three points, the searches that bring jobs, the top-three profile comparison, website footprint and audit findings, and the fixes.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Lead id from list_leads. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| markdown | Yes | |
| generatedAt | Yes |
get_local_serp_resultsGet local SERP resultsRead-onlyInspect
Fetches one Google Maps or Local Finder SERP near a coordinate. Returns provider rows with rank fields intact; callers decide how to match a target business.
| Name | Required | Description | Default |
|---|---|---|---|
| near | Yes | Coordinate (and optional map zoom) the SERP is fetched from. | |
| depth | No | Number of results to fetch (1-100). Defaults to 20. | |
| device | No | Device the SERP is rendered for. Defaults to desktop. | |
| keyword | Yes | Search query to run on Google Maps or Local Finder. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| searchType | No | Which local SERP to fetch. Defaults to maps. | |
| languageCode | No | Language code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects). |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| results | Yes |
get_ranked_keywordsGet ranked keywordsRead-onlyInspect
Returns market-specific keyword, URL, rank, search volume, CPC, intent, and traffic rows for a domain or page. Accepts country-level DataForSEO Labs location/language codes. Use this for strategy evidence; use get_domain_overview for aggregate domain footprint.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return (1-100). Defaults to 50. | |
| market | No | Legacy US selector. Prefer locationCode/languageCode for any Labs market. Explicit locationCode takes precedence; otherwise omitted = the project's default market. | |
| offset | No | Rows to skip for pagination. | |
| sortBy | No | Sort order for returned rows. Defaults to search_volume. | |
| target | Yes | Domain (no protocol/www) or absolute page URL to list ranked keywords for. | |
| maxRank | No | Only return keywords ranking at this position or better. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| resultTypes | No | SERP result types to include. Defaults to organic and paid. | |
| languageCode | No | Language for locationCode. Defaults to that location's primary language when locationCode overrides the project market. | |
| locationCode | No | Country-level DataForSEO Labs location code. Defaults to the project's market; takes precedence over the legacy market object. | |
| minSearchVolume | No | Only return keywords with at least this monthly search volume. | |
| excludeBrandTerms | No | Exclude keywords containing any of these brand terms. | |
| includeSubdomains | No | Include subdomains of the target. Defaults to true for domains, false for page URLs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| keywords | Yes | |
| totalCount | Yes |
get_rank_trackerGet rank trackerRead-onlyInspect
Read-only access to rank tracker configs and their latest results. With trackerId, returns config + latest snapshot per keyword. Without it, lists all trackers in the project. To trigger a new check, use the dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| trackerId | No | Rank tracker config ID. If omitted, lists all rank trackers in the project. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| config | No | |
| configs | No | |
| results | No |
get_search_console_performanceGet Google Search Console performanceRead-onlyInspect
Query the connected Search Console property's Search Analytics: clicks, impressions, CTR, and average position by query/page/country/device/date. First-party data — use it for what already ranks, near-ranking queries, and pages with real demand. ctr is a 0-1 fraction; position is a 1-based average; dates are Pacific Time; the last ~3 days may be incomplete. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Search type (default web). | |
| endDate | No | Explicit end (YYYY-MM-DD, Pacific Time). Use with startDate. | |
| filters | No | AND-combined filters. To get the queries for one page: [{dimension:'page',operator:'equals',expression:'https://example.com/post'}] with dimensions ['query']. | |
| rowLimit | No | Rows per call (default 1000, max 1000). GSC sorts by clicks desc and can't filter by position — filter 'striking distance' positions client-side, and paginate with startRow when hasMore is true. | |
| startRow | No | Pagination offset. | |
| dataState | No | 'all' (default) includes fresh/incomplete recent data. | |
| dateRange | No | Convenience window (default last_28_days). End is set ~3 days back for GSC data lag. Ignored if startDate+endDate are given. Max lookback is 16 months. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| startDate | No | Explicit start (YYYY-MM-DD, Pacific Time). Use with endDate. | |
| dimensions | No | Group rows by these dimensions. Default ['query']. Use ['page'] for top pages, ['query','page'] to map queries to pages / spot cannibalization, ['date'] for a time series. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| meta | No | |
| rows | No | |
| reason | No | |
| endDate | No | |
| hasMore | No | |
| siteUrl | No | |
| rowCount | No | |
| startDate | No | |
| connectUrl | No | |
| dimensions | No | |
| nextStartRow | No | |
| setupDocsUrl | No |
get_serp_resultsGet Google SERP resultsRead-onlyInspect
Fetch live Google organic search results for 1-10 keywords. Use this to inspect who ranks for a query, verify competitors, compare SERPs across keywords, or gather source URLs before content planning. Does not save results to HarborRank. Per-keyword errors don't fail the batch.
| Name | Required | Description | Default |
|---|---|---|---|
| queries | Yes | 1-10 queries. Bulk-friendly — prefer this over multiple single-query calls. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| results | Yes |
get_upgrade_linkGet upgrade linkARead-onlyInspect
Returns the user's current HarborRank plan, the paid plans (price, monthly credits, projects) and a checkout link for each. Use when the user asks to upgrade, change plan or buy credits, or after a tool says a feature needs a paid plan or credits ran out. The user opens the link to pay by card or PayPal; you cannot pay for them. After they say they paid, call whoami to confirm the new plan before continuing.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | No | The plan the user wants. Omit to get a link for every paid plan. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| meta | No | |
| paid | Yes | |
| plans | Yes | |
| currentPlan | Yes | |
| buyCreditsUrl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds meaningful behavior beyond them: you cannot pay on the user's behalf, payment is by card or PayPal, and whoami should be called afterward to confirm. It stops short of describing output/pagination, but the added context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return value, then usage triggers, then the human-in-the-loop constraint, then the verification step. Every sentence carries a distinct instruction and none is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is not needed, and annotations cover the safety profile. The description fully covers when to call it, what the agent can and cannot do, and what to do afterward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single 'plan' enum parameter is already fully documented ('omit to get a link for every paid plan'). The description's 'a checkout link for each' corroborates but adds no syntax or format detail beyond the schema, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and three concrete resources: the user's current plan, the paid plans with price/credits/projects, and a checkout link per plan. An agent can distinguish this from get-analytics or whoami siblings immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit triggers: user asks to upgrade/change plan/buy credits, or a tool reports a needed paid feature or exhausted credits. It also names the follow-up (call whoami after payment) and the flow constraint (the user opens the link themselves).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_urlsInspect URLs in Google Search ConsoleRead-onlyInspect
Run Google Search Console's URL Inspection on up to 10 URLs of the connected property: index/coverage state, last crawl time, Google-selected vs declared canonical, and mobile/rich-results verdicts. Use it to answer 'is this page indexed? why not?'. Per-URL failures are reported inline. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | 1–10 absolute URLs to inspect. Each must belong to the connected property. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| languageCode | No | BCP-47 language for the inspection result (e.g. 'en-US'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| meta | No | |
| reason | No | |
| results | No | |
| siteUrl | No | |
| connectUrl | No | |
| setupDocsUrl | No |
list_business_categoriesList business categoriesARead-onlyInspect
Lists the Google Business category taxonomy used by prospect_leads' categories filter, sorted by listing count. Use to find the right category slugs for a niche.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum categories to return. Defaults to 50. | |
| query | No | Substring filter, e.g. 'dent' or 'roof'. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| categories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to repeat safety. It adds behavioral detail about sorting by listing count, which helps set expectations. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, no fluff, with the core purpose front-loaded and the use case in the second sentence. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a simple read-only tool. Output schema exists, schema coverage is 100%, and annotations cover safety. The description covers purpose, sorting, and usage context—nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters (limit, query, projectId) are already documented. The description does not add any parameter-specific semantics beyond the schema, which is sufficient per the baseline for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States exactly what the tool does: lists the Google Business category taxonomy, used by prospect_leads' categories filter, and sorted by listing count. This clearly distinguishes it from all sibling tools, none of which handle categories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the use case: 'Use to find the right category slugs for a niche.' It implies this is the go-to for category lookup, but does not mention alternatives or when not to use it. Since no other tool deals with categories, the guidance is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leadsList leadsRead-onlyInspect
Lists the project's saved prospecting leads with their track and outreach status.
| Name | Required | Description | Default |
|---|---|---|---|
| track | No | Filter by outreach track ('owner' or 'agency'). | |
| status | No | Filter by outreach status (e.g. 'new', 'audited'). | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| leads | Yes |
list_projectsList projectsRead-onlyInspect
Lists all projects in the user's organization. Use this whenever you need a projectId for another HarborRank tool. Returns an array of {id, name, domain, locationCode, languageCode}; pass the id value as projectId. locationCode/languageCode are the project's default market — tools fall back to them when a call omits location/language args.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| projects | Yes |
list_saved_keywordsList saved keywordsRead-onlyInspect
Lists keywords saved to a project (with cached metrics like search volume, difficulty, CPC, and tags if available). Use tag filters when the user asks for a saved segment; multiple tags match ANY tag.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tag-name filters. Multiple tags match ANY tag. | |
| limit | No | Maximum rows to return. Defaults to 100. | |
| search | No | Optional keyword text filter. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| rows | Yes | |
| tags | Yes | |
| totalCount | Yes |
prospect_leadsProspect leadsInspect
Searches Google Business listings for a niche and saves new businesses to the project's lead list (deduped by place and domain). Two modes: city (locationCode — a Google Maps search for the niche in that city) or coordinate (latitude/longitude/radiusKm). Stores each listing's coordinates and profile depth (photos, categories, 24h hours) so research_lead can check pack positions around the business. Use list_leads to read the list back.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City label stored on saved leads (e.g. 'Worcester'). | |
| limit | No | Maximum businesses to fetch (1-100). Defaults to 20. | |
| niche | Yes | Niche label stored on saved leads (e.g. 'dentist'). | |
| query | No | Business name or title text to match. | |
| latitude | No | Coordinate mode: search-center latitude. | |
| radiusKm | No | Coordinate mode: search radius in kilometers. | |
| longitude | No | Coordinate mode: search-center longitude. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| categories | No | Business category slugs to filter by (e.g. 'dentist', 'roofing_contractor'). | |
| locationCode | No | City mode: a DataForSEO SERP location code — searches Google Maps for the niche in that city. Alternative to latitude/longitude. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| added | Yes | |
| found | Yes | |
| skippedExisting | Yes |
research_keywordsResearch keywords (bulk)Read-onlyInspect
Research keyword data (search volume, difficulty, CPC, related ideas) for 1-5 seed keywords in one call. In countries served from Google Ads data, difficulty and intent are unavailable. Returns per-seed results — a single bad seed won't fail the batch.
| Name | Required | Description | Default |
|---|---|---|---|
| seeds | Yes | 1-5 seed keywords. Each seed is researched independently and returns related keywords with volume/difficulty/CPC. Bulk-friendly — prefer this over multiple single-seed calls. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| resultLimit | No | Max keywords returned per seed. Defaults to 150. | |
| includeClickstreamData | No | Refine search volumes with clickstream data, which disaggregates Google Ads' grouped close-variant volumes (plurals/misspellings). Use only when plural or misspelling variants need separate volumes. Default false (standard Google-Ads-derived volumes). No effect for countries served from Google Ads data. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| results | Yes |
research_leadResearch leadInspect
Runs HarborRank's in-product research on a saved lead and stores the evidence: money keywords with volume, the lead's Google Maps position and who holds #1, the primary keyword checked from three points around the business, the top three competitors with profile depth (photos, categories, 24h hours, Q&A, distance), the lead's organic footprint, contact discovery, an optional AI Overview check, and a quick site audit. Then writes the Markdown teardown that get_lead_teardown returns. On hosted HarborRank this requires a paid plan.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Lead id from list_leads. | |
| includeAi | No | Also check whether Google AI Overviews cite the lead's domain — the one call that is not cents. Defaults to false. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| includeAudit | No | Start a 10-page crawl of the lead's site (its findings land on the lead when it finishes). Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| skipped | Yes | |
| aiMentioned | Yes | |
| auditStarted | Yes | |
| contactEmail | Yes | |
| leadPosition | Yes | |
| keywordsChecked | Yes | |
| competitorsFound | Yes | |
| teardownAvailable | Yes |
run_site_auditRun site auditAInspect
Start a site audit with HarborRank's own crawler (no third-party API): crawls the site at the given URL (robots.txt-aware, same-origin), checks every page for SEO issues (broken links, duplicate/missing titles and descriptions, redirect chains, orphan pages, canonical problems, thin content, and more), and optionally runs Lighthouse on a sample of pages. Runs in the background — poll get_audit_status, then read get_audit_issues. If the site blocks our crawler, pages are honestly flagged as blocked rather than misreported.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Start URL to crawl. | |
| maxPages | No | Page budget for the crawl (default 50). | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| runLighthouse | No | Run Lighthouse on a sample of up to 10 representative pages (default true). Paid plans only; ignored on the Free plan. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| auditId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: no third-party API, robots.txt-awareness, same-origin scoping, background execution, and honest flagging of blocked pages. This is precisely the operational detail the openWorldHint/readOnlyHint annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense but well-organized paragraph that front-loads the action and then the follow-up flow. Every clause is informative, though the sentence is lengthy and could be split for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation; the description instead covers the async lifecycle and the follow-up tools, which is exactly what an agent needs to invoke and complete this workflow correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, maxPages, projectId, and runLighthouse. The description reinforces the crawler's scope (robots.txt-aware, same-origin) and the Lighthouse sampling, but adds little parameter syntax or format detail beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (start/run) and resource (site audit) and details exactly what the crawl checks: broken links, titles, redirect chains, orphan pages, canonical issues, thin content. It clearly distinguishes itself from siblings by routing results through get_audit_status and get_audit_issues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the workflow: it runs in the background, so the agent must poll get_audit_status and then read get_audit_issues. It also notes the optional Lighthouse step. It does not clarify when to prefer this over the semantically adjacent sibling inspect_urls, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_keywordsSave keywordsDestructiveInspect
Save keywords to a project's saved-keywords list. Idempotent: re-saving an existing keyword is a no-op. If tags are provided, missing tags may be created. By default tags are appended; set tagMode=replace to remove existing tags from these saved keywords before applying the provided tags, which is useful for reorganizing keywords into page/topic clusters. Ask the user for confirmation before applying or replacing tags broadly.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tags to attach to every saved keyword. Ask the user for explicit confirmation before using this, especially when saving many keywords or creating new tag names. | |
| tagMode | No | How to apply tags. Defaults to append. Use replace to remove existing tags from these saved keywords before applying the provided tags. | |
| keywords | Yes | Keywords to save (1-100). | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| languageCode | No | Language code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects). | |
| locationCode | No | DataForSEO location code. Defaults to the project's default market (see list_projects; editable in project settings). See dataforseo.com/help-center/locations. Some countries (e.g. Iceland, 2352) are served from Google Ads data: keyword volume/CPC/trends work, but keyword difficulty, search intent, and domain analytics are unavailable. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| tags | Yes | |
| tagMode | Yes | |
| keywords | Yes | |
| projectId | Yes | |
| savedCount | Yes | |
| languageCode | Yes | |
| locationCode | Yes |
search_local_businessesSearch local businessesRead-onlyInspect
Searches local business listings near a coordinate. Use this to find local business candidates or nearby competitors; it does not run Maps rank checks or Q&A.
| Name | Required | Description | Default |
|---|---|---|---|
| near | Yes | Coordinate and radius to search around. | |
| limit | No | Maximum businesses to return (1-50). Defaults to 20. | |
| query | No | Business name or title text to match. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| categories | No | Business categories to filter by (e.g. 'pizza_restaurant'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| businesses | Yes |
set_lead_competitorsSet lead competitorsDestructiveInspect
Stores the named competitors shown side-by-side in a lead's report. Replaces the lead's existing competitor list.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Lead id from list_leads. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| competitors | Yes | Replace-all list of named competitors with rating/review counts and one concrete strengthNote each (e.g. "ranks #1 for 'dentist worcester ma'"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| saved | Yes |
set_lead_serp_checksSet lead SERP checksDestructiveInspect
Stores real search-ranking evidence for a lead's report: per keyword, the search volume, the lead's actual position, and the top-ranking business. Replaces the lead's existing checks.
| Name | Required | Description | Default |
|---|---|---|---|
| checks | Yes | Replace-all list of SERP evidence rows: the money keywords, the lead's actual position (omit/null when they don't appear at all), and who holds the top spot. | |
| leadId | Yes | Lead id from list_leads. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| saved | Yes |
set_lead_top_issuesSet lead top issuesDestructiveInspect
Stores a lead's top audit findings in plain English — the raw material for the teaser email and report. Replaces the lead's existing list.
| Name | Required | Description | Default |
|---|---|---|---|
| issues | Yes | Replace-all list (1-3) of the audit's most business-relevant findings, in plain English a non-technical owner understands, most important first. | |
| leadId | Yes | Lead id from list_leads. | |
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| saved | Yes |
update_leadUpdate leadDestructiveInspect
Updates a saved lead's track, outreach status, owner name, contact email, or notes. Use after audits (status='audited') or when outreach state changes.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| track | No | ||
| leadId | Yes | Lead id from list_leads. | |
| status | No | ||
| aiNotes | No | Short summary of what the assistants said. | |
| auditId | No | Id of the prospecting site audit (from run_site_audit) backing this lead's report — links the report to real issues with real page URLs. | |
| ownerName | No | ||
| projectId | Yes | Required. The HarborRank project ID to scope this call to. Get one from list_projects. | |
| aiMentioned | No | Whether AI assistants mention this business when asked for a <niche> in <city>. | |
| contactEmail | No | ||
| aiRecommended | No | The business AI assistants recommend instead. | |
| auditIssuesCount | No | Total issues found by the site audit. Store the findings themselves via set_lead_top_issues; SERP evidence via set_lead_serp_checks. |
Output Schema
| Name | Required | Description |
|---|---|---|
| lead | Yes | |
| meta | No |
whoamiWho am IRead-onlyInspect
Returns the authenticated user, organization, server mode, token scopes, plan, and current credit balance, with a warning once 75% of the monthly credits are used. Use this first to confirm connection context before choosing a project or running research tools, and again to confirm a plan change.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | No | |
| mode | Yes | |
| plan | Yes | |
| scopes | Yes | |
| userId | Yes | |
| paidPlan | Yes | |
| userEmail | Yes | |
| lowCredits | Yes | |
| upgradeUrl | Yes | |
| monthlyCredits | Yes | |
| organizationId | Yes | |
| creditsRemaining | Yes |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
get_keyword_metrics1 field changed- changed
Input schema / properties / includeClickstreamData / descriptionPrevious value: -"Refine search volumes with clickstream data, which disaggregates Google Ads' grouped close-variant volumes (plurals/misspellings). DOUBLES the credit cost of the call. Default false. No effect for countries served from Google Ads data."New value: +"Refine search volumes with clickstream data, which disaggregates Google Ads' grouped close-variant volumes (plurals/misspellings). Use only when plural or misspelling variants need separate volumes. Default false. No effect for countries served from Google Ads data."
- Changed
research_keywords1 field changed- changed
Input schema / properties / includeClickstreamData / descriptionPrevious value: -"Refine search volumes with clickstream data, which disaggregates Google Ads' grouped close-variant volumes (plurals/misspellings). DOUBLES the credit cost of each seed. Default false (standard Google-Ads-derived volumes). No effect for countries served from Google Ads data."New value: +"Refine search volumes with clickstream data, which disaggregates Google Ads' grouped close-variant volumes (plurals/misspellings). Use only when plural or misspelling variants need separate volumes. Default false (standard Google-Ads-derived volumes). No effect for countries served from Google Ads data."
- Changed
research_lead1 field changed- changed
Input schema / properties / includeAudit / descriptionPrevious value: -"Start a 10-page crawl of the lead's site (free; its findings land on the lead when it finishes). Defaults to true."New value: +"Start a 10-page crawl of the lead's site (its findings land on the lead when it finishes). Defaults to true."
3 tool updates
- Added
get_ai_referral_traffic - Added
get_analytics_report - Added
get_landing_page_performance
2 tool updates
- Added
get_upgrade_link - Changed
whoami6 fields changed- added
Output schema / properties / lowCreditsAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / monthlyCreditsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / paidPlanAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / planAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / upgradeUrlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "userId", - "userEmail", - "organizationId", - "scopes", - "mode", - "creditsRemaining" -]New value: +[ + "userId", + "userEmail", + "organizationId", + "scopes", + "mode", + "creditsRemaining", + "plan", + "paidPlan", + "monthlyCredits", + "lowCredits", + "upgradeUrl" +]
2 tool updates
- Added
get_lead_teardown - Added
research_lead
1 tool update
- Changed
run_site_audit1 field changed- changed
Input schema / properties / runLighthouse / descriptionPrevious value: -"Run Lighthouse on a sample of up to 10 representative pages (default true)."New value: +"Run Lighthouse on a sample of up to 10 representative pages (default true). Paid plans only; ignored on the Free plan."
32 tool updates
- First observed
create_project - First observed
delete_project - First observed
find_serp_competitors - First observed
get_audit_issues - First observed
get_audit_pages - First observed
get_audit_status - First observed
get_backlinks_overview - First observed
get_backlinks_profile - First observed
get_domain_keyword_suggestions - First observed
get_domain_overview - First observed
get_google_business_questions - First observed
get_keyword_metrics - First observed
get_local_serp_results - First observed
get_rank_tracker - First observed
get_ranked_keywords - First observed
get_search_console_performance - First observed
get_serp_results - First observed
inspect_urls - First observed
list_business_categories - First observed
list_leads - First observed
list_projects - First observed
list_saved_keywords - First observed
prospect_leads - First observed
research_keywords - First observed
run_site_audit - First observed
save_keywords - First observed
search_local_businesses - First observed
set_lead_competitors - First observed
set_lead_serp_checks - First observed
set_lead_top_issues - First observed
update_lead - First observed
whoami
Publisher details
- Operator
- HarborRank (harborrank.com), the company that builds and runs the HarborRank SEO platform and this MCP endpoint. · Publisher source
- Operator website
- https://harborrank.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://harborrank.com/docs/mcp · Publisher source
- Trust center
- Not available
- Restrictions
- Requires a HarborRank account on a paid plan (from $29/month; no free plan). Sign-in is OAuth 2.0 with Dynamic Client Registration, no custom OAuth app needed. Research tools spend the plan's monthly credits; Search Console tools need a Google Search Console property connected in the HarborRank app. · Publisher source
Related MCP Connectors
SEO tools for AI agents: audits, Core Web Vitals, keywords, AI visibility, traffic, backlinks.
SEO data for AI agents: Google SERP, keyword research, backlinks, site audits, AI answer visibility.
- MotiBlogOAuthai.motiblog
Agent-first SEO research and publishing: competitors, SERPs, internal links, and Search Console.
SEO answers for AI agents: Search Console reads free, plus competitor, keyword, backlink, SERP data.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceConnects AI agents to live SEO data and hosted tools for site audits, keyword research, competitor analysis, local SEO, and link prospecting, with guided workflows for structured search optimization.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to access self-hosted SEO data and workflows, including keyword research, rank tracking, competitor insights, backlinks, site audits, and AI visibility.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to run SEO audits and reporting over a user's own Search Console, Google Analytics, Bing, and keyword/competitor provider data, including page/index status, traffic comparisons, backlinks, and local crawl/internal-link analysis.1,440 npm578Apache 2.0
- AlicenseNot gradedqualityCmaintenanceAgent-first SEO toolkit with 24 MCP tools for keyword research, rank tracking, site audits up to 50k pages, competitor analysis, content gap detection, domain reputation, backlink intelligence, Google Search Console integration, and AI-powered strategy generation with Claude, GPT, and Ollama. SQLite-backed and bring-your-own-key.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.