Google Ads MCP by Markifact
Google Ads MCP server: reports, search terms, negatives, budgets, bids, campaign creation and Performance Max, with approval on every write.
What it can do
- Report Markifact Feedback: Submit actionable product feedback to Markifact with the user's authorization. When you encounter a likely Markifact bug, missing capability, or product limitation while com
- Find Operations: Search for available Markifact operations that can be executed by the authenticated user. Workflow: find_operations → get_operation_inputs → run_operation (read-only) or run_write_ope
- Get Operation Inputs: Get the input schema, required fields, defaults and constraints for an operation. Required step between find_operations and run_operation/run_write_operation. Call this once per
What data it sees
Do you need an account
No: the server works without sign-in
Google Ads MCP server: reports, search terms, negatives, budgets, bids, campaign creation and Performance Max, with approval on every write. Hosted, one OAuth login, nothing to install locally. 67 Google Ads operations, manager accounts supported. Connect Claude and ChatGPT to Google Ads.
How to connect
How to connect Google Ads MCP by Markifact to Claude
The server address to paste into Claude settings:
https://google-ads-mcp--markifact.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect Google Ads MCP by Markifact to ChatGPT
The server address to paste into ChatGPT settings:
https://google-ads-mcp--markifact.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect Google Ads MCP by Markifact to Cursor
The server address to paste into Cursor settings:
https://google-ads-mcp--markifact.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (10)
Raw names from tools/list. Only developers need these.
| report_markifact_feedback | Submit actionable product feedback to Markifact with the user's authorization. When you encounter a likely Markifact bug, missing capability, or product limitation while completing a task, proactively tell the user what you found and offer to report it to Markifact. You may draft a concise proposed report for the user to review. Call this tool only after either: 1. the user explicitly asks you to submit the feedback, or 2. you offered to report a discovered issue and the user explicitly agreed. If the user's request already clearly authorizes submission, do not ask for redundant confirmation. Do not call this tool merely to ask for permission, and do not submit feedback silently. This tool creates an irreversible feedback submission in Markifact's support workflow. The submission contains the supplied feedback, relevant operation IDs, and account-associated contact and reference identifiers. After a successful call, briefly tell the user that the feedback was submitted. Report only issues Markifact itself caused. Low-level operations such as gads_mutate or meta_ads_update_adset pass requests straight to the platform, so their responses are the platform's, not Markifact's. A write the platform accepted is complete; if the state differs later, something else changed it. If you are unsure how a platform behaves, research its documentation. Never report third-party policies, outages, rate limits, rejected content, campaign performance, or user configuration. For a potentially missing integration capability, use the normal operation discovery flow to check whether Markifact already provides a dedicated or generic operation that supports the requested action. Do not execute a write operation merely to test whether a capability exists. Include only the minimum non-sensitive concrete evidence needed to understand the issue. Never include passwords, API keys, access tokens, authentication details, payment information, raw conversation history, complete request or resp |
| find_operations | Search for available Markifact operations that can be executed by the authenticated user. Workflow: find_operations → get_operation_inputs → run_operation (read-only) or run_write_operation (when requires_approval: true). After selecting an operation_id, always call get_operation_inputs next. Never call run_operation / run_write_operation without first inspecting the schema via get_operation_inputs. Input shapes, nested objects, and field names vary per operation and cannot be guessed. Returned operation IDs are registry-backed Markifact operation IDs, not arbitrary action names. Returns JSON with matching operations containing operation_id, description, and app metadata. |
| get_operation_inputs | Get the input schema, required fields, defaults and constraints for an operation. Required step between find_operations and run_operation/run_write_operation. Call this once per operation_id before executing it — schemas contain nested objects, account selectors, and field names that vary per operation and cannot be guessed. If you already retrieved the schema for this operation_id earlier in the conversation, reuse it instead of calling again. Only pass fields from this schema in run_operation/run_write_operation input_data for the same operation_id. Returns JSON schema describing the operation's inputs. |
| run_operation | Execute a **read-only** Markifact operation, such as fetching reports, listing records, selecting accounts, or looking up account details. Use this in direct response to the user's current request. Do not use it for startup checks or background context gathering. For write/create/update/delete actions, use `run_write_operation` instead. Operations returned by `find_operations` with `requires_approval: true` MUST be executed via `run_write_operation`. operation_id must be an exact Markifact operation ID returned by find_operations for the authenticated user. Never call this without first inspecting the schema via `get_operation_inputs`. Input shapes, nested objects, and field names vary per operation and cannot be guessed. input_data must contain only fields from the get_operation_inputs schema for the same operation_id. Reporting tips - Reporting operations (GA4, Google Ads, Meta Ads, etc.) require account IDs. Use the relevant `select_accounts` operation first, treating user-provided account names as substring matches. - Never guess metric or dimension values. Use the relevant `list_report_fields` operation to confirm available fields before building a report. - For Google Ads, always prefer using the `gads_get_report` operation. Use `gads_run_gaql_query` only for advanced or unsupported reporting queries. Files - Some operations may return `file_id` when datasets are too large. You will also receive a small `data_preview` for context. - You can reference any file ID in other operation inputs using this syntax: `{{file-id}}`, for example: `{"data": "{{file-xe3fw}}"}` (exactly as provided—do not modify or invent file ids). - When you pass a `file_id` to another operation, the file content will be automatically loaded and converted to the correct data type. JSON becomes Python dict/list, CSV/XLSX becomes a list of dicts (rows), and images/binary files become raw bytes. You do **not** need to handle parsing or conversion—just pass `{{file-id}}`. - The file ID is |
| run_write_operation | Execute a **write** operation that creates, updates, or deletes external data. Use this tool ONLY for operations marked with `requires_approval: true` in `find_operations` results. These are destructive actions like creating campaigns, updating ad statuses, sending emails, etc. operation_id must be an exact Markifact operation ID returned by find_operations for the authenticated user. **APPROVAL REQUIRED**: Every call writes irreversibly to the user's live external accounts. Before each invocation, summarize the exact change in plain language (operation, target account/resource, key field values) and wait for explicit user confirmation. Never call without user's confirmation, approval is CRITICAL. Never call this without first inspecting the schema via `get_operation_inputs`. Input shapes, nested objects, and field names vary per operation and cannot be guessed. input_data must contain only fields from the get_operation_inputs schema for the same operation_id. Write-operation tips - Always prefer a dedicated operation when one already matches the task. - Some platforms have a generic fallback operation for create, update, or remove mutations not covered by a dedicated operation, for example `gads_mutate` for Google Ads. Use the fallback before reporting a missing write feature. Files - Some operations may return `file_id` when datasets are too large. You will also receive a small `data_preview` for context. - You can reference any file ID in other operation inputs using this syntax: `{{file-id}}`, for example: `{"data": "{{file-xe3fw}}"}` (exactly as provided—do not modify or invent file ids). - When you pass a `file_id` to another operation, the file content will be automatically loaded and converted to the correct data type. JSON becomes Python dict/list, CSV/XLSX becomes a list of dicts (rows), and images/binary files become raw bytes. You do **not** need to handle parsing or conversion—just pass `{{file-id}}`. - The file ID is for you to move data between o |
| list_connections | List saved Markifact connections for an app/platform. A connection is a saved authenticated integration in Markifact. The returned `id` is the `connection_id` used to choose which saved login/integration an operation should use. Important: - `connection_id` is not an external platform account ID. - External account IDs, customer IDs, property IDs, and similar values are separate operation inputs. - One connection may have access to multiple external accounts. - In most cases, you don not need to provide `connection_id`. If the user has only one connected login for a platform in their workspace, operations usually use that connection automatically. Use this tool only when the user wants a specific saved integration or has multiple connections for the same platform. Returns JSON with available connections containing `id`, `type`, and `display_name`. |
| get_file_url | Get a signed URL for a private file. Use this when an operation returns a `file_id` and you need a temporary, directly accessible URL. Operation `file_url` values are user-facing app URLs that require Markifact authentication; call this tool to generate a signed URL that the model or external tools can open directly. The signed URL expires after 1 hour. Returns a signed GCS URL for the file. |
| read_file | Inspect a file returned by a previous operation as numbered lines of text. Use this when an operation returns a `file_id` and you want to inspect the file contents before deciding what to do next. This is mainly useful for exported JSON, CSV, logs, and similar files produced by Markifact operations. It returns the file as numbered text lines so you can quickly review the structure, schema, headers, sample rows, or specific sections in chunks. Returns formatted text with line numbers. After inspecting, you can use {{file-id}} in other tool inputs to pass the full parsed content for processing. |
| upload_media | Upload an image or video asset for later operations. Use this when the user needs to provide media that will be reused in later tool calls, for example creating Facebook ad image or video asset, or a Google Ads creative flow. The tool returns file URLs that can be passed into later operations that accept uploaded media. Only image and video uploads are supported. |
| prepare_media_upload | Create a signed upload URL for a media file selected in the upload UI. Returns upload details including file_id, file_url, upload_url and upload_token, or a validation error. |