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

-
security - not tested
A
license - permissive license
-
quality - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

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