Koskamo

ASOClimb MCP

ASOClimb is a remote MCP server that allows AI assistants like Claude, ChatGPT, and Cursor to perform App Store and Google Play keyword research, rank tracking, competitor analysis, and niche exploration using the same data and plan limits as the ASOClimb web application.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

ASOClimb MCP logo, by ASOClimbVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by ASOClimb
You need:a paid ChatGPT plan is neededworkspace API key from Account → Developer in ASOClimb
MCP endpoint (Streamable HTTP)
https://asoclimb.com/mcp
Vendor documentation

What you can do with it

  • Research keywords and track app rankings
  • Analyze competitors and keyword gaps
  • Explore niche opportunities in app stores
  • Run live store checks and chart analysis

Source and maintenance

Vendor evidenceRegistry 1.0.1

Protocol and capabilities

Server
asoclimb 1.0.0
MCP protocol
2025-06-18
Tools
43 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

ASO data for the App Store and Google Play: tracked apps, keyword ranks and history, live keyword inspection, autocomplete, niche analysis, top charts, competitors and keyword discovery. Rankings and listing facts come from storefront observations. Traffic, difficulty, KEI, visibility and discovery scores are models, not measured search volume or install counts. Preserve source, timestamp and model-version labels when presenting results.

Tools

43 advertised

get_account_usage — Get account usage
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Plan, limits and month-to-date usage for the workspace behind this key.

get_account_usage input schema
{
  "type": "object",
  "properties": {}
}
get_account_usage annotations
{
  "title": "Get account usage",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_capabilities — Get capabilities
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Which stores and data sources this deployment serves: Google Play status, chart catalogs, autocomplete sources.

get_capabilities input schema
{
  "type": "object",
  "properties": {}
}
get_capabilities annotations
{
  "title": "Get capabilities",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
search_store — Search store
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search a store for apps by name or keyword (listing metadata for up to 12 results, flagged when already tracked).

search_store input schema
{
  "type": "object",
  "required": [
    "term",
    "store",
    "country"
  ],
  "properties": {
    "term": {
      "type": "string",
      "description": "Search term."
    },
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    },
    "country": {
      "type": "string",
      "description": "ISO country code, e.g. US, GB, IN."
    },
    "language": {
      "type": "string",
      "description": "Language code, e.g. en. Defaults to en."
    }
  }
}
search_store annotations
{
  "title": "Search store",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_applications — List applications
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List the applications tracked in this workspace with their latest listing facts.

list_applications input schema
{
  "type": "object",
  "properties": {}
}
list_applications annotations
{
  "title": "List applications",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_application — Get application
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One application with its tracked keywords, competitors and listing snapshots.

get_application input schema
{
  "type": "object",
  "required": [
    "application_id"
  ],
  "properties": {
    "application_id": {
      "type": "string",
      "description": "Application id from list_applications."
    }
  }
}
get_application annotations
{
  "title": "Get application",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
add_application — Add application
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Track an app by bundle id (Apple) or package name (Google Play). Discovery then auto-tracks keywords and competitors when auto_track is on.

add_application input schema
{
  "type": "object",
  "required": [
    "bundle_id",
    "store",
    "country"
  ],
  "properties": {
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    },
    "country": {
      "type": "string",
      "description": "ISO country code, e.g. US, GB, IN."
    },
    "language": {
      "type": "string",
      "description": "Language code, e.g. en. Defaults to en."
    },
    "platform": {
      "enum": [
        "ios",
        "macos"
      ],
      "type": "string",
      "description": "Apple platform: ios (iPhone & iPad, default) or macos (the Mac App Store). apple_app_store only."
    },
    "bundle_id": {
      "type": "string",
      "description": "Bundle id or package name."
    },
    "auto_track": {
      "type": "boolean",
      "description": "Discover and track keywords and competitors automatically (default true)."
    }
  }
}
add_application annotations
{
  "title": "Add application",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
discover_keywords — Discover keywords
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Run keyword discovery for an application: title seeds, store suggestions and the titles of the apps that outrank it. With track true it also tracks the best candidates within the plan and up to five competitors.

discover_keywords input schema
{
  "type": "object",
  "required": [
    "application_id"
  ],
  "properties": {
    "track": {
      "type": "boolean",
      "description": "Track the best candidates and up to five competitors within the plan (default false: preview only)."
    },
    "max_keywords": {
      "type": "integer",
      "description": "Maximum keywords to track when track is true (default 15)."
    },
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
discover_keywords annotations
{
  "title": "Discover keywords",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_keyword_opportunities — List keyword opportunities
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Keyword opportunities for one application, assembled only from what this workspace already stored (tracked terms and their rank observations, saved inspections, saved store suggestions, tracked competitors and the listing itself). Reads no store, so `status` is "pending" until a discovery pass has completed for the listing.

list_keyword_opportunities input schema
{
  "type": "object",
  "required": [
    "application_id"
  ],
  "properties": {
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
list_keyword_opportunities annotations
{
  "title": "List keyword opportunities",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
track_keyword_opportunities — Track keyword opportunities
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Track up to 20 opportunity terms for an application. Terms the plan or the tracker rejects come back in `skipped` with a reason rather than being dropped silently.

track_keyword_opportunities input schema
{
  "type": "object",
  "required": [
    "application_id",
    "terms"
  ],
  "properties": {
    "terms": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Terms from list_keyword_opportunities."
    },
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
track_keyword_opportunities annotations
{
  "title": "Track keyword opportunities",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_keywords — List keywords
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Tracked keywords with current rank, traffic, difficulty, KEI, favorite flag and movement. rank_change is the places gained since the previous observation day (negative = lost); it is null, not 0, when there is no earlier day or when either day did not rank (the keyword entered or left the observed depth: compare current_rank with previous_rank).

list_keywords input schema
{
  "type": "object",
  "properties": {
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    },
    "country": {
      "type": "string",
      "description": "ISO country code, e.g. US, GB, IN."
    },
    "application_id": {
      "type": "string",
      "description": "Filter by application id."
    }
  }
}
list_keywords annotations
{
  "title": "List keywords",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
track_keywords — Track keywords
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Track up to 20 keywords for an application; each gets an immediate rank observation.

track_keywords input schema
{
  "type": "object",
  "required": [
    "application_id",
    "keywords"
  ],
  "properties": {
    "keywords": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Keywords to track."
    },
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
track_keywords annotations
{
  "title": "Track keywords",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
untrack_keyword — Untrack keyword
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Stop tracking a keyword. History is kept unless purge is true.

untrack_keyword input schema
{
  "type": "object",
  "required": [
    "keyword_id"
  ],
  "properties": {
    "purge": {
      "type": "boolean",
      "description": "Delete the rank history too."
    },
    "keyword_id": {
      "type": "string",
      "description": "Tracking id from list_keywords."
    }
  }
}
untrack_keyword annotations
{
  "title": "Untrack keyword",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
set_keyword_favorite — Set keyword favorite
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Mark or unmark a tracked keyword as a favorite.

set_keyword_favorite input schema
{
  "type": "object",
  "required": [
    "keyword_id",
    "favorite"
  ],
  "properties": {
    "favorite": {
      "type": "boolean"
    },
    "keyword_id": {
      "type": "string",
      "description": "Tracking id."
    }
  }
}
set_keyword_favorite annotations
{
  "title": "Set keyword favorite",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
get_keyword_rank_history — Get keyword rank history
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Daily rank, traffic, difficulty and KEI observations for a tracked keyword.

get_keyword_rank_history input schema
{
  "type": "object",
  "required": [
    "keyword_id"
  ],
  "properties": {
    "days": {
      "type": "integer",
      "description": "Window in days (default 30)."
    },
    "keyword_id": {
      "type": "string",
      "description": "Tracking id."
    }
  }
}
get_keyword_rank_history annotations
{
  "title": "Get keyword rank history",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
inspect_keyword — Inspect keyword (live)
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Live keyword inspection: top apps, traffic/difficulty/KEI scores with breakdown (including autocomplete demand), related keywords. Spends one keyword inspection from the monthly plan allowance and stores the result.

inspect_keyword input schema
{
  "type": "object",
  "required": [
    "keyword",
    "store",
    "country"
  ],
  "properties": {
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    },
    "country": {
      "type": "string",
      "description": "ISO country code, e.g. US, GB, IN."
    },
    "keyword": {
      "type": "string",
      "description": "Keyword to inspect."
    },
    "language": {
      "type": "string",
      "description": "Language code, e.g. en. Defaults to en."
    },
    "platform": {
      "enum": [
        "ios",
        "macos"
      ],
      "type": "string",
      "description": "Apple platform: ios (iPhone & iPad, default) or macos (the Mac App Store). apple_app_store only."
    }
  }
}
inspect_keyword annotations
{
  "title": "Inspect keyword (live)",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
list_keyword_inspections — List keyword inspections
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Recent stored keyword inspections in the workspace.

list_keyword_inspections input schema
{
  "type": "object",
  "properties": {}
}
list_keyword_inspections annotations
{
  "title": "List keyword inspections",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_keyword_inspection — Get keyword inspection
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One stored inspection with its full breakdown.

get_keyword_inspection input schema
{
  "type": "object",
  "required": [
    "inspection_id"
  ],
  "properties": {
    "inspection_id": {
      "type": "string",
      "description": "Inspection id."
    }
  }
}
get_keyword_inspection annotations
{
  "title": "Get keyword inspection",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
run_autocomplete — Store autocomplete (live)
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Live store search suggestions for a prefix, in the order the store shows them (Apple search hints / Google Play suggest). Spends one autocomplete request from the monthly plan allowance and stores the observation.

run_autocomplete input schema
{
  "type": "object",
  "required": [
    "prefix",
    "store",
    "country"
  ],
  "properties": {
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    },
    "prefix": {
      "type": "string",
      "description": "What the shopper has typed so far."
    },
    "country": {
      "type": "string",
      "description": "ISO country code, e.g. US, GB, IN."
    },
    "language": {
      "type": "string",
      "description": "Language code, e.g. en. Defaults to en."
    }
  }
}
run_autocomplete annotations
{
  "title": "Store autocomplete (live)",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
list_autocomplete_history — List autocomplete history
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Stored autocomplete observations.

list_autocomplete_history input schema
{
  "type": "object",
  "properties": {}
}
list_autocomplete_history annotations
{
  "title": "List autocomplete history",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
run_niche_analysis — Niche analysis (live)
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Analyze a niche from a seed keyword: related terms from store suggestions and title phrases, clusters, modeled market size (ranges), success rate above a threshold, newcomer success, top-3 concentration, keyword difficulty, and a 0-100 opportunity score with its range and components. Spends one niche analysis from the monthly plan allowance and stores the result.

run_niche_analysis input schema
{
  "type": "object",
  "required": [
    "topic",
    "store",
    "country"
  ],
  "properties": {
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    },
    "topic": {
      "type": "string",
      "description": "Topic or seed phrase."
    },
    "country": {
      "type": "string",
      "description": "ISO country code, e.g. US, GB, IN."
    },
    "language": {
      "type": "string",
      "description": "Language code, e.g. en. Defaults to en."
    },
    "platform": {
      "enum": [
        "ios",
        "macos"
      ],
      "type": "string",
      "description": "Apple platform: ios (iPhone & iPad, default) or macos (the Mac App Store). apple_app_store only."
    },
    "threshold": {
      "type": "number",
      "description": "Monthly success threshold (default 10000)."
    },
    "threshold_metric": {
      "enum": [
        "revenue",
        "downloads"
      ],
      "type": "string",
      "description": "What the threshold measures (default revenue)."
    }
  }
}
run_niche_analysis annotations
{
  "title": "Niche analysis (live)",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
list_niche_analyses — List niche analyses
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Stored niche analyses: topic, storefront, schema version and opportunity score with its range.

list_niche_analyses input schema
{
  "type": "object",
  "properties": {}
}
list_niche_analyses annotations
{
  "title": "List niche analyses",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_competitors — List competitors
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Competitors tracked for an application (or the whole workspace).

list_competitors input schema
{
  "type": "object",
  "properties": {
    "application_id": {
      "type": "string",
      "description": "Filter by application id."
    }
  }
}
list_competitors annotations
{
  "title": "List competitors",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
add_competitor — Add competitor
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Track a competitor app for one of your applications.

add_competitor input schema
{
  "type": "object",
  "required": [
    "application_id",
    "competitor_bundle_id"
  ],
  "properties": {
    "application_id": {
      "type": "string",
      "description": "Your application id."
    },
    "competitor_bundle_id": {
      "type": "string",
      "description": "Competitor bundle id or package name."
    }
  }
}
add_competitor annotations
{
  "title": "Add competitor",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
remove_competitor — Remove competitor
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Stop tracking a competitor.

remove_competitor input schema
{
  "type": "object",
  "required": [
    "competitor_id"
  ],
  "properties": {
    "competitor_id": {
      "type": "string",
      "description": "Competitor id from list_competitors."
    }
  }
}
remove_competitor annotations
{
  "title": "Remove competitor",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
get_competitor_keywords — Get competitor keywords
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Keywords where a competitor ranks, from your tracked observations.

get_competitor_keywords input schema
{
  "type": "object",
  "required": [
    "competitor_id"
  ],
  "properties": {
    "competitor_id": {
      "type": "string",
      "description": "Competitor id."
    }
  }
}
get_competitor_keywords annotations
{
  "title": "Get competitor keywords",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_top_chart_categories — List top chart categories
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Chart collections and categories available for a store.

list_top_chart_categories input schema
{
  "type": "object",
  "required": [
    "store"
  ],
  "properties": {
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    }
  }
}
list_top_chart_categories annotations
{
  "title": "List top chart categories",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
top_charts — Top charts
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Top free, paid or grossing chart for a store, country and category, with daily movement and new entries.

top_charts input schema
{
  "type": "object",
  "required": [
    "store",
    "country"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "description": "Rows (default 100, max 200)."
    },
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    },
    "country": {
      "type": "string",
      "description": "ISO country code, e.g. US, GB, IN."
    },
    "category": {
      "type": "string",
      "description": "Category id from list_top_chart_categories (default overall)."
    },
    "language": {
      "type": "string",
      "description": "Language code, e.g. en. Defaults to en."
    },
    "collection": {
      "enum": [
        "free",
        "paid",
        "grossing"
      ],
      "type": "string"
    }
  }
}
top_charts annotations
{
  "title": "Top charts",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_new_release_categories — List new release categories
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

New-release collections and categories available for a store, with the coverage each store can honestly answer.

list_new_release_categories input schema
{
  "type": "object",
  "required": [
    "store"
  ],
  "properties": {
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    }
  }
}
list_new_release_categories annotations
{
  "title": "List new release categories",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
new_releases — New releases
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Apps released to a storefront within a recent window, flagged with the chart position of the ones already ranking. Observed price, in-app purchase and audience fields only: neither store publishes per-app revenue, and none is estimated.

new_releases input schema
{
  "type": "object",
  "required": [
    "store",
    "country"
  ],
  "properties": {
    "days": {
      "type": "integer",
      "description": "Release window in days (default 7, max 30)."
    },
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string",
      "description": "Store. Google Play needs GOOGLE_PLAY_SOURCE on the deployment."
    },
    "country": {
      "type": "string",
      "description": "ISO country code, e.g. US, GB, IN."
    },
    "category": {
      "type": "string",
      "description": "Category id from list_new_release_categories (default overall)."
    },
    "language": {
      "type": "string",
      "description": "Language code, e.g. en. Defaults to en."
    },
    "collection": {
      "type": "string",
      "description": "Collection id from list_new_release_categories (App Store: free, paid, grossing; Google Play: new_free, new_paid)."
    }
  }
}
new_releases annotations
{
  "title": "New releases",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_category_rank — Category rank (live)
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Where one of your applications sits in its own category chart today, plus the stored daily history. Records today's observation.

get_category_rank input schema
{
  "type": "object",
  "required": [
    "application_id"
  ],
  "properties": {
    "collection": {
      "enum": [
        "free",
        "paid",
        "grossing"
      ],
      "type": "string"
    },
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
get_category_rank annotations
{
  "title": "Category rank (live)",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
get_app_score_history — Get app score history
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Rank observations for an application across all its keywords over a window.

get_app_score_history input schema
{
  "type": "object",
  "required": [
    "application_id"
  ],
  "properties": {
    "days": {
      "type": "integer",
      "description": "Window in days (default 7, max 90)."
    },
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
get_app_score_history annotations
{
  "title": "Get app score history",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_dashboard — Workspace dashboard
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Workspace dashboard: totals, movers, alerts and scheduler status. A mover with change null entered the observed results (previous_rank null) or left them (current_rank null).

get_dashboard input schema
{
  "type": "object",
  "properties": {}
}
get_dashboard annotations
{
  "title": "Workspace dashboard",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_scheduler_health — Get scheduler health
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Whether the hourly observation job is running and how much of this workspace it has covered today: heartbeat state, tracked vs observed-today counts and the last 24 runs that included this workspace.

get_scheduler_health input schema
{
  "type": "object",
  "properties": {}
}
get_scheduler_health annotations
{
  "title": "Get scheduler health",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_alert_events — List alert events
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Recent rank alert events.

list_alert_events input schema
{
  "type": "object",
  "properties": {}
}
list_alert_events annotations
{
  "title": "List alert events",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_metadata — Get metadata
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The stored live listing of a tracked application (title and description from the store; subtitle, keyword field or short description from the draft marked current), store character limits, checks on the live copy, the coverage of its tracked keywords and the saved drafts.

get_metadata input schema
{
  "type": "object",
  "required": [
    "application_id"
  ],
  "properties": {
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
get_metadata annotations
{
  "title": "Get metadata",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
simulate_metadata — Simulate metadata
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Check proposed listing copy for a tracked application and simulate it: character counters against store limits, duplicate and wasted words, keyword-field spacing, competitor brand names, Google Play description density, and which tracked or candidate keywords become covered or uncovered with a modeled coverage score (live vs draft). Coverage is a model, not a rank prediction. Stores nothing.

simulate_metadata input schema
{
  "type": "object",
  "required": [
    "application_id",
    "title"
  ],
  "properties": {
    "title": {
      "type": "string",
      "description": "Title (30 characters on both stores)."
    },
    "keywords": {
      "type": "string",
      "description": "App Store keyword field (100, comma separated, no spaces needed). Not public: supply your own."
    },
    "subtitle": {
      "type": "string",
      "description": "App Store subtitle (30). Not public: supply the live one from App Store Connect."
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Extra terms to simulate besides the tracked keywords (up to 50)."
    },
    "description": {
      "type": "string",
      "description": "Description (4000). Indexed by Google Play, not by the App Store."
    },
    "application_id": {
      "type": "string",
      "description": "Application id."
    },
    "short_description": {
      "type": "string",
      "description": "Google Play short description (80)."
    }
  }
}
simulate_metadata annotations
{
  "title": "Simulate metadata",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
save_metadata_draft — Save metadata draft
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Save listing copy as a named draft for a tracked application, optionally marking it as the copy that is live today (fills the private fields of the live baseline). Counts against the monthly draft-save allowance.

save_metadata_draft input schema
{
  "type": "object",
  "required": [
    "application_id",
    "title"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "Draft name."
    },
    "title": {
      "type": "string",
      "description": "Title (30 characters on both stores)."
    },
    "keywords": {
      "type": "string",
      "description": "App Store keyword field (100, comma separated, no spaces needed). Not public: supply your own."
    },
    "subtitle": {
      "type": "string",
      "description": "App Store subtitle (30). Not public: supply the live one from App Store Connect."
    },
    "is_current": {
      "type": "boolean",
      "description": "This is the copy live in the store today."
    },
    "description": {
      "type": "string",
      "description": "Description (4000). Indexed by Google Play, not by the App Store."
    },
    "application_id": {
      "type": "string",
      "description": "Application id."
    },
    "short_description": {
      "type": "string",
      "description": "Google Play short description (80)."
    }
  }
}
save_metadata_draft annotations
{
  "title": "Save metadata draft",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_metadata_drafts — List metadata drafts
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Saved metadata drafts for a tracked application, with the coverage and check counts stored when each was saved.

list_metadata_drafts input schema
{
  "type": "object",
  "required": [
    "application_id"
  ],
  "properties": {
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
list_metadata_drafts annotations
{
  "title": "List metadata drafts",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_metadata_draft — Compare metadata draft
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One saved draft compared field by field with the live listing, re-simulated against the current rank observations.

compare_metadata_draft input schema
{
  "type": "object",
  "required": [
    "draft_id"
  ],
  "properties": {
    "draft_id": {
      "type": "string",
      "description": "Draft id from list_metadata_drafts."
    }
  }
}
compare_metadata_draft annotations
{
  "title": "Compare metadata draft",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
check_listing_metadata — Check listing metadata
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Check any App Store or Google Play listing, tracked or not: reads its public title and description now and runs the metadata checks on them plus any subtitle, keyword field or terms you supply. Stores nothing.

check_listing_metadata input schema
{
  "type": "object",
  "required": [
    "bundle_id",
    "store",
    "country"
  ],
  "properties": {
    "store": {
      "enum": [
        "apple_app_store",
        "google_play"
      ],
      "type": "string"
    },
    "title": {
      "type": "string",
      "description": "Title (30 characters on both stores)."
    },
    "country": {
      "type": "string",
      "description": "ISO country code."
    },
    "keywords": {
      "type": "string",
      "description": "App Store keyword field (100, comma separated, no spaces needed). Not public: supply your own."
    },
    "language": {
      "type": "string",
      "description": "Language code (default en)."
    },
    "subtitle": {
      "type": "string",
      "description": "App Store subtitle (30). Not public: supply the live one from App Store Connect."
    },
    "bundle_id": {
      "type": "string",
      "description": "Bundle id or package name."
    },
    "candidates": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Extra terms to simulate besides the tracked keywords (up to 50)."
    },
    "description": {
      "type": "string",
      "description": "Description (4000). Indexed by Google Play, not by the App Store."
    },
    "short_description": {
      "type": "string",
      "description": "Google Play short description (80)."
    }
  }
}
check_listing_metadata annotations
{
  "title": "Check listing metadata",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
get_keyword_gap — Get keyword gap
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Keyword gap against one tracked competitor: terms it ranks for in the top 30 where your app does not (with both ranks, modeled traffic, difficulty and an opportunity score), plus shared and only-you lists. Terms come only from this workspace's tracked keywords and its own keyword inspections.

get_keyword_gap input schema
{
  "type": "object",
  "required": [
    "competitor_id"
  ],
  "properties": {
    "competitor_id": {
      "type": "string",
      "description": "Competitor id from list_competitors."
    }
  }
}
get_keyword_gap annotations
{
  "title": "Get keyword gap",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_keyword_gaps — List keyword gaps
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Keyword-gap summary for every tracked competitor of an application, with each competitor's five best gap terms.

list_keyword_gaps input schema
{
  "type": "object",
  "required": [
    "application_id"
  ],
  "properties": {
    "application_id": {
      "type": "string",
      "description": "Application id."
    }
  }
}
list_keyword_gaps annotations
{
  "title": "List keyword gaps",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
expand_keyword_gap — Expand keyword gap
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Widen a competitor's keyword gap: ask the store autocomplete about words from the competitor's title (or the prefixes given) and inspect new suggestions. Spends one autocomplete request per prefix and one keyword inspection per inspected term from the monthly allowances, then returns the refreshed gap.

expand_keyword_gap input schema
{
  "type": "object",
  "required": [
    "competitor_id"
  ],
  "properties": {
    "prefixes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Up to 3 prefixes (default: words from the competitor title)."
    },
    "max_terms": {
      "type": "integer",
      "description": "Most suggestions to inspect (default 5, max 10)."
    },
    "competitor_id": {
      "type": "string",
      "description": "Competitor id."
    }
  }
}
expand_keyword_gap annotations
{
  "title": "Expand keyword gap",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
319 ms
95th percentile latency
319 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 319 ms · metadata changed · 43 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http asoclimb-mcp https://asoclimb.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add asoclimb-mcp --url https://asoclimb.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable asoclimb-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "asoclimb-mcp": {
      "url": "https://asoclimb.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "asoclimb-mcp": {
      "type": "streamableHttp",
      "url": "https://asoclimb.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start asoclimb-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "asoclimb-mcp": {
      "type": "http",
      "url": "https://asoclimb.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http asoclimb-mcp https://asoclimb.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "asoclimb-mcp": {
      "url": "https://asoclimb.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "asoclimb-mcp": {
      "serverUrl": "https://asoclimb.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like ASOClimb MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run ASOClimb MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing