← The evidence ledger
Evidence row 516117
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint e25e2048-fc80-4aef-b32a-d76c8e3aeffc
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- 12d69c59dc11b90139dc405f4184b45b4aa2aac0283c150ae72d4d8d730d6647
- Leaf
- 0x4ee6d32ba3155204ed4c4af2fea67760558aa58378f04229d39b0bccbf503de0
What was observed
{
"count": 15,
"tools": [
{
"description": "Add an app to your watchlist, and with a keyword_id also track that keyword for the app. A keyword is tracked only for an app on your watchlist. Needs an API key bound to an account.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID of the app to watch",
"type": "integer"
},
"country_code": {
"default": "us",
"description": "Two-letter storefront code (default: \"us\"); with keyword_id it must match the keyword's storefront",
"type": "string"
},
"keyword_id": {
"description": "Keyword uuid to track for the app (optional; from the keyword tools)",
"type": "string"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "add_to_watchlist"
},
{
"description": "Get the ad creatives one iOS app is running, with the ad library each came from and how many that library holds for the app.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID (numeric ID from the app URL)",
"type": "integer"
},
"limit": {
"default": 30,
"description": "Ads per page (1-100, default: 30)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Ads to skip (default: 0)",
"minimum": 0,
"type": "integer"
},
"platform": {
"description": "Narrow to one ad library",
"enum": [
"meta",
"google",
"apple"
],
"type": "string"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "get_ads"
},
{
"description": "Get the listing for one iOS app by app_id: name, developer, subtitle, description, version, price, languages, content rating, screenshot URLs, an AI-written short summary, plus the storefront's rating and rating count, its latest recorded chart position (and the one before it), and the latest revenue and downloads estimate. Use this for a single app's current snapshot; use get_ranking_history for positions over time, get_revenue_history for estimates over time and get_timeline for listing changes. Errors with 'App not found' when the id is not in our data. Get the id from search_apps.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID (numeric ID from the app URL)",
"type": "integer"
},
"country": {
"default": "us",
"description": "Two-letter country code (default: \"us\")",
"type": "string"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "get_app_details"
},
{
"description": "List every App Store category as a category_id and category_name pair (a fixed list, no arguments, no network call). Use it to find the category_id to pass to get_rankings; the overall chart is category_id 36.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "get_categories"
},
{
"description": "Get the keywords this API key's own account has asked us to track, with each keyword's next scheduled SERP sweep. Scoped to the caller, same as get_tracked_apps.",
"inputSchema": {
"properties": {
"app_id": {
"description": "Only return keywords watched for this App Store ID (default: every app the account watches)",
"type": "integer"
},
"limit": {
"default": 100,
"description": "Maximum number of keywords (1-200, default: 100)",
"maximum": 200,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
},
"name": "get_keyword_watchlist"
},
{
"description": "Get the App Store search terms one iOS app is collected as ranking for, with its position and the day that position was observed.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID (numeric ID from the app URL)",
"type": "integer"
},
"limit": {
"default": 50,
"description": "Maximum keywords (1-200, default: 50)",
"maximum": 200,
"minimum": 1,
"type": "integer"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "get_keywords"
},
{
"description": "Get one app's top-free chart position per day in one storefront, as ranking_position and created_at points. The chart is the overall chart when the app has ever ranked there, otherwise the app's own category chart. Look back 1 to 3650 days (default 30). Use it for trends and for explaining a move; use get_rankings for a whole chart on one day. Top paid and top grossing history is not collected.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID of the app",
"type": "integer"
},
"country": {
"default": "us",
"description": "Two-letter country code (default: \"us\")",
"type": "string"
},
"days": {
"default": 30,
"description": "Number of days of history (1-3650, default: 30)",
"maximum": 3650,
"minimum": 1,
"type": "integer"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "get_ranking_history"
},
{
"description": "Get the App Store top free chart for a country, in chart order with #1 first: the overall chart by default, or one category via category_id (see get_categories). Each app comes with its position, previous position, name, developer, rating and revenue and download estimates, and the response gives the chart day it describes. Only top free is collected; top paid and top grossing are not. Use get_ranking_history for how one app's position moved over time.",
"inputSchema": {
"properties": {
"category_id": {
"description": "App Store category ID (default: \"36\", the overall chart; e.g. \"6015\" for Finance, \"6014\" for Games). get_categories lists them.",
"type": "string"
},
"chart": {
"default": "top_free",
"description": "Which chart. Only top_free is collected (top paid and top grossing are not, and return no items), so this is the default and the only option.",
"enum": [
"top_free"
],
"type": "string"
},
"country": {
"default": "us",
"description": "Two-letter country code (default: \"us\")",
"type": "string"
},
"limit": {
"default": 100,
"description": "Maximum number of results (1-200, default: 100)",
"maximum": 200,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
},
"name": "get_rankings"
},
{
"description": "Get the worldwide monthly downloads and revenue estimates for one iOS app, one point per data month (dated its first day). Values are Sensor Tower buckets; downloadsFloor/revenueFloor mark the stored 1,000, which means \"< 5K\", not an exact figure.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID (numeric ID from the app URL)",
"type": "integer"
},
"range": {
"default": "all",
"description": "How far back to read",
"enum": [
"30d",
"90d",
"1y",
"all"
],
"type": "string"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "get_revenue_history"
},
{
"description": "Get the most recent user reviews we have stored for one iOS app, newest first: title, text, star rating (rating), author, app version reviewed and date. Takes no country argument. Use it to read what users say; use get_app_details for the overall rating and rating count. Returns an empty list when we hold no reviews for the app.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID of the app",
"type": "integer"
},
"limit": {
"default": 10,
"description": "Maximum number of reviews (1-50, default: 10)",
"maximum": 50,
"minimum": 1,
"type": "integer"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "get_reviews"
},
{
"description": "Find apps similar in meaning to one app, using embedding similarity over their listings (limited to the given storefront). Each result has rating, rating count, revenue and downloads estimates and a distance (lower means closer). Results are sorted by downloads estimate, biggest first, not by distance. Use it to build a competitor list; use search_apps to look up an app by name instead.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID of the reference app",
"type": "integer"
},
"country": {
"default": "us",
"description": "Two-letter country code (default: \"us\")",
"type": "string"
},
"limit": {
"default": 12,
"description": "Maximum number of similar apps (1-50, default: 12)",
"maximum": 50,
"minimum": 1,
"type": "integer"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "get_similar_apps"
},
{
"description": "Get every recorded change to one iOS app listing: version, name, subtitle, price, screenshots and description, newest first, with the day each change was first seen.",
"inputSchema": {
"properties": {
"app_id": {
"description": "App Store ID (numeric ID from the app URL)",
"type": "integer"
},
"country": {
"default": "us",
"description": "Two-letter country code (default: \"us\")",
"type": "string"
}
},
"required": [
"app_id"
],
"type": "object"
},
"name": "get_timeline"
},
{
"description": "Get the apps this API key's own account is monitoring, newest first. Scoped to the caller: a key bound to another account sees a different set, and a key bound to no account is refused.",
"inputSchema": {
"properties": {
"limit": {
"default": 200,
"description": "Maximum number of tracked apps (1-1000, default: 200)",
"maximum": 1000,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
},
"name": "get_tracked_apps"
},
{
"description": "Find iOS apps by name or keyword, using Apple's iTunes Search API at call time (a text search over Apple's catalogue, not our own data). Returns app_store_id, name, developer, category id, rating, rating count and price for each match. Call this first to turn an app name into the app_store_id (the 'app_id' argument) that every per-app tool needs.",
"inputSchema": {
"properties": {
"country": {
"default": "us",
"description": "Two-letter country code (default: \"us\")",
"type": "string"
},
"limit": {
"default": 25,
"description": "Maximum number of results (1-50, default: 25)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"query": {
"description": "Search query (e.g., \"fitness tracker\", \"photo editor\")",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_apps"
},
{
"description": "Search real iPhone app screens that App Store Tracker captured itself (the library at /designs) by describing what you want to see, e.g. \"paywall with a free trial toggle and the yearly plan preselected\", \"onboarding that asks for the user's goals\", \"notification permission pre-prompt\". Describe one screen in plain words; narrow with pattern or app_id rather than with negations or keyword lists. Ranked by meaning, with exact on-screen words counting extra, and at most per_app screens per app. Each item gives the app_id for every per-app tool, the flow and screen it belongs to, a short summary, the image URL and the App Store Tracker page to cite. Covers only the apps we captured, not the whole App Store; an empty list means none of those matched.",
"inputSchema": {
"properties": {
"app_id": {
"description": "Only this app's screens (App Store ID, from search_apps)",
"type": "integer"
},
"limit": {
"default": 8,
"description": "Screens per page (1-20, default: 8)",
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Screens to skip, for the next page (use next_offset; at most 100)",
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"pattern": {
"description": "Only screens of this kind (default: any)",
"enum": [
"onboarding",
"paywall",
"sign_up",
"login",
"permission_dialog",
"home_feed",
"discover",
"search",
"content_list",
"content_detail",
"media_player",
"profile",
"settings",
"modal_sheet",
"empty_state",
"mood_checkin",
"other"
],
"type": "string"
},
"per_app": {
"default": 2,
"description": "Most screens from one app (1-5, default: 2; ignored with app_id)",
"maximum": 5,
"minimum": 1,
"type": "integer"
},
"query": {
"description": "What the screen shows, in plain language (at most 300 characters)",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_designs"
}
]
}What the leaf hashes
{"body":"12d69c59dc11b90139dc405f4184b45b4aa2aac0283c150ae72d4d8d730d6647","id":516117,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793120439271755,"prev":null,"subject":"e25e2048-fc80-4aef-b32a-d76c8e3aeffc","subject_kind":"endpoint"}Proof
Its day has not closed yet. A day closes ten minutes after midnight UTC; the proof appears here then.