Koskamo

StoreBridge MCP

A remote MCP connector that exposes StoreBridge API endpoints as discoverable, typed MCP tools for LLM agents. It allows agents to query public app store metadata including search, app details, reviews, similar apps, charts, categories, developer portfolios, autocomplete, and ASO keyword/rank data without requiring authentication.

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.

StoreBridge MCP logo, by IsaiahDupreeCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by IsaiahDupree
MCP endpoint (Streamable HTTP)
https://storebridge-mcp.vercel.app/mcp
Vendor documentation

What its tools do

13 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

13 of 13 have a description · 13 of 13 declare behavior hints · 13 of 13 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for apps on App Store and Google Play
  • Retrieve detailed app information and reviews
  • Fetch app charts and category rankings
  • Analyze developer portfolios and ASO keywords

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
storebridge 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
13 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

13 advertised

search_apps — Search apps
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search apps on the Apple App Store, Google Play, or both. Returns matching apps with store, title, developer, icon, price, rating, category, and url. Use store="both" to fan out to both engines and merge results. Apple limit is clamped to 50; Google supports 1-250. The price filter (free/paid) only applies to Google.

search_apps input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "term",
    "store"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Language (Apple form en_us, Google form en). Derived from country when omitted."
    },
    "term": {
      "type": "string",
      "description": "URL-encoded search term."
    },
    "limit": {
      "type": "integer",
      "maximum": 250,
      "minimum": 1,
      "description": "Max results. Apple is clamped to 50; Google accepts 1-250. Default 50."
    },
    "price": {
      "enum": [
        "all",
        "free",
        "paid"
      ],
      "type": "string",
      "description": "Price filter. Google only; Apple ignores it. Default all."
    },
    "store": {
      "enum": [
        "apple",
        "google",
        "both"
      ],
      "type": "string",
      "description": "Target store. \"both\" fans out to both engines and merges results."
    },
    "device": {
      "enum": [
        "iphone",
        "ipad",
        "mac"
      ],
      "type": "string",
      "description": "Apple only. Maps to software / iPadSoftware / macSoftware. Default iphone."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    },
    "fullDetail": {
      "type": "boolean",
      "description": "Google only; expensive (per-result full fetch). Default false."
    }
  }
}
search_apps annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_apps_batch — Look up apps by bundle id or batch of ids
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Resolve a single Apple app by bundleId (e.g. com.burbn.instagram), or fetch many apps at once with a comma-separated ids batch (Apple up to ~200 ids in one round-trip; Google fans out and coalesces). A batch request returns an "apps" array; a bundleId request returns a single "app". Supports store="both" for batch lookups.

get_apps_batch input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "store"
  ],
  "properties": {
    "ids": {
      "type": "string",
      "description": "Comma-separated app ids for a batch lookup (up to ~200)."
    },
    "lang": {
      "type": "string",
      "description": "Language. Derived from country when omitted."
    },
    "store": {
      "enum": [
        "apple",
        "google",
        "both"
      ],
      "type": "string",
      "description": "Target store. \"both\" is supported for batch (ids) lookups."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    },
    "bundleId": {
      "type": "string",
      "description": "Apple bundle id to resolve, e.g. com.burbn.instagram. Mutually informative with ids."
    }
  }
}
get_apps_batch annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_app — Get app details
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Full details for one app: description, version, release dates, content rating, genres, screenshots, languages, rating (with histogram and current-version stats), version history, size, installs, IAP flag, privacy policy, and store-specific extras. {id} is the Apple trackId (numeric string, e.g. 6448311069) or the Google package name (e.g. com.whatsapp).

get_app input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "store"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Apple trackId (numeric string) or Google package name."
    },
    "lang": {
      "type": "string",
      "description": "Language. Derived from country when omitted."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    }
  }
}
get_app annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_app_reviews — Get app reviews
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Reviews for one app. Apple reviews come from the customerreviews RSS feed and are hard-capped at 500 per app per country (50/page x pages 1-10); page>10 returns an error, and sort="rating" is not supported for Apple. Google reviews are token-paginated and effectively unbounded — pass the nextToken from a prior call's pagination to page forward.

get_app_reviews input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "store"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Apple trackId (numeric string) or Google package name."
    },
    "lang": {
      "type": "string",
      "description": "Language. Derived from country when omitted."
    },
    "page": {
      "type": "integer",
      "maximum": 10,
      "minimum": 1,
      "description": "Apple only, 1-10 (RSS is fixed 50/page). Default 1."
    },
    "sort": {
      "enum": [
        "recent",
        "helpful",
        "rating"
      ],
      "type": "string",
      "description": "Sort order. \"rating\" is unsupported for Apple. Default recent."
    },
    "limit": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Apple clamped to 50. Google ~150-200/page. Default 50."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    },
    "token": {
      "type": "string",
      "description": "Google only. The nextToken from a prior page's pagination."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    }
  }
}
get_app_reviews annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_similar_apps — Get similar apps
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

"Customers also bought" / related apps for one app. First-class on both stores.

get_similar_apps input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "store"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Apple trackId (numeric string) or Google package name."
    },
    "lang": {
      "type": "string",
      "description": "Language. Derived from country when omitted."
    },
    "limit": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Max results. Default 20."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    }
  }
}
get_similar_apps annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_app_permissions — Get app permissions (Google only)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Google Play declared device/data permissions for one app, grouped by permission group. Google only — passing store="apple" returns a not_supported error.

get_app_permissions input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Google package name."
    },
    "lang": {
      "type": "string",
      "description": "Language."
    },
    "store": {
      "enum": [
        "google"
      ],
      "type": "string",
      "description": "Must be google. Default google."
    }
  }
}
get_app_permissions annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_app_datasafety — Get app data safety (Google only)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Google Play "Data safety" section for one app: data shared, data collected, security practices, and privacy policy URL. Google only — passing store="apple" returns a not_supported error.

get_app_datasafety input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Google package name."
    },
    "lang": {
      "type": "string",
      "description": "Language."
    },
    "store": {
      "enum": [
        "google"
      ],
      "type": "string",
      "description": "Must be google. Default google."
    }
  }
}
get_app_datasafety annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_charts — Get top charts
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Ranked top-chart entries (App summary plus rank) for a store. type is free/paid/grossing (Apple also supports new/newfree/newpaid). category is an Apple genre id (e.g. 6007) or a Google category constant (e.g. PRODUCTIVITY); omit for the overall chart. Google list() may return an empty array with meta.stale=true when a region is broken.

get_charts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "store"
  ],
  "properties": {
    "type": {
      "type": "string",
      "description": "Chart type: free, paid, grossing (Apple also: new, newfree, newpaid). Default free."
    },
    "limit": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Apple practical max ~200; Google up to ~660 (usually <=500). Default 50."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    },
    "category": {
      "type": "string",
      "description": "Apple genre id (e.g. 6007) or Google category constant (e.g. PRODUCTIVITY). Omit for overall chart."
    },
    "fullDetail": {
      "type": "boolean",
      "description": "Google only; expensive. Default false."
    }
  }
}
get_charts annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_categories — Get categories / genres
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List categories for a store. Apple returns its static 6000/7000-range genre map; Google returns its categories() constants.

get_categories input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "store"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Language."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    }
  }
}
get_categories annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_developer — Get developer portfolio
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

A developer record plus their published apps. {id} is the Apple artistId (numeric) or the Google developerId string (e.g. "Google LLC").

get_developer input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "store"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Apple artistId (numeric) or Google developerId string."
    },
    "lang": {
      "type": "string",
      "description": "Language. Derived from country when omitted."
    },
    "limit": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Max apps returned. Default 60."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    },
    "fullDetail": {
      "type": "boolean",
      "description": "Google only; expensive. Default false."
    }
  }
}
get_developer annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
autocomplete_suggest — Autocomplete search suggestions
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Up to 5 autocomplete completions for a partial search query. First-class on both stores.

autocomplete_suggest input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "term",
    "store"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Language. Derived from country when omitted."
    },
    "term": {
      "type": "string",
      "description": "Partial query."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    }
  }
}
autocomplete_suggest annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_aso_keywords — Get ASO keyword ideas (estimated)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Directional keyword ideas for a seed term, each with a difficulty score/label, traffic score, result count, and top competitors — derived from live search/suggest results, not panel data. Every result is labeled estimated:true.

get_aso_keywords input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "term",
    "store"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Language. Derived from country when omitted."
    },
    "term": {
      "type": "string",
      "description": "Seed keyword."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    }
  }
}
get_aso_keywords annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_aso_rank — Get ASO keyword rank (estimated, point-in-time)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Point-in-time rank of one app across up to 20 keywords (one live search per keyword, fan-out capped at 20). Every result is labeled estimated:true. This is a snapshot, not rank tracking over time.

get_aso_rank input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "appId",
    "keywords",
    "store"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Language. Derived from country when omitted."
    },
    "appId": {
      "type": "string",
      "description": "Target app id (Apple trackId or Google package name)."
    },
    "store": {
      "enum": [
        "apple",
        "google"
      ],
      "type": "string",
      "description": "Target store."
    },
    "country": {
      "type": "string",
      "description": "ISO-3166 alpha-2 storefront/region, lowercase. Defaults to us."
    },
    "keywords": {
      "type": "string",
      "description": "Comma-separated keywords, max 20."
    }
  }
}
get_aso_rank annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

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
637 ms
95th percentile latency
637 ms

Maintenance history

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

  • · probe · passed · 637 ms · metadata changed · 13 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 storebridge-mcp https://storebridge-mcp.vercel.app/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 storebridge-mcp --url https://storebridge-mcp.vercel.app/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start storebridge-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "storebridge-mcp": {
      "type": "http",
      "url": "https://storebridge-mcp.vercel.app/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 storebridge-mcp https://storebridge-mcp.vercel.app/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://storebridge-mcp.vercel.app/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": {
    "storebridge-mcp": {
      "serverUrl": "https://storebridge-mcp.vercel.app/mcp"
    }
  }
}

Let your agent find its tools

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