AdsMCP
Configures an Apple Search Ads external MCP read path; local SQLite import is not yet available.
Provides a Discord bot connector for searching and posting in permitted channels on authorized servers.
Imports Google Ads reports and metrics into local SQLite, allowing selected campaign changes through the API Agent with explicit confirmation.
Connects to Mastodon accounts for OAuth, mention reads, replies, and profile updates.
Uses an external MCP connection for Reddit Ads campaigns and reports, prepared as read-only.
Supports Telegram Ads reports, ad creation, budgets, review submission, and pausing via the official API, plus Telegram account search and private/public replies with rate limits.
Uses an external MCP OAuth connection for TikTok Ads, prepared as read-only.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AdsMCP Compare Google Ads and Yandex Direct spend and conversions this month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π― AdsMCP
Π ΡΡΡΠΊΠ°Ρ Π²Π΅ΡΡΠΈΡ Β· δΈζη
Manage ads through an AI agent and keep your data local, for free.
AdsMCP is a local MCP server that brings advertising campaigns, spend, and analytics into one interface for your agent. Connect the platforms you need, compare results, and spend less time on routine work.
Our goal is to make advertising simple: from audience research to launch and optimization through a familiar chat, with you in control.
Release
1.1.1: the local core and modular integrations are available; each provider exposes its own capability and safety boundaries. The full advertising lifecycle through an agent is on the roadmap.
What it can do today
Collect data: projects, campaigns, spend, and conversions in local SQLite.
Measure results: CTR, CPC, CPA, ROAS, and each channel's contribution to conversions.
Connect platforms: import from Google Ads, Yandex Direct, Telegram Ads, and Microsoft Advertising once the relevant integrations are configured.
Work with communities: Telegram, Discord, and Mastodon connectors for context research and conversations within each channel's rules.
Automate with control: start with a trial run (
dry-run); external actions require explicit confirmation.
The MCP server is enough to get started locally. Add integrations as you need them; advertising accounts and access are configured separately.
Related MCP server: flour-ads
Integrations: available
Status describes project capabilities after accounts and modules are configured. Changes on external platforms require explicit confirmation.
Integration | Readiness | Available features and limits |
Google Ads | β Import and selected actions | Reports and metrics in SQLite; changes through API Agent with confirmation. |
Yandex Direct | β Import and selected actions | Metrics, changes, and campaign creation with serving off; deletion is disabled. |
Telegram Ads | β Import and ad management | Reports, creation, budgets, review submission, and pausing through the official API. |
Microsoft Advertising / Bing | β Read-only | Campaigns, reports, and metric imports; campaign changes are disabled. |
Telegram account | β Search and conversations | Chat search and private/public replies; Premium requirements and rate limits apply. |
Discord | β Bot connector | Search and posting in permitted channels on authorized servers. |
Mastodon | β Account and conversations | OAuth, mention reads, replies, and profile updates. |
CRM / Webhook | β Event ingestion | Import submitted conversion events; CRM management is not implemented. |
VK Ads via Click.ru | β Integrated Β· manual step | Read-only broker connected; initial VK account linking is required. |
Avito Ads | β Integrated Β· read-only | Official Avito Ads API through a local read-only MCP allowlist. |
Apple Search Ads | β Integrated Β· read-only | Local read-only MCP for Apple Ads Platform API v1; 57 read tools, writes disabled. |
TikTok Ads | β Integrated Β· read-only | Local read-only MCP for the TikTok Business API; 35 read tools, writes disabled. |
Reddit Ads | β Integrated Β· read-only | Local read-only MCP for the official Reddit Ads API v3; write tier is disabled. |
Email / SMTP + IMAP | β Integrated Β· read/write | IMAP checks and SMTP sending via a restricted allowlist; destructive mailbox tools stay disabled. |
Meta Ads | β Integrated Β· read-only | Local read-only MCP for the official Meta Graph/Marketing API; 41 read tools, writes disabled. |
OpenAI Ads / ChatGPT | β Integrated Β· read-only | Official OpenAI Ads Advertiser API through a local MCP bridge; account, campaign, ad, insight, audience and audit reads are enabled. |
Spotify Ads | β Integrated Β· read-only | Local Adport MCP connects directly to the official Spotify Ads API; writes stay outside the allowlist. |
X Ads | β Integrated Β· read-only | Local read-only MCP connects directly to the official X Ads API; OAuth refresh remains external. |
Capability matrix
The five capability columns describe what AdsMCP exposes now after the selected
module is configured. API/MCP potential records the broader verified provider
surface from the research matrix; it does not open those operations in runtime.
Campaign create means creating an advertising campaign, while Account create means creating the advertising account itself. Payment means funding
or paying the advertising account, not reading a balance or changing a budget.
Integration | Read now | Write now | Campaign create now | Account create now | Payment now | API/MCP potential |
Google Ads | β | β | β | β | β | read + write + campaign_create |
Yandex Direct | β | β | β | β | β | read + write + campaign_create |
Telegram Ads | β | β | β | β | β | read + write + campaign_create + account_create + payment* |
Microsoft Advertising / Bing | β | β | β | β | β | read |
VK Ads via Click.ru | β | β | β | β | β | read + write + campaign_create |
Avito Ads | β | β | β | β | β | read + write + campaign_create |
Apple Search Ads | β | β | β | β | β | read + write + campaign_create |
TikTok Ads | β | β | β | β | β | read + write + campaign_create |
Reddit Ads | β | β | β | β | β | read + write + campaign_create |
Meta Ads | β | β | β | β | β | read + write + campaign_create |
OpenAI Ads / ChatGPT | β | β | β | β | β | read + write + campaign_create |
Spotify Ads | β | β | β | β | β | read |
X Ads | β | β | β | β | β | read + write + campaign_create |
Email / SMTP + IMAP | β | β | β | β | β | read + write |
* Telegram payment remains partial: funding/KYC still require an external step. A green integration status means the selected read/write surface is implemented; it does not mean every provider capability is enabled.
See the integration guide (Russian) for details and the roadmap for next steps.
Quick start
You need Node.js 22.5+ and an MCP client with stdio support, such as Cursor or Claude Desktop. From the downloaded repository directory, run:
npm install
npm run build:mcpAdd the server to your MCP client configuration, replacing the path with your own:
{
"mcpServers": {
"ads-mcp": {
"command": "node",
"args": ["C:/path/to/AdsMCP/dist/index.js"]
}
}
}The client starts the server automatically. Ask your agent to check whether
everything is ready to get started. Data is stored in the repository's data/
directory by default.
Before using operational tools, review the Free Use Rules
through ads_free_use_rules and accept the current version with
ads_free_use_accept using confirm=true. Acceptance is stored only in the
local ADS_MCP_DATA directory.
GitHub updates
At startup AdsMCP checks GitHub at most once every 24 hours. It detects the
repository from the local origin remote, or you can set
ADSMCP_UPDATE_REPOSITORY=owner/repository in .env. A newer release or tag is
downloaded to ADS_MCP_DATA/updates/; the running installation and credentials
are never overwritten. Set ADSMCP_UPDATE_ENABLED=false to disable the check.
Once a week, AdsMCP checks the local Git working tree for changes made by the
user or a module. It never publishes credentials, local data, generated output
or ignored installation state. Recommendation-only changes can be submitted as
a PR automatically when the GitHub contribution setup is ready. Code, module,
documentation or configuration changes are shown by
ads_github_contribution_status and require an explicit
ads_github_contribution_create_pr call with confirm=true.
For contributions, configure ADSMCP_UPSTREAM_REPOSITORY, a personal
ADSMCP_FORK_REPOSITORY and a fine-grained ADSMCP_GITHUB_TOKEN, then call
ads_github_contribution_setup. The fork is not required for local use; it is
required only before publishing a PR. Set ADSMCP_WEEKLY_PR_ENABLED=false to
disable the weekly check.
Documentation
What you need | Where to go |
Configure storage, modules, and the local dashboard | |
Connect a platform and check its capabilities | |
Understand the vision and development direction | |
Explore the architecture and find detailed instructions |
Build it with us
Join in: connect new platforms, improve modules and documentation, and share your solutions. Together we can make advertising simpler, clearer, and more accessible. Start with the developer guide (Russian).
License: MIT.
Available Tools
143 toolsads_aiki_setup_guideA
Return the AIKI MCP configuration plus the AdsMCP workflow: search the community topic, check duplicates and topic rules before publishing a new channel or advertising offer, then hand the unverified proposal to dStore.
Inputs: no named parameters.
ads_aiki_statusC
Show the AIKI community source for AdsMCP. AIKI proposals are unverified leads; dStore must verify them before adding a platform to the catalog.
Inputs: no named parameters.
ads_attribution_reportC
Attribute local conversion events to tracked touchpoints using a selected attribution model.
Inputs: model (required), to, from, project_id, +2 more.
ads_automation_rule_createC
Create a KPI rule. Supported actions are pause_campaign and notify.
Inputs: name (required), action (required), metric (required), operator (required), +5 more.
ads_automation_rule_listC
List automation rules, optionally for one campaign.
Inputs: campaign_id, enabled_only.
ads_automation_runB
Evaluate automation rules. This is dry-run unless execute=true is explicitly set.
Inputs: to (required), from (required), execute, campaign_id.
ads_campaign_analyticsC
Calculate spend, funnel and efficiency KPIs for one or all campaigns.
Inputs: to, from, source, project_id, +1 more.
ads_campaign_createC
Create a local advertising campaign definition, optionally inside a project. It starts in draft status.
Inputs: name (required), objective (required), source, ends_at, +8 more.
ads_campaign_getB
Get one campaign by its local id.
Inputs: campaign_id (required).
ads_campaign_listC
List local campaigns, optionally filtered by project and lifecycle status.
Inputs: limit, source, status, project_id.
ads_campaign_timeseriesC
Read normalized time-bucketed provider metrics saved in local SQLite.
Inputs: to, from, limit, period, +4 more.
ads_campaign_updateC
Update campaign metadata, lifecycle status or project assignment.
Inputs: campaign_id (required), name, source, status, +10 more.
ads_clickru_campaign_draft_set_statusB
Change a locally stored Click.ru campaign between DRAFT and READY. This never sends or launches the campaign.
Inputs: status (required), draft_id (required).
ads_clickru_campaign_drafts_statusA
Show locally stored Click.ru campaign drafts, their statuses and the active campaign. Drafts are not sent or launched.
Inputs: no named parameters.
ads_clickru_profiles_statusA
Show locally stored Click.ru advertiser profiles with masked INNs and the active profile. Never returns API tokens.
Inputs: no named parameters.
ads_client_profile_batch_sendA
Send a saved client-profile draft (firstContact or replyToUnread) to up to 50 active profiles with one explicit batch confirmation. The exact saved draft and every variation must have been approved before sending; any draft change requires fresh approval. Requires Telegram Premium, reports a read-only unread-human-dialog preflight without blocking the write, performs an activity preflight (stale exact last-seen and hidden profiles without an avatar are blocked), enforces at least 15 seconds between messages, blocks opted_out profiles, stops on the first send error, and records each successful outbound message.
Inputs: confirm (required), profile_ids (required), draft_key, max_inactive_days, +1 more.
ads_client_profile_channel_reviewA
Review the public channel linked in a Telegram user's profile and search it for AI-related topics. Uses the selected local GramJS/TDLib backend, never reads non-public chats, never sends messages, and stores only the bounded review result in the client profile.
Inputs: profile_id (required), queries, per_query_limit.
ads_client_profile_createB
Create a local client profile with per-person context. Telegram remains the default channel; channel and external_user_id can represent Mastodon or another connector. contact_account_id records which local connected account made the contact. Consent defaults to unknown; this tool does not send a message.
Inputs: telegram_user_id (required), id, source, status, +11 more.
ads_client_profile_getC
Get one local client profile and its recent dialogue history.
Inputs: profile_id (required), message_limit.
ads_client_profile_listB
List local client profiles without loading full dialogue histories.
Inputs: limit, source, status, consent_status.
ads_client_profile_message_addA
Append an inbound, outbound or internal note to a local client profile. For external or multi-account contacts, pass contact_account_id so the exact account is recorded. This stores history only and never sends a message.
Inputs: text (required), direction (required), profile_id (required), sent_at, +3 more.
ads_client_profile_unread_checkA
Take a fast read-only snapshot of unread one-to-one human Telegram chats. This returns the latest incoming message only; it does not read full history, mark messages as read, or send anything. Before drafting a reply when a person may have multiple messages, run the local full-history sync script npm run telegram:sync:unread and review every returned message.
Inputs: limit.
ads_client_profile_updateC
Update one local client profile, including context, consent status, next action and the local account used for contact. This tool does not send a message.
Inputs: profile_id (required), source, status, context, +8 more.
ads_dashbord_startB
Start the local AdsMCP settings page on 127.0.0.1. It stores Click.ru data, Yandex Direct OAuth token files and settings, Microsoft Advertising OAuth profiles and Mastodon OAuth account tokens locally, and provides the preferred local Telegram account / GramJS login flow; it never performs billing or campaign actions. Use restart=true only to replace an already-running page.
Inputs: port, restart.
ads_dashbord_stopA
Stop the local AdsMCP settings page. This does not delete Click.ru profiles, Microsoft OAuth profiles, Mastodon accounts or campaign drafts.
Inputs: no named parameters.
ads_discord_channel_listB
List viewable text, announcement, forum and thread channels in one Discord server.
Inputs: guild_id (required).
ads_discord_channel_sendA
Send one plain-text message to one selected Discord channel after explicit confirm=true. No bulk sends and no member DMs.
Inputs: text (required), confirm (required), channel_id (required).
ads_discord_guild_listB
List Discord servers where the configured bot is installed. This is not a global server search.
Inputs: limit.
ads_discord_member_searchA
Search members by username or nickname inside one installed Discord server. Finding a member does not authorize contacting them.
Inputs: query (required), guild_id (required), limit.
ads_discord_message_searchA
Search a bounded recent page of messages in one accessible Discord channel; history is not crawled or persisted.
Inputs: channel_id (required), after, limit, query, +1 more.
ads_discord_statusA
Check the official Discord bot connector, credentials and current bot identity. Normal user-account tokens and passwords are not supported.
Inputs: no named parameters.
ads_dstore_card_getA
Read one public dStore card by numeric id or dStore card URL. Returns normalized title, resource URL, icon, platform, tags and description for catalog discovery.
Inputs: id_or_url (required).
ads_dstore_cards_getA
Read up to 50 public dStore cards by id or URL. The result keeps successful cards and reports individual lookup errors.
Inputs: ids_or_urls (required).
ads_dstore_searchB
Search dStore's verified public advertising inventory. Use this for requests to find channels or sites for mutual promotion; AIKI community proposals are separate and remain unverified until dStore checks them.
Inputs: q, lang, sort, limit, +7 more.
ads_dstore_statusA
Show the dStore card and advertising-placement adapter configuration. It reads public catalog data and does not send credentials or publish changes.
Inputs: no named parameters.
ads_event_ingestB
Ingest a funnel event or conversion. A stable dedupe_key makes retries safe.
Inputs: kind (required), event_name (required), campaign_id (required), id, +11 more.
ads_free_use_acceptA
Accept the current AdsMCP Free Use Rules for this local data directory. Review ads_free_use_rules first.
Inputs: confirm (required), rules_version.
ads_free_use_rulesA
Read the AdsMCP Free Use Rules and see whether this local installation has accepted the current version.
Inputs: no named parameters.
ads_github_contribution_create_prA
Review the changedFiles from ads_github_contribution_status, then create one GitHub branch and pull request after confirm=true.
Inputs: confirm (required), body, title.
ads_github_contribution_setupA
Prepare an optional GitHub fork for publishing reviewed AdsMCP changes. confirm=true may create the fork through the configured GitHub token.
Inputs: confirm (required), create_fork, upstream_repository.
ads_github_contribution_statusA
Show the local Git changes and GitHub fork setup without publishing anything.
Inputs: no named parameters.
ads_google_ads_pmax_replace_imagesA
Replace the enabled landscape and portrait marketing images in one Google Ads Performance Max asset group. New images are linked first; square images, logos and text assets are preserved. Requires explicit confirm=true.
Inputs: assets (required), asset_group_id (required), confirm, customer_id, +1 more.
ads_google_ads_reportC
Read daily Google Ads campaign metrics through the configured service-account adapter. This tool never writes to Google Ads.
Inputs: to, from, customer_id, login_customer_id.
ads_google_ads_syncB
Read Google Ads metrics and persist normalized campaign, spend and aggregate conversion data into local SQLite. This never writes to Google Ads.
Inputs: to, from, project_id, customer_id, +1 more.
ads_integration_listB
List registered integrations and built-in adapter capabilities/configuration status.
Inputs: no named parameters.
ads_integration_planB
Show adapter readiness, required environment keys and safe next actions for one or all providers.
Inputs: provider.
ads_integration_registerC
Register an external advertising, CRM or webhook integration without storing secrets.
Inputs: name (required), provider (required), id, config, +2 more.
ads_interest_contact_listB
List public discovery candidates from the local interest registry. This is read-only and never contacts anyone.
Inputs: limit, status, channel, category, +5 more.
ads_interest_contact_upsertB
Save or update one public discovery candidate in the local interest registry. This does not create a client profile, follow anyone or send a message; consent remains unknown by default.
Inputs: channel (required), external_user_id (required), notes, status, +15 more.
ads_interest_research_post_listC
List bounded public research posts collected during discovery. Read-only; it never contacts authors.
Inputs: limit, status, channel, contact_id, +2 more.
ads_interest_research_post_upsertB
Store one bounded public research post linked to an interest contact. This is local research only and never publishes or contacts anyone.
Inputs: channel (required), post_url (required), external_post_id (required), author_external_user_id (required), +12 more.
ads_interest_research_stats_buildB
Build a local time-window snapshot of research demand: post volume, unique authors, contacts, relevance and popular tags. This is analytics only and never contacts anyone.
Inputs: days, channel, project_id.
ads_interest_research_stats_listB
List saved research demand snapshots and tag popularity metrics. Read-only analytics; it never contacts anyone.
Inputs: limit, channel, stat_kind, period_end, +2 more.
ads_interest_research_tag_listC
List aggregated hashtags and research tags from the local discovery base. Read-only.
Inputs: limit, channel, project_id.
ads_mastodon_account_listB
List locally connected Mastodon accounts without returning access tokens.
Inputs: no named parameters.
ads_mastodon_auth_completeB
Complete a pending Mastodon OAuth connection with the one-time code shown by the instance. The code is not logged or returned.
Inputs: code (required), state (required).
ads_mastodon_auth_startA
Start a Mastodon OAuth 2 + PKCE account connection for one instance. Open the returned authorization_url and then complete it with the one-time code.
Inputs: instance_url (required), scopes, account_id, client_name, +1 more.
ads_mastodon_direct_messageA
Send one private Mastodon Direct status to one selected account after explicit confirm=true. The target mention is added automatically; no bulk messaging.
Inputs: text (required), confirm (required), target_account_id (required), account_id.
ads_mastodon_followA
Follow one selected Mastodon account after explicit confirm=true. Search results never trigger follows automatically; read:follows is required to check existing subscriptions and write:follows is required to follow.
Inputs: confirm (required), target_account_id (required), notify, reblogs, +1 more.
ads_mastodon_hashtag_searchB
Read public Mastodon hashtag timelines for AI-related discovery, score cost/local-model/MCP intent signals and return ranked candidate accounts with bounded post evidence. This never follows or contacts anyone.
Inputs: hashtags (required), account_id, min_signal_score, per_hashtag_limit.
ads_mastodon_interest_searchC
Run the expanded Mastodon interest discovery pack for AI agents, MCP, local/self-hosted models, providers, costs and limits; score pain/intent signals and save bounded public evidence to the local research base. This never follows or contacts anyone.
Inputs: hashtags, account_id, project_id, min_signal_score, +2 more.
ads_mastodon_message_batchA
Send an explicitly provided ordered list of Mastodon direct messages, public mentions or replies after confirm=true. Each item names its recipient, exact text and mode; discovery never creates items automatically.
Inputs: confirm (required), messages (required), delay_ms, account_id.
ads_mastodon_notification_listB
Read a bounded page of Mastodon mention notifications to prepare a context-aware reply. This tool never publishes anything.
Inputs: limit, since_id, account_id.
ads_mastodon_pin_statusB
Pin one selected Mastodon status after explicit confirm=true.
Inputs: confirm (required), status_id (required), account_id.
ads_mastodon_profile_updateB
Update selected Mastodon profile fields after explicit confirm=true. Unspecified fields remain unchanged.
Inputs: confirm (required), note, fields, locked, +6 more.
ads_mastodon_public_mentionA
Publish one public Mastodon mention to one selected account after explicit confirm=true. Optionally reply to one public status; no bulk messaging.
Inputs: text (required), confirm (required), target_account_id (required), account_id, +1 more.
ads_mastodon_replyA
Reply to one selected Mastodon status after explicit confirm=true. The target status is checked first, its author mention is added automatically, and the reply visibility cannot be broader than the target.
Inputs: text (required), confirm (required), status_id (required), account_id, +1 more.
ads_mastodon_statusC
Check the connected Mastodon account and current profile through verify_credentials.
Inputs: account_id.
ads_mastodon_thread_createA
Publish one explicitly provided Mastodon thread in order after confirm=true. Every post after the first replies to the previous post; optionally pin only the thread root.
Inputs: posts (required), confirm (required), delay_ms, pin_root, +2 more.
ads_microsoft_ads_reportC
Read aggregate Microsoft Advertising campaign metrics through the official read-only MCP. This tool never writes to Microsoft Ads.
Inputs: to, from, preset, currency, +4 more.
ads_microsoft_ads_syncC
Read aggregate Microsoft Advertising metrics and persist normalized campaigns, spend and conversions into local SQLite. This never writes to Microsoft Ads.
Inputs: to, from, preset, currency, +5 more.
ads_module_callC
Call a tool of a configured provider MCP module, optionally restricted by its allow_tools list. Use provider-native tools for capabilities that AdsMCP does not reimplement.
Inputs: module_id (required), tool_name (required), arguments, timeout_ms.
ads_module_planA
Show configured provider MCP modules without starting them. Modules keep their own API logic and credentials outside the AdsMCP database.
Inputs: no named parameters.
ads_module_toolsC
Discover tools exposed by one configured provider MCP module.
Inputs: module_id (required).
ads_network_aggregate_publishC
Opt-in publish of aggregated campaign metrics. The relay never receives raw local events.
Inputs: node_ref (required), period_to (required), scope_ref (required), dedupe_key (required), +7 more.
ads_network_conversion_reportC
Opt-in anonymous conversion report. Send only opaque references and aggregates, never raw PII or credentials.
Inputs: period (required), node_ref (required), dedupe_key (required), event_type (required), +4 more.
ads_network_inventory_listC
List verified advertising placement offers from the optional relay registry.
Inputs: region, status, channel_type.
ads_network_placement_publishC
Publish an opt-in advertising placement offer. Provider credentials stay local.
Inputs: name (required), pricing (required), channel_type (required), publisher_ref (required), +7 more.
ads_network_platform_listC
List verified or reported advertising platforms from the optional network registry.
Inputs: region, status.
ads_network_platform_reportC
Anonymously report a new advertising platform or integration candidate. No credentials are sent.
Inputs: name (required), provider (required), url, kind, +3 more.
ads_network_profile_listC
Find opt-in networking profiles in the optional relay registry.
Inputs: kind, region.
ads_network_profile_publishC
Publish an opt-in networking profile without advertising credentials or raw campaign data.
Inputs: kind (required), display_name (required), id, regions, +2 more.
ads_network_statusA
Check the optional Ads Network Relay connection. The local MCP works without it.
Inputs: no named parameters.
ads_network_sync_manifestC
Pull opt-in network catalog changes since an ISO timestamp.
Inputs: since.
ads_platform_guideC
Explain what audience and acquisition scenario each advertising platform fits before configuring its MCP module.
Inputs: goal, provider.
ads_project_analyticsC
Calculate aggregate and per-campaign KPIs for one project.
Inputs: project_id (required), to, from.
ads_project_createC
Create a project that groups related advertising campaigns and their analytics.
Inputs: name (required), id, status, metadata, +1 more.
ads_project_getC
Get one local advertising project by its id.
Inputs: project_id (required).
ads_project_listB
List projects, optionally filtered by active or archived status.
Inputs: limit, status.
ads_project_updateB
Update project metadata or archive it without deleting its campaigns.
Inputs: project_id (required), name, status, metadata, +1 more.
ads_spend_recordB
Record spend and daily platform metrics. A stable dedupe_key makes sync retries safe.
Inputs: amount (required), provider (required), campaign_id (required), id, +7 more.
ads_store_statusB
Show local SQLite storage path, row counts and safety defaults.
Inputs: no named parameters.
ads_telegram_account_authB
Continue local Telegram user-account login through the selected backend. GramJS supports starting a local QR flow; never paste Telegram codes or 2FA passwords into a hosted chat.
Inputs: qr, code, phone, password.
ads_telegram_account_searchA
Read recent history or search one Telegram chat through the connected local GramJS/TDLib account. Requires Telegram Premium; no messages are sent.
Inputs: chat (required), limit, query, since.
ads_telegram_account_sendA
Send one plain-text Telegram message through the selected local GramJS/TDLib account. Requires Telegram Premium, prior approval of the exact text, and explicit confirm=true; reports a read-only unread-human-dialog preflight without blocking the write; bulk outreach is not supported.
Inputs: to (required), text (required), confirm (required).
ads_telegram_accounts_reportB
List Telegram Ads cabinets and optionally read one or all cabinets. Switching cabinets requires explicit confirm=true and is restored to the original cabinet afterward.
Inputs: all, confirm, max_ads, module_id, +3 more.
ads_telegram_accounts_syncB
Read one or all Telegram Ads cabinets and persist their campaigns, daily spend and optional time-bucketed metrics into local SQLite. Cabinet switching requires explicit confirm=true.
Inputs: all, confirm, max_ads, module_id, +5 more.
ads_telegram_account_statusA
Check the local Telegram user-account GramJS/TDLib dependencies, credentials, authentication state and ignored storage paths.
Inputs: no named parameters.
ads_telegram_action_queue_cancelA
Cancel all still-queued actions in one local Telegram action queue. Requires confirm=true; already sent or failed actions are not changed.
Inputs: confirm (required), queue_id (required).
ads_telegram_action_queue_createA
Create an ordered local Telegram action queue from explicitly supplied targets and exact texts. Requires confirm=true; it does not execute anything. Supports one-to-one messages, group replies, channel-post replies and one-message reactions. No recipient discovery is performed. Each action is assigned a random pause between min_delay_seconds and max_delay_seconds (default 15β66 s) before it runs.
Inputs: actions (required), confirm (required), project_id, max_delay_seconds, +1 more.
ads_telegram_action_queue_listB
List the exact actions and statuses in one local Telegram action queue. Read-only; it does not send or mark anything read.
Inputs: queue_id (required), status.
ads_telegram_action_queue_processA
Execute an explicitly approved Telegram action queue in sequence. Requires Premium and confirm=true; verifies each action through the existing send/reply/reaction tools, waits at least the configured interval, and stops on the first error without retrying.
Inputs: confirm (required), queue_id (required), max_actions, wait_for_interval.
ads_telegram_ads_api_create_adA
Create one Telegram Ads advertisement through the official API. This is a provider write; confirm=true is required. Defaults to paused with zero initial budget.
Inputs: cpm (required), title (required), target (required), confirm (required), +12 more.
ads_telegram_ads_api_increase_ad_budgetB
Increase one Telegram Ads ad budget through the official API. This is a provider write; confirm=true is required.
Inputs: ad_id (required), amount (required), confirm (required), account_id, +2 more.
ads_telegram_ads_api_reportC
Read Telegram Ads through the official promoteapi.telegram.org API. This is read-only and supports exact date-bounded 5-minute or daily stats.
Inputs: to, from, max_ads, account_id, +3 more.
ads_telegram_ads_api_set_ad_pausedB
Pause or resume one Telegram Ads ad through the official API. This is a provider write; confirm=true is required.
Inputs: ad_id (required), confirm (required), is_paused (required), account_id, +1 more.
ads_telegram_ads_api_statusA
Show the official Telegram Ads API layer readiness. With probe=true, perform one read-only getCurrentAccount request; provider writes remain separately guarded.
Inputs: probe.
ads_telegram_ads_api_submit_ad_for_reviewB
Submit one Telegram Ads ad for moderation through the official API. This is a provider write; confirm=true is required.
Inputs: ad_id (required), confirm (required), account_id, timeout_ms.
ads_telegram_ads_api_syncB
Read official Telegram Ads API metrics and persist them into the same local SQLite campaign model. This never writes to Telegram Ads.
Inputs: to, from, max_ads, account_id, +4 more.
ads_telegram_ads_reportC
Read Telegram Ads account, campaigns and normalized metrics through the configured HTTP-based MCP module. This is read-only.
Inputs: max_ads, list_tool, module_id, stats_tool, +2 more.
ads_telegram_ads_syncC
Read Telegram Ads metrics and persist campaigns, daily spend and optional time-bucketed metrics into local SQLite. This never writes to Telegram Ads.
Inputs: max_ads, list_tool, module_id, project_id, +3 more.
ads_telegram_ai_chat_listB
List public Telegram AI-related chats saved in the local catalog; defaults to the Neron project and never returns participant data.
Inputs: limit, status, chat_type, project_id.
ads_telegram_ai_chat_upsertB
Save or update one public Telegram group/channel discovered for AI-related topics. This writes only local chat metadata under a project and never collects participants or sends messages.
Inputs: title (required), telegram_chat_id (required), notes, status, +10 more.
ads_telegram_ai_keyword_listB
List aggregated Telegram AI demand keywords with source counters and recent-vs-previous trend direction; read-only and never contacts Telegram.
Inputs: kind, limit, topic, status, +3 more.
ads_telegram_ai_keyword_observeA
Extract normalized demand keywords from one search query or user-provided text and update local trend counters. The submitted text is not stored and this tool never contacts Telegram.
Inputs: text (required), source_ref (required), source_type (required), topic, +5 more.
ads_telegram_ai_keyword_rebuildA
Rebuild demand keyword observations from existing search history, saved public AI posts and inbound client messages. Set reset=true only to replace the derived keyword aggregate and observation tables; stores only normalized keywords and source metadata; never sends messages.
Inputs: reset, project_id.
ads_telegram_ai_keyword_topic_listB
List aggregated demand-topic trends that group related keyword variants, with source counters and recent-vs-previous activity; read-only and never contacts Telegram.
Inputs: limit, status, project_id, window_days.
ads_telegram_ai_post_listB
List public Telegram posts saved from the global AI search. Results are classified locally as request, opportunity, discussion, promotion or repost; this tool never sends messages.
Inputs: limit, min_score, project_id, classification.
ads_telegram_ai_post_reclassifyB
Reclassify saved public Telegram AI posts and rebuild Neron offer matches plus contextual public reply drafts. Local-only: never sends or edits Telegram messages.
Inputs: project_id.
ads_telegram_ai_search_query_listB
List saved Telegram AI search phrases and their last-run/result counters; read-only and never contacts Telegram.
Inputs: limit, topic, status, project_id.
ads_telegram_ai_search_query_upsertB
Save or update one Telegram AI search phrase for later discovery and demand analysis. This changes only local SQLite and never searches or sends messages.
Inputs: query (required), notes, topic, intent, +6 more.
ads_telegram_ai_search_run_listB
List the append-only history of Telegram AI searches, including source/scope, status, quota and result counters; read-only and never contacts Telegram.
Inputs: limit, source, status, query_id, +1 more.
ads_telegram_ai_trend_snapshot_buildB
Build one weekly demand snapshot grouped by topic and intent, with deduplicated source counts. This changes only local analytics tables and never contacts Telegram.
Inputs: reset, project_id, period_start, source_scope.
ads_telegram_ai_trend_snapshot_listB
List saved weekly demand snapshots by topic and intent; read-only and never contacts Telegram.
Inputs: limit, topic, intent, project_id, +2 more.
ads_telegram_channel_direct_checkA
Read-only preflight for a broadcast Telegram channel: checks Direct Messages, the connected discussion chat, and public contacts from the channel description. Requires Telegram Premium; never joins, sends a message, or creates a public post.
Inputs: channel (required).
ads_telegram_channel_direct_sendA
Send one explicitly approved plain-text message to a Telegram channel's Direct Messages monoforum, only when a read-only preflight confirms that Direct Messages are enabled. Requires Telegram Premium and confirm=true; never publishes to the channel feed.
Inputs: text (required), channel (required), confirm (required).
ads_telegram_chat_mark_readA
Mark one human one-to-one Telegram chat as read. Requires explicit confirm=true; sends no message, does not create a local dialogue row, and does not mark bots or channels.
Inputs: chat (required), confirm (required).
ads_telegram_chat_replyA
Reply publicly to one message inside an accessible Telegram group when the message contains a relevant explicit request and the resource rules permit it. Requires Telegram Premium and explicit confirm=true; reports a read-only unread-human-dialog preflight without blocking the write; never sends a private message and never bypasses moderation, CAPTCHA or guest-send restrictions.
Inputs: chat (required), text (required), confirm (required), message_id (required).
ads_telegram_message_reactA
Add one emoji reaction to one existing Telegram message through the selected local GramJS/TDLib account. Requires Telegram Premium, explicit confirm=true and (when available) expected_text to fail closed if the message changed; does not send text or mark the chat read.
Inputs: chat (required), confirm (required), reaction (required), message_id (required), +1 more.
ads_telegram_public_post_replyA
Reply publicly to one Telegram channel post through its linked discussion only when the post contains a relevant explicit request and the resource rules permit it. Requires Telegram Premium and explicit confirm=true; reports a read-only unread-human-dialog preflight without blocking the write; never sends a private message and never bypasses moderation or guest-send restrictions.
Inputs: text (required), channel (required), confirm (required), message_id (required).
ads_telegram_public_posts_searchA
Search public Telegram channel posts globally by full-text query. Requires Telegram Premium. Uses a free daily quota when available and never spends Stars without explicit confirm_paid=true plus a sufficient max_stars limit.
Inputs: query (required), limit, max_stars, confirm_paid.
ads_telegram_public_reply_listB
List public Telegram replies and mentions saved in the local audit table; pending items are shown first and nothing is sent.
Inputs: limit, status, project_id, telegram_chat_id.
ads_telegram_public_reply_statusA
Set the review status of one saved public Telegram reply. This changes only local audit data and never sends a message.
Inputs: id (required), status (required), decision_note, our_reply_url, +1 more.
ads_telegram_public_reply_syncA
Read a bounded recent history in selected public Telegram chats and save direct replies plus a small context window after each outgoing message, because people may answer without using Telegram's reply action. Requires Premium; never sends, joins, collects participant lists or marks messages read.
Inputs: chat_refs, project_id, limit_per_chat, context_messages_after.
ads_telegram_public_reply_upsertC
Save or update one public Telegram reply/mention found under a message from the connected account. Local-only; never sends or marks messages read.
Inputs: text (required), public_url (required), telegram_chat_id (required), telegram_message_id (required), +17 more.
ads_tg_resource_listB
List generic Telegram groups and channels saved in the local tg_resources catalog; defaults to the Neron project and never returns participant data.
Inputs: type, limit, status, project_id, +2 more.
ads_tg_resource_post_listB
List confirmed Telegram publication links recorded for local resources; this is read-only and never sends messages.
Inputs: limit, status, project_id, resource_id.
ads_tg_resource_post_recordB
Record a confirmed Telegram publication link for a cataloged group or channel. This only updates the local audit trail and never sends a message.
Inputs: public_url (required), notes, status, metadata, +8 more.
ads_tg_resource_upsertB
Save or update one Telegram group or channel in the generic local resource catalog. This stores metadata only and never joins, leaves or sends messages.
Inputs: type (required), title (required), telegram_resource_id (required), notes, +13 more.
ads_yandex_direct_create_campaignA
Create one paused Yandex Direct text campaign through the guarded provider path. The new campaign is created with search and network serving off, without ads or a budget; it cannot start showing until configured and enabled separately.
Inputs: name (required), confirm (required), start_date (required), idempotency_key (required), +2 more.
ads_yandex_direct_reportB
Read Yandex Direct campaign statistics through the configured provider MCP module and normalize the result by day.
Inputs: to, from, currency, module_id, +2 more.
ads_yandex_direct_syncC
Read Yandex Direct statistics through the provider MCP module and persist normalized campaigns, spend and conversions into local SQLite.
Inputs: to, from, currency, module_id, +3 more.
ads_yandex_direct_writeA
Apply an explicitly confirmed, idempotent Yandex Direct campaign change through the provider API. Updates and lifecycle status changes for existing campaigns are exposed; creation uses the dedicated safe create tool and deletion remains disabled.
Inputs: items (required), method (required), confirm (required), service (required), +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogβ¦
TDQS
Scored across 143 tools
The set contains many near-overlapping tools, especially across Telegram Ads report/sync/API variants, Telegram action queues, public reply/post research, and multiple local catalog tools. Descriptions add context, but an agent can easily confuse names like ads_telegram_ads_report vs ads_telegram_ads_api_report or ads_telegram_ai_post_list vs ads_interest_research_post_list.
All tools use an ads_ prefix and snake_case, giving a mostly predictable namespace. However, action ordering is uneven across compound names, there is a visible typo in ads_dashbord_start/stop, and similar concepts use inconsistent labels such as cards_get vs card_get and dstore vs tg_resource.
143 tools is far too many for a coherent MCP surface. Even for a broad advertising automation server, the set spans many domains, providers, local catalogs, research workflows, networking, and messaging channels, making discovery and correct selection very difficult.
The surface is broad and covers many advertising, reporting, sync, outreach, and local analytics workflows, but lifecycle coverage is uneven. Some entities lack delete operations, several ad platforms are mostly read/sync-only, and write coverage is concentrated in specific providers such as Telegram, Yandex Direct, and Mastodon.
Maintenance
Related MCP Connectors
Google Ads MCP server: run Search, Display, Demand Gen and PMax campaigns from AI.
Hosted MCP server for marketing agencies: connect Google Ads, GA4, Search Console, Meta, LinkedIn and more to Claude or ChatGPT. Pull reports and make changes via OAuth login, no setup.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
X Ads (Twitter Ads) MCP server: run X campaigns, ad groups, ads and reports from AI.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for AI agents to manage ad campaigns across Google, Meta, LinkedIn, Microsoft, Reddit, TikTok, and more21618 npm21MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for managing ad campaigns across Google Ads, Meta, and more. Enables deploying campaigns, checking performance, and managing budgets from terminal or AI assistants.MIT
- AlicenseAqualityCmaintenanceA local MCP server that connects Yandex Direct advertising reports and safe campaign creation to AI agents, enabling natural-language analytics and protected campaign setup.82MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that gives AI agents direct access to the Yandex Direct API to manage campaigns, groups, ads, keywords, bids, and reports via natural language.117 npm6Apache 2.0