Tutorial sul Calcolatore MCP per Principianti
July 3, 2026 · View on GitHub
Indice
- Cosa Imparerai
- Prerequisiti
- Comprendere la Struttura del Progetto
- Spiegazione dei Componenti Principali
- Esecuzione degli Esempi
- Come Funziona Tutto Insieme
- Prossimi Passi
Cosa Imparerai
Questo tutorial spiega come costruire un servizio calcolatore utilizzando il Model Context Protocol (MCP). Capirai:
- Come creare un servizio che l'AI può usare come strumento
- Come configurare la comunicazione diretta con servizi MCP
- Come i modelli AI possono scegliere automaticamente quali strumenti usare
- La differenza tra chiamate dirette al protocollo e interazioni assistite dall'AI
Prerequisiti
Prima di iniziare, assicurati di avere:
- Java 21 o superiore installato
- Maven per la gestione delle dipendenze
- Un deployment di modello Azure AI Foundry (provisiona con
azd up— vedi Capitolo 2) - La CLI di Azure, effettuato il login con
az login(autenticazione senza chiave) - Conoscenze base di Java e Spring Boot
Comprendere la Struttura del Progetto
Il progetto calcolatore ha diversi file importanti:
calculator/
├── src/main/java/com/microsoft/mcp/sample/server/
│ ├── McpServerApplication.java # Main Spring Boot app
│ └── service/CalculatorService.java # Calculator operations
└── src/test/java/com/microsoft/mcp/sample/client/
├── SDKClient.java # Direct MCP communication
├── LangChain4jClient.java # AI-powered client
└── Bot.java # Simple chat interface
Spiegazione dei Componenti Principali
1. Applicazione Principale
File: McpServerApplication.java
Questo è il punto di ingresso del nostro servizio calcolatore. È un'applicazione Spring Boot standard con un'aggiunta speciale:
@SpringBootApplication
public class McpServerApplication {
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider calculatorTools(CalculatorService calculator) {
return MethodToolCallbackProvider.builder().toolObjects(calculator).build();
}
}
Cosa fa:
- Avvia un server web Spring Boot sulla porta 8080
- Crea un
ToolCallbackProviderche rende disponibili i nostri metodi calcolatore come strumenti MCP - L'annotazione
@Beandice a Spring di gestirlo come componente che altre parti possono utilizzare
2. Servizio Calcolatore
File: CalculatorService.java
Qui avviene tutta la matematica. Ogni metodo è annotato con @Tool per renderlo disponibile tramite MCP:
@Service
public class CalculatorService {
@Tool(description = "Add two numbers together")
public String add(double a, double b) {
double result = a + b;
return formatResult(a, "+", b, result);
}
@Tool(description = "Subtract the second number from the first number")
public String subtract(double a, double b) {
double result = a - b;
return formatResult(a, "-", b, result);
}
// Altre operazioni della calcolatrice...
private String formatResult(double a, String operator, double b, double result) {
return String.format("%.2f %s %.2f = %.2f", a, operator, b, result);
}
}
Caratteristiche principali:
- Annotazione
@Tool: Dice a MCP che questo metodo può essere chiamato da client esterni - Descrizioni Chiare: Ogni strumento ha una descrizione che aiuta i modelli AI a capire quando usarlo
- Formato di Ritorno Consistente: Tutte le operazioni restituiscono stringhe leggibili come "5.00 + 3.00 = 8.00"
- Gestione Errori: Divisione per zero e radice quadrata di numeri negativi restituiscono messaggi di errore
Operazioni disponibili:
add(a, b)- Somma due numerisubtract(a, b)- Sottrae il secondo dal primomultiply(a, b)- Moltiplica due numeridivide(a, b)- Divide il primo per il secondo (controllo zero)power(base, exponent)- Eleva la base alla potenza dell'esponentesquareRoot(number)- Calcola la radice quadrata (controllo negativo)modulus(a, b)- Restituisce il resto della divisioneabsolute(number)- Restituisce il valore assolutohelp()- Restituisce informazioni su tutte le operazioni
3. Client MCP Diretto
File: SDKClient.java
Questo client comunica direttamente con il server MCP senza usare AI. Chiama manualmente funzioni specifiche del calcolatore:
public class SDKClient {
public static void main(String[] args) {
McpClientTransport transport = WebFluxSseClientTransport.builder(
WebClient.builder().baseUrl("http://localhost:8080")
).build();
new SDKClient(transport).run();
}
public void run() {
var client = McpClient.sync(this.transport).build();
client.initialize();
// Elenca gli strumenti disponibili
ListToolsResult toolsList = client.listTools();
System.out.println("Available Tools = " + toolsList);
// Chiama funzioni specifiche della calcolatrice
CallToolResult resultAdd = client.callTool(
new CallToolRequest("add", Map.of("a", 5.0, "b", 3.0))
);
System.out.println("Add Result = " + resultAdd);
CallToolResult resultSqrt = client.callTool(
new CallToolRequest("squareRoot", Map.of("number", 16.0))
);
System.out.println("Square Root Result = " + resultSqrt);
client.closeGracefully();
}
}
Cosa fa:
- Si connette al server calcolatore su
http://localhost:8080usando il pattern builder - Elenca tutti gli strumenti disponibili (le nostre funzioni calcolatore)
- Chiama funzioni specifiche con parametri esatti
- Stampa i risultati direttamente
Nota: Questo esempio usa la dipendenza Spring AI 1.1.0-SNAPSHOT, che ha introdotto il pattern builder per WebFluxSseClientTransport. Se usi una versione stabile più vecchia, potresti dover usare il costruttore diretto.
Quando usarlo: Quando sai esattamente quale calcolo vuoi eseguire e vuoi chiamarlo programmaticamente.
4. Client Alimentato da AI
File: LangChain4jClient.java
Questo client usa un modello AI (GPT-4o-mini) che può decidere automaticamente quali strumenti calcolatore usare:
public class LangChain4jClient {
public static void main(String[] args) throws Exception {
// Configura il modello AI (Azure AI Foundry, autenticazione senza chiave tramite Microsoft Entra ID)
String endpoint = System.getenv("AZURE_OPENAI_ENDPOINT");
String baseUrl = (endpoint.endsWith("/") ? endpoint : endpoint + "/") + "openai/v1";
String token = new DefaultAzureCredentialBuilder().build()
.getToken(new TokenRequestContext().addScopes("https://ai.azure.com/.default"))
.block().getToken();
ChatLanguageModel model = OpenAiOfficialChatModel.builder()
.baseUrl(baseUrl)
.apiKey(token)
.modelName("gpt-4o-mini")
.build();
// Connetti al nostro server calcolatore MCP
McpTransport transport = new HttpMcpTransport.Builder()
.sseUrl("http://localhost:8080/sse")
.logRequests(true) // Mostra cosa sta facendo l'AI
.logResponses(true)
.build();
McpClient mcpClient = new DefaultMcpClient.Builder()
.transport(transport)
.build();
// Dai all'AI accesso ai nostri strumenti calcolatore
ToolProvider toolProvider = McpToolProvider.builder()
.mcpClients(List.of(mcpClient))
.build();
// Crea un bot AI che può usare il nostro calcolatore
Bot bot = AiServices.builder(Bot.class)
.chatLanguageModel(model)
.toolProvider(toolProvider)
.build();
// Ora possiamo chiedere all'AI di fare calcoli in linguaggio naturale
String response = bot.chat("Calculate the sum of 24.5 and 17.3 using the calculator service");
System.out.println(response);
response = bot.chat("What's the square root of 144?");
System.out.println(response);
}
}
Cosa fa:
- Crea una connessione al modello AI usando autenticazione senza chiave (Microsoft Entra ID)
- Collega l'AI al nostro server MCP calcolatore
- Dà all'AI accesso a tutti i nostri strumenti calcolatore
- Permette richieste in linguaggio naturale come "Calcola la somma di 24.5 e 17.3"
L'AI automaticamente:
- Capisce che vuoi sommare numeri
- Sceglie lo strumento
add - Chiama
add(24.5, 17.3) - Restituisce il risultato in una risposta naturale
Esecuzione degli Esempi
Passo 1: Avvia il Server Calcolatore
Prima, effettua il login e imposta il tuo endpoint Azure AI Foundry (necessario per il client AI — autenticazione senza chiave, nessuna API Key):
Windows:
az login
set AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
Linux/macOS:
az login
export AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
Avvia il server:
cd 04-PracticalSamples/calculator
mvn clean spring-boot:run
Il server si avvierà su http://localhost:8080. Dovresti vedere:
Started McpServerApplication in X.XXX seconds
Passo 2: Testa con il Client Diretto
In un terminale NUOVO con il server ancora in esecuzione, esegui il client MCP diretto:
cd 04-PracticalSamples/calculator
mvn test-compile exec:java -Dexec.mainClass="com.microsoft.mcp.sample.client.SDKClient" -Dexec.classpathScope=test
Vedrai un output come:
Available Tools = [add, subtract, multiply, divide, power, squareRoot, modulus, absolute, help]
Add Result = 5.00 + 3.00 = 8.00
Square Root Result = √16.00 = 4.00
Passo 3: Testa con il Client AI
mvn test-compile exec:java -Dexec.mainClass="com.microsoft.mcp.sample.client.LangChain4jClient" -Dexec.classpathScope=test
Vedrai l'AI usare automaticamente gli strumenti:
The sum of 24.5 and 17.3 is 41.8.
The square root of 144 is 12.
Passo 4: Chiudi il Server MCP
Quando hai finito di testare, puoi fermare il client AI premendo Ctrl+C nel suo terminale. Il server MCP continuerà a funzionare finché non lo fermerai.
Per fermare il server, premi Ctrl+C nel terminale dove è in esecuzione.
Come Funziona Tutto Insieme
Ecco il flusso completo quando chiedi all'AI "Quanto fa 5 + 3?":
- Tu chiedi all'AI in linguaggio naturale
- L'AI analizza la richiesta e capisce che vuoi sommare
- L'AI chiama il server MCP:
add(5.0, 3.0) - Il Servizio Calcolatore esegue:
5.0 + 3.0 = 8.0 - Il Servizio Calcolatore restituisce:
"5.00 + 3.00 = 8.00" - L'AI riceve il risultato e crea una risposta naturale
- Tu ottieni: "La somma di 5 e 3 è 8"
Prossimi Passi
Per altri esempi, vedi Capitolo 04: Esempi pratici
Disclaimer: Questo documento è stato tradotto utilizzando il servizio di traduzione AI Co-op Translator. Sebbene ci impegniamo per garantire la precisione, si prega di notare che le traduzioni automatizzate possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un essere umano. Non siamo responsabili per eventuali malintesi o interpretazioni errate derivanti dall’uso di questa traduzione.