General Tools
attribura.com
Provides general-purpose tools through the Model Context Protocol.
ENDPOINT 1
https://api.attribura.com/mcp
MCP server metadata
- Name
- attribura
- Version
- 0.4.0
Attribura measures which content drives real REVENUE and stores the project's brand + persona context. Use this server to (1) READ that context before writing any content, and (2) SEED it when it's empty. How to write converting content from this context: - Always meet a viewer where their head actually is. A persona is modeled on three axes — use all three: • DEPTH (conscious → unconscious): each level carries explicit pain + desire bullets — surface (what they say) → underlying (the real problem/goal) → core (subconscious identity driver). Most content stops at the surface; conversion is won at the core. • EMOTIONAL arc (Hawkins as a tone lens): take them from their felt state now toward desire, then the courage/willingness to act. • AWARENESS stage (Schwartz): the hook depends entirely on how aware they already are — pick the angle for the stage of the audience you're targeting. - When the output is a SCRIPT (Reel/TikTok/Shorts/VSL), write it to be SPOKEN ALOUD, not read: short clauses, contractions, breath-based punctuation, and read every line out loud — rewrite anything you stumble on. Keep the spoken voiceover separate from on-screen text; don't duplicate one in the other. - Use the brand's VOICE; never use anything in the brand's AVOID list. - Lean on the brand's PROOF for credibility. Optimize for the brand's MONEY EVENT (the conversion), not vanity metrics. Craft — how the words themselves must read: - Write at a THIRD-GRADE reading level: short, common words and short sentences. Simple is persuasive; never use a fancy word where a plain one works. - Use METAPHOR to make a feeling physical — a vivid image lands harder than the literal fact ("that stack of books is a pile of locked doors"). Pick ONE strong metaphor and thread it through; don't pile up five. - Use POWER WORDS: concrete, emotionally charged verbs and nouns (locked, trapped, slipping, wasting, free, proof, edge) — but never the banned hype words in AVOID. - Sound like ONE real person talking, not a model. Vary sentence length a lot and read it out loud. Avoid the AI tells listed in AVOID (antithesis drumbeat, fragment triads, "here's the thing" preambles). CREATIVE LIBRARY (the "make content" loop): - Finished memes/images/videos rendered locally (e.g. with Remotion from the content/ project) get pushed to the panel — the human reviews and publishes them from the dashboard's /board page. - Workflow: get_context → write the script/copy → build + render locally → PREVIEW the rendered file yourself (read the image / extract video frames) and fix what looks off → push with a strong title, the hook, and a ready-to-paste caption → mark status 'ready' (update_creative) once approved by the human, or push drafts and let them review in the panel. - Captions should follow the same craft rules as scripts (voice, avoid-list, power words) and include the call to action tied to the brand's money event. THE CONTENT BOARD (organic posts, and the loop that makes them measurable): - For a POST (Reel/TikTok/Short/carousel) rather than an ad, start with get_content_config, not get_context: it carries the brand AND what the feed has already been fed — the mechanic/topic banks, the BURNT shapes, the spent keywords. Reusing a burnt shape is the fastest way to make an account read as one note. - Before drafting from the idea bank, claim_idea. A claim only succeeds from 'open', so it is what stops two sessions writing the same idea. - check_shape the mechanic you are about to run. 'burnt' means it ran inside its cool-off; pick another. These are COUNTS of what has already gone out — nothing here predicts performance, and at a cold start there is nothing to predict. - reserve_keyword is the one call that closes content -> revenue: the word on the endcard becomes a comment, the comment fires a DM, the DM carries a tracked link that knows which post it came from. Reserve it BEFORE writing the endcard, and print exactly the word the API returned. One keyword answers for exactly one post, forever — a 409 means it is spent, so pick another rather than retrying. - mark_posted once per platform it goes out on. link_creative once the platform import shows up, so the money can find its way back to the idea. APP STORE KEYWORDS (ASO) — a different job entirely from everything above: - keyword_brief is the one call to start from: the live listing, the tracked keywords with their scores, the packed 100-character field, the candidate terms and the nightly budget, for one storefront and one locale. The other tools exist for the follow-up questions, not for the first one. - ⚠️ reserve_keyword IS NOT AN ASO TOOL. It reserves an Instagram comment-gate word and creates a DM automation on a live account. "Add some keywords" for the App Store means track_keywords. - STOREFRONT vs LOCALE is not a formality. A storefront ('us', 'fr') is a country whose search results are queried — that is where ranks, popularity and the nightly cost live. A locale ('en-US', 'fr-FR') is the language a store page is written in — that is where the title, subtitle and 100-character keywords field live. Several locales sell into one storefront, so no tool takes a single "market" argument and neither should your reasoning. - The numbers are not a verdict. Popularity is Apple's own figure and is often simply absent (it only exists for terms this account's ads served impressions on); difficulty and relevance are Attribura ESTIMATES and ship with the recipe that produced them. Read the recipe before leaning on the score, and say which is measurement and which is estimate when you report. - Tracking is a standing commitment, not a row. One (keyword, storefront) pair is one App Store check EVERY NIGHT, forever. Apple publishes no ranking API, so ranks are read out of live search results one term at a time and a night holds a finite number of checks. Read the 'budget' field before adding, add in small batches, and know that untrack_keyword removes one row per call and takes its rank history with it. - Before proposing a new title or subtitle, check 'editable' and 'lock_reason' on the listing. Those fields belong to an app version; while a version is live with no editable sibling they cannot be written, and a rewrite nobody can apply is wasted work. WHICH PROJECT A CALL IS ABOUT: - This account can hold many projects and a token belongs to one of them, which is what a call answers for unless told otherwise. When the work names an app, pass 'project' with that name — every tool takes it, posting and store edits included. When a question says "everything", "all my apps" or "the portfolio", pass scope:'all', which reads offer and writes do not. list_projects has the names. Do not guess a name — an unknown one is refused, not silently ignored. - Numbers from two projects are two answers, never one. Only add them up when the question asked for the portfolio. - Say which project you acted on when you post, reserve a keyword or write a store listing for one you were told to switch to. A write that landed on the wrong app is not something the person can see from the answer. REPUTATION — reviews, ratings, and answering them: - TWO AVERAGES EXIST AND THEY ARE DIFFERENT NUMBERS. get_store_rating returns the PUBLIC star rating the App Store shows, per storefront. get_reputation returns 'average_collected', the mean of the reviews collected here. Report each as what it is; never call the second one "your App Store rating". - 'average: null' on a storefront means nobody has rated it. It is not 0 stars, and it must never be shown as a drop. - A RATING IS NOT A REVIEW. Most feedback a young app gets is stars with no words: 'rating_only' counts those and they can never be replied to. "This app has no reviews" while the store shows five stars is that split, not a bug. - The reply backlog is list_mentions with answered:'no'. 'pending' means an answer is written and the store has not shown it yet — leave those alone. - Writing a reply is not sending one. draft_reply saves words; a person sends them. Only pass send:true, or call send_reply, when the person asking has just said to publish. It appears publicly, under their app, over their name. - The store's answer endpoint OVERWRITES. A send is refused when the store already shows an answer nobody here wrote; read that answer before even considering 'force', because forcing destroys it. - ANSWER IN THE LANGUAGE THE REVIEW IS WRITTEN IN. A reply is read by the person who wrote the review and by everyone who reads the store page in that country. Replying to a Korean review in English is a reply to nobody. - Before drafting, read the review as it stands now — 'edited: true' means the customer rewrote it, and an apology under a review that now says five stars reads as a non-sequitur. How to SEED well (when get_context shows brand:null or no personas): - First call get_context to see what already exists; do NOT overwrite good data. - save_brand REPLACES the whole brand row — include every field you want to keep. - Ground everything in the founder's REAL language and product, not generic marketing filler. Be specific. For personas, fill pains + desires at each depth level honestly (especially the subconscious 'core') and only the awareness stages the audience truly sits at. If unsure of a fact, ask rather than invent. NOTE (hosted server): push_creative and push_slideshow are not available over HTTP — they read local files. To upload a rendered creative, POST it yourself as multipart to `https://api.attribura.com/v1/creatives` (fields: file, thumb?, title, hook, caption, meta) — or, for a slideshow, to `/v1/creatives/slideshow` (repeated `slide` image parts in deck order, same text fields) — with the same `Authorization: Bearer atb_…` header, then manage it with list_creatives/update_creative here.
Known tools 58
get_contextRead the active project's full brand + persona context as one JSON bundle ({ brand, personas }).
Inferred read-onlypush_briefCreate a SHOOTING BRIEF in the creative library: the shot list the human should film themselves (facecam takes, POV product shots, real-location b-roll) plus the script to record.
Potential side effectslist_creativesList the project's creative library (newest first), optionally filtered by status (draft | ready | published | archived).
Inferred read-onlyget_overviewHeadline revenue: revenue + money-event counts over the last 30 days and all-time, broken down by source (superwall/shopify/stripe/asc).
Inferred read-onlyget_performanceThe money-per-post table: every distribution (post) ranked by the revenue it drove, with clicks, installs, conversions, revenue_cents, proceeds_cents and subscriptions.
Potential side effectsget_revenue_eventsItemized revenue: individual purchases/renewals, each joined back to the post that drove it (channel, hook, distribution_id) and how it was attributed (method).
Potential side effectsget_store_salesApple's itemized App Store sales: one line per day, storefront, product and currency, with units and the developer proceeds Apple actually paid — in the storefront's OWN currency, plus a same-day USD conversion for ranking.
Inferred read-onlyget_self_report_summarySelf-reported attribution rollup (the in-app 'how did you hear about us?' answers): 30-day + all-time counts, the share we could pin to an exact post (verified) vs dark social, self-report revenue, and a per-channel breakdown.
Potential side effectslist_self_reportsItemized 'how did you hear about us?' answers (channel, raw answer, method, confidence, the pinned post if any, the app user id), newest first.
Potential side effectslist_contentEvery post a connected account posted or imported, with its latest engagement stats and ready-to-share tracked links.
Potential side effectslist_post_commentsWhat people actually wrote under one post: author, text, like count, when it was posted, and `auto_replied_at` — the moment an automation answered it.
Potential side effectslist_linksThe project's tracked short links with their total click counts and destination + the post each is tied to.
Potential side effectslist_clicksIndividual short-link click events, newest first, with the dimensions resolved at redirect time (country, device, os, is_bot, user-agent, referer) and the post they map to (distribution_id).
Potential side effectsget_analyticsApp Store performance over time, straight from Apple's reports: installs, redownloads, proceeds (USD cents, and NEGATIVE on a refund day), paid units, impressions, the countries behind them, the discovery funnel and period-over-period change.
Potential side effectsget_revenue_breakdownWhere the money came from: totals for the window plus all-time anchors, split by cash source (Superwall/Shopify/Stripe), by attribution method with its confidence, and by channel — including the `unattributed` bucket, which is money that cannot be traced to anything.
Inferred read-onlyget_store_funnelThe App Store discovery funnel per traffic source: impressions → product page views → installs, with the conversion rates Apple's own numbers support.
Inferred read-onlyget_onboarding_funnelThe app's in-app onboarding funnel, step by step, SPLIT BY THE CHANNEL each run said it came from — the join no general analytics tool can make, because the Attribura SDK asks the question inside the same onboarding.
Inferred read-onlyget_retentionDay 1 / Day 7 / Day 28 retention by install cohort, from the app opens the Attribura iOS SDK (0.4.0+) reports by itself — the number App Store Connect never gives, because Apple exposes no cohort and no device id.
Inferred read-onlyget_coverageWhich marketing fronts a project actually covers — store listing, content, automations, revenue tracking — as facts (what is connected, what is missing, how many of each), never as a score.
Inferred read-onlyget_integrations_healthEvery connector's state: connected / needs_reauth / disconnected, when each last synced, and the last error with its time.
Inferred read-onlyget_reputationThe reputation snapshot: how many mentions are held, how many carry WORDS vs stars only, the star histogram, and how many reviews have no answer.
Inferred read-onlylist_mentionsWhat people wrote about the app — App Store reviews today, newest first.
Inferred read-onlyget_store_ratingThe app's PUBLIC star rating per storefront, as the App Store shows it, with the previous day's reading beside it so a move is visible.
Inferred read-onlylist_repliesOur own reply ledger: what was drafted, what was sent, what the store refused, with the review's words beside each row.
Inferred read-onlyget_content_configEverything you need BEFORE writing a post, in one call: the brand + personas, the mechanic and topic banks with how often each has run, the BURNT shapes (ran inside their cool-off — do not reuse them), the spent comment keywords, the idea counts, and which social accounts a keyword can be reserved against.
Potential side effectsreserve_keywordReserve the post's comment gate ('Comment HEME for the link') and get back the tracked link the DM must carry.
Potential side effectsrelease_keywordGive a reserved comment gate back, so the word can answer for a different post.
Potential side effectsmark_postedRecord that a post went out on a platform — one call per platform, because the same post on TikTok and Instagram is two different audiences and pooling them reads two experiments as one.
Potential side effectslink_creativeClose creative <-> distribution: confirm that a post imported from Instagram/YouTube (list_content) IS the creative we wrote and pushed.
Potential side effectslist_accountsThe social accounts this project can post to: each one's id, platform, handle and whether the connection is still good.
Potential side effectsget_tiktok_creator_infoA connected TikTok account's own state, read live: the creator's name and picture, the `privacy_level_options` it may use, whether comments, duets or stitches are switched off, and the longest video it may post.
Potential side effectspublish_creativePOST a reel from the library to a connected account, for real — the platform does the posting, so there is no file to hand over and no box to tick afterwards.
Potential side effectslist_publish_jobsWhere each send got to: queued, uploading, processing, published, drafted, failed or cancelled.
Potential side effectslist_ideasThe idea bank: what should be WRITTEN next, as opposed to what is ready to post.
Potential side effectslist_tracked_keywordsAPP STORE ASO — the keywords this project tracks for its app.
Inferred read-onlyget_keyword_historyAPP STORE ASO — one tracked keyword's rank series over a window, plus the competitors that held its result slate and how many days each of them was present.
Inferred read-onlyget_keywords_fieldAPP STORE ASO — pack this project's tracked keywords for ONE storefront into Apple's 100-character keywords field, ordered best-observed-rank first, and report which terms did not fit.
Inferred read-onlysuggest_keywordsAPP STORE ASO — candidate keywords mined out of the app's OWN store listing (name, subtitle, keywords field, promotional text, category) for EVERY locale the app has, with where each came from, whether Apple indexes that source for search, and whether it is already tracked.
Inferred read-onlyget_listingAPP STORE ASO — one locale's App Store listing, read live from App Store Connect: name, subtitle, keywords field, description, promotional text and URLs, each with its character limit and — the part that matters before proposing any change — `editable` plus a `lock_reason` saying why a frozen field is frozen.
Inferred read-onlyupdate_listingAPP STORE ASO — write listing text to the App Store, for ONE locale.
Potential side effectscreate_app_versionAPP STORE ASO — open a new App Store version, which is what unlocks the listing fields update_listing cannot otherwise write.
Potential side effectslist_notesNOTES — what changed on this project and when, newest first: a listing field written through Attribura (kind `listing`, with its before → after per locale in `detail`), a version Apple reports ON SALE (`version`, Apple's own release date and release notes), or a change someone recorded by hand (`note`).
Inferred read-onlyadd_noteNOTES — record a change on its date so the charts and get_keyword_history carry it: a price change, a campaign start, a listing edit made directly in App Store Connect, a decision taken.
Potential side effectsscore_listingAPP STORE ASO — score a listing (app name, subtitle, keywords field) for ONE storefront/locale pair: the same number the Keywords page shows, and the way to COMPARE VARIANTS.
Inferred read-onlytrack_keywordsAPP STORE ASO — start tracking (keyword, storefront) pairs, so the nightly collector begins recording their rank.
Inferred read-onlyuntrack_keywordAPP STORE ASO — stop tracking one (keyword, storefront) pair and DELETE its recorded rank history with it.
Potential side effectsCONNECT WITH APPROVAL
Client installation
Review this server and its permissions before adding it. Secret placeholders must be set locally.
Codex
~/.codex/config.toml
[mcp_servers.attribura]
url = "https://api.attribura.com/mcp"
enabled = true
Claude Code
.mcp.json
{
"mcpServers": {
"attribura": {
"type": "http",
"url": "https://api.attribura.com/mcp"
}
}
}
Claude Desktop
Settings → Connectors → Add custom connector
Name: attribura
Remote MCP URL: https://api.attribura.com/mcp
Add this remote URL as a custom connector in Claude Desktop. Availability depends on the user plan and workspace policy.
Cursor
.cursor/mcp.json
{
"mcpServers": {
"attribura": {
"url": "https://api.attribura.com/mcp"
}
}
}
Visual Studio Code
.vscode/mcp.json
Add to Visual Studio Code{
"servers": {
"attribura": {
"type": "http",
"url": "https://api.attribura.com/mcp"
}
}
}
Generic MCP
Client-specific MCP configuration
{
"name": "attribura",
"transport": "streamable-http",
"url": "https://api.attribura.com/mcp"
}
MCP Inspector
Run the official MCP Inspector locally and enter the indexed Streamable HTTP endpoint.
TRUST AND VERIFICATION EVIDENCE
Loading Trust v2 evidence…
Checking the associated registrable domain. The BuiltWith key remains server-side.
Evidence is source-attributed and does not guarantee that a third-party server is safe. Risk labels are conservative metadata heuristics.