Recent insights into PyPI package adoption and usage patterns
This repository contains automated BigQuery analytics and reports for PyPI packages.
Report Date: 2026-06-15
Quarterly download trends by major version over the last 3 years. Shows version adoption patterns and migration trends across releases.
| Metric | 30 Days | 90 Days |
|---|---|---|
| Total Downloads | 96,839 | 238,594 |
| Countries Reached | 52 | 67 |
| CI/CD Installs | 66.8% | 67.8% |
| UV Adoption | 15.3% | 18.0% |
| Confirmed MCP Usage | 185 | 420 |
Key Insights:
United States dominance (92.0% in 30d, 91.8% in 90d) consistent across periods
- 52 countries (30d), 67 countries (90d) demonstrates global reach
MCP (Model Context Protocol) is Anthropic's protocol for connecting AI assistants like Claude to external tools and data sources. When developers use Claude Desktop with MCP servers, they often install Python packages via uvx (uv's tool runner).
Since MCP servers don't explicitly identify themselves in PyPI logs, we use proxy signals with significant limitations:
- HIGH Confidence:
uvxsubcommand usage (MCP's recommended pattern, but also used for other tools) - Contextual: UV vs pip adoption trends (UV is MCP's recommended installer)
- Observational: CI vs non-CI patterns (shows usage context, not MCP specifically)
Important Limitations:
- Install vs Usage: PyPI data shows package downloads, not actual execution - packages may be installed but never run
- uvx Ambiguity: The
uvxcommand is used for many tools beyond MCP servers (any Python CLI tool can be run via uvx) - Non-CI Context: Non-CI downloads don't isolate MCP usage - most PyPI downloads are non-CI regardless of use case
- CI Detection Issues: The
details.cifield in BigQuery is heuristically derived from user-agent strings (checking for patterns like "github", "travis", "jenkins") and is unreliable - many CI systems don't identify themselves, and some non-CI tools may match the patterns - User-Agent Limitations: Cannot distinguish MCP from other UV usage without access to raw user-agent strings, which are not available in the public BigQuery dataset
- Proxy Signals Only: All MCP detection relies on indirect signals (installer choice, subcommand usage) rather than explicit MCP identification
Shows which installer tool was used to download the package (pip, uv, or poetry). UV is a proxy for MCP since MCP clients use UV.
|
30 Days UV: 15.3% of downloads (14,863) |
90 Days UV: 18.0% of downloads (42,922) |
Breaks down all UV downloads by which UV subcommand was used. The uvx command is the standard pattern MCP clients use to run MCP servers (e.g., Claude Desktop, Cline, etc.).
|
30 Days 185 uvx downloads = HIGH confidence MCP |
90 Days 420 uvx downloads = HIGH confidence MCP |
UV Subcommand Meanings:
sync- Synchronize project dependencies → CI/CD pipelines, developers syncing environmentspip install- UV's pip-compatible install command → CI/CD, automated builds, legacy workflows- no subcommand - UV downloads without subcommand data → Older UV versions or incomplete logging
run- Run a script in a virtual environment → Developers, test runners, automation scriptstool install- Install a tool globally → Developers setting up their environmentuvx- Run a tool without installing it → MCP clients (Claude Desktop, Cline), developers trying toolslock- Generate a lockfile for dependencies → Developers, CI/CD for reproducible buildspip compile- Compile requirements files → CI/CD, dependency management workflowsadd- Add a dependency to the project → Developers adding new packagestool run- Run an installed tool → Developers, automation scriptstool upgrade- Upgrade an installed tool → Developers maintaining tools
Separates automated CI/CD installs from other downloads for pip, uv, poetry, and other installers.
|
30 Days UV: 32.9% non-CI (4,894 downloads) |
90 Days UV: 41.5% non-CI (17,800 downloads) |
Time series showing daily UV download trends. Highlights confirmed uvx subcommand usage (MCP pattern) alongside total UV downloads to visualize MCP adoption patterns over time.
|
30 Days 185 uvx downloads over 30 days |
90 Days 420 uvx downloads over 90 days |
Key Findings:
|
30-Day Analysis:
MCP usage is detectable but small. The broader story is UV's growth as a modern Python installer. |
90-Day Analysis:
MCP usage is detectable but small. The broader story is UV's growth as a modern Python installer. |
Categorizes downloads by platform based on OS and distribution detection. Identifies AWS (Amazon Linux), Containers (Alpine), Enterprise (RHEL), Ubuntu, Debian, macOS, Windows, and other platforms. Shows the overall platform mix of package users.
|
30 Days |
90 Days |
Shows the distribution of downloads across different deployment environments, automatically categorized based on OS, distribution, libc type, and CI detection. Categories may include containers, cloud VMs, CI/CD pipelines, and developer workstations.
|
30 Days |
90 Days |
Shows CPU architecture breakdown (x86_64, ARM64, etc.) detected from download metadata. Tracks adoption of ARM-based systems like AWS Graviton and Apple Silicon.
|
30 Days |
90 Days |
Compares traditional enterprise Linux distributions (RHEL, CentOS) against cloud-native platforms (Amazon Linux, Alpine). Indicates adoption patterns in regulated vs cloud-first environments.
|
30 Days |
90 Days |
Shows the distribution of C library implementations (glibc vs musl). musl libc is a strong indicator of containerized deployments, particularly Alpine Linux in Docker/Kubernetes.
|
30 Days |
90 Days |
Categorizes downloads by deployment scenario based on OS type, Linux distribution, and CI detection. Shows patterns like containerized pipelines (Alpine+CI), cloud automation (Amazon Linux+CI), enterprise Linux (RHEL), CI environments, developer workstations (macOS/Windows), and other contexts.
|
30 Days |
90 Days |
Key deployment metrics at a glance: container adoption, cloud provider usage, enterprise deployment, CI/CD percentage, ARM architecture adoption, and musl libc usage.
|
30 Days |
90 Days |
This repository is automatically updated weekly by GitHub Actions:
- Schedule: Weekly on Mondays at 6 AM UTC (2 AM ET)
- Authentication: Service account JSON key stored in GitHub secrets
- Manual trigger: Available via GitHub Actions UI
- Setup guide: See SETUP.md
Data Source: Google BigQuery public dataset bigquery-public-data.pypi.file_downloads
Analysis Period:
- 30-day reports: Last 30 days from data fetch date
- 90-day reports: Last 90 days from data fetch date
Update Frequency:
- Automated: Daily via GitHub Actions
- Caching: Data fetched once per day, cached locally to minimize BigQuery costs
- Cache Management: Old cache files automatically removed after successful new fetch
- Manual trigger: Available for on-demand updates
Privacy: All data comes from PyPI's public dataset. No personal information is collected or stored.
Analytics powered by Google BigQuery and GitHub Actions
























