with one click
usage-report
// Generate a usage report for MCP Gateway Registry by SSHing into the telemetry bastion host, exporting telemetry data from DocumentDB, and producing a formatted markdown report with deployment insights.
// Generate a usage report for MCP Gateway Registry by SSHing into the telemetry bastion host, exporting telemetry data from DocumentDB, and producing a formatted markdown report with deployment insights.
| name | usage-report |
| description | Generate a usage report for MCP Gateway Registry by SSHing into the telemetry bastion host, exporting telemetry data from DocumentDB, and producing a formatted markdown report with deployment insights. |
| license | Apache-2.0 |
| metadata | {"author":"mcp-gateway-registry","version":"1.3"} |
Export telemetry data from the MCP Gateway Registry's DocumentDB telemetry collector and generate a usage report showing deployment patterns, version adoption, and feature usage in the wild.
All charts in this skill follow Edward Tufte's principles documented in tufte-viz-guidelines.md: high data-ink ratio, no chartjunk, layered information, honest scales. The shared style module tufte_style.py provides apply_tufte_style() (rcParams) and tufte_axes(ax) (per-axes cleanup). When adding new chart generators, import from tufte_style and call apply_tufte_style() once before plotting and tufte_axes(ax) for each axes after plotting. Reference the Tufte checklist in tufte-viz-guidelines.md before merging any new chart.
~/.ssh/id_ed25519 with access to the bastion hostterraform/telemetry-collector/ (to read bastion IP)bastion_enabled = true in terraform/telemetry-collector/terraform.tfvars)gh) authenticated with read access to the upstream repo (agentic-community/mcp-gateway-registry) for collecting stars, forks, and contributor countsThe skill accepts optional parameters:
/usage-report [OUTPUT_DIR]
.scratchpad/usage-reports/)If OUTPUT_DIR is not provided, save to .scratchpad/usage-reports/.
All artifacts for a given run are placed in a dated subfolder: OUTPUT_DIR/YYYY-MM-DD/. This keeps each report self-contained and avoids a flat directory of hundreds of files. Previous metrics and CSV files are discovered by scanning both the base directory and all dated subdirectories.
cd terraform/telemetry-collector && terraform output -raw bastion_public_ip
If the output is "Bastion not enabled", tell the user to set bastion_enabled = true in terraform/telemetry-collector/terraform.tfvars and run terraform apply.
scp -o StrictHostKeyChecking=no -i ~/.ssh/id_ed25519 \
terraform/telemetry-collector/bastion-scripts/telemetry_db.py \
ec2-user@$BASTION_IP:~/telemetry_db.py
ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_ed25519 \
ec2-user@$BASTION_IP \
'python3 telemetry_db.py export --output /tmp/registry_metrics.csv 2>&1'
Capture the full output -- it contains the summary statistics printed by telemetry_db.py.
Create a dated subfolder for this run's artifacts, then download the CSV into it:
DATE_DIR=OUTPUT_DIR/YYYY-MM-DD
mkdir -p $DATE_DIR
scp -o StrictHostKeyChecking=no -i ~/.ssh/id_ed25519 \
ec2-user@$BASTION_IP:/tmp/registry_metrics.csv \
$DATE_DIR/registry_metrics.csv
First, ensure matplotlib and seaborn are available on the system Python:
/usr/bin/python3 -c "import matplotlib, seaborn" 2>/dev/null || pip install --break-system-packages matplotlib seaborn
Then generate the instance-based deployment distribution chart (counts unique registry instances, not events). Run it twice -- once for the cumulative install base, once filtered to the previous complete day -- so the report can show "everyone who ever installed" alongside "who is running it right now":
# Cumulative -- all customers ever
/usr/bin/python3 .claude/skills/usage-report/generate_instance_distribution_chart.py \
--csv $DATE_DIR/registry_metrics.csv \
--output $DATE_DIR/instance-distribution-YYYY-MM-DD.png
# Active-yesterday -- only customers that reported on the last complete day.
# Pass YYYY-MM-DD - 1 (the previous day relative to report date) so today's
# partial-day undercount doesn't bias the picture.
/usr/bin/python3 .claude/skills/usage-report/generate_instance_distribution_chart.py \
--csv $DATE_DIR/registry_metrics.csv \
--output $DATE_DIR/instance-distribution-active-PREVIOUS-YYYY-MM-DD.png \
--active-on-date PREVIOUS-YYYY-MM-DD
Each invocation produces a faceted PNG with 6 subplots: Cloud Provider, Compute Platform, Storage Backend, Auth Provider, Architecture, and Deployment Mode. Each subplot shows unique instance counts and percentages. The --active-on-date form filters the row set to instances that had at least one event on the given date (heartbeat or startup), then runs the same six-panel breakdown on that subset; the chart title is annotated to make the filter explicit.
In the report, embed both PNGs in the "Deployment Distribution (by Unique Instances)" section and add a short narrative pointing out where the two views diverge -- typically the active-yesterday view shifts toward Kubernetes (vs Docker), enterprise IdP (vs the long-tail), and AWS dominance.
Generate a timeseries chart showing unique registry installs per cloud provider over time. This reads ALL CSV files in the base output directory and dated subdirectories to build a complete historical view:
/usr/bin/python3 .claude/skills/usage-report/generate_timeseries_chart.py \
--csv-dir OUTPUT_DIR \
--output $DATE_DIR/registry-installs-timeseries-YYYY-MM-DD.png \
--exclude-incomplete-day YYYY-MM-DD
This produces a PNG with three subplots:
--exclude-incomplete-daydrops events on the given date (today's date, the in-progress day) before charting so the trailing data point doesn't show a misleading dip. Always pass today'sYYYY-MM-DD. Snapshot tables and headline tallies still see the full data; only the chart series are trimmed.
Generate a second timeseries chart, parallel to the cloud-provider one, showing unique registry installs per compute platform (docker, kubernetes, ecs, ec2, etc.) over time. Same data-sourcing behavior (scans all CSV files across dated subdirectories). Pass --snapshots-table to also emit a markdown per-snapshot table ready to embed in the report:
/usr/bin/python3 .claude/skills/usage-report/generate_compute_timeseries_chart.py \
--csv-dir OUTPUT_DIR \
--output $DATE_DIR/compute-installs-timeseries-YYYY-MM-DD.png \
--snapshots-table $DATE_DIR/compute-platform-snapshots-YYYY-MM-DD.md \
--exclude-incomplete-day YYYY-MM-DD
This produces:
docker | kubernetes | ecs | ec2 | unknown when present, plus any other platforms alphabetically. Unique-instance counts per snapshot are computed directly from each dated CSV using the compute column (not compute_platform -- that's the schema key but not the CSV column name).Embed the chart in the report's "Compute Platform Growth" section and drop the contents of the snapshots-table markdown file in under the "Per-Platform Growth (Unique Installs)" subheading. Add a short narrative on which platforms are growing fastest in absolute and percentage terms; the newest (bolded) row is the current total for the report.
Generate a density plot showing the distribution of instance lifetimes (age in days). This reads the metrics JSON produced by the analysis step, so it must run after Step 6. However, the SKILL.md lists it here for logical grouping with other charts:
/usr/bin/python3 .claude/skills/usage-report/generate_lifetime_chart.py \
--metrics $DATE_DIR/metrics-YYYY-MM-DD.json \
--output $DATE_DIR/instance-lifetime-YYYY-MM-DD.png
This produces a PNG with three panels:
Note: Run this after Step 6 (telemetry analysis) since it reads the metrics JSON.
Plot per-snapshot lifetime retention percentages (one-day wonders vs >=3 / >=7 / >=14 / >=30 day cohorts) over time. Reads every metrics-*.json file under the base output directory and recomputes the buckets retroactively, so it works on snapshots that predate the lifetime_bucket_pct field. Produces a PNG plus a per-snapshot CSV sidecar that future reports can diff against.
/usr/bin/python3 .claude/skills/usage-report/generate_lifetime_buckets_chart.py \
--csv-dir OUTPUT_DIR \
--output $DATE_DIR/lifetime-buckets-YYYY-MM-DD.png \
--csv-out $DATE_DIR/lifetime-buckets-YYYY-MM-DD.csv
Embed the chart in the report directly below the Registry Instance Lifetime section, alongside a narrative that quotes the latest CSV row (the report-date snapshot) and contrasts it with the earliest snapshot to show whether the customer-retention curve is improving over time.
Note: Run this after Step 6 since it depends on instance_lifetime + internal_instance_ids keys in metrics-*.json.
Generate a chart of customer engagement over time, with three overlaid series:
registry_ids that sent at least one event (startup OR heartbeat) on that day.registry_ids that sent at least one event on EACH of the 7 days in the window [D-6..D].Customer-only: internal instances loaded from known-internal-instances.md are excluded so the numbers align with the Liveness section (which is also customer-only). A CSV sidecar of the per-day values is written alongside the PNG so the report narrative can quote exact numbers and future reports can diff against it.
The CSV also includes two DAI percentage columns derived from the same per-day registry-id sets:
cumulative_installs, dai_pct_of_total -- DAI / cumulative_installs through that day; the engagement rate of the full install funnel ever recordedlikely_alive_7d, dai_pct_of_likely_alive -- DAI / unique-active-in-trailing-7d; the engagement rate of the currently-active fleet (analog of a DAU/WAU ratio)Both percentages should be quoted side-by-side in the report's "DAI as a percentage of total installs" subsection so the reader sees the funnel-engagement number (low, because of one-day wonders) and the active-fleet engagement number (the healthier B2B-style read) together.
/usr/bin/python3 .claude/skills/usage-report/generate_active_instances_chart.py \
--csv-dir OUTPUT_DIR \
--output $DATE_DIR/active-instances-YYYY-MM-DD.png \
--internal-instances .claude/skills/usage-report/known-internal-instances.md \
--csv-out $DATE_DIR/active-instances-YYYY-MM-DD.csv \
--exclude-incomplete-day YYYY-MM-DD
Same data-sourcing behavior as the other historical charts (scans all CSVs across dated subdirectories). Embed in the Liveness section under an "Engagement over Time" subheading.
Compute daily and cumulative AWS customer infra spend (EC2 compute + Bedrock Titan embeddings). The script emits two cost numbers framed as a range so the report can be conservative about not over-estimating spend:
Customer-only (internal UUIDs excluded), AWS-only (GCP/Azure/unknown excluded because we can't attribute their AWS-side usage). On the current fleet ~59% of AWS customer instances are "one-day wonders" — they show up once and never return — so the proven-persistence number is typically ~30% lower than all-days.
Cost model (per-compute-platform, grounded in deployment artefacts):
| Platform | Daily rate | Grounding |
|---|---|---|
docker | $3.99 | 1 × t3.xlarge on-demand ($0.1664/hr), customer VM |
ecs | $19.03 | From terraform/aws-ecs/terraform.tfstate: 10 Fargate tasks ($7.67) + DocumentDB db.t3.medium ($1.87) + RDS Aurora Serverless v2 avg 1 ACU ($2.88) + 2 ALBs ($1.35) + 3 NAT Gateways ($3.24) + 2 CloudFront ($0.50) + S3 logs ($0.05) + CloudWatch ($1.00) + EFS/SM/DT ($0.50) |
kubernetes | $11.17 | From charts/ Helm defaults + aws-load-balancer-controller: EKS control plane ($2.40) + 2 × t3.large nodes ($3.99) + 4 ALB ingresses ($2.70) + 1 NAT Gateway ($1.08) + EBS ($0.50) + CloudWatch Container Insights ($0.30) + data transfer ($0.20) |
ec2 / unknown / other | $3.99 | Docker-compose fallback (single VM) |
Platform for a given instance is resolved via its most-recent non-empty compute field. If an instance migrates across platforms mid-window, it's billed at the latest platform's rate for the whole window.
Bedrock Titan embeddings: only for instances whose latest embeddings_backend_kind == "bedrock". Cost = delta(search_queries_total) on that day × 100 tokens/query × $0.00002 / 1K tokens. The delta is computed from the instance's own search_queries_total timeseries (monotonic counter), so we never double-count queries that were already charged on a previous day.
/usr/bin/python3 .claude/skills/usage-report/generate_ltv_spend.py \
--csv-dir OUTPUT_DIR \
--output $DATE_DIR/ltv-spend-YYYY-MM-DD.png \
--internal-instances .claude/skills/usage-report/known-internal-instances.md \
--csv-out $DATE_DIR/ltv-spend-YYYY-MM-DD.csv \
--summary-json $DATE_DIR/ltv-spend-YYYY-MM-DD.json \
--exclude-incomplete-day YYYY-MM-DD
When
--exclude-incomplete-dayis passed, the JSON summary'syesterdayblock refers to the last complete day (typically YYYY-MM-DD - 1), not today. Headline tables in the report should label this clearly (e.g. "Yesterday (2026-05-16, last complete day)").
Outputs:
date, aws_instances, aws_instances_persistent, <platform>_instances[_persistent], bedrock_queries[_persistent], compute_usd[_persistent], bedrock_usd[_persistent], total_usd[_persistent], cum_total_usd[_persistent].yesterday.all_days vs yesterday.proven, last_7_days.{all_days_total_usd, proven_total_usd}, ltv.{all_days, proven}, and per-platform LTV breakdown for both models.Embed the chart in the report's Customer Infra Spend (AWS) section. Include a single summary table that shows both numbers as a range (e.g. "yesterday: $292.67 – $346.01"), one short paragraph explaining the two counting rules, and the per-platform LTV breakdown (both models side by side). Flag clearly that the cost model is hypothetical (we don't actually bill these customers; these are "what it would cost them at list price").
Project when the registry will reach 1,000 installs using two models: a 14-day OLS linear regression and a 7-day recent-pace extrapolation. Produces a PNG chart (cumulative installs with forecast line and confidence bands) and a JSON summary with ETAs.
/usr/bin/python3 .claude/skills/usage-report/generate_install_forecast.py \
--csv-dir OUTPUT_DIR \
--output $DATE_DIR/install-forecast-YYYY-MM-DD.png \
--summary-json $DATE_DIR/install-forecast-YYYY-MM-DD.json
Outputs:
today.installs, linear.eta (with 95% CI bounds), recent_pace.eta, and model parametersEmbed the chart in the report's Install Forecast section. Include a table showing both model ETAs and daily rates. This section should come after Version Adoption and before Customer Infra Spend.
Visualize the conversion funnel from total installs through retention stages to confirmed-alive. Reads the metrics JSON (for lifetime buckets) and optionally the liveness JSON (for confirmed-alive count).
/usr/bin/python3 .claude/skills/usage-report/generate_adoption_funnel_chart.py \
--metrics $DATE_DIR/metrics-YYYY-MM-DD.json \
--liveness $DATE_DIR/liveness-YYYY-MM-DD.json \
--output $DATE_DIR/adoption-funnel-YYYY-MM-DD.png
Note: Run after Step 6 and Step 6c since it reads both metrics-*.json and liveness-*.json.
Embed the chart in the report's Adoption Funnel section (placed after Most Engaged Operators, before Recommendations). Include a table showing each funnel stage, count, and percentage of the previous stage.
Plot how the cloud_detection_method outcome distributes per registry version. Each row is a version (top 12 by instance count plus a rolled-up "other"); each row is a stacked horizontal bar split by detection-method outcome (env, dmi, ecs_meta, k8s_heuristic, imds, unknown, "(field absent)" for pre-1.23.0).
This chart lets the report validate that fixes to cloud detection (issue #1093, PR #1106 in 1.24.2) actually moved the needle: the "unknown" red slice should shrink on the row for the version where the fix shipped, relative to older versions on the same chart.
/usr/bin/python3 .claude/skills/usage-report/generate_detection_by_version_chart.py \
--csv $DATE_DIR/registry_metrics.csv \
--output $DATE_DIR/detection-by-version-YYYY-MM-DD.png \
--csv-out $DATE_DIR/detection-by-version-YYYY-MM-DD.csv \
--snapshot-date YYYY-MM-DD
Outputs:
Embed the chart in a section titled "Cloud Detection Outcomes by Version" placed after Adoption Funnel and before Recommendations. Add a short narrative quoting the row for the latest release (1.24.2 and later) and contrasting it with 1.23.0 and 1.24.1 to show whether the fix is working in the wild on instances that adopted it.
Collect community-growth signals for the upstream repo (agentic-community/mcp-gateway-registry) using the authenticated gh CLI. These numbers complement telemetry by showing project interest outside of deployed instances.
# Star, fork, watcher, open-issue counts (single API call)
gh api repos/agentic-community/mcp-gateway-registry \
--jq '{stars: .stargazers_count, forks: .forks_count, watchers: .subscribers_count, open_issues: .open_issues_count}' \
> $DATE_DIR/github_stats.json
# Unique contributors (paginate through all pages, count unique logins)
gh api --paginate repos/agentic-community/mcp-gateway-registry/contributors \
--jq '.[].login' | sort -u | wc -l > $DATE_DIR/github_contributors_count.txt
Record these numbers in the report and compare them against the previous report's github_stats.json (if present in the previous dated subfolder). Compute deltas for stars, forks, and contributors the same way telemetry metrics are compared.
Note: If gh is not authenticated or the API call fails, skip the GitHub section in the report and log a short note instead of failing the entire run.
Run the analysis script to compute all distributions, instance timelines, and metrics. This produces two files:
tables-YYYY-MM-DD.md -- pre-formatted markdown tables ready to embed in the report (with executive summary comparison at the top)metrics-YYYY-MM-DD.json -- raw computed metrics as JSON (includes per_cloud_unique_installs)The script automatically finds the most recent previous metrics-*.json file. Since output files are written to the dated subfolder ($DATE_DIR) but previous metrics live in sibling dated subfolders, you must pass --search-dir OUTPUT_DIR so the script searches the parent directory containing all dated subfolders:
INTERNAL_INSTANCES_FILE=".claude/skills/usage-report/known-internal-instances.md"
INTERNAL_FLAG=""
if [ -f "$INTERNAL_INSTANCES_FILE" ]; then
INTERNAL_FLAG="--internal-instances $INTERNAL_INSTANCES_FILE"
fi
/usr/bin/python3 .claude/skills/usage-report/analyze_telemetry.py \
--csv $DATE_DIR/registry_metrics.csv \
--output-dir $DATE_DIR \
--search-dir OUTPUT_DIR \
--date YYYY-MM-DD \
$INTERNAL_FLAG
--output-dir $DATE_DIR -- where to write tables-*.md and metrics-*.json--search-dir OUTPUT_DIR -- where to search for previous metrics-*.json files (scans this directory and all subdirectories). If omitted, defaults to the parent of --output-dir.--internal-instances -- path to known-internal-instances.md listing known internal registry instance IDs. When provided, internal instances are labeled "(internal)" in the Instance Lifetime and Identified Instances tables, a Most Active Instances table is generated with an Internal column, and stickiness metrics (3+ day non-internal count, longest-running non-internal instance) are computed and included in the JSON output.Or with an explicit previous metrics file (skips auto-detection):
/usr/bin/python3 .claude/skills/usage-report/analyze_telemetry.py \
--csv $DATE_DIR/registry_metrics.csv \
--output-dir $DATE_DIR \
--date YYYY-MM-DD \
--previous-metrics OUTPUT_DIR/PREVIOUS-DATE/metrics-PREVIOUS-DATE.json \
$INTERNAL_FLAG
The --internal-instances flag passed in Step 6 handles internal instance identification automatically. The analysis script reads .claude/skills/usage-report/known-internal-instances.md (if it exists, since it is gitignored and may not be present on all machines) and:
stickiness keyinternal_instance_idsIf the file does not exist, the script treats all instances as external (no internal labeling, stickiness counts all instances).
When writing the report:
The known internal instances are typically the longest-running, highest-activity instances since they are always-on development environments.
Classify customer (non-internal) instances into liveness tiers based on recent heartbeat activity. Registry heartbeats are emitted once per 24 hours by default (MCP_TELEMETRY_HEARTBEAT_INTERVAL_MINUTES=1440, see registry/core/telemetry.py and registry/core/config.py), which makes heartbeat counts a direct proxy for "is this deployment still running".
The script produces two files:
liveness-YYYY-MM-DD.md -- a pre-formatted markdown section (tier summary table, confirmed-alive instance list, cloud/compute/auth breakdowns) ready to embed in the reportliveness-YYYY-MM-DD.json -- raw counts and instance ID lists, used for delta tracking in future reports/usr/bin/python3 .claude/skills/usage-report/analyze_liveness.py \
--csv $DATE_DIR/registry_metrics.csv \
--metrics-json $DATE_DIR/metrics-YYYY-MM-DD.json \
--output-dir $DATE_DIR \
--search-dir OUTPUT_DIR \
--date YYYY-MM-DD \
$INTERNAL_FLAG
Tiers defined:
If a previous liveness-*.json file is found in --search-dir, the "vs Previous" column in the tier summary table is populated with deltas. On first run, it shows "baseline".
Note: Run this after Step 6 since it reads metrics-YYYY-MM-DD.json for per-instance cloud/compute/auth metadata.
Read the generated tables-YYYY-MM-DD.md and include its tables directly in the report. Add narrative sections (Executive Summary, Architecture Patterns, Recommendations) around the data tables. The tables file contains:
metrics-*.json under upgrade_trajectories)max_servers + max_agents + max_skills, with Version and per-object columns; surfaces comprehensive-catalog deployments that may rank low on the search-driven activity score)version_changes with age_days tiebreaker; shows the operators tracking the project closely enough to upgrade across multiple releases)Also read the generated liveness-YYYY-MM-DD.md (from Step 6c) and include its tier summary, confirmed-alive instance list, and cloud/compute/auth breakdowns as a dedicated Liveness section in the report (placed after "Registry Instance Lifetime" and before "Version Adoption"). The Executive Summary should mention the Confirmed-Alive and Stronger-Alive counts as the revenue-countable leading and trailing indicators.
The main body focuses on insights and charts. Detailed event-count distribution tables are moved to an appendix. IMPORTANT: Every section below is MANDATORY. Do not skip any section. Each ![...] image reference is a REQUIRED chart that must be embedded.
# AI Registry -- Usage Report
*Report Date: YYYY-MM-DD*
*Data Source: Telemetry Collector (DocumentDB)*
*Collection Period: [earliest ts] to [latest ts]*
---
## Executive Summary
Lead with new installs since last report, total unique installs, dominant cloud/compute/IdP, growth trends. Also include the current GitHub star count (with delta vs previous report) as a top-line community signal.
Include an **instance stickiness** line: "N instances have been running for 3+ days (up/down from M in the previous report). The longest-running non-internal instance is `REGISTRY_ID` at D days (previously P days)."
Include a **one-day-wonder** line from `stickiness.one_day_wonder_pct`. Compare against the previous report to show the trend.
Stickiness values from `metrics-YYYY-MM-DD.json`:
- `stickiness.sticky_3plus_days`, `stickiness.one_day_wonders`, `stickiness.one_day_wonder_pct`
- `stickiness.lifetime_bucket_counts` / `lifetime_bucket_pct`: cumulative thresholds at 3, 7, 14, 30 days
- `stickiness.longest_non_internal_id`, `stickiness.longest_non_internal_days`

### Comparison with Previous Report
- Deltas for total events, unique instances, heartbeat events, null registry_id count
- Per-cloud-provider unique registry installs comparison table
- GitHub stars delta (and forks/contributors if notable)
- Customer instances running 3+ days: current vs previous count
- Longest-running non-internal instance: current age vs previous age
- Confirmed-Alive and Stronger-Alive counts (from `liveness-*.json`): current vs previous
## Deployment Distribution (by Unique Instances)


Narrative pointing out where the two views diverge (active-yesterday shifts toward Kubernetes, enterprise IdP, AWS dominance).
## Key Metrics
| Metric | Value |
|--------|-------|
| Total Events | N |
| Unique Registry Instances | N |
| Known Internal Instances | N (+ possibly more) |
| Potential Customer Instances | N - internal |
| ... | ... |
## Internal Instances (Development/Testing)
List known internal instances. Note disproportionate activity. Clearly state this is not customer usage.
## Registry Instance Lifetime
Commentary on average/max lifetime, multi-day vs single-day.

### Customer Lifetime Retention Over Time

## Liveness (Currently Active Instances)
Include `liveness-YYYY-MM-DD.md` verbatim (tier summary, confirmed-alive list, breakdowns).
### Engagement Over Time

DAI, MA7, 7-day streak, DAI/total %, DAI/likely-alive % from `active-instances-YYYY-MM-DD.csv`.
## Compute Platform Growth

### Per-Platform Growth (Unique Installs)
Include the table from `compute-platform-snapshots-YYYY-MM-DD.md` (latest 10 rows, newest first).
## Version Adoption
Table from `tables-YYYY-MM-DD.md`. Columns: Version, Events, % Events, Instances, % Instances. Top 10-15 versions.
## Version Upgrade Trajectories
Table from `tables-YYYY-MM-DD.md`. Narrative on longest chains and upgrade fraction.
## Feature Adoption
Federation, gateway mode, heartbeat rates, embeddings backend breakdown from `tables-YYYY-MM-DD.md`.
## Search Usage
From `tables-YYYY-MM-DD.md`: instances with search, total queries, average, max.
## Sticky Instance Breakdown (3+ Days)
Table from `tables-YYYY-MM-DD.md`. Grouped by cloud/compute profile with change vs previous.
## Most Active Instances (by Feature Usage)
Top 10 table from `tables-YYYY-MM-DD.md`. Narrative on usage patterns.
## Largest Catalogs (by Registered Servers + Agents + Skills)
Top 10 table from `tables-YYYY-MM-DD.md`.
## Most Engaged Operators (by Upgrade-Chain Length)
Top 10 table from `tables-YYYY-MM-DD.md`.
## Install Forecast

Table with both model ETAs (linear and recent-pace) and daily rates from `install-forecast-YYYY-MM-DD.json`.
## Customer Infra Spend (AWS)

Summary table from `ltv-spend-YYYY-MM-DD.json`. Show yesterday, last-7-days, and cumulative LTV as ranges. Per-platform LTV breakdown.
## Adoption Funnel

Table showing each funnel stage (total installs, multi-day, sticky 3+, weekly 7+, biweekly 14+, monthly 30+, confirmed alive) with count and % of previous stage.
## Cloud Detection Outcomes by Version

Stacked-bar view of `cloud_detection_method` outcomes split by registry version. Quote the row for the latest release and contrast it with `1.23.0` and `1.24.1` to validate whether issue #1093 / PR #1106 is actually moving the unknown-cloud rate down on instances that adopted the fix.
## GitHub Repository
Table with stars, forks, contributors, open issues. Deltas vs previous report.
## Architecture Patterns Observed
3-5 distinct deployment patterns from the data.
## Recommendations
5-7 actionable insights based on the data.
## Appendix: Raw Distribution Tables
Event-count-based distribution tables for cloud, compute, architecture, storage, and auth from `tables-YYYY-MM-DD.md`.
The report MUST embed all 11 charts. If any chart file is missing, generate it before writing the report.
registry-installs-timeseries-YYYY-MM-DD.png (cloud provider: cumulative + daily-active + daily-new)instance-distribution-YYYY-MM-DD.png (6-panel faceted, all customers)instance-distribution-active-PREVIOUS-YYYY-MM-DD.png (6-panel faceted, active yesterday)instance-lifetime-YYYY-MM-DD.png (age histogram + boxplot + buckets)lifetime-buckets-YYYY-MM-DD.png (retention % over time)active-instances-YYYY-MM-DD.png (DAI + MA7 + streak)compute-installs-timeseries-YYYY-MM-DD.png (compute platform cumulative + daily)install-forecast-YYYY-MM-DD.png (OLS + recent-pace to 1,000)ltv-spend-YYYY-MM-DD.png (daily compute + bedrock + cumulative)adoption-funnel-YYYY-MM-DD.png (funnel from total to confirmed-alive)detection-by-version-YYYY-MM-DD.png (cloud_detection_method outcomes per version)Save the report to $DATE_DIR/ai-registry-usage-report-YYYY-MM-DD.md.
Convert the markdown report to a single self-contained HTML file using pandoc. The chart PNG is base64-embedded so the HTML works standalone. Run from the DATE_DIR so relative image paths resolve:
cd $DATE_DIR && pandoc ai-registry-usage-report-YYYY-MM-DD.md \
-o ai-registry-usage-report-YYYY-MM-DD.html \
--embed-resources --standalone \
--css=.claude/skills/usage-report/report-style.css \
--metadata title="AI Registry - Usage Report YYYY-MM-DD"
The report-style.css file in the skill directory provides a clean, professional layout. Pandoc must be installed:
which pandoc >/dev/null || sudo apt-get install -y pandoc
After generating the report:
terraform/telemetry-collector/terraform.tfvars under bastion_allowed_cidrs.telemetry_enabled is true in registry settings and the collector endpoint is reachable.terraform init.User: /usage-report
Output:
Executive Summary: 31479 events from 562 unique registry instances over 55 days...
Compared to previous report (2026-05-20): +2299 events (+8%), +26 new instances (+5%)
Full report: .scratchpad/usage-reports/2026-05-22/ai-registry-usage-report-2026-05-22.md
HTML report: .scratchpad/usage-reports/2026-05-22/ai-registry-usage-report-2026-05-22.html
Charts (10):
- registry-installs-timeseries-2026-05-22.png
- compute-installs-timeseries-2026-05-22.png
- instance-distribution-2026-05-22.png
- instance-distribution-active-2026-05-21.png
- instance-lifetime-2026-05-22.png
- lifetime-buckets-2026-05-22.png
- active-instances-2026-05-22.png
- install-forecast-2026-05-22.png
- ltv-spend-2026-05-22.png
- adoption-funnel-2026-05-22.png
CSV data: .scratchpad/usage-reports/2026-05-22/registry_metrics.csv
User: /usage-report /tmp/reports
Output saved to /tmp/reports/2026-05-22/.
.scratchpad/usage-reports/
2026-05-22/
# Report files
ai-registry-usage-report-2026-05-22.md
ai-registry-usage-report-2026-05-22.html
# Charts (10 mandatory PNGs)
registry-installs-timeseries-2026-05-22.png
compute-installs-timeseries-2026-05-22.png
instance-distribution-2026-05-22.png
instance-distribution-active-2026-05-21.png
instance-lifetime-2026-05-22.png
lifetime-buckets-2026-05-22.png
active-instances-2026-05-22.png
install-forecast-2026-05-22.png
ltv-spend-2026-05-22.png
adoption-funnel-2026-05-22.png
# Analysis outputs
tables-2026-05-22.md
metrics-2026-05-22.json
liveness-2026-05-22.md
liveness-2026-05-22.json
compute-platform-snapshots-2026-05-22.md
# CSV sidecars
registry_metrics.csv
active-instances-2026-05-22.csv
ltv-spend-2026-05-22.csv
lifetime-buckets-2026-05-22.csv
# JSON summaries
ltv-spend-2026-05-22.json
install-forecast-2026-05-22.json
github_stats.json
github_contributors_count.txt
Install (deploy) MCP Gateway & Registry on AWS using the Terraform aws-ecs stack (ECS Fargate, Aurora, DocumentDB, Keycloak). Asks whether you are running from an EC2 instance or a local laptop, confirms the required AWS IAM permissions are in place, clones the repository, bootstraps the toolchain (uv, AWS CLI, Terraform), configures terraform.tfvars, runs the two-stage terraform apply, and completes post-deployment setup. Does NOT create IAM roles itself — it tells you the permissions you need and offers to guide you through setting them up.
Create release notes for a new version tag. Gathers all commits, PRs, issues fixed, and breaking changes since a previous release. Creates the release notes markdown file, tags the repo, and pushes. Asks the user to confirm the base version to diff against.
Generate a benchmark report from stress test results (registration, API performance, search concurrency). Reads JSON result files and produces a markdown report suitable for docs/benchmarks/.
Design and document new features with GitHub issue, low-level design (LLD), expert review, and testing plan. Creates structured documentation in .scratchpad/ with issue spec, technical design with diagrams and pseudo-code, multi-persona expert review, and a testing plan covering functional (curl and registry_management.py), backwards-compatibility, UX, ECS/terraform, and E2E API tests. Supports starting from a user description OR an existing GitHub issue URL. Folder naming: issue-{number}/ for existing issues, {feature-name}/ for new features.
Debug issues in the MCP Gateway Registry using first-principles thinking. Invoke when something is broken, timing out, returning errors, or behaving unexpectedly. Forces structured root-cause analysis before any code change is proposed.
Review a GitHub pull request using multiple expert personas. Takes a PR URL as input, analyzes the changes, and generates comprehensive review feedback from different perspectives (Merge Specialist, Frontend, Backend, Security, DevOps, AI/Agent, SRE, Chief Architect).