I'm not sure what the first "Awesome X" list was about or who created it, but the majority of my development career, I've seen and used Awesome lists when first dipping my toes into a new framework or programming language.
The lists generally follow a familiar pattern, all encompassed in a README file:
- Brief introduction at the top of the README
- Sub-headings denoting distinctive categories of awesomeness
- Projects listed in the categories, complete with a link to their GitHub repository
That's all fine and good when you have a smallish list of awesome projects to sort through.
How To Rank Projects?
But when the list starts to grow, that's when I lose my mind trying to read through it all. I start thinking, "What if all the projects in this section are abandoned, or no one really uses them? Why can't I see some kind of ranking other than alphabetical order?"
Even though GitHub has stars, issues, and other metrics we could use to sort projects, most awesome lists keep it simple to start out, and I can't blame them. If you make a mistake with complicating contributions to your awesome list, maybe contributors will go elsewhere or just fork your list and keep going.
My theory was that it wouldn't be too hard to add a GitHub workflow to pull data in from listed projects and provide a way for users to sort through the options.
Sorting The Awesome MCP Clients List
For my experiment, I chose to improve the Awesome MCP Clients list by adding open issues and star counts.
First step is to fork and clone down the repository...and since I tagged this post #ai, of course, AI will do the rest. End of article...just kidding, kind of.
My first thought was to test Claude Code with this task since I am new to using Claude Code, and it seems like a straightforward task to delegate out to an AI agent.
I made a hand-crafted CLAUDE.md file with a task listed in steps at the end.
Remember:
- All of those steps should be included in the GitHub Workflow file.
- Use bash and Unix utilities where you can.
- Step up to simple Python scripts when you need more business logic.
- Keep things simple instead of over-engineering.
So, of course, Claude starts writing a bunch of Python from the get-go. I had to stop and help with specifying a version of Python to be used, but Claude was able to create code that seemed to do the job.
The problem was too much code being created, and I wanted to review each part to understand what was going on. I still do not trust AI agents and am very skeptical of most things in life.
My Turn At Coding
Rather than continue using Claude Code, I decided I would stop and try my hand at the task using only simple bash commands. With the aid of the JetBrains AI assistant in my IDE, I was able to come up with a one-liner to extract the GitHub owner and repo from the readme file.
REPO_LINKS=$(grep -o '<th align="left">GitHub</th><td>https://github.com/[^<]*' README.md | sed 's/.*https:\/\/github\.com\///' | grep '/' | tr '\n' ' ')
The table structure made it easy to grep
for the links and also throw out any that only had GitHub owner and no repo mentioned.
Next, I needed to convert the string of text into an array, which is why I converted the newline characters to spaces. I'm sure there are many ways to "skin an array" but the easiest for me is to use read -a
.
# Convert space-delimited string to array.
read -a repo_array <<< "$REPO_LINKS"
Now, I needed to loop through the GitHub information to grab repo stats for each project. The gh
CLI tool + grep
and sed
were my friends here.
# Loop through repos and gather stats.
for owner_repo in "${repo_array[@]}"; do
echo "Processing: $owner_repo"
repo_link="https://github.com/$owner_repo"
# Get star and issue counts.
json_output=$(gh repo view "$owner_repo" --json stargazerCount,issues)
star_count=$(echo "$json_output" | grep -o '"stargazerCount": *[0-9]*' | sed 's/.*: *//')
total_issue_count=$(echo "$json_output" | grep -o '"totalCount": *[0-9]*' | sed 's/.*: *//')
# Create CSV row
echo "$repo_link,$total_issue_count,$star_count" >> "$CSV_FILE"
done
At that point, I was satisfied since my IDE allowed viewing CSV files in sortable columns, so I could sort by star count. Once I uploaded my code and CSV to GitHub, however, I found the GitHub UI "prettifies" CSV files instead of letting you sort them.
To enhance my contribution for others viewing GH, I added a bit of code to sort the CSV rows by star count.
# Sort the CSV by star count (3rd column) in descending order, keeping the header
TEMP_FILE=$(mktemp)
head -n 1 "$CSV_FILE" > "$TEMP_FILE"
tail -n +2 "$CSV_FILE" | sort -t',' -k3 -nr >> "$TEMP_FILE"
mv "$TEMP_FILE" "$CSV_FILE"
I'll let the AI explain, since they did entirely write this part of the code.
Explanation of the sort command:
-t','
- Use comma as field delimiter-k3
- Sort by the 3rd field (star_count)-n
- Numeric sort (treats values as numbers, not strings)-r
- Reverse order (highest to lowest)
You can find the complete script and most recent CSV output in my fork of the Awesome MCP Clients repo:
- script - https://github.com/alexfinnarn/awesome-mcp-clients/blob/main/scripts/stats-for-projects.sh
- CSV file - https://github.com/alexfinnarn/awesome-mcp-clients/blob/main/project_stats.csv
Now it's time to explore the most popular projects and see if I can find an MCP client that speaks to me...or if I have to build my own ;)
Top comments (0)