Claude Code Skill
Install the opinionated Atribu skill so Claude Code applies our attribution rules automatically
Atribu ships an opinionated Claude Code skill that teaches Claude how to reason about your attribution data. Once installed, the skill auto-loads whenever you ask about ROAS, campaigns, creatives, or customer journeys — Claude follows the skill's rules and calls the right MCP tools in the right order.
What the skill does
The MCP server returns raw data; the skill supplies the judgment:
- Cash-ROAS by default — the skill teaches Claude that
revenue_type='cash'is the only thing that counts as ROAS. GHL pipeline deals are "deal value," not revenue. - Tool ordering heuristics — for each common question ("which ads should I kill?", "why is ROAS dropping?", "who's converting?"), the skill specifies which MCP tools to call and in what order.
- Model guidance — when to use
last_touchvslinearvscompare_attribution_modelsbased on conversion volume and sales cycle. - Write-back safety — mandatory preview → user-confirm → confirm-with-idempotency-key flow for
send_meta_conversions. - Onboarding order — the golden path from an empty workspace to a live CAPI destination, which step needs which, and which errors mean "a human has to act" (see Onboarding below).
- PII explanations — when you ask for unmasked data and your token can't provide it, Claude explains exactly what to change instead of silently returning masked values.
Onboarding
The skill's write-back section (below) is about a workspace that is already configured. This section is the other half: what to do when it is not, which since #1058 an agent can do end to end over MCP.
Every session starts with whoami. It costs 0 units and now carries a readiness summary — how many golden-path steps are done, which is next, and every step that is not done with the reason and the action that unblocks it. An empty dashboard is almost always a missing connection, not a missing result, and this is where that shows.
The order, and why it is the order
Each step needs the one before it. Skipping is what produces a configuration that looks finished and reports zeroes.
create_workspace— only whenwhoamishows none. You become the owner.- Write-back starts ON for a workspace
create_workspacejust created — no human has to flip anything before the write tools below will run. Only a workspace created some other way — in the console, or by a Shopify/partner-app install — can have it off: checkwhoami'sactive_workspace.mcp_writeback_enabled. If it isfalse, say so in one sentence and give the user the URL from the error'saction_url; do not narrate the whole setting page. create_profile— one advertiser/brand/client. Everything after this is scoped to it. (Orcreate_demo_profile, when the user wants to see the product working before connecting anything real.)issue_tracking_key→get_tracker_installer— mint the key, then hand over the installer verbatim. Ask which surface first (snippet/gtm/shopify_pixel); guessing produces an install they cannot use.start_connect({ provider })— give the user theurlexactly as returned, then pollget_handoff({ id }). Do not open it, do not shorten it, do not summarise it.list_outcome_events→suggest_conversion_definitions→create_conversion_definition— read what the profile actually emits, propose from that, create what the user confirms. Never invent an event name.set_attribution_windows— only if the customer's sales cycle needs it. It rewrites already-reported numbers, so say so before confirming. 7b.sign_dpa— Conversion Sync exports nothing until the DPA is accepted. You cannot sign it; hand over the URL.already_signed: trueis a success — say so and move on rather than offering a link.configure_meta_capi→send_test_event— the dataset and its rules, then one synthetic event the customer watches land in Events Manager.
Rules the skill enforces
- Preview, show, confirm. Every write tool takes
mode. Runpreview, put itswill_calland (where present) its dry-run counts in front of the user in their own words, and only thenconfirm. Never confirm in the same turn you previewed unless the user already said yes to that exact thing. - A same-name
create_workspacereplay from the same caller is safe within a short window — it returnscreated: falseand the ORIGINAL workspace, never a second one. A different name is always a different workspace. If you did not read the outcome of a call, retry with the identical name rather than guessing a new one. - Read the error CODE, not the prose.
insufficient_scope→ the token needs re-consent.insufficient_role→ a human with an owner/admin role has to act; re-consenting cannot fix it.writeback_disabled→ one setting, one URL.connector_required→start_connect. Each carries anaction_url; give that link, do not describe the path. - Only
cashcounts for ROAS. When creating a conversion definition for what the customer calls "sales" or "revenue", that isrevenue_type: "cash".pipelinefills the funnel and contributes nothing to any ratio — a dashboard of zeroes with no error anywhere. - A hand-off is the user's to complete. Poll
get_handoffevery few seconds; do not mint a second one while the first is pending; anexpiredstatus means mint a fresh one, a 404 means the id is wrong. - A partial
configure_meta_capiis not a success. It returnscomplete: falseandfailed_rules. Say which conversions will not reach Meta rather than reporting the destination as done.
Install
The skill is distributed as a Claude Code plugin from the public repo AtribuCore/atribu-attribution-skill.
Add the marketplace and install the plugin
In any Claude Code session, run:
/plugin marketplace add AtribuCore/atribu-attribution-skill
/plugin install atribu-attribution@atribu-attributionThe first command registers the marketplace; the second installs the atribu-attribution plugin (which bundles the skill).
Restart Claude Code
A fresh session guarantees the skill is loaded. You can verify with:
What skills are available?You should see atribu-attribution in the list.
Configure the MCP server
If you haven't already, add the Atribu MCP server (quickstart):
claude mcp add atribu --transport http \
https://mcp.atribu.app/mcp \
--header "Authorization: Bearer atb_user_YOUR_TOKEN"If the person you are helping has no Atribu account yet
Do not try to create one for them and do not ask them to go find an API key. Register a client and build an authorize URL (API quickstart, step 1), then hand the URL over and wait:
Open this to connect your Atribu account:
https://www.atribu.app/oauth/mcp/authorize?…Create your account or sign in, approve, and tell me when you are back.
Signup, email confirmation and consent all happen inside that one URL, and it returns them to your approval screen. Only then exchange the code for a token.
Updating
When the skill is updated upstream, refresh with:
/plugin update atribu-attributionOther MCP clients
Cursor, Claude Desktop, Windsurf, and other MCP-compatible tools use the same MCP server but don't have Claude Code's plugin system. Copy the contents of SKILL.md into your system prompt or project rules for equivalent behavior.
Skill structure
Inside the public repo, the plugin is laid out as:
atribu-attribution-skill/
├── .claude-plugin/marketplace.json # Marketplace manifest
├── plugins/
│ └── atribu-attribution/
│ ├── .claude-plugin/plugin.json # Plugin manifest
│ └── skills/atribu-attribution/
│ ├── SKILL.md # Main instructions
│ ├── references/
│ │ ├── tool-ordering.md # Detailed heuristics
│ │ └── error-playbook.md # Error code handling
│ └── evals/evals.json # Test cases
├── README.md
└── LICENSE # MITThe main SKILL.md stays focused — the quick reference. When Claude needs deeper detail (error handling or tool selection), it reads files in references/ on demand. This follows Anthropic's recommendation to keep SKILL.md lean and lazy-load verbose material.
Evals
The skill ships with evals/evals.json — test cases with expected behavior. Each eval is a { prompt, expected_output, assertions } object that documents what Claude should do when the skill is loaded.
Example assertions:
"Which ads should I kill?"→ must callcreative_fatigue_checkfirst, thentop_creatives"Show me actual email addresses"→ must explain the three-condition PII requirement, not silently return masked data"Send conversions to Meta"→ must callpreviewfirst, ask for user confirmation, generate an idempotency key, report theaudit_id
Evals aren't automatically run by Claude Code — they're reference test cases for anyone modifying the skill. Use them as a regression checklist before changing SKILL.md.
Contributing
The skill is open source under MIT. If you find it giving bad guidance, open an issue or send a PR at AtribuCore/atribu-attribution-skill. Released versions are tagged so end users can pin if they want.