SharksAPI.AI
Was dieses MCP kann
Provides marketing analytics and actions across GA4, Search Console, Google Ads, social channels, SEO, WordPress, and marketing planning.
Tools
Eingabeschema
{'type': 'object', 'required': ['ad_group_id', 'keywords'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card: why these keywords.'}, 'keywords': {'type': 'array', 'items': {'type': ['string', 'object'], 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'The keyword itself: at most 80 characters and 10 words.'}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 50, 'description': 'The keywords to add, 1-50: plain strings (they take match_type) or {"text", "match_type"}, e.g. ["kodukindlustus", {"text": "kodukindlustus hind", "match_type": "EXACT"}].'}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string', 'description': 'Match type for keywords given as plain strings. Default PHRASE.'}, 'ad_group_id': {'type': 'string', 'description': 'Ad group id (digits), e.g. from list_google_ads_ads.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id', 'keywords'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card: which search terms wasted budget.'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'minItems': 1, 'description': 'The search terms to exclude, 1..50 per call, e.g. ["tasuta", "kasutatud", "töökuulutus"]'}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string', 'description': 'EXACT blocks only that exact search, PHRASE blocks any search containing the phrase, BROAD blocks searches containing all the words. Default PHRASE.'}, 'campaign_id': {'type': 'string', 'description': 'Campaign id from list_google_ads_campaigns'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'reason': {'type': 'string', 'description': 'One line for the approver: which waste this stops.'}, 'list_id': {'type': 'string', 'description': 'Existing shared set id. Give this OR list_name.'}, 'keywords': {'type': 'array', 'items': {'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string'}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string', 'description': 'Default PHRASE.'}}}, 'maxItems': 200, 'description': 'Keywords to add (max 200 per call).'}, 'list_name': {'type': 'string', 'description': 'Name of the list to use or create, e.g. "Üldised välistused".'}, 'attach_campaign_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Campaigns to attach the list to (Search or PMax).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['title', 'kind'], 'properties': {'date': {'type': 'string', 'description': 'Specific date YYYY-MM-DD or today/daysAgo tokens (optional).'}, 'kind': {'enum': ['recurring', 'seasonal', 'one_time'], 'type': 'string', 'description': 'recurring | seasonal | one_time.'}, 'notes': {'type': 'string', 'description': 'Notes (optional).'}, 'title': {'type': 'string', 'description': 'Activity name.'}, 'months': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Month numbers 1-12 it appears in (e.g. [6] for June, [1..12] for recurring).'}, 'status': {'enum': ['planned', 'in_progress', 'done'], 'type': 'string', 'description': 'planned | in_progress | done (default planned). Ignored when task_ref is provided because status is then derived from the linked task.'}, 'channel': {'type': 'string', 'description': 'Channel (optional).'}, 'task_ref': {'type': ['object', 'null'], 'required': ['token', 'widget_id', 'task_id'], 'properties': {'token': {'type': 'string', 'description': 'Child dashboard public_token where the strategy card lives.'}, 'task_id': {'type': 'integer', 'description': 'Task id on that strategy card.'}, 'widget_id': {'type': 'integer', 'description': 'Strategy-card widget_id.'}}, 'description': 'Link this activity to a strategy-card task. When set, activity status is derived from that task. Pass null to unlink and make status manual again.'}, 'agent_key': {'type': 'string', 'description': 'Owning agent key, e.g. seo, content, social, paid (optional).'}, 'manager_token': {'type': 'string', 'description': "Manager dashboard token (optional; defaults to the project's manager dashboard)."}, 'content_draft_id': {'type': 'integer', 'description': 'Link to a content draft (optional).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token', 'title'], 'properties': {'mode': {'enum': ['human_controlled', 'ai_controlled'], 'type': 'string', 'description': 'Who works the to-dos. Default ai_controlled (the agent executes and marks them done).'}, 'tasks': {'type': 'array', 'items': {'type': ['object', 'string'], 'required': ['title'], 'properties': {'done': {'type': 'boolean', 'description': 'Mark already-completed at creation.'}, 'note': {'type': 'string', 'description': 'Required with blocked / needs_human / needs_access: the one-line ask for the human, starting VAJA: …'}, 'text': {'type': 'string', 'description': 'Alias for title; accepted for agents that describe tasks as text.'}, 'label': {'enum': ['blocked', 'needs_human', 'needs_access', 'in_progress'], 'type': 'string', 'description': 'Optional status signal. blocked / needs_access / needs_human require a note (VAJA: …); needs_human / needs_access also require human_reason and are refused when a platform tool covers the ask.'}, 'title': {'type': 'string'}, 'description': {'type': 'string'}, 'human_reason': {'enum': ['decision', 'access', 'no_api', 'manual_ui'], 'type': 'string'}}}, 'description': 'The to-do list for this strategy.'}, 'title': {'type': 'string', 'description': 'Strategy / card title, e.g. "Tehniline SEO audit".'}, 'token': {'type': 'string', 'description': "public_token of the agent's OWN dashboard (a sub-dashboard under a manager). Get it from get_team_overview agents[].child_token, or the token you created."}, 'pillar': {'type': 'string', 'description': "Marketing-plan pillar key this work ladders up to (e.g. organic, paid, conversion, brand). Makes the card count toward that pillar's coverage on the manager dashboard."}, 'severity': {'enum': ['critical', 'high', 'medium', 'low'], 'type': 'string', 'description': 'How critical this strategy is. Drives the manager Top-5 ranking. Omit if not pressing.'}, 'strategy': {'type': 'string', 'description': 'Optional markdown describing the strategy / audit / rationale (shown in the card\'s "View strategy" detail).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token', 'widget_id', 'tasks'], 'properties': {'tasks': {'type': 'array', 'items': {'type': ['object', 'string'], 'required': ['title'], 'properties': {'note': {'type': 'string', 'description': 'Required with blocked / needs_human / needs_access: the one-line ask, starting VAJA: …'}, 'text': {'type': 'string', 'description': 'Alias for title; accepted for agents that describe tasks as text.'}, 'label': {'enum': ['blocked', 'needs_human', 'needs_access', 'in_progress'], 'type': 'string', 'description': 'blocked / needs_access / needs_human require a note; needs_human / needs_access also require human_reason and are refused when a platform tool covers the ask.'}, 'title': {'type': 'string'}, 'description': {'type': 'string'}, 'human_reason': {'enum': ['decision', 'access', 'no_api', 'manual_ui'], 'type': 'string'}}}}, 'token': {'type': 'string', 'description': 'Dashboard public_token the strategy card lives on.'}, 'widget_id': {'type': 'integer', 'description': 'Strategy card widget ID (from add_strategy_card or get_strategy_status).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'Competitor website URL'}, 'max_pages': {'type': 'integer', 'default': 10, 'description': 'Maximum pages to crawl if deep_crawl is true'}, 'deep_crawl': {'type': 'boolean', 'default': False, 'description': 'Crawl multiple pages'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'URL of the page to analyze'}, 'strategy': {'enum': ['mobile', 'desktop'], 'type': 'string', 'default': 'mobile', 'description': 'Device type for analysis'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'URL of the page to analyze'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['post_id'], 'properties': {'post_id': {'type': 'integer', 'description': 'WordPress post ID'}, 'focus_keyword': {'type': 'string', 'description': 'Focus keyword for SEO analysis'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['document_id', 'text'], 'properties': {'text': {'type': 'string', 'description': 'Text to append (include "\\n" for new paragraphs).'}, 'document_id': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['spreadsheet_id', 'range', 'values'], 'properties': {'range': {'type': 'string', 'description': 'A1 range of the table, e.g. "Sheet1!A1".'}, 'values': {'type': 'array', 'items': {'type': 'array', 'items': {'type': ['string', 'number', 'boolean', 'null']}}, 'description': '2D array of rows to append.'}, 'spreadsheet_id': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'URL of the page to audit'}, 'strategy': {'enum': ['mobile', 'desktop'], 'type': 'string', 'default': 'mobile', 'description': 'Device type for audit'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['target'], 'properties': {'target': {'type': 'string', 'description': 'Domain to inspect (e.g. competitor.com)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['report_id'], 'properties': {'report_id': {'type': 'integer', 'description': 'id from list_scheduled_reports'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['social_post_id'], 'properties': {'note': {'type': 'string', 'description': 'Why it is cancelled (stored as the review note).'}, 'social_post_id': {'type': 'integer', 'minimum': 1}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keywords', 'domains'], 'properties': {'domains': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Domains to score for citations (client first, then competitors), e.g. ["ait-nord.ee", "kliimamarket.ee"].'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Category search terms to test (max 20), e.g. ["soojuspump hind", "õhk-vesi soojuspump"].'}, 'language_code': {'type': 'string', 'default': 'et', 'description': 'Language code (et, en, fi, ru, ...).'}, 'location_code': {'type': 'integer', 'default': 2233, 'description': 'DataForSEO location code (2233 = Estonia, 2246 = Finland, 2428 = Latvia, 2440 = Lithuania).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1, 'description': 'Max sample ads to return (1-50). Default 10.'}, 'query': {'type': 'string', 'description': 'Domain (example.com) or brand/page name to search for in the Ad Library.'}, 'status': {'enum': ['ALL', 'ACTIVE', 'INACTIVE'], 'type': 'string', 'default': 'ALL', 'description': 'Filter by ad delivery status. ALL = both running and stopped ads. ACTIVE = currently delivering only. INACTIVE = stopped only. Default ALL.'}, 'country': {'type': 'string', 'default': 'EE', 'description': 'ISO 3166-1 alpha-2 country code (e.g. EE, US, DE, GB). Ads are disclosed per-country. Default EE.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'URL of the page to check'}, 'strategy': {'enum': ['mobile', 'desktop'], 'type': 'string', 'description': 'Ignored by this quick checker: it already checks both mobile and desktop. Use analyze_pagespeed for one strategy only.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'URL of the page to check'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'installed': {'type': 'array', 'items': {'type': 'object'}, 'description': "Skills you currently have: [{slug, version}]. version is the string from the skill's front matter (sharksapi_version). Omit to just get current versions of all your team's canonical skills."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['urls'], 'properties': {'urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20, 'minItems': 1, 'description': 'Public http(s) URLs.'}, 'user_agent': {'enum': ['browser', 'googlebot', 'bingbot', 'gptbot', 'oai-searchbot', 'chatgpt-user', 'claudebot', 'claude-searchbot', 'perplexitybot'], 'type': 'string', 'description': 'Whose request to imitate (default browser).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['service', 'config'], 'properties': {'config': {'type': 'object', 'description': 'Configuration key-value pairs (e.g., {"property_id": "123456"} for GA4)'}, 'service': {'type': 'string', 'description': 'Service ID'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['service', 'credentials'], 'properties': {'service': {'type': 'string', 'description': 'Service ID from integrations catalog (e.g., slack, github, stripe)'}, 'credentials': {'type': 'object', 'description': 'Service-specific credentials. Use list_integrations to see required fields for each service.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name', 'content'], 'properties': {'name': {'type': 'string', 'description': 'Human title, e.g. "SEO Audit".'}, 'slug': {'type': 'string', 'description': 'Stable id to group versions (e.g. "seo-audit"). Defaults to a slug of the name — use the SAME slug to add a version to an existing skill.'}, 'channel': {'type': 'string', 'description': "Memory channel this skill belongs to (e.g. social, seo, content, paid, analytics) — only that channel's agents + orchestrators see it. Omit for a global skill visible to everyone. Defaults to your own memory_role channel when you have one."}, 'content': {'type': 'string', 'description': 'The full skill markdown (YAML front matter + body).'}, 'summary': {'type': 'string', 'description': 'One line on what changed / why this version is better.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'channels': {'type': 'array', 'items': {'type': 'string'}, 'description': "Channel keys; default = the approved plan's pillars"}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name', 'widgets', 'password'], 'properties': {'name': {'type': 'string', 'description': 'Display name for the dashboard (e.g. "Weekly Marketing Overview")'}, 'role': {'enum': ['agent', 'manager'], 'type': 'string', 'default': 'agent', 'description': 'Dashboard role. "agent" (default) = a standalone dashboard for one agent — works completely on its own, no team needed. "manager" = a Turundusjuht Command Center that rolls up its team\'s agent sub-dashboards and holds the shared marketing plan. Most dashboards are "agent".'}, 'markets': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional. Countries the client sells in, ISO-3166-1 alpha-3 (e.g. ["est","fin"]). With two or more the client view gets a market picker and a "Turud" table; write per-market sections with update_seo_dashboard market=<code>. Domains with their own Search Console property are added by a Marketing Sharks admin.'}, 'widgets': {'type': 'array', 'items': {'type': 'object', 'required': ['type', 'position'], 'properties': {'type': {'enum': ['metric_card', 'chart_line', 'chart_bar', 'table', 'text_markdown', 'strategy_card', 'competitor_watch'], 'type': 'string', 'description': 'Widget renderer: metric_card (single number), chart_line (time series), chart_bar, table, text_markdown (agent content), strategy_card (interactive task checklist with expandable strategy/audit detail — put the full audit text in "content" so it appears when the user clicks "View strategy"), competitor_watch (cross-channel competitor comparison table — pass the competitor JSON object as "content")'}, 'title': {'type': 'string'}, 'source': {'type': 'object', 'properties': {'tool': {'type': 'string'}, 'arguments': {'type': 'object'}}, 'description': 'For integration_tool widgets: {tool: "get_ga4", arguments: {...}}. The tool is called at view time with the user\'s date range filter merged into arguments. IMPORTANT for metric_card widgets: always include metric in arguments so the card shows the right value — e.g. {tool: "get_ga4", arguments: {metric: "sessions"}} or {tool: "get_search_console", arguments: {metric: "clicks"}}. Without metric, all cards will show the same first numeric field.'}, 'content': {'type': 'string', 'description': 'For text_markdown widgets: raw markdown content. For strategy_card widgets: the full audit/strategy detail text shown when user clicks "View strategy" (put the audit findings HERE, not as a separate text_markdown widget). Never cached — stored as-is.'}, 'position': {'type': 'integer', 'description': '0-based order on the dashboard'}, 'grid_cols': {'type': 'integer', 'default': 4, 'maximum': 12, 'minimum': 1, 'description': 'Width in 12-column grid units. Typical: metric_card=3, chart=6-9, text_markdown=12'}, 'cache_ttl_seconds': {'type': 'integer', 'description': 'Override the default cache TTL for integration tool widgets. Defaults: GA4=300, GSC=900, social=3600.'}}}, 'description': 'Array of widget objects. Each widget has {type, title, position, grid_cols, source OR content}. Use "source" for integration tool widgets (e.g. get_ga4) and "content" for agent-authored text blocks.'}, 'password': {'type': 'string', 'description': 'REQUIRED — pick a strong password yourself (12+ characters, not a dictionary word); do not ask the person for one. The dashboard URL is public, so the password gate protects the business data. Viewers enter it before they see the dashboard; it is stored as a bcrypt hash. Send the person the dashboard link together with this password.'}, 'agent_key': {'type': 'string', 'description': 'Optional. Stable slug identifying this agent within the team (e.g. "seo", "google_ads", "copywriter"). Must match the agent_keys used in the manager\'s marketing-plan pillars for the "your pillar" context to show. Recommended whenever manager_token is set.'}, 'is_public': {'type': 'boolean', 'default': True, 'description': 'Whether the dashboard is accessible via its public URL. Defaults to true.'}, 'agent_icon': {'type': 'string', 'description': 'Optional emoji/short icon for this agent in the team rollup.'}, 'agent_name': {'type': 'string', 'description': 'Optional display name for this agent in the team rollup (defaults to the dashboard name).'}, 'expires_at': {'type': ['string', 'null'], 'format': 'date-time', 'description': 'Optional ISO8601 timestamp. After this time the public URL returns 410 Gone. Null = never expires.'}, 'client_view': {'enum': ['seo', 'team', 'grid'], 'type': 'string', 'description': 'Which page the CLIENT sees on this dashboard. "seo" = the fixed-section "AI agent · SEO/GEO" client view (Sinu seis, Sinult on vaja, Mida agent tegi, trendid) — default for agent_key "seo". "team" = the "AI tiim" package: the same page with paid ads next to SEO (inquiries from all channels, cost per inquiry, Google Ads / Meta Ads blocks); it folds in the paid-ads agent\'s dashboard of the same project (agent_key paid / ads / google_ads / meta_ads). "grid" = the classic widget grid. Sections are written with update_seo_dashboard (get_seo_dashboard returns the schema). Omit for the default.'}, 'description': {'type': 'string', 'description': 'Optional description shown in the dashboard header'}, 'agent_accent': {'type': 'string', 'description': 'Optional hex accent colour (e.g. "#FF6B35") for this agent in the team rollup.'}, 'client_email': {'type': 'string', 'description': "The business owner's e-mail. On the project's first dashboard SharksAPI e-mails them a one-time sign-in link (no password). Defaults to the owner_email you registered with; confirm it with your person first."}, 'invite_client': {'type': 'boolean', 'description': 'Set false to skip the automatic client invitation on the first dashboard.'}, 'manager_token': {'type': 'string', 'description': "Optional. Public token of a manager dashboard (same project) to attach this agent dashboard under as a team member. When set, this dashboard appears in that manager's rollup and shows the shared marketing-plan context. Omit to create a standalone agent dashboard."}, 'business_model': {'enum': ['services', 'ecommerce'], 'type': 'string', 'description': 'What a result means on the client view. "services" = an inquiry (GA4 key event: form, call, quote), ads judged by cost per inquiry. "ecommerce" = an order with revenue (GA4 purchase): the page adds revenue, average order value, the shop funnel, top products and ROAS. Omit it and the platform detects the model itself (GA4 purchases, the ad accounts\' purchase conversions, the shop platform on the site) — the answer and its reasons come back in business_model; the growth lead confirms it in Seaded. Never switch it later yourself: the numbers change meaning.'}, 'default_end_date': {'type': 'string', 'format': 'date', 'description': 'Optional ISO date (YYYY-MM-DD) for custom range default'}, 'default_date_range': {'enum': ['last_7_days', 'last_30_days', 'last_90_days', 'custom'], 'type': 'string', 'default': 'last_30_days', 'description': 'Default date range when the dashboard loads. Use "custom" with default_start_date + default_end_date for absolute dates.'}, 'default_start_date': {'type': 'string', 'format': 'date', 'description': 'Optional ISO date (YYYY-MM-DD) for custom range default'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['title'], 'properties': {'title': {'type': 'string', 'description': 'Document title.'}, 'content': {'type': 'string', 'description': 'Optional initial body text.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'File name.'}, 'content': {'type': 'string', 'description': 'Text content of the file (ignored for native Google Doc/Sheet types).'}, 'folder_id': {'type': 'string', 'description': 'Optional parent folder id.'}, 'mime_type': {'type': 'string', 'default': 'text/plain', 'description': 'MIME type. Default text/plain.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Folder name.'}, 'parent_id': {'type': 'string', 'description': 'Optional parent folder id.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['summary', 'start', 'end'], 'properties': {'end': {'type': 'string', 'description': 'End date-time in RFC3339.'}, 'start': {'type': 'string', 'description': 'Start date-time in RFC3339 (e.g. "2026-04-22T14:00:00Z").'}, 'summary': {'type': 'string', 'description': 'Event title.'}, 'location': {'type': 'string'}, 'timezone': {'type': 'string', 'default': 'UTC'}, 'attendees': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of attendee email addresses.'}, 'description': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['summary'], 'properties': {'event': {'type': 'object', 'required': ['title', 'start_date', 'end_date'], 'properties': {'title': {'type': 'string'}, 'end_date': {'type': 'string', 'description': 'YYYY-MM-DD, not before start_date'}, 'end_time': {'type': 'string', 'description': 'HH:MM, 24-hour clock.'}, 'start_date': {'type': 'string', 'description': 'YYYY-MM-DD'}, 'start_time': {'type': 'string', 'description': 'HH:MM, 24-hour clock.'}}, 'description': 'Required for EVENT and OFFER posts; not allowed on STANDARD.', 'additionalProperties': False}, 'offer': {'type': 'object', 'properties': {'coupon_code': {'type': 'string'}, 'terms_conditions': {'type': 'string'}, 'redeem_online_url': {'type': 'string', 'description': 'Absolute http(s) URL where the offer is redeemed online.'}}, 'description': 'OFFER posts only.', 'additionalProperties': False}, 'summary': {'type': 'string', 'description': 'The post text, plain, at most 1500 characters.'}, 'photo_url': {'type': 'string', 'description': 'Optional public http(s) image URL; Google downloads it (at least 250 px on the short edge, 10 KB).'}, 'topic_type': {'enum': ['STANDARD', 'EVENT', 'OFFER'], 'type': 'string', 'description': 'STANDARD (default), EVENT or OFFER.'}, 'language_code': {'type': 'string', 'description': 'Optional BCP 47 language of the text, e.g. "et" or "en".'}, 'call_to_action': {'type': 'object', 'required': ['action_type'], 'properties': {'url': {'type': 'string', 'description': 'Absolute http(s) URL the button opens. Omit for CALL.'}, 'action_type': {'enum': ['BOOK', 'ORDER', 'SHOP', 'LEARN_MORE', 'SIGN_UP', 'CALL'], 'type': 'string'}}, 'additionalProperties': False}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id', 'name', 'keywords', 'headlines', 'descriptions', 'final_url'], 'properties': {'name': {'type': 'string', 'description': 'Ad group name, unique within its campaign, e.g. "Kodukindlustus".'}, 'path1': {'type': 'string', 'description': 'Optional first display path, at most 15 characters, e.g. "kindlustus".'}, 'path2': {'type': 'string', 'description': 'Optional second display path (needs path1), at most 15 characters.'}, 'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card: why this ad group.'}, 'keywords': {'type': 'array', 'items': {'type': ['string', 'object'], 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'The keyword itself: at most 80 characters and 10 words.'}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 50, 'description': '1-50 keywords: plain strings (they take match_type) or {"text", "match_type"}, e.g. ["kodukindlustus", {"text": "kodukindlustus hind", "match_type": "EXACT"}]. Bare words only — no quotes, brackets or +.'}, 'final_url': {'type': 'string', 'description': "Landing page, a full https:// URL on a site this account's ads already use (for an account with no ads yet: the project's own website)."}, 'headlines': {'type': 'array', 'items': {'type': 'string'}, 'description': "The responsive search ad's 3-15 headlines, each at most 30 characters, no duplicates."}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string', 'description': 'Match type for keywords given as plain strings. Default PHRASE.'}, 'campaign_id': {'type': 'string', 'description': 'Campaign id from list_google_ads_campaigns, e.g. "20713245160" (digits).'}, 'max_cpc_eur': {'type': 'number', 'description': "Only for manual CPC bidding: this ad group's default max CPC in euros."}, 'descriptions': {'type': 'array', 'items': {'type': 'string'}, 'description': "The ad's 2-4 descriptions, each at most 90 characters, no duplicates."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name', 'category'], 'properties': {'name': {'type': 'string', 'description': 'Conversion action name, unique in the account (at most 100 characters), e.g. "Päringuvorm — kodukindlustus".'}, 'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card: what this conversion measures.'}, 'category': {'enum': ['SUBMIT_LEAD_FORM', 'PURCHASE', 'SIGNUP', 'CONTACT', 'PHONE_CALL_LEAD', 'BOOK_APPOINTMENT', 'REQUEST_QUOTE', 'ADD_TO_CART', 'BEGIN_CHECKOUT', 'SUBSCRIBE_PAID', 'DOWNLOAD', 'PAGE_VIEW', 'OUTBOUND_CLICK', 'GET_DIRECTIONS', 'DEFAULT'], 'type': 'string', 'description': 'What the conversion is: SUBMIT_LEAD_FORM, PURCHASE, SIGNUP, CONTACT, PHONE_CALL_LEAD, BOOK_APPOINTMENT, REQUEST_QUOTE …'}, 'counting_type': {'enum': ['ONE_PER_CLICK', 'MANY_PER_CLICK'], 'type': 'string', 'description': 'ONE_PER_CLICK counts one conversion per ad click (leads), MANY_PER_CLICK every one (purchases). Default: MANY_PER_CLICK for PURCHASE, ADD_TO_CART, BEGIN_CHECKOUT and SUBSCRIBE_PAID, otherwise ONE_PER_CLICK.'}, 'default_value': {'type': 'number', 'description': 'Optional value of one conversion in the account currency, e.g. 50 for a lead worth 50 EUR.'}, 'primary_for_goal': {'type': 'boolean', 'description': "true (default) = bidding strategies that optimise for the account's conversions use it. Set false for a secondary, observe-only action."}, 'always_use_default_value': {'type': 'boolean', 'description': 'true = always count default_value, even when the tag sends its own value. Needs default_value. Default false.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name', 'category'], 'properties': {'name': {'type': 'string'}, 'category': {'enum': ['QUALIFIED_LEAD', 'CONVERTED_LEAD', 'PURCHASE', 'SUBMIT_LEAD_FORM', 'BOOK_APPOINTMENT', 'SIGNUP', 'IMPORTED_LEAD', 'DEFAULT'], 'type': 'string'}, 'default_value_eur': {'type': 'number', 'description': 'Value when a row has none (default 1).'}, 'click_through_lookback_days': {'type': 'integer', 'maximum': 90, 'minimum': 1, 'description': 'Default 90 — CRM stages close late.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_name', 'daily_budget_eur', 'ad_groups'], 'properties': {'reason': {'type': 'string', 'description': "Optional one sentence for the approval card and the audit log: why this campaign, e.g. the client's new product category."}, 'ad_groups': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'keywords', 'headlines', 'descriptions', 'final_url'], 'properties': {'name': {'type': 'string', 'description': 'Ad group name, unique within its campaign, e.g. "Kodukindlustus".'}, 'path1': {'type': 'string', 'description': 'Optional first display path, at most 15 characters, e.g. "kindlustus".'}, 'path2': {'type': 'string', 'description': 'Optional second display path (needs path1), at most 15 characters.'}, 'keywords': {'type': 'array', 'items': {'type': ['string', 'object'], 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'The keyword itself: at most 80 characters and 10 words.'}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 50, 'description': '1-50 keywords: plain strings (they take match_type) or {"text", "match_type"}, e.g. ["kodukindlustus", {"text": "kodukindlustus hind", "match_type": "EXACT"}]. Bare words only — no quotes, brackets or +.'}, 'final_url': {'type': 'string', 'description': "Landing page, a full https:// URL on a site this account's ads already use (for an account with no ads yet: the project's own website)."}, 'headlines': {'type': 'array', 'items': {'type': 'string'}, 'description': "The responsive search ad's 3-15 headlines, each at most 30 characters, no duplicates."}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string', 'description': 'Match type for keywords given as plain strings. Default PHRASE.'}, 'max_cpc_eur': {'type': 'number', 'description': "Only for manual CPC bidding: this ad group's default max CPC in euros."}, 'descriptions': {'type': 'array', 'items': {'type': 'string'}, 'description': "The ad's 2-4 descriptions, each at most 90 characters, no duplicates."}}, 'additionalProperties': False}, 'maxItems': 10, 'minItems': 1, 'description': '1-10 ad groups, each with its own keywords and one responsive search ad. Created ENABLED inside the paused campaign.'}, 'languages': {'type': 'array', 'items': {'type': ['string', 'integer']}, 'description': 'Language codes of the people to reach, e.g. ["et"] or ["et", "ru", "en"], or language constant ids. Default ["et"].'}, 'locations': {'type': 'array', 'items': {'type': ['string', 'integer']}, 'description': 'Where the ads show: two-letter country codes ("EE", "LV", "FI") or Google geo target constant ids ("2233" is Estonia; use a city\'s id for a city). Default ["EE"]. Reaches people in or regularly in these places, not people merely interested in them.'}, 'max_cpc_eur': {'type': 'number', 'description': "maximize_clicks: the highest price of one click. manual_cpc: the default max CPC of every ad group (an ad group's own max_cpc_eur overrides it). Not with maximize_conversions."}, 'campaign_name': {'type': 'string', 'description': 'Campaign name, unique in the account (at most 255 characters), e.g. "Kodukindlustus — Search EE".'}, 'target_cpa_eur': {'type': 'number', 'description': 'Only with maximize_conversions: the average cost per conversion to aim for.'}, 'bidding_strategy': {'enum': ['maximize_clicks', 'maximize_conversions', 'manual_cpc'], 'type': 'string', 'description': "maximize_clicks (default; max_cpc_eur optionally caps a click), maximize_conversions (needs conversion tracking — see list_google_ads_conversion_actions; target_cpa_eur optional) or manual_cpc (max_cpc_eur is then every ad group's default bid)."}, 'daily_budget_eur': {'type': 'number', 'maximum': 1000000, 'minimum': 0.01, 'description': "The new campaign's own daily budget in euros, whole cents, e.g. 20 or 12.50. It must fit the campaign ceiling, and the account ceiling together with every running campaign."}, 'negative_keywords': {'type': 'array', 'items': {'type': ['string', 'object'], 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'The keyword itself: at most 80 characters and 10 words.'}, 'match_type': {'enum': ['EXACT', 'PHRASE', 'BROAD'], 'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 50, 'description': 'Optional campaign-level negative keywords, up to 50: plain strings (PHRASE) or {"text", "match_type"}, e.g. ["tasuta", "kasutatud"].'}, 'include_display_network': {'type': 'boolean', 'description': 'Also show on the Display Network. Default false — set it only when explicitly asked.'}, 'include_search_partners': {'type': 'boolean', 'description': "Also show on Google's search partner sites. Default false — set it only when explicitly asked."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name', 'type', 'firing_trigger_ids'], 'properties': {'name': {'type': 'string', 'description': 'Tag name as shown in GTM, e.g. "GA4 - form_start"'}, 'type': {'type': 'string', 'description': 'GTM tag type id: gaawe (GA4 event), googtag (Google tag / GA4 configuration), html (custom HTML), img (custom image), awct (Google Ads conversion), gclidw (conversion linker)'}, 'notes': {'type': 'string', 'description': 'Optional note shown in GTM: why the tag exists, who asked for it'}, 'parameters': {'type': 'object', 'description': 'Tag parameters as key/value pairs. gaawe: measurementId (G-XXXX, or the name of a Google tag to reference), eventName, eventParameters {name: value}. googtag: measurementId. html: html, supportDocumentWrite (boolean). Values may reference variables as {{Variable Name}}.'}, 'firing_trigger_ids': {'type': 'array', 'items': {'type': ['string', 'integer']}, 'description': 'Ids of the triggers that fire the tag (from list_gtm_triggers or create_gtm_trigger). At least one.'}, 'blocking_trigger_ids': {'type': 'array', 'items': {'type': ['string', 'integer']}, 'description': 'Optional exception trigger ids that block the tag from firing'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name', 'type'], 'properties': {'name': {'type': 'string', 'description': 'Trigger name as shown in GTM, e.g. "Click - CTA button"'}, 'type': {'type': 'string', 'description': 'GTM trigger type: pageview, domReady, windowLoaded, click, linkClick, formSubmission, customEvent, elementVisibility, scrollDepth, timer, historyChange, jsError, youTubeVideo'}, 'notes': {'type': 'string', 'description': 'Optional note shown in GTM'}, 'filters': {'type': 'array', 'items': {'type': 'object', 'properties': {'type': {'type': 'string', 'description': 'Condition: equals, contains, startsWith, endsWith, matchRegex, greater, greaterOrEquals, less, lessOrEquals, cssSelector, urlMatches'}, 'value': {'type': ['string', 'number'], 'description': 'Value to compare against, e.g. "btn-cta" or "/contact"'}, 'negate': {'type': 'boolean', 'description': 'Invert the condition ("does not contain")'}, 'parameter_key': {'type': 'string', 'description': 'Built-in or user variable the condition reads, without braces: Click Classes, Click URL, Page URL, Page Path, Form ID, Click Element...'}}}, 'description': 'Firing conditions ("Some clicks / Some pages"). Omit for "All clicks / All pages".'}, 'parameters': {'type': 'object', 'description': 'Type-specific settings, e.g. elementVisibility {selectorType: "CSS", elementSelector: ".pricing", onScreenRatio: 50, firingFrequency: "ONCE"}, scrollDepth {verticalThresholdsPercent: "25,50,75,90"}, timer {interval: 5000, limit: 1}'}, 'custom_event_name': {'type': 'string', 'description': 'Only for type customEvent: the dataLayer event name the site pushes, e.g. form_start or purchase'}, 'custom_event_use_regex': {'type': 'boolean', 'description': 'Only for customEvent: treat custom_event_name as a regular expression'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name', 'type'], 'properties': {'name': {'type': 'string', 'description': 'Variable name as shown in GTM, e.g. "DL - form_id"; referenced later as {{DL - form_id}}'}, 'type': {'type': 'string', 'description': 'GTM variable type id: v (data layer), c (constant), jsm (custom JavaScript), k (1st-party cookie), j (JavaScript variable), u (URL), aev (auto-event variable), smm (lookup table)'}, 'notes': {'type': 'string', 'description': 'Optional note shown in GTM'}, 'parameters': {'type': 'object', 'description': 'Type-specific settings: v {name, dataLayerVersion (default 2), defaultValue}; c {value}; jsm {javascript}; k {name}; j {name}; u {component: URL|HOST|PATH|QUERY|FRAGMENT, queryKey}; aev {varType: ELEMENT|TEXT|URL|ATTRIBUTE, attribute}'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['ad_creative_id', 'adset_id', 'link_url'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: which campaign plan this ad serves.'}, 'page_id': {'type': 'string', 'description': "Facebook Page the ad runs as. Default: the Page of the project's Facebook connection."}, 'adset_id': {'type': 'string', 'description': 'The Meta ad set the ad goes into (list_meta_adsets).'}, 'headline': {'type': 'string', 'description': 'Optional headline under the image (Meta: "name"), at most 255 characters.'}, 'link_url': {'type': 'string', 'description': 'Landing page, a full https:// URL.'}, 'ad_creative_id': {'type': 'integer', 'description': 'The creative id on the dashboard (get_ad_creatives → creatives[].id), not a Meta id.'}, 'call_to_action': {'enum': ['LEARN_MORE', 'SHOP_NOW', 'SIGN_UP', 'CONTACT_US', 'GET_OFFER', 'GET_QUOTE', 'APPLY_NOW', 'BOOK_TRAVEL', 'ORDER_NOW', 'DOWNLOAD', 'SUBSCRIBE'], 'type': 'string', 'description': 'Button type. Default LEARN_MORE.'}, 'instagram_user_id': {'type': 'string', 'description': "Optional Instagram account id for Instagram placements. Default: the project's Instagram connection, if any."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['schedule', 'recipients'], 'properties': {'time': {'type': 'string', 'default': '09:00', 'description': 'Time to run (HH:MM, Europe/Tallinn)'}, 'title': {'type': 'string', 'description': 'Short name shown to people, e.g. "Weekly SEO report"'}, 'prompt': {'type': 'string', 'description': 'Your own report instructions (what to read, compare and recommend). Overrides report_type.'}, 'schedule': {'enum': ['daily', 'weekly', 'monthly'], 'type': 'string', 'description': 'Report frequency'}, 'recipients': {'type': 'array', 'items': {'type': 'string'}, 'description': 'E-mail addresses that receive the report'}, 'day_of_week': {'type': 'integer', 'description': 'Weekly reports: 0=Sunday … 6=Saturday (default 1=Monday)'}, 'report_type': {'enum': ['analytics', 'seo', 'social', 'ads', 'comprehensive'], 'type': 'string', 'description': 'Ready-made report content; ignored when prompt is given'}, 'day_of_month': {'type': 'integer', 'description': 'Monthly reports: 1-31 (short months use their last day)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['title'], 'properties': {'title': {'type': 'string', 'description': 'Spreadsheet title.'}, 'values': {'type': 'array', 'items': {'type': 'array', 'items': {'type': ['string', 'number', 'boolean', 'null']}}, 'description': 'Optional initial rows.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['title', 'content'], 'properties': {'meta': {'type': 'object', 'description': 'Registered post meta as key → value, e.g. {"header_image": 168145} sets the ACF hero image ("Posti pildid") on marketingsharks.ee. A key the site has not exposed to the REST API fails with wp_meta_not_registered instead of being dropped.', 'additionalProperties': True}, 'slug': {'type': 'string', 'description': 'Optional URL slug for the post.'}, 'tags': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Tag IDs (see list_wp_tags). Prefer tag_names if you only know the names.'}, 'title': {'type': 'string', 'description': 'Post title'}, 'author': {'type': 'string', 'description': 'Post author as WordPress user ID, login (e.g. "diana"), email or display name. Defaults to the user behind the WordPress connection. Needs the connection user to be editor/administrator.'}, 'status': {'enum': ['publish', 'draft', 'pending', 'private'], 'type': 'string', 'default': 'draft', 'description': 'Post status'}, 'content': {'type': 'string', 'description': 'Post content (HTML)'}, 'excerpt': {'type': 'string', 'description': 'Post excerpt'}, 'tag_names': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Tag names, e.g. ["AI turundus", "GEO"]. Existing tags are matched by name/slug, missing ones are created automatically.'}, 'categories': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Category IDs (see list_wp_categories). Prefer category_names if you only know the names.'}, 'category_names': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Category names or slugs, e.g. ["SEO", "Turundus"]. Resolved to IDs; an unknown category fails the call (categories are never auto-created).'}, 'featured_media': {'type': 'integer', 'description': 'Featured image ID'}, 'meta_description': {'type': 'string', 'description': 'SEO meta description shown in Google (max ~155 chars). Stored in Rank Math (rank_math_description) once the post is created; check meta_description.saved in the result.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'description': 'Destination path or URL.'}, 'from': {'type': 'string', 'description': 'Old path, e.g. "/vana-leht/" (an absolute URL on the same site is accepted).'}, 'type': {'type': 'integer', 'description': '301 permanent (default) or 302 temporary.'}, 'object_id': {'type': 'integer', 'description': 'Optional, Rank Math backend only (ignored with the Redirection plugin). WordPress post/page ID to attach the redirect to when neither "from" nor "to" is a post or page on this site (e.g. both URLs are archives). Usually omit.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Tag name as it should appear on the site, e.g. "AI turundus".'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['manager_token', 'assignments'], 'properties': {'assignments': {'type': 'array', 'items': {'type': 'object', 'required': ['agent_key', 'title'], 'properties': {'mode': {'enum': ['human_controlled', 'ai_controlled'], 'type': 'string', 'description': 'Default ai_controlled.'}, 'tasks': {'type': 'array', 'items': {'type': ['object', 'string']}, 'description': 'Subtasks for this agent. Items: {title, description?, label?} — or plain strings (a string becomes the task title).'}, 'title': {'type': 'string', 'description': 'Card title, e.g. "Uue kampaania käivitamine — xxx leht".'}, 'pillar': {'type': 'string', 'description': 'Marketing-plan pillar key (defaults to the pillar that owns this agent).'}, 'severity': {'enum': ['critical', 'high', 'medium', 'low'], 'type': 'string'}, 'strategy': {'type': 'string', 'description': 'Markdown brief/rationale shown under "View strategy".'}, 'agent_key': {'type': 'string', 'description': 'Teammate agent key (e.g. "paid", "copy", "seo") — must match a child dashboard\'s agent key under this manager.'}, 'conditions': {'type': 'string', 'description': "Manager's extra conditions/constraints in free text (budget, timing, approvals). Shown on the card."}, 'depends_on': {'type': 'array', 'items': {'type': 'string'}, 'description': 'agent_keys whose deliverables must come FIRST (e.g. paid depends_on ["copy"]). Shown on the card so the agent waits.'}}}, 'description': "One entry per target agent. Each becomes a strategy card on that agent's dashboard."}, 'manager_token': {'type': 'string', 'description': 'Public token of the manager (Turundusjuht) dashboard doing the delegating.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['file_id'], 'properties': {'file_id': {'type': 'string', 'description': 'Drive file or folder id to delete.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['review_id'], 'properties': {'review_id': {'type': 'string', 'description': 'review_id from get_google_business_reviews.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['tag_id'], 'properties': {'tag_id': {'type': ['string', 'integer'], 'description': 'Tag id from list_gtm_tags'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token', 'widget_id'], 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token'}, 'task_id': {'type': 'integer', 'description': 'Task ID within the strategy card. Either task_id or task_number is required. task_id wins if both supplied.'}, 'widget_id': {'type': 'integer', 'description': 'Strategy card widget ID'}, 'task_number': {'type': 'integer', 'description': 'Alternative to task_id: 1-indexed order of the task within the strategy card (as shown in get_strategy_status output).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'live': {'type': 'boolean', 'default': False, 'description': 'Run a bounded read-only provider check when supported.'}, 'service': {'type': 'string', 'description': 'Optional service ID. Omit to diagnose every project connection.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['service'], 'properties': {'service': {'type': 'string', 'description': 'Service ID to disconnect'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['target'], 'properties': {'limit': {'type': 'integer', 'default': 50, 'description': 'Max keywords to return (1–1000)'}, 'target': {'type': 'string', 'description': 'Domain to inspect (e.g. example.ee — no protocol)'}, 'language_code': {'type': 'string', 'default': 'et', 'description': 'Language code (et, en, ru, fi, ...)'}, 'location_code': {'type': 'integer', 'default': 2233, 'description': 'DataForSEO location code (2233 = Estonia)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this campaign should start spending again.'}, 'campaign_id': {'type': 'string', 'description': 'Campaign id from list_google_ads_campaigns, e.g. "20713245160" (digits only, not the resource name)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['ad_id'], 'properties': {'ad_id': {'type': 'string', 'description': 'Meta ad id from list_meta_ads (digits).'}, 'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this ad should start spending again.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['adset_id'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this ad set should start spending again.'}, 'adset_id': {'type': 'string', 'description': 'Meta ad set id from list_meta_adsets (digits).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this campaign should start spending again.'}, 'campaign_id': {'type': 'string', 'description': 'Meta campaign id from list_meta_campaigns (digits).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Result id returned by search.'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['id', 'title', 'text', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'text': {'type': 'string'}, 'title': {'type': 'string'}, 'metadata': {'type': 'object', 'additionalProperties': True}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['sections'], 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'sections': {'type': 'object'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['prompt', 'purpose'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 10, 'description': 'Photo-bank tags for finding the image later, e.g. ["kevadkampaania", "köök"].'}, 'prompt': {'type': 'string', 'description': 'What the image shows: subject, setting, composition, light, mood (any language, max 4000 characters). No personal data — names, e-mails, phone numbers.'}, 'purpose': {'enum': ['social_post', 'ad', 'blog'], 'type': 'string', 'description': 'Where it will be used; sets the default aspect_ratio (social_post and ad → 4:5, blog → 16:9).'}, 'aspect_ratio': {'enum': ['1:1', '4:5', '3:4', '9:16', '16:9'], 'type': 'string', 'description': '4:5 = Instagram/Facebook feed, 9:16 = story or reel, 1:1 = square, 3:4 = tall feed post, 16:9 = blog header or link preview. Defaults from purpose.'}, 'brand_overlay': {'type': 'boolean', 'default': False, 'description': "Composite the client's logo from the brand guide: corner from its logo rules, margin inside the safe zone, light or dark variant by the background."}, 'logo_position': {'enum': ['top_left', 'top_right', 'bottom_left', 'bottom_right'], 'type': 'string', 'description': "Override the logo corner when the brand guide's rules do not fit this format (only with brand_overlay)."}, 'reference_image_ids': {'type': 'array', 'items': {'type': 'integer'}, 'maxItems': 3, 'description': "Up to 3 photo-bank ids (list_creative_assets) sent as visual references, e.g. the client's product or premises. Images flagged do_not_publish are refused."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of automations to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of campaigns to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'email': {'type': 'string', 'description': 'Filter by email address'}, 'limit': {'type': 'integer', 'default': 20, 'description': 'Number of contacts to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of deals to return'}, 'stage': {'type': 'string', 'description': 'Filter by pipeline stage'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'Optional. One URL of the connected site to list its linking pages + anchors.'}, 'page': {'type': 'integer', 'minimum': 0, 'description': 'Result page, 0-based (default 0).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 10}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 10}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['urls'], 'properties': {'urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20, 'minItems': 1, 'description': 'Full URLs of the connected site.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of posts to return'}, 'handle': {'type': 'string', 'description': 'Bluesky handle to get feed for. Defaults to connected account.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of followers to return'}, 'handle': {'type': 'string', 'description': 'Bluesky handle. Defaults to connected account.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of notifications to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'handle': {'type': 'string', 'description': 'Bluesky handle (e.g., user.bsky.social). Defaults to connected account.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id'], 'properties': {'campaign_id': {'type': 'integer', 'description': 'Email campaign ID'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'dimensions': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 3, 'description': 'Optional breakdown dimensions (up to 3): Browser, Device, OS, Country, URL, Source, Medium, Campaign, Channel, NewVsReturning'}, 'num_of_days': {'enum': [1, 2, 3], 'type': 'integer', 'default': 3, 'description': 'Number of days to analyze (1, 2, or 3 — Clarity API limit)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 50, 'description': 'Max messages (newest threads first).'}, 'token': {'type': 'string', 'description': 'Dashboard public_token. Omit for your own dashboard.'}, 'unread_only': {'type': 'boolean', 'default': True}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'open_only': {'type': 'boolean', 'description': 'Only requests that are not done (default true).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['service'], 'properties': {'service': {'type': 'string', 'description': 'Service ID (e.g., slack, ga4, github, stripe)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string', 'description': 'The public_token returned when the dashboard was created'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token (agent or manager dashboard, same project as your auth).'}, 'ttl_minutes': {'type': 'integer', 'default': 15, 'description': 'How long the link itself stays openable (1–60). The unlock it grants lasts 24h regardless.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['request_id'], 'properties': {'request_id': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'include_snapshot_schema': {'type': 'boolean', 'description': 'Also return the snapshot shape (default false).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['document_id'], 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'document_id': {'type': 'integer'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['document_id'], 'properties': {'document_id': {'type': 'string', 'description': 'Google Doc id (from the URL).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['file_id'], 'properties': {'file_id': {'type': 'string', 'description': 'Drive file id (from list_drive_files or search_drive).'}, 'mime_type': {'type': 'string', 'description': 'Optional override of the export mime type.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'from': {'type': 'string', 'description': 'Only include messages from this email address.'}, 'limit': {'type': 'integer', 'default': 50}, 'folder': {'type': 'string', 'description': 'Mailbox folder to read. Accepts inbox, sent/Sent, sentitems/Sent Items, drafts, archive, junk/spam, deleted/trash.'}, 'status': {'enum': ['sent', 'scheduled', 'draft', 'failed'], 'type': 'string', 'description': 'Legacy alias for folder where possible: sent maps to the sent mailbox, draft maps to drafts. scheduled/failed are not mailbox folders.'}, 'end_date': {'type': 'string', 'description': 'Only include emails on or before this date (YYYY-MM-DD).'}, 'start_date': {'type': 'string', 'description': 'Only include emails on or after this date (YYYY-MM-DD).'}, 'unread_only': {'type': 'boolean', 'description': 'Only include unread messages.'}, 'subject_contains': {'type': 'string', 'description': 'Only include messages whose subject contains this text.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date'}, 'aggregate': {'type': 'boolean', 'default': False}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 50}, 'metrics': {'type': 'array', 'items': {'enum': ['views', 'reactions', 'likes', 'comments', 'shares'], 'type': 'string'}, 'description': 'Optional subset of per-post metrics to return: views, reactions, likes, comments, shares. Omit for all.'}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'host': {'type': 'string', 'description': 'Optional. Limit to one hostname of the property (GA4 hostName), e.g. "kookjakodu.fi" — for properties that measure several domains. "www." is matched too.'}, 'metric': {'type': 'string', 'description': 'Optional. When set, return only this metric field. Use for metric_card widgets. Valid values: sessions, users, pageviews, bounce_rate, avg_session_duration, engagement_rate'}, 'country': {'type': 'string', 'description': 'Optional. Limit to visitors from one country — GA4 country name, e.g. "Estonia", "Finland".'}, 'end_date': {'type': 'string', 'format': 'date', 'description': 'End date (YYYY-MM-DD)'}, 'aggregate': {'type': 'boolean', 'default': False, 'description': 'Return single aggregated row'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'host': {'type': 'string', 'description': 'Optional. Limit to one hostname of the property (GA4 hostName), e.g. "kookjakodu.fi" — for properties that measure several domains. "www." is matched too.'}, 'country': {'type': 'string', 'description': 'Optional. Limit to visitors from one country — GA4 country name, e.g. "Estonia", "Finland".'}, 'end_date': {'type': 'string', 'format': 'date'}, 'breakdown': {'enum': ['channel', 'social_sources'], 'type': 'string', 'description': 'channel (default): one row per channel group. social_sources: Organic Social sessions and key events per day and platform (facebook, instagram, tiktok, linkedin, youtube, other) — website visits from organic posts.'}, 'key_events': {'type': 'array', 'items': {'type': 'string'}, 'description': 'GA4 key-event names to add as per-channel columns, e.g. ["generate_lead", "click_to_call", "kirjuta_meile"]. Total key_events is always included.'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'host': {'type': 'string', 'description': 'Optional. Limit to one hostname of the property (GA4 hostName), for properties that measure several shops.'}, 'limit': {'type': 'integer', 'description': 'products only: how many (default 10, max 50)'}, 'country': {'type': 'string', 'description': 'Optional. Limit to buyers from one country — GA4 country name, e.g. "Estonia".'}, 'end_date': {'type': 'string', 'format': 'date', 'description': 'End date (YYYY-MM-DD)'}, 'breakdown': {'enum': ['totals', 'daily', 'channels', 'products'], 'type': 'string', 'description': 'totals (default) · daily · channels · products'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'host': {'type': 'string', 'description': 'Optional. Limit to one hostname of the property (GA4 hostName), e.g. "kookjakodu.fi" — for properties that measure several domains. "www." is matched too.'}, 'limit': {'type': 'integer', 'default': 20}, 'country': {'type': 'string', 'description': 'Optional. Limit to visitors from one country — GA4 country name, e.g. "Estonia", "Finland".'}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}, 'key_events_only': {'type': 'boolean', 'default': False, 'description': 'Only show key events (conversions)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 10}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 10}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date', 'description': 'End date (YYYY-MM-DD, today, yesterday, or NdaysAgo).'}, 'breakdown': {'enum': ['campaign', 'daily', 'search_terms', 'conversion_actions', 'changes'], 'type': 'string', 'description': 'campaign (default): one row per campaign for the whole range. daily: one row per day for the whole account (date, impressions, clicks, cost/spend, conversions) — for trend charts. search_terms: the search terms that brought conversions (term, conversions, cost, clicks, cpa). conversion_actions: conversions per conversion action (form, call, …). changes: the account change history, last 30 days max (at, resource, operation, fields, campaign, ad_group, by = user email, client = UI/API, new_status, negative, keyword).'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD, today, yesterday, or NdaysAgo such as 30daysAgo). Omit both dates to get the last 28 days.'}, 'campaign_id': {'type': 'string', 'description': 'Specific campaign ID (optional)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max combination rows (default 100).'}, 'end_date': {'type': 'string', 'description': 'YYYY-MM-DD. Default: yesterday.'}, 'start_date': {'type': 'string', 'description': 'YYYY-MM-DD. Default: 30 days before end_date.'}, 'campaign_id': {'type': 'string', 'description': 'Only this campaign.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'description': 'e.g. SELECT campaign.name, metrics.search_budget_lost_impression_share FROM campaign WHERE segments.date DURING LAST_30_DAYS'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'end_date': {'type': 'string', 'description': 'YYYY-MM-DD. Default: yesterday.'}, 'start_date': {'type': 'string', 'description': 'YYYY-MM-DD. Default: 30 days before end_date.'}, 'brand_terms': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Brand spellings, e.g. ["firmus","firmus elekter"], to measure brand share of PMax search terms.'}, 'campaign_id': {'type': 'string', 'description': 'Only this PMax campaign.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 1000, 'minimum': 1, 'description': 'Max rows, by cost (default 200).'}, 'end_date': {'type': 'string', 'description': 'YYYY-MM-DD. Default: yesterday.'}, 'start_date': {'type': 'string', 'description': 'YYYY-MM-DD. Default: 30 days before end_date.'}, 'campaign_id': {'type': 'string', 'description': 'Only this campaign.'}, 'include_pmax': {'type': 'boolean', 'description': 'Also Performance Max search terms (default true).'}, 'min_cost_eur': {'type': 'number', 'description': 'Only queries that cost at least this much (default 0).'}, 'only_without_conversions': {'type': 'boolean', 'description': 'Only queries with 0 conversions.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'days': {'type': 'integer', 'description': 'Only show alerts from last N days'}, 'limit': {'type': 'integer', 'default': 20, 'description': 'Number of alerts to return'}, 'refresh': {'type': 'boolean', 'default': False, 'description': 'Fetch fresh alerts from RSS before returning'}, 'category': {'type': 'string', 'description': 'Filter by category (News, Blog, Social Media, etc)'}, 'sentiment': {'enum': ['positive', 'negative', 'neutral'], 'type': 'string', 'description': 'Filter by sentiment'}, 'unread_only': {'type': 'boolean', 'default': False, 'description': 'Only show unread alerts'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Optional, search_keywords only: how many terms, most impressions first (default 50).'}, 'end_date': {'type': 'string', 'format': 'date'}, 'breakdown': {'enum': ['total', 'daily', 'search_keywords'], 'type': 'string', 'description': 'Optional. total (default): one sum per metric. daily: one row per day. search_keywords: {months, keywords: [{term, impressions, fewer_than}]} — Google hides small counts, such a term has impressions null and fewer_than (e.g. 15).'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Optional, with with_summary only: how many reviews to read, newest first (default 50, max 500). answered/unanswered count these; complete=true means every review was read.'}, 'with_summary': {'type': 'boolean', 'description': 'Optional. true: answer an object with the rating summary and the reply count next to the reviews (newest first). Default false: the plain list of the latest reviews.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Max brand queries to return'}, 'country': {'type': 'string', 'description': 'Optional ISO-3166-1 alpha-3 country code, e.g. "est", "fin", to compute the brand share in one search market.'}, 'end_date': {'type': 'string', 'format': 'date'}, 'site_url': {'type': 'string', 'description': 'Optional. Another Search Console property of the SAME client instead of the connected one. Only properties an admin listed for this project are accepted.'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}, 'brand_keyword': {'type': 'string', 'description': 'Brand name to filter queries by (case-insensitive contains match)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'days': {'type': 'integer', 'default': 30, 'description': 'Lookback window in days (used when start_date/end_date are omitted).'}, 'page': {'type': 'string', 'description': 'Only count rankings of pages whose URL contains this substring.'}, 'top_n': {'type': 'integer', 'default': 6, 'description': 'How many tracked keywords to auto-select when keywords is omitted (best current SeoShark position first).'}, 'country': {'type': 'string', 'description': 'ISO-3166-1 alpha-3 country code, e.g. "est", "fin".'}, 'summary': {'type': 'boolean', 'default': False, 'description': 'Return one row per keyword instead of daily rows: {keyword, position (impression-weighted avg of the last 7 reported days), previous_position (the 7 days before), change (+ = improved), clicks_7d, impressions_7d, days_seen_7d}. Use for a "hetkeseis" table widget next to the rank-trend chart.'}, 'end_date': {'type': 'string', 'format': 'date'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Exact search terms to track (max 20). Omit to use the SeoShark tracked keyword list.'}, 'site_url': {'type': 'string', 'description': 'Optional. Another Search Console property of the SAME client (e.g. "sc-domain:kookjakodu.fi") instead of the connected one. Only properties an admin listed for this project (dashboard Seaded → Domeenid) are accepted.'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 30 days.'}, 'with_impressions': {'type': 'boolean', 'default': False, 'description': 'Daily rows only: add "_impressions": {"<keyword>": n} to each day, so an average over several days can be weighted by impressions the way Search Console averages a period (a day with one search must not count as much as a day with forty). Leave it off for chart_line widgets — they draw every key as a line.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 10}, 'query': {'type': 'string', 'description': 'Optional search-query substring filter. Use this when you need pages that ranked for a specific term.'}, 'country': {'type': 'string', 'description': 'Optional ISO-3166-1 alpha-3 country code, e.g. "est", "fin", to limit pages to one search market.'}, 'end_date': {'type': 'string', 'format': 'date'}, 'site_url': {'type': 'string', 'description': 'Optional. Another Search Console property of the SAME client (e.g. "sc-domain:kookjakodu.fi") instead of the connected one. Only properties an admin listed for this project (dashboard Seaded → Domeenid) are accepted.'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'page': {'type': 'string', 'description': 'Only queries for pages whose URL contains this substring, e.g. "/fi/".'}, 'limit': {'type': 'integer', 'default': 10}, 'country': {'type': 'string', 'description': 'ISO-3166-1 alpha-3 country code, e.g. "fin", "est", "swe", "nor".'}, 'end_date': {'type': 'string', 'format': 'date'}, 'site_url': {'type': 'string', 'description': 'Optional. Another Search Console property of the SAME client (e.g. "sc-domain:kookjakodu.fi") instead of the connected one. Only properties an admin listed for this project (dashboard Seaded → Domeenid) are accepted.'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 50}, 'metrics': {'type': 'array', 'items': {'enum': ['views', 'reach', 'total_interactions', 'likes', 'comments', 'shares', 'saves'], 'type': 'string'}, 'description': 'Optional subset of per-post metrics to return: views, reach, total_interactions, likes, comments, shares, saves. Omit for all.'}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of forms to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['form_id'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of submissions to return'}, 'form_id': {'type': 'string', 'description': 'Form ID to get submissions for'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'default': 50, 'description': 'Max posts to inspect (1-100). Each post costs one analytics call, so keep it modest.'}, 'metrics': {'type': 'array', 'items': {'enum': ['impressions', 'unique_impressions', 'clicks', 'reactions', 'comments', 'reposts', 'engagement_rate'], 'type': 'string'}, 'description': 'Optional subset of per-post metrics to return: impressions, unique_impressions, clicks, reactions, comments, reposts, engagement_rate. Omit for all.'}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Product rows to return (default 100).'}, 'severity': {'enum': ['DISAPPROVED', 'DEMOTED', 'NOT_IMPACTED', 'ANY'], 'type': 'string', 'description': 'Only issues of this severity (default ANY).'}, 'only_issues': {'type': 'boolean', 'description': 'Only products with at least one issue (default true).'}, 'max_products': {'type': 'integer', 'maximum': 5000, 'minimum': 1, 'description': 'Products to scan (default 1000).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max ads (default 200).'}, 'status': {'enum': ['active', 'with_issues', 'all'], 'type': 'string', 'description': 'active = ACTIVE; with_issues = DISAPPROVED / WITH_ISSUES / PENDING_REVIEW; all = also paused (default active).'}, 'adset_id': {'type': 'string'}, 'spend_days': {'type': 'integer', 'maximum': 90, 'minimum': 1, 'description': 'Spend window for the spend share (default 28).'}, 'campaign_id': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'level': {'enum': ['ad', 'adset', 'campaign'], 'type': 'string', 'description': 'Default ad.'}, 'limit': {'type': 'integer', 'maximum': 2000, 'minimum': 1, 'description': 'Max rows (default 500).'}, 'adset_id': {'type': 'string'}, 'end_date': {'type': 'string', 'description': 'YYYY-MM-DD. Default: yesterday.'}, 'breakdowns': {'type': 'array', 'items': {'enum': ['age', 'gender', 'country', 'region', 'publisher_platform', 'platform_position', 'device_platform', 'impression_device'], 'type': 'string'}, 'description': 'Max 2. Placement: ["publisher_platform","platform_position"].'}, 'start_date': {'type': 'string', 'description': 'YYYY-MM-DD. Default: 28 days before end_date.'}, 'active_only': {'type': 'boolean', 'description': 'Only ads/ad sets/campaigns delivering now (default false).'}, 'campaign_id': {'type': 'string'}, 'result_action': {'type': 'string', 'description': 'Action type counted as the result, e.g. lead, purchase, offsite_conversion.fb_pixel_lead, onsite_conversion.lead_grouped, complete_registration, link_click. Default: lead, else purchase, else link_click.'}, 'time_increment': {'enum': ['1', '7', 'all_days'], 'type': 'string', 'description': '1 = daily, 7 = weekly, all_days = one row per object (default 7).'}, 'target_cost_per_result': {'type': 'number', 'description': 'Target CPA in account currency: fatigue is judged only for ads that spent at least 2× this in the period.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date', 'description': 'End date (YYYY-MM-DD, today, yesterday, or NdaysAgo).'}, 'breakdown': {'enum': ['campaign', 'daily', 'ads', 'conversion_actions', 'changes'], 'type': 'string', 'description': 'campaign (default): one row per campaign for the whole range (with effective_status, updated_time). daily: one row per day for the whole account (date, impressions, clicks, cost/spend, conversions, leads) — for trend charts. ads: the ads that brought leads (ad, campaign, leads, spend, cpl). conversion_actions: lead-type actions with counts (also 0) + the account pixels with last_fired. changes: the account activity log (at, type, label, object, by).'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD, today, yesterday, or NdaysAgo such as 30daysAgo). Omit both dates to get the last 28 days.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'days': {'type': 'integer', 'maximum': 28, 'minimum': 1, 'description': 'Look-back (default 7).'}, 'pixel_id': {'type': 'string', 'description': 'Only this pixel/dataset (default: all of the ad account).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'request_id': {'type': 'string', 'description': 'Optional Data Manager request id.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'manager_token': {'type': 'string', 'description': "Manager dashboard token (optional; defaults to the project's manager dashboard)."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'event': {'type': 'string', 'description': 'Filter by event name'}, 'limit': {'type': 'integer', 'default': 20, 'description': 'Number of events to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of feature flags to return'}, 'active': {'type': 'boolean', 'description': 'Filter by active status'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of insights to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of persons to return'}, 'search': {'type': 'string', 'description': 'Search query for persons'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'package': {'enum': ['starter', 'business', 'enterprise'], 'type': 'string', 'description': 'Credit package: starter (1,000 credits / €20), business (3,000 / €50), enterprise (10,000 / €100). Default: starter.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of domains to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of emails to return'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'page': {'type': 'string', 'description': 'Optional. Limit the daily totals to pages whose URL contains this text, e.g. "/fi/" for a section. Not a breakdown — for rows per URL use get_gsc_top_pages.'}, 'limit': {'type': 'integer', 'description': 'NOT supported here — this tool returns daily totals. Use get_gsc_top_queries / get_gsc_top_pages with limit for ranked breakdown rows.'}, 'metric': {'type': 'string', 'description': 'Optional. When set, return only this metric field. Use for metric_card widgets. Valid values: clicks, impressions, ctr, position'}, 'country': {'type': 'string', 'description': 'Optional. Limit the daily totals to one market — ISO-3166-1 alpha-3, e.g. "est", "fin".'}, 'end_date': {'type': 'string', 'format': 'date', 'description': 'End date (YYYY-MM-DD, today, yesterday, or NdaysAgo).'}, 'site_url': {'type': 'string', 'description': 'Optional. Another Search Console property of the SAME client (e.g. "sc-domain:kookjakodu.fi") instead of the connected one. Only properties an admin listed for this project (dashboard Seaded → Domeenid) are accepted.'}, 'aggregate': {'type': 'boolean', 'default': False}, 'row_limit': {'type': 'integer', 'description': 'NOT supported here — use get_gsc_top_queries / get_gsc_top_pages with `limit`.'}, 'dimensions': {'type': 'array', 'items': {'type': 'string'}, 'description': 'NOT supported here — this tool returns daily totals. For a breakdown by search term use get_gsc_top_queries, by URL use get_gsc_top_pages.'}, 'page_exact': {'type': 'string', 'description': 'Optional. Limit the daily totals to ONE URL exactly as Search Console reports it, e.g. "https://www.example.ee/hinnad/". Use this for a single page — `page` with the home page URL would match the whole site.'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD, today, yesterday, or NdaysAgo such as 30daysAgo). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token. Omit for your own dashboard.'}, 'domain': {'type': 'string', 'description': 'Optional domain context from the dashboard. The read returns all configured domains; use update_seo_dashboard domain=<host> when writing a domain-specific section.'}, 'market': {'type': 'string', 'description': 'Optional market context from the dashboard, e.g. "est" or "fin". The read returns all markets; use update_seo_dashboard market=<code> when writing a market-specific section.'}, 'include_schema': {'type': 'boolean', 'default': True, 'description': 'Include the section schema/guidance (set false for a compact status read).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'type': {'enum': ['all', 'dofollow', 'nofollow', 'toxic'], 'type': 'string', 'default': 'all'}, 'limit': {'type': 'integer', 'default': 100}, 'domain': {'type': 'string', 'description': 'Optional safety check. This tool can only read the domain attached to the connected SeoShark project; for arbitrary domains use backlinks_summary(target=domain).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'word_cloud_limit': {'type': 'integer', 'default': 50, 'description': 'Top N terms in the word cloud'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keyword'], 'properties': {'limit': {'type': 'integer', 'description': 'Ignored compatibility field. Keyword history returns the full available history for the keyword.'}, 'keyword': {'type': 'string', 'description': 'Keyword to look up history for'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 50, 'description': 'Max keywords to return'}, 'country': {'type': 'string', 'description': 'Select which SeoShark project by country (e.g. "EE", "FI") when the project has more than one. Defaults to the first.'}, 'keyword': {'type': 'string', 'description': 'Filter to a single keyword (optional)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'days': {'type': 'integer', 'default': 30, 'description': 'Lookback window in days'}, 'top_n': {'type': 'integer', 'default': 5, 'description': 'How many top-ranking keywords to plot when keywords[] is empty'}, 'country': {'type': 'string', 'description': 'When the project has more than one SeoShark project (e.g. "EE" and "FI"), select which by country code. Defaults to the first connection.'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Specific keywords to plot. Leave empty to auto-pick top_n.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'after': {'type': 'string', 'description': "Pagination cursor from a previous call's next_after."}, 'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Comments per page, default 25.'}, 'channel': {'enum': ['facebook', 'instagram', 'tiktok', 'linkedin'], 'type': 'string'}, 'post_id': {'type': 'string', 'description': "Provider post/media id. Facebook also accepts a comment id here to list that comment's replies."}, 'social_post_id': {'type': 'integer', 'minimum': 1, 'description': 'Optional SharksAPI social post id; used to infer channel and provider_post_id for a published post.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Max posts (bars) in the chart across both channels (default 20, max 40).'}, 'end_date': {'type': 'string', 'description': 'End date (YYYY-MM-DD or today). Defaults to today.'}, 'start_date': {'type': 'string', 'description': 'Start date (YYYY-MM-DD or daysAgo:N). Defaults to 28 days ago.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'days': {'type': 'integer', 'default': 30, 'description': 'Look-back window in days (1-365)'}, 'limit': {'type': 'integer', 'default': 20, 'description': 'Max results per source (1-100)'}, 'query': {'type': 'string', 'description': 'Brand name, hashtag, or keyword to search (e.g. "IST International School" or "ist.ee")'}, 'refresh': {'type': 'boolean', 'default': False, 'description': 'Bypass all per-source caches for this call'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['social_post_id'], 'properties': {'social_post_id': {'type': 'integer', 'minimum': 1}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token'}, 'task_id': {'type': 'integer', 'description': 'Optional compatibility lookup: when you only know a task id, the platform infers the owning strategy card and returns that card status.'}, 'task_ids': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Optional compatibility lookup for copied task lists. The first valid task id is used to infer the strategy card.'}, 'widget_id': {'type': 'integer', 'description': 'Strategy card widget ID. Optional when the dashboard has exactly one strategy card; otherwise the error returns the available card ids.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string', 'description': 'Manager dashboard public_token (the one whose layout_config.dashboard_role = manager).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['slug'], 'properties': {'slug': {'type': 'string'}, 'version': {'type': 'integer', 'description': 'Optional specific version. Omit for canonical/latest.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['publish_id'], 'properties': {'publish_id': {'type': 'string', 'description': 'The publish_id returned by post_tiktok_video.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'end_date': {'type': 'string', 'format': 'date', 'description': 'Ignored. TikTok Display API video listing is newest-first; filter returned videos client-side by create_time if you need a date window.'}, 'max_count': {'type': 'integer', 'description': 'How many videos to return (default 20, newest first)'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Ignored. TikTok Display API video listing is newest-first; filter returned videos client-side by create_time if you need a date window.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': 'Start date (YYYY-MM-DD). Omit both dates to get the last 28 days; the response carries the dates actually used, so report the period from those rather than assuming.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'max_results': {'type': 'integer', 'default': 10}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'days': {'type': 'integer', 'description': 'Number of days to look back (default: 30, max: 90)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['page_id'], 'properties': {'page_id': {'type': 'integer'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['post_id'], 'properties': {'post_id': {'type': 'integer', 'description': 'WordPress post ID'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['object_id'], 'properties': {'type': {'type': 'string', 'description': 'posts (default) or pages.'}, 'object_id': {'type': 'integer', 'description': 'Post or page ID.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['channel', 'comment_id'], 'properties': {'hide': {'type': 'boolean', 'description': 'Default true. Pass false to unhide a previously hidden comment.'}, 'channel': {'enum': ['facebook', 'instagram', 'tiktok', 'linkedin'], 'type': 'string'}, 'comment_id': {'type': 'string', 'description': 'The comment to hide or unhide, from get_social_comments.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['urls'], 'properties': {'url': {'type': 'string', 'description': 'Compatibility alias for one URL; the platform converts it to urls[].'}, 'urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20, 'minItems': 1, 'description': 'Full URLs inside the property, e.g. ["https://example.ee/teenused/"].'}, 'site_url': {'type': 'string', 'description': 'Optional. Another Search Console property of the SAME client that an admin enabled for this project.'}, 'language_code': {'type': 'string', 'description': 'Language for the human-readable issue messages (default "en").'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'days': {'type': 'integer', 'default': 7, 'maximum': 30, 'minimum': 1}, 'limit': {'type': 'integer', 'default': 50, 'maximum': 100, 'minimum': 1}, 'task_id': {'type': 'string', 'description': 'Optional exact A2A task ID for one project-scoped run.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['email'], 'properties': {'name': {'type': 'string', 'description': 'Their name (optional, used in the greeting)'}, 'role': {'enum': ['owner', 'member'], 'type': 'string', 'description': 'owner (default) may take money decisions; member may approve other work'}, 'email': {'type': 'string', 'description': "The person's e-mail address"}, 'landing': {'enum': ['index.html', 'inbox', 'plan', 'connections'], 'type': 'string', 'description': 'Dashboard page the link opens (default index.html)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['email'], 'properties': {'name': {'type': 'string', 'description': 'Optional display name for the teammate.'}, 'email': {'type': 'string', 'format': 'email', 'description': "The teammate's email — also the owner_email of the agent that will be created for them."}, 'scopes': {'type': 'array', 'items': {'enum': ['marketing:read', 'marketing:write', 'sales:read', 'sales:write', 'office:read', 'office:write'], 'type': 'string'}, 'description': 'Access scopes to grant. Defaults to FULL access (all six) — the same level the inviter has.'}, 'expires_days': {'type': 'integer', 'default': 7, 'description': 'Days the invite link stays valid (1-30). Default 7.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'url': {'type': 'string', 'description': 'Optional seed URL — Google will extract keywords from this page'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Seed keywords to generate ideas from (e.g. ["digital marketing", "SEO"])'}, 'language': {'type': 'string', 'description': 'Language criterion ID (e.g. "1000" for English, "1043" for Estonian). Default: "1000"'}, 'location': {'type': 'string', 'description': 'Location criterion ID (e.g. "2233" for Estonia, "2840" for USA). Default: "2233"'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keywords'], 'properties': {'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Keywords to get search volumes for (e.g. ["SEO audit", "keyword research tool"])'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keywords'], 'properties': {'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Keywords to look up (batch supported, typically up to ~1000)'}, 'language_code': {'type': 'string', 'default': 'et', 'description': 'Language code (et, en, ru, fi, ...)'}, 'location_code': {'type': 'integer', 'default': 2233, 'description': 'DataForSEO location code (2233 = Estonia)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string', 'description': 'Public token of the agent dashboard to link.'}, 'agent_key': {'type': 'string', 'description': 'Stable slug for this agent in the team (e.g. "seo"). Should match a manager plan pillar\'s agent_keys.'}, 'agent_icon': {'type': 'string'}, 'agent_name': {'type': 'string'}, 'agent_accent': {'type': 'string'}, 'manager_token': {'type': ['string', 'null'], 'description': 'Public token of the manager dashboard to attach under. Pass null to DETACH and make this a standalone dashboard again.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 20, 'minimum': 1, 'description': 'Runs per agent; default 5'}, 'channel': {'type': 'string', 'description': 'Only this channel'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'days': {'type': 'integer', 'maximum': 365, 'minimum': 1, 'description': 'Changes made in the last N days (default 90).'}, 'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max rows, newest first (default 30).'}, 'target': {'type': 'string', 'description': 'Only changes whose page URL, title or campaign contains this text.'}, 'channel': {'enum': ['seo', 'google_ads', 'meta_ads'], 'type': 'string', 'description': 'Only this channel.'}, 'measured_only': {'type': 'boolean', 'description': 'Only changes with at least one reading (default false).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'tag': {'type': 'string', 'description': 'Only images with this tag.'}, 'limit': {'type': 'integer', 'default': 50, 'description': 'Max images (1–200).'}, 'since': {'type': 'string', 'description': "YYYY-MM-DD: only images taken (camera date) or added on or after this date — use it to leave out last year's photos."}, 'source': {'enum': ['generated', 'brand', 'client_upload'], 'type': 'string', 'description': 'Only images from this source.'}, 'publishable_only': {'type': 'boolean', 'default': False, 'description': 'Leave out do_not_publish images.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'type': {'enum': ['social_post', 'web_text', 'newsletter', 'blog', 'ad_text', 'event_text', 'campaign_message', 'seo_change'], 'type': 'string', 'description': 'Optional content type filter, e.g. blog, social_post, newsletter.'}, 'limit': {'type': 'integer', 'description': 'Max rows (default 25).'}, 'status': {'type': 'string', 'description': 'Filter by a single status, or "open" for the review queue.'}, 'draft_id': {'type': 'integer', 'description': 'Optional shortcut: when supplied, this inspects that one draft (same result as review_draft with action=inspect).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 50}, 'folder_id': {'type': 'string', 'description': 'Drive folder id. Omit to list root-level files.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'parent_id': {'type': 'string', 'description': 'Parent folder id. Omit to list root-level folders.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'description': 'End date/time (RFC3339) or token.'}, 'start_date': {'type': 'string', 'description': 'Start date/time (RFC3339, e.g. "2026-04-21T00:00:00Z") or token ("today", "yesterday", "7daysAgo").'}, 'max_results': {'type': 'integer', 'default': 50}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'page_size': {'type': 'integer', 'description': 'Posts per page, 1-100 (default 20).'}, 'page_token': {'type': 'string', 'description': 'next_page_token from the previous page.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'status': {'enum': ['ENABLED', 'PAUSED', 'ALL'], 'type': 'string', 'description': 'Filter by ad status. Default ALL (removed ads are always left out).'}, 'ad_group_id': {'type': 'string', 'description': 'Only the ads of this ad group (digits).'}, 'campaign_id': {'type': 'string', 'description': 'Only the ads of this campaign (digits, from list_google_ads_campaigns).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'status': {'enum': ['ENABLED', 'PAUSED', 'ALL'], 'type': 'string', 'description': 'Filter by campaign status. Default ALL (removed campaigns are always left out).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'status': {'enum': ['ENABLED', 'HIDDEN', 'ALL'], 'type': 'string', 'description': 'Filter by status. Default ALL (removed actions are always left out).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'include_keywords': {'type': 'boolean', 'description': 'List the keywords of each list (default true).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'site_url': {'type': 'string', 'description': 'Optional. Another Search Console property of the SAME client that an admin enabled for this project.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'search': {'type': 'string', 'description': 'Case-insensitive substring to match against tag names, e.g. "form" or "GA4"'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'category': {'type': 'string', 'description': 'Filter by category: seo, analytics, advertising, social, email, email_marketing, marketing_automation, cms, development, forms, office, reviews'}, 'auth_type': {'enum': ['api_key', 'oauth', 'webhook'], 'type': 'string', 'description': 'Filter by authentication type'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'status': {'enum': ['ACTIVE', 'PAUSED', 'ALL'], 'type': 'string', 'description': 'Filter by the status you set (ACTIVE / PAUSED). Default ALL; deleted and archived objects are always left out.'}, 'adset_id': {'type': 'string', 'description': 'Only the ads of this ad set.'}, 'campaign_id': {'type': 'string', 'description': 'Only the ads of this campaign.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'status': {'enum': ['ACTIVE', 'PAUSED', 'ALL'], 'type': 'string', 'description': 'Filter by the status you set (ACTIVE / PAUSED). Default ALL; deleted and archived objects are always left out.'}, 'campaign_id': {'type': 'string', 'description': 'Only the ad sets of this campaign (id from list_meta_campaigns).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'status': {'enum': ['ACTIVE', 'PAUSED', 'ALL'], 'type': 'string', 'description': 'Filter by the status you set (ACTIVE / PAUSED). Default ALL; deleted and archived objects are always left out.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Maximum rows to return (default all, cap 100).'}, 'month': {'type': 'integer', 'description': 'Only activities in this month (1-12).'}, 'status': {'type': 'string', 'description': 'planned | in_progress | done.'}, 'channel': {'type': 'string', 'description': 'Only activities of this channel / agent_key (e.g. seo, paid, content).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'path': {'type': 'string'}, 'limit': {'type': 'integer', 'default': 20}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'path': {'type': 'string', 'description': 'Folder relative to the WordPress root, e.g. "wp-content/themes/" or "wp-content/themes/sharks/inc/". Defaults to "wp-content/themes/".'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'page': {'type': 'integer', 'minimum': 1, 'description': 'Optional 1-based page number. Use with limit for pagination.'}, 'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'status': {'enum': ['pending_approval', 'approved', 'scheduled', 'queued', 'publishing', 'published', 'failed', 'cancelled', 'awaiting_manual'], 'type': 'string'}, 'channel': {'enum': ['facebook', 'instagram', 'tiktok', 'linkedin'], 'type': 'string'}, 'group_key': {'type': 'string', 'description': 'Only the variants submitted with this group_key.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'slug': {'type': 'string', 'description': 'Optional — restrict to one skill slug.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'properties': {'search': {'type': 'string', 'description': 'Substring to match in title/content, e.g. "kodulehe".'}, 'status': {'enum': ['publish', 'draft', 'pending', 'private', 'any'], 'type': 'string', 'description': 'publish (default), draft, pending, private, any.'}, 'per_page': {'type': 'integer', 'description': 'Max rows (default 20, cap 100).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'page': {'type': 'integer', 'default': 1}, 'after': {'type': 'string', 'description': 'Alias for start_date. Accepts YYYY-MM-DD or a WordPress REST after timestamp.'}, 'order': {'enum': ['asc', 'desc'], 'type': 'string', 'default': 'desc'}, 'before': {'type': 'string', 'description': 'Alias for end_date. Accepts YYYY-MM-DD or a WordPress REST before timestamp.'}, 'search': {'type': 'string', 'description': 'Search term'}, 'status': {'enum': ['publish', 'draft', 'pending', 'private', 'any'], 'type': 'string', 'default': 'publish', 'description': 'Post status filter'}, 'orderby': {'enum': ['date', 'title', 'modified'], 'type': 'string', 'default': 'date'}, 'end_date': {'type': 'string', 'description': 'Include posts published on or before this date (YYYY-MM-DD)'}, 'per_page': {'type': 'integer', 'default': 10, 'description': 'Posts per page'}, 'start_date': {'type': 'string', 'description': 'Include posts published on or after this date (YYYY-MM-DD)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['token', 'widget_id', 'action'], 'properties': {'force': {'type': 'boolean', 'default': False, 'description': 'Only with action=delete: delete even though the card has completed tasks. Requires an explicit user instruction.'}, 'token': {'type': 'string', 'description': "public_token of the dashboard the card lives on (the agent's dashboard — top_issues[].child_token)."}, 'action': {'enum': ['close', 'reopen', 'delete', 'pause', 'resume', 'set_severity', 'reassign', 'update_strategy'], 'type': 'string', 'description': 'What to do with the card. Weekly routine: when you start a new week\'s card, "close" the previous one (it moves to the Tehtud stack with its history) — never "delete" it. "delete" is refused for cards with completed tasks unless force=true.'}, 'severity': {'enum': ['critical', 'high', 'medium', 'low'], 'type': 'string', 'description': 'Required for action=set_severity.'}, 'strategy': {'type': 'string', 'description': 'Required for action=update_strategy — replacement markdown for the card detail.'}, 'widget_id': {'type': 'integer', 'description': 'Strategy card widget id (top_issues[].widget_id).'}, 'to_agent_key': {'type': 'string', 'description': 'Required for action=reassign — the teammate agent key to move the card to (e.g. "copy", "paid"). Must be another agent under the same manager.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'manager_token': {'type': 'string', 'description': "Manager dashboard token (optional; defaults to the project's manager dashboard)."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'role': {'type': 'string', 'description': 'Orchestrator only: compose for this channel role (e.g. seo, google_ads) to attach to a delegated task.'}, 'token': {'type': 'string', 'description': 'Ignored. Your role and scope come from the token you authenticate with; no dashboard token is needed here.'}, 'agent_key': {'type': 'string', 'description': 'Ignored. Your agent/channel identity comes from the token you authenticate with; use role only when an orchestrator composes context for another role.'}, 'project_id': {'type': 'integer', 'description': 'Ignored. Project scope comes from the authenticated token, not from a caller-supplied id.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {}}
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'type': {'enum': ['fact', 'decision', 'result', 'lesson', 'task_state', 'constraint'], 'type': 'string', 'description': 'Optional type filter.'}, 'limit': {'type': 'integer', 'description': 'Optional result cap. Default 25, maximum 25.'}, 'query': {'type': 'string'}, 'scope': {'type': 'string', 'description': 'Optional scope filter.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string'}, 'title': {'type': 'string'}, 'pinned': {'type': 'boolean'}, 'status': {'enum': ['hot', 'active', 'archived'], 'type': 'string'}, 'content': {'type': 'string'}, 'task_id': {'type': 'integer'}, 'expires_at': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['scope', 'type', 'content'], 'properties': {'date': {'type': 'string', 'format': 'date', 'description': 'Optional event date (YYYY-MM-DD). If content does not already start with a date, the platform prefixes this date before saving.'}, 'type': {'enum': ['fact', 'decision', 'result', 'lesson', 'task_state', 'constraint'], 'type': 'string'}, 'scope': {'type': 'string', 'description': 'global | channel:<slug> | private:<agent_id>'}, 'title': {'type': 'string', 'description': 'Short, searchable. If omitted, a short title is inferred from content.'}, 'pinned': {'type': 'boolean', 'description': 'Keep hot — exempt from consolidation demotion.'}, 'content': {'type': 'string', 'description': 'Markdown. Dated + measurable, e.g. "2026-07-09: valisime 5 fookusmärksõna, sest GSC näitas pos 8–15; siht TOP5 60 päevaga". Content over ~1000 chars is split into multiple bounded entries.'}, 'task_id': {'type': 'integer', 'description': 'Command-center task this task_state belongs to (dashboard strategy task id).'}, 'expires_at': {'type': 'string', 'description': 'ISO datetime for temporary facts.'}, 'supersedes_id': {'type': 'string', 'description': 'Replace this older entry (it gets archived).'}, 'source_session': {'type': 'string', 'description': 'Session identifier for traceability.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keywords'], 'properties': {'device': {'enum': ['desktop', 'mobile'], 'type': 'string', 'default': 'desktop'}, 'domain': {'type': 'string', 'description': 'Optional target domain to locate in the SERP; defaults to the project Search Console domain.'}, 'country': {'type': 'string', 'description': 'Alias for location. ISO country codes such as ee/est are accepted and normalized before the SERP check.'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Keywords to monitor'}, 'language': {'type': 'string', 'default': 'et', 'description': 'Search language'}, 'location': {'type': 'string', 'default': 'Estonia', 'description': 'Search location'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'end_date': {'type': 'string', 'description': 'Report end date (YYYY-MM-DD). Defaults to yesterday.'}, 'top_limit': {'type': 'integer', 'default': 10, 'description': 'Number of top queries/pages to include (default: 10)'}, 'start_date': {'type': 'string', 'description': 'Report start date (YYYY-MM-DD). Defaults to 30 days ago.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this campaign is being paused.'}, 'campaign_id': {'type': 'string', 'description': 'Campaign id from list_google_ads_campaigns, e.g. "20713245160" (digits only, not the resource name)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['ad_id'], 'properties': {'ad_id': {'type': 'string', 'description': 'Meta ad id from list_meta_ads (digits).'}, 'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this ad is being paused.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['adset_id'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this ad set is being paused.'}, 'adset_id': {'type': 'string', 'description': 'Meta ad set id from list_meta_adsets (digits).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this campaign is being paused.'}, 'campaign_id': {'type': 'string', 'description': 'Meta campaign id from list_meta_campaigns (digits).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['video_url', 'title'], 'properties': {'title': {'type': 'string', 'description': 'Caption/title, max 2200 chars, may contain #hashtags and @mentions.'}, 'is_aigc': {'type': 'boolean', 'description': 'Mark the video as AI-generated content (TikTok shows the AI-generated label). Set true for any video produced with AI tools.'}, 'video_url': {'type': 'string', 'description': 'Public HTTPS URL of the video file (mp4). Domain must be verified for the TikTok app.'}, 'disable_duet': {'type': 'boolean', 'description': 'Disallow duets.'}, 'privacy_level': {'enum': ['SELF_ONLY', 'MUTUAL_FOLLOW_FRIENDS', 'FOLLOWER_OF_CREATOR', 'PUBLIC_TO_EVERYONE'], 'type': 'string', 'description': "Default SELF_ONLY. Must be one of the creator's allowed options (checked automatically)."}, 'disable_stitch': {'type': 'boolean', 'description': 'Disallow stitches.'}, 'disable_comment': {'type': 'boolean', 'description': 'Turn off comments on this post.'}, 'brand_content_toggle': {'type': 'boolean', 'description': 'Commercial content disclosure: true when the video is a PAID partnership promoting a third-party business (TikTok adds the "Paid partnership" label).'}, 'brand_organic_toggle': {'type': 'boolean', 'description': "Commercial content disclosure: true when the video promotes the creator's OWN business/products (most company-account posts)."}, 'video_cover_timestamp_ms': {'type': 'integer', 'description': 'Frame (ms) to use as the cover image.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['slug', 'version'], 'properties': {'slug': {'type': 'string'}, 'version': {'type': 'integer'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['title'], 'properties': {'body': {'type': 'string', 'description': 'Optional detail / rationale.'}, 'title': {'type': 'string', 'description': 'Short title of the proposal.'}, 'agent_key': {'type': 'string', 'description': 'Optional. The proposing agent\'s key (e.g. "seo"); inferred from your linked agent dashboard when possible.'}, 'pillar_key': {'type': 'string', 'description': 'Optional pillar this input relates to.'}, 'manager_token': {'type': 'string', 'description': 'Optional. Public token of the manager dashboard whose plan to add the input to; inferred from your linked agent dashboard when possible.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['snapshot', 'diffs'], 'properties': {'note': {'type': 'string', 'description': 'One or two sentences for the growth lead: what the document changes and what you left out.'}, 'diffs': {'type': 'array', 'items': {'type': 'string'}, 'description': 'What changes, one line each, "before → after".'}, 'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'snapshot': {'type': 'object', 'description': 'The full plan as it should be after the change.'}, 'document_id': {'type': 'integer', 'description': 'The uploaded plan document this proposal answers.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token (agent or manager dashboard, same project as your auth).'}, 'end_date': {'type': 'string', 'format': 'date'}, 'start_date': {'type': 'string', 'format': 'date', 'description': "Optional YYYY-MM-DD; defaults to the dashboard's default range (usually last 30 days)."}, 'include_data': {'type': 'boolean', 'default': True, 'description': 'false = layout/status only (faster), true = fetch live data for every widget.'}, 'max_table_rows': {'type': 'integer', 'default': 25, 'description': 'Cap rows returned per table/chart widget to keep the payload small (max 100).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['spreadsheet_id', 'range'], 'properties': {'range': {'type': 'string', 'description': 'A1 range, e.g. "Sheet1!A1:D20".'}, 'spreadsheet_id': {'type': 'string', 'description': 'Spreadsheet id (from the URL).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['path'], 'properties': {'path': {'type': 'string', 'description': 'File relative to the WordPress root, e.g. "wp-content/themes/sharks/functions.php".'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['values'], 'properties': {'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'values': {'type': 'array', 'items': {'type': 'object', 'required': ['kpi_id', 'month', 'value'], 'properties': {'month': {'type': 'string'}, 'value': {'type': 'number'}, 'kpi_id': {'type': 'string'}}}}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['criterion_resource_name'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card: why this term should be allowed again.'}, 'criterion_resource_name': {'type': 'string', 'description': 'Full resource name, e.g. "customers/1234567890/campaignCriteria/20713245160~10023"'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['service'], 'properties': {'service': {'type': 'string', 'description': 'Service ID to retry.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['review_id', 'comment'], 'properties': {'comment': {'type': 'string', 'description': "The reply text, plain, in the reviewer's language."}, 'review_id': {'type': 'string', 'description': 'review_id from get_google_business_reviews (or the full accounts/…/locations/…/reviews/… name).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['channel', 'comment_id', 'message'], 'properties': {'channel': {'enum': ['facebook', 'instagram', 'tiktok', 'linkedin'], 'type': 'string'}, 'message': {'type': 'string', 'maxLength': 2200, 'description': 'Reply text posted publicly as the page/account.'}, 'comment_id': {'type': 'string', 'description': 'The comment to reply to, from get_social_comments.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['body'], 'properties': {'body': {'type': 'string', 'description': 'Your reply, plain text (max 5000 chars).'}, 'token': {'type': 'string', 'description': 'Dashboard public_token. Omit for your own dashboard.'}, 'thread': {'type': 'string', 'description': '"general" for the dashboard-wide thread (ignored when task_id is given).'}, 'task_id': {'type': 'integer', 'description': 'Strategy task id of the "Sinult on vaja" item (from get_client_messages or get_strategy_status).'}, 'resolve_task': {'type': 'boolean', 'default': False, 'description': 'You got what you needed: clear the human label and take the task back.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['what', 'why'], 'properties': {'why': {'type': 'string', 'description': 'What the photos are for, in the client\'s language, e.g. "oktoobri Instagrami postitused ja uus teenuseleht".'}, 'tags': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 10, 'description': 'Photo-bank tags the received photos get, e.g. ["köök", "referents"].'}, 'what': {'type': 'string', 'description': 'What to photograph, concretely and in the client\'s language, e.g. "valmis köögid päevavalges, horisontaalselt, ilma inimesteta".'}, 'count': {'type': 'integer', 'description': 'How many photos you need (1–50).'}, 'token': {'type': 'string', 'description': "The client's dashboard public_token (template seo or team). Omit for your own dashboard."}, 'task_id': {'type': 'integer', 'description': 'Ask under this "Sinult on vaja" item instead of the general thread.'}, 'deadline': {'type': 'string', 'description': 'YYYY-MM-DD, today or later.'}, 'people_expected': {'type': 'boolean', 'default': False, 'description': "true when the photos will show people (team, customers): the message then asks the client to confirm everyone's consent."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['backup_id'], 'properties': {'note': {'type': 'string', 'description': 'Why you restore.'}, 'backup_id': {'type': 'integer'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['social_post_id'], 'properties': {'first_comment': {'type': 'string', 'maxLength': 2200, 'description': 'Optional replacement comment text; omit to use the text stored on the post.'}, 'social_post_id': {'type': 'integer', 'minimum': 1}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['draft_id'], 'properties': {'body': {'type': 'string', 'description': 'New body text for the edit action.'}, 'note': {'type': 'string', 'description': 'Feedback for request_changes / reject.'}, 'action': {'enum': ['inspect', 'approve', 'request_changes', 'edit', 'schedule', 'reject', 'cancel', 'publish', 'retry'], 'type': 'string', 'description': 'The review action. Omit for inspect/read-only.'}, 'draft_id': {'type': 'integer', 'description': 'The draft to act on.'}, 'scheduled_at': {'type': 'string', 'description': 'Datetime for the schedule action (e.g. 2026-06-20 09:00).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['draft_id'], 'properties': {'body': {'type': 'string', 'description': 'The revised full text. Omit to keep the current text (media/time-only revision).'}, 'draft_id': {'type': 'integer', 'description': 'The draft to revise.'}, 'media_urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 10, 'description': 'Replacement media for the linked social post (public HTTPS URLs). Same rules as submit_social_post: reel/story exactly 1, carousel at least 2, Instagram images must be JPEG.'}, 'scheduled_at': {'type': 'string', 'description': 'New requested publish time (future datetime); applied when the manager approves.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['channel'], 'properties': {'channel': {'type': 'string', 'description': 'seo, paid, paid_social, content, social, email or local'}, 'instructions': {'type': 'string', 'description': 'Optional one-off focus for this run'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['to', 'subject', 'body', 'send_at'], 'properties': {'cc': {'type': 'array', 'items': {'type': 'string'}, 'description': 'CC recipients'}, 'to': {'type': 'string'}, 'bcc': {'type': 'array', 'items': {'type': 'string'}, 'description': 'BCC recipients'}, 'body': {'type': 'string'}, 'html': {'type': 'boolean', 'default': True}, 'send_at': {'type': 'string', 'description': 'When to send (YYYY-MM-DD HH:MM:SS)'}, 'subject': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'Single URL alternative to urls.'}, 'urls': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Full URLs to score (1–5).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'URL to scrape'}, 'extract': {'type': 'array', 'items': {'enum': ['text', 'links', 'images', 'meta', 'headings', 'all'], 'type': 'string'}, 'default': ['text', 'meta'], 'description': 'What to extract from the page'}, 'javascript': {'type': 'boolean', 'default': True, 'description': 'Execute JavaScript on page'}, 'include_html': {'type': 'boolean', 'default': False, 'description': 'Accepted for crawler compatibility. The compact scraper response returns extracted text/meta/links/images, not raw page HTML.'}, 'wait_for_selector': {'type': 'string', 'description': 'CSS selector to wait for (for dynamic content)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'description': 'Search query, for example "Google Analytics traffic", "SEO keywords", "WordPress posts", or "dashboard strategy tasks".'}}, 'additionalProperties': False}
Ausgabeschema
{'type': 'object', 'required': ['results'], 'properties': {'results': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'text': {'type': 'string'}, 'title': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keyword'], 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 10, 'minimum': 1, 'description': 'Max results (1–10). Default 10.'}, 'keyword': {'type': 'string', 'description': 'Company name or partial name to search for.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['emtak_code', 'min_turnover'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1, 'description': 'Max companies to return (1–50). Default 20.'}, 'emtak_code': {'type': 'string', 'description': 'EMTAK sector code (e.g. "6201" software development, "4120" construction, "4711" food retail, "4941" road freight). See emtak.rik.ee.'}, 'max_turnover': {'type': 'integer', 'minimum': 0, 'description': 'Maximum annual turnover in EUR, inclusive. Omit for no upper bound.'}, 'min_turnover': {'type': 'integer', 'minimum': 0, 'description': 'Minimum annual turnover (müügitulu) in EUR, inclusive.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 20}, 'query': {'type': 'string', 'description': 'Search term to match against file names.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'maximum': 500, 'minimum': 1, 'description': 'Max ads (default 100).'}, 'page_ids': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 10, 'description': 'Facebook page ids of competitors (preferred: exact).'}, 'countries': {'type': 'array', 'items': {'type': 'string'}, 'description': 'ISO-2 reached countries, default ["EE"].'}, 'search_terms': {'type': 'string', 'description': 'Keyword search when page ids are unknown (brand name, product).'}, 'active_status': {'enum': ['ACTIVE', 'ALL', 'INACTIVE'], 'type': 'string', 'description': 'Default ACTIVE.'}, 'delivery_date_min': {'type': 'string', 'description': 'YYYY-MM-DD: only ads delivered since.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keyword'], 'properties': {'depth': {'type': 'integer', 'default': 10, 'description': 'How many SERP items to return (max 100)'}, 'limit': {'type': 'integer', 'default': 10, 'description': 'Alias for depth: how many SERP items to return (max 100).'}, 'keyword': {'type': 'string', 'description': 'Search query to run on Google'}, 'language': {'type': 'string', 'description': 'Alias for language_code (et, en, ru, fi, ...).'}, 'location': {'type': 'string', 'description': 'Alias for location_code. Accepts Estonia, United States, United Kingdom, or a numeric DataForSEO location code.'}, 'language_code': {'type': 'string', 'default': 'et', 'description': 'Language code (et, en, ru, fi, ...)'}, 'location_code': {'type': 'integer', 'default': 2233, 'description': 'DataForSEO location code (2233 = Estonia, 2840 = US, 2826 = UK)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 50, 'description': 'Maximum results'}, 'query': {'type': 'string', 'description': 'Search query (brand name, keyword, etc)'}, 'sources': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Specific domains to search (optional)'}, 'days_back': {'type': 'integer', 'default': 30, 'description': 'Search results from last N days'}, 'exclude_domains': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Domains to exclude from results'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['to', 'subject', 'body'], 'properties': {'cc': {'type': 'array', 'items': {'type': 'string'}, 'description': 'CC recipients. The response lists every address the message went to.'}, 'to': {'type': 'string', 'description': 'Recipient email address'}, 'bcc': {'type': 'array', 'items': {'type': 'string'}, 'description': 'BCC recipients'}, 'body': {'type': 'string', 'description': 'Email body (HTML or plain text)'}, 'html': {'type': 'boolean', 'default': True, 'description': 'Is body HTML?'}, 'subject': {'type': 'string', 'description': 'Email subject'}, 'attachments': {'type': 'array', 'items': {'type': 'object', 'properties': {'path': {'type': 'string'}, 'filename': {'type': 'string'}}}}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['pixel_id', 'events'], 'properties': {'events': {'type': 'array', 'items': {'type': 'object', 'required': ['event_name', 'event_time'], 'properties': {'fbc': {'type': 'string'}, 'fbp': {'type': 'string'}, 'email': {'type': 'string'}, 'phone': {'type': 'string'}, 'value': {'type': 'number'}, 'country': {'type': 'string', 'description': 'ISO-2, e.g. ee'}, 'lead_id': {'type': 'string', 'description': 'Meta Instant Form lead id (15–17 digits).'}, 'currency': {'type': 'string', 'description': 'Default EUR.'}, 'event_id': {'type': 'string', 'description': 'Dedup key (same as the pixel event, or the CRM stage change id).'}, 'last_name': {'type': 'string'}, 'event_name': {'type': 'string', 'description': 'Standard (Lead, Purchase, CompleteRegistration, Schedule…) or the CRM stage name used for Conversion Leads (e.g. "QualifiedLead").'}, 'event_time': {'type': 'string', 'description': 'When it happened, ISO 8601 with offset (e.g. 2026-09-20T14:05:00+03:00). Not older than 7 days for website events; lead-stage events within 28 days of the lead work best.'}, 'first_name': {'type': 'string'}, 'external_id': {'type': 'string', 'description': 'CRM contact id.'}, 'action_source': {'enum': ['system_generated', 'physical_store', 'phone_call', 'email', 'website', 'chat', 'business_messaging', 'other'], 'type': 'string', 'description': 'system_generated for CRM lead stages (default).'}, 'event_source_url': {'type': 'string'}}}, 'maxItems': 1000, 'minItems': 1}, 'pixel_id': {'type': 'string', 'description': 'Dataset / pixel id from get_meta_signal_health.'}, 'test_event_code': {'type': 'string', 'description': 'From Events Manager → Test events. With it Meta only shows the events.'}, 'lead_event_source': {'type': 'string', 'description': 'CRM name for Conversion Leads, e.g. "Pipedrive", "HubSpot", "Sharks CRM".'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['from', 'to', 'subject'], 'properties': {'to': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Recipient email addresses'}, 'from': {'type': 'string', 'description': 'Sender email address'}, 'html': {'type': 'string', 'description': 'HTML email body'}, 'text': {'type': 'string', 'description': 'Plain text email body'}, 'subject': {'type': 'string', 'description': 'Email subject'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['recipients'], 'properties': {'intro': {'type': 'string', 'description': 'Optional opening paragraph in place of the default thank-you, at most 600 characters, no links.'}, 'language': {'enum': ['et', 'en'], 'type': 'string', 'description': 'et (default) or en.'}, 'recipients': {'type': 'array', 'items': {'type': 'object', 'required': ['email'], 'properties': {'name': {'type': 'string', 'description': 'Optional first name for the greeting.'}, 'email': {'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 50, 'minItems': 1, 'description': 'The customers to ask, e.g. [{"email": "mari@example.ee", "name": "Mari"}]. Only people who bought or used the service.'}, 'review_url': {'type': 'string', 'description': "Optional https review link; defaults to the connected Business Profile's link."}, 'business_name': {'type': 'string', 'description': 'Optional name to sign with; defaults to the Business Profile title.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['channel', 'frequency'], 'properties': {'time': {'type': 'string', 'description': 'HH:MM, Europe/Tallinn; default 06:00'}, 'channel': {'type': 'string', 'description': 'seo, paid, paid_social, content, social, email or local'}, 'weekday': {'enum': ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'], 'type': 'string', 'description': 'For weekly; default monday'}, 'frequency': {'enum': ['daily', 'weekly', 'off'], 'type': 'string'}, 'instructions': {'type': 'string', 'description': 'Standing instructions the agent gets on every run (focus, limits)'}, 'max_tool_calls': {'type': 'integer', 'maximum': 60, 'minimum': 5, 'description': 'Tool-call budget per run; default 25'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id'], 'properties': {'clear': {'type': 'boolean', 'description': 'true = remove the whole schedule (ads may run 24/7). Only with an empty or missing schedule.'}, 'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card: why the hours change.'}, 'schedule': {'type': 'array', 'items': {'type': 'object', 'required': ['day', 'start', 'end'], 'properties': {'day': {'enum': ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'], 'type': 'string'}, 'end': {'type': 'string', 'description': 'HH:MM on the quarter hour after start, up to 24:00'}, 'start': {'type': 'string', 'description': 'HH:MM on the quarter hour, 00:00..23:45'}}, 'additionalProperties': False}, 'description': 'The complete new weekly schedule, e.g. [{"day": "MONDAY", "start": "08:00", "end": "18:00"}, …]'}, 'campaign_id': {'type': 'string', 'description': 'Campaign id from list_google_ads_campaigns (digits).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id'], 'properties': {'reason': {'type': 'string'}, 'campaign_id': {'type': 'string'}, 'exclude_urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 50, 'description': 'URL or URL prefix (e.g. "example.ee/karjaar") AI Max must never land on.'}, 'term_exclusions': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 25, 'description': "Replaces the campaign's list."}, 'text_customization': {'type': 'boolean', 'description': 'false = opt out of AI-generated text assets.'}, 'final_url_expansion': {'type': 'boolean', 'description': "false = keep traffic on the ads' own final URLs."}, 'messaging_restrictions': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 40, 'description': 'Replaces the campaign\'s list, e.g. "Ära luba sama päeva teenust".'}, 'disable_search_term_matching_ad_group_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Ad groups that should serve on their keywords only.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id', 'daily_budget_eur'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this budget should change.'}, 'campaign_id': {'type': 'string', 'description': 'Campaign id from list_google_ads_campaigns, e.g. "20713245160" (digits only, not the resource name)'}, 'allow_shared': {'type': 'boolean', 'description': 'Set true only after budget_is_shared told you which other campaigns use the same budget and you still mean to change all of them.'}, 'daily_budget_eur': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': 'The new daily budget in euros, at most two decimals, e.g. 25 or 12.50. Converted to micros for the API; compared against the caps in micros, so 300.01 is over a 300 cap.'}, 'affected_campaign_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Ignored as input: the platform reads the campaigns sharing this budget itself and overwrites this field, so the human approves the real scope. It appears in the approval card and in the answer.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['manager_token', 'north_star'], 'properties': {'kpis': {'type': 'array', 'items': {'type': 'object'}, 'description': 'KPI objects: {name, current, target, unit, direction:"up"|"down"}. direction "down" = lower is better.'}, 'name': {'type': 'string', 'description': 'Plan name (e.g. "Q3 2026 Turundusplaan").'}, 'budget': {'type': 'string', 'description': 'Optional budget label (e.g. "€8000 / kuus").'}, 'period': {'type': 'string', 'description': 'Optional period label (e.g. "Q3 2026").'}, 'pillars': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Strategic pillars: {name, objective, accent (hex), agent_keys:[...]}. agent_keys link the pillar to teammates by their agent_key.'}, 'audience': {'type': 'string', 'description': 'Optional target audience.'}, 'north_star': {'type': 'string', 'description': 'The single overarching goal for the period.'}, 'manager_token': {'type': 'string', 'description': 'Public token of the manager dashboard this plan governs.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['adset_id', 'daily_budget_eur'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this budget should change.'}, 'adset_id': {'type': 'string', 'description': 'Meta ad set id from list_meta_adsets (digits).'}, 'daily_budget_eur': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': 'The new daily budget in euros, at most two decimals, e.g. 15 or 22.50.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['campaign_id', 'daily_budget_eur'], 'properties': {'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card and the audit log: why this budget should change.'}, 'campaign_id': {'type': 'string', 'description': 'Meta campaign id from list_meta_campaigns (digits).'}, 'daily_budget_eur': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': 'The new daily budget in euros, at most two decimals, e.g. 15 or 22.50.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'goals': {'type': 'array', 'items': {'type': 'string'}, 'description': '1-3 marketing goals in their words'}, 'notes': {'type': 'string'}, 'tools': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Marketing tools they use, e.g. "Google Analytics", "Google Ads", "WordPress"'}, 'markets': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Countries or regions they sell to'}, 'website': {'type': 'string', 'description': 'Main website URL'}, 'industry': {'type': 'string'}, 'ai_client': {'enum': ['claude', 'chatgpt', 'gemini', 'grok', 'copilot', 'other'], 'type': 'string', 'description': 'The AI your person talks to you through'}, 'company_name': {'type': 'string'}, 'business_model': {'enum': ['services', 'ecommerce', 'saas', 'local', 'other'], 'type': 'string'}, 'monthly_budget_eur': {'type': 'number'}, 'decision_maker_email': {'type': 'string', 'description': 'Who approves the plan and spending'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'text': {'type': 'string', 'description': 'The primary text the ad shows.'}, 'media': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Public URLs of the image(s) or video.'}, 'start': {'type': 'string', 'description': 'YYYY-MM-DD, when it should start.'}, 'title': {'type': 'string'}, 'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'format': {'type': 'string', 'description': 'e.g. "Video 0:20", "Karussell", "Pilt"'}, 'audience': {'type': 'string'}, 'platform': {'enum': ['meta', 'youtube', 'chatgpt'], 'type': 'string', 'description': "Where it runs: meta (default), youtube (Google Ads video) or chatgpt (sponsored card). A new version keeps its predecessor's platform."}, 'placements': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Feed, Reels, Stories, …'}, 'replaces_id': {'type': 'integer', 'description': 'The creative this is a new version of.'}, 'approval_reasons': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['urls'], 'properties': {'urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 100, 'minItems': 1, 'description': 'Full URLs of the connected site.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['type', 'title', 'body'], 'properties': {'body': {'type': 'string', 'description': 'The full draft text to be reviewed.'}, 'type': {'enum': ['social_post', 'web_text', 'newsletter', 'blog', 'ad_text', 'event_text', 'campaign_message', 'seo_change'], 'type': 'string', 'description': 'Content type.'}, 'title': {'type': 'string', 'description': 'Short headline shown in the list.'}, 'channel': {'type': 'string', 'description': 'Where it goes: facebook, instagram, linkedin, email, web, blog, google_ads, meta_ads, event.'}, 'deadline': {'type': 'string', 'description': 'Due date YYYY-MM-DD or today/daysAgo tokens (optional).'}, 'priority': {'enum': ['low', 'medium', 'high'], 'type': 'string', 'description': 'low | medium | high (default medium).'}, 'manager_token': {'type': 'string', 'description': "Manager dashboard public_token to attach this draft to (optional; defaults to the project's manager dashboard)."}, 'related_activity': {'type': 'string', 'description': 'Related campaign/activity name (optional).'}, 'require_approval': {'type': 'boolean', 'description': "Ask for a human review on an autopilot channel. Honored only when the title names a manager's call — money (prices, budget, billing), a contract or legal text, personal data or brand positioning; otherwise ignored, because autopilot means you carry the work through. Name the topic in the title when you set it."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['urls'], 'properties': {'urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 100, 'minItems': 1, 'description': 'Full URLs, all on the same host.'}, 'check_only': {'type': 'boolean', 'description': 'Only verify/return the key-file setup, submit nothing.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['channel'], 'properties': {'link': {'type': 'string', 'description': 'Facebook HTTPS link; Instagram does not support link posts.'}, 'type': {'enum': ['post', 'reel', 'carousel', 'story'], 'type': 'string', 'description': 'Default post. Use reel, carousel, or story only when the media shape needs it.'}, 'caption': {'type': 'string', 'description': 'Post caption.'}, 'channel': {'enum': ['facebook', 'instagram', 'tiktok', 'linkedin'], 'type': 'string', 'description': "linkedin = the project's LinkedIn company page: type post (caption with an optional link card or one JPG/PNG/GIF image) or carousel (2-10 images), caption required and at most 3000 characters, no video/reel/story, first_comment at most 1250 characters; scheduled posts go out at scheduled_at. Refused with the missing step until a page admin has allowed LinkedIn publishing for the project."}, 'group_key': {'type': 'string', 'maxLength': 100, 'description': 'Give EVERY channel/format variant of the same content piece the same group_key (e.g. "story-pakk-2026-08-26"): the approvals view then shows ONE card with one Approve/Cancel/Schedule for the whole group instead of a card per variant. Always set this when submitting the same content to several channels.'}, 'media_urls': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 10}, 'ai_generated': {'type': 'boolean', 'description': 'TikTok: the video is AI-generated or AI-edited, posted with the TikTok AI-content label.'}, 'publish_mode': {'enum': ['draft', 'schedule', 'publish'], 'type': 'string', 'description': 'Default draft. Use schedule with scheduled_at or publish when requesting immediate publication after approval.'}, 'scheduled_at': {'type': 'string', 'description': 'Future datetime, required only for schedule.'}, 'first_comment': {'type': 'string', 'maxLength': 2200, 'description': 'Optional comment posted by the platform right after publishing (e.g. the full link, since Instagram captions are not clickable). Not supported for stories. Requires pages_manage_engagement (Facebook) / instagram_manage_comments (Instagram) on the connection.'}, 'internal_label': {'type': 'string', 'maxLength': 120, 'description': 'Human-readable card title for the approvals dashboard, e.g. "Story, Paide Vesi, N 27.08 kl 12:15". Dashboard-only — NEVER published to the channel. Always set this for media-only posts (stories, reels) whose caption is empty, so the reviewer is not shown a raw media URL.'}, 'share_to_story': {'type': 'boolean', 'description': "Reels only: after publishing, the platform also shares the same 9:16 video to the channel's Story automatically (no separate story submission needed). Best effort — a story failure never fails the published reel; see story_post_id / story_error on the record."}, 'idempotency_key': {'type': 'string', 'maxLength': 100}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keyword'], 'properties': {'geo': {'type': 'string', 'description': 'Country code to filter by (e.g. "US", "EE", "GB"). Leave empty for worldwide.'}, 'keyword': {'type': 'string', 'description': 'Keyword to analyze (e.g. "digital marketing")'}, 'timeframe': {'type': 'string', 'description': 'Time range (e.g. "today 12-m", "today 3-m", "today 5-y", "2023-01-01 2023-12-31"). Default: "today 12-m"'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keyword'], 'properties': {'geo': {'type': 'string', 'description': 'Country code to filter by (e.g. "US", "EE"). Leave empty for worldwide.'}, 'keyword': {'type': 'string', 'description': 'Keyword to find related queries for (e.g. "SEO tools")'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': [], 'properties': {'geo': {'type': 'string', 'description': 'Country code (e.g. "US", "EE", "GB", "DE"). Default: "US"'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['domain'], 'properties': {'domain': {'type': 'string', 'description': 'Business domain to search for (e.g. "example.com")'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['business_unit_id'], 'properties': {'business_unit_id': {'type': 'string', 'description': 'Trustpilot business unit ID (from trustpilot_find_business)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['business_unit_id'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'description': 'Number of reviews to return (default 20)'}, 'business_unit_id': {'type': 'string', 'description': 'Trustpilot business unit ID (from trustpilot_find_business)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['review_id', 'message'], 'properties': {'message': {'type': 'string', 'description': 'Reply message text'}, 'review_id': {'type': 'string', 'description': 'ID of the review to reply to'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['domain'], 'properties': {'domain': {'type': 'string', 'description': 'Domain to analyze (e.g. "example.com", without https://)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['keyword'], 'properties': {'country': {'type': 'string', 'description': 'Country code in lowercase (e.g. "us", "ee", "gb"). Default: "us"'}, 'keyword': {'type': 'string', 'description': 'Seed keyword to get suggestions for (e.g. "content marketing")'}, 'language': {'type': 'string', 'description': 'Ignored compatibility field. Ubersuggest targeting is controlled by country.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'integer'}, 'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'result': {'type': 'object', 'properties': {'cpl': {'type': 'number'}, 'leads': {'type': 'number'}, 'spend': {'type': 'number'}}}, 'status': {'enum': ['running', 'paused', 'rejected'], 'type': 'string'}, 'text_synced': {'type': 'boolean'}, 'external_ad_id': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['request_id'], 'properties': {'kind': {'enum': ['event', 'campaign', 'event_campaign'], 'type': 'string'}, 'token': {'type': 'string', 'description': 'Dashboard public_token. Optional — defaults to your own dashboard.'}, 'status': {'enum': ['agent_working', 'in_plan', 'needs_client_approval', 'done', 'declined'], 'type': 'string'}, 'request_id': {'type': 'integer'}, 'status_note': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token'], 'properties': {'name': {'type': 'string'}, 'token': {'type': 'string'}, 'markets': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Countries for the market picker of the client view, ISO-3166-1 alpha-3 (e.g. ["est","fin"]). Empty array removes the picker.'}, 'password': {'type': ['string', 'null'], 'description': 'Set a new viewer password (plaintext, will be bcrypt-hashed). Pass null to remove protection. Omit this field to leave the existing password unchanged.'}, 'expires_at': {'type': ['string', 'null'], 'format': 'date-time'}, 'add_widgets': {'type': 'array', 'description': 'New widgets to append. Same shape as widgets in create_dashboard.'}, 'client_view': {'enum': ['seo', 'team', 'grid'], 'type': 'string', 'description': 'Switch the page the client sees: "seo" (AI agent · SEO/GEO client view), "team" (AI tiim: SEO + paid ads on one page) or "grid" (classic widgets). See create_dashboard.'}, 'description': {'type': 'string'}, 'update_widgets': {'type': 'array', 'description': 'Widgets to mutate by position — e.g. [{"position": 2, "content": "## New plan"}]. For strategy_card widgets, pass {"source":{"mode":"human_controlled"}} or {"source":{"mode":"ai_controlled"}} to change card mode without replacing tasks.'}, 'default_end_date': {'type': 'string', 'format': 'date'}, 'default_date_range': {'type': 'string'}, 'default_start_date': {'type': 'string', 'format': 'date'}, 'remove_widget_positions': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Position numbers of widgets to delete'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['file_id', 'content'], 'properties': {'content': {'type': 'string', 'description': 'New full content.'}, 'file_id': {'type': 'string', 'description': 'Drive file id to overwrite.'}, 'mime_type': {'type': 'string', 'description': 'Optional MIME type.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'description': {'type': 'string', 'description': 'The "from the business" description, plain text, at most 750 characters.'}, 'regular_hours': {'type': 'array', 'items': {'type': 'object', 'required': ['open_day', 'open_time', 'close_time'], 'properties': {'open_day': {'enum': ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'], 'type': 'string'}, 'close_day': {'enum': ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'], 'type': 'string'}, 'open_time': {'type': 'string', 'description': 'HH:MM, 24-hour clock.'}, 'close_time': {'type': 'string', 'description': 'HH:MM, 24-hour clock.'}}, 'additionalProperties': False}, 'description': 'The full weekly schedule, e.g. [{"open_day":"MONDAY","open_time":"09:00","close_time":"17:00"}].'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['ad_id'], 'properties': {'ad_id': {'type': 'string', 'description': 'The ad id from list_google_ads_ads (digits).'}, 'pinned': {'type': 'object', 'properties': {'HEADLINE_1': {'type': 'string'}, 'HEADLINE_2': {'type': 'string'}, 'HEADLINE_3': {'type': 'string'}, 'DESCRIPTION_1': {'type': 'string'}, 'DESCRIPTION_2': {'type': 'string'}}, 'description': 'Optional pins: position => the exact text to fix there. Giving it replaces all pins of the lists you send; {} removes them.', 'additionalProperties': False}, 'reason': {'type': 'string', 'description': 'Optional one sentence for the approval card: why the texts change.'}, 'final_url': {'type': 'string', 'description': 'The new landing page, a full https:// URL.'}, 'headlines': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The complete new headline list, 3..15 texts of at most 30 characters each.'}, 'descriptions': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The complete new description list, 2..4 texts of at most 90 characters each.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['tag_id'], 'properties': {'name': {'type': 'string', 'description': 'New tag name'}, 'notes': {'type': 'string', 'description': 'Replace the note shown in GTM'}, 'paused': {'type': 'boolean', 'description': 'true pauses the tag (it stays in the container but never fires), false resumes it'}, 'tag_id': {'type': ['string', 'integer'], 'description': 'Tag id from list_gtm_tags'}, 'parameters': {'type': 'object', 'description': 'Parameters to set, same keys as create_gtm_tag (e.g. eventName, measurementId, eventParameters, html). Merged by key into the existing parameters.'}, 'firing_trigger_ids': {'type': 'array', 'items': {'type': ['string', 'integer']}, 'description': 'Replaces the firing trigger list (at least one id)'}, 'blocking_trigger_ids': {'type': 'array', 'items': {'type': ['string', 'integer']}, 'description': 'Replaces the exception trigger list; pass [] to clear'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['products'], 'properties': {'reason': {'type': 'string'}, 'products': {'type': 'array', 'items': {'type': 'object', 'required': ['offer_id', 'content_language', 'feed_label', 'attributes'], 'properties': {'offer_id': {'type': 'string'}, 'attributes': {'type': 'object', 'description': 'camelCase Merchant attributes, e.g. {"title":"…","gtins":["4740000000001"],"customLabel0":"winner"}.'}, 'feed_label': {'type': 'string', 'description': 'e.g. "EE"'}, 'content_language': {'type': 'string', 'description': 'e.g. "et"'}}}, 'maxItems': 200, 'minItems': 1}, 'primary_data_source_id': {'type': 'string', 'description': 'Primary source the corrections apply to (default: the only / first primary product source).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['activity_id'], 'properties': {'date': {'type': 'string'}, 'notes': {'type': 'string'}, 'title': {'type': 'string'}, 'months': {'type': 'array', 'items': {'type': 'integer'}}, 'status': {'enum': ['planned', 'in_progress', 'done'], 'type': 'string'}, 'channel': {'type': 'string'}, 'task_ref': {'type': ['object', 'null'], 'required': ['token', 'widget_id', 'task_id'], 'properties': {'token': {'type': 'string', 'description': 'Child dashboard public_token where the strategy card lives.'}, 'task_id': {'type': 'integer', 'description': 'Task id on that strategy card.'}, 'widget_id': {'type': 'integer', 'description': 'Strategy-card widget_id.'}}, 'description': 'Link this activity to a strategy-card task. When set, activity status is derived from that task. Pass null to unlink and make status manual again.'}, 'activity_id': {'type': 'integer'}, 'content_draft_id': {'type': 'integer'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['document'], 'properties': {'document': {'type': 'string', 'description': 'The full plan document as markdown (replaces the previous version, max ~200k chars).'}, 'mark_synced': {'type': 'boolean', 'description': 'Pass true only when subagent tasks are ALREADY re-aligned with this version in the same run (manager doing both at once).'}, 'manager_token': {'type': 'string', 'description': "Manager dashboard token (optional; defaults to the project's manager dashboard)."}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['section'], 'properties': {'data': {'type': 'object', 'description': 'The section payload (see get_seo_dashboard → schema[section]).', 'additionalProperties': True}, 'token': {'type': 'string', 'description': 'Dashboard public_token. Omit for your own dashboard.'}, 'delete': {'type': 'boolean', 'default': False, 'description': 'Remove the section instead of writing it.'}, 'domain': {'type': 'string', 'description': 'Host of one of the dashboard\'s domains (get_seo_dashboard → domains, e.g. "kookjakodu.fi") to write the version shown when the client picks that domain. Combine with market for one domain × country pair. Lookup on the page: market+domain → domain → market → site-wide.'}, 'market': {'type': 'string', 'description': 'ISO-3166-1 alpha-3 of one of the dashboard\'s markets (e.g. "fin") to write the market-specific version. Omit for the site-wide section.'}, 'section': {'enum': ['hero', 'goal', 'meeting', 'growth_comment', 'channels', 'money', 'social', 'meta_creatives', 'highlights', 'next', 'keywords', 'gsc_queries', 'striking', 'gsc_pages', 'ai_visibility', 'competitors', 'ga4_channels', 'ga4_kpis', 'pagespeed', 'backlinks', 'markets', 'google_ads', 'meta_ads', 'worklog', 'footer', 'trends'], 'type': 'string', 'description': 'Which section to write.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['spreadsheet_id', 'range', 'values'], 'properties': {'range': {'type': 'string', 'description': 'A1 range where the top-left cell anchors the write, e.g. "Sheet1!A1".'}, 'values': {'type': 'array', 'items': {'type': 'array', 'items': {'type': ['string', 'number', 'boolean', 'null']}}, 'description': '2D array of rows.'}, 'spreadsheet_id': {'type': 'string'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['token', 'widget_id'], 'properties': {'note': {'type': ['string', 'null'], 'description': 'Optional free-text note explaining task state (e.g. why blocked, what is missing). Pass null or omit to leave unchanged.'}, 'label': {'enum': [None, 'blocked', 'needs_human', 'needs_access', 'in_progress'], 'type': ['string', 'null'], 'description': 'Optional state label. in_progress = you are on it. blocked = something stops you (note required: what). needs_human / needs_access put the task on the manager\'s "Postkast" queue (/inbox) — note (start with VAJA: …) AND human_reason are required, and the label is refused when a platform tool already covers the ask (WordPress pages/redirects/seo/schema, submit_social_post, send_email): call the tool instead. The CLIENT\'s own page ("Sinult on vaja") shows only what nobody but the client can give: needs_access (their credential / owner grant) and asks you address to them with "VAJA: KLIENT: …" (their prices, their choice, their file). decision / manual_ui / no_api go to the Marketing Sharks team (Postkast), not the client; "VAJA: TIIM: …" keeps a task internal regardless. One open ask per topic: update the existing task instead of adding a duplicate. Pass null to clear.'}, 'token': {'type': 'string', 'description': 'Dashboard public_token'}, 'task_id': {'type': 'integer', 'description': 'Task ID within the strategy card. Either task_id or task_number is required. task_id takes precedence if both are supplied.'}, 'widget_id': {'type': 'integer', 'description': 'Strategy card widget ID'}, 'is_skipped': {'type': 'boolean', 'description': 'Read-only compatibility field from get_strategy_status. false is ignored; true is rejected because only a human can deactivate/skip a task from the dashboard UI.'}, 'task_number': {'type': 'integer', 'description': 'Alternative to task_id: 1-indexed order of the task within the strategy card (as shown in get_strategy_status output). NB: the dashboard shows the DB id ("#1877" = task_id 1877), not the order — prefer task_id. Either task_id or task_number is required.'}, 'completed_at': {'type': ['string', 'null'], 'description': 'Read-only compatibility field from get_strategy_status. Ignored on write; timestamps are set by the platform.'}, 'completed_by': {'type': ['string', 'null'], 'description': 'Read-only compatibility field from get_strategy_status. Ignored on write; completed tasks are recorded as completed_by=ai by the platform.'}, 'human_reason': {'enum': [None, 'decision', 'access', 'no_api', 'manual_ui'], 'type': ['string', 'null'], 'description': 'Required with needs_human / needs_access. decision = manager must decide (budget, go/no-go). access = credential, OAuth click or permission you lack. no_api = the platform has no tool for this action. manual_ui = must be done by hand in a third-party UI (Google Ads, GTM, hosting panel, ssh).'}, 'is_completed': {'type': 'boolean', 'description': 'true to mark done, false to reopen. Omit to leave completion state unchanged (note/label-only update).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['page_id'], 'properties': {'slug': {'type': 'string', 'description': 'URL slug. Changing it breaks old links — pair with create_wp_redirect.'}, 'title': {'type': 'string', 'description': 'Page H1/title.'}, 'status': {'type': 'string', 'description': 'publish | draft | pending | private.'}, 'content': {'type': 'string', 'description': 'Full HTML body — replaces the existing content.'}, 'excerpt': {'type': 'string'}, 'page_id': {'type': 'integer'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['post_id'], 'properties': {'meta': {'type': 'object', 'description': 'Registered post meta as key → value, e.g. {"header_image": 168145} sets the ACF hero image ("Posti pildid") on marketingsharks.ee. A key the site has not exposed to the REST API fails with wp_meta_not_registered instead of being dropped.', 'additionalProperties': True}, 'tags': {'type': 'array', 'items': {'type': 'integer'}}, 'title': {'type': 'string'}, 'author': {'type': 'string', 'description': 'Change the post author: WordPress user ID, login, email or display name.'}, 'status': {'enum': ['publish', 'draft', 'pending', 'private'], 'type': 'string'}, 'content': {'type': 'string'}, 'excerpt': {'type': 'string'}, 'post_id': {'type': 'integer', 'description': 'WordPress post ID'}, 'tag_names': {'type': 'array', 'items': {'type': 'string'}, 'description': "Tag names instead of IDs (replaces the post's tags; missing tags are created)."}, 'categories': {'type': 'array', 'items': {'type': 'integer'}}, 'category_names': {'type': 'array', 'items': {'type': 'string'}, 'description': "Category names/slugs instead of IDs (replaces the post's categories)."}, 'featured_media': {'type': 'integer'}, 'meta_description': {'type': 'string', 'description': 'SEO meta description shown in Google (max ~155 chars). Stored in Rank Math (rank_math_description) once the post is updated; check meta_description.saved in the result.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['object_id', 'schemas'], 'properties': {'schemas': {'type': 'object', 'description': 'Rank Math schema map, e.g. {"schema-1":{"@type":"FAQPage","mainEntity":[...]}}.'}, 'object_id': {'type': 'integer'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['object_id'], 'properties': {'type': {'type': 'string', 'description': 'Accepted for compatibility with get_wp_seo_meta: posts/post or pages/page.'}, 'robots': {'type': 'array', 'items': {'type': 'string'}, 'description': 'e.g. ["index","follow"] or ["noindex"].'}, 'og_image': {'type': 'string', 'description': 'Absolute URL of the Open Graph / Facebook share image (Rank Math "Facebook image"; Twitter uses it too by default). Pass a media library URL, e.g. the featured image URL.'}, 'object_id': {'type': 'integer', 'description': 'Post or page ID.'}, 'seo_title': {'type': 'string', 'description': 'Title shown in Google (max ~60 chars).'}, 'og_image_id': {'type': 'integer', 'description': 'Media library attachment ID of og_image, when known (lets Rank Math pick the right size).'}, 'canonical_url': {'type': 'string', 'description': 'Absolute URL — use when two pages compete for the same query.'}, 'focus_keyword': {'type': 'string', 'description': 'Rank Math focus keyword(s); separate several with commas, primary first.'}, 'meta_description': {'type': 'string', 'description': 'Description shown in Google (max ~155 chars).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['photo_url'], 'properties': {'category': {'enum': ['COVER', 'PROFILE', 'LOGO', 'EXTERIOR', 'INTERIOR', 'PRODUCT', 'AT_WORK', 'FOOD_AND_DRINK', 'MENU', 'COMMON_AREA', 'ROOMS', 'TEAMS', 'ADDITIONAL'], 'type': 'string', 'description': 'Default ADDITIONAL.'}, 'photo_url': {'type': 'string', 'description': 'Public http(s) URL of a JPG or PNG image.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['conversion_action_id', 'rows', 'consent'], 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'required': ['conversion_time'], 'properties': {'email': {'type': 'string', 'description': 'Raw or already SHA-256 hex.'}, 'gclid': {'type': 'string'}, 'phone': {'type': 'string', 'description': 'E.164 (+3725…) raw or SHA-256 hex.'}, 'value': {'type': 'number'}, 'gbraid': {'type': 'string'}, 'wbraid': {'type': 'string'}, 'consent': {'enum': ['granted', 'denied', 'unspecified'], 'type': 'string'}, 'transaction_id': {'type': 'string', 'description': 'CRM deal/lead id — dedupe key and adjustment key.'}, 'conversion_time': {'type': 'string', 'description': 'When the outcome happened, ISO 8601 with offset, e.g. 2026-09-20T14:05:00+03:00.'}}}, 'maxItems': 2000, 'minItems': 1}, 'consent': {'enum': ['granted', 'denied', 'unspecified'], 'type': 'string', 'description': 'Ad user data + ad personalization consent for the whole batch (row "consent" overrides). For EU users send "granted" only when the CRM holds that consent.'}, 'currency': {'type': 'string', 'description': 'ISO 4217, default EUR.'}, 'validate_only': {'type': 'boolean', 'description': 'Google validates the batch and stores nothing.'}, 'conversion_action_id': {'type': 'string', 'description': 'Google Ads conversion action id (type UPLOAD_CLICKS).'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'properties': {'url': {'type': 'string', 'description': 'Public http(s) URL of the image to fetch. Either url or file_base64 is required.'}, 'title': {'type': 'string', 'description': 'Media title shown in the library.'}, 'caption': {'type': 'string'}, 'alt_text': {'type': 'string', 'description': 'Alt text (accessibility + SEO).'}, 'filename': {'type': 'string', 'description': 'File name in the media library, e.g. "kodulehe-rentimine-fb.png". Defaults to the URL basename; the extension follows the detected image type.'}, 'file_base64': {'type': 'string', 'description': 'Base64-encoded image bytes; a data:image/...;base64, prefix is accepted. Either url or file_base64 is required.'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['url', 'schema_type'], 'properties': {'url': {'type': 'string', 'description': 'URL of the page to validate'}, 'schema_type': {'type': 'string', 'description': 'Schema.org type to validate (e.g. Article, Product, FAQPage, LocalBusiness, Organization, BreadcrumbList, Event, Recipe, VideoObject, JobPosting, HowTo, Course)'}}, 'additionalProperties': False}
Eingabeschema
{'type': 'object', 'required': ['path', 'content', 'note'], 'properties': {'note': {'type': 'string', 'description': 'One line: what this change does and why (shown to the manager and kept with the backup).'}, 'path': {'type': 'string', 'description': 'File relative to the WordPress root.'}, 'content': {'type': 'string', 'description': 'The complete new file content.'}, 'expected_sha256': {'type': 'string', 'description': 'sha256 from read_site_file. Required when the file already exists; the write is refused if the live file changed since.'}}, 'additionalProperties': False}
Letzte Tool-Änderungen
Ähnliche MCP-Server
synter-ads
Manages cross-platform advertising campaigns, audiences, tracking, creative, landing pages, campaign audits, technology intellige…
synter-ads
Manages cross-platform advertising campaigns, audiences, tracking, creative, landing pages, campaign audits, technology intellige…
Stratalize Intelligence
Provides vendor, market, SaaS, workforce, government contract, public company, regulatory, competitive, and AI-brand intelligence…
captapi
Retrieves social media profiles, posts, engagement metrics, comments, marketplace listings, events, and Meta advertising data acr…
CorpusIQ
Connects authenticated users to business systems such as CRM, ecommerce, advertising, analytics, email marketing, SEO, calendars,…
Rahul D Sarker: Marketing & RevOps Tools
Provides marketing, revenue operations, sales, advertising, SaaS, and conversion calculators, along with article search and consu…
Trillboards DOOH Advertising
Manages digital out-of-home advertising campaigns and media buys across screens, with edge-AI audience sensing, impression tracki…
rankparse-mcp
Provides SEO and search marketing research including backlinks, authority, competitor gaps, Google Ads keyword metrics, and Googl…