Zero-dependency, single-file CLI tools for marketing platforms that don't ship their own.
Every CLI is a standalone Node.js script (Node 18+) with no npm install required — just chmod +x and go.
node tools/clis/ahrefs.js backlinks list --target example.com# Symlink any CLI you want available globally
ln -sf "$(pwd)/tools/clis/ahrefs.js" ~/.local/bin/ahrefs
ln -sf "$(pwd)/tools/clis/resend.js" ~/.local/bin/resend
# Then use directly
ahrefs backlinks list --target example.com
resend send --from you@example.com --to them@example.com --subject "Hello" --html "<p>Hi</p>"export PATH="$PATH:/path/to/marketingskills/tools/clis"For step-by-step account setup and private credential loading, see guided tool connections.
Every CLI reads credentials from environment variables:
| CLI | Environment Variable |
|---|---|
activecampaign |
ACTIVECAMPAIGN_API_KEY, ACTIVECAMPAIGN_API_URL |
adobe-analytics |
ADOBE_ACCESS_TOKEN, ADOBE_CLIENT_ID, ADOBE_COMPANY_ID |
ahrefs |
AHREFS_API_KEY |
airops |
AIROPS_API_KEY, AIROPS_WORKSPACE_ID |
amplitude |
AMPLITUDE_API_KEY, AMPLITUDE_SECRET_KEY |
apollo |
APOLLO_API_KEY |
beehiiv |
BEEHIIV_API_KEY |
brevo |
BREVO_API_KEY |
buffer |
BUFFER_API_KEY |
calendly |
CALENDLY_API_KEY |
clay |
CLAY_API_KEY |
clearbit |
CLEARBIT_API_KEY |
close |
CLOSE_API_KEY |
coupler |
COUPLER_API_KEY |
crossbeam |
CROSSBEAM_API_KEY |
customer-io |
CUSTOMERIO_APP_KEY (App API), CUSTOMERIO_SITE_ID + CUSTOMERIO_API_KEY (Track API) |
dataforseo |
DATAFORSEO_LOGIN, DATAFORSEO_PASSWORD |
demio |
DEMIO_API_KEY, DEMIO_API_SECRET |
dub |
DUB_API_KEY |
exa |
EXA_API_KEY |
firecrawl |
FIRECRAWL_API_KEY |
g2 |
G2_API_TOKEN |
ga4 |
GA4_ACCESS_TOKEN |
google-ads |
GOOGLE_ADS_TOKEN, GOOGLE_ADS_DEVELOPER_TOKEN, GOOGLE_ADS_CUSTOMER_ID |
google-search-console |
GSC_ACCESS_TOKEN |
github-prospects |
GITHUB_TOKEN |
hotjar |
HOTJAR_CLIENT_ID, HOTJAR_CLIENT_SECRET |
intercom |
INTERCOM_API_KEY |
keywords-everywhere |
KEYWORDS_EVERYWHERE_API_KEY |
kit |
KIT_API_KEY, KIT_API_SECRET |
klaviyo |
KLAVIYO_API_KEY |
linkedin-ads |
LINKEDIN_ACCESS_TOKEN |
livestorm |
LIVESTORM_API_TOKEN |
mailchimp |
MAILCHIMP_API_KEY |
mention-me |
MENTIONME_API_KEY |
meta-ads |
META_ACCESS_TOKEN, META_AD_ACCOUNT_ID |
mixpanel |
MIXPANEL_TOKEN (ingestion), MIXPANEL_API_KEY + MIXPANEL_SECRET (query) |
onesignal |
ONESIGNAL_REST_API_KEY, ONESIGNAL_APP_ID |
optimizely |
OPTIMIZELY_API_KEY |
outreach |
OUTREACH_ACCESS_TOKEN |
paddle |
PADDLE_API_KEY, PADDLE_SANDBOX (optional) |
partnerstack |
PARTNERSTACK_PUBLIC_KEY, PARTNERSTACK_SECRET_KEY |
pendo |
PENDO_INTEGRATION_KEY |
plausible |
PLAUSIBLE_API_KEY, PLAUSIBLE_BASE_URL (optional, for self-hosted) |
postmark |
POSTMARK_API_KEY |
rankparse |
RANKPARSE_API_KEY |
resend |
RESEND_API_KEY |
rewardful |
REWARDFUL_API_KEY |
savvycal |
SAVVYCAL_API_KEY |
segment |
SEGMENT_WRITE_KEY (tracking), SEGMENT_ACCESS_TOKEN (profile) |
semrush |
SEMRUSH_API_KEY |
sendgrid |
SENDGRID_API_KEY |
tiktok-ads |
TIKTOK_ACCESS_TOKEN, TIKTOK_ADVERTISER_ID |
tolt |
TOLT_API_KEY |
truelist |
TRUELIST_API_KEY |
trustpilot |
TRUSTPILOT_API_KEY, TRUSTPILOT_API_SECRET, TRUSTPILOT_BUSINESS_UNIT_ID |
typeform |
TYPEFORM_API_KEY |
hunter |
HUNTER_API_KEY |
instantly |
INSTANTLY_API_KEY |
lemlist |
LEMLIST_API_KEY |
snov |
SNOV_CLIENT_ID, SNOV_CLIENT_SECRET |
similarweb |
SIMILARWEB_API_KEY |
supermetrics |
SUPERMETRICS_API_KEY |
wistia |
WISTIA_API_KEY |
zapier |
ZAPIER_API_KEY |
zoominfo |
ZOOMINFO_ACCESS_TOKEN (or ZOOMINFO_USERNAME + ZOOMINFO_PRIVATE_KEY) |
Never hardcode API keys or tokens in scripts. All CLIs read credentials exclusively from environment variables.
- Store keys in your shell profile (
~/.zshrc,~/.bashrc) or a.envfile - The
.envfile is gitignored — but double-check before committing - Use
--dry-runon any command to preview the request without sending it (credentials are masked as***) - If you fork this repo, audit your commits to ensure no secrets are included
All CLIs follow the same structure:
{tool} <resource> <action> [options]
Examples:
ahrefs backlinks list --target example.com --limit 50
semrush keywords overview --phrase "marketing automation" --database us
mailchimp campaigns list --limit 20
resend send --from you@example.com --to them@example.com --subject "Hello" --html "<p>Hi</p>"
dub links create --url https://example.com/landing --key summer-saleAll CLIs output JSON to stdout for easy piping:
# Pipe to jq
ahrefs backlinks list --target example.com | jq '.backlinks[].url_from'
# Save to file
semrush keywords overview --phrase "saas marketing" --database us > keywords.json
# Use in scripts
DOMAINS=$(rewardful affiliates list | jq -r '.data[].email')| CLI | Category | Tool |
|---|---|---|
activecampaign.js |
Email/CRM | ActiveCampaign |
adobe-analytics.js |
Analytics | Adobe Analytics |
ahrefs.js |
SEO | Ahrefs |
airops.js |
AI Content | AirOps |
amplitude.js |
Analytics | Amplitude |
apollo.js |
Data Enrichment | Apollo.io |
beehiiv.js |
Newsletter | Beehiiv |
brevo.js |
Email/SMS | Brevo |
buffer.js |
Social | Buffer |
calendly.js |
Scheduling | Calendly |
clay.js |
Data Enrichment | Clay |
clearbit.js |
Data Enrichment | Clearbit |
close.js |
CRM | Close |
coupler.js |
Data Aggregation | Coupler |
crossbeam.js |
Partner Ecosystem | Crossbeam |
customer-io.js |
Customer.io | |
dataforseo.js |
SEO | DataForSEO |
demio.js |
Webinar | Demio |
dub.js |
Links | Dub.co |
exa.js |
AI Search | Exa |
firecrawl.js |
Site Scraping & AI Search | Firecrawl |
g2.js |
Reviews | G2 |
ga4.js |
Analytics | Google Analytics 4 |
google-ads.js |
Ads | Google Ads |
google-search-console.js |
SEO | Google Search Console |
github-prospects.js |
Developer Intent / GitHub | GitHub |
hotjar.js |
CRO | Hotjar |
hunter.js |
Email Outreach | Hunter.io |
instantly.js |
Email Outreach | Instantly.ai |
intercom.js |
Messaging | Intercom |
keywords-everywhere.js |
SEO | Keywords Everywhere |
kit.js |
Kit | |
klaviyo.js |
Email/SMS | Klaviyo |
lemlist.js |
Email Outreach | Lemlist |
linkedin-ads.js |
Ads | LinkedIn Ads |
livestorm.js |
Webinar | Livestorm |
mailchimp.js |
Mailchimp | |
mention-me.js |
Referral | Mention Me |
meta-ads.js |
Ads | Meta Ads |
mixpanel.js |
Analytics | Mixpanel |
onesignal.js |
Push | OneSignal |
optimizely.js |
A/B Testing | Optimizely |
outreach.js |
Sales Engagement | Outreach |
paddle.js |
Payments | Paddle |
partnerstack.js |
Affiliate | PartnerStack |
pendo.js |
Product Analytics | Pendo |
plausible.js |
Analytics | Plausible |
postmark.js |
Postmark | |
rankparse.js |
SEO | RankParse |
resend.js |
Resend | |
rewardful.js |
Referral | Rewardful |
savvycal.js |
Scheduling | SavvyCal |
segment.js |
Analytics | Segment |
semrush.js |
SEO | SEMrush |
sendgrid.js |
SendGrid | |
snov.js |
Email Outreach | Snov.io |
similarweb.js |
Competitive Intelligence | Similarweb |
supermetrics.js |
Data Aggregation | Supermetrics |
tiktok-ads.js |
Ads | TikTok Ads |
tolt.js |
Referral | Tolt |
truelist.js |
Email Verification | Truelist |
trustpilot.js |
Reviews | Trustpilot |
typeform.js |
Forms | Typeform |
wistia.js |
Video | Wistia |
zapier.js |
Automation | Zapier |
zoominfo.js |
Data Enrichment | ZoomInfo |
HTTP calls in 65 of the CLIs use a 120-second per-request deadline, long enough for slow endpoints such as Firecrawl scrapes (60-second default on Firecrawl's side) and large analytics exports. The Truelist CLI is not covered. Lower or raise it with --timeout-ms <1-600000>, for example:
node tools/clis/exa.js search --query 'Recent market research' --timeout-ms 30000The deadline covers obtaining headers and consuming the response body, including OAuth requests. Each subsequent HTTP call gets its own deadline; this is not a total command deadline or a bound on external credential commands. An aborted call exits as a failure. Aborting a local request does not cancel work already accepted by a provider: check provider status before manually retrying a mutation. The CLI does not add automatic retries. Dry runs issue no HTTP request.
Implemented using Node's AbortSignal.timeout, available on the supported Node 18+ runtime, preserving zero-dependency standalone scripts. Native loopback tests cover stalled headers, stalled bodies, OAuth, successful responses and malformed timeout values without live accounts.