occirank/Haloscan-mcp-server
If you are the rightful owner of Haloscan-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
A Model Context Protocol (MCP) server for interacting with the Haloscan SEO API, enabling seamless integration with various MCP-compatible clients.
Haloscan MCP Server
A Model Context Protocol (MCP) server for interacting with the Haloscan SEO API. This server allows easy integration with Claude for Desktop, N8N, and other MCP-compatible clients.
Features
- Exposes Haloscan SEO API functionality through MCP tools
- Provides prompts for common SEO tasks
- Easy integration with workflow automation tools like N8N
Tools
1. User Tools
- get_user_credit
- Retrieves the remaining credit for the user identified by the provided API key.
- Retrieves the remaining credit for the user identified by the provided API key.
2. Keyword Explorer Tools
-
get_keywords_overview
- Retrieves an overview of a specific keyword, providing key performance indicators such as search volume, competition level, and trends over time.
- Inputs:
keyword(string): Requested keyword.requested_data(string[]): Any combination of [keyword_match, related_search, related_question, similar_category, similar_serp, top_sites, similar_highlight, categories, metrics, volume_history, serp ].
It is mandatory to specify at least one of the requested data. Here is what they mean:
keyword_match: Top 10 (wrt search volume) keywords that include the provided keyword in their search query (exact match).related_search: Top 10 (wrt search volume) keywords that appear in SERP's "Related Searches" section for the provided keyword.related_question: Top 10 (wrt search volume) keywords that appear in SERP's "People Also Ask" (or in "Related Searches if the keyword is obviously a question) section for the provided keyword.similar_category: Top 10 (wrt search volume) keywords that have the same "Products & Services" category tree as the provided keyword. Careful, fetching this data significantly increases response time.similar_serp: Top 10 (wrt SERP similarity) keywords that have a similar organic SERP as the provided keyword.top_sites: Top 10 (wrt visibility) websites that rank for the provided keyword and similar ones.similar_highlight: Top 10 (wrt search volume) keywords for which similar terms are highlighted in SERP result pages.categories: List of Products & Services categories the provided keyword belongs to.metrics: List of metrics for the provided keyword. Those metrics include:
- Ads metrics: volume, competition, CPC. Your usual ads data.
- SEO metrics: corrected search volume, keyword match count, allintitle, KGR, KVI (Keyword Visibility Index).
- Ads metrics: volume, competition, CPC. Your usual ads data.
volume_history: Up to 2 years of search volume history for the provided keyword.serp: Last organic SERP for the provided keyword.
- Retrieves an overview of a specific keyword, providing key performance indicators such as search volume, competition level, and trends over time.
-
get_keywords_match
- Retrieves keywords/expressions including the provided keyword as a substring.
- Input:
keyword(string): Requested keyword.
- Retrieves keywords/expressions including the provided keyword as a substring.
-
get_keywords_highlights
- Retrieves keywords/expressions for which similar terms are highlighted in SERP result pages.
- Input:
keyword(string): Requested keyword.
- Retrieves keywords/expressions for which similar terms are highlighted in SERP result pages.
-
get_keywords_related
- Retrieves keywords/expressions that appear in SERP's "Related Searches" section for the provided keyword.
- Input:
keyword(string): Requested keyword.
- Retrieves keywords/expressions that appear in SERP's "Related Searches" section for the provided keyword.
-
get_keywords_questions
- Retrieves keywords/expressions that appear in SERP's "People Also Ask" (or in "Related Searches if the keyword is obviously a question) section for the provided keyword.
- Input:
keyword(string): Requested keyword.
- Retrieves keywords/expressions that appear in SERP's "People Also Ask" (or in "Related Searches if the keyword is obviously a question) section for the provided keyword.
-
get_keywords_find
- Retrieves comprehensive data for a given keyword OR list of keywords, including SEO metrics & ads metrics. This endpoint is a wrapper to call
get_keywords_match,get_keywords_related,get_keywords_questions,get_keywords_highlightstogether. - Inputs:
keyword(string): Requested keyword.keywords(string[]): Requested keywords. Ignored ifkeywordis provided.keywords_sources(string[]): Which strategies to use to find keywords from input (Any combination of [match, serp, related, highlights, questions]).
At least one is required. Here is what they mean:
match: Keywords/expressions that include the provided keyword in their search query (exact match).serp: Keywords/expressions that have a similar organic SERP as the provided keyword.related: Keywords/expressions that appear in SERP's "Related Searches" section for the provided keyword.highlights: Keywords/expressions for which similar terms are highlighted in SERP result pages.questions: Keywords/expressions that appear in SERP's "People Also Ask" (or in "Related Searches if the keyword is obviously a question) section for the provided keyword.
- Retrieves comprehensive data for a given keyword OR list of keywords, including SEO metrics & ads metrics. This endpoint is a wrapper to call
-
get_keywords_site_structure
- Clustering endpoint. You can use it either in bulk (then provide a value for
keywords) or in single request (then provide a value forkeyword). - Input:
keyword(string): Requested keyword. Ignored ifkeywordsis provided. If you only provide a value forkeyword(withoutkeywords), then an equivalent ofget_keywords_findwill run first, to fetch keywords to group.keywords(string[]): Requested keywords.mode(string): Clustering mode. Eithermanualormulti. Inmanualmode, keywords are grouped based on SERP similarity. Inmultimode, hierarchical groups are made, based on graph link density.
- Clustering endpoint. You can use it either in bulk (then provide a value for
-
get_keywords_serp_compare
- Compares a given keyword/expression's SERP at 2 different dates.
- Inputs:
keyword(string): Requested keyword/expression.period(string): The comparison period for SERPs (1 month, 3 months, 6 months, 12 months, custom).first_date(string): Date in YYYY-MM-DD format. Ignored ifperiodis notcustom. This date must be a valid date for the given keyword/expression. Valid search dates are returned inavailable_search_datesitem in call response, or as a response forget_keywords_serp_available_dates.second_date(string): Date in YYYY-MM-DD format. Ignored ifperiodis notcustom. This date must be a valid date for the given keyword/expression. Valid search dates are returned inavailable_search_datesitem in call response, or as a response forget_keywords_serp_available_dates.
- Compares a given keyword/expression's SERP at 2 different dates.
-
get_keywords_serp_availableDates
- Retrieves the available dates for historical SERP data for a given keyword.
- Input:
keyword(string): Requested keyword.
- Retrieves the available dates for historical SERP data for a given keyword.
-
get_keywords_serp_pageEvolution
- Retrieves the evolution of SERP rankings of a given URL for a specific keyword over time. All parameters are mandatory.
- Inputs:
keyword(string): Requested keyword/expression.first_date(string): Date in YYYY-MM-DD format.second_date(string): Date in YYYY-MM-DD format.url(string): URL to track rankings for.
- Retrieves the evolution of SERP rankings of a given URL for a specific keyword over time. All parameters are mandatory.
-
get_keywords_bulk
- Retrieves keyword data (SEO metrics, ads metrics, etc.) for multiple keywords at once in a bulk request.
- Input:
keywords(string[]): Array containing the requested keywords.
- Retrieves keyword data (SEO metrics, ads metrics, etc.) for multiple keywords at once in a bulk request.
-
get_keywords_scrap
- Ask Haloscan to scrape the search engine results pages (SERP) for a given keyword/expression. The scrap will take around 24h to be completed.
- Input:
keywords(string[]): Array containing the requested keywords.
- Ask Haloscan to scrape the search engine results pages (SERP) for a given keyword/expression. The scrap will take around 24h to be completed.
3. Site Explorer Tools
-
get_domains_overview
- Retrieves a comprehensive SEO performance summary for a specific domain.
- Inputs:
input(string): Target url, domain or root domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.requested_data(string[]): At least one of (metrics,positions_breakdown,traffic_value,categories,best_keywords,best_pages,gmb_backlinks,visibility_index_history,positions_breakdown_history,positions_and_pages_history). Which data to fetch among:
metrics: SEO metrics for the given domain (VI, position count, keyword count, traffic, page count, ranks, etc.).positions_breakdown: Search engine ranking positions for the given domain.traffic_value: Traffic value for the given domain (may take a while to compute for large domains).categories: Categories for the given domain (may take a while to compute for large domains).best_keywords: Top-performing keywords for the given domain (may take a while to compute for large domains).best_pages: Top-performing pages for the given domain (may take a while to compute for large domains).gmb_backlinks: GMB backlinks for the given domain.visibility_index_history: Visibility index history for the given domain.positions_breakdown_history: Search engine ranking positions breakdown history for the given domain.positions_and_pages_history: Search engine ranking positions and pages history for the given domain.
- Retrieves a comprehensive SEO performance summary for a specific domain.
-
get_domains_positions
- Retrieves the search engine ranking positions of a specified domain.
- Input:
input(string): Target url, domain or root domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.
- Retrieves the search engine ranking positions of a specified domain.
-
get_domains_top_pages
- Retrieves the top-performing pages of a specified domain based on aggregated organic search metrics such as traffic, number of ranking keywords.
- Input:
input(string): Target url, domain or root domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.
- Retrieves the top-performing pages of a specified domain based on aggregated organic search metrics such as traffic, number of ranking keywords.
-
get_domains_history_positions
- Retrieves historical ranking positions for a specific domain, between 2 specified dates. Very useful if you want to find lost positions.
- Inputs:
input(string): Target url or domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.date_from(string): Date in YYYY-MM-DD format.date_to(string): Date in YYYY-MM-DD format.
- Retrieves historical ranking positions for a specific domain, between 2 specified dates. Very useful if you want to find lost positions.
-
get_domains_history_pages
- Retrieves page-wise historical SEO performance data for a specified domain between 2 specified dates.
- Inputs:
input(string): Target url or domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.date_from(string): Date in YYYY-MM-DD format.date_to(string): Date in YYYY-MM-DD format.
- Retrieves page-wise historical SEO performance data for a specified domain between 2 specified dates.
-
get_page_best_keywords
- Retrieves the top-performing keywords for a specific URL, showing which search queries drive the most traffic and visibility to that page.
- Input:
input(string[]): Target urls.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.strategy(string): Any of (both,only_active,only_lost). Whether to return all positioned keywords, only active ones or only lost ones.
- Retrieves the top-performing keywords for a specific URL, showing which search queries drive the most traffic and visibility to that page.
-
get_domains_keywords
- Retrieves current positions of a given domain for a list of given keywords.
- Inputs:
input(string): Target url or domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.keywords(string[]): Mandatory array containing the requested keywords.
- Retrieves current positions of a given domain for a list of given keywords.
-
get_domains_bulk
- Retrieves SEO performance metrics for multiple domains in a single request.
- Input:
inputs(string[]): Array containing the requested urls or domains.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domains.
- Retrieves SEO performance metrics for multiple domains in a single request.
-
get_domains_competitors
- Retrieves a list of organic search competitors for a given domain based on overlapping keywords (may take a while to compute for large domains).
- Input:
input(string): Target url or domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.
- Retrieves a list of organic search competitors for a given domain based on overlapping keywords (may take a while to compute for large domains).
-
get_domains_competitors_keywords_diff
- Compares the keyword differences between a given domain and its competitors, highlighting keywords that one domain ranks for but the other does not (may take a while to compute for large domains).
- Inputs:
input(string): Target url or domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.competitors(string[]): Mandatory list of (up to 20) competitors to compare the input to.exclusive(boolean): Whether to include positions where only the search input is positioned, and none of the requested competitors is.missing(boolean): Whether to include positions where the search input is not positioned, and at least one of the requested competitors is.bested(boolean): Whether to include positions where the search input is positioned, and better positioned than at least one of the requested competitors.besting(boolean): Whether to include positions where the search input is positioned, but at least one of the requested competitors is positioned better.
- Compares the keyword differences between a given domain and its competitors, highlighting keywords that one domain ranks for but the other does not (may take a while to compute for large domains).
-
get_domains_competitors_best_pages
- Retrieves the best-performing pages of (specified) competitors of a given domain (may take a while to compute for large domains).
- Inputs:
input(string): Target url or domain.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.competitors(string[]): Mandatory list of (up to 20) competitors to compare the input to.
- Retrieves the best-performing pages of (specified) competitors of a given domain (may take a while to compute for large domains).
-
get_domains_competitors_keywords_best_positions
- Retrieves the best-ranking positions for a given list of domains on a given list of keywords.
- Inputs:
competitors(string[]): List of competitor domains or root domains.keywords(string[]): Mandatory list of keywords to look for.
- Retrieves the best-ranking positions for a given list of domains on a given list of keywords.
-
get_domains_visibility_trends
- Retrieves the visibility trend for a specific domain over time, showing how its search engine visibility has evolved.
- Input:
input(string[]): Array containing the requested urls or domains.mode(string): Any of (auto,root,domain,url). How to interpret the input. Usually, you want to userootto get data about the root domain.type(string): Any of (first,highest,trends,index). Should data be scaled, and how. Useindexto get the raw visibility index.
- Retrieves the visibility trend for a specific domain over time, showing how its search engine visibility has evolved.
-
get_domains_expired
- Returns a list of available domains. Domains are returned without their url unless you have already revealed them (in which case root_domain is filled), and a call to domains/expired/reveal is required to reveal domains you are interested in.
- Input:
keyword(string): Optional keyword on which the expired domain should have been positioned.
- Returns a list of available domains. Domains are returned without their url unless you have already revealed them (in which case root_domain is filled), and a call to domains/expired/reveal is required to reveal domains you are interested in.
Configuration
- Sign up for an Haloscan account.
- Choose a plan.
- Generate your API key from Configuration API page.
- Use the API key for the Haloscan server in the Claude Desktop configuration file.
Usage with Claude Desktop
Add this server to your Claude Desktop configuration file claude_desktop_config.json:
NPX
{
"mcpServers": {
"haloscan": {
"command": "npx",
"args": [
"-y",
"@occirank/haloscan-server",
"start"
],
"env": {
"HALOSCAN_API_KEY": "YOUR API KEY"
}
}
}
}
License
MIT