addrbookFor publishers
← 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.

How to check it · This row as JSON