Repository files navigation

Analytics skill

A Claude skill that answers plain-language questions about site analytics by reading live data from Google Analytics 4, Google Search Console, and Semrush — e.g. "how many active users last month", "top search queries this week", "how many organic keywords do we rank for".

It's packaged as a plugin so it can be distributed to a whole team: everyone authenticates as themselves (OAuth / Application Default Credentials — no shared keys), and each person does a one-time local setup.

Layout

analytics-skill/ # plugin root
├── .claude-plugin/
│ └── plugin.json # plugin manifest (name, version, author)
├── package-org-plugin.sh # build analytics.plugin with the Semrush key injected
└── skills/
└── analytics/
├── SKILL.md # routes a question -> the right source, with examples
├── setup.sh # one-time per-user setup (venv + auth steps)
├── defaults.json # bundled shared config (Semrush key injected at org build)
├── config.example.json # optional per-user override template
├── requirements.txt
└── scripts/
├── analytics.py # dispatcher: analytics.py <ga4|gsc|semrush> ...
├── ga4.py # GA4 Data API
├── gsc.py # Search Console Search Analytics API
├── semrush.py # Semrush Analytics API
└── config.py

Mutable state (the Python venv, config.json, credentials) lives in a stable home, ~/.analytics-skill/, outside the plugin directory — so a plugin update/re-sync never wipes your setup.

Install

Org members (recommended): the plugin is published to the Causaly organisation, so it appears in your Claude app automatically — no cloning. Then do the one-time setup below.

Manual / development (clone the repo): add it as a plugin marketplace and install, or just run the setup script directly from a checkout.

One-time setup (each user)

For Google (GA4 + Search Console) everyone authenticates as themselves — no shared Google key, no downloadable service-account file; credentials live in your local gcloud config. The Semrush API key is a genuinely shared credential and ships bundled with the plugin, so there's nothing to paste.

1. Run the setup script — creates ~/.analytics-skill/ with a Python venv, installs dependencies, and scaffolds config.json:

skills/analytics/setup.sh

2. Authenticate with Google (ADC) — as printed by the script:

gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project csly-marketing-analytics

The quota project matters: user-credential API calls must bill to one, and the marketing group has serviceUsageConsumer on csly-marketing-analytics for exactly this. The Google Analytics Data API and Search Console API are enabled there. You need GA4 Viewer and Search Console access under your own Google account (you likely already have it) — no per-user property changes required.

3. Nothing to configure. The shared settings — GA4 property ID, GSC site URL, quota project, and the Semrush API key — ship with the plugin as bundled defaults (skills/analytics/defaults.json; the Semrush key is injected into the org build, not this public repo). You only authenticate as yourself in step 2.

Advanced overrides: drop a ~/.analytics-skill/config.json to override any bundled value per key (it's deep-merged over the defaults). You can also set ga4.credentials_path / gsc.credentials_path to a service-account.json to use a key instead of ADC — ADC is the recommended path and needs neither.

Usage

In any Claude surface where the plugin is available, just ask:

  • /analytics how many users were active last month
  • "top 10 search queries last week" → Search Console
  • "how many organic keywords do we rank for" → Semrush

The skill picks the right source(s), computes the date range, runs the script, and answers in plain language.

Distributing to the team

This repo is a self-contained plugin (.claude-plugin/plugin.json). To publish it to the Causaly org so colleagues get it automatically — the same way the content plugin is distributed — see PUBLISHING.md.

Notes

  • GA4 / Search Console data lags ~1–3 days.
  • Search Console keeps ~16 months of history.
  • Each Semrush call spends paid API units, so avoid speculative loops.

Troubleshooting

  • GA4 PERMISSION_DENIED → your Google account isn't a Viewer on the GA4 property (or, if using a service-account key, that account isn't a Viewer).
  • Search Console error → your account isn't a user on the Search Console property.
  • Reauthentication is needed / invalid_grant → re-run gcloud auth application-default login.
  • SERVICE_DISABLED / quota-project errors → run gcloud auth application-default set-quota-project csly-marketing-analytics and confirm you have serviceUsageConsumer on it.
  • Missing config file → run skills/analytics/setup.sh, or create ~/.analytics-skill/config.json.
  • Semrush ERROR 50/120 → bad API key or no units remaining.
  • Skill not showing up → for org installs, confirm the plugin is published to your org and you're signed in; for a checkout, confirm the plugin is installed/enabled.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Analytics skill

A Claude skill that answers plain-language questions about site analytics by reading live data from Google Analytics 4, Google Search Console, and Semrush — e.g. "how many active users last month", "top search queries this week", "how many organic keywords do we rank for".

It's packaged as a plugin so it can be distributed to a whole team: everyone authenticates as themselves (OAuth / Application Default Credentials — no shared keys), and each person does a one-time local setup.

Layout

analytics-skill/ # plugin root
├── .claude-plugin/
│ └── plugin.json # plugin manifest (name, version, author)
├── package-org-plugin.sh # build analytics.plugin with the Semrush key injected
└── skills/
└── analytics/
├── SKILL.md # routes a question -> the right source, with examples
├── setup.sh # one-time per-user setup (venv + auth steps)
├── defaults.json # bundled shared config (Semrush key injected at org build)
├── config.example.json # optional per-user override template
├── requirements.txt
└── scripts/
├── analytics.py # dispatcher: analytics.py <ga4|gsc|semrush> ...
├── ga4.py # GA4 Data API
├── gsc.py # Search Console Search Analytics API
├── semrush.py # Semrush Analytics API
└── config.py

Mutable state (the Python venv, config.json, credentials) lives in a stable home, ~/.analytics-skill/, outside the plugin directory — so a plugin update/re-sync never wipes your setup.

Install

Org members (recommended): the plugin is published to the Causaly organisation, so it appears in your Claude app automatically — no cloning. Then do the one-time setup below.

Manual / development (clone the repo): add it as a plugin marketplace and install, or just run the setup script directly from a checkout.

One-time setup (each user)

For Google (GA4 + Search Console) everyone authenticates as themselves — no shared Google key, no downloadable service-account file; credentials live in your local gcloud config. The Semrush API key is a genuinely shared credential and ships bundled with the plugin, so there's nothing to paste.

1. Run the setup script — creates ~/.analytics-skill/ with a Python venv, installs dependencies, and scaffolds config.json:

skills/analytics/setup.sh

2. Authenticate with Google (ADC) — as printed by the script:

gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project csly-marketing-analytics

The quota project matters: user-credential API calls must bill to one, and the marketing group has serviceUsageConsumer on csly-marketing-analytics for exactly this. The Google Analytics Data API and Search Console API are enabled there. You need GA4 Viewer and Search Console access under your own Google account (you likely already have it) — no per-user property changes required.

3. Nothing to configure. The shared settings — GA4 property ID, GSC site URL, quota project, and the Semrush API key — ship with the plugin as bundled defaults (skills/analytics/defaults.json; the Semrush key is injected into the org build, not this public repo). You only authenticate as yourself in step 2.

Advanced overrides: drop a ~/.analytics-skill/config.json to override any bundled value per key (it's deep-merged over the defaults). You can also set ga4.credentials_path / gsc.credentials_path to a service-account.json to use a key instead of ADC — ADC is the recommended path and needs neither.

Usage

In any Claude surface where the plugin is available, just ask:

  • /analytics how many users were active last month
  • "top 10 search queries last week" → Search Console
  • "how many organic keywords do we rank for" → Semrush

The skill picks the right source(s), computes the date range, runs the script, and answers in plain language.

Distributing to the team

This repo is a self-contained plugin (.claude-plugin/plugin.json). To publish it to the Causaly org so colleagues get it automatically — the same way the content plugin is distributed — see PUBLISHING.md.

Notes

  • GA4 / Search Console data lags ~1–3 days.
  • Search Console keeps ~16 months of history.
  • Each Semrush call spends paid API units, so avoid speculative loops.

Troubleshooting

  • GA4 PERMISSION_DENIED → your Google account isn't a Viewer on the GA4 property (or, if using a service-account key, that account isn't a Viewer).
  • Search Console error → your account isn't a user on the Search Console property.
  • Reauthentication is needed / invalid_grant → re-run gcloud auth application-default login.
  • SERVICE_DISABLED / quota-project errors → run gcloud auth application-default set-quota-project csly-marketing-analytics and confirm you have serviceUsageConsumer on it.
  • Missing config file → run skills/analytics/setup.sh, or create ~/.analytics-skill/config.json.
  • Semrush ERROR 50/120 → bad API key or no units remaining.
  • Skill not showing up → for org installs, confirm the plugin is published to your org and you're signed in; for a checkout, confirm the plugin is installed/enabled.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Analytics skill

A Claude skill that answers plain-language questions about site analytics by reading live data from Google Analytics 4, Google Search Console, and Semrush — e.g. "how many active users last month", "top search queries this week", "how many organic keywords do we rank for".

It's packaged as a plugin so it can be distributed to a whole team: everyone authenticates as themselves (OAuth / Application Default Credentials — no shared keys), and each person does a one-time local setup.

Layout

analytics-skill/ # plugin root
├── .claude-plugin/
│ └── plugin.json # plugin manifest (name, version, author)
├── package-org-plugin.sh # build analytics.plugin with the Semrush key injected
└── skills/
└── analytics/
├── SKILL.md # routes a question -> the right source, with examples
├── setup.sh # one-time per-user setup (venv + auth steps)
├── defaults.json # bundled shared config (Semrush key injected at org build)
├── config.example.json # optional per-user override template
├── requirements.txt
└── scripts/
├── analytics.py # dispatcher: analytics.py <ga4|gsc|semrush> ...
├── ga4.py # GA4 Data API
├── gsc.py # Search Console Search Analytics API
├── semrush.py # Semrush Analytics API
└── config.py

Mutable state (the Python venv, config.json, credentials) lives in a stable home, ~/.analytics-skill/, outside the plugin directory — so a plugin update/re-sync never wipes your setup.

Install

Org members (recommended): the plugin is published to the Causaly organisation, so it appears in your Claude app automatically — no cloning. Then do the one-time setup below.

Manual / development (clone the repo): add it as a plugin marketplace and install, or just run the setup script directly from a checkout.

One-time setup (each user)

For Google (GA4 + Search Console) everyone authenticates as themselves — no shared Google key, no downloadable service-account file; credentials live in your local gcloud config. The Semrush API key is a genuinely shared credential and ships bundled with the plugin, so there's nothing to paste.

1. Run the setup script — creates ~/.analytics-skill/ with a Python venv, installs dependencies, and scaffolds config.json:

skills/analytics/setup.sh

2. Authenticate with Google (ADC) — as printed by the script:

gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project csly-marketing-analytics

The quota project matters: user-credential API calls must bill to one, and the marketing group has serviceUsageConsumer on csly-marketing-analytics for exactly this. The Google Analytics Data API and Search Console API are enabled there. You need GA4 Viewer and Search Console access under your own Google account (you likely already have it) — no per-user property changes required.

3. Nothing to configure. The shared settings — GA4 property ID, GSC site URL, quota project, and the Semrush API key — ship with the plugin as bundled defaults (skills/analytics/defaults.json; the Semrush key is injected into the org build, not this public repo). You only authenticate as yourself in step 2.

Advanced overrides: drop a ~/.analytics-skill/config.json to override any bundled value per key (it's deep-merged over the defaults). You can also set ga4.credentials_path / gsc.credentials_path to a service-account.json to use a key instead of ADC — ADC is the recommended path and needs neither.

Usage

In any Claude surface where the plugin is available, just ask:

  • /analytics how many users were active last month
  • "top 10 search queries last week" → Search Console
  • "how many organic keywords do we rank for" → Semrush

The skill picks the right source(s), computes the date range, runs the script, and answers in plain language.

Distributing to the team

This repo is a self-contained plugin (.claude-plugin/plugin.json). To publish it to the Causaly org so colleagues get it automatically — the same way the content plugin is distributed — see PUBLISHING.md.

Notes

  • GA4 / Search Console data lags ~1–3 days.
  • Search Console keeps ~16 months of history.
  • Each Semrush call spends paid API units, so avoid speculative loops.

Troubleshooting

  • GA4 PERMISSION_DENIED → your Google account isn't a Viewer on the GA4 property (or, if using a service-account key, that account isn't a Viewer).
  • Search Console error → your account isn't a user on the Search Console property.
  • Reauthentication is needed / invalid_grant → re-run gcloud auth application-default login.
  • SERVICE_DISABLED / quota-project errors → run gcloud auth application-default set-quota-project csly-marketing-analytics and confirm you have serviceUsageConsumer on it.
  • Missing config file → run skills/analytics/setup.sh, or create ~/.analytics-skill/config.json.
  • Semrush ERROR 50/120 → bad API key or no units remaining.
  • Skill not showing up → for org installs, confirm the plugin is published to your org and you're signed in; for a checkout, confirm the plugin is installed/enabled.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Analytics skill

A Claude skill that answers plain-language questions about site analytics by reading live data from Google Analytics 4, Google Search Console, and Semrush — e.g. "how many active users last month", "top search queries this week", "how many organic keywords do we rank for".

It's packaged as a plugin so it can be distributed to a whole team: everyone authenticates as themselves (OAuth / Application Default Credentials — no shared keys), and each person does a one-time local setup.

Layout

analytics-skill/ # plugin root
├── .claude-plugin/
│ └── plugin.json # plugin manifest (name, version, author)
├── package-org-plugin.sh # build analytics.plugin with the Semrush key injected
└── skills/
└── analytics/
├── SKILL.md # routes a question -> the right source, with examples
├── setup.sh # one-time per-user setup (venv + auth steps)
├── defaults.json # bundled shared config (Semrush key injected at org build)
├── config.example.json # optional per-user override template
├── requirements.txt
└── scripts/
├── analytics.py # dispatcher: analytics.py <ga4|gsc|semrush> ...
├── ga4.py # GA4 Data API
├── gsc.py # Search Console Search Analytics API
├── semrush.py # Semrush Analytics API
└── config.py

Mutable state (the Python venv, config.json, credentials) lives in a stable home, ~/.analytics-skill/, outside the plugin directory — so a plugin update/re-sync never wipes your setup.

Install

Org members (recommended): the plugin is published to the Causaly organisation, so it appears in your Claude app automatically — no cloning. Then do the one-time setup below.

Manual / development (clone the repo): add it as a plugin marketplace and install, or just run the setup script directly from a checkout.

One-time setup (each user)

For Google (GA4 + Search Console) everyone authenticates as themselves — no shared Google key, no downloadable service-account file; credentials live in your local gcloud config. The Semrush API key is a genuinely shared credential and ships bundled with the plugin, so there's nothing to paste.

1. Run the setup script — creates ~/.analytics-skill/ with a Python venv, installs dependencies, and scaffolds config.json:

skills/analytics/setup.sh

2. Authenticate with Google (ADC) — as printed by the script:

gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project csly-marketing-analytics

The quota project matters: user-credential API calls must bill to one, and the marketing group has serviceUsageConsumer on csly-marketing-analytics for exactly this. The Google Analytics Data API and Search Console API are enabled there. You need GA4 Viewer and Search Console access under your own Google account (you likely already have it) — no per-user property changes required.

3. Nothing to configure. The shared settings — GA4 property ID, GSC site URL, quota project, and the Semrush API key — ship with the plugin as bundled defaults (skills/analytics/defaults.json; the Semrush key is injected into the org build, not this public repo). You only authenticate as yourself in step 2.

Advanced overrides: drop a ~/.analytics-skill/config.json to override any bundled value per key (it's deep-merged over the defaults). You can also set ga4.credentials_path / gsc.credentials_path to a service-account.json to use a key instead of ADC — ADC is the recommended path and needs neither.

Usage

In any Claude surface where the plugin is available, just ask:

  • /analytics how many users were active last month
  • "top 10 search queries last week" → Search Console
  • "how many organic keywords do we rank for" → Semrush

The skill picks the right source(s), computes the date range, runs the script, and answers in plain language.

Distributing to the team

This repo is a self-contained plugin (.claude-plugin/plugin.json). To publish it to the Causaly org so colleagues get it automatically — the same way the content plugin is distributed — see PUBLISHING.md.

Notes

  • GA4 / Search Console data lags ~1–3 days.
  • Search Console keeps ~16 months of history.
  • Each Semrush call spends paid API units, so avoid speculative loops.

Troubleshooting

  • GA4 PERMISSION_DENIED → your Google account isn't a Viewer on the GA4 property (or, if using a service-account key, that account isn't a Viewer).
  • Search Console error → your account isn't a user on the Search Console property.
  • Reauthentication is needed / invalid_grant → re-run gcloud auth application-default login.
  • SERVICE_DISABLED / quota-project errors → run gcloud auth application-default set-quota-project csly-marketing-analytics and confirm you have serviceUsageConsumer on it.
  • Missing config file → run skills/analytics/setup.sh, or create ~/.analytics-skill/config.json.
  • Semrush ERROR 50/120 → bad API key or no units remaining.
  • Skill not showing up → for org installs, confirm the plugin is published to your org and you're signed in; for a checkout, confirm the plugin is installed/enabled.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Analytics skill

A Claude skill that answers plain-language questions about site analytics by reading live data from Google Analytics 4, Google Search Console, and Semrush — e.g. "how many active users last month", "top search queries this week", "how many organic keywords do we rank for".

It's packaged as a plugin so it can be distributed to a whole team: everyone authenticates as themselves (OAuth / Application Default Credentials — no shared keys), and each person does a one-time local setup.

Layout

analytics-skill/ # plugin root
├── .claude-plugin/
│ └── plugin.json # plugin manifest (name, version, author)
├── package-org-plugin.sh # build analytics.plugin with the Semrush key injected
└── skills/
└── analytics/
├── SKILL.md # routes a question -> the right source, with examples
├── setup.sh # one-time per-user setup (venv + auth steps)
├── defaults.json # bundled shared config (Semrush key injected at org build)
├── config.example.json # optional per-user override template
├── requirements.txt
└── scripts/
├── analytics.py # dispatcher: analytics.py <ga4|gsc|semrush> ...
├── ga4.py # GA4 Data API
├── gsc.py # Search Console Search Analytics API
├── semrush.py # Semrush Analytics API
└── config.py

Mutable state (the Python venv, config.json, credentials) lives in a stable home, ~/.analytics-skill/, outside the plugin directory — so a plugin update/re-sync never wipes your setup.

Install

Org members (recommended): the plugin is published to the Causaly organisation, so it appears in your Claude app automatically — no cloning. Then do the one-time setup below.

Manual / development (clone the repo): add it as a plugin marketplace and install, or just run the setup script directly from a checkout.

One-time setup (each user)

For Google (GA4 + Search Console) everyone authenticates as themselves — no shared Google key, no downloadable service-account file; credentials live in your local gcloud config. The Semrush API key is a genuinely shared credential and ships bundled with the plugin, so there's nothing to paste.

1. Run the setup script — creates ~/.analytics-skill/ with a Python venv, installs dependencies, and scaffolds config.json:

skills/analytics/setup.sh

2. Authenticate with Google (ADC) — as printed by the script:

gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project csly-marketing-analytics

The quota project matters: user-credential API calls must bill to one, and the marketing group has serviceUsageConsumer on csly-marketing-analytics for exactly this. The Google Analytics Data API and Search Console API are enabled there. You need GA4 Viewer and Search Console access under your own Google account (you likely already have it) — no per-user property changes required.

3. Nothing to configure. The shared settings — GA4 property ID, GSC site URL, quota project, and the Semrush API key — ship with the plugin as bundled defaults (skills/analytics/defaults.json; the Semrush key is injected into the org build, not this public repo). You only authenticate as yourself in step 2.

Advanced overrides: drop a ~/.analytics-skill/config.json to override any bundled value per key (it's deep-merged over the defaults). You can also set ga4.credentials_path / gsc.credentials_path to a service-account.json to use a key instead of ADC — ADC is the recommended path and needs neither.

Usage

In any Claude surface where the plugin is available, just ask:

  • /analytics how many users were active last month
  • "top 10 search queries last week" → Search Console
  • "how many organic keywords do we rank for" → Semrush

The skill picks the right source(s), computes the date range, runs the script, and answers in plain language.

Distributing to the team

This repo is a self-contained plugin (.claude-plugin/plugin.json). To publish it to the Causaly org so colleagues get it automatically — the same way the content plugin is distributed — see PUBLISHING.md.

Notes

  • GA4 / Search Console data lags ~1–3 days.
  • Search Console keeps ~16 months of history.
  • Each Semrush call spends paid API units, so avoid speculative loops.

Troubleshooting

  • GA4 PERMISSION_DENIED → your Google account isn't a Viewer on the GA4 property (or, if using a service-account key, that account isn't a Viewer).
  • Search Console error → your account isn't a user on the Search Console property.
  • Reauthentication is needed / invalid_grant → re-run gcloud auth application-default login.
  • SERVICE_DISABLED / quota-project errors → run gcloud auth application-default set-quota-project csly-marketing-analytics and confirm you have serviceUsageConsumer on it.
  • Missing config file → run skills/analytics/setup.sh, or create ~/.analytics-skill/config.json.
  • Semrush ERROR 50/120 → bad API key or no units remaining.
  • Skill not showing up → for org installs, confirm the plugin is published to your org and you're signed in; for a checkout, confirm the plugin is installed/enabled.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Analytics skill

A Claude skill that answers plain-language questions about site analytics by reading live data from Google Analytics 4, Google Search Console, and Semrush — e.g. "how many active users last month", "top search queries this week", "how many organic keywords do we rank for".

It's packaged as a plugin so it can be distributed to a whole team: everyone authenticates as themselves (OAuth / Application Default Credentials — no shared keys), and each person does a one-time local setup.

Layout

analytics-skill/ # plugin root
├── .claude-plugin/
│ └── plugin.json # plugin manifest (name, version, author)
├── package-org-plugin.sh # build analytics.plugin with the Semrush key injected
└── skills/
└── analytics/
├── SKILL.md # routes a question -> the right source, with examples
├── setup.sh # one-time per-user setup (venv + auth steps)
├── defaults.json # bundled shared config (Semrush key injected at org build)
├── config.example.json # optional per-user override template
├── requirements.txt
└── scripts/
├── analytics.py # dispatcher: analytics.py <ga4|gsc|semrush> ...
├── ga4.py # GA4 Data API
├── gsc.py # Search Console Search Analytics API
├── semrush.py # Semrush Analytics API
└── config.py

Mutable state (the Python venv, config.json, credentials) lives in a stable home, ~/.analytics-skill/, outside the plugin directory — so a plugin update/re-sync never wipes your setup.

Install

Org members (recommended): the plugin is published to the Causaly organisation, so it appears in your Claude app automatically — no cloning. Then do the one-time setup below.

Manual / development (clone the repo): add it as a plugin marketplace and install, or just run the setup script directly from a checkout.

One-time setup (each user)

For Google (GA4 + Search Console) everyone authenticates as themselves — no shared Google key, no downloadable service-account file; credentials live in your local gcloud config. The Semrush API key is a genuinely shared credential and ships bundled with the plugin, so there's nothing to paste.

1. Run the setup script — creates ~/.analytics-skill/ with a Python venv, installs dependencies, and scaffolds config.json:

skills/analytics/setup.sh

2. Authenticate with Google (ADC) — as printed by the script:

gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project csly-marketing-analytics

The quota project matters: user-credential API calls must bill to one, and the marketing group has serviceUsageConsumer on csly-marketing-analytics for exactly this. The Google Analytics Data API and Search Console API are enabled there. You need GA4 Viewer and Search Console access under your own Google account (you likely already have it) — no per-user property changes required.

3. Nothing to configure. The shared settings — GA4 property ID, GSC site URL, quota project, and the Semrush API key — ship with the plugin as bundled defaults (skills/analytics/defaults.json; the Semrush key is injected into the org build, not this public repo). You only authenticate as yourself in step 2.

Advanced overrides: drop a ~/.analytics-skill/config.json to override any bundled value per key (it's deep-merged over the defaults). You can also set ga4.credentials_path / gsc.credentials_path to a service-account.json to use a key instead of ADC — ADC is the recommended path and needs neither.

Usage

In any Claude surface where the plugin is available, just ask:

  • /analytics how many users were active last month
  • "top 10 search queries last week" → Search Console
  • "how many organic keywords do we rank for" → Semrush

The skill picks the right source(s), computes the date range, runs the script, and answers in plain language.

Distributing to the team

This repo is a self-contained plugin (.claude-plugin/plugin.json). To publish it to the Causaly org so colleagues get it automatically — the same way the content plugin is distributed — see PUBLISHING.md.

Notes

  • GA4 / Search Console data lags ~1–3 days.
  • Search Console keeps ~16 months of history.
  • Each Semrush call spends paid API units, so avoid speculative loops.

Troubleshooting

  • GA4 PERMISSION_DENIED → your Google account isn't a Viewer on the GA4 property (or, if using a service-account key, that account isn't a Viewer).
  • Search Console error → your account isn't a user on the Search Console property.
  • Reauthentication is needed / invalid_grant → re-run gcloud auth application-default login.
  • SERVICE_DISABLED / quota-project errors → run gcloud auth application-default set-quota-project csly-marketing-analytics and confirm you have serviceUsageConsumer on it.
  • Missing config file → run skills/analytics/setup.sh, or create ~/.analytics-skill/config.json.
  • Semrush ERROR 50/120 → bad API key or no units remaining.
  • Skill not showing up → for org installs, confirm the plugin is published to your org and you're signed in; for a checkout, confirm the plugin is installed/enabled.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Analytics skill

A Claude skill that answers plain-language questions about site analytics by reading live data from Google Analytics 4, Google Search Console, and Semrush — e.g. "how many active users last month", "top search queries this week", "how many organic keywords do we rank for".

It's packaged as a plugin so it can be distributed to a whole team: everyone authenticates as themselves (OAuth / Application Default Credentials — no shared keys), and each person does a one-time local setup.

Layout

analytics-skill/ # plugin root
├── .claude-plugin/
│ └── plugin.json # plugin manifest (name, version, author)
├── package-org-plugin.sh # build analytics.plugin with the Semrush key injected
└── skills/
└── analytics/
├── SKILL.md # routes a question -> the right source, with examples
├── setup.sh # one-time per-user setup (venv + auth steps)
├── defaults.json # bundled shared config (Semrush key injected at org build)
├── config.example.json # optional per-user override template
├── requirements.txt
└── scripts/
├── analytics.py # dispatcher: analytics.py <ga4|gsc|semrush> ...
├── ga4.py # GA4 Data API
├── gsc.py # Search Console Search Analytics API
├── semrush.py # Semrush Analytics API
└── config.py

Mutable state (the Python venv, config.json, credentials) lives in a stable home, ~/.analytics-skill/, outside the plugin directory — so a plugin update/re-sync never wipes your setup.

Install

Org members (recommended): the plugin is published to the Causaly organisation, so it appears in your Claude app automatically — no cloning. Then do the one-time setup below.

Manual / development (clone the repo): add it as a plugin marketplace and install, or just run the setup script directly from a checkout.

One-time setup (each user)

For Google (GA4 + Search Console) everyone authenticates as themselves — no shared Google key, no downloadable service-account file; credentials live in your local gcloud config. The Semrush API key is a genuinely shared credential and ships bundled with the plugin, so there's nothing to paste.

1. Run the setup script — creates ~/.analytics-skill/ with a Python venv, installs dependencies, and scaffolds config.json:

skills/analytics/setup.sh

2. Authenticate with Google (ADC) — as printed by the script:

gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project csly-marketing-analytics

The quota project matters: user-credential API calls must bill to one, and the marketing group has serviceUsageConsumer on csly-marketing-analytics for exactly this. The Google Analytics Data API and Search Console API are enabled there. You need GA4 Viewer and Search Console access under your own Google account (you likely already have it) — no per-user property changes required.

3. Nothing to configure. The shared settings — GA4 property ID, GSC site URL, quota project, and the Semrush API key — ship with the plugin as bundled defaults (skills/analytics/defaults.json; the Semrush key is injected into the org build, not this public repo). You only authenticate as yourself in step 2.

Advanced overrides: drop a ~/.analytics-skill/config.json to override any bundled value per key (it's deep-merged over the defaults). You can also set ga4.credentials_path / gsc.credentials_path to a service-account.json to use a key instead of ADC — ADC is the recommended path and needs neither.

Usage

In any Claude surface where the plugin is available, just ask:

  • /analytics how many users were active last month
  • "top 10 search queries last week" → Search Console
  • "how many organic keywords do we rank for" → Semrush

The skill picks the right source(s), computes the date range, runs the script, and answers in plain language.

Distributing to the team

This repo is a self-contained plugin (.claude-plugin/plugin.json). To publish it to the Causaly org so colleagues get it automatically — the same way the content plugin is distributed — see PUBLISHING.md.

Notes

  • GA4 / Search Console data lags ~1–3 days.
  • Search Console keeps ~16 months of history.
  • Each Semrush call spends paid API units, so avoid speculative loops.

Troubleshooting

  • GA4 PERMISSION_DENIED → your Google account isn't a Viewer on the GA4 property (or, if using a service-account key, that account isn't a Viewer).
  • Search Console error → your account isn't a user on the Search Console property.
  • Reauthentication is needed / invalid_grant → re-run gcloud auth application-default login.
  • SERVICE_DISABLED / quota-project errors → run gcloud auth application-default set-quota-project csly-marketing-analytics and confirm you have serviceUsageConsumer on it.
  • Missing config file → run skills/analytics/setup.sh, or create ~/.analytics-skill/config.json.
  • Semrush ERROR 50/120 → bad API key or no units remaining.
  • Skill not showing up → for org installs, confirm the plugin is published to your org and you're signed in; for a checkout, confirm the plugin is installed/enabled.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Analytics skill

A Claude skill that answers plain-language questions about site analytics by reading live data from Google Analytics 4, Google Search Console, and Semrush — e.g. "how many active users last month", "top search queries this week", "how many organic keywords do we rank for".

It's packaged as a plugin so it can be distributed to a whole team: everyone authenticates as themselves (OAuth / Application Default Credentials — no shared keys), and each person does a one-time local setup.

Layout

analytics-skill/ # plugin root
├── .claude-plugin/
│ └── plugin.json # plugin manifest (name, version, author)
├── package-org-plugin.sh # build analytics.plugin with the Semrush key injected
└── skills/
└── analytics/
├── SKILL.md # routes a question -> the right source, with examples
├── setup.sh # one-time per-user setup (venv + auth steps)
├── defaults.json # bundled shared config (Semrush key injected at org build)
├── config.example.json # optional per-user override template
├── requirements.txt
└── scripts/
├── analytics.py # dispatcher: analytics.py <ga4|gsc|semrush> ...
├── ga4.py # GA4 Data API
├── gsc.py # Search Console Search Analytics API
├── semrush.py # Semrush Analytics API
└── config.py

Mutable state (the Python venv, config.json, credentials) lives in a stable home, ~/.analytics-skill/, outside the plugin directory — so a plugin update/re-sync never wipes your setup.

Install

Org members (recommended): the plugin is published to the Causaly organisation, so it appears in your Claude app automatically — no cloning. Then do the one-time setup below.

Manual / development (clone the repo): add it as a plugin marketplace and install, or just run the setup script directly from a checkout.

One-time setup (each user)

For Google (GA4 + Search Console) everyone authenticates as themselves — no shared Google key, no downloadable service-account file; credentials live in your local gcloud config. The Semrush API key is a genuinely shared credential and ships bundled with the plugin, so there's nothing to paste.

1. Run the setup script — creates ~/.analytics-skill/ with a Python venv, installs dependencies, and scaffolds config.json:

skills/analytics/setup.sh

2. Authenticate with Google (ADC) — as printed by the script:

gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/webmasters.readonly,https://www.googleapis.com/auth/cloud-platform"
gcloud auth application-default set-quota-project csly-marketing-analytics

The quota project matters: user-credential API calls must bill to one, and the marketing group has serviceUsageConsumer on csly-marketing-analytics for exactly this. The Google Analytics Data API and Search Console API are enabled there. You need GA4 Viewer and Search Console access under your own Google account (you likely already have it) — no per-user property changes required.

3. Nothing to configure. The shared settings — GA4 property ID, GSC site URL, quota project, and the Semrush API key — ship with the plugin as bundled defaults (skills/analytics/defaults.json; the Semrush key is injected into the org build, not this public repo). You only authenticate as yourself in step 2.

Advanced overrides: drop a ~/.analytics-skill/config.json to override any bundled value per key (it's deep-merged over the defaults). You can also set ga4.credentials_path / gsc.credentials_path to a service-account.json to use a key instead of ADC — ADC is the recommended path and needs neither.

Usage

In any Claude surface where the plugin is available, just ask:

  • /analytics how many users were active last month
  • "top 10 search queries last week" → Search Console
  • "how many organic keywords do we rank for" → Semrush

The skill picks the right source(s), computes the date range, runs the script, and answers in plain language.

Distributing to the team

This repo is a self-contained plugin (.claude-plugin/plugin.json). To publish it to the Causaly org so colleagues get it automatically — the same way the content plugin is distributed — see PUBLISHING.md.

Notes

  • GA4 / Search Console data lags ~1–3 days.
  • Search Console keeps ~16 months of history.
  • Each Semrush call spends paid API units, so avoid speculative loops.

Troubleshooting

  • GA4 PERMISSION_DENIED → your Google account isn't a Viewer on the GA4 property (or, if using a service-account key, that account isn't a Viewer).
  • Search Console error → your account isn't a user on the Search Console property.
  • Reauthentication is needed / invalid_grant → re-run gcloud auth application-default login.
  • SERVICE_DISABLED / quota-project errors → run gcloud auth application-default set-quota-project csly-marketing-analytics and confirm you have serviceUsageConsumer on it.
  • Missing config file → run skills/analytics/setup.sh, or create ~/.analytics-skill/config.json.
  • Semrush ERROR 50/120 → bad API key or no units remaining.
  • Skill not showing up → for org installs, confirm the plugin is published to your org and you're signed in; for a checkout, confirm the plugin is installed/enabled.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages