eonik-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EONIK_API_KEY | Yes | eonik workspace API key | |
| EONIK_API_URL | No | API origin (default https://api.eonik.ai) | |
| EONIK_BRAND_ID | No | Optional 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
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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