Torna al blog

SEOZoom MCP Server — Dati SEO in Tempo Reale dentro Claude con il Model Context Protocol

Uso Claude Code praticamente ogni giorno. Ci scrivo codice, ci ragiono su architetture, ci analizzo problemi — è diventato parte integrante del mio flusso di lavoro. Quando Anthropic ha rilasciato il Model Context Protocol — la possibilità per Claude di usare strumenti esterni in tempo reale — ho capito subito il potenziale.

Mi capita spesso, sia per progetti personali che per clienti, di utilizzare tool per la SEO. Ultimamente sto usando molto SEOZoom.

Il problema: troppi tab, troppo context-switch

Chi fa SEO lo sa. Stai analizzando un sito, hai Claude aperto in una finestra, SEOZoom in un'altra, un foglio di calcolo in una terza. Copi keyword, incolli metriche, torni su Claude a chiedere "che ne pensi di questi dati?", ricopii la risposta nel report.

Il flusso funziona, ma è lento. Ogni cambio di finestra è un'interruzione. Ogni copia-incolla è un punto dove si perde contesto.

E se Claude potesse interrogare SEOZoom direttamente?

Ho cercato un server MCP per SEOZoom — non esisteva. Così l'ho costruito.

Il risultato è un progetto open-source, snello, sviluppato in una notte e ancora alla sua prima versione — ma già funzionante e utile.

MCP: quando l'AI smette di indovinare e inizia a leggere i dati

Il Model Context Protocol (MCP) è uno standard aperto creato da Anthropic che permette ai modelli di linguaggio di usare strumenti esterni. Non è un plugin, non è un'estensione proprietaria — è un protocollo di comunicazione basato su JSON-RPC che funziona su qualsiasi client compatibile.

L'idea è semplice: invece di incollare dati nella chat e chiedere "analizza questo", l'LLM chiama direttamente il tool, riceve il JSON di risposta e lo interpreta in autonomia. Nessun copia-incolla, nessuna perdita di contesto.

Un server MCP è un processo che espone dei "tool" (funzioni tipate con parametri e descrizioni). Il client MCP (Claude Desktop, Claude Code, Cursor) lancia il server, scopre quali tool offre e li rende disponibili al modello. Quando Claude decide che serve un dato — ad esempio il volume di ricerca di una keyword — chiama il tool corrispondente. Tutto avviene in modo trasparente, nel mezzo della conversazione.

SEOZoom MCP Server: 25 tool pronti all'uso

SEOZoom MCP Server è il server MCP che ho sviluppato per portare le API di SEOZoom dentro Claude. È scritto in Python, è open-source e supporta 25 operazioni suddivise in cinque categorie:

  • Keywords (4 tool) — metriche, SERP attuale, SERP storica, keyword correlate
  • Domains (8 tool) — metriche, authority, nicchie, pagine migliori, keyword posizionate, competitor, AI Overview
  • URLs (4 tool) — PZA, metriche, keyword per URL, intent gap
  • Projects (8 tool) — lista progetti, overview, keyword, pagine migliori, pagine con potenziale, winner/loser
  • Utility (1 tool) — controllo unità API residue

Non serve specificare quale tool usare. Claude lo sceglie da solo, in base alla domanda:

"Quali sono le metriche per la keyword regime forfettario?"

"Analizza il dominio corriere.it"

"Chi sono i competitor organici di aranzulla.it?"

"Per quali keyword il mio dominio appare nelle AI Overview di Google?"

"Mostrami le keyword monitorate del mio progetto e quali stanno perdendo posizioni"

"Quante unità API mi restano?"

Claude seleziona i tool giusti, li chiama in sequenza, incrocia i dati e presenta un'analisi strutturata — tutto in una sola interazione.

Due modalità: remoto o locale

Il progetto offre due modalità di utilizzo, pensate per esigenze diverse.

Server remoto (Lite)

La via più veloce. Il server è già online su Koyeb — basta aggiungere una URL nella configurazione del proprio client MCP:

{
  "mcpServers": {
    "seozoom": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote",
        "https://fresh-chiquita-sozione-22beccd8.koyeb.app/mcp?api_key=LA-TUA-API-KEY"
      ]
    }
  }
}

Zero installazione. Serve solo Node.js per npx (che funge da bridge tra il trasporto HTTP del server remoto e lo stdio richiesto dai client MCP) e una API key SEOZoom. Funziona con Claude Desktop, Claude Code e Cursor.

Su Claude Desktop si può anche configurare dall'interfaccia grafica: vai in Impostazioni → Connettori → Aggiungi connettore personalizzato e incolla la URL del server.

Claude Desktop - Aggiungi connettore personalizzato

Installazione locale

Per chi preferisce tenere tutto in casa. Il server gira sulla propria macchina e comunica con il client via stdio (standard input/output):

git clone https://github.com/Sozione/seozoom-mcp.git
cd seozoom-mcp
uv sync

uv è un package manager Python scritto in Rust, estremamente veloce. uv sync scarica Python (se necessario) e installa tutte le dipendenze. La configurazione del client è simile, ma punta al processo locale:

{
  "mcpServers": {
    "seozoom": {
      "command": "uv",
      "args": ["--directory", "/path/to/seozoom-mcp", "run", "seozoom-mcp"],
      "env": {
        "SEOZOOM_API_KEY": "la-tua-api-key"
      }
    }
  }
}

Il server si avvia e si chiude automaticamente con Claude. Non c'è niente da gestire.

Sotto il cofano: architettura in 3 file

L'intero progetto è contenuto in tre file Python. Nessun framework web, nessun database, nessuna complessità superflua.

client.py — Il wrapper HTTP

La classe SEOZoomClient incapsula tutte le chiamate alle API REST di SEOZoom v2:

BASE_URL = "https://apiv2.seozoom.com/api/v2"

class SEOZoomClient:
    def __init__(self) -> None:
        api_key = os.environ.get("SEOZOOM_API_KEY")
        if not api_key:
            raise SEOZoomError("SEOZOOM_API_KEY environment variable is required")
        self._api_key = api_key
        self._default_db = os.environ.get("SEOZOOM_DEFAULT_DB", "it")
        self._http = httpx.AsyncClient(timeout=30)

Ogni metodo mappa un endpoint specifico. I valori multipli (keyword, domini, URL) vengono separati da pipe |, come richiesto dall'API SEOZoom:

async def keyword_metrics(self, keywords: list[str], db: str | None = None) -> Any:
    return await self._get("keywords", {
        "action": "metrics",
        "db": self._db(db),
        "keyword": "|".join(keywords),
    })

httpx è il client HTTP — asincrono di default, perfetto per i tool MCP che sono funzioni async.

server.py — I tool MCP

Il server usa FastMCP, il framework dichiarativo dell'SDK ufficiale MCP. Ogni tool è una funzione decorata con @mcp.tool():

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("seozoom")
client = SEOZoomClient()

@mcp.tool()
async def keyword_metrics(
    keywords: Annotated[list[str], "Lista di keyword (max 100)"],
    db: Annotated[str | None, "Database paese (it, es, fr, de, uk)"] = None,
) -> str:
    """Ottieni metriche per una o più keyword: volume di ricerca, KD, CPC, intent e trend mensili."""
    return _fmt(await client.keyword_metrics(keywords, db))

Tre cose rendono questo pattern potente:

  1. Annotated type hints — Ogni parametro ha una descrizione testuale che l'LLM legge per capire cosa passare
  2. Docstring — Claude usa la docstring per decidere quando invocare il tool
  3. Return type str — Il JSON viene formattato con una funzione helper che aggiunge automaticamente le info sul consumo di unità API

La funzione _fmt arricchisce ogni risposta con un header informativo:

def _fmt(data: object) -> str:
    if isinstance(data, dict) and "UnitsUsed" in data:
        used = data.get("UnitsUsed", "?")
        remaining = data.get("UnitsRemaining", "?")
        rows = data.get("ResultRows", "?")
        header = f"[Costo: {used} unit | Rimanenti: {remaining} | Risultati: {rows}]\n\n"
        return header + json.dumps(data.get("response", data), ensure_ascii=False, indent=2)
    return json.dumps(data, ensure_ascii=False, indent=2)

In questo modo Claude sa sempre quante unità sono state consumate e quante ne restano — e può avvisare proattivamente se il budget si sta esaurendo.

Uso pratico: cosa puoi chiedergli

Una volta configurato, il flusso di lavoro cambia radicalmente. Ecco alcuni scenari reali.

Analisi competitiva in una domanda

"Confronta le metriche di dominio di repubblica.it e corriere.it, poi mostrami i competitor organici di entrambi"

Claude chiamerà domain_metrics e domain_competitors in sequenza, incrocerà i dati e presenterà un confronto strutturato — il tutto senza uscire dalla chat.

Audit keyword di un progetto

"Mostrami le keyword monitorate del mio progetto e evidenzia quelle che stanno perdendo posizioni"

Claude recupera la lista completa con project_keywords, filtra quelle in calo e suggerisce azioni correttive basate sui dati reali.

Content gap analysis

"Per questa URL, quali keyword hanno potenziale non sfruttato?"

Il tool url_intent_gap restituisce keyword per cui la pagina potrebbe posizionarsi ma non lo fa ancora. Claude può poi suggerire come ottimizzare il contenuto.

Monitoraggio AI Overview

"Per quali keyword il mio dominio appare nelle AI Overview di Google?"

domain_ai_keywords è un tool particolarmente interessante nel contesto attuale, dove le AI Overview stanno ridefinendo la visibilità organica.

Stack tecnico

Componente Tecnologia Ruolo
Linguaggio Python 3.12+ Runtime del server
SDK MCP mcp[cli] con FastMCP Framework dichiarativo per i tool
HTTP Client httpx Chiamate async alle API SEOZoom
Package Manager uv (Astral) Gestione dipendenze e virtualenv
Trasporto stdio / HTTP (remoto) Comunicazione client-server
Hosting remoto Koyeb Server Lite sempre disponibile
Licenza AGPL-3.0 Open source, copyleft forte

Cose da sapere

Consumo API — Ogni chiamata costa tra 10 e 120 unità per riga di risultato. Il server mostra sempre il consumo nella risposta. Vale la pena tenere d'occhio il contatore, specialmente con query su domini grandi.

Database multi-paese — Di default il server usa il database italiano (it), ma supporta anche es, fr, de e uk. Basta specificarlo nella domanda: "analizza example.com sul database spagnolo".

Prima fase del progetto — Il server copre già 25 endpoint delle API SEOZoom. Ulteriori tool potranno essere aggiunti man mano che le API si espandono.

Perché l'ho reso open-source

Avrei potuto tenerlo per me — funzionava, risolveva il mio problema, fine. Ma MCP ha senso proprio quando l'ecosistema cresce. Più server esistono, più Claude (e gli altri client compatibili) diventano utili. E poi credo possa essere utile ad altre persone che, come me, lavorano con dati SEO ogni giorno e vogliono velocizzare il proprio flusso di lavoro.

Se lavori con SEOZoom e usi Claude, provalo. Se trovi bug o hai idee per nuovi tool, apri una issue. Il progetto è nella sua prima fase — c'è spazio per crescere.

Il repository è su GitHub: github.com/Sozione/seozoom-mcp