Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Every Instagram Business metric across all your brand accounts Trigger phrases: `compare my instagram brands`, `instagram follower growth`, `best time to post on instagram`, `top instagram posts this month`, `instagram competitor analytics`, `use instagram-pp-cli`, `run instagram analytics`.
.claude/skills/mvanhorn-pp-instagram/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 403% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 127% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 78% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 723% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 99% | 0% |
<!-- GENERATED FILE — DO NOT EDIT. This file is a verbatim mirror of library/social-and-messaging/instagram/SKILL.md, regenerated post-merge by tools/generate-skills/. Hand-edits here are silently overwritten on the next regen. Edit the library/ source instead. See the repository agent guide, section "Generated artifacts: registry.json, cli-skills/". -->
This skill drives the instagram-pp-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
bash npx -y @mvanhorn/printing-press-library install instagram --cli-only
instagram-pp-cli --version$GOPATH/bin (or $HOME/go/bin) is on $PATH.If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.6 or newer):
bashgo install github.com/mvanhorn/printing-press-library/library/social-and-messaging/instagram/cmd/instagram-pp-cli@latest
If --version reports "command not found" after install, the install step did not put the binary on $PATH. Do not proceed with skill commands until verification succeeds.
A local-first analytics CLI for the Instagram Graph API built for managers who run several owned Business/Creator accounts. It syncs accounts, media, insights, and competitor snapshots into a queryable SQLite store, then adds the views the official tools lack: rank your brands side by side (compare), follower-growth over time (growth), best-time-to-post, format breakdowns, and competitor deltas. Agent-native output, offline search, and typed exit codes throughout.
Use this CLI when an agent or operator needs analytics across multiple owned Instagram Business/Creator accounts: comparing brands, tracking follower growth and engagement trends over time, ranking posts, analyzing content formats, or benchmarking competitors. It is the right tool when the question spans accounts or needs history the Graph API's short windows cannot answer.
Do not use this CLI for:
These capabilities aren't available in any other tool for this API.
compare — Rank all your brand accounts side by side by reach, interactions, and engagement rate over a window._Reach for this when an agent needs 'which of my brands is winning' in one ranked table instead of N separate account-insights calls._
bash instagram-pp-cli compare --since 30d --agent
growth — Track follower-count growth over time per brand, week over week._Reach for this when the question is trend (are we growing?), not a point-in-time count the profile field already gives._
bash instagram-pp-cli growth --since 8w --agent
rivals — Track rival public accounts' follower and engagement growth across syncs, benchmarked against your brands._Reach for this for competitive trend questions a single business_discovery call cannot answer._
bash instagram-pp-cli rivals --since 30d --agent
best-time — Surface the weekday/hour slots where your posts historically earn the most engagement._Reach for this to recommend a posting schedule grounded in that account's own data, not generic folklore._
bash instagram-pp-cli best-time --account acme --agent
top-posts — Rank individual posts across your brands by reach, interactions, saves, or shares over a window._Reach for this to find the highest-performing content fast instead of paging and sorting media by hand._
bash instagram-pp-cli top-posts --since 30d --metric reach --agent
formats — Compare Reels vs Feed vs Story vs Carousel by reach, engagement, and Reels watch-time._Reach for this to answer 'which content format works for this brand' in one aggregate instead of per-post insight calls._
bash instagram-pp-cli formats --account bistro --agent
hashtag-perf — Rank the hashtags you track by the reach and engagement of their top media._Reach for this to compare hashtag ROI; use the absorbed hashtag search to discover new tags instead._
bash instagram-pp-cli hashtag-perf --agent
account-insights — Account-level insights (reach, views, interactions, demographics)
instagram-pp-cli account-insights demographics — Lifetime follower demographics broken down by age, gender, city, or countryinstagram-pp-cli account-insights list — Account insights over a window (reach, accounts_engaged, total_interactions, views)accounts — Brand account profiles (Instagram Business/Creator users linked to your Pages)
instagram-pp-cli accounts get — Get a brand account profile (followers, follows, media counts, bio)instagram-pp-cli accounts pages — List the Facebook Pages you manage and their linked Instagram Business account idsbusiness-discovery — Public metrics for any business/creator account (competitor research)
instagram-pp-cli business-discovery <ig_user_id> — Fetch a competitor's public data via a business_discovery field expressioncomments — Comments and replies on media
instagram-pp-cli comments list — List comments on a media objectinstagram-pp-cli comments replies — List replies to a commenthashtags — Hashtag search and top/recent media
instagram-pp-cli hashtags recent-media — Recent public media for a hashtag idinstagram-pp-cli hashtags search — Resolve a hashtag string to its id (limited to 30 unique tags per account / 7 days)instagram-pp-cli hashtags top-media — Top-performing public media for a hashtag idmedia — Posts, reels, and per-media insights
instagram-pp-cli media create — Create a media container (step 1 of publishing). Analytics-first CLI; use --dry-run.instagram-pp-cli media get — Get a single media object by idinstagram-pp-cli media insights — Per-media insights (reach, views, saved, shares, interactions; Reels watch-time)instagram-pp-cli media list — List a brand's media (posts, reels, carousels) newest-firstinstagram-pp-cli media publish — Publish a previously created media container (step 2).instagram-pp-cli media publish-limit — Check remaining content-publishing quota (rolling 24h)stories — Active stories (24h window)
instagram-pp-cli stories <ig_user_id> — List a brand's currently-active stories (expire after 24h)tags — Media you have been tagged in
instagram-pp-cli tags <ig_user_id> — List public media that tag your brand accountWhen you know what you want to do but not which command does it, ask the CLI directly:
bashinstagram-pp-cli which "<capability in your own words>"
which resolves a natural-language capability query to the best matching command from this CLI's curated feature index. Exit code 0 means at least one match; exit code 2 means no confident match — fall back to --help or use a narrower query.
bashinstagram-pp-cli compare --since 30d --agent
One ranked table across every owned account — the view Meta Business Suite never shows.
bashinstagram-pp-cli media list 17841400000000000 --agent --select data.caption,data.media_product_type,data.like_count,data.comments_count
Pass a brand's IG user id (from 'brands list'); media responses are deeply nested, so --select trims to the high-gravity fields and keeps an agent from parsing tens of KB.
bashinstagram-pp-cli best-time --account bistro --agent
Buckets the brand's own post history by weekday and hour to recommend slots, not generic advice.
bashinstagram-pp-cli rivals --since 30d --agent
Diffs accumulated business_discovery snapshots into rival follower/engagement deltas.
bashinstagram-pp-cli formats --account cafe --agent
Aggregates Reels vs Feed vs Story vs Carousel including Reels watch-time.
Auth is a Meta Graph API access token from a Business-type app on the Facebook-Login path. Set INSTAGRAM_ACCESS_TOKEN to a long-lived user or (recommended) non-expiring system-user token with scopes instagram_basic, instagram_manage_insights, pages_show_list, pages_read_engagement, business_management. The CLI resolves each brand's IG user id from your Pages via /me/accounts and never performs writes unless you explicitly run a publish command. Run 'doctor' to verify token scopes, expiry, and resolved account ids.
Run instagram-pp-cli doctor to verify setup.
Add --agent to any command. Expands to: --json --compact --no-input --no-color --yes.
--select keeps a subset of fields. Dotted paths descend into nested structures; arrays traverse element-wise. Critical for keeping context small on verbose APIs:bash instagram-pp-cli account-insights list 17841400000000000 --agent --select data.name,data.period
--dry-run shows the request without sending--idempotent only when an already-existing create should count as successCommands that read from the local store or the API wrap output in a provenance envelope:
json{ "meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."}, "results": <data> }
Parse .results for data and .meta.source to know whether it's live or local. A human-readable N results (live) summary is printed to stderr only when stdout is a terminal AND no machine-format flag (--json, --csv, --compact, --quiet, --plain, --select) is set — piped/agent consumers and explicit-format runs get pure JSON on stdout.
When you (or the agent) notice something off about this CLI, record it:
instagram-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
instagram-pp-cli feedback --stdin < notes.txt
instagram-pp-cli feedback list --json --limit 10Entries are stored locally at ~/.local/share/instagram-pp-cli/feedback.jsonl. They are never POSTed unless INSTAGRAM_FEEDBACK_ENDPOINT is set AND either --send is passed or INSTAGRAM_FEEDBACK_AUTO_SEND=true. Default behavior is local-only.
Write what surprised you, not a bug report. Short, specific, one line: that is the part that compounds.
Every command accepts --deliver <sink>. The output goes to the named sink in addition to (or instead of) stdout, so agents can route command results without hand-piping. Three sinks are supported:
| Sink | Effect | |------|--------| | stdout | Default; write to stdout only | | file:<path> | Atomically write output to <path> (tmp + rename) | | webhook:<url> | POST the output body to the URL (application/json or application/x-ndjson when --compact) |
Unknown schemes are refused with a structured error naming the supported set. Webhook failures return non-zero and log the URL + HTTP status on stderr.
A profile is a saved set of flag values, reused across invocations. Use it when a scheduled agent calls the same command every run with the same configuration - HeyGen's "Beacon" pattern.
instagram-pp-cli profile save briefing --json
instagram-pp-cli --profile briefing account-insights list 17841400000000000
instagram-pp-cli profile list --json
instagram-pp-cli profile show briefing
instagram-pp-cli profile delete briefing --yesExplicit flags always win over profile values; profile values win over defaults. agent-context lists all available profiles under available_profiles so introspecting agents discover them at runtime.
| Code | Meaning | |------|---------| | 0 | Success | | 2 | Usage error (wrong arguments) | | 3 | Resource not found | | 4 | Authentication required | | 5 | API error (upstream issue) | | 7 | Rate limited (wait and retry) | | 10 | Config error |
Parse $ARGUMENTS:
help, or --help → show instagram-pp-cli --help outputinstall → ends with mcp → MCP installation; otherwise → see Prerequisites above--agent)bash go install github.com/mvanhorn/printing-press-library/library/social-and-messaging/instagram/cmd/instagram-pp-mcp@latest
bash claude mcp add instagram-pp-mcp -- instagram-pp-mcp
claude mcp listwhich instagram-pp-cliIf not found, offer to install (see Prerequisites at the top of this skill).
--agent flag:bash instagram-pp-cli <command> [subcommand] [args] --agent
instagram-pp-cli <command> --help.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→pass | 6,646 | 6,566 | -1% | 1 | 1 | 0% | 887 | 4,464 | +403% | 0 | 0 | — |
case-08 | fail→pass | 12,592 | 6,037 | -52% | 1 | 1 | 0% | 1,997 | 4,526 | +127% | 0 | 0 | — |
case-19 | pass→pass | 12,863 | 20,650 | +61% | 1 | 1 | 0% | 2,212 | 6,194 | +180% | 0 | 0 | — |
case-01 | fail→fail | 7,141 | 9,664 | +35% | 1 | 1 | 0% | 1,161 | 3,826 | +230% | 0 | 0 | — |
case-02 | fail→fail | 12,340 | 5,958 | -52% | 1 | 1 | 0% | 2,481 | 3,856 | +55% | 0 | 0 | — |
case-03 | fail→fail | 10,052 | 5,473 | -46% | 1 | 1 | 0% | 1,587 | 3,868 | +144% | 0 | 0 | — |
case-04 | pass→pass | 15,760 | 4,413 | -72% | 1 | 1 | 0% | 2,912 | 4,283 | +47% | 0 | 0 | — |
case-05 | fail→pass | 16,848 | 7,165 | -57% | 1 | 1 | 0% | 2,741 | 4,866 | +78% | 0 | 0 | — |
case-06 | fail→pass | 3,845 | 5,166 | +34% | 1 | 1 | 0% | 523 | 4,305 | +723% | 0 | 0 | — |
case-09 | fail→fail | 12,613 | 5,699 | -55% | 1 | 1 | 0% | 2,329 | 3,844 | +65% | 0 | 0 | — |
case-10 | fail→fail | 5,791 | 5,327 | -8% | 1 | 1 | 0% | 817 | 3,788 | +364% | 0 | 0 | — |
case-11 | fail→fail | 6,191 | 5,430 | -12% | 1 | 1 | 0% | 887 | 3,800 | +328% | 0 | 0 | — |
case-12 | fail→fail | 7,208 | 5,960 | -17% | 1 | 1 | 0% | 1,317 | 3,888 | +195% | 0 | 0 | — |
case-13 | fail→fail | 14,033 | 6,872 | -51% | 1 | 1 | 0% | 1,252 | 3,960 | +216% | 0 | 0 | — |
case-14 | pass→fail | 8,573 | 5,995 | -30% | 1 | 1 | 0% | 861 | 3,844 | +346% | 0 | 0 | — |
case-15 | fail→pass | 13,291 | 4,923 | -63% | 1 | 1 | 0% | 2,200 | 4,385 | +99% | 0 | 0 | — |
case-16 | fail→pass | 10,371 | 3,260 | -69% | 1 | 1 | 0% | 1,552 | 4,026 | +159% | 0 | 0 | — |
case-17 | fail→pass | 14,082 | 3,563 | -75% | 1 | 1 | 0% | 2,322 | 4,216 | +82% | 0 | 0 | — |
case-18 | fail→pass | 10,741 | 3,244 | -70% | 1 | 1 | 0% | 2,028 | 3,996 | +97% | 0 | 0 | — |
case-20 | fail→fail | 9,161 | 5,177 | -43% | 1 | 1 | 0% | 1,402 | 3,786 | +170% | 0 | 0 | — |
case-21 | pass→fail | 10,290 | 5,116 | -50% | 1 | 1 | 0% | 1,887 | 3,842 | +104% | 0 | 0 | — |
case-22 | pass→fail | 3,660 | 5,218 | +43% | 1 | 1 | 0% | 565 | 3,915 | +593% | 0 | 0 | — |
case-23 | fail→fail | 13,146 | 5,623 | -57% | 1 | 1 | 0% | 2,186 | 3,744 | +71% | 0 | 0 | — |
case-24 | fail→pass | 12,081 | 3,123 | -74% | 1 | 1 | 0% | 1,853 | 4,154 | +124% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 11 counted toward the lift figure. The other 13 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +25 percentage points is the difference between those two pass rates over the 11 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.