Skip to main content
Glama
eonik-ai

eonik-mcp

Official

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
EONIK_API_KEYYeseonik workspace API key
EONIK_API_URLNoAPI origin (default https://api.eonik.ai)
EONIK_BRAND_IDNoOptional brand workspace id

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_recent_slatesA

Get the user's recent Monday slates and consideration items (concept, why-now, receipts, reactions). Use for questions about their slates.

get_account_memoryA

What the user has tested in their OWN ad account, with receipts. Returns scopes (the auctions the account actually buys - objective + optimization goal + funnel stage), by_dimension allocation (spend and ad counts per creative dimension), and winners/losers where each ad is compared ONLY against the median CTR of its own auction, carried on scope_median_ctr. Rates are never comparable across auctions: on a live account two top-of-funnel auctions sit 41x apart on CTR from the optimization goal alone, so median_ctr is null and by_dimension[].avg_ctr is null wherever that value spans auctions. winners + losers equals judged_ads, not tested_ads - ads in an auction too thin to have a median appear in neither. Two horizons, and they answer different questions: craft_profile is a 90-day rolling snapshot - what separates the ads above their auction's median RIGHT NOW, and it can never say how long that has been true. craft_standing is the decay-weighted read across CLOSED weeks - held is what keeps separating, faded is what used to and stopped (which is the more useful half: it is how the account forgets last season on purpose). Never describe a craft_profile row as having held or worked for weeks - only craft_standing carries that, and only with weeks_separating of weeks_seen beside it. craft_standing is null until two weeks have closed; that is an honest silence, not an absence of craft. ⚠️ held means the choice keeps SEPARATING the two arms - not that it keeps working. Read latest_delta: a NEGATIVE delta means that craft choice is more common among the ads BELOW their auction's median. Always state the direction from the row's own counts, and never call a held row a thing that worked without checking its sign. Facts only, no predictions. Empty if Meta is not connected.

get_watch_activityA

Recent activity from the competitors the user is watching - new ads, proven winners (30+ days), organic outliers - with receipts. Use for 'what are my competitors doing lately?'.

save_context_noteA

Save a one-off correction or preference the marketer tells you to their context ledger, VERBATIM (e.g. 'we killed that angle', 'founder hates UGC'). NOT for questions or small talk; NOT for a dated plan/sale/launch (use save_plan); NOT for a durable business truth (use save_brand_truth). After saving, tell them you remembered it and they can review or remove it in Brand. Never rewrite their words.

save_brand_truthA

Capture a STRUCTURAL business truth the marketer reveals — something that should permanently shape the slate because it's what the platform's vanity metrics can't see. Four kinds: objective (what 'working' really means — e.g. 'we only care about repeat buyers, not first orders'), value_gradient (which customers are worth more than they look — e.g. 'our video ads bring people who deposit 2-3x more'), creative_truth (a hard-won belief — e.g. 'discounts bring people who never come back'), economics (AOV/margin/repeat cadence). Call ONLY for durable business truths, NOT one-off plans (those go to save_context_note). Capture their words VERBATIM in statement. Tell them you've noted it and they can edit it in Brand.

save_planA

Capture a DATED upcoming plan the marketer mentions — a sale, launch, or seasonal moment the Monday slate should prepare creative for WITH LEAD TIME (e.g. 'Diwali sale starts Oct 20', 'we launch v2 in March', 'Black Friday'). Provide title VERBATIM and starts_on as an ISO date YYYY-MM-DD; add ends_on if they give a range. ALWAYS read the date back to them in your reply so they can confirm or correct it. NOT for vague intentions without a date (use save_context_note); NOT for durable business truths (use save_brand_truth).

get_brief_groundingA

Get the receipt-bound GROUNDING for a slate item's brief — the marketer's brand truths, account-evidence target grammar, the deconstructed reference's measured teardown, brand guardrails, and the verified receipts — as DATA. YOU then author the brief from it ({shape, hook_options[3], script_skeleton[], references[], guardrails[]}); eonik hands you the facts, you do the reasoning. Ground every reference in a receipt; no performance predictions. Use when the marketer says 'write the brief for #2' / 'turn that into a brief'. (Prefer this over generate_creative_brief — you author, not a server model.)

generate_creative_briefA

(DEPRECATED — prefer get_brief_grounding + author it yourself.) Compose eonik's grounded creative brief for an approved slate item via a server model — a receipt-bound execution spec {shape, hook_options[3], script_skeleton[], references[], guardrails[]}. No performance predictions.

search_competitor_adsA

Search the ad library for competitor ads. Returns ads with hook types, creative styles, run duration. Use to analyze competitor creatives, find inspiration, or see what a brand is running.

get_my_competitor_adsA

Get ads from the user's configured competitors (the brands they watch) — facts only (creative, hook, days-running), no scores or predictions. Use for 'what are my competitors running?'.

get_competitor_channelsA

The 24/7 watch back office: every competitor under watch with their per-channel captured-ad counts (Meta Ads, TikTok, Google/YouTube, Instagram) + coverage (whether stops are observable on each channel), and each channel's read state so 'never polled' is distinguishable from 'polled, nothing found'. Use to show the Competitors rail and channel tabs, or to answer 'which competitors do we watch and how much do we have on each?'. Facts only — counts and date ranges, never a score.

get_competitor_assetsA

One competitor's captured ads for ONE channel, page by page, newest-published first, with a whole-set summary (totals, run lengths, video mix, coverage). Every ad carries a watch_asset_id so it can be deconstructed. Use after get_competitor_channels to load a channel tab. channel is a canonical slug: meta_ad_library | tiktok_ad_library | google_ads_transparency | instagram_organic | instagram_hashtag.

get_craft_playbookA

HOW a competitor's surviving ads are actually made — the pointers a video editor can build from: the hook and its verbatim opening lines, when the brand/product first appears on screen, average shot length, opening beat cadence, whether it reads with sound off, production style and tier, who is on camera, and the on-screen text they reuse. Each pointer carries counts from the ads that LASTED and, where the evidence allows, from the ones that ran far shorter. Use when asked 'what works for ', 'how do they make their ads', or when briefing an editor. Descriptive only: these are counts over what survived, never a claim that a technique CAUSED the survival. Returns unavailable with a reason when too few of that brand's creatives have been analysed — say that plainly rather than filling the gap.

get_category_topicsB

The category conversation pulled by hashtag: every watched TOPIC (a named hashtag bundle, e.g. 'UPSC prep' = #upsc #ssc #currentaffairs) with its captured Instagram post count. Topics are the wider field, not owned competitors. Load a topic's posts with get_competitor_assets(competitor_id=topic_id, channel='instagram_hashtag'). Facts only.

get_brand_contextA

The user's full brand DNA: name, category, audience, selling points, tone, positioning, messaging guardrails, personas, product catalog, competitor positioning. Use for any strategic brand question.

get_context_ledgerA

Everything the marketer has told eonik — durable brand truths (what 'working' really means, which customers are worth more, hard-won creative beliefs, economics), dated upcoming plans (sales/launches/seasonal), and recent verbatim corrections. The proprietary input no competitor or general agent can scrape. ALWAYS read this before giving strategic advice — it overrides generic best practice. Facts, verbatim.

get_account_conditionA

The brand's current operating condition from Meta-insight recency: {state: live | dark | not_connected, last_active, days_since_active, active_ads_recent}. Facts, never a verdict. A dark account needs a different first message than a live one — check this before advising.

lookup_ad_performanceA

Quick lookup of a specific OWN ad's performance: spend, CTR, CPC, impressions, status, genome tags. Use for 'what's the CTR on [ad]?', 'how is [ad] performing?'.

get_campaign_performanceA

Spend, CTR, and creative-genome breakdown for one of the user's OWN campaigns by name (partial) or exact campaign ID. Shows which hook_type x creative_style combinations are running and how each performs. Facts only, no predictions.

list_my_adsA

List the marketer's OWN ads with the full performance dashboard — spend, CTR, CPM, CPA, ROAS, hook rate (3s-view rate), hold rate (completion), status, creative genome, and thumbnail. Ranked by recent spend. Powers the Ad Library 'Your ads' corpus. Facts only, no predictions.

sync_my_adsA

Queue a read-only sync of the marketer's OWN Meta ads + insights (the same job that runs nightly). Use when their ad library looks empty or stale and Meta IS connected. Returns queued + last_synced; the ads land in list_my_ads a few minutes later. Read-only — never writes to Meta.

get_ad_deconstructionA

eonik's scene-by-scene breakdown of a PUBLIC ad (a watched competitor, a category ad-library ad, a TikTok ad, or a swipe-file item): full transcript, genome, and every scene (timing, role, shot_type, camera, lighting, on-screen text, action, product visibility, dialogue). The labor eonik already did with ffmpeg + Whisper + Gemini, stored once per unique creative and reused across the fleet — use it to reason about creative STRUCTURE. Facts only. If none exists yet, call deconstruct_ad first.

deconstruct_adA

Ask eonik to do the busywork of deconstructing a PUBLIC ad — a watched competitor, a category ad-library ad, a TikTok ad, or a swipe-file item (scene-split + transcribe + structural analysis, on the server). Idempotent — returns the existing breakdown if already done. Then read it with get_ad_deconstruction. Use when the marketer says 'break this down' / 'analyze the structure of this ad'. (For the marketer's OWN footage, use get_shot_analysis — that's read on-device.)

probe_asset_durationA

Measure how long a PUBLIC ad's creative actually runs, in seconds, and remember it. Reads the header of the copy we already hold (no download, no third-party CDN). Returns {duration_seconds} — or null when the media cannot be measured, which means UNMEASURED, never zero. Use before acting on an ad's length when the corpus says its duration is unknown.

get_competitor_patternsA

Aggregated structural patterns across ALL of a competitor's deconstructed ads — e.g. 'X of Y ads open with a problem-solution hook', most common editing rhythm, most common first-scene shot. Counts only, no predictions. Requires at least one deconstructed ad for that competitor.

get_competitor_timelineA

The full chronological roster of ONE competitor's archived creatives — every ad eonik has watched, newest launch first, with lifespans (how long each ran, whether it's still live) and archived media that survives after the ad is pulled. The continuous-monitoring archive Claude can't reconstruct. observed_* = eonik's monitoring window; platform_* = the platform's own claims (kept separate). Each item has an asset_id you can pass to deconstruct_ad to go deeper. Facts only, no predictions.

rememberA

Record something durable about THIS brand that you learned from the marketer — a decision, a correction, a rejection, an outcome. State it as a relation you already understand: subject + relation + object, plus the fact in one sentence and the marketer's own words if they said it. Recording 'the hook is X' when 'the hook is Y' was recorded before automatically supersedes the old fact (it becomes history, not a contradiction). Use it when the marketer tells you something that should still be true next session; do NOT use it for chit-chat or for anything already in the brand context.

recallA

What has this brand's marketer already decided, corrected or rejected? Semantic search over the brand's own memory, returning facts with their validity windows and receipts. Superseded facts are excluded unless you ask for history — quote valid_from/invalid_at rather than presenting an expired fact as current. Call it before proposing anything the marketer may have already ruled on.

get_brand_briefingA

Orientation for THIS brand: who it is, its rails, what the marketer has told us verbatim, what CHANGED in its competitive field since you last worked on it, and an inventory of every corpus you can reach with the tool that reaches it (counts, not contents). The editor loads this automatically at session start — call it yourself to refresh mid-session, after switching brands, or when you need to know what is actually available before choosing a tool.

get_validation_groundingA

The time-aware NormsPack for the pre-export reality check — scoped (own/category/competitor), windowed (28d/90d/lifetime) pattern facts with survivor rates, temporal class (evergreen|rising|fading|breaker), denominators, exemplar receipts, brand rails, and precomputed draft_comparisons. Pass the draft's signature so the pack is conditioned on THIS draft. Facts + arithmetic only — descriptive, receipt-backed, never predictions. Degrades honestly per scope.

get_ad_for_cloneA

ONE archived public ad by id, with the durable media needed to clone it (video, poster, permalink, copy). Use when a deep link or a slate item names an asset the local corpus does not hold — resolution by id, never a scan of a cached page. Returns clonable=false with a reason when only a still was archived.

search_swipeA

The marketer's OWN saved swipe file — ads they personally curated — with eonik's enrichment (days-running, spend range, audio, variations). Use to ground a question in what the marketer themselves has saved/admired.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/eonik-ai/eonik-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server