# MCP Server Catalog + Quality Score (`ianymu/mcp-server-catalog`) Actor

Scrape top awesome-mcp-server lists, fetch each MCP server's repo stats, and rank by quality (stars / recency / license / activity). Find the right MCP server for your Claude / Cursor / agent project without manually clicking through 500+ READMEs.

- **URL**: https://apify.com/ianymu/mcp-server-catalog.md
- **Developed by:** [Yanlong Mu](https://apify.com/ianymu) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## MCP Server Catalog + Quality Score

> **Scrape top awesome-mcp-server lists, score every MCP server by stars / recency / license / activity. Find production-ready MCP servers without clicking through 500+ READMEs.**

### What does this Actor do?

The MCP (Model Context Protocol) ecosystem exploded in 2025 — there are now hundreds of MCP servers across multiple "awesome-mcp" lists, but no quality bar. Half are abandoned, half lack a license, and the best ones are buried under repo-spam.

This Actor:

1. Scrapes the top awesome-mcp-server lists on GitHub (default: 3 of the largest)
2. Extracts every GitHub repo linked in those lists
3. Fetches stats for each (stars, forks, last commit, license, open issues, language)
4. Scores each on 6 quality dimensions (max 100 points)
5. Returns a ranked dataset + Markdown report

You get a single, current, decision-ready view of "which MCP server should I actually use?"

### Why use this Actor?

- **Pre-install due diligence**: before adding an MCP server to your Claude / Cursor / Cline / Aider setup, check if it's maintained
- **Curate your own list**: drop the JSON into your README to spec-build a higher-signal "awesome" list
- **Security teams**: find MCP servers without licenses (legal risk) or with abandoned maintainers (supply-chain risk)
- **Investors / market analysts**: track MCP ecosystem growth over time

### How to use

1. (Optional) **Filter by keyword** (e.g. `github`, `slack`, `database`) to narrow scope
2. Set **Max servers** (default 100, max 500)
3. (Optional) Add additional **Source lists** beyond the 3 defaults
4. Click **Start**
5. Download the dataset or `mcp-catalog.md` from the **Storage** tab

### Input

- **`keywordFilter`** — only include repos whose name contains this keyword (case-insensitive)
- **`maxServers`** — stop after N candidates (default 100)
- **`sourceLists`** — array of GitHub repos with curated MCP lists (defaults to the 3 largest)

### Output

Each row in the dataset:

```json
{
  "fullName": "github/github-mcp-server",
  "name": "github-mcp-server",
  "url": "https://github.com/github/github-mcp-server",
  "sourceList": "punkpeye/awesome-mcp-servers",
  "stars": 12500,
  "forks": 890,
  "openIssues": 45,
  "lastCommit": "2026-05-18T14:23:11Z",
  "license": "MIT",
  "language": "TypeScript",
  "description": "Official MCP server for GitHub API",
  "qualityScore": 95,
  "scoreBreakdown": {
    "stars": 30,
    "recency": 20,
    "license": 15,
    "description": 10,
    "docs": 10,
    "activity": 15
  }
}
````

### Quality scoring (6 dimensions, max 100 points)

| Dimension | Max | What it measures |
|---|---|---|
| Stars | 30 | Log-scaled (avoids over-rewarding mega-repos) |
| Recency | 20 | Pushed in last 90d = 20, 180d = 10, 365d = 5 |
| License | 15 | MIT/Apache/BSD = 15, GPL = 10, none = 0 |
| Description | 10 | Has substantive repo description |
| Docs | 10 | README size proxy (size\_kb > 50) |
| Activity | 15 | 5-200 open issues = healthy; 0 = abandoned |

### Pricing

Pay-per-event model:

- **First run**: free trial (up to 50 servers scored)
- **Per-server rate**: $0.02 per server scored
- **Per-catalog (100 servers)**: $2
- **Monthly refresh subscription**: $5/month for daily refreshed catalog

### Tips

- Set `keywordFilter` to narrow scope and save API quota — GitHub anonymous API is rate-limited to 60 req/hour
- Run during off-peak (US night) if you hit rate-limits on the GitHub API
- For ongoing tracking, schedule the Actor weekly and diff the dataset to catch new high-quality MCP servers as they appear

### FAQ

#### Why not just look at stars?

Stars are gamed and lag adoption. A repo at 1k stars from 2024 with no commits since is worse than a 200-star repo with 50 PRs in the last month. The composite score corrects for that.

#### What if a list has 1000+ repos?

The Actor stops at `maxServers`. You can raise it to 500 (the GitHub API rate-limit ceiling for anonymous calls per hour).

#### Is the data current?

Each run fetches live GitHub data. The dataset is a snapshot at run time — schedule daily/weekly if you need fresh data.

### Support

Issues / feature requests: open in the **Issues** tab on the Apify console.

Built by Ian Mu — github.com/ianymu — author of [`verify-before-stop`](https://github.com/ianymu/claude-verify-before-stop).

# Actor input Schema

## `keywordFilter` (type: `string`):

Only include MCP servers whose repo name contains this keyword (case-insensitive). e.g. 'github', 'slack', 'database'.

## `maxServers` (type: `integer`):

Stop scoring after this many candidates

## `sourceLists` (type: `array`):

GitHub repos with curated MCP server lists in their READMEs

## Actor input object example

```json
{
  "maxServers": 100,
  "sourceLists": [
    "punkpeye/awesome-mcp-servers",
    "modelcontextprotocol/servers",
    "wong2/awesome-mcp-servers"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ianymu/mcp-server-catalog").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("ianymu/mcp-server-catalog").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call ianymu/mcp-server-catalog --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ianymu/mcp-server-catalog",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "MCP Server Catalog + Quality Score",
        "description": "Scrape top awesome-mcp-server lists, fetch each MCP server's repo stats, and rank by quality (stars / recency / license / activity). Find the right MCP server for your Claude / Cursor / agent project without manually clicking through 500+ READMEs.",
        "version": "0.0",
        "x-build-id": "GEwlx4CR3figpf8RW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ianymu~mcp-server-catalog/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ianymu-mcp-server-catalog",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ianymu~mcp-server-catalog/runs": {
            "post": {
                "operationId": "runs-sync-ianymu-mcp-server-catalog",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ianymu~mcp-server-catalog/run-sync": {
            "post": {
                "operationId": "run-sync-ianymu-mcp-server-catalog",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keywordFilter": {
                        "title": "Filter servers by keyword (optional)",
                        "type": "string",
                        "description": "Only include MCP servers whose repo name contains this keyword (case-insensitive). e.g. 'github', 'slack', 'database'."
                    },
                    "maxServers": {
                        "title": "Max servers to score",
                        "minimum": 10,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Stop scoring after this many candidates",
                        "default": 100
                    },
                    "sourceLists": {
                        "title": "Awesome lists to scrape",
                        "type": "array",
                        "description": "GitHub repos with curated MCP server lists in their READMEs",
                        "default": [
                            "punkpeye/awesome-mcp-servers",
                            "modelcontextprotocol/servers",
                            "wong2/awesome-mcp-servers"
                        ],
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
