npm package: @iflow-mcp/astro-mcp-server
Description: MCP server for Astro ASO (App Store Optimization) data - Access keyword rankings, historical data, and app metrics
Author: Tim Broddin
Latest version: 1.1.1

# Astro MCP Server

An MCP (Model Context Protocol) server that provides access to [Astro](https://tryastro.app/) ASO (App Store Optimization) data for LLMs.

![Astro MCP Server Example](example.jpg)

## Requirements

- [Astro](https://tryastro.app/)
- A tool with MCP support (Claude Desktop, Claude Code, ...)

## Features

This MCP server provides the following tools for querying Astro's ASO database:

### Available Tools

1. **search_rankings** - Search current keyword rankings for apps
   - Find how apps rank for specific keywords
   - Filter by app store (us, uk, etc.)
   - Filter by app name or app ID

2. **get_historical_rankings** - Get historical ranking data
   - Track ranking changes over time
   - Configurable time period (default: 30 days)
   - Filter by app and store

3. **list_apps** - List all tracked applications
   - Shows app names, IDs, platforms
   - Includes keyword count per app

4. **get_app_keywords** - Get all keywords for a specific app
   - Shows current and previous rankings
   - Includes difficulty and popularity scores
   - Shows ranking changes
   - Accepts app name or app ID

5. **get_keyword_trends** - Analyze ranking trends
   - Statistical analysis (avg, min, max, volatility)
   - Trend detection (improving/declining/stable)
   - Configurable periods (week/month/year/all)

6. **compare_rankings** - Compare rankings between dates
   - Find ranking changes between two specific dates
   - Calculate percentage changes

7. **get_app_ratings** - Get app rating history
   - Track rating changes over time
   - Shows user rating counts
   - Accepts app name or app ID

8. **get_keyword_competitors** - Get real App Store competitors for keywords
   - Shows actual competitor apps from App Store data with app categories
   - Rankings based on real App Store search results
   - Multi-store support with automatic data aggregation
   - Configurable limit for number of competitors returned

9. **get_keyword_recommendations** - Get keyword recommendations
   - Suggests related keywords based on existing tracking data
   - Helps discover new keyword opportunities
   - Fuzzy matching for broader keyword discovery

10. **analyze_competitive_landscape** - Comprehensive competitive analysis
    - Identifies top competitors across all tracked keywords with app categories
    - Calculates market share metrics (top 10/25/50 rankings)
    - Shows competitor dominance scores and shared keywords
    - Assesses competitive intensity levels
    - Configurable limit for number of competitors returned

11. **calculate_keyword_opportunity** - Find keyword opportunities
    - Identifies high-opportunity keywords with low competition
    - Combines popularity, difficulty, and competition metrics
    - Configurable thresholds for targeted opportunity discovery
    - Provides reasoning for each opportunity score

12. **detect_ranking_anomalies** - Detect unusual ranking changes
    - Identifies sudden ranking drops, rises, and volatility spikes
    - Provides context about timing and previous rankings
    - Categorizes anomaly severity (low/medium/high/critical)
    - Includes interpretation of ranking changes

13. **predict_ranking_trends** - Predict future ranking movements
    - Uses linear regression to forecast ranking trajectories
    - Provides confidence scores and trend directions
    - Estimates future ranking positions based on historical data
    - Shows methodology and data points used for predictions

14. **find_low_competition_keywords** - Discover underutilized keywords
    - Finds keywords with low competition scores
    - Balances difficulty vs. popularity for optimal targeting
    - Helps identify niche market opportunities
    - Configurable parameters for precise filtering

## Installation

### Prerequisites

- **Astro** app must be installed on your Mac with data in its database
- **Node.js** 18+ required
  ```bash
  # Check your Node version
  node --version
  ```
  

## Usage with Claude

### Claude Code (Recommended)

The easiest way to use this MCP server is with Claude Code:

```bash
# Install from NPM
claude mcp add -s user -t stdio astro -- npx -y astro-mcp-server

# If npx is using the wrong Node version (common with nvm), use the full path:
claude mcp add -s user -t stdio astro -- $(which npx) -y astro-mcp-server

# Or for local/source installation (after building):
claude mcp add -s user -t stdio astro -- node /path/to/astro-mcp-server/dist/index.js
```

### Claude Desktop

Add the following to your Claude Desktop configuration:

**For NPM installation:**

Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "astro-aso": {
      "command": "npx",
      "args": ["-y", "astro-mcp-server"]
    }
  }
}
```

**For local/source installation:**

First build the project:
```bash
cd /path/to/astro-mcp-server
npm run build
```

Then add to Claude Desktop config:
```json
{
  "mcpServers": {
    "astro-aso": {
      "command": "node",
      "args": ["/path/to/astro-mcp-server/dist/index.js"]
    }
  }
}
```

### Running Standalone

You can also run the server standalone for testing:

```bash
# If installed globally
astro-mcp-server

# Or run with npx
npx astro-mcp-server

# Or from source (after building)
npm run build
npm start

# Or for development with auto-reload
npm run dev
```

### Using with MCP Inspector

Test the server using the MCP Inspector:

```bash
# For NPM installation
npx @modelcontextprotocol/inspector npx astro-mcp-server

# For local installation (after building)
npx @modelcontextprotocol/inspector node /path/to/dist/index.js
```

### Example Queries

Once connected to Claude (via Claude Code or Claude Desktop), you can ask questions like:

**Basic Queries:**
- "Use Astro MCP to show the current rankings for the keyword 'productivity' in the US store"
- "Use Astro MCP to show me the ranking trends for 'task manager' over the last month"
- "Use Astro MCP to list all the apps being tracked"
- "Use Astro MCP to show what keywords the app 'Things 3' ranks for"
- "Use Astro MCP to compare rankings for 'notes' between last week and today"
- "Use Astro MCP to show me the rating history for app ID 1234567890"

**Advanced Competitive Intelligence:**
- "Use Astro MCP to show me the real App Store competitors for the keyword 'meditation' with their categories"
- "Use Astro MCP to analyze the competitive landscape for my app in the productivity space, showing top 15 competitors"
- "Use Astro MCP to find keyword opportunities with low competition and high popularity"
- "Use Astro MCP to detect any ranking anomalies in my app's performance this week"
- "Use Astro MCP to predict where my 'todo app' keyword will rank next month"
- "Use Astro MCP to find low-competition keywords I should target for my wellness app"
- "Use Astro MCP to get keyword recommendations based on my current 'fitness' keyword"

## Database Requirements

The server requires read access to Astro's SQLite database, typically located at:
```
~/Library/Containers/matteospada.it.ASO/Data/Library/Application Support/Astro/Model.sqlite
```

Make sure Astro has been run at least once and has collected some data before using this server.

## Technical Details

- **Runtime**: Node.js 18+
- **Database**: SQLite via sql.js (JavaScript implementation, no native compilation required)
- **Database Loading**: Automatically detects and reloads database changes, including WAL mode support with checkpoint forcing
- **Protocol**: MCP (Model Context Protocol) via stdio
- **TypeScript**: Compiled to JavaScript for distribution
- **Date Handling**: Converts Core Data timestamps to ISO format
- **App Identification**: Supports both app names (partial matching) and app IDs (exact matching)
- **WAL Mode Support**: Automatically handles Write-Ahead Logging mode databases by forcing checkpoints to merge recent changes

## Database Schema

The server reads from these main tables in Astro's database:

- `ZAPPLICATION` - App information
- `ZKEYWORD` - Keywords and current rankings
- `ZDATAPOINT` - Historical ranking data points
- `ZBINARYDATA` - Real App Store competitor data (JSON format)
- `ZRATING` - App ratings  
- `ZRATINGDATAPOINT` - Historical rating data

## Development

### Project Structure

```
astro-mcp-server/
├── src/
│   ├── index.ts      # Main server implementation
│   └── types.ts      # TypeScript type definitions
├── package.json      # Dependencies
├── tsconfig.json     # TypeScript config
├── mcp.json         # MCP configuration
└── README.md        # This file
```

### Building from Source

1. Clone the repository
2. Install dependencies: `npm install`
3. Build the project: `npm run build`
4. Run in development mode: `npm run dev`

### Publishing to NPM

1. Update version in `package.json`
2. Update author and repository URLs in `package.json`
3. Run: `npm publish` (automatically builds via prepublishOnly)

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT - See [LICENSE](LICENSE) file for details

## Troubleshooting

### Common Issues

1. **"Database not found" error**
   - Ensure Astro is installed and has been run at least once
   - Check that the database path exists

2. **"Permission denied" error**
   - The server needs read access to Astro's database
   - Check file permissions on the SQLite database

3. **Node.js compatibility**
   - Ensure you're using Node.js 18 or higher
   - The server uses sql.js (pure JavaScript), so no native module compilation is required
   - This eliminates NODE_MODULE_VERSION errors that were common with better-sqlite3

4. **No data returned or stale data**
   - Ensure Astro has collected keyword tracking data
   - Check that you're using the correct app names or IDs
   - Verify the store parameter (default is 'us')
   - The server automatically reloads the database when changes are detected
   - For WAL mode databases, recent changes are merged automatically via checkpoints

## Support

For issues or questions, please open an issue on GitHub.

---

*This project was vibecoded with ❤️ by [Tim Broddin](https://broddin.be) - Available for hire at [Titans of Industry](https://titansofindustry.be)*