Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
8a8b75b
Fix typo (#121)
Soutehkeshan Sep 28, 2025
48ae8f8
Fixed installation errors in the pypi distribution of the mcp server …
rjohn-v Sep 29, 2025
cd248ce
Merge branch 'main' into release/v2.1.4
rjohn-v Sep 29, 2025
bd5fbbf
updated version to v2.1.4
rjohn-v Sep 29, 2025
90521d9
Merge branch 'develop' into release/v2.1.4
rjohn-v Sep 30, 2025
773643e
Merge remote-tracking branch 'origin/develop' into release/v2.1.4
rjohn-v Sep 30, 2025
842c0e6
Merge pull request #134 from robotmcp/release/v2.1.4
rjohn-v Oct 1, 2025
990e0dd
Added metrics workflows (tested in separate repo)
stex2005 Oct 7, 2025
1b87ec8
Removed non-working workflows
stex2005 Oct 7, 2025
1692c01
Added download-metrics.yml + commit/push to metrics branch
stex2005 Oct 7, 2025
6129d8c
Hotfix: added metrics workflow to monitor clone/views (#147)
stex2005 Oct 7, 2025
1f6e53d
Minor fix to download-metrics.yml
stex2005 Oct 7, 2025
6cc93fe
Hotfix/sdg/metrics workflow (#149)
stex2005 Oct 7, 2025
50f0585
Minor fix to download-metrics.yml
stex2005 Oct 7, 2025
c8bb1cf
Hotfix/sdg/metrics workflow (#150)
stex2005 Oct 7, 2025
3c60963
Download-metrics.yml rewrites the file entirely
stex2005 Oct 7, 2025
53349c9
Merge branch 'main' into hotfix/sdg/metrics-workflow
stex2005 Oct 7, 2025
d2de96a
Merge pull request #151 from robotmcp/hotfix/sdg/metrics-workflow
stex2005 Oct 7, 2025
45bcdd3
Updated workflows (#155)
stex2005 Oct 8, 2025
afbf1fb
added server name to the readme file
rjohn-v Oct 9, 2025
1fc16f3
Merge pull request #156 from robotmcp/hotfix/rjv/mcp-name
rjohn-v Oct 9, 2025
52fcec9
added workflow dispatch to the publish github action
rjohn-v Oct 9, 2025
a160393
Merge pull request #157 from robotmcp/hotfix/rjv/mcp-name
rjohn-v Oct 9, 2025
7d49715
updated version number in the hotfix
rjohn-v Oct 9, 2025
4e13c9b
Merge pull request #158 from robotmcp/hotfix/rjv/v2.1.5
rjohn-v Oct 9, 2025
6ec1a45
Feature/sdg/registry (#161)
stex2005 Oct 9, 2025
b2c4518
Feature/sdg/registry (#162)
stex2005 Oct 9, 2025
3457f70
Feature/sdg/registry (#163)
stex2005 Oct 9, 2025
f72c69b
Feature/sdg/registry Minor changes to workflows to chain PyPI (#164)
stex2005 Oct 9, 2025
f583ba4
Hotfix/v2.1.6 (#165)
stex2005 Oct 9, 2025
ac75c8c
Hotfix/workflows (#167)
stex2005 Oct 9, 2025
81ac1a4
Bump version to v2.1.7
rjohn-v Oct 26, 2025
537aff0
Update version to v2.1.7 in server.json and uv.lock
rjohn-v Oct 26, 2025
c7e5de7
Merge main into release/v2.1.7 - resolve conflicts
rjohn-v Oct 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 151 additions & 0 deletions .github/workflows/clone-metrics.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
name: Track Clone Metrics

on:
workflow_dispatch:
schedule:
- cron: '0 8 * * *' # Run every day at 8am


jobs:
clone-stats:
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch all history for proper branch operations

- name: Generate GitHub App token
id: generate_token
uses: tibdex/github-app-token@v2.1.0
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}

- name: Switch to metrics branch
run: |
# Checkout or create metrics branch
if git show-ref --verify --quiet refs/remotes/origin/metrics; then
echo "📋 Checking out existing metrics branch..."
git checkout -b metrics origin/metrics || git checkout metrics
else
echo "🆕 Creating new metrics branch..."
git checkout -b metrics
fi

- name: Fetch clone data
env:
TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
mkdir -p .metrics
# Fetch clone metrics (contains both daily breakdown and 14-day totals)
curl -s -H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer $TOKEN" \
https://api.github.com/repos/${{ github.repository }}/traffic/clones \
> .metrics/clone_stats.json

echo "Clone metrics:"
cat .metrics/clone_stats.json

- name: Update daily metrics
run: |
# Process each day from the clones array
LAST_UPDATED=$(date -u +"%Y-%m-%d %H:%M:%S UTC")

# Create daily CSV with header if it doesn't exist
if [ ! -f .metrics/daily_clone_metrics.csv ]; then
echo "date,total_clones,unique_cloners,last_updated" > .metrics/daily_clone_metrics.csv
fi

echo "📊 Processing daily metrics..."
jq -r '.clones[] | "\(.timestamp | split("T")[0]),\(.count),\(.uniques)"' .metrics/clone_stats.json | while IFS=',' read -r day_date count uniques; do
echo "Processing $day_date: $count clones, $uniques unique"

# Check if this date already exists in the CSV
if grep -q "^$day_date" .metrics/daily_clone_metrics.csv; then
echo "📝 Updating existing entry for $day_date..."
# Update existing entry
awk -v date="$day_date" -v count="$count" -v uniques="$uniques" -v last_updated="$LAST_UPDATED" '
BEGIN { FS=","; OFS="," }
/^[0-9]{4}-[0-9]{2}-[0-9]{2}/ && $1 == date {
print $1, count, uniques, last_updated;
updated=1;
next
}
{ print }
' .metrics/daily_clone_metrics.csv > .metrics/daily_clone_metrics_temp.csv
mv .metrics/daily_clone_metrics_temp.csv .metrics/daily_clone_metrics.csv
else
echo "➕ Adding new daily entry for $day_date..."
echo "$day_date,$count,$uniques,$LAST_UPDATED" >> .metrics/daily_clone_metrics.csv
fi
done

echo "Daily metrics:"
tail -n 5 .metrics/daily_clone_metrics.csv

- name: Update 14-day rolling metrics
run: |
# Process 14-day metrics
COUNT_14D=$(jq '.count' .metrics/clone_stats.json)
UNIQUES_14D=$(jq '.uniques' .metrics/clone_stats.json)
DATE_ONLY=$(date -u +"%Y-%m-%d")
LAST_UPDATED=$(date -u +"%Y-%m-%d %H:%M:%S UTC")

echo "📊 Processing 14-day metrics... for date: $DATE_ONLY"
echo "Processing values: $COUNT_14D clones, $UNIQUES_14D unique"

# Create 14-day CSV with header if it doesn't exist
if [ ! -f .metrics/rolling_14d_clone_metrics.csv ]; then
echo "date,total_clones_14d,unique_cloners_14d,last_updated" > .metrics/rolling_14d_clone_metrics.csv
echo "📄 Created new 14-day rolling CSV file"
fi

# Check if today's date already exists in the 14-day CSV
if grep -q "^$DATE_ONLY" .metrics/rolling_14d_clone_metrics.csv; then
echo "📝 Updating existing 14-day rolling entry for $DATE_ONLY..."
# Update existing entry
awk -v date="$DATE_ONLY" -v count="$COUNT_14D" -v uniques="$UNIQUES_14D" -v last_updated="$LAST_UPDATED" '
BEGIN { FS=","; OFS=","; updated=0 }
/^[0-9]{4}-[0-9]{2}-[0-9]{2}/ && $1 == date {
print $1, count, uniques, last_updated;
updated=1;
next
}
{ print }
END { if (!updated) print date, count, uniques, last_updated }
' .metrics/rolling_14d_clone_metrics.csv > .metrics/rolling_14d_clone_metrics_temp.csv
mv .metrics/rolling_14d_clone_metrics_temp.csv .metrics/rolling_14d_clone_metrics.csv
echo "✅ Updated existing entry"
else
echo "➕ Adding new 14-day rolling entry for $DATE_ONLY..."
echo "$DATE_ONLY,$COUNT_14D,$UNIQUES_14D,$LAST_UPDATED" >> .metrics/rolling_14d_clone_metrics.csv
echo "✅ Added new entry"
fi

echo "14-day rolling metrics:"
tail -n 5 .metrics/rolling_14d_clone_metrics.csv

- name: Commit and push results
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
git config user.name "CloneMetricsBot[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

# Add both CSV files
git add .metrics/daily_clone_metrics.csv .metrics/rolling_14d_clone_metrics.csv

# Check if there are changes to commit
if git diff --staged --quiet; then
echo "ℹ️ No changes to commit - CSV data is up to date"
else
echo "📝 Committing changes..."
git commit -m "Automated update: repository clone metrics $(date)"

echo "🚀 Pushing to metrics branch..."
git push --force-with-lease origin metrics
fi
63 changes: 0 additions & 63 deletions .github/workflows/clone-trend.yml

This file was deleted.

109 changes: 109 additions & 0 deletions .github/workflows/download-metrics.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: Track Download Metrics

on:
workflow_dispatch:
workflow_run:
workflows: ["Track View Metrics"] # exact name of PyPI workflow
types: [completed]

jobs:
download-stats:
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch all history for proper branch operations

- name: Generate GitHub App token
id: generate_token
uses: tibdex/github-app-token@v2.1.0
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}

- name: Switch to metrics branch
run: |
# Checkout or create metrics branch
if git show-ref --verify --quiet refs/remotes/origin/metrics; then
echo "📋 Checking out existing metrics branch..."
git checkout -b metrics origin/metrics || git checkout metrics
else
echo "🆕 Creating new metrics branch..."
git checkout -b metrics
fi

- name: Fetch download data
env:
TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
mkdir -p .metrics
# Fetch download metrics from releases
curl -s -H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer $TOKEN" \
"https://api.github.com/repos/${{ github.repository }}/releases?per_page=100" \
> .metrics/releases.json

echo "Download metrics:"
jq '[.[] | {tag: .tag_name, date: .published_at, total_downloads: ([.assets[].download_count] | add), assets_count: (.assets | length)}]' .metrics/releases.json

- name: Update total download metrics
run: |
# Process each release from the releases array
LAST_UPDATED=$(date -u +"%Y-%m-%d %H:%M:%S UTC")

# Create total download CSV with header if it doesn't exist
if [ ! -f .metrics/total_download_metrics.csv ]; then
echo "date,release_tag,total_downloads,last_updated" > .metrics/total_download_metrics.csv
fi

echo "📊 Processing total download metrics..."
jq -r '.[] | "\(.published_at[0:10]),\(.tag_name),\([.assets[].download_count] | add)"' .metrics/releases.json | while IFS=',' read -r release_date tag_name total_downloads; do
echo "Processing $release_date: $tag_name - $total_downloads downloads"

# Check if this release already exists in the CSV
if grep -q ",$tag_name," .metrics/total_download_metrics.csv; then
echo "📝 Updating existing entry for $tag_name..."
# Update existing entry
awk -v tag="$tag_name" -v downloads="$total_downloads" -v last_updated="$LAST_UPDATED" '
BEGIN { FS=","; OFS="," }
$2 == tag {
print $1, $2, downloads, last_updated;
updated=1;
next
}
{ print }
' .metrics/total_download_metrics.csv > .metrics/total_download_metrics_temp.csv
mv .metrics/total_download_metrics_temp.csv .metrics/total_download_metrics.csv
else
echo "➕ Adding new download entry for $tag_name..."
echo "$release_date,$tag_name,$total_downloads,$LAST_UPDATED" >> .metrics/total_download_metrics.csv
fi
done

echo "Total download metrics:"
tail -n 5 .metrics/total_download_metrics.csv

- name: Commit and push results
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
git config user.name "DownloadMetricsBot[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

# Add CSV file
git add .metrics/total_download_metrics.csv

# Check if there are changes to commit
if git diff --staged --quiet; then
echo "ℹ️ No changes to commit - CSV data is up to date"
else
echo "📝 Committing changes..."
git commit -m "Automated update: repository download metrics $(date)"

echo "🚀 Pushing to metrics branch..."
git push --force-with-lease origin metrics
fi
9 changes: 5 additions & 4 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
name: Publish (PyPI + MCP Registry)

on:
push:
tags:
- "v*"
workflow_dispatch:

concurrency:
group: publish-${{ github.ref }}
Expand Down Expand Up @@ -78,7 +76,10 @@ jobs:
set -e
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_${OS}_${ARCH}.tar.gz" \
echo "Get the latest release version"
LATEST_VERSION=$(curl -s https://api.github.com/repos/modelcontextprotocol/registry/releases/latest | jq -r '.tag_name')
echo "Installing MCP Publisher version: $LATEST_VERSION"
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/${LATEST_VERSION}/mcp-publisher_${LATEST_VERSION#v}_${OS}_${ARCH}.tar.gz" \
| tar xz mcp-publisher

- name: Login to MCP Registry (OIDC)
Expand Down
47 changes: 47 additions & 0 deletions .github/workflows/publish_mcp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Publish MCP Registry

on:
workflow_dispatch:
workflow_run:
workflows: ["Publish PyPI"]
types: [completed]

concurrency:
group: publish-${{ github.ref }}
cancel-in-progress: true

jobs:
on-success:
name: Publish to MCP Registry
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
permissions:
contents: read
id-token: write
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install MCP Publisher
run: |
set -e
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
LATEST_VERSION=$(curl -s https://api.github.com/repos/modelcontextprotocol/registry/releases/latest | jq -r '.tag_name')
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/${LATEST_VERSION}/mcp-publisher_${LATEST_VERSION#v}_${OS}_${ARCH}.tar.gz" | tar xz mcp-publisher

- name: Login to MCP Registry
run: ./mcp-publisher login github-oidc

- name: Publish to MCP Registry
run: |
echo "PyPI workflow succeeded - Publishing to MCP Registry"
./mcp-publisher publish

on-failure:
name: Handle PyPI Failure
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
steps:
- name: Log PyPI Failure
run: echo "PyPI workflow failed - MCP Registry publication skipped"
Loading