paid-ads
Server Details
Hosted MCP server for Google Ads and LinkedIn Ads analysis.
- Status
- Unhealthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP
- URL
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
- Added
linkedin_get_creative_preview_asset
1 tool update
- Added
linkedin_render_account_health
3 tool updates
- Changed
linkedin_compare_creative_performance5 fields changed- added
Input schema / properties / lookbackDays / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "string" + } +] - changed
Input schema / properties / lookbackDays / descriptionPrevious value: -"Performance-report style alias for a single trailing window size in days when windows is omitted. For example, lookbackDays: 30 is equivalent to windows: [30]."New value: +"Performance-report style alias for a single trailing window size in days when windows is omitted. For example, lookbackDays: 30, \"30d\", \"30 days\", or \"past 30 days\" is equivalent to windows: [30]." - removed
Input schema / properties / lookbackDays / typeRemoved value: -"number" - added
Input schema / properties / windows / items / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "string" + } +] - removed
Input schema / properties / windows / items / typeRemoved value: -"number"
- Added
linkedin_record_creative_comparison_render_event - Changed
linkedin_render_creative_comparison5 fields changed- added
Input schema / properties / lookbackDays / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "string" + } +] - changed
Input schema / properties / lookbackDays / descriptionPrevious value: -"Performance-report style alias for a single trailing window size in days when windows is omitted. For example, lookbackDays: 30 is equivalent to windows: [30]."New value: +"Performance-report style alias for a single trailing window size in days when windows is omitted. For example, lookbackDays: 30, \"30d\", \"30 days\", or \"past 30 days\" is equivalent to windows: [30]." - removed
Input schema / properties / lookbackDays / typeRemoved value: -"number" - added
Input schema / properties / windows / items / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "string" + } +] - removed
Input schema / properties / windows / items / typeRemoved value: -"number"
1 tool update
- Changed
linkedin_render_creative_comparison1 field changed- changed
Input schema / properties / pageSize / descriptionPrevious value: -"MCP delivery page size for creative comparison rows when comparisonPayload is not supplied. Defaults to 50, max 200."New value: +"MCP delivery page size for raw creative rows when comparisonPayload is not supplied. Visual renders automatically request up to 200 rows for app hydration so the dashboard is not limited by model-supplied page sizes."
1 tool update
- Added
linkedin_get_creative_comparison_rows
1 tool update
- Changed
linkedin_render_creative_comparison1 field changed- removed
Input schema / oneOfRemoved value: -[ - { - "required": [ - "comparisonPayload" - ] - }, - { - "not": { - "anyOf": [ - { - "required": [ - "campaignId" - ] - }, - { - "required": [ - "campaignIds" - ] - } - ] - }, - "properties": { - "scope": { - "enum": [ - "account" - ], - "type": "string" - } - }, - "required": [ - "scope", - "accountId" - ] - }, - { - "anyOf": [ - { - "required": [ - "advertiserContextId" - ] - }, - { - "required": [ - "advertiserName" - ] - }, - { - "required": [ - "query" - ] - } - ], - "not": { - "anyOf": [ - { - "required": [ - "campaignId" - ] - }, - { - "required": [ - "campaignIds" - ] - } - ] - } - }, - { - "anyOf": [ - { - "required": [ - "campaignId" - ] - }, - { - "required": [ - "campaignIds" - ] - } - ], - "properties": { - "scope": { - "enum": [ - "campaign" - ], - "type": "string" - } - }, - "required": [ - "scope" - ] - } -]
2 tool updates
- Changed
linkedin_compare_creative_performance1 field changed- changed
Input schema / properties / accountId / descriptionPrevious value: -"Numeric LinkedIn Ad Account ID. Required for account-wide creative comparisons. When used with campaignId or campaignIds, set scope to campaign so the account is treated only as the parent account."New value: +"Numeric LinkedIn Ad Account ID. If omitted for account-wide creative comparisons, advertiserName/query or the most recent LinkedIn account from session memory is used when available. When used with campaignId or campaignIds, set scope to campaign so the account is treated only as the parent account."
- Changed
linkedin_render_creative_comparison2 fields changed- changed
Input schema / properties / accountId / descriptionPrevious value: -"Numeric LinkedIn Ad Account ID. Required for account-wide creative reports. When used with campaignId or campaignIds, set scope to campaign so the account is treated only as the parent account."New value: +"Numeric LinkedIn Ad Account ID. If omitted for account-wide creative reports, advertiserName/query or the most recent LinkedIn account from session memory is used when available. When used with campaignId or campaignIds, set scope to campaign so the account is treated only as the parent account." - changed
Input schema / properties / comparisonPayload / descriptionPrevious value: -"The structuredContent object returned by linkedin_compare_creative_performance."New value: +"The structuredContent object returned by linkedin_compare_creative_performance, or a wrapper object containing that payload such as a prior render result."
2 tool updates
- Changed
linkedin_compare_creative_performance3 fields changed- added
Input schema / properties / advertiserContextIdAdded value: +{ + "description": "Optional saved advertiser context ID used to resolve the LinkedIn ad account for account-wide creative comparisons when accountId is not supplied.", + "type": "string" +} - added
Input schema / properties / advertiserNameAdded value: +{ + "description": "Optional saved advertiser name, such as Thorogood, used to resolve the LinkedIn ad account for account-wide creative comparisons when accountId is not supplied.", + "type": "string" +} - added
Input schema / properties / queryAdded value: +{ + "description": "Optional advertiser or LinkedIn account search text used to resolve the account for account-wide creative comparisons when accountId is not supplied.", + "type": "string" +}
- Changed
linkedin_render_creative_comparison4 fields changed- changed
Input schema / oneOfPrevious value: -[ - { - "required": [ - "comparisonPayload" - ] - }, - { - "not": { - "anyOf": [ - { - "required": [ - "campaignId" - ] - }, - { - "required": [ - "campaignIds" - ] - } - ] - }, - "properties": { - "scope": { - "enum": [ - "account" - ], - "type": "string" - } - }, - "required": [ - "scope", - "accountId" - ] - }, - { - "anyOf": [ - { - "required": [ - "campaignId" - ] - }, - { - "required": [ - "campaignIds" - ] - } - ], - "properties": { - "scope": { - "enum": [ - "campaign" - ], - "type": "string" - } - }, - "required": [ - "scope" - ] - } -]New value: +[ + { + "required": [ + "comparisonPayload" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "campaignId" + ] + }, + { + "required": [ + "campaignIds" + ] + } + ] + }, + "properties": { + "scope": { + "enum": [ + "account" + ], + "type": "string" + } + }, + "required": [ + "scope", + "accountId" + ] + }, + { + "anyOf": [ + { + "required": [ + "advertiserContextId" + ] + }, + { + "required": [ + "advertiserName" + ] + }, + { + "required": [ + "query" + ] + } + ], + "not": { + "anyOf": [ + { + "required": [ + "campaignId" + ] + }, + { + "required": [ + "campaignIds" + ] + } + ] + } + }, + { + "anyOf": [ + { + "required": [ + "campaignId" + ] + }, + { + "required": [ + "campaignIds" + ] + } + ], + "properties": { + "scope": { + "enum": [ + "campaign" + ], + "type": "string" + } + }, + "required": [ + "scope" + ] + } +] - added
Input schema / properties / advertiserContextIdAdded value: +{ + "description": "Optional saved advertiser context ID used to resolve the LinkedIn ad account for account-wide visual creative reports when accountId is not supplied.", + "type": "string" +} - added
Input schema / properties / advertiserNameAdded value: +{ + "description": "Optional saved advertiser name, such as Thorogood, used to resolve the LinkedIn ad account for account-wide visual creative reports when accountId is not supplied.", + "type": "string" +} - added
Input schema / properties / queryAdded value: +{ + "description": "Optional advertiser or LinkedIn account search text used to resolve the account for account-wide visual creative reports when accountId is not supplied.", + "type": "string" +}
2 tool updates
- Changed
linkedin_compare_creative_performance9 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "endDate" + ] + }, + { + "required": [ + "dateRange" + ] + } +] - changed
Input schema / properties / accountId / descriptionPrevious value: -"Optional numeric LinkedIn Ad Account ID. Pass this for a bounded multi-campaign creative comparison; accountId takes precedence over a lone campaignId."New value: +"Numeric LinkedIn Ad Account ID. Required for account-wide creative comparisons. When used with campaignId or campaignIds, set scope to campaign so the account is treated only as the parent account." - changed
Input schema / properties / campaignId / descriptionPrevious value: -"Optional numeric LinkedIn campaign ID to analyze. If omitted, the most recent LinkedIn campaign from session memory is used when available. When accountId is also supplied, accountId takes precedence over a lone campaignId; use campaignIds for explicit campaign scope."New value: +"Numeric LinkedIn campaign ID to analyze. Required for single-campaign scope unless campaignIds is supplied." - changed
Input schema / properties / campaignIds / descriptionPrevious value: -"Optional numeric LinkedIn campaign IDs to analyze together as one campaign set. Use this for cross-campaign creative comparison within the same account."New value: +"Optional numeric LinkedIn campaign IDs to analyze together as one campaign set. Use this for explicit cross-campaign creative comparison within the same account." - added
Input schema / properties / dateRangeAdded value: +{ + "description": "Optional date range alias. When endDate is omitted, dateRange.endDate, dateRange.end, or dateRange.to is used as the inclusive comparison end date.", + "properties": { + "end": { + "type": "string" + }, + "endDate": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / lookbackDaysAdded value: +{ + "description": "Performance-report style alias for a single trailing window size in days when windows is omitted. For example, lookbackDays: 30 is equivalent to windows: [30].", + "type": "number" +} - added
Input schema / properties / scopeAdded value: +{ + "description": "Explicit report scope. Use account with accountId only for account-wide creative comparisons. Use campaign with campaignId or campaignIds for one or more specific campaigns.", + "enum": [ + "account", + "campaign" + ], + "type": "string" +} - changed
Input schema / properties / windows / descriptionPrevious value: -"Trailing window sizes in days, such as [7, 30]. Defaults to [7, 30]."New value: +"Window sizes in days, such as [7] or [30]. Each window is compared with the previous same-length window. Defaults to [7, 30]." - removed
Input schema / requiredRemoved value: -[ - "endDate" -]
- Changed
linkedin_render_creative_comparison8 fields changed- added
Input schema / oneOfAdded value: +[ + { + "required": [ + "comparisonPayload" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "campaignId" + ] + }, + { + "required": [ + "campaignIds" + ] + } + ] + }, + "properties": { + "scope": { + "enum": [ + "account" + ], + "type": "string" + } + }, + "required": [ + "scope", + "accountId" + ] + }, + { + "anyOf": [ + { + "required": [ + "campaignId" + ] + }, + { + "required": [ + "campaignIds" + ] + } + ], + "properties": { + "scope": { + "enum": [ + "campaign" + ], + "type": "string" + } + }, + "required": [ + "scope" + ] + } +] - changed
Input schema / properties / accountId / descriptionPrevious value: -"Optional numeric LinkedIn Ad Account ID. Pass this for a bounded multi-campaign creative report; accountId takes precedence over a lone campaignId on the visual renderer."New value: +"Numeric LinkedIn Ad Account ID. Required for account-wide creative reports. When used with campaignId or campaignIds, set scope to campaign so the account is treated only as the parent account." - changed
Input schema / properties / campaignId / descriptionPrevious value: -"Optional campaign ID to compare when comparisonPayload is not supplied. For this visual renderer, accountId takes precedence over a lone campaignId so broad account-level prompts are not narrowed by stale session memory; use campaignIds for explicit campaign scope."New value: +"Campaign ID to compare when comparisonPayload is not supplied. Required for single-campaign scope unless campaignIds is supplied." - changed
Input schema / properties / campaignIds / descriptionPrevious value: -"Optional numeric LinkedIn campaign IDs to compare as one campaign set when comparisonPayload is not supplied."New value: +"Optional numeric LinkedIn campaign IDs to compare as one campaign set when comparisonPayload is not supplied. Use only for explicit campaign-set scope." - added
Input schema / properties / dateRangeAdded value: +{ + "description": "Optional date range alias. When endDate is omitted, dateRange.endDate, dateRange.end, or dateRange.to is used as the inclusive comparison end date.", + "properties": { + "end": { + "type": "string" + }, + "endDate": { + "type": "string" + }, + "to": { + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / lookbackDaysAdded value: +{ + "description": "Performance-report style alias for a single trailing window size in days when windows is omitted. For example, lookbackDays: 30 is equivalent to windows: [30].", + "type": "number" +} - added
Input schema / properties / scopeAdded value: +{ + "description": "Explicit report scope when fetching fresh data. Use account with accountId only for account-wide creative reports. Use campaign with campaignId or campaignIds for one or more specific campaigns.", + "enum": [ + "account", + "campaign" + ], + "type": "string" +} - changed
Input schema / properties / windows / descriptionPrevious value: -"Trailing window sizes in days, such as [7, 30], when comparisonPayload is not supplied."New value: +"Window sizes in days, such as [7] or [30]. Each window is compared with the previous same-length window when comparisonPayload is not supplied."
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Hosted MCP server for MuntuAI outreach campaigns, leads, senders, domains, and analytics.
Google Ads MCP server — manage campaigns, keywords, and metrics.
Hosted MCP server for AWS cloud spend: service breakdowns, anomalies, savings and forecasts.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA hosted MCP server that enables managing Google Ads, Microsoft Advertising, TikTok Ads, LinkedIn Ads, and other Google services from ChatGPT, Claude, or any MCP client using natural language, with no code or API keys required.MIT
- -licenseNot gradedqualityNot gradedmaintenanceA private, read-only MCP server that enables retrieval and analysis of Google Ads reporting data (campaigns, ad groups, keywords, search terms, cost, conversions) from authorized accounts through a locally operated server.-
- AlicenseNot gradedqualityDmaintenanceMCP server for Google Ads campaign reporting and management via Claude, enabling GAQL queries, performance metrics, and campaign modifications.18MIT
- AlicenseAqualityBmaintenanceCross-platform ad management MCP server for Google Ads and Meta Ads. Campaign analytics, A/B testing with z-test, anomaly detection, and budget reallocation. 15 tools, 60 tests.1785MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Tools are clearly separated by platform prefix (linkedin_, google_ads_) and have distinct purposes (analyze, compare, render, get, etc.). Descriptions explicitly direct users to preferred rendering tools, reducing ambiguity. However, the high number of similar tools (e.g., multiple compare functions) may still cause minor confusion.
Naming follows a consistent snake_case verb_noun pattern across all tools (e.g., linkedin_analyze_campaign, google_ads_render_weekly_group_report). No mixing of conventions, and verbs like get, render, analyze, compare are used uniformly.
With 56 tools covering two major ad platforms plus setup and reporting, the count is high but reflects the complexity of the domain. However, many tools are redundant (e.g., multiple equivalent 'get' vs 'render' pairs), and the set could be streamlined without sacrificing capability.
The tool surface covers the full analysis and reporting lifecycle for both LinkedIn and Google Ads, including data retrieval, analysis, rendering, and account health. Missing are campaign creation/update tools, but these are outside the stated purpose. Minor gaps like lacking bulk operations or cross-platform comparison are acceptable.