NotFair Turns SEO and Ads Work Into 45 Testable Agent Skills

April 11, 2026

|repo-review

by Florian Narr

NotFair Turns SEO and Ads Work Into 45 Testable Agent Skills

NotFair is a plugin for Claude Code, Codex, and compatible agents that packages SEO, GEO, and paid-media workflows as 45 separate skills — audit a site, diagnose a traffic drop, review Google/Meta/X/LinkedIn ad spend, write RSA copy — instead of one prompt that tries to do all of it.

Why I starred it

Most "AI marketing agent" repos are a single system prompt with a long list of things it claims to handle. NotFair splits every job into its own SKILL.md with required inputs, decision rules, and an output format, and — unusually — ships an eval suite per skill. test/helpers/llm_judge.py uses Gemini Flash as a judge to score skill output on clarity, completeness, and actionability, with a hard floor of 4/5 on each. That's a testing discipline I don't see in most of these repos, which mostly ship a README and hope.

How it works

The entry point isn't code, it's AGENTS.md — a 134-line routing table any agent reads first. Each row maps user intent to a skill path:

| Full-site SEO audit, traffic drop, GSC analysis, Core Web Vitals | `seo-analysis` | `seo/seo-analysis/SKILL.md` |

The bookkeeping section at the bottom of that file is blunt about the failure mode: "A skill that exists on disk but is missing from this file or plugin.json is invisible to agents." That's the whole architecture in one sentence — there's no runtime skill registry, just a markdown table an LLM has to read and match against.

Individual skills read like real procedures, not prompts. seo/seo-analysis/SKILL.md opens by checking ~/.toprank/business-context/*.json for previously audited sites before asking the user anything, then walks through preflight (gcloud auth, GSC API enablement, PageSpeed key), phased data collection, and a comparison against the last audit log stored at ~/.toprank/audit-log/<domain>.json. Worth noting: the state directory is still ~/.toprank everywhere in the codebase — a leftover from before the project renamed itself. git log shows 9434c5a chore: rename repository to notfair-plugin and 40353e0 docs: reposition NotFair around marketing skills a few commits apart; the rebrand touched the docs but not the on-disk paths.

The part I actually opened the source for is how they handle live connectors without hardcoding to one MCP server. README.md:191 explains it: skills reference tools through placeholders like ~~google-ads, ~~meta-ads, ~~search-console — the agent resolves each to whatever compatible tool is available in the current session. There's one registered connection in .mcp.json, a single hosted endpoint at notfair.co/api/mcp/notfair_ads, whose tools carry platform prefixes (google_ads_, meta_ads_, search_console_) so one OAuth session fans out to six data sources.

The mutation-safety pattern is the most concrete engineering decision in the repo. google-ads/manage/references/change-tracking.md requires every write operation to append an entry to change-log.json with a reviewAfter date — 7 days for bid/keyword/budget changes, 14 for structural changes like new campaigns. bin/notfair-change-watch is a shell script meant to run as a Claude Code SessionStart hook; it scans every account's change log and surfaces anything whose review date has passed and is still reviewed: false, so the next session opens with "you changed this 8 days ago, want to check impact?" instead of the user having to remember. It also generates .ics calendar files with a 9-hour-before alarm, built with a plain Python heredoc — no calendar API, just a hand-rolled VCALENDAR block.

On the eval side, test/test_skill_llm_eval.py doesn't run everything on every change — it uses helpers/touchfiles.py to map changed files to the specific LLM-judge tests worth re-running, and only expands to the full suite when the diff can't be scoped. Across the repo there are 22 evals/evals.json files totaling 57 individual cases. One from seo/seo-analysis/evals/evals.json checks that the skill asks for a URL before doing anything else if none is given — not a happy-path test, a guardrail test.

Using it

/plugin marketplace add nowork-studio/notfair-plugin
/plugin install notfair@nowork-studio

Then either invoke a skill directly or describe the task in plain language:

/notfair:seo-analysis
Audit my site and tell me why organic traffic fell.

Codex and other agents install through a CLI equivalent:

codex plugin marketplace add nowork-studio/notfair-plugin --json
codex plugin add notfair@nowork-studio --json
codex mcp login NotFair

Running evals locally costs real money but not much: EVALS=1 pytest test/test_skill_llm_eval.py is quoted at "~$0.05 per run (Gemini Flash)" in the test file's own docstring.

Rough edges

The "open source" framing needs a caveat: the skills themselves are MIT-licensed files you can read and fork, but every live-data workflow — GSC, GA4, Google/Meta/X/LinkedIn Ads — routes through NotFair's own hosted MCP endpoint and OAuth flow. You're not self-hosting the data layer, you're trusting their backend with ad account access.

90 SKILL.md files across 47 top-level skill directories is a lot of surface area for one team to keep coherent. The AGENTS.md/plugin.json/VERSION/CHANGELOG.md four-way bookkeeping requirement on every skill change is exactly the kind of manual sync step that drifts in practice, even with the explicit warning in the docs.

TikTok, Amazon, and ChatGPT Ads skills are explicitly downgraded to "planning or export-review workflows" unless a verified connector is present in the session — a smaller feature set dressed in the same skill format as the fully live Google/Meta/X/LinkedIn skills, so it's easy to assume more capability than exists until you read the fine print in AGENTS.md.

Bottom line

If you're running SEO or paid-media work through an agent already, NotFair is worth installing for the change-tracking and review-reminder pattern alone — it's a cleaner answer to "don't let the agent make ad account changes and disappear" than most tools bother building. Just know the live-data skills are a thin client over a hosted service, not a fully local workflow.

nowork-studio/notfair-plugin on GitHub
nowork-studio/notfair-plugin