Skip to main content
Glama
appdatalayer

AppDataLayer MCP Server

by appdatalayer

appdatalayer-mcp

Open-source TypeScript SDK for the AppDataLayer MCP Server — the App Intelligence Query Engine powered by the Model Context Protocol.

Analyze 1B+ app reviews across Google Play and the Apple App Store. Semantic topic search, sentiment analysis, keyword rankings, competitive analysis, and time-series forecasting — all through a single typed API.

Installation

npm install appdatalayer-mcp

Quick Start

One-command setup

The fastest way to get started — authenticates via browser and auto-configures your AI agent:

npx appdatalayer-mcp setup

This detects installed agents (Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, Antigravity, OpenCode), opens a browser for login, and writes the correct config file for each.

You can also target a specific agent:

npx appdatalayer-mcp setup --agent cursor
npx appdatalayer-mcp setup --api-key sk_live_...

As a TypeScript/JavaScript SDK

import { AppDataLayerClient } from "appdatalayer-mcp";

const client = new AppDataLayerClient({ apiKey: "sk_live_..." });

// Get weekly report for an app
const report = await client.call("get_weekly_report", { app_id: "com.spotify.music" });

// Ask about your app in natural language (Pro)
const answer = await client.call("ask_about_my_app", {
  app_id: "com.spotify.music",
  question: "Are users complaining about battery drain?",
});

// Query live data — app overview
const app = await client.call("query_live_data", {
  query_type: "app_overview",
  app_id: "com.instagram.android",
});

// Query live data — analyze reviews
const reviews = await client.call("query_live_data", {
  query_type: "analyze_reviews",
  app_id: "com.spotify.music",
  dimensions: ["sentiment", "topic"],
  days: 30,
});

// Query live data — forecast with auto-fetch
const forecast = await client.call("query_live_data", {
  query_type: "forecast",
  metric: "review_count",
  app_id: "com.spotify.music",
  horizon: 7,
});

// Query live data — compare apps
const comparison = await client.call("query_live_data", {
  query_type: "compare_apps",
  app_ids: ["com.spotify.music", "com.apple.music"],
  days: 30,
});

// Manage tracking — track an app
await client.call("manage_tracking", {
  action: "track_app",
  app_id: "com.spotify.music",
  provider: "google-play",
});

// Get alerts and anomalies
const alerts = await client.call("get_alerts", { app_id: "com.spotify.music" });

// Check usage and quota
const usage = await client.call("manage_credentials", { action: "usage" });

await client.disconnect();

As an MCP Server for LLM Agents

Use AppDataLayer directly in Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, Antigravity, or OpenCode:

# Auto-detect and configure all installed agents
npx appdatalayer-mcp setup

# Or print config JSON for manual setup
npx appdatalayer-mcp config sk_live_... --agent cursor

Manual configuration

Client

Config File

Key Format

Claude Code

~/.claude.json

type: "http"

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json

mcp-remote bridge

Cursor

~/.cursor/mcp.json

url + headers

Windsurf

~/.codeium/windsurf/mcp_config.json

serverUrl + headers

VS Code (Copilot)

~/.vscode/mcp.json

type: "http" (key: servers)

Antigravity

~/.gemini/antigravity/mcp_config.json

serverUrl + headers

OpenCode

~/.config/opencode/opencode.json

type: "remote" (key: mcp)

Example config (Cursor format):

{
  "mcpServers": {
    "appdatalayer": {
      "url": "https://mcp.appdatalayer.com/mcp",
      "headers": {
        "APPDATALAYER_API_KEY": "sk_live_..."
      }
    }
  }
}

As a Standalone MCP Server

Run a local MCP server that proxies all tools from the hosted backend:

# stdio transport (for agents that spawn a subprocess)
npx appdatalayer-mcp serve --api-key sk_live_...

# HTTP transport (for network-based setups)
npx appdatalayer-mcp serve --transport http --port 3100 --api-key sk_live_...

Available Tools

The MCP server exposes 6 tools:

1. get_weekly_report

Get the latest pre-generated weekly report for an app. Includes health score, review sentiment & trends, top topics, keyword rankings, store performance, competitive analysis, anomaly alerts, and 7-day forecast.

await client.call("get_weekly_report", {
  app_id: "com.spotify.music",
});

2. ask_about_my_app

Ask a natural language question about your app's reviews. Pro feature.

await client.call("ask_about_my_app", {
  app_id: "com.spotify.music",
  question: "What do users love most?",
  days: 90,             // optional, default 90
  provider: "google-play", // optional
  country: "us",        // optional
  version: "9.0.0",     // optional
});

3. get_alerts

Get anomalies detected in the latest report (rating drops, review spikes, sentiment shifts) and active webhook status.

await client.call("get_alerts", {
  app_id: "com.spotify.music", // optional — omit for all apps
});

4. manage_tracking

Manage what you track. 14 actions:

Action

Description

Required params

list_apps

List tracked apps

track_app

Start tracking an app

app_id, provider

untrack_app

Stop tracking

app_id, provider

list_keywords

List tracked keywords

track_keyword

Track a keyword's ranking

keyword, provider

untrack_keyword

Stop tracking a keyword

keyword, provider

bulk_track_keywords

Track multiple keywords

keywords[]

list_webhooks

List alert webhooks

create_webhook

Set up an alert

app_id, trigger_type, webhook_url

delete_webhook

Remove an alert

webhook_id

toggle_webhook

Enable/disable an alert

webhook_id, is_active

create_scrape_job

Create custom scrape job (Pro)

job_type, provider

toggle_scrape_job

Enable/disable a scrape job

scrape_target_id, is_active

schedule_report

Set up weekly report generation

app_id

// Track an app across all regions (Pro)
await client.call("manage_tracking", {
  action: "track_app",
  app_id: "com.spotify.music",
  provider: "google-play",
});

// Create a webhook alert
await client.call("manage_tracking", {
  action: "create_webhook",
  app_id: "com.spotify.music",
  trigger_type: "sentiment_drop",
  webhook_url: "https://hooks.slack.com/...",
  check_frequency: "daily",
});

// Schedule weekly reports
await client.call("manage_tracking", {
  action: "schedule_report",
  app_id: "com.spotify.music",
});

5. manage_credentials

Manage store credentials and account. 5 actions:

Action

Description

list

List saved Apple/Google credentials

connected_stores

Which stores you have credentials for

add

Save new credential (AES-256-GCM encrypted)

update

Update an existing credential

usage

Check API usage, quota, plan limits

// Check usage
await client.call("manage_credentials", { action: "usage" });

// Add Google Play credential
await client.call("manage_credentials", {
  action: "add",
  provider: "google_play",
  label: "My Production App",
  app_identifier: "com.example.myapp",
  service_account_json: '{ "type": "service_account", ... }',
});

// Add Apple credential
await client.call("manage_credentials", {
  action: "add",
  provider: "apple",
  label: "My iOS App",
  app_identifier: "com.example.myapp",
  issuer_id: "...",
  key_id: "...",
  p8_key: "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----",
});

6. query_live_data

Power tool for custom queries beyond the weekly report. 12 query types:

Query Type

Description

Key params

app_overview

App metadata, scores, installs, sentiment summary

app_id

analyze_reviews

Aggregate reviews by dimensions

app_id, dimensions[]

version_analysis

Per-version breakdown, regression detection (Pro)

app_id

keyword_rankings

Keyword position over time

keyword

top_charts

Store top charts

collection, country

similar_apps

Competitive set

app_id

search_suggestions

Store autocomplete

term

compare_apps

Side-by-side comparison (2-5 apps)

app_ids[]

forecast

Predict future metric values

metric + app_id, or series[]

topics

Search/explore review topics

topic_action, query or topic_ids

fetch_realtime

Live data from stores (not from DB)

provider, feature

scrape_jobs

Inspect scraping job status

view

// Analyze reviews by sentiment and topic
await client.call("query_live_data", {
  query_type: "analyze_reviews",
  app_id: "com.spotify.music",
  dimensions: ["sentiment", "topic"],
  days: 30,
});

// Forecast keyword ranking
await client.call("query_live_data", {
  query_type: "forecast",
  metric: "keyword_ranking",
  app_id: "com.spotify.music",
  keyword: "music streaming",
  horizon: 14,
});

// Search topics
await client.call("query_live_data", {
  query_type: "topics",
  topic_action: "search",
  query: "app crashes and freezes",
});

// Fetch real-time data from store
await client.call("query_live_data", {
  query_type: "fetch_realtime",
  provider: "google-play",
  feature: "app_detail",
  app_id: "com.instagram.android",
});

// Version analysis with regression detection (Pro)
await client.call("query_live_data", {
  query_type: "version_analysis",
  app_id: "com.spotify.music",
  detect_regression: true,
  days: 90,
});

API Reference

AppDataLayerClient

const client = new AppDataLayerClient({
  apiKey: string;            // Required — your API key
  endpoint?: string;         // Default: "https://mcp.appdatalayer.com/mcp"
  timeout?: number;          // Default: 30000ms
});

The client auto-connects on first tool call. You can also call await client.connect() explicitly.

Return Type

All methods return ToolCallResult<T>:

interface ToolCallResult<T> {
  content: { type: string; text: string }[]; // Raw MCP content
  isError?: boolean;                          // True if the tool returned an error
  data: T | null;                             // Parsed JSON data (null if error)
}

Raw Access

// Call any tool by name
const result = await client.call("tool_name", { ...args });

// List all available tools
const tools = await client.listTools();

// List all available resources
const resources = await client.listResources();

// Read a resource
const schema = await client.readResource("appdatalayer://schemas/all");

generateMcpConfig

import { generateMcpConfig } from "appdatalayer-mcp";

const config = generateMcpConfig(
  apiKey: string,
  endpoint?: string  // Default: "https://mcp.appdatalayer.com/mcp"
);

CLI Reference

# Interactive setup — browser auth + auto-configure agents
npx appdatalayer-mcp setup
npx appdatalayer-mcp setup --agent cursor
npx appdatalayer-mcp setup --api-key sk_live_...

# Print config JSON for manual setup
npx appdatalayer-mcp config <api-key> --agent <name>

# Run as standalone MCP server
npx appdatalayer-mcp serve --api-key <key>
npx appdatalayer-mcp serve --transport http --port 3100

Supported agents: claude-code, claude-desktop, cursor, windsurf, vscode, antigravity, opencode

Configuration

Env Variable

Description

APPDATALAYER_API_KEY

Your AppDataLayer API key

Examples

See the examples/ directory:

Data Coverage

Metric

Value

Reviews

1B+

Apps

250K+

Topics

1M+ clusters

Countries

44

Stores

Google Play, Apple App Store

License

MIT — AppDataLayer

A
license - permissive license
Not graded
quality - not tested
Not graded
maintenance - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Live App Store & Google Play data for AI agents: app discovery, ASO keywords, reviews.

  • ASO analytics and App Store optimization tools for indie iOS developers and AI agents.

  • ASO tools for AI agents: keyword research, rank tracking, competitor analysis (iOS & Android).

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/appdatalayer/mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server