portfolio-overview
Skill0 starsChanged 22 days agoMITView on GitHub
Build an agency or multi-site portfolio view across every Search Console property on a GSC Wizard account. Lists owned and shared properties with their readiness (list_sites, get_account_info), ranks them by clicks against the prior period and names the sites that lost the most (get_cross_site_summary, optionally split by search type and country), reports each client tag's aggregated view (list_tags, get_tag_group_view), and manages tags and dashboard slots after confirmation (manage_tags, set_dashboard_visibility). Use when the user asks "how are all my sites doing", wants a client or portfolio overview, asks which site dropped the most, groups properties by client or tag, or asks which property to look at next.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- navoditk/pm-ai-skills-frameworktheir own version, first seen Nov 8, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- navoditk/pm-ai-skills-framework★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository33 other files it gives its agents.
- ai-assistant-trafficSkill
- anomaly-checkSkill
- bing-crawl-healthSkill
- bing-performanceSkill
- branded-splitSkill
- cannibalizationSkill
- client-reportSkill
- content-decaySkill
- content-groupsSkill
- core-web-vitalsSkill
- country-deviceSkill
- ctr-optimizationSkill
- experiment-resultsSkill
- ga4-overviewSkill
- indexing-healthSkill
- indexing-trackerSkill
- indexnow-submitSkill
- long-tail-analysisSkill
- merchant-center-healthSkill
- onpage-auditSkill
- page-deep-diveSkill
- property-setupSkill
- query-deep-diveSkill
- quick-winsSkill
- ranking-changesSkill
- shopping-performanceSkill
- site-auditSkill
- sitemap-auditSkill
- site-migrationSkill
- traffic-dropSkill
- traffic-forecastSkill
- weekly-reportSkill
- yandex-performanceSkill
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 3 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 12
Inventory the account: Call get_account_info (no arguments), then list_sites (no arguments), and read:
- Very specific: line 26
Only selected properties (shown on the dashboard or warehouse-synced) and active shares are covered, at most maxSites (default and maximum …
- Distinctive: line 37
When step 1 showed untagged properties, propose a scheme (one tag per client, or per market) and offer to assign it.
- Distinctive: line 50
Do not fabricate rows the tools did not return.
- Distinctive: line 66
Per-tag view: when tags exist, one row per tag, and for the focus tag its top queries and pages and a one-line read of the daily trend.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Portfolio Overview
Produce a cross-property view of the account: which sites carry the traffic, which lost the most, how each client tag performs, and which property deserves the next deep dive. The user's request may contain a tag name, a number of days, a search type, a focus hint ("only client X", "which sites dropped"), or a tag or visibility instruction; honor it when present.
Workflow
- Inventory the account. Call
get_account_info(no arguments), thenlist_sites(no arguments), and read:- from
get_account_info:user,googleAccounts(each withemail,isPrimary,scopes,connectedAt),subscription(plan,status,currentPeriodEnd,cancelAtPeriodEnd, or null),access.levelandapiKey.scope, which tells you up front whether the writes in steps 6 and 7 will be refused. If the response carrieswarning, a read failed: relay it and do not tell the user to connect Google or subscribe on the strength of empty fields. - from
list_sites: owned properties first, then shared ones, each bysiteUrl. Each row carriessiteUrl,tags,dataSource,permissionLevel,readable,activatedand, when known,gscScope; a shared row addssharedBy(the owner) andaccessLevel(READ_ONLYorFULL). - the readiness flags:
readable: falsemeans the property is listed in Search Console but not verified, so every read of it fails until the user verifies it;activated: falsemeans an owned property is neither on the dashboard nor synced, so the other tools refuse it and the portfolio tools leave it out. Count owned, shared, unreadable and not-activated properties for the account line. - the empty and error cases: if the list is empty, relay
emptyBecauseandnextStep; if the call errors with reasongoogle_account_disconnected, relay its message (reconnecting Google on the Account page fixes it; re-authorizing this integration does not).
- from
- Set the window. Use
days: 28unless the user asks for another length (1 to 180). The portfolio tools take no dates: they countdaysback from today minus 3 (the Search Console lag) and compare with the same-length window before it, and each response states the exactrangeandcomparisondates, so quote those. GSC data lags about 2 to 3 days: never treat the most recent 2 days as complete, and if the newest days of a daily trend look low, say it is likely reporting lag, not a real drop.searchTypedefaults toweb(alsoimage,video,news,discover). - Portfolio totals and per-site ranking. Call
get_cross_site_summarywithdaysand notag, so the properties shared with the account are included (shared: trueon their rows). AddincludeSearchTypes: trueonly when the user asks about the Discover, image, video or news mix (five extra reads per property), andincludeCountries: truewithcountryLimit(default 25, max 250) when markets matter (one extra read per property). Read out of the response:scope(siteCount,sharedCount,truncated),range,comparison,currentandprevious(clicks,impressions),deltas.sitesIncluded,sitesFailedandwarning: whenwarningis set, the totals cover only part of the portfolio; say so and never present them as the whole.perSite, sorted by clicks:siteUrl,clicks,impressions,prevClicks,prevImpressions,dataSource,sharedand, when requested,searchTypes. These rows carry no CTR or position; derive CTR fromclicksandimpressionsyourself and say so, or readget_site_summaryfor the sites that matter (step 4).errors, one per property left out, withsiteUrl,code,reasonanderror. Map the reason to advice:share_inactive(the owner revoked the share or their plan ended; ask them to re-share or renew),google_reconnect_requiredorgoogle_account_disconnected(reconnect that Google account on the Account page),property_not_verified(verify it in Search Console),search_console_permission_denied(the Google account lost access),search_console_rate_limited(retry later),read_failed(retry; report it if it persists).searchTypes(searchType,clicks,impressions,ctr,clickShare) andcountries(country,clicks,impressions,ctr,position,siteCount) withcountryTotal, when requested. Only selected properties (shown on the dashboard or warehouse-synced) and active shares are covered, at mostmaxSites(default and maximum 100) per call; whenscope.truncatedis true, run the call again pertagto cover the rest, and say which properties the headline leaves out.
- Sites that need attention. For every
perSiterow compute the click change (clicksminusprevClicks) and rank by absolute loss, not by percentage, so a 15% drop on the largest site outranks a 60% drop on a 30-click site; mention the relative change alongside. For the top 3 decliners callget_site_summarywithsiteUrland the samedaysto add CTR and average position with their comparison, which separates a ranking loss (position worse) from a demand or snippet loss (impressions or CTR down at a steady position). Also list the properties inerrorsas attention items, since a site nobody can read is a portfolio gap. - Per-tag view. Call
list_tagswithincludeSites: trueand readtags(name,siteCount,isGlobal,sites),totalTagsandtotalSites; tags live on owned properties only, so shares never carry one. If no tag exists,emptyBecausesays so: skip to step 6 and propose a tagging scheme. Otherwise, for the tag the user named or for the largest 3 to 5 tags bysiteCount, callget_tag_group_viewwithtag,daysanddimensions: ["query", "page"](the default is all four ofquery,page,country,device; each dimension is one more read per property, so addcountryanddeviceonly when asked);limitdefaults to 100 (max 1000). Readcurrent(clicks,impressions,ctr),previous,deltas,daily(by date, each withclicks,impressions,ctr,position), the mergedqueriesandpages(each row keyed byqueryorpagewithclicks,impressions,ctr,position),perSite, and the samesitesIncluded,warninganderrorsfields as step 3. The call errors when no selected property carries the tag;scope.truncatedmeans more thanmaxSites(100) do. Do not run it for every tag on a large account; ask which clients matter. - Tag management (write access).
manage_tagsis a write: ALWAYS list the tag and the exactsiteUrls, say what will change, and ask the user to confirm first. It takesaction(create,assign,unassign,rename,delete) andtag(up to 100 characters);siteUrls(1 to 100) is required forassignandunassign, andnewNameforrename.createdefines an account-level global tag and returns the account'sglobalTags.assignadds the tag to the listed properties and returnsupdatedandalreadyTagged;unassignremoves it and returnsupdatedandnotTagged.renameanddeleteapply across every owned property and the global list at once, returningupdatedSiteswithglobalTagRenamed, orremovedFromSiteswithglobalTagRemoved; confirm those with extra care.- A property shared read-only is refused with reason
read_only_shareand nothing is written; a batch that would push a property past 50 tags is refused whole. - When step 1 showed untagged properties, propose a scheme (one tag per client, or per market) and offer to assign it. If a write is refused because the connection is read-only, say that this step needs write access and continue with the read-only parts.
- Dashboard slots (write access). For owned properties with
activated: falsethat the user wants in the portfolio, callset_dashboard_visibilitywithsiteUrls(1 to 100, exact URLs fromlist_sites) andvisible: true, after listing them and asking for confirmation.- Showing a property consumes a dashboard slot of the plan and is refused when the limit is reached;
visible: falsehides a property and deletes no data. - The response reports
updated,unchanged,notRegistered,slots(used,limit,plan) and anoteon when the dashboard reflects the change. Reportslots.usedofslots.limitso the user knows how many more properties fit. - Shares cannot be toggled (the grant is their selection), and warehouse-synced properties are always shown and use no slot.
- Showing a property consumes a dashboard slot of the plan and is refused when the limit is reached;
Interpretation rules
ctrvalues are already percentages on a 0-100 scale. Never multiply them by 100.position: lower is better. A change toward a lower number is an improvement; never color it as a decline.- Present every multi-row result as a compact markdown table (top rows only, typically 5 to 10); keep prose for interpretation, not for restating numbers.
- Judge by the clicks and impressions at stake, not by percentage alone, and keep a site's
dataSourcein mind when two sites differ: a warehouse-served site and a live-API site are both complete for a 28-day window, but only the warehouse holds long history. - Do not fabricate rows the tools did not return. For a single property's deep dive, hand off: the site-audit skill for the overall picture, the traffic-drop skill for the largest decliner, the weekly-report skill for a recurring digest.
Output
- Account line: plan and status, connected Google accounts, and the owned, shared, unreadable and not-activated counts (
get_account_info,list_sites). - Portfolio headline: current versus previous clicks and impressions with the deltas, the dates covered, and
sitesIncludedofscope.siteCountwith thewarningwhen the totals are short. Portfolio table ranked by clicks (tool and date range above it). Show the top 10 to 15 and say how many more there are; Change is derived from
clicksandprevClicks.Site Clicks Previous Change Impressions Previous Shared Source Needs attention: the largest declines by absolute clicks with CTR and position from
get_site_summary, then the properties inerrors.Site Reason What fixes it Per-tag view when tags exist, one row per tag, and for the focus tag its top queries and pages and a one-line read of the daily trend.
Tag Sites Clicks Previous Change CTR - Search-type mix and country leaderboard, only when requested.
- End with a short prioritized list of 3 to 7 concrete recommendations: which site to run the site-audit or traffic-drop skill on next and why, which errors to fix, which tags to create or assign, and whether slots allow more properties.
Error handling
If any tool call fails with an authentication or subscription error, tell the user to run /mcp to (re)authenticate, and that a GSC Wizard account with an active plan or trial plus a connected Google Search Console account is required. If the property is not found, re-run list_sites and offer the closest matches instead of guessing a URL format. If a single tool fails for another reason, report the gap in the relevant section and complete the rest of the workflow with the remaining data.
Grounding
Every number you report must name the tool it came from and the date range it covers, for example "clicks 12,340 (get_site_summary, 2026-09-21 to 2026-09-27)". For a table, state the tool and date range once on the line above it. If you derive a figure yourself (a delta, a sum, a share), say so and name the tool outputs it was computed from. Never report a number no tool returned.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

