Cos’è MCP?
A partire da novembre 2024 Anthropic a rilasciato il Model Context Protocol (MCP), in modo tale di permettere agli LLM di reperire informazioni dalle nostre applicazioni locali, operazione che prima si poteva fare soltanto definendo dei tool all’interno dei nostri applicativi.
Vantaggi rispetto ai tools
Ovviamente le stesse operazioni possono essere fatte tramite i tools, ma un server MCP ci da in più la riusabilità e il disaccopiamento.
In sintesi Non dobbiamo cambiare il codice dei nostri agent e possiamo esporre un server Mcp a più agent.
Implementazione di un MCP Server Custom in C#
Ora andremo a vedere come possiamo implementare un MCP Server Custom e farlo utilizzare al nostro agente
Setup del progetto
per l’implementazione è necessario usare il pacchetto ModelContextProtocol presente su Nuget in Preview La libreria oltre ad essere disponibile in c# è disponibile anche per altri linguaggi (Typescript,Python,Java,ecc….) Ma partiamo con lo sviluppo: Creiamo il nostro progetto, in c# (io ho usa la RC1 di .net10) e importiamo i pacchetti nuget
ModelContextProtocol
ModelContextProtocol.AspNetCore
Implementazione dei tools
Per implementare i tool del nostro server MCP sarà sufficiente andare ad implementare una classe e utilizzare il decoratore:
McpServerToolType
e su ogni singolo tool da esporre usiamo il decoratore
McpServerTool
è importante anche utilizzare delle descrizioni chiare, che danno più indicazioni possibili su cosa fa il nostro tool. Per far si che i nostri agent, siano in grado di riconoscere quali tool andare a chiamare, qui vi mostro una classe con all’interno un tool come esempio, che si limita a tornare la stringa ricevuta in input con una personalizzazine.
using ModelContextProtocol.Server;
namespace McpHttpServer.tools
{
///
/// MCP Tools collection for this server
///
[McpServerToolType]
public class McpSampleTools
{
private readonly ServerConfig _config;
public McpSampleTools(ServerConfig config)
{
_config = config;
Console.WriteLine("McpSampleTools initialized with configuration.");
Console.WriteLine("Tool settings:"+ _config.ServerSettings.Name);
}
///
/// Echo tool - returns the provided text
///
/// The text to echo back
/// The echoed text
[McpServerTool]
[Description("Echo back the provided text")]
public string Echo(
[Description("The text to echo back")] string text)
{
Console.WriteLine($"Echo called with text: {text} Config Server Name: {_config.ServerSettings.Name}");
return $"Dal server mcp {_config.ServerSettings.Name}: {text} ";
}
}
}
Implementazione Server MCP Server
Una volta implementati i nostri tool, non ci resta che tirare su allo startup della nostra applicazione il nostro server MCP e questo lo facciamo con le righe di codice che seguono:
uilder.Services.AddMcpServer(options =>
{
options.ServerInfo = new()
{
Name = config.ServerSettings.Name,
Version = config.ServerSettings.Version
};
})
.WithHttpTransport() // Use HTTP transport
.WithToolsFromAssembly(); // Register tools from the current assembly
var app = builder.Build();
// Map MCP endpoints
app.MapMcp();
In estrema sintesi quello che andiamo a fare è definire un serverMCP (“AddMcpServer”) e poi gli diciamo che dobbiamo recuperare i tool dall’assembly “WithToolsFromAssembly” questo metodo, recupera i tools con i decoratori e li espone nell’mcp server, e infine gli indichiamo il trasporto che deve essere http, ci sono anche altri tipi di trasporti (stdio,sse).
Nel mio codice ho aggiunto anche app.MapMcp appunto per andare a mappare l’endpoint dedicato al nostro MCP Server quindi avremo url della nostra applicazione /MCP
Utilizzo Server MCP
Bene ma una volta che abbiamo eseguito lo sviluppo e esponiamo come andiamo a testare il nostro server mcp? la soluzione più rapida è quella di andarlo ad integrare all’interno della finestra del nostro client in visual studio code, quindi all’interno della forder .vscode aggiungiamo un file denominato mcp.json e aggiungiamo le seguenti righe:
{
"servers": {
"nomemioserver": {
"type": "http", //Transport Type
"url": "http://urlmioserver/"
}
}
}