Skip to main content
Glama
track-skill-usage.sh4.05 kB
#!/usr/bin/env bash # Skill Usage Tracker # Records when skills are used and their outcomes for effectiveness analysis set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LOGS_DIR="${SCRIPT_DIR}/../logs" METRICS_FILE="${LOGS_DIR}/skill-metrics.json" mkdir -p "$LOGS_DIR" # Initialize metrics file if it doesn't exist if [[ ! -f "$METRICS_FILE" ]]; then echo '{"skills": {}}' > "$METRICS_FILE" fi usage() { cat <<EOF Usage: $0 <command> <skill-name> [options] Commands: use <skill> Record skill was used success <skill> Record successful outcome failure <skill> <reason> Record failure with reason stats <skill> Show skill statistics all-stats Show all skills statistics Examples: $0 use deploy-validator $0 success deploy-validator $0 failure deploy-validator "lint-check-failed" $0 stats deploy-validator $0 all-stats EOF exit 1 } [[ $# -lt 2 ]] && usage COMMAND="$1" SKILL="${2:-}" # Helper: Update metrics JSON update_metrics() { local skill="$1" local metric="$2" local value="${3:-1}" python3 - <<EOF import json from datetime import datetime, timezone with open("$METRICS_FILE", "r") as f: data = json.load(f) if "$skill" not in data["skills"]: data["skills"]["$skill"] = { "total_uses": 0, "successful_uses": 0, "failures": 0, "last_used": None, "last_updated": None, "failure_history": [] } skill_data = data["skills"]["$skill"] if "$metric" == "use": skill_data["total_uses"] += 1 skill_data["last_used"] = datetime.now(timezone.utc).isoformat() elif "$metric" == "success": skill_data["successful_uses"] += 1 elif "$metric" == "failure": skill_data["failures"] += 1 skill_data["failure_history"].append({ "timestamp": datetime.now(timezone.utc).isoformat(), "reason": "$value" }) # Calculate effectiveness if skill_data["total_uses"] > 0: skill_data["effectiveness_rate"] = round( skill_data["successful_uses"] / skill_data["total_uses"], 3 ) with open("$METRICS_FILE", "w") as f: json.dump(data, f, indent=2) EOF } case "$COMMAND" in use) update_metrics "$SKILL" "use" echo "✓ Recorded use of '$SKILL'" ;; success) update_metrics "$SKILL" "success" echo "✓ Recorded successful outcome for '$SKILL'" ;; failure) [[ $# -lt 3 ]] && { echo "Error: failure reason required"; exit 1; } REASON="$3" update_metrics "$SKILL" "failure" "$REASON" echo "✗ Recorded failure for '$SKILL': $REASON" ;; stats) python3 - <<EOF import json with open("$METRICS_FILE", "r") as f: data = json.load(f) if "$SKILL" not in data["skills"]: print(f"No data for skill: $SKILL") exit(1) s = data["skills"]["$SKILL"] print(f"\n{'='*50}") print(f"Skill: $SKILL") print(f"{'='*50}") print(f"Total Uses: {s['total_uses']}") print(f"Successful Uses: {s['successful_uses']}") print(f"Failures: {s['failures']}") print(f"Effectiveness: {s.get('effectiveness_rate', 0)*100:.1f}%") print(f"Last Used: {s.get('last_used', 'Never')}") print(f"Last Updated: {s.get('last_updated', 'Never')}") if s['failure_history']: print(f"\nRecent Failures:") for f in s['failure_history'][-5:]: print(f" - {f['timestamp']}: {f['reason']}") print() EOF ;; all-stats) python3 - <<EOF import json with open("$METRICS_FILE", "r") as f: data = json.load(f) print(f"\n{'='*70}") print(f"{'Skill':<30} {'Uses':<8} {'Success':<8} {'Failures':<8} {'Rate':<10}") print(f"{'='*70}") for skill, s in sorted(data["skills"].items()): rate = s.get('effectiveness_rate', 0) * 100 print(f"{skill:<30} {s['total_uses']:<8} {s['successful_uses']:<8} {s['failures']:<8} {rate:<10.1f}%") print(f"{'='*70}\n") EOF ;; *) echo "Error: Unknown command: $COMMAND" usage ;; esac

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/darrentmorgan/hostaway-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server