From 012d5c4de962ea33d1e4259877a58c76dd31fdef Mon Sep 17 00:00:00 2001 From: ahmed-3li <51079661+ahmed-3li@users.noreply.github.com> Date: Mon, 4 May 2026 21:51:14 +0400 Subject: [PATCH] docs: add Markifact MCP integration (#1720) * docs: add Markifact MCP integration Adds the Markifact MCP server (https://api.markifact.com/mcp) as an ADK integration with both Local (mcp-remote OAuth) and Remote (Streamable HTTP + bearer) connection patterns for Python and TypeScript. * Formatting and edits * Markifact site is returning an error with our link checker CI Rejected status code: 429 Too Many Requests (configurable with "accept" option) * Remove unneeded URL that is also failing link checker --------- Co-authored-by: Kristopher Overholt --- .lycheeignore | 1 + docs/integrations/assets/markifact.png | Bin 0 -> 5554 bytes docs/integrations/markifact.md | 241 +++++++++++++++++++++++++ 3 files changed, 242 insertions(+) create mode 100644 docs/integrations/assets/markifact.png create mode 100644 docs/integrations/markifact.md diff --git a/.lycheeignore b/.lycheeignore index 4200ad9533..72b96df258 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -13,3 +13,4 @@ # Rate limits automated requests ^https://www\.gnu\.org/ +^https://www\.markifact\.com diff --git a/docs/integrations/assets/markifact.png b/docs/integrations/assets/markifact.png new file mode 100644 index 0000000000000000000000000000000000000000..eefd2855d776b8d3ea6b573c07de1470b8a2d6c6 GIT binary patch literal 5554 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 literal 0 HcmV?d00001 diff --git a/docs/integrations/markifact.md b/docs/integrations/markifact.md new file mode 100644 index 0000000000..34dd44d035 --- /dev/null +++ b/docs/integrations/markifact.md @@ -0,0 +1,241 @@ +--- +catalog_title: Markifact +catalog_description: Manage marketing operations across Google Ads, Meta, GA4, TikTok, and 15+ more platforms +catalog_icon: /integrations/assets/markifact.png +catalog_tags: ["mcp", "connectors"] +--- + +# Markifact MCP tool for ADK + +
+ Supported in ADKPythonTypeScript +
+ +The [Markifact MCP Server](https://github.com/markifact/markifact-mcp) connects +your ADK agent to [Markifact](https://www.markifact.com), an AI marketing +automation platform with 300+ operations across 20+ platforms including Google +Ads, Meta Ads, GA4, TikTok Ads, and Shopify. This integration gives your agent +the ability to manage campaigns, analyze performance, and automate marketing +workflows using natural language, with approval prompts on every write operation. + +## Use cases + +- **Spend hygiene**: surface wasted budget across Google Ads, Meta, TikTok and + LinkedIn with concrete pause and reallocation recommendations. +- **Unified reporting**: one prompt produces blended spend, ROAS, CAC and + conversion deltas across every connected channel and GA4. +- **Briefs to live campaigns**: go from a one-line brief to drafted Search, + Performance Max, Meta Advantage+, TikTok or LinkedIn campaigns ready for + human approval. +- **Lead handoff**: sweep Meta and LinkedIn lead forms, enrich in HubSpot or + Klaviyo, and trigger WhatsApp or Slack follow-ups. + +## Prerequisites + +- A [Markifact](https://www.markifact.com) account (free tier available) +- At least one platform connected from the Markifact dashboard (Google Ads, + Meta, GA4, Shopify, etc.) +- See the [Markifact docs](https://docs.markifact.com) for connection setup + +## Use with agent + +=== "Python" + + === "Local MCP Server" + + ```python + from google.adk.agents import Agent + from google.adk.tools.mcp_tool import McpToolset + from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams + from mcp import StdioServerParameters + + root_agent = Agent( + model="gemini-flash-latest", + name="marketing_agent", + instruction=( + "You are a performance marketing agent that helps users manage " + "ad campaigns, run analytics, sync e-commerce data, and " + "execute marketing workflows across Google Ads, Meta Ads, GA4, " + "TikTok Ads, LinkedIn Ads, Shopify, HubSpot, and more. " + "Always confirm with the user before any write operation." + ), + tools=[ + McpToolset( + connection_params=StdioConnectionParams( + server_params=StdioServerParameters( + command="npx", + args=[ + "-y", + "mcp-remote", + "https://api.markifact.com/mcp", + ], + ), + timeout=30, + ), + ) + ], + ) + ``` + + !!! note + + When you run this agent for the first time, a browser window opens + automatically to request access via OAuth. Approve the request in + your browser to grant the agent access to your connected accounts. + + === "Remote MCP Server" + + ```python + from google.adk.agents import Agent + from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams + + MARKIFACT_ACCESS_TOKEN = "YOUR_MARKIFACT_ACCESS_TOKEN" + + root_agent = Agent( + model="gemini-flash-latest", + name="marketing_agent", + instruction=( + "You are a performance marketing agent that helps users manage " + "ad campaigns, run analytics, sync e-commerce data, and " + "execute marketing workflows across Google Ads, Meta Ads, GA4, " + "TikTok Ads, LinkedIn Ads, Shopify, HubSpot, and more. " + "Always confirm with the user before any write operation." + ), + tools=[ + McpToolset( + connection_params=StreamableHTTPConnectionParams( + url="https://api.markifact.com/mcp", + headers={ + "Authorization": f"Bearer {MARKIFACT_ACCESS_TOKEN}", + }, + ), + ) + ], + ) + ``` + + !!! note + + If you already have a Markifact access token, you can connect + directly using Streamable HTTP without the OAuth browser flow. + +=== "TypeScript" + + === "Local MCP Server" + + ```typescript + import { LlmAgent, MCPToolset } from "@google/adk"; + + const rootAgent = new LlmAgent({ + model: "gemini-flash-latest", + name: "marketing_agent", + instruction: + "You are a performance marketing agent that helps users manage " + + "ad campaigns, run analytics, sync e-commerce data, and " + + "execute marketing workflows across Google Ads, Meta Ads, GA4, " + + "TikTok Ads, LinkedIn Ads, Shopify, HubSpot, and more. " + + "Always confirm with the user before any write operation.", + tools: [ + new MCPToolset({ + type: "StdioConnectionParams", + serverParams: { + command: "npx", + args: [ + "-y", + "mcp-remote", + "https://api.markifact.com/mcp", + ], + }, + }), + ], + }); + + export { rootAgent }; + ``` + + !!! note + + When you run this agent for the first time, a browser window opens + automatically to request access via OAuth. Approve the request in + your browser to grant the agent access to your connected accounts. + + === "Remote MCP Server" + + ```typescript + import { LlmAgent, MCPToolset } from "@google/adk"; + + const MARKIFACT_ACCESS_TOKEN = "YOUR_MARKIFACT_ACCESS_TOKEN"; + + const rootAgent = new LlmAgent({ + model: "gemini-flash-latest", + name: "marketing_agent", + instruction: + "You are a performance marketing agent that helps users manage " + + "ad campaigns, run analytics, sync e-commerce data, and " + + "execute marketing workflows across Google Ads, Meta Ads, GA4, " + + "TikTok Ads, LinkedIn Ads, Shopify, HubSpot, and more. " + + "Always confirm with the user before any write operation.", + tools: [ + new MCPToolset({ + type: "StreamableHTTPConnectionParams", + url: "https://api.markifact.com/mcp", + transportOptions: { + requestInit: { + headers: { + Authorization: `Bearer ${MARKIFACT_ACCESS_TOKEN}`, + }, + }, + }, + }), + ], + }); + + export { rootAgent }; + ``` + + !!! note + + If you already have a Markifact access token, you can connect + directly using Streamable HTTP without the OAuth browser flow. + +## Available tools + +Tool | Description +---- | ----------- +`find_operations` | Semantic search over the operation registry, scoped by platform and intent +`get_operation_inputs` | Returns JSON Schema for a specific operation's inputs +`run_operation` | Execute read operations +`run_write_operation` | Execute write operations with approval protocol +`list_connections` | List OAuth connections in the workspace +`get_file_url` | Get URLs for reports and exports +`read_file` | Read file contents +`upload_media` | Upload media assets + +## Capabilities + +Capability | Description +---------- | ----------- +Discovery | Semantic search over 300+ operations with read/write classification +Approval-gated writes | Four-step protocol around `run_write_operation` for any spend or destructive change +Campaign management | Create, edit, pause and resume campaigns, ad sets and ads across all paid channels +Reporting & attribution | Cross-platform spend, ROAS and conversion blends, plus GA4 path and channel analysis +Audiences | Custom audiences, lookalikes, exclusions and behavioural targeting per platform +Creative | Asset upload, variant rotation, fatigue detection and approval-gated publishing +Commerce & CRM | Shopify, HubSpot and Klaviyo sync with paid media for closed-loop reporting +Messaging | WhatsApp and Slack notifications for approvals, alerts and lead handoff +File I/O | Reports, exports and uploads via `get_file_url`, `read_file`, `upload_media` + +## Supported platforms + +Category | Platforms +-------- | --------- +Paid media | Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads, Reddit Ads, Pinterest Ads, Snapchat Ads, Amazon Ads, DV360 +Analytics | GA4, BigQuery, Google Search Console, Google Merchant Center +E-commerce, CRM, messaging | Shopify, HubSpot, Klaviyo, WhatsApp, Slack +Organic & social | Facebook, Instagram, LinkedIn, Google Business Profile + +## Additional resources + +- [Markifact Website](https://www.markifact.com) +- [Markifact MCP Server on GitHub](https://github.com/markifact/markifact-mcp) +- [Skills on skills.sh](https://skills.sh/markifact/markifact-mcp)