Proof of Concept: Eigene MCP Tools lokal nutzen

Ich weiß nicht, warum meine Kollegen das immer machen. Ständig rufen sie mir irgendwelche coolen Sachen zu. Und ich möchte ja auch überall immer mitmischen. Es gibt jetzt im Visual Studio ein Template für MCP Tools, damit sind die ganz einfach erstellt.

Hmm. Das kann man sich mal kurz anschauen dachte ich. Und in der Tat konnte ich da mit wenigen Zeilen Code erstaunliches erreichen. Ich hab das dann ein wenig optimiert und noch ein zweites Projekt getestet. Allerdings war da die Datenmenge zu groß.

Gerne möchte ich euch mal kurz vorstellen was ich das gebastelt habe.

CD-Manager MCP Tools (ohne CD-Manager)

Die Idee war einfach. Auf meiner Festplatte liegen meine MP3s. Ich binde die CD-Manager suche an ein MCP Tool an und ich sage dem Chat er soll mir den Song suchen. Und noch besser. Ein zweites Tool, das den Song dann zum Winamp zur Playlist hinzufügt.

Ich hab’s mir im Schritt 1 aber einfacher gemacht (und das ganze jetzt noch etwas ‚optimiert‘) und einfach eine Dateiliste meiner MP3s in eine Text-Datei gespeichert und diese dann von dem MCP Tool laden lassen. Dort dann einfach die Zeilen nach den Treffern gefiltert. Das war zwar etwas ungenau, doch für einen ersten Test vollkommen ausreichend. Und den Aufruf einen Song zur Winamp Playlist hinzufügen, habe ich im CD-Manager ja eh schon drin. Das Codeschnipsel konnte ich da ja schnell raus kopieren.

Und nicht nur, dass ich jetzt sagen kann: Spiele mir mal von Green Day Basket Case ab, nein. Auch aufrufe wie: „Welche Bands sind denn ähnlich zu Green Day und was wären deren bekannteste Songs? Kannst du da mal drei Vorschläge machen und schauen ob ich die in meiner Sammlung habe und gerne dann auch zur Playlist hinzufügen?“
Schon habe ich Songs von Blink 182, Sum 41 & Weezer auf meiner Playlist. Und das alles mit einem lokalen Model in LM Studio. Okay. Natürlich ist es von Vorteil, das meine Sammlung ein paar Bands & Songs abdeckt.

Coding

Was braucht man für einen lokalen Test

Fangen wir mal mit dem Visual Studio Template für MCP Server an: https://learn.microsoft.com/en-us/dotnet/ai/quickstarts/build-mcp-server
LM Studio: https://lmstudio.ai/
Model: openai/gpt-oss-20b

Code

Bei dem MCP Server Template ist ein Beispiel dabei. Ich sag mal so. <F5>. Läuft. Da auf die schnelle eine eigene Klasse machen ist kein Thema. Am Rest habe ich erst einmal nichts geändert. Für meinen Test habe ich meine Musiktitel in JSON aufbereitet und in einer Text-Datei abgelegt. Für einen ersten Test sollte das ausreichend sein. Und der Code war dann auch relativ überschaubar.

Den Code zum hinzufügen eines Songs zu Winamp habe ich fast 1:1 aus meinem CD-Manager kopiert. Und dann noch schnell eine Methode zum durchsuchen der Songs.

 
public List<SongInfo> FindSong(
[Description("The artist you are looking for")] string artist,
[Description("The title you are looking for")] string title)
{
    var result = JsonSerializer.Deserialize<List<SongInfo>>(File.ReadAllText(@"D:\Audio\CD-Sammlung\mcpcache.json")).AsEnumerable();
 
    if (!string.IsNullOrEmpty(artist))
        result = result.Where(x => x.Artist.Contains(artist, StringComparison.InvariantCultureIgnoreCase));
 
    if (!string.IsNullOrEmpty(title))
        result = result.Where(x => x.Title.Contains(title, StringComparison.InvariantCultureIgnoreCase));
 
    return result.ToList();
}
 
[McpServerTool]
[Description("Add a song to the current Winamp playlist")]
public bool AddLocalMP3FileToPlaylist([Description("The filename of the local mp3 file")] string filename)
{
    var psi = new ProcessStartInfo
    {
        FileName = ProPathToWinamp,
        Arguments = string.Concat($"/ADD  \"{filename}\"")
    };
    Process.Start(psi);
    return true;
}
 
private string ProPathToWinamp
{
    get
    {
        string rValue = string.Empty;
        try
        {
            RegistryKey? key = Registry.CurrentUser.OpenSubKey(@"Software\Winamp");
            if (key == null) return rValue;
            object? obj = Registry.GetValue(key.Name, string.Empty, string.Empty);
            if (obj == null) return rValue;
            string? folder = obj.ToString();
            if (string.IsNullOrEmpty(folder)) return rValue;
            rValue = Path.Combine(folder, "winamp.exe");
        }
        catch { }
        return rValue;
    }
}

LM Studio Konfiguration

Im LM Studio muss man den MCP Server noch hinzufügen. Dazu kann man für einen einfachen Test einfach die Projektmappe angeben. Die mcp.json zu bearbeiten ist etwas versteckt. Rechts oben findet man einen Hammer. Dort gibt’s bei Integrations dann einen ‚+ Install‘ Button wo man ‚Edit mcp.json‘ auswählen kann.

{
  "mcpServers": {
    "projectmedlan-mcp-server": {
      "command": "dotnet",
      "args": [
        "run",
        "--project",
        "Ordner-Pfad zur Projektmappe"
      ]
    }
}

Die Aufrufe

Und schon kann es auch los gehen. Evtl. muss man im Chat dann auf der rechten Seite den MCP Server noch aktivieren. Im Chat klappt dann so was wie: „Habe ich den Song Basket Case von Green Day in meiner Sammlung?“ genauso gut wie auch: „Kannst du mir Smash von The Offspring auf meine Playlist setzen?“

So sieht das in LM Studio dann aus:

Und auch der zweite Aufruf sieht gut aus

Fazit

Das war ein nettes Proof of Concept. Das aktuelle Model ist mir aber zu langsam und generell bis ich dem sage, was ich suche, habe ich’s im CD-Manager vermutlich auch gefunden. Dennoch kann man natürlich auf so was aufbauen und überlegen, was man damit alles machen kann.