Come costruire un server MCP

Autori

Ash Minhas

Manager, Technical Content | AI Advocate

IBM

PJ Hagerty

Lead, AI Advocacy

IBM

Erika Russi

Data Scientist

IBM

In questo tutorial, creerai un semplice Model Context Protocol server (MCP) che espone un unico strumento per la ricerca di tutorial IBM. Utilizzando il framework fastmcp e la libreria delle richieste, lo script scarica un indice JSON di tutorial da un URL remoto. Cerca quindi le corrispondenze con la query di un utente e restituisce un elenco di risultati formattato in modo ordinato. Aggiungerai anche la gestione degli errori per problemi di rete, JSON errato e problemi imprevisti, rendendo lo strumento robusto e adatto ai principianti. Infine, eseguirai il server MCP in modo che possa essere collegato e testato con un client come Cursor.

Cos'è l'MCP?

Sia gli sviluppatori enterprise che quelli di startup stanno sviluppando sempre più soluzioni basate su intelligenze artificiali (AI) generative. Per rendere le soluzioni più utili, hanno bisogno di informazioni e contesto aggiornati. Machine learning modelli hanno bisogno di interagire con strumenti, [interfacce di programmazione delle applicazioni] (https://www.ibm.com/it-it/think/topics/api)(API), kit di sviluppo software (SDK) e sistemi front-end affinché ciò avvenga.

MCP standardizza il modo in cui il contesto viene trasferito tra modelli AI e sistemi. Semplifica il coordinamento tra un modello linguistico di grandi dimensioni (LLM) e fonti di dati e strumenti esterni. Un'analogia comune è quella di pensare a MCP come a una porta USB-C per un LLM. Rendono un LLM molto più utile perché il modello ha accesso a funzionalità e dati che non facevano parte dell'addestramento del modello. Questa capacità è particolarmente utile quando si creano agenti AI.

MCP è stato sviluppato da Anthropic ed è stato adottato dai principali fornitori di AI tra cui OpenAI, Google DeepMind e il settore in generale. Fornisce un modo sicuro e standardizzato per i modelli AI di accedere e utilizzare dati, risorse (come i modelli di prompt) e strumenti esterni.

Inoltre, anche ambienti di sviluppo integrati (IDE) come Cursor e Visual Studio Code hanno adottato l'MCP, consentendo ai loro assistenti AI di accedere ai server MCP per renderne l'uso più pertinente al contesto e intuitivo per gli sviluppatori. Costruito come standard aperto, le organizzazioni utilizzano l'MCP come ponte tra il mondo stocastico dell'AI generativa e il mondo deterministico della maggior parte dei sistemi aziendali esistenti oggi. L'MCP fornisce a un LLM informazioni contestuali in modo simile ad altri modelli di progettazione che hanno iniziato a emergere come [retrieval-augmented generation] (https://www.ibm.com/it-it/think/topics/retrieval-augmented-generation) (RAG), tool calling e gli agenti AI.

Alcuni vantaggi dell'utilizzo di MCP rispetto a queste altre soluzioni includono:

- Scalabilità: i server MCP possono essere definiti e ospitati una sola volta e utilizzati da molti sistemi AI. Questa capacità limita la necessità di definire l'accesso agli stessi dati di origine, risorse e strumenti di AI per più sistemi di AI generativa.

- Recupero dei dati: a differenza dei RAG, in cui il recupero dei dati richiede la pre-elaborazione e la vettorializzazione prima della query, l'MCP è dinamico e consente fluttuazioni e aggiornamenti dalle fonti di informazioni in tempo reale.

- Complessità: l'MCP è abbastanza semplice da configurare e incorporare nelle applicazioni AI, come dimostriamo qui. È possibile utilizzare facilmente i file di configurazione per rendere portabile un server MCP in tutti gli ambienti.

- Indipendenza dalla piattaforma: oltre al fatto che è possibile creare server MCP con Python, TypeScript o altri linguaggi, non sono nemmeno accoppiati a una soluzione LLM specifica.

- Debug tramite un modello client/server: il client MCP invia richieste al server MCP, che quindi recupera i dati necessari da vari sistemi e fonti esterne, che si tratti di API, database o file locali. Questo approccio strutturato garantisce che il modello AI riceva un contesto coerente e pertinente, portando a output più precisi e affidabili. MCP utilizza JSON-RPC per codificare i messaggi e supporta 2 meccanismi di trasporto, stdio e HTTP in streaming. Nelle precedenti iterazioni del protocollo, supportava anche HTTP con eventi inviati dal server (SSE)

La necessità di tenersi costantemente aggiornati con le informazioni più recenti di cui la tua azienda ha bisogno può essere scoraggiante. MCP può aiutare a creare un contesto e incorporare nuove informazioni per i contratti man mano che vengono eseguiti, informazioni legacy che vengono digitalizzate ma non necessariamente rese digeribili e altro ancora. Queste informazioni possono essere sia interne che esterne, ma l'aggiunta del contesto evita la lunga necessità di riqualificare un LLM per essere utile.

Sono disponibili molti server MCP remoti e numerose implementazioni di riferimento da github.com

Passaggi

Questa guida dettagliata può essere trovata sul nostro repository GitHub insieme allo script server.py a cui farai riferimento durante la creazione del tuo server MCP. In questo tutorial verrà illustrata la creazione di un server MCP personalizzato di base in grado di:

  • Connettersi al nostro repository GitHub di tutorial
  • Eseguire una ricerca di argomenti che potrebbero interessare all'utente
  • Restituire i risultati con i link al tutorial

Per facilitare la creazione di questo tutorial, abbiamo creato un meccanismo in base al quale il server che creerai potrà utilizzare facilmente i contenuti del nostro tutorial senza l'autenticazione richiesta.

Passaggio 1. Configurare il tuo ambiente

- ‌Python 3.11 o più recente installato sul tuo computer (controlla eseguendo python3 --version nel tuo terminale).

- Il modulo venv integrato è disponibile (viene fornito con Python sulla maggior parte dei sistemi; su alcune distribuzioni Linux potrebbe essere necessario installarlo separatamente con sudo apt install python3-venv).

- Un terminale a riga di comando (CLI):

- macOS o Linux: usa l'app Terminal (questi ambienti sono simili a Unix).

- Windows: usa PowerShell o prompt, con piccole differenze di sintassi spiegate nei prossimi passi.

- Un editor di testo o IDE a tua scelta 

Crea una nuova directory e digita cd al suo interno

  mkdir ibmtutorialmcpserver  e cd ibmtutorialmcpserver

Assicurarsi di essere nella directoryibmtutorialmcpserver puoi eseguire il comando seguente per creare un ambiente virtuale 

python3 -m venv venv 

Nota: su Windows, potresti essere in grado di sostituirepython3  conpython

Una volta creato l'ambiente virtuale, è necessario attivarlo utilizzando il seguente comando

source venv/bin/activate

Una volta attivato, la tua shell ti mostrerà probabilmente(venv) nel prompt 

Ora è necessario installare il pacchetto Python perfastMCP . Questo framework open source fornisce tutte le caratteristiche richieste per l'esecuzione di un server MCP e viene mantenuto attivamente. Installeremo anche ilrequests package  per fare semplici richieste HTTP

Installa ilfastMCP erequests pacchetto conpip utilizzando il seguente comando

pip install fastmcp requests

Al termine di questo passaggio, è possibile verificare che fastMCP sia installato correttamente eseguendo il seguente comando 

fastmcp version

Se ottieni un output simile al seguente, hai installato fastMCP nel tuo ambiente virtuale.

FastMCP version:                                       2.10.1
MCP version:                                           1.10.1
Python version:                                       3.11.13
Platform:                          macOS-15.5-arm64-arm-64bit
FastMCP root path: /opt/homebrew/lib/python3.11/site-packages

Ora che hai installato fastMCP, creiamo il nostro server MCP.

Passaggio 2. Creare un server MCP

Creiamo un nuovo file nella directory e diamogli il nomeserver.py .

Una volta ottenuto quel file, aprilo e copia e incolla al suo interno il seguente frammento di codice 

# Simple MCP server that exposes a single tool to search IBM tutorials.
# How to run:
# 1) Install dependencies: pip install fastmcp requests
# 2) Start the server using an MCP client with the command: fastmcp run <YOUR PATH>/server.py

from fastmcp import FastMCPimport requests

# Source of the tutorials index 
DOCS_INDEX_URL = "https://raw.githubusercontent.com/IBM/ibmdotcom-tutorials/refs/heads/main/docs_index.json"


mcp = FastMCP("IBM Tutorials")

@mcp.tool
def search_ibmtutorials(query: str) -> str:
    """
    Search for tutorials on GitHub by downloading a JSON file from a GitHub repo and searching the payload for any relevant results and the respective details

Args:
    query: The search term to look for in tutorial titles and URLs

Returns:
    A formatted list of relevant tutorial results
    """
    try:
        # Download the JSON file from the GitHub repo
        response = requests.get(DOCS_INDEX_URL, timeout=10)
        response.raise_for_status() # Raise an exception for bad status codes

        # Parse the JSON data
        tutorials = response.json()

        # Search for relevant tutorials (case-insensitive)
        query_lower = query.lower()
        relevant_tutorials = []

        for tutorial in tutorials:
            # Search in title and URL
            title = tutorial.get('title', '').lower()
            url_path = tutorial.get('url', '').lower()

            if query_lower in title or query_lower in url_path:
                relevant_tutorials.append(tutorial)

        # Format and return results
        if not relevant_tutorials:
            return f"No IBM tutorials found matching '{query}'"

        # Format the results
            result_lines = [f"Found {len(relevant_tutorials)} tutorial(s) matching '{query}':\n"]

        for i, tutorial in enumerate(relevant_tutorials, 1):
            title = tutorial.get('title', 'No title')
            tutorial_url = tutorial.get('url', 'No URL')
            date = tutorial.get('date', 'No date')
            author = tutorial.get('author', '')

            result_lines.append(f"{i}. **{title}**")
            result_lines.append(f" URL: {tutorial_url}")
            result_lines.append(f" Date: {date}")
            if author:
                result_lines.append(f" Author: {author}")
            result_lines.append("") # Empty line for spacing

        return "\n".join(result_lines)

    except requests.exceptions.RequestException as e:
    return f"Error fetching tutorials from GitHub: {str(e)}"
    except ValueError as e:
    return f"Error parsing JSON data: {str(e)}"
    except Exception as e:
    return f"Error searching IBM tutorials: {str(e)}"


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

Esaminiamo il codice precedente e spieghiamo a cosa servono le parti principali. 

Importazioni e configurazione

Lo script inizia con l'importazione di FastMCP, che fornisce il framework per la creazione di un server MCP, e delle richieste utilizzate per scaricare i dati tramite HTTP. Abbiamo aggiunto una costanteDOCS_INDEX_URL per memorizzare l'URL JSON remoto per l'indice dei tutorial. Questo approccio semplifica la modifica del percorso di origine se si dispone di un'altra origine di dati JSON per cui si vuole riutilizzare questo tutorial in un secondo momento.

Configurazione del server MCP

Creiamo quindi un'istanza del server MCP conFastMCP(“IBM Tutorials”) . Questo passaggio funge da controller centrale per tutti gli strumenti che il server esporrà ai client MCP, come ad esempio lo strumentosearch_ibmtutorials  che definiamo.

Definizione dello strumento MCP 

The@mcp.tool  decorator contrassegnasearch_ibmtutorials  come uno strumento MCP. Questa funzione richiede un termine di ricerca, scarica l'indice del tutorial daDOCS_INDEX_URL  utilizzandorequests.get() (con un timeout di 10 secondi per la sicurezza della rete) e genera un'eccezione se lo stato della risposta HTTP indica un errore. Una volta recuperati, i dati vengono analizzati da JSON in oggetti Python.

La ricerca non distingue tra maiuscole e minuscole: la query viene convertita in minuscolo e anche il titolo e l'URL di ciascun tutorial vengono trasformati in minuscolo per consentire la corrispondenza. Se un tutorial contiene il termine di ricerca nel titolo o nell'URL, viene aggiunto a un elenco di risultati pertinenti.

Formattazione e restituzione dei risultati

Se nessun tutorial corrisponde alla ricerca, la funzione restituisce un messaggio descrittivo con l'indicazione che non è stato trovato nulla. Se ci sono corrispondenze, la funzione crea un elenco formattato e numerato che mostra il titolo, l'URL, la data e, se disponibile, l'autore di ogni tutorial. La formattazione utilizza il grassetto in stile Markdown per i titoli in modo che si distinguano nei client che lo supportano. Il testo formattato finale viene restituito come una singola stringa.

Gestione degli errori

La funzione include la gestione mirata delle eccezioni:

requests.exceptions.RequestException rileva problemi di rete come timeout o cattive connessioni.

ValueError  (che può essere generato da .json()) rileva i casi in cui la risposta non è un JSON valido.

Un gestore generale diException  cattura qualsiasi altro errore imprevisto.

Ogni errore restituisce un messaggio descrittivo al chiamante invece di arrestare il programma.

Avvio del server

In basso, loif name == “main” : blocco assicura chemcp.run() venga eseguito solo quando lo script viene avviato direttamente. Questo passaggio avvia il server MCP, rendendo losearch_ibmtutorials  strumento disponibile per qualsiasi client MCP, come MCP Inspector. Questo strumento è utile per la risoluzione dei problemi e il debug del server MCP. Lo strumento fornisce un'interfaccia utente che è possibile utilizzare per eseguire il debug del server MCP e la convalida del comportamento previsto. 

Passaggio 3. Aggiungi il server MCP al tuo IDE

Ora che hai creato il server, devi abilitarlo nel tuo IDE prima di poterlo utilizzare. Esistono molti client che supportano l'MCP con vari livelli di integrazione con il protocollo. Il sito Web ufficiale di MCP fornisce un elenco esaustivo di client di esempio.
Se Cursor è installato, è possibile aggiungere il server MCP all'interno di Cursor seguendo queste istruzioni.

Apri le impostazioni di Cursor e vai su Strumenti e integrazioni. Seleziona Nuovo server MCP e incollalo nel file mcp.json che Cursor apre in una nuova scheda. Assicurati di sostituire <YOUR PATH> con la directory in cui ti trovi. Puoi eseguire il pwd nel tuo terminale per ottenere il percorso completo. Per ulteriori informazioni su Cursor e MCP, consulta la documentazione di Cursor.

{
  &quot;mcpServers&quot;: {
    &quot;tutorials&quot;: {
      &quot;command&quot;: &quot;fastmcp&quot;,
      &quot;args&quot;: [&quot;run <YOUR PATH>/ibmtutorialmcpserver/server.py&quot;],
      &quot;env&quot;: {
      }
    }
  }
}

Se sei un utente di Microsoft VS Code, puoi aggiungere il server MCP seguendo le istruzioni riportate qui. Prima di procedere, assicurati che Copilot sia configurato in VS Code.
Se desideri abilitare il server MCP utilizzando un file, crea un file .vscode/mcp.json nella directory di questo progetto e copia e incolla questo codice nel file. Assicurati di sostituire <IL TUO PERCORSO> con la directory in cui ti trovi. Puoi eseguire pwd nel tuo terminale per ottenere il percorso completo.

&quot;servers&quot;: {
		&quot;IBM Tutorials&quot;: {
			&quot;type&quot;: &quot;stdio&quot;,
			&quot;command&quot;: &quot;fastmcp&quot;,
			&quot;args&quot;: [
				&quot;run&quot;,
				&quot;<YOUR PATH>/ibmtutorialmcpserver/server.py&quot;
			]
		},
	},

Passaggio 4. Usa il server MCP

Ora che hai abilitato il tuo server MCP, facciamo in modo che il server sia in grado di utilizzare lo strumento creato in server.py. Se utilizzi VS Code, dai un'occhiata a questa documentazione.

Nella chat dell'IDE chiederò: "Quali sono alcuni tutorial IBM sulle serie temporali?" Quanto segue mostra l'output ricevuto, ma la tua risposta può variare a seconda del modello utilizzato e del tuo IDE.

Output:

Here are some IBM time series tutorials:

Time series forecasting with Lag-Llama (zero-shot learning)
Tutorial link
Predict overnight low temperatures using the Lag-Llama model in a zero-shot learning scenario.

Using the watsonx.ai Time Series Forecasting API to predict energy demand
Tutorial link
Predict energy demand with the watsonx.ai Time Series Forecasting API.
Authors: Aleksandra Kłeczek and Meredith Syed

Let me know if you want details or help with a specific tutorial.

Fantastico! L'agente è stato in grado di utilizzare lo search_ibmtutorials  strumento che abbiamo creato per cercare tutorial relativi alle serie temporali.

Riepilogo

In questo tutorial hai imparato a creare un server MCP per effettuare ricerche in tutti i nostri tutorial utilizzando il client MCP che preferisci. Hai creato un server MCP con un unico strumento di ricerca che recupera un indice remoto JSON di tutorial, filtra i risultati in base a un termine di ricerca e li restituisce in un formato leggibile. Utilizza fastmcp per registrare ed eseguire lo strumento, richiede il recupero dei dati e include la gestione degli errori di rete, l'analisi e i problemi imprevisti. Una volta eseguito, il server può essere connesso dai client MCP per interrogare in tempo reale tutti i nostri tutorial.

Soluzioni correlate
Agenti AI per il Business

Crea, implementa e gestisci assistenti e agenti AI potenti che automatizzano workflow e processi con l'AI generativa.

    Scopri watsonx Orchestrate
    Soluzioni per agenti AI IBM

    Costruisci il futuro della tua azienda con soluzioni AI di cui puoi fidarti.

    Esplora le soluzioni basate su agenti AI
    Servizi AI di IBM Consulting

    I servizi di AI di IBM Consulting aiutano a reinventare il modo in cui le aziende lavorano con l'AI per la trasformazione.

    Esplora i servizi di intelligenza artificiale
    Prossimi passi

    Sia che tu scelga di personalizzare app e competenze precostituite o di creare e implementare servizi di agenti personalizzati utilizzando uno studio di AI, la piattaforma IBM watsonx è la soluzione che fa per te.

    Scopri watsonx Orchestrate Esplora watsonx.ai