Connector documentation
Version 0.3.0. MCP server (Streamable HTTP, POST only) at https://organiqgeo.com/mcp. Every tool is read-only (readOnlyHint: true).
Authentication
- OAuth 2.1 (claude.ai, Claude Desktop, Claude Code, ChatGPT): without a credential, a call to a protected tool returns
401withWWW-Authenticate: Bearer resource_metadata="https://organiqgeo.com/.well-known/oauth-protected-resource/mcp"; the client reads the protected resource metadata and the authorization server metadata, identifies itself with a Client ID Metadata Document or registers at/oauth/register, and opens/oauth/authorizewith PKCE S256. The user signs in with Google and approves on the Organiq screen; only accounts with at least one property can approve. Scopes:mcp:read,mcp:write(reserved),offline_access. Access token: 1 h; refresh token: 30 days, rotated on every use. - API key (Claude Code, Cursor, scripts):
Authorization: Bearer gy_live_…, created in your account; only a hash is stored on the server. - Public tools (no sign-in):
get_capabilities,get_ctr_benchmark,check_connection.
Units and periods
clicks/impressions are integers; ctr is a fraction 0–1 (0.052 = 5.2%); position is an impression-weighted average (lower is better); dates are yyyy-mm-dd. Default period: 28 days ending on the last synced date (Search Console lags about 3 days). Default comparison: the previous window of the same length. Every response returns site, period, comparison, filters and units.
Tools (18)
| Name | What it does / when to use it | Parameters |
|---|---|---|
get_capabilitiespublic What Organiq provides | Returns a factual overview of this connector: what data it holds (Google Search Console synced daily into Organiq, plus GA4 referral sessions from AI assistants), the list of tools with when to use each, units, default periods, how to connect an account (OAuth or API key), rate limits and example questions. Works without signing in. Use it first when you do not know what this server can answer. / Visão geral factual do conector, sem login: dados, ferramentas, unidades, como conectar, limites. | language |
get_ctr_benchmarkpublic Generic CTR-by-position benchmark | Returns the generic organic click-through-rate curve by Google position (1–20, fraction 0–1) used by score_opportunities and find_page_poaching_opportunities as the fallback when a property lacks its own volume, optionally interpolated for a fractional position. No account needed; no property data involved. Use it to estimate expected clicks for a position or to explain a CTR gap. / Curva genérica de CTR por posição, sem login. | position, impressions |
check_connectionpublic Connection status | Reports whether this request is authenticated and, if so, which Organiq account it uses (name, plan, how it authenticated), how many Search Console properties are available with their data coverage, and what is missing (no account, no properties, no GA4) with the URL that resolves each gap. Without credentials it explains how to connect. Use it when a tool returned unauthorized/site_not_found or before a first analysis. / Diz se há conta, propriedades, plano e o que falta, com a URL para resolver. | — |
list_sitesProperties in the account | Lists the Search Console properties synced for the signed-in account: id, siteUrl (Search Console format), displayName, tags, branded_terms (used by the brand filter), whether GA4/Bing are mapped and the data coverage (dataFrom/dataTo, web search). Use it first when you do not know the exact name of a site or need the date range available. Default: visible properties only. / Propriedades da conta com cobertura de dados. | includeHidden |
get_site_summaryProperty summary | Totals of clicks, impressions, CTR and average position for one property over the period, with the comparison period and the change (absolute, Pct as fraction, ctrPoints in percentage points, position difference where negative means improvement). Accepts all filters (country, device, brand, page, query). Start here for "how is site X doing". / Resumo da propriedade com comparação. | site, days, startDate, endDate, compare, searchType, country, device, brand, pageContains, query |
query_top_queriesTop queries | Search queries of one property over the period, aggregated and sorted. Use for "what people search to find us", growth/decline lists and ranking changes. Each row has clicks, impressions, ctr, position for the period and, with a comparison, prevClicks/prevImpressions/prevCtr/prevPosition plus clicksChange/clicksChangePct/positionChange (keys present in only one period show zeros in the other). sort: clicks (default), impressions, ctr, position (lowest first), growth (largest click gain vs comparison first) or decline (largest loss first). For ctr/position use minImpressions >= 20 to avoid noise. / Queries da propriedade, agregadas e ordenadas. | site, days, startDate, endDate, compare, searchType, country, device, brand, pageContains, query, limit, sort, minImpressions |
query_top_pagesTop pages | Pages (URLs) of one property over the period, aggregated and sorted. Use for best/worst pages and pages that gained or lost clicks. Each row has clicks, impressions, ctr, position for the period and, with a comparison, prevClicks/prevImpressions/prevCtr/prevPosition plus clicksChange/clicksChangePct/positionChange (keys present in only one period show zeros in the other). sort: clicks (default), impressions, ctr, position (lowest first), growth (largest click gain vs comparison first) or decline (largest loss first). For ctr/position use minImpressions >= 20 to avoid noise. / Páginas da propriedade, agregadas e ordenadas. | site, days, startDate, endDate, compare, searchType, country, device, brand, pageContains, query, limit, sort, minImpressions |
query_countriesBy country | Countries (ISO-3166-1 alpha-3, lowercase, e.g. bra) of one property over the period. Each row has clicks, impressions, ctr, position for the period and, with a comparison, prevClicks/prevImpressions/prevCtr/prevPosition plus clicksChange/clicksChangePct/positionChange (keys present in only one period show zeros in the other). sort: clicks (default), impressions, ctr, position (lowest first), growth (largest click gain vs comparison first) or decline (largest loss first). For ctr/position use minImpressions >= 20 to avoid noise. / Por país. | site, days, startDate, endDate, compare, searchType, country, device, brand, pageContains, query, limit, sort, minImpressions |
query_devicesBy device | Devices (MOBILE, DESKTOP, TABLET) of one property over the period. Each row has clicks, impressions, ctr, position for the period and, with a comparison, prevClicks/prevImpressions/prevCtr/prevPosition plus clicksChange/clicksChangePct/positionChange (keys present in only one period show zeros in the other). sort: clicks (default), impressions, ctr, position (lowest first), growth (largest click gain vs comparison first) or decline (largest loss first). For ctr/position use minImpressions >= 20 to avoid noise. / Por dispositivo. | site, days, startDate, endDate, compare, searchType, country, device, brand, pageContains, query, limit, sort, minImpressions |
get_timeseriesTime series | Clicks, impressions, CTR and position per day, week (Monday as key) or month (yyyy-mm) over the period, with filters. Use for trend, seasonality and to locate the date of a drop. Days without data are omitted. / Série temporal por dia, semana ou mês. | site, days, startDate, endDate, searchType, country, device, brand, pageContains, query, granularity |
get_breakdownBrand split and position bands | Splits the period's traffic into branded/nonBranded (by the property's branded_terms) and into position bands (1-3, 4-10, 11-20, 21+) with impressions and clicks per band, plus queryCount. Position of each query = impression-weighted average over the period. Use for "how much of our traffic is brand" and "how much sits on page 2". / Marca × sem marca e faixas de posição. | site, days, startDate, endDate, searchType, country, device, brand, pageContains, query |
get_annotationsAnnotations | Events annotated in the period for the property and globally: deploys, content changes, manual notes and Google algorithm updates (category "algo_update"). Use to correlate drops or gains with causes. Default: last 90 days. / Anotações e algo updates do período. | site, days, startDate, endDate |
get_ai_trafficTraffic from AI assistants (GA4) | Referral sessions from AI assistants (chatgpt.com, perplexity.ai, gemini, copilot, claude…) according to GA4 (dimension ai_source): per source (sessions, activeUsers, engagedSessions, keyEvents) for the period and the comparison, totals and daily series. site also accepts "all" for the whole account. hasGa4=false means the property has no GA4 mapped. Limitation: Search Console does not separate clicks from AI Overviews / AI Mode; only referral traffic is measurable. / Sessões vindas de IAs segundo o GA4. | site, days, startDate, endDate, compare |
get_ctr_curveOwn CTR curve vs benchmark | The property's real CTR by position (bucket = round(position), 1–20, impression-weighted) compared with the generic benchmark (31.7% at position 1 … 18.6% at 3 … 2.0% at 10). deltaPoints in percentage points (negative = below expected: likely title/meta problem); reliable = bucket with enough impressions. Use to find where titles underperform. / Curva de CTR própria × benchmark. | site, days, startDate, endDate, searchType, country, device, brand, pageContains, query, minImpressions |
find_decaying_contentDecaying content | Pages (or queries) that lost clicks between a BASELINE and the RECENT period. Recent = days/startDate/endDate; baseline = compare (previous = window before, year = one year earlier) or explicit comparisonStartDate/comparisonEndDate (for slow decay compare with 6–12 months ago). Classifies the drop: severe > 50%, moderate 20–50%, mild < 20%; sorted by absolute clicks lost; pattern hints the diagnosis (position_slipped, impressions_collapsed, ctr_dropped, disappeared, mixed). Use for "which pages are dying" and refresh candidates. / Conteúdo em decaimento. | site, days, startDate, endDate, compare, searchType, country, device, brand, pageContains, query, comparisonStartDate, comparisonEndDate, dimension, minBaselineClicks, limit |
analyze_cannibalizationQuery cannibalization | Queries where 2+ pages of the property compete for the same search in the period. Per cluster: totals, Shannon entropy of impressions across pages (bits; higher = more even split = worse; level high >= 1.5, medium >= 1.0), normalized (0–1), winner (most clicks; tie: best position) and the contenders with clicks/impressions/ctr/position/impressionShare. Sorted by entropy and impressions. Protocol/host/hash variants of one URL are canonical hygiene, not cannibalization; brand + home + deep page is usually sitelinks. Use when asked which page should rank for a keyword. / Canibalização de queries. | site, days, startDate, endDate, searchType, country, device, brand, pageContains, query, minImpressions, minPages, limit |
score_opportunitiesOpportunity score (CTR gap) | Queries between minPosition and maxPosition whose CTR is below the expected CTR for their position. expectedCtr comes from the property's own curve (ctrSource "own", when the bucket has volume) or from the benchmark; ctrGap = expected − ctr (fraction); lostClicks = impressions × gap; score 0–100 log-normalized by the largest lostClicks (level high >= 80, medium >= 60). Use for title/meta-description quick wins. / Oportunidades por CTR abaixo do esperado. | site, days, startDate, endDate, searchType, country, device, brand, pageContains, query, minImpressions, minPosition, maxPosition, limit |
find_page_poaching_opportunitiesStriking distance (page poaching) | Queries just outside the top (default positions 4–20) with the estimated click gain if they reached the CTR of the target position (default 3 → 18.6% benchmark, or the property's own CTR at that position when it has volume: see ctrSource). estimatedGain = max(0, round(impressions × (targetCtr − ctr))). Sorted by impressions (default) or by gain. Use for "what is close to page one / top 3". / Queries perto do topo com ganho estimado. | site, days, startDate, endDate, searchType, country, device, brand, pageContains, query, minPosition, maxPosition, targetPosition, minImpressions, sort, limit |
Errors
Always JSON: { "error": { "code", "message", "nextStep", "docsUrl" } }. Codes: unauthorized (HTTP 401 when the credential is missing or invalid), insufficient_scope (403), site_not_found, no_data, invalid_argument, plan_limit (402: the account plan does not cover the request, e.g. history older than the plan window; docsUrl points to the plans page), rate_limited (with retryAfterSeconds), internal.
Limits
Per account: 60 calls per minute and 1000 per hour; the rate_limited error says which window was exceeded and how many seconds to wait. Per IP: 120 requests/min on /mcp, 60/min on /oauth/*. Responses are bounded by limit (default 25–50, maximum 500–1,000).
Skills
Playbooks that name the tools, published at /.well-known/agent-skills/index.json and in the organiq plugin for Claude Code:
ai-traffic: Measure and interpret traffic coming from AI assistants (ChatGPT, Perplexity, Gemini, Copilot, Claude) and conversational search queries using GA4 and Google Search Console data through the Organiq MCP server (get_ai_traffic, query_top_queries, get_timeseries).cannibalization: Detect and resolve keyword cannibalization in Google Search Console data through the Organiq MCP server (analyze_cannibalization, query_top_pages).content-decay: Find, triage and build a recovery plan for decaying content in Google Search Console data through the Organiq MCP server (find_decaying_content, get_timeseries, query_top_queries, get_annotations).quick-wins: Find title/meta-description quick wins in a property's Google Search Console data through the Organiq MCP server (score_opportunities, find_page_poaching_opportunities, get_ctr_curve, get_breakdown).weekly-report: Produce a weekly organic-search report for a property from Google Search Console and GA4 data through the Organiq MCP server (get_site_summary, query_top_queries, query_top_pages, get_annotations, get_ai_traffic).
Data and privacy
The server reads only the properties of the authenticated account. It never receives the conversation: only the tool arguments (property, dates, filters). Each call is logged (tool name, duration, account) for operations and limits. Privacy policy · Terms · support: youssefpmat@gmail.com.