MCP SDK a confronto: quale scegliere per il tuo server MCP

·

MCP Inspector ufficiale con il server scritto con l'SDK Go collegato in stdio e la versione del protocollo MCP 2025-11-25

Aggiornato il 10 novembre 2026

Qui metto a confronto gli SDK MCP e i framework con cui scrivi un server MCP, con un test fatto oggi sullo stesso tool. È la terza pagina della nostra serie: nella guida ai server MCP trovi cosa sono e come si collegano, nella recensione di mcp-use come se ne crea uno con Manufact.

Un SDK MCP è la libreria che usi per scrivere un server, o un client, Model Context Protocol nel tuo linguaggio. Gli SDK ufficiali sono dieci: TypeScript, Python, C#, Go, Rust e Ruby sono al livello più alto (Tier 1), Java è Tier 2, Swift, PHP e Kotlin sono Tier 3. Sopra ci sono i framework, come FastMCP, mcp-use, xmcp e mcp-handler, che ti fanno scrivere meno codice e spesso vendono anche l’hosting.

Il 10/11/2026 ho scritto lo stesso tool, un generatore di link UTM, con cinque di questi SDK MCP: gli SDK ufficiali TypeScript, Python e Go, FastMCP e mcp-use. Hanno risposto tutti al primo tentativo. Quale scegliere dipende dal lavoro: per un tool interno Python o FastMCP, che chiedono 13 righe; per un prototipo da mostrare mcp-use; per un server che deve durare anni l’SDK ufficiale del linguaggio che il tuo team usa già.

Cosa serve sapere in 30 secondi

  • Ufficiali o framework: gli SDK MCP ufficiali li mantiene il progetto MCP, spesso insieme a un’azienda: Google per Go, Microsoft per C#, Apple per Swift, JetBrains per Kotlin. I framework ci aggiungono comodità e servizi a pagamento.
  • I più scaricati: il pacchetto Python mcp ha fatto 79,2 milioni di download negli ultimi 7 giorni su PyPI, FastMCP 14,4 milioni. Su npm l’SDK TypeScript v1 ne ha fatti 88 milioni nella settimana 3-9 novembre 2026.
  • Il più rapido nel test: il server Go ha risposto in 4 millisecondi dall’avvio, FastMCP in circa 0,6 secondi perché deve avviare Python. Per un tool da marketing non te ne accorgi.
  • La trappola più comune: i tutorial scritti per le versioni 1.x. In Python il vecchio import di FastMCP, con l’SDK ufficiale 2.3.0, si ferma con un errore.
  • Quanto costa: gli SDK MCP sono gratuiti e open source. Paghi l’hosting, da $0 con i piani gratuiti di Cloudflare e Manufact fino a $250 al mese per Manufact Pro con fatturazione annuale.
Terminale con lo stesso client Python che chiama cinque server MCP scritti con SDK diversi e riceve da ognuno il link con i parametri UTM
Un solo client, cinque server, lo stesso tool: tutti rispondono con il link UTM corretto. Screenshot di victormotricala.it, 10/11/2026

Quali SDK e framework per server MCP esistono oggi?

Oggi hai due famiglie. La prima sono i dieci SDK MCP ufficiali, elencati sul sito del Model Context Protocol e divisi in tre livelli di completezza. La seconda sono i framework di terze parti, spesso costruiti sopra gli SDK ufficiali: FastMCP per Python e per TypeScript, mcp-use, xmcp, mcp-handler, mcp-framework, mcp-go e l’Agents SDK di Cloudflare.

La tabella raccoglie i dati che ho letto oggi su GitHub, npm e PyPI. Le stelle ti dicono quanto un progetto è conosciuto, i download quanto viene installato, anche come dipendenza di altri pacchetti. FastMCP per Python, per esempio, installa al suo interno anche mcp: l’ho visto nel test, quindi i download dei due in parte si sommano.

Ultima verifica: 10/11/2026. È una pagina viva: la ricontrolliamo ogni settimana.

SDK o frameworkLinguaggioChi lo mantieneLicenzaUltima versioneStelle GitHubDownload ultimi 7 giorniL’ho testato
SDK ufficiale TypeScriptTypeScriptProgetto MCPApache-2.0 (v2), in passaggio da MIT2.4.013.74127,0 mln la v2, 88,0 mln la v1 (npm)Sì
SDK ufficiale Python (mcp)PythonProgetto MCPMIT2.3.024.82079,2 mln (PyPI)Sì
SDK ufficiale GoGoProgetto MCP con GoogleApache-2.0, in passaggio da MIT1.8.05.330Non pubblicatiSì
Altri SDK ufficialiC#, Rust, Ruby, Java, Swift, PHP, KotlinProgetto MCP con Microsoft, Spring AI, Apple, PHP Foundation, JetBrainsApache-2.0 o MITVarieDa 949 (Ruby) a 4.628 (C#)Non confrontabiliNo
FastMCP per PythonPythonPrefectApache-2.04.1.728.36714,4 mln (PyPI)Sì
FastMCP per TypeScript di Prefect (@prefecthq/fastmcp-ts)TypeScriptPrefectApache-2.01.9.18330.815 (npm)No
fastmcp su npm (punkpeye/fastmcp)TypeScriptCommunityMIT4.25.03.287691.130 (npm)No
mcp-useTypeScript e PythonManufactMIT2.12.3 (npm), 1.7.1 (PyPI)10.86243.877 (npm) e 16.454 (PyPI)Sì
xmcpTypeScriptbasement studioMIT1.9.01.35130.941 (npm)No
mcp-handlerTypeScriptVercel LabsApache-2.02.3.16972,03 mln (npm)No
mcp-frameworkTypeScriptCommunity (QuantGeekDev)MIT0.2.22, aprile 202693161.943 (npm)No
mcp-goGoCommunity (mark3labs)MIT1.5.09.232Non pubblicatiNo
Cloudflare Agents SDKTypeScriptCloudflareMIT0.33.05.9793,25 mln (npm, tutto l’SDK e non solo MCP)No

Fonti, lette il 10/11/2026: elenco e livelli dalla pagina ufficiale degli SDK MCP; stelle, licenze e manutentori dall’API e dai repository di GitHub; download npm dall’API di npm per la settimana 3-9 novembre 2026; download PyPI da pypistats.org per gli ultimi 7 giorni. Go non pubblica statistiche di download.

Tre cose saltano all’occhio. Primo: su npm il pacchetto che si chiama fastmcp non è di Prefect. È un progetto della community, mentre la versione TypeScript ufficiale di FastMCP si installa come @prefecthq/fastmcp-ts. Se segui la documentazione di Prefect, controlla il nome prima di installare.

Secondo: mcp-framework, che una guida in inglese presenta come il framework più scaricato, non pubblica una versione da aprile 2026. Terzo: mcp-handler di Vercel ha poche stelle ma oltre 2 milioni di download a settimana, perché lo installano dentro app che esistono già.

Come ho testato 5 SDK MCP, e cosa è andato storto?

Ho scritto lo stesso tool, build-utm-link, con cinque SDK MCP sullo stesso computer cloud Linux, e l’ho chiamato con un unico client, l’SDK ufficiale Python 2.3.0. Tutti e cinque hanno restituito il link giusto al primo tentativo. Gli intoppi sono arrivati dopo, con un input sbagliato e con il codice dei vecchi tutorial.

Il tool riceve un URL, una sorgente, un mezzo e una campagna, e restituisce il link con i parametri UTM puliti: minuscole e trattini al posto degli spazi. È un lavoro piccolo che chi gestisce campagne ripete ogni giorno, e l’ho scelto apposta, perché così il codice che vedi è quasi tutto MCP.

L’ambiente: Node.js 24.22.1, Python 3.13.5 con uv, Go 1.27.3. Quattro server parlano in stdio, cioè il client li avvia come processi locali. mcp-use l’ho avviato in HTTP sulla porta 3100, perché è il modo in cui lavora di solito.

SDKVersioneInstallazione a cache vuotaRighe del serverAvvio e handshakeChiamata del toolRifiuta un URL sbagliato
SDK ufficiale TypeScript2.4.00,7 s, 3 pacchetti, 17 MB22137 ms8 msSì, con Zod
SDK ufficiale Python2.3.00,5 s, 28 pacchetti, 33 MB13416 ms29 msNo con str, sì con AnyHttpUrl
FastMCP per Python4.1.70,6 s, 62 pacchetti, 66 MB13584 ms122 msNo con str
SDK ufficiale Go1.8.07,0 s tra download e compilazione, eseguibile da 12 MB344 ms2 msNo con string
mcp-use2.12.33,9 s, 53 pacchetti, 77 MB1922 ms, server già acceso12 msSì, con Zod

I tempi sono la mediana di tre prove, misurati dal client. Per mcp-use l’avvio non è compreso, perché il server era già acceso. Non prenderli come un benchmark: è una sola macchina, con una rete veloce, e un tool che fa una cosa sola.

MCP Inspector ufficiale collegato al server scritto con l'SDK TypeScript, con il tool build-utm-link eseguito e il link UTM nel riquadro dei risultati
L’Inspector ufficiale (versione 2.14.0) chiama il server TypeScript: il risultato arriva in 30 millisecondi. Screenshot di victormotricala.it, 10/11/2026

Cosa è andato bene. Nessuno dei cinque SDK MCP mi ha chiesto configurazione extra. Node 24 esegue il file server.ts senza compilarlo. Il server Go è un solo eseguibile e parte in 4 millisecondi. I due SDK Python ricavano lo schema del tool dai tipi della funzione: scrivi 13 righe e hai finito.

Primo intoppo: l’URL sbagliato. Ho mandato a tutti e cinque url="non-un-url". L’SDK TypeScript e mcp-use l’hanno rifiutato, perché lo schema Zod contiene .url(). Python, FastMCP e Go hanno restituito un link rotto, senza errore. La colpa è del mio codice, che accettava una stringa qualsiasi. In Python cambi il tipo dell’argomento con AnyHttpUrl di Pydantic. L’ho rifatto così e il server ha risposto con un errore di validazione:

from pydantic import AnyHttpUrl

@mcp.tool(description="Crea un link tracciato con parametri UTM per GA4")
def build_utm_link(url: AnyHttpUrl, source: str, medium: str, campaign: str) -> str:
    p = urlsplit(str(url))
MCP Inspector collegato al server mcp-use che mostra l'errore di validazione Invalid URL dopo l'invio di un indirizzo non valido
mcp-use blocca l’URL sbagliato prima di eseguire il tool, grazie allo schema Zod. Screenshot di victormotricala.it, 10/11/2026
MCP Inspector collegato al server Go che restituisce un link rotto non-un-url con i parametri UTM, senza segnalare errori
Lo stesso input al server Go: nessun errore, perché il mio codice dichiarava una stringa qualsiasi. Screenshot di victormotricala.it, 10/11/2026

Secondo intoppo: i nomi dei tool. Con gli SDK Python il tool prende il nome della funzione, quindi build_utm_link, con i trattini bassi. Con TypeScript e Go il nome lo scegli tu. Se colleghi più server allo stesso agente, decidi prima una regola, o ti ritrovi con nomi misti che il modello confonde.

Terzo intoppo: i tutorial vecchi. Molte guide usano ancora questo import, che con mcp 2.3.0 si ferma con ModuleNotFoundError:

from mcp.server.fastmcp import FastMCP

Nella versione 2 la classe si chiama MCPServer, come spiega la guida di migrazione dell’SDK. La riga giusta è questa:

from mcp.server import MCPServer

In TypeScript succede lo stesso: la v2 si installa come @modelcontextprotocol/server, mentre i tutorial usano @modelcontextprotocol/sdk, che è la v1.

Terminale con i tempi di installazione dei cinque SDK a cache vuota, la prova con un URL non valido e l'errore ModuleNotFoundError del vecchio import di FastMCP
Installazioni a cache vuota, la prova con l’URL sbagliato e l’errore dei vecchi tutorial Python. Screenshot di victormotricala.it, 10/11/2026

Un dettaglio che noterai: Go mette i parametri in ordine alfabetico, quindi utm_campaign arriva prima di utm_source. A GA4 l’ordine non interessa. Tutti e cinque i server, infine, hanno negoziato con il client la versione 2025-11-25 del protocollo.

Cosa non ho testato. Gli SDK ufficiali C#, Rust, Ruby, Java, Swift, PHP e Kotlin, i due FastMCP per TypeScript, xmcp, mcp-handler, mcp-framework, mcp-go e l’Agents SDK di Cloudflare. Non ho fatto il deploy su nessun hosting e non ho collegato i server a Claude o a Cursor: per quello trovi i passaggi nella guida ai server MCP.

Quanto codice serve con ciascun SDK?

Per lo stesso tool servono da 13 a 34 righe non vuote. I due SDK Python sono i più corti, perché lo schema lo ricavano dai tipi. L’SDK ufficiale TypeScript e mcp-use stanno a 22 e 19 righe, con lo schema scritto in Zod. Go arriva a 34 perché dichiari una struct per gli argomenti e gestisci l’errore a mano.

Qui sotto trovi i comandi e i file esatti del test. Ogni comando sta in un blocco suo, così lo copi senza portarti dietro altro.

SDK ufficiale Python

Crea l’ambiente e installa l’SDK, fissando la versione:

uv venv
uv pip install "mcp==2.3.0"

Poi salva questo file come server.py:

from urllib.parse import urlencode, urlsplit, urlunsplit, parse_qsl
from mcp.server import MCPServer

mcp = MCPServer("utm-py-ufficiale", version="1.0.0")

def clean(s: str) -> str:
    return "-".join(s.strip().lower().split())

@mcp.tool(description="Crea un link tracciato con parametri UTM per GA4")
def build_utm_link(url: str, source: str, medium: str, campaign: str) -> str:
    p = urlsplit(url)
    q = dict(parse_qsl(p.query))
    q.update(utm_source=clean(source), utm_medium=clean(medium), utm_campaign=clean(campaign))
    return urlunsplit(p._replace(query=urlencode(q)))

if __name__ == "__main__":
    mcp.run()

FastMCP per Python

Il codice è quasi identico: cambiano l’import e il nome della classe. Installa il pacchetto:

uv pip install "fastmcp==4.1.7"

E salva questo server.py:

from urllib.parse import urlencode, urlsplit, urlunsplit, parse_qsl
from fastmcp import FastMCP

mcp = FastMCP("utm-fastmcp")

def clean(s: str) -> str:
    return "-".join(s.strip().lower().split())

@mcp.tool(description="Crea un link tracciato con parametri UTM per GA4")
def build_utm_link(url: str, source: str, medium: str, campaign: str) -> str:
    p = urlsplit(url)
    q = dict(parse_qsl(p.query))
    q.update(utm_source=clean(source), utm_medium=clean(medium), utm_campaign=clean(campaign))
    return urlunsplit(p._replace(query=urlencode(q)))

if __name__ == "__main__":
    mcp.run()

SDK ufficiale TypeScript

Serve un progetto Node in modalità ES module. Questi sono i tre comandi:

npm init -y
npm pkg set type=module
npm install @modelcontextprotocol/server zod

Il file server.ts, che con Node 24 avvii direttamente, senza compilarlo:

import { McpServer } from '@modelcontextprotocol/server';
import { serveStdio } from '@modelcontextprotocol/server/stdio';
import * as z from 'zod/v4';

serveStdio(() => {
  const server = new McpServer({ name: 'utm-ts-ufficiale', version: '1.0.0' });
  server.registerTool(
    'build-utm-link',
    {
      description: 'Crea un link tracciato con parametri UTM per GA4',
      inputSchema: z.object({ url: z.string().url(), source: z.string(), medium: z.string(), campaign: z.string() })
    },
    async ({ url, source, medium, campaign }) => {
      const u = new URL(url);
      const clean = (s: string) => s.trim().toLowerCase().replace(/\s+/g, '-');
      u.searchParams.set('utm_source', clean(source));
      u.searchParams.set('utm_medium', clean(medium));
      u.searchParams.set('utm_campaign', clean(campaign));
      return { content: [{ type: 'text', text: u.toString() }] };
    }
  );
  return server;
});
node server.ts

mcp-use

Stessa preparazione del progetto Node, poi installi mcp-use:

npm init -y
npm pkg set type=module
npm install [email protected] zod

Il file server.ts. A differenza degli altri, mcp-use apre un server HTTP sulla porta che scegli:

import { MCPServer } from 'mcp-use';
import { z } from 'zod';

const server = new MCPServer({ name: 'utm-mcp-use', version: '1.0.0' });

server.tool(
  {
    name: 'build-utm-link',
    description: 'Crea un link tracciato con parametri UTM per GA4',
    inputSchema: z.object({ url: z.string().url(), source: z.string(), medium: z.string(), campaign: z.string() }),
  },
  async ({ url, source, medium, campaign }) => {
    const u = new URL(url);
    const clean = (s: string) => s.trim().toLowerCase().replace(/\s+/g, '-');
    u.searchParams.set('utm_source', clean(source));
    u.searchParams.set('utm_medium', clean(medium));
    u.searchParams.set('utm_campaign', clean(campaign));
    return { content: [{ type: 'text', text: u.toString() }] };
  }
);

await server.listen(3100);
node server.ts

SDK ufficiale Go

Crea il modulo e scarica l’SDK:

go mod init example.com/utm
go get github.com/modelcontextprotocol/[email protected]

Salva il file main.go:

package main

import (
	"context"
	"log"
	"net/url"
	"strings"

	"github.com/modelcontextprotocol/go-sdk/mcp"
)

type args struct {
	URL      string `json:"url" jsonschema:"pagina di destinazione"`
	Source   string `json:"source" jsonschema:"utm_source"`
	Medium   string `json:"medium" jsonschema:"utm_medium"`
	Campaign string `json:"campaign" jsonschema:"utm_campaign"`
}

func clean(s string) string { return strings.Join(strings.Fields(strings.ToLower(s)), "-") }

func main() {
	server := mcp.NewServer(&mcp.Implementation{Name: "utm-go-ufficiale", Version: "1.0.0"}, nil)
	mcp.AddTool(server, &mcp.Tool{Name: "build-utm-link", Description: "Crea un link tracciato con parametri UTM per GA4"},
		func(ctx context.Context, req *mcp.CallToolRequest, a args) (*mcp.CallToolResult, any, error) {
			u, err := url.Parse(a.URL)
			if err != nil {
				return nil, nil, err
			}
			q := u.Query()
			q.Set("utm_source", clean(a.Source))
			q.Set("utm_medium", clean(a.Medium))
			q.Set("utm_campaign", clean(a.Campaign))
			u.RawQuery = q.Encode()
			return &mcp.CallToolResult{Content: []mcp.Content{&mcp.TextContent{Text: u.String()}}}, nil, nil
		})
	if err := server.Run(context.Background(), &mcp.StdioTransport{}); err != nil {
		log.Fatal(err)
	}
}
MCP Inspector ufficiale con il server scritto con l'SDK Go collegato in stdio e la versione del protocollo MCP 2025-11-25
Il server Go collegato all’Inspector ufficiale: protocollo 2025-11-25, nessuna configurazione extra. Screenshot di victormotricala.it, 10/11/2026

Poi sistema le dipendenze e compila:

go mod tidy
go build -o utm-server .

Il client che li prova tutti

Se vuoi ripetere il test, questo è il client che ho usato, scritto con l’SDK ufficiale Python. Avvia i quattro server stdio, si collega a mcp-use in HTTP e misura i tempi. Si aspetta accanto a sé le cinque cartelle del test: ts-ufficiale, py-ufficiale, fastmcp-py, go-ufficiale e mcp-use.

# Un solo client (SDK ufficiale MCP per Python 2.3.0) per provare i 5 server allo stesso modo
import asyncio, sys, time, os
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from mcp.client.streamable_http import streamable_http_client

H = os.path.dirname(os.path.abspath(__file__))
ARGS = {"url": "https://www.victormotricala.it/ai/mcp-sdk", "source": "Newsletter", "medium": "email", "campaign": "Black Friday"}
SERVERS = {
    "ts-ufficiale": StdioServerParameters(command="node", args=["server.ts"], cwd=f"{H}/ts-ufficiale"),
    "py-ufficiale": StdioServerParameters(command=f"{H}/py-ufficiale/.venv/bin/python", args=["server.py"], cwd=f"{H}/py-ufficiale"),
    "fastmcp-py": StdioServerParameters(command=f"{H}/fastmcp-py/.venv/bin/python", args=["server.py"], cwd=f"{H}/fastmcp-py"),
    "go-ufficiale": StdioServerParameters(command=f"{H}/go-ufficiale/utm-server", args=[], cwd=f"{H}/go-ufficiale"),
    "mcp-use": "http://localhost:3100/mcp",
}

async def run(name, target):
    t0 = time.perf_counter()
    cm = streamable_http_client(target) if isinstance(target, str) else stdio_client(target, errlog=open(os.devnull, "w"))
    async with cm as streams:
        r, w = streams[0], streams[1]
        async with ClientSession(r, w) as s:
            info = await s.initialize()
            t1 = time.perf_counter()
            tools = await s.list_tools()
            res = await s.call_tool(tools.tools[0].name, ARGS)
            t2 = time.perf_counter()
            txt = res.content[0].text
            print(f"[{name}] server={info.server_info.name} protocollo={info.protocol_version} "
                  f"tool={tools.tools[0].name} avvio+handshake={1000*(t1-t0):.0f}ms chiamata={1000*(t2-t1):.0f}ms")
            print(f"    -> {txt}")

async def main():
    only = sys.argv[1:] or list(SERVERS)
    for n in only:
        try:
            await run(n, SERVERS[n])
        except Exception as e:
            print(f"[{n}] ERRORE: {type(e).__name__}: {e}")
if __name__ == "__main__":
    asyncio.run(main())
python client.py

Quanto costa mettere online un server MCP?

Gli SDK MCP e i framework sono gratuiti e open source: paghi solo il posto dove fai girare il server. In locale non costa nulla. Online parti da $0 con i piani gratuiti di Cloudflare Workers e Manufact, e sali quando crescono le chiamate. FastMCP Gateway di Prefect è l’unico che non pubblica un prezzo.

HostingCon quale SDKPiano gratuitoPrimo piano a pagamentoDa sapere
Manufact Cloudmcp-use, e server esterni collegatiFree $0 con $5 di crediti al mese, 1 progettoPro $250 al mese con fatturazione annuale ($3.000), più il consumoTool call a $0,10 ogni 1.000. Esiste anche Pay as you go, senza canone, con $10 di crediti
FastMCP Gateway di Prefect (Prefect Horizon nella documentazione di FastMCP)FastMCP o qualsiasi framework MCPNon indicatoPrezzo non pubblicatoDeploy da GitHub in circa 60 secondi, SSO e permessi per singolo tool
Cloudflare WorkersAgents SDK, SDK ufficiale TypeScript100.000 richieste al giorno$5 al mese con 10 milioni di richieste inclusePoi $0,30 per ogni milione di richieste
Vercelmcp-handler, xmcpHobby $0, solo per uso personale non commercialePro $20 al mese per sviluppatoreHobby include 1 milione di invocazioni al mese
Server tuo (VPS o container)TuttiDipende dal providerDipende dal providerSicurezza, OAuth e aggiornamenti li gestisci tu

Prezzi in dollari, letti il 10/11/2026 sulle pagine ufficiali: prezzi di Manufact Cloud, prezzi di Cloudflare Workers, vercel.com/pricing (IVA esclusa) e prefect.io/horizon.

Per un team marketing il conto è basso. Un tool UTM usato dal team fa qualche centinaio di chiamate al mese: su Manufact 300 chiamate costano 3 centesimi, dentro i $5 gratuiti. Su Cloudflare Free resti lontano dalle 100.000 richieste al giorno. Il costo vero è il tempo di chi tiene il server aggiornato.

Quale SDK MCP scegliere per il tuo lavoro?

Scegli in base al linguaggio che il tuo team usa già e al posto dove vivrà il server. Python o FastMCP per un tool interno scritto in fretta. mcp-use per un prototipo da mostrare, con Inspector e deploy pronti. mcp-handler o xmcp se il sito gira già su Next.js. L’SDK ufficiale se il server deve durare anni.

Il lavoroCosa scegliereiPerché
Un tool interno per il team: UTM, controllo dei meta, reportFastMCP o SDK ufficiale Python13 righe, schema automatico, gira sul portatile
Una demo per un cliente entro la mattinamcp-useInspector, ricarica automatica e deploy su Manufact Cloud già inclusi
Collegare un sito o un e-commerce che gira su Next.jsmcp-handler o xmcpLi monti dentro l’app che hai già, anche su Vercel
Un server pubblico per i tuoi clienti, con loginCloudflare Agents SDK, o FastMCP con il GatewayOAuth e hosting gestito, con Workers che parte da $0
Un server che deve durare anni e passare dall’ITSDK ufficiale TypeScript, Python o GoLo mantiene il progetto MCP, con meno dipendenze
Un servizio con molto trafficoSDK ufficiale Go4 ms di avvio e un solo eseguibile da distribuire

mcp-handler, xmcp e l’Agents SDK non li ho provati: in quelle righe il giudizio viene dalla documentazione e dai repository, non dal test. Le altre righe nascono da quello che ho visto oggi sul box.

Il mio consiglio, se parti da zero: non scegliere l’SDK MCP in base alle stelle. Scegli il linguaggio che chi manterrà il server conosce già. Un server MCP in Python scritto dal tuo analista vale più di uno in Go che nessuno in azienda sa aggiornare.

SDK ufficiale o framework: che differenza c’è?

L’SDK MCP ufficiale implementa il protocollo e poco altro: lo mantengono i maintainer di MCP e segue le nuove versioni della specifica. Un framework ci costruisce sopra comodità come Inspector, generatori di progetto, autenticazione e deploy, e spesso un servizio a pagamento. Il prezzo sono più dipendenze e un’azienda in più da cui dipendi.

In numeri, dal mio test: l’SDK ufficiale TypeScript installa 3 pacchetti e occupa 17 MB, mcp-use ne installa 53 e occupa 77 MB. In Python l’SDK ufficiale porta 28 pacchetti in 33 MB, FastMCP 62 in 66 MB. Non è un difetto dei framework: è quello che ti danno in più.

C’è anche un legame storico. Secondo la documentazione di FastMCP su gofastmcp.com, la sua API di alto livello è entrata nell’SDK ufficiale Python nel 2024. Per questo i due file del test sono quasi uguali. Prefect scrive anche che FastMCP alimenta il 70% dei server MCP in tutti i linguaggi: è un dato del produttore e non ho modo di verificarlo.

  • Scegli l’SDK ufficiale se ti servono poche dipendenze, il supporto alle nuove versioni del protocollo appena escono, o se l’IT accetta solo librerie dei maintainer.
  • Scegli un framework se vuoi arrivare prima a un server online, con Inspector, autenticazione e deploy già pronti.
  • Blocca sempre la versione, in tutti e due i casi: questi pacchetti escono con versioni nuove ogni poche settimane.

Ogni quanto aggiorniamo questo confronto?

Ogni settimana. Ricontrolliamo versioni, stelle, download e prezzi sulle pagine ufficiali e aggiorniamo la riga «Ultima verifica» sopra la tabella. Se esce un nuovo SDK MCP ufficiale o un framework che merita una prova, lo aggiungiamo e scriviamo chiaramente se l’abbiamo testato o se il giudizio viene solo dalla documentazione.

Questo è quello che controlliamo a ogni passaggio:

  1. Elenco e livelli degli SDK ufficiali sulla pagina del Model Context Protocol.
  2. Versione, licenza e stelle di ogni progetto su GitHub, npm e PyPI.
  3. Download degli ultimi 7 giorni da npm e da pypistats.org.
  4. Prezzi sulle pagine ufficiali di Manufact, Prefect, Cloudflare e Vercel.
  5. Il test, ripetuto quando cambia la versione principale di un SDK che abbiamo provato.

Se usi un SDK MCP che qui manca, o se un dato è cambiato prima del nostro controllo, segnalamelo su X, dove sono @victormotricala: lo verifico e lo aggiungo con la data.

Quali sono le domande più frequenti sugli SDK MCP?

Sono le domande che ritornano più spesso nelle guide sul tema quando devi scegliere un SDK MCP: qual è il migliore, se FastMCP è ufficiale, se esistono SDK per Go e Rust e se puoi cambiare in seguito. Le risposte vengono dal test del 10/11/2026 e dalle pagine ufficiali.

Qual è il miglior SDK per creare un server MCP?

Dipende dal linguaggio del tuo team. In Python FastMCP o l’SDK ufficiale ti fanno scrivere meno codice, 13 righe nel mio test. In TypeScript l’SDK ufficiale v2 è il più leggero, mcp-use ti dà più strumenti pronti. In Go c’è l’SDK ufficiale mantenuto con Google.

FastMCP è un SDK ufficiale?

No. FastMCP è un framework open source di Prefect, con licenza Apache-2.0. La sua prima API è entrata nell’SDK ufficiale Python nel 2024, dove oggi la classe si chiama MCPServer. Il pacchetto fastmcp resta separato e si aggiorna per conto suo: oggi è alla versione 4.1.7.

Esiste un SDK MCP ufficiale per Go o per Rust?

Sì, per tutti e due, ed entrambi sono Tier 1, il livello più alto. L’SDK Go è mantenuto insieme a Google ed è alla versione 1.8.0. Quello Rust si chiama rmcp. Per Go esiste anche mcp-go di mark3labs, un’alternativa della community con 9.232 stelle.

Posso cambiare SDK in seguito senza rifare tutto?

Il server va riscritto, ma è poco codice: da 13 a 34 righe nel mio test. Client e app AI non se ne accorgono, perché tutti parlano lo stesso protocollo. Nel test un unico client Python ha chiamato server TypeScript, Go e Python senza modifiche.

Da dove parti, in pratica?

Parti dal linguaggio che conosci già e da un solo tool, piccolo, che oggi fai a mano. Se scrivi Python, installa FastMCP o l’SDK ufficiale e copia il server qui sopra: in dieci minuti lo provi nell’Inspector. Se scrivi TypeScript e vuoi mostrare qualcosa entro sera, usa mcp-use. Se vuoi meno dipendenze, l’SDK ufficiale v2.

Il mio giudizio dopo il test è questo: per lo stesso tool le differenze tra gli SDK MCP sono piccole, perché parlano tutti lo stesso protocollo. Il rischio più grande non è scegliere l’SDK MCP sbagliato, è copiare un tutorial vecchio. Blocca la versione e controlla l’import prima di tutto il resto.

Vuoi costruire il primo server passo per passo? Segui la guida completa ai server MCP o la guida a mcp-use. Per capire a quale assistente collegarlo, leggi la guida agli agenti AI per il marketing e il confronto tra agenti AI.

Newsletter gratuita

Agenti AI in produzione, ogni settimana.

Cosa costruisco, cosa funziona e cosa no — esperimenti veri su agenti, automazione e distribuzione. Niente teoria riciclata.

Zero spam. Cancellati quando vuoi.

Guida gratuita

AI in produzione: il playbook.

Una guida pratica sugli esperimenti che arrivano davvero in produzione — agenti, automazione, distribuzione. Lascia l’email: te la mando appena esce.

Risorsa gratuita

Il mio stack AI 2026.

Tutti gli strumenti che uso davvero per agenti, contenuti e automazione. Gratis, via email.

Zero spam. Cancellati quando vuoi.

Iscrivendoti accetti la Privacy Policy. Ti chiediamo conferma via email e puoi cancellarti quando vuoi.

Avatar Victor Motricala

AI engineer · building in public