{"id":23315,"date":"2026-09-11T12:07:56","date_gmt":"2026-09-11T10:07:56","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=23315"},"modified":"2026-09-11T12:22:47","modified_gmt":"2026-09-11T10:22:47","slug":"quicktest-eclipse-2026-06-mit-mcp-client-server-demo","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=23315","title":{"rendered":"Quicktest Eclipse 2026-06 mit MCP Client Server Demo"},"content":{"rendered":"<p>Das Update der vorhandenen Version ging leider nicht. Deshalb war eine neu Installation von Eclipse n\u00f6tig.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/wenzlaff.de-2026-09-11-um-11.57.21-scaled.png\" alt=\"\" width=\"2560\" height=\"526\" class=\"aligncenter size-full wp-image-23316\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/wenzlaff.de-2026-09-11-um-11.57.21-scaled.png 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/wenzlaff.de-2026-09-11-um-11.57.21-300x62.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/wenzlaff.de-2026-09-11-um-11.57.21-1024x210.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/wenzlaff.de-2026-09-11-um-11.57.21-768x158.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/wenzlaff.de-2026-09-11-um-11.57.21-1536x316.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/wenzlaff.de-2026-09-11-um-11.57.21-2048x421.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Was es so neues gibt, ist <a href=\"https:\/\/www.heise.de\/news\/Eclipse-IDE-2026-09-Compact-Source-Files-und-Unified-Diff-11447106.html\" target=\"_blank\">hier bei Heise<\/a> beschrieben.<\/p>\n<p>Dann mal ein Java Programm f\u00fcr die Demo von MCP geschrieben, um die Client &#8211; Serververbindung per MCP zu testen. <\/p>\n<p>Die Anwendung verdeutlicht das zentrale Prinzip von MCP: <\/p>\n<p>Eine KI-Anwendung kann \u00fcber ein standardisiertes Protokoll auf externe Werkzeuge und Datenquellen zugreifen, ohne dass die jeweilige Funktionalit\u00e4t direkt in der KI-Anwendung implementiert sein muss.<br \/>\n<!--more--><\/p>\n<p>Zum Testen der Client-Server-Kommunikation wurde ein kleines Java-Programm erstellt. Die Demo kommt ohne zus\u00e4tzliche Bibliotheken aus und verwendet ausschlie\u00dflich Standardklassen aus dem JDK. Voraussetzung ist Java 21, da im Programm virtuelle Threads verwendet werden.<\/p>\n<p>Das Beispiel besteht aus zwei Komponenten:<\/p>\n<p>-einem einfachen MCP-Server, der auf TCP-Port 8080 auf eingehende Verbindungen wartet,<br \/>\n-einer Swing-Oberfl\u00e4che, die als MCP-Client beziehungsweise Host dient.<\/p>\n<p>Die Kommunikation orientiert sich dabei an JSON-RPC 2.0. Der Client kann zun\u00e4chst die verf\u00fcgbaren Werkzeuge abfragen und anschlie\u00dfend ein Werkzeug mit einem Textargument aufrufen.<\/p>\n<p>Was zeigt die Anwendung?<\/p>\n<p>Die Demo bildet die wesentlichen Schritte einer MCP-Kommunikation vereinfacht nach:<br \/>\n1.\tDer Server wird gestartet und wartet auf TCP-Verbindungen.<br \/>\n2.\tDer Client verbindet sich mit \u2009localhost:8080\u2009.<br \/>\n3.\tMit \u2009tools\/list\u2009 fragt der Client die verf\u00fcgbaren Werkzeuge ab.<br \/>\n4.\tDer Server meldet das Werkzeug \u2009string_transformer\u2009.<br \/>\n5.\tMit \u2009tools\/call\u2009 kann der Client dieses Werkzeug aufrufen.<br \/>\n6.\tDer Server verarbeitet den \u00fcbergebenen Text und gibt ihn in Gro\u00dfbuchstaben zur\u00fcck.<\/p>\n<p>Das registrierte Werkzeug ist bewusst einfach gehalten. Es konvertiert den \u00fcbergebenen Text in Gro\u00dfbuchstaben. Dadurch l\u00e4sst sich der Nachrichtenaustausch leicht nachvollziehen, ohne dass die eigentliche Funktionalit\u00e4t durch komplexe Gesch\u00e4ftslogik \u00fcberlagert wird.<\/p>\n<p>Um mal zu zeigen, wie die KI per MCP auf Server zugreift:<\/p>\n<pre class=\"minimize:true lang:java decode:true \" >package de.wenzlaff.mcp;\r\n\r\nimport java.awt.BorderLayout;\r\nimport java.awt.Color;\r\nimport java.awt.FlowLayout;\r\nimport java.awt.Font;\r\nimport java.io.BufferedReader;\r\nimport java.io.IOException;\r\nimport java.io.InputStreamReader;\r\nimport java.io.PrintWriter;\r\nimport java.net.ServerSocket;\r\nimport java.net.Socket;\r\n\r\nimport javax.swing.JButton;\r\nimport javax.swing.JFrame;\r\nimport javax.swing.JLabel;\r\nimport javax.swing.JPanel;\r\nimport javax.swing.JScrollPane;\r\nimport javax.swing.JTextArea;\r\nimport javax.swing.JTextField;\r\nimport javax.swing.SwingUtilities;\r\n\r\n\/**\r\n * Didaktische MCP-Demonstration (Zero-Dependencies).\r\n * \r\n * \r\n * Zeigt JSON-RPC 2.0 Nachrichtenaustausch, Capability Discovery und Tool\r\n * Execution.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class SimpleMcpDemo {\r\n\r\n\tprivate static final int PORT = 8080;\r\n\r\n\tpublic static void main(String[] args) {\r\n\t\t\/\/ 1. MCP Server via Java 21 Virtual Thread starten\r\n\t\tstartMcpServer();\r\n\r\n\t\t\/\/ 2. Swing GUI auf dem Event Dispatch Thread (EDT) initialisieren\r\n\t\tSwingUtilities.invokeLater(McpClientGui::new);\r\n\t}\r\n\r\n\t\/\/ =========================================================================\r\n\t\/\/ MCP SERVER (Simuliert eine KI-Werkzeug-Schnittstelle)\r\n\t\/\/ =========================================================================\r\n\tprivate static void startMcpServer() {\r\n\t\tThread.ofVirtual().start(() -&gt; {\r\n\t\t\ttry (ServerSocket serverSocket = new ServerSocket(PORT)) {\r\n\t\t\t\tSystem.out.println(\"[MCP-Server] Wartet auf eingehende Verbindungen auf Port \" + PORT);\r\n\t\t\t\twhile (true) {\r\n\t\t\t\t\tSocket clientSocket = serverSocket.accept();\r\n\t\t\t\t\t\/\/ Pro Client-Verbindung ein leichtgewichtiger Virtual Thread\r\n\t\t\t\t\tThread.ofVirtual().start(() -&gt; handleMcpClient(clientSocket));\r\n\t\t\t\t}\r\n\t\t\t} catch (IOException e) {\r\n\t\t\t\tSystem.err.println(\"[MCP-Server Fehler] \" + e.getMessage());\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate static void handleMcpClient(Socket socket) {\r\n\t\ttry (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));\r\n\t\t\t\tPrintWriter writer = new PrintWriter(socket.getOutputStream(), true)) {\r\n\r\n\t\t\tString rawJsonRpc;\r\n\t\t\twhile ((rawJsonRpc = reader.readLine()) != null) {\r\n\t\t\t\tString response = processMcpProtocolRequest(rawJsonRpc);\r\n\t\t\t\twriter.println(response);\r\n\t\t\t}\r\n\t\t} catch (IOException e) {\r\n\t\t\tSystem.out.println(\"[MCP-Server] Client-Sitzung beendet.\");\r\n\t\t}\r\n\t}\r\n\r\n\t\/\/ Nachrichten-Dispatcher nach MCP \/ JSON-RPC 2.0 Spezifikation\r\n\tprivate static String processMcpProtocolRequest(String jsonRequest) {\r\n\t\t\/\/ Primitive Capability Discovery: Client fragt verf\u00fcgbare Tools ab\r\n\t\tif (jsonRequest.contains(\"\\\"method\\\":\\\"tools\/list\\\"\")) {\r\n\t\t\treturn \"\"\"\r\n\t\t\t\t\t{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"tools\":[{\"name\":\"string_transformer\",\"description\":\"Konvertiert Eingabetext in Gro\u00dfbuchstaben\"}]}}\r\n\t\t\t\t\t\"\"\"\r\n\t\t\t\t\t.strip();\r\n\t\t}\r\n\r\n\t\t\/\/ Primitive Tool Execution: Ausf\u00fchren der registrierten Funktion\r\n\t\tif (jsonRequest.contains(\"\\\"method\\\":\\\"tools\/call\\\"\")) {\r\n\t\t\tString payload = jsonRequest.contains(\"message\")\r\n\t\t\t\t\t? jsonRequest.replaceAll(\".*\\\"message\\\":\\\"([^\\\"]+)\\\".*\", \"$1\")\r\n\t\t\t\t\t: \"Standard-Payload\";\r\n\r\n\t\t\tString resultText = payload.toUpperCase();\r\n\r\n\t\t\treturn \"\"\"\r\n\t\t\t\t\t{\"jsonrpc\":\"2.0\",\"id\":2,\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"Server-Transformation: %s\"}]}}\r\n\t\t\t\t\t\"\"\".formatted(resultText).strip();\r\n\t\t}\r\n\r\n\t\t\/\/ Fallback: JSON-RPC Standardfehler \"Method not found\" (-32601)\r\n\t\treturn \"{\\\"jsonrpc\\\":\\\"2.0\\\",\\\"id\\\":null,\\\"error\\\":{\\\"code\\\":-32601,\\\"message\\\":\\\"Method not found\\\"}}\";\r\n\t}\r\n\r\n\t\/\/ =========================================================================\r\n\t\/\/ MCP CLIENT \/ HOST (Swing GUI)\r\n\t\/\/ =========================================================================\r\n\tstatic class McpClientGui extends JFrame {\r\n\t\tprivate static final long serialVersionUID = 1L;\r\n\t\tprivate final JTextArea consoleLog = new JTextArea(16, 200);\r\n\t\tprivate final JTextField inputPayload = new JTextField(\"quick eclipse update check mit mcp\", 100);\r\n\t\tprivate PrintWriter outStream;\r\n\t\tprivate BufferedReader inStream;\r\n\r\n\t\tpublic McpClientGui() {\r\n\t\t\tsuper(\"MCP Host - Swing Inspector\");\r\n\t\t\tsetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r\n\t\t\tsetLayout(new BorderLayout(5, 5));\r\n\r\n\t\t\tconsoleLog.setEditable(false);\r\n\t\t\tconsoleLog.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));\r\n\t\t\tconsoleLog.setBackground(new Color(30, 30, 30));\r\n\t\t\tconsoleLog.setForeground(new Color(220, 220, 220));\r\n\r\n\t\t\tJPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));\r\n\t\t\tJButton btnListTools = new JButton(\"1. tools\/list\");\r\n\t\t\tJButton btnCallTool = new JButton(\"2. tools\/call\");\r\n\r\n\t\t\tcontrolPanel.add(new JLabel(\"Argument:\"));\r\n\t\t\tcontrolPanel.add(inputPayload);\r\n\t\t\tcontrolPanel.add(btnListTools);\r\n\t\t\tcontrolPanel.add(btnCallTool);\r\n\r\n\t\t\tadd(controlPanel, BorderLayout.NORTH);\r\n\t\t\tadd(new JScrollPane(consoleLog), BorderLayout.CENTER);\r\n\r\n\t\t\tpack();\r\n\t\t\tsetLocationRelativeTo(null);\r\n\t\t\tsetVisible(true);\r\n\r\n\t\t\tinitNetworkConnection();\r\n\r\n\t\t\t\/\/ Event-Handling: MCP Abfragen generieren\r\n\t\t\tbtnListTools.addActionListener(e -&gt; {\r\n\t\t\t\tString request = \"\"\"\r\n\t\t\t\t\t\t{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools\/list\"}\r\n\t\t\t\t\t\t\"\"\";\r\n\t\t\t\ttransmitMcpFrame(request);\r\n\t\t\t});\r\n\r\n\t\t\tbtnCallTool.addActionListener(e -&gt; {\r\n\t\t\t\tString arg = inputPayload.getText();\r\n\t\t\t\tString request = \"\"\"\r\n\t\t\t\t\t\t{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools\/call\",\"params\":{\"name\":\"string_transformer\",\"arguments\":{\"message\":\"%s\"}}}\r\n\t\t\t\t\t\t\"\"\"\r\n\t\t\t\t\t\t.formatted(arg);\r\n\t\t\t\ttransmitMcpFrame(request);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tprivate void initNetworkConnection() {\r\n\t\t    try {\r\n\t\t\tSocket socket = new Socket(\"localhost\", PORT);\r\n\t\t\toutStream = new PrintWriter(socket.getOutputStream(), true);\r\n\t\t\tinStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));\r\n\t\t\tappendLog(\"[SYSTEM] TCP-Verbindung zu MCP-Server etabliert (Port \" + PORT + \")\\n\");\r\n\t\t    } catch (IOException e) {\r\n\t\t\tappendLog(\"[FEHLER] Serververbindung fehlgeschlagen: \" + e.getMessage());\r\n\t\t    }\r\n\t\t}\r\n\r\n\t\tprivate void transmitMcpFrame(String jsonFrame) {\r\n\r\n\t\t\tString singleLineJson = jsonFrame.replaceAll(\"\\\\s+\", \" \").trim();\r\n\t\t\tappendLog(\"&gt;&gt;&gt; REQUEST (TX):\\n\" + singleLineJson);\r\n\r\n\t\t\toutStream.println(singleLineJson);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tString response = inStream.readLine();\r\n\t\t\t\tappendLog(\"&lt;&lt;&lt; RESPONSE (RX):\\n\" + response + \"\\n\");\r\n\t\t\t} catch (IOException e) {\r\n\t\t\t\tappendLog(\"[FEHLER] I\/O-Fehler beim Empfang: \" + e.getMessage());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tprivate void appendLog(String message) {\r\n\t\t\tconsoleLog.append(message + \"\\n\");\r\n\t\t\tconsoleLog.setCaretPosition(consoleLog.getDocument().getLength());\r\n\t\t}\r\n\t}\r\n}<\/pre>\n<p>Nach dem start, erscheint das obige Programmfenster wo die Funktionen getestet werden k\u00f6nnen.<\/p>\n<p>Das einfache Werkzeug zur Textumwandlung kann sp\u00e4ter problemlos durch realistischere Funktionen ersetzt werden, beispielsweise durch:<\/p>\n<p>-das Auslesen eines Systemstatus,<br \/>\n-die Abfrage von Sensordaten,<br \/>\n-den Zugriff auf eine Datenbank,<br \/>\n-die Suche in Dokumenten,<br \/>\n-die Ausf\u00fchrung definierter Linux-Kommandos,<br \/>\n-oder den Zugriff auf eine eigene REST- beziehungsweise MQTT-Anwendung.<\/p>\n<p>Damit bildet die Demo eine gute Grundlage f\u00fcr weitere Experimente mit Java, MCP, JSON-RPC, virtuellen Threads und selbst entwickelten Serverwerkzeugen.<\/p>\n<p>Hier noch eine Visualisierung der Funktionsweise:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/generated-image.jpeg\" alt=\"\" width=\"2048\" height=\"1152\" class=\"aligncenter size-full wp-image-23320\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/generated-image.jpeg 2048w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/generated-image-300x169.jpeg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/generated-image-1024x576.jpeg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/generated-image-768x432.jpeg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/09\/generated-image-1536x864.jpeg 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Update der vorhandenen Version ging leider nicht. Deshalb war eine neu Installation von Eclipse n\u00f6tig. Was es so neues gibt, ist hier bei Heise beschrieben. Dann mal ein Java Programm f\u00fcr die Demo von MCP geschrieben, um die Client &#8211; Serververbindung per MCP zu testen. Die Anwendung verdeutlicht das zentrale Prinzip von MCP: Eine &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=23315\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eQuicktest Eclipse 2026-06 mit MCP Client Server Demo\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,4,5,6075,79],"tags":[1689,2178,6076,6336,473],"class_list":["post-23315","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-eclipse","category-java","category-ki","category-programmierung","tag-demo","tag-java","tag-ki","tag-mcp","tag-programm"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/23315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=23315"}],"version-history":[{"count":5,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/23315\/revisions"}],"predecessor-version":[{"id":23322,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/23315\/revisions\/23322"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=23315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=23315"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=23315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}