{"id":38317,"date":"2026-01-28T16:00:50","date_gmt":"2026-01-28T13:00:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/"},"modified":"2026-01-28T16:00:50","modified_gmt":"2026-01-28T13:00:50","slug":"llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/","title":{"rendered":"LLM&#8217;lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek"},"content":{"rendered":"<h2>LLM&#8217;lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek<\/h2>\n<p>LLM&#8217;lere (B\u00fcy\u00fck Dil Modelleri) BattleTech gibi karma\u015f\u0131k strateji oyunlar\u0131n\u0131 \u00f6\u011fretmek, yapay zeka alan\u0131nda heyecan verici bir meydan okumad\u0131r. Serinin ilk b\u00f6l\u00fcm\u00fcnde temel kavramlar\u0131 ve stratejileri ele alm\u0131\u015ft\u0131k. Bu ikinci b\u00f6l\u00fcmde ise, LLM tabanl\u0131 ajanlar\u0131m\u0131z\u0131n oyun i\u00e7inde birbirleriyle ve oyun motoruyla etkile\u015fim kurmas\u0131n\u0131 sa\u011flayacak kritik altyap\u0131y\u0131, yani bir \u00c7oklu Ajan \u0130leti\u015fim Protokol\u00fc (MCP) sunucusunu ve C# dilinde geli\u015ftirilmi\u015f ajanlar\u0131 detayl\u0131ca inceleyece\u011fiz. Bu mimari, ajanlar\u0131n koordineli bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 ve dinamik oyun ortam\u0131na adapte olmas\u0131n\u0131 sa\u011flayacak sa\u011flam bir temel sunmaktad\u0131r.<\/p>\n<h2>Neden Bir MCP Sunucusu ve \u00c7oklu Ajan Mimarisi?<\/h2>\n<p>BattleTech gibi dinamik ve kural tabanl\u0131 oyunlarda, yapay zeka ajanlar\u0131n\u0131n yaln\u0131zca kendi i\u00e7 mant\u0131klar\u0131yla de\u011fil, ayn\u0131 zamanda oyun motoru ve di\u011fer ajanlarla da etkile\u015fim kurmas\u0131 gerekir. Bu etkile\u015fimi y\u00f6netmek i\u00e7in merkezi bir ileti\u015fim altyap\u0131s\u0131 elzemdir.<\/p>\n<h3>Geleneksel Yakla\u015f\u0131mlar\u0131n S\u0131n\u0131rl\u0131l\u0131klar\u0131<\/h3>\n<p>Tekil, monolitik bir yapay zeka sistemi, oyunun karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a y\u00f6netilmesi zorla\u015f\u0131r. Oyun durumu de\u011fi\u015fikliklerini takip etmek, birden fazla ajan\u0131n kararlar\u0131n\u0131 koordine etmek ve farkl\u0131 stratejileri ayn\u0131 anda uygulamak, tek bir b\u00fcy\u00fck kod blo\u011fu i\u00e7inde verimli de\u011fildir. Ayr\u0131ca, LLM&#8217;lerin do\u011fas\u0131 gere\u011fi d\u0131\u015f sistemlerle ileti\u015fim kurma ihtiyac\u0131, geleneksel yakla\u015f\u0131mlar\u0131n yetersiz kalmas\u0131na neden olur.<\/p>\n<h3>Da\u011f\u0131t\u0131k Yap\u0131n\u0131n Avantajlar\u0131<\/h3>\n<p>\u00c7oklu ajan sistemleri, her bir ajan\u0131n belirli bir rol\u00fc \u00fcstlendi\u011fi ve merkezi bir sunucu \u00fczerinden ileti\u015fim kurdu\u011fu da\u011f\u0131t\u0131k bir yap\u0131 sunar. Bu mimari, mod\u00fclerlik, \u00f6l\u00e7eklenebilirlik ve hata tolerans\u0131 gibi \u00f6nemli avantajlar sa\u011flar. Her ajan, kendi LLM&#8217;i veya karar mekanizmas\u0131yla ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015fabilirken, sunucu t\u00fcm ajanlar aras\u0131ndaki ileti\u015fimi ve oyun durumu g\u00fcncellemelerini y\u00f6netir. Bu, \u00f6zellikle BattleTech gibi birden fazla &#8216;Mech&#8217;in ve pilotun oldu\u011fu senaryolarda kritik \u00f6neme sahiptir.<\/p>\n<h3>BattleTech Ba\u011flam\u0131nda \u0130htiya\u00e7lar<\/h3>\n<p>BattleTech&#8217;te her &#8216;Mech&#8217; bir ajan olarak d\u00fc\u015f\u00fcn\u00fclebilir. Bu ajanlar\u0131n konumlar\u0131n\u0131, hasar durumlar\u0131n\u0131, m\u00fchimmat seviyelerini ve hedeflerini s\u00fcrekli olarak di\u011fer ajanlarla ve oyun motoruyla payla\u015fmas\u0131 gerekir. Bir MCP sunucusu, bu bilgilerin g\u00fcvenli ve d\u00fczenli bir \u015fekilde ak\u0131\u015f\u0131n\u0131 sa\u011flayarak, LLM&#8217;lerin daha bilin\u00e7li ve koordineli kararlar almas\u0131na olanak tan\u0131r. \u00d6rne\u011fin, bir &#8216;Mech&#8217; d\u00fc\u015fman pozisyonunu tespit etti\u011finde, bu bilgiyi di\u011fer &#8216;Mech&#8217;lere ileterek ortak bir sald\u0131r\u0131 plan\u0131 olu\u015fturulabilir.<\/p>\n<h2>MCP Sunucu Tasar\u0131m\u0131 ve Protokol Detaylar\u0131<\/h2>\n<p>Etkili bir \u00e7oklu ajan sistemi i\u00e7in sa\u011flam bir ileti\u015fim protokol\u00fc ve sunucu tasar\u0131m\u0131 \u015fartt\u0131r. Bu b\u00f6l\u00fcm, sunucunun temel bile\u015fenlerini ve ajanlar aras\u0131 ileti\u015fimi tan\u0131mlayan protokol\u00fc ele almaktad\u0131r.<\/p>\n<h3>\u0130leti\u015fim Protokol\u00fcn\u00fcn Tan\u0131mlanmas\u0131<\/h3>\n<p>MCP, ajanlar\u0131n sunucuya ve birbirlerine nas\u0131l mesaj g\u00f6nderece\u011fini ve alaca\u011f\u0131n\u0131 belirleyen bir dizi kurald\u0131r. Temel olarak, bu protokol \u015funlar\u0131 i\u00e7ermelidir:<\/p>\n<ul>\n<li><strong>Mesaj Tipleri:<\/strong> Oyun durumu g\u00fcncellemesi, komut g\u00f6nderimi, sorgulama, hata bildirimi.<\/li>\n<li><strong>Mesaj Format\u0131:<\/strong> Verilerin nas\u0131l yap\u0131land\u0131r\u0131laca\u011f\u0131 (\u00f6rne\u011fin JSON).<\/li>\n<li><strong>Kimlik Do\u011frulama:<\/strong> Ajanlar\u0131n sunucuya g\u00fcvenli bir \u015fekilde ba\u011flanmas\u0131.<\/li>\n<li><strong>Oturum Y\u00f6netimi:<\/strong> Ajanlar\u0131n ba\u011flant\u0131lar\u0131n\u0131 takip etme.<\/li>\n<\/ul>\n<h3>Mesaj Formatlar\u0131 ve Veri Serile\u015ftirme<\/h3>\n<p>Veri serile\u015ftirme, ajanlar ve sunucu aras\u0131nda de\u011fi\u015f toku\u015f edilecek karma\u015f\u0131k oyun durumu nesnelerinin veya komutlar\u0131n metin tabanl\u0131 bir formata d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesidir. JSON (JavaScript Object Notation), okunabilirli\u011fi ve esnekli\u011fi nedeniyle bu t\u00fcr sistemler i\u00e7in ideal bir se\u00e7imdir. \u00d6rne\u011fin, bir oyun durumu g\u00fcncellemesi \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-json\">{\n  \"MessageType\": \"GameStateUpdate\",\n  \"Timestamp\": \"2023-10-27T10:00:00Z\",\n  \"Payload\": {\n    \"MechId\": \"Alpha\",\n    \"Position\": { \"X\": 10, \"Y\": 5 },\n    \"Health\": 85,\n    \"Target\": \"Bravo\",\n    \"ActionsAvailable\": [\"Move\", \"Fire\", \"Brace\"]\n  }\n}<\/pre>\n<p><\/code><\/p>\n<p>Bu format, hem insanlar hem de programlar taraf\u0131ndan kolayca ayr\u0131\u015ft\u0131r\u0131labilir ve i\u015flenebilir.<\/p>\n<h3>Sunucu Rolleri ve Sorumluluklar\u0131<\/h3>\n<p>MCP sunucusu, sistemin kalbidir ve a\u015fa\u011f\u0131daki temel sorumluluklara sahiptir:<\/p>\n<ul>\n<li><strong>Ba\u011flant\u0131 Y\u00f6netimi:<\/strong> Yeni ajan ba\u011flant\u0131lar\u0131n\u0131 kabul etme ve mevcut ba\u011flant\u0131lar\u0131 s\u00fcrd\u00fcrme.<\/li>\n<li><strong>Mesaj Y\u00f6nlendirme:<\/strong> Bir ajandan gelen mesajlar\u0131 ilgili di\u011fer ajanlara veya oyun motoruna iletme.<\/li>\n<li><strong>Oyun Durumu Senkronizasyonu:<\/strong> Oyunun mevcut durumunu takip etme ve ajanlara d\u00fczenli g\u00fcncellemeler g\u00f6nderme.<\/li>\n<li><strong>Komut \u0130\u015fleme:<\/strong> Ajanlardan gelen komutlar\u0131 do\u011frulama ve oyun motoruna iletme.<\/li>\n<li><strong>Hata Y\u00f6netimi:<\/strong> Ba\u011flant\u0131 kopmalar\u0131 veya ge\u00e7ersiz mesajlar gibi durumlar\u0131 ele alma.<\/li>\n<\/ul>\n<h2>C# ile MCP Sunucusu Ger\u00e7ekle\u015ftirimi<\/h2>\n<p>C#, .NET ekosisteminin sa\u011flad\u0131\u011f\u0131 g\u00fc\u00e7l\u00fc a\u011f ve asenkron programlama yetenekleri sayesinde bir MCP sunucusu geli\u015ftirmek i\u00e7in m\u00fckemmel bir se\u00e7imdir.<\/p>\n<h3>Temel Sunucu Yap\u0131s\u0131: Soket Programlama<\/h3>\n<p>Bir TCP\/IP tabanl\u0131 sunucu olu\u015fturmak i\u00e7in C#'\u0131n <code>System.Net.Sockets<\/code> namespace'i kullan\u0131l\u0131r. <code>TcpListener<\/code> s\u0131n\u0131f\u0131, gelen ba\u011flant\u0131lar\u0131 dinlemek i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-csharp\">using System.Net;\nusing System.Net.Sockets;\nusing System.Text;\n\npublic class McpServer\n{\n    private TcpListener _listener;\n    private List<TcpClient> _connectedClients = new List<TcpClient>();\n\n    public McpServer(int port)\n    {\n        _listener = new TcpListener(IPAddress.Any, port);\n    }\n\n    public async Task StartAsync()\n    {\n        _listener.Start();\n        Console.WriteLine(\"MCP Sunucusu dinlemede...\");\n\n        while (true)\n        {\n            TcpClient client = await _listener.AcceptTcpClientAsync();\n            _connectedClients.Add(client);\n            Console.WriteLine($\"Yeni ajan ba\u011fland\u0131: {client.Client.RemoteEndPoint}\");\n            _ = HandleClientAsync(client); \/\/ Ba\u011flant\u0131y\u0131 asenkron olarak i\u015fle\n        }\n    }\n\n    private async Task HandleClientAsync(TcpClient client)\n    {\n        NetworkStream stream = client.GetStream();\n        byte[] buffer = new byte[1024];\n        int bytesRead;\n\n        try\n        {\n            while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)\n            {\n                string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);\n                Console.WriteLine($\"Ajan mesaj\u0131: {message}\");\n                \/\/ Mesaj\u0131 i\u015fle ve di\u011fer ajanlara y\u00f6nlendir\n                await BroadcastMessageAsync(message, client);\n            }\n        }\n        catch (Exception ex)\n        {\n            Console.WriteLine($\"Ajan ba\u011flant\u0131s\u0131 kesildi veya hata olu\u015ftu: {ex.Message}\");\n        }\n        finally\n        {\n            _connectedClients.Remove(client);\n            client.Close();\n        }\n    }\n\n    private async Task BroadcastMessageAsync(string message, TcpClient sender)\n    {\n        byte[] data = Encoding.UTF8.GetBytes(message);\n        foreach (var client in _connectedClients.ToList()) \/\/ ToList() ile koleksiyon kopyas\u0131 \u00fczerinde d\u00f6ng\u00fc\n        {\n            if (client != sender && client.Connected) \/\/ G\u00f6nderen hari\u00e7 di\u011fer ba\u011fl\u0131 ajanlara g\u00f6nder\n            {\n                try\n                {\n                    await client.GetStream().WriteAsync(data, 0, data.Length);\n                }\n                catch (Exception ex)\n                {\n                    Console.WriteLine($\"Mesaj g\u00f6nderme hatas\u0131: {ex.Message}\");\n                }\n            }\n        }\n    }\n}<\/pre>\n<p><\/code><\/p>\n<h3>Asenkron \u0130stemci Y\u00f6netimi<\/h3>\n<p><code>async<\/code> ve <code>await<\/code> anahtar kelimeleri, sunucunun birden fazla istemci ba\u011flant\u0131s\u0131n\u0131 ayn\u0131 anda, bloklamadan i\u015flemesini sa\u011flar. Her yeni ba\u011flant\u0131 i\u00e7in ayr\u0131 bir <code>HandleClientAsync<\/code> g\u00f6revi ba\u015flat\u0131l\u0131r, bu da sunucunun responsif kalmas\u0131n\u0131 garanti eder.<\/p>\n<h3>Mesaj \u0130\u015fleme ve Y\u00f6nlendirme Mant\u0131\u011f\u0131<\/h3>\n<p>Gelen mesajlar <code>BroadcastMessageAsync<\/code> metodu arac\u0131l\u0131\u011f\u0131yla di\u011fer ba\u011fl\u0131 ajanlara iletilir. Ger\u00e7ek bir senaryoda, bu mesajlar daha karma\u015f\u0131k bir \u015fekilde ayr\u0131\u015ft\u0131r\u0131lacak (\u00f6rne\u011fin JSON deserializasyonu) ve belirli hedeflere (\u00f6rne\u011fin, sadece ayn\u0131 tak\u0131m\u0131n ajanlar\u0131na) veya oyun motoruna y\u00f6nlendirilecektir. Bu a\u015famada, oyun kurallar\u0131na uygunluk kontrol\u00fc ve komutlar\u0131n do\u011frulanmas\u0131 da yap\u0131labilir.<\/p>\n<h3>G\u00fcvenilirlik ve Hata Y\u00f6netimi<\/h3>\n<p>A\u011f ileti\u015fimi do\u011fas\u0131 gere\u011fi hatalara a\u00e7\u0131kt\u0131r. <code>try-catch<\/code> bloklar\u0131, ba\u011flant\u0131 kopmalar\u0131, veri bozulmalar\u0131 veya ge\u00e7ersiz mesajlar gibi durumlar\u0131 ele almak i\u00e7in kritik \u00f6neme sahiptir. Sunucu, bir ajan\u0131n ba\u011flant\u0131s\u0131 koptu\u011funda bunu alg\u0131lamal\u0131 ve <code>_connectedClients<\/code> listesinden \u00e7\u0131karmal\u0131d\u0131r.<\/p>\n<h2>BattleTech Ajanlar\u0131n\u0131n Geli\u015ftirilmesi<\/h2>\n<p>MCP sunucusuna ba\u011flanacak BattleTech ajanlar\u0131 da C# ile geli\u015ftirilebilir. Her ajan, bir 'Mech'i veya pilotu temsil eder ve kendi karar alma mant\u0131\u011f\u0131na sahiptir.<\/p>\n<h3>Ajan Mimarisi ve Durum Y\u00f6netimi<\/h3>\n<p>Her ajan, kendi i\u00e7 durumunu (\u00f6rne\u011fin, 'Mech'in mevcut sa\u011fl\u0131\u011f\u0131, m\u00fchimmat\u0131, pozisyonu) y\u00f6netir ve sunucudan gelen g\u00fcncellemelerle bu durumu senkronize eder. Bir ajan s\u0131n\u0131f\u0131, sunucuya ba\u011flanma, mesaj g\u00f6nderme\/alma ve LLM'e girdi haz\u0131rlama gibi i\u015flevleri i\u00e7ermelidir.<\/p>\n<pre><code class=\"language-csharp\">using System.Net.Sockets;\nusing System.Text;\nusing System.Text.Json; \/\/ JSON serile\u015ftirme i\u00e7in\n\npublic class BattleTechAgent\n{\n    private TcpClient _client;\n    private NetworkStream _stream;\n    public string AgentId { get; private set; }\n    private BattleTechGameState _currentGameState; \/\/ Ajan\u0131n i\u00e7 oyun durumu\n\n    public BattleTechAgent(string agentId, string serverIp, int serverPort)\n    {\n        AgentId = agentId;\n        _client = new TcpClient();\n        _client.Connect(serverIp, serverPort);\n        _stream = _client.GetStream();\n        Console.WriteLine($\"{AgentId} sunucuya ba\u011fland\u0131.\");\n        _ = ListenForMessagesAsync();\n    }\n\n    private async Task ListenForMessagesAsync()\n    {\n        byte[] buffer = new byte[1024];\n        int bytesRead;\n\n        try\n        {\n            while ((bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length)) != 0)\n            {\n                string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);\n                Console.WriteLine($\"{AgentId} mesaj ald\u0131: {message}\");\n                ProcessServerMessage(message);\n            }\n        }\n        catch (Exception ex)\n        {\n            Console.WriteLine($\"{AgentId} ba\u011flant\u0131s\u0131 kesildi veya hata: {ex.Message}\");\n        }\n        finally\n        {\n            _client.Close();\n        }\n    }\n\n    private void ProcessServerMessage(string message)\n    {\n        \/\/ Gelen mesaj\u0131 JSON olarak ayr\u0131\u015ft\u0131r ve oyun durumunu g\u00fcncelle\n        \/\/ \u00d6rne\u011fin: _currentGameState = JsonSerializer.Deserialize<BattleTechGameState>(message);\n        \/\/ Ard\u0131ndan LLM'e g\u00f6nderilecek girdiyi haz\u0131rla\n        Console.WriteLine($\"Ajan {AgentId} oyun durumunu g\u00fcncelledi.\");\n        MakeDecisionAndSendAction();\n    }\n\n    public async Task SendMessageAsync(string message)\n    {\n        byte[] data = Encoding.UTF8.GetBytes(message);\n        await _stream.WriteAsync(data, 0, data.Length);\n    }\n\n    private async void MakeDecisionAndSendAction()\n    {\n        \/\/ Burada LLM'e oyun durumunu g\u00f6nderme ve yan\u0131t\u0131n\u0131 alma mant\u0131\u011f\u0131 olacak\n        string llmInput = $\"Mevcut oyun durumu: {_currentGameState?.ToString()}. Ne yapmal\u0131y\u0131m?\";\n        \/\/ LLM'den yan\u0131t\u0131 al (\u00f6rne\u011fin, \"Move to X,Y\" veya \"Fire at Target\")\n        string llmOutput = await CallLlmApiAsync(llmInput); \/\/ Varsay\u0131msal LLM API \u00e7a\u011fr\u0131s\u0131\n\n        \/\/ LLM \u00e7\u0131kt\u0131s\u0131n\u0131 BattleTech komutuna d\u00f6n\u00fc\u015ft\u00fcr\n        string actionCommand = ParseLlmOutputToAction(llmOutput);\n\n        \/\/ Komutu sunucuya g\u00f6nder\n        await SendMessageAsync(actionCommand);\n    }\n\n    private Task<string> CallLlmApiAsync(string input)\n    {\n        \/\/ Ger\u00e7ek bir LLM API \u00e7a\u011fr\u0131s\u0131 burada yap\u0131l\u0131r (\u00f6rne\u011fin OpenAI API)\n        return Task.FromResult(\"{\\\"action\\\": \\\"Move\\\", \\\"target\\\": {\\\"X\\\": 12, \\\"Y\\\": 7}}\"); \/\/ \u00d6rnek \u00e7\u0131kt\u0131\n    }\n\n    private string ParseLlmOutputToAction(string llmOutput)\n    {\n        \/\/ LLM \u00e7\u0131kt\u0131s\u0131n\u0131 ayr\u0131\u015ft\u0131r\u0131p sunucuya g\u00f6nderilecek BattleTech komutuna d\u00f6n\u00fc\u015ft\u00fcr\n        \/\/ \u00d6rne\u011fin, JSON parse edip uygun bir komut nesnesi olu\u015fturma\n        return llmOutput; \/\/ Basit\u00e7e LLM \u00e7\u0131kt\u0131s\u0131n\u0131 geri d\u00f6nd\u00fcr\u00fcyoruz\n    }\n}\n\n\/\/ \u00d6rnek oyun durumu s\u0131n\u0131f\u0131 (ger\u00e7ek uygulamada \u00e7ok daha detayl\u0131 olacakt\u0131r)\npublic class BattleTechGameState\n{\n    public string MechId { get; set; }\n    public Position Position { get; set; }\n    public int Health { get; set; }\n    public string Target { get; set; }\n    public List<string> ActionsAvailable { get; set; }\n\n    public override string ToString()\n    {\n        return JsonSerializer.Serialize(this);\n    }\n}\n\npublic class Position { public int X { get; set; } public int Y { get; set; } }\n<\/pre>\n<p><\/code><\/p>\n<h3>Sunucu ile \u0130leti\u015fim Kurulumu<\/h3>\n<p>Ajanlar, <code>TcpClient<\/code> kullanarak MCP sunucusuna ba\u011flan\u0131r. Ba\u011flant\u0131 kurulduktan sonra, <code>NetworkStream<\/code> \u00fczerinden asenkron olarak mesaj g\u00f6nderip al\u0131rlar. Her ajan, kendi <code>ListenForMessagesAsync<\/code> g\u00f6revini ba\u015flatarak sunucudan gelen g\u00fcncellemeleri s\u00fcrekli dinler.<\/p>\n<h3>Oyun Durumu Parselleme ve Karar Alma \u00d6ncesi \u0130\u015flemler<\/h3>\n<p>Sunucudan gelen mesajlar, ajan\u0131n i\u00e7 oyun durumunu g\u00fcncellemek i\u00e7in ayr\u0131\u015ft\u0131r\u0131l\u0131r. Bu, genellikle JSON deserializasyonu ile yap\u0131l\u0131r. G\u00fcncellenen oyun durumu, LLM'e g\u00f6nderilmeden \u00f6nce belirli bir formata d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. Bu format, LLM'in oyunun mevcut durumunu ve olas\u0131 eylemleri anlamas\u0131na yard\u0131mc\u0131 olacak \u015fekilde tasarlanmal\u0131d\u0131r.<\/p>\n<h2>LLM Entegrasyonu ve Karar Alma Mekanizmalar\u0131<\/h2>\n<p>Bu sistemin kalbinde, LLM'lerin BattleTech'in karma\u015f\u0131k kurallar\u0131 ve stratejileri dahilinde karar alma yetene\u011fi yatar.<\/p>\n<h3>LLM'e Giri\u015f Olarak Oyun Durumu<\/h3>\n<p>LLM'ler metin tabanl\u0131 girdilerle \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, oyunun mevcut durumu (harita bilgisi, 'Mech'lerin konumu, hasar durumlar\u0131, hedefler vb.) do\u011fal dil veya yap\u0131land\u0131r\u0131lm\u0131\u015f metin (\u00f6rne\u011fin, JSON i\u00e7inde a\u00e7\u0131klay\u0131c\u0131 metin) olarak LLM'e sunulmal\u0131d\u0131r. \u0130yi tasarlanm\u0131\u015f bir prompt (istem), LLM'in durumu do\u011fru bir \u015fekilde yorumlamas\u0131 ve ba\u011flam\u0131 anlamas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>\u00d6rnek Prompt Yap\u0131s\u0131:<\/p>\n<pre><code class=\"language-plaintext\">Oyun Durumu:\n- Kendi Mech'im (Alpha): Konum (10,5), Sa\u011fl\u0131k %85, M\u00fchimmat: LRM-10 (10\/10), Medium Laser (S\u0131n\u0131rs\u0131z).\n- D\u00fc\u015fman Mech'i (Bravo): Konum (12,7), Sa\u011fl\u0131k %60, G\u00f6r\u00fcld\u00fc.\n- Arazi: Benim Mech'im bir tepenin arkas\u0131nda k\u0131smi siperde.\n- Hedef: Bravo'yu yok et.\n- Mevcut Tur: 3.\n- Kullan\u0131labilir Eylemler: [Hareket Et, Ate\u015f Et, Siper Al]\n\nMevcut duruma g\u00f6re en iyi stratejik hamle nedir? Yan\u0131t\u0131n\u0131 JSON format\u0131nda ver: {\"action\": \"EylemTipi\", \"target\": \"HedefBilgisi\", \"details\": \"EkA\u00e7\u0131klama\"}.<\/pre>\n<p><\/code><\/p>\n<h3>LLM \u00c7\u0131kt\u0131s\u0131n\u0131n Yorumlanmas\u0131 ve Eyleme D\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi<\/h3>\n<p>LLM'den gelen yan\u0131t da metin tabanl\u0131 olacakt\u0131r. Bu yan\u0131t\u0131n, oyun motorunun anlayabilece\u011fi belirli bir BattleTech komutuna d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi gerekir. JSON format\u0131nda bir \u00e7\u0131kt\u0131 istemek, bu ayr\u0131\u015ft\u0131rma s\u00fcrecini kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, LLM \"Move to (12,7) and fire LRM-10 at Bravo\" \u015feklinde bir yan\u0131t verebilir. Bu, ajan\u0131n kodunda parse edilerek uygun sunucu mesajlar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr.<\/p>\n<h3>Stratejik D\u00fc\u015f\u00fcnme ve Taktiksel Uygulama<\/h3>\n<p>LLM'ler, geni\u015f veri setleri \u00fczerinde e\u011fitildikleri i\u00e7in karma\u015f\u0131k stratejileri ve taktikleri \"\u00f6\u011frenme\" potansiyeline sahiptir. Prompt m\u00fchendisli\u011fi ile, LLM'e sadece anl\u0131k bir karar de\u011fil, ayn\u0131 zamanda uzun vadeli bir stratejinin par\u00e7as\u0131 olan taktiksel bir hamle yapmas\u0131 talimat\u0131 verilebilir. \u00d6rne\u011fin, \"D\u00fc\u015fman\u0131n zay\u0131f taraf\u0131na ge\u00e7mek i\u00e7in hareket et\" gibi bir talimat, LLM'in birden fazla turu kapsayan bir plan yapmas\u0131na olanak tan\u0131r.<\/p>\n<h2>Sunucu ve Ajanlar\u0131n Test Edilmesi ve Optimizasyonu<\/h2>\n<p>Herhangi bir yaz\u0131l\u0131m sistemi gibi, MCP sunucusu ve ajanlar\u0131 da g\u00fcvenilirlik ve performans sa\u011flamak i\u00e7in kapsaml\u0131 test ve optimizasyona ihtiya\u00e7 duyar.<\/p>\n<h3>Birim ve Entegrasyon Testleri<\/h3>\n<p>Birim testleri, sunucunun ve ajanlar\u0131n her bir bile\u015feninin (\u00f6rne\u011fin, mesaj serile\u015ftirme\/deserile\u015ftirme, ba\u011flant\u0131 y\u00f6netimi) beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in yaz\u0131lmal\u0131d\u0131r. Entegrasyon testleri ise, sunucu ve ajanlar\u0131n bir araya geldi\u011finde do\u011fru bir \u015fekilde ileti\u015fim kurdu\u011funu ve oyun mant\u0131\u011f\u0131n\u0131 i\u015fledi\u011fini do\u011frular. Sanal ajanlar veya sim\u00fclat\u00f6rler kullan\u0131larak \u00e7oklu ajan senaryolar\u0131 test edilebilir.<\/p>\n<h3>Performans ve \u00d6l\u00e7eklenebilirlik<\/h3>\n<p>BattleTech gibi ger\u00e7ek zamanl\u0131ya yak\u0131n oyunlarda, ileti\u015fim gecikmesi kritik olabilir. Sunucunun ve ajanlar\u0131n mesajlar\u0131 ne kadar h\u0131zl\u0131 i\u015fledi\u011fi, oyun deneyimini do\u011frudan etkiler. Performans testleri, sunucunun belirli bir ajan say\u0131s\u0131yla ve mesaj y\u00fck\u00fcyle ba\u015fa \u00e7\u0131k\u0131p \u00e7\u0131kamad\u0131\u011f\u0131n\u0131 \u00f6l\u00e7melidir. Asenkron programlama ve verimli veri yap\u0131lar\u0131 kullanmak, \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r.<\/p>\n<h3>Hata Ay\u0131klama ve Geli\u015ftirme \u0130pu\u00e7lar\u0131<\/h3>\n<p>Da\u011f\u0131t\u0131k sistemlerde hata ay\u0131klama zorlay\u0131c\u0131 olabilir. Kapsaml\u0131 loglama, ajanlar ve sunucu aras\u0131ndaki mesaj ak\u0131\u015f\u0131n\u0131 izlemek i\u00e7in hayati \u00f6neme sahiptir. \u00d6zel hata ay\u0131klama ara\u00e7lar\u0131 veya g\u00f6rselle\u015ftiriciler, ajanlar\u0131n durumunu ve etkile\u015fimlerini anlamak i\u00e7in kullan\u0131labilir. Ayr\u0131ca, LLM'den gelen yan\u0131tlar\u0131 analiz etmek ve prompt'lar\u0131 s\u00fcrekli olarak iyile\u015ftirmek, ajanlar\u0131n karar alma kalitesini art\u0131racakt\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, LLM'lere BattleTech gibi karma\u015f\u0131k strateji oyunlar\u0131n\u0131 \u00f6\u011fretme serimizin ikinci b\u00f6l\u00fcm\u00fcnde, C# ile bir \u00c7oklu Ajan \u0130leti\u015fim Protokol\u00fc (MCP) sunucusu ve ajanlar\u0131 nas\u0131l in\u015fa edece\u011fimizi detayl\u0131 bir \u015fekilde ele ald\u0131k. Geli\u015ftirdi\u011fimiz bu da\u011f\u0131t\u0131k mimari, LLM tabanl\u0131 ajanlar\u0131n oyun ortam\u0131yla etkile\u015fim kurmas\u0131n\u0131, stratejik kararlar almas\u0131n\u0131 ve BattleTech'in dinamik d\u00fcnyas\u0131nda ba\u015far\u0131l\u0131 olmas\u0131n\u0131 sa\u011flayacak temel altyap\u0131y\u0131 sunmaktad\u0131r. Bu sa\u011flam temel \u00fczerine in\u015fa edece\u011fimiz gelecek \u00e7al\u0131\u015fmalar, yapay zeka ve oyun entegrasyonu alan\u0131nda yeni ufuklar a\u00e7maya devam edecektir. Bir sonraki b\u00f6l\u00fcmde, bu ajanlar\u0131 BattleTech oyun motoruyla nas\u0131l entegre edece\u011fimizi ve LLM'lerin oyun i\u00e7i performans\u0131 optimize etmek i\u00e7in nas\u0131l e\u011fitilece\u011fini inceleyece\u011fiz.<\/p>\n<h2>SSS (S\u0131k Sorulan Sorular)<\/h2>\n<h3>S1: Neden C# tercih edildi?<\/h3>\n<p>C#, .NET ekosisteminin sa\u011flad\u0131\u011f\u0131 g\u00fc\u00e7l\u00fc a\u011f programlama yetenekleri (TcpListener, TcpClient), asenkron programlama deste\u011fi (async\/await) ve genel performans avantajlar\u0131 nedeniyle bu t\u00fcr da\u011f\u0131t\u0131k sistemler i\u00e7in m\u00fckemmel bir se\u00e7imdir. Ayr\u0131ca, geni\u015f k\u00fct\u00fcphane deste\u011fi ve geli\u015ftirici dostu yap\u0131s\u0131, h\u0131zl\u0131 prototipleme ve sa\u011flam uygulamalar geli\u015ftirmeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>S2: MCP sunucusu ne t\u00fcr mesajlar\u0131 i\u015fler?<\/h3>\n<p>MCP sunucusu genellikle oyun durumu g\u00fcncellemeleri (\u00f6rne\u011fin, 'Mech' pozisyonlar\u0131, hasar raporlar\u0131), ajanlardan gelen komutlar (\u00f6rne\u011fin, \"hareket et\", \"ate\u015f et\"), sorgulamalar (\u00f6rne\u011fin, \"hedefteki d\u00fc\u015fman bilgisi\") ve sistem mesajlar\u0131 (\u00f6rne\u011fin, \"ajan ba\u011fland\u0131\", \"hata\") gibi \u00e7e\u015fitli mesaj tiplerini i\u015fler. Bu mesajlar genellikle JSON gibi yap\u0131land\u0131r\u0131lm\u0131\u015f bir formatta g\u00f6nderilir.<\/p>\n<h3>S3: LLM'ler oyun durumunu nas\u0131l anlar?<\/h3>\n<p>LLM'ler, oyun durumunu metin tabanl\u0131 girdiler (prompt'lar) arac\u0131l\u0131\u011f\u0131yla anlar. Bu prompt'lar, oyunun mevcut durumunu, ajanlar\u0131n konumlar\u0131n\u0131, d\u00fc\u015fman bilgilerini, arazi \u00f6zelliklerini ve mevcut hedefleri do\u011fal dil veya yap\u0131land\u0131r\u0131lm\u0131\u015f metin format\u0131nda a\u00e7\u0131klar. \u0130yi tasarlanm\u0131\u015f prompt'lar, LLM'in ba\u011flam\u0131 do\u011fru bir \u015fekilde kavramas\u0131n\u0131 ve stratejik kararlar almas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>S4: Bu sistem ba\u015fka oyunlara uyarlanabilir mi?<\/h3>\n<p>Evet, bu \u00e7oklu ajan ve MCP sunucu mimarisi, prensipte BattleTech d\u0131\u015f\u0131ndaki di\u011fer strateji veya sim\u00fclasyon oyunlar\u0131na da uyarlanabilir. Temel ileti\u015fim protokol\u00fc ve ajan yap\u0131s\u0131 benzer kal\u0131rken, oyun motoruyla entegrasyon katman\u0131 ve LLM'e g\u00f6nderilen prompt'lar\u0131n i\u00e7eri\u011fi oyunun kurallar\u0131na ve dinamiklerine g\u00f6re \u00f6zelle\u015ftirilmesi gerekir.<\/p>\n<h3>S5: Performans sorunlar\u0131 nas\u0131l ele al\u0131n\u0131r?<\/h3>\n<p>Performans sorunlar\u0131n\u0131 ele almak i\u00e7in birka\u00e7 strateji kullan\u0131labilir: asenkron programlama (<code>async\/await<\/code>) kullanarak sunucunun bloklanmadan birden fazla istemciyi i\u015flemesini sa\u011flamak, verimli veri serile\u015ftirme\/deserile\u015ftirme y\u00f6ntemleri kullanmak (\u00f6rne\u011fin, <code>System.Text.Json<\/code>), a\u011f trafi\u011fini optimize etmek i\u00e7in mesaj boyutlar\u0131n\u0131 minimize etmek ve sunucuyu daha g\u00fc\u00e7l\u00fc donan\u0131m \u00fczerinde \u00e7al\u0131\u015ft\u0131rmak. Ayr\u0131ca, LLM \u00e7a\u011fr\u0131lar\u0131n\u0131n gecikmesini azaltmak i\u00e7in \u00f6nbellekleme veya yerel, daha k\u00fc\u00e7\u00fck modeller kullanma gibi stratejiler de d\u00fc\u015f\u00fcn\u00fclebilir.<\/p>\n","protected":false},"excerpt":{"rendered":"LLM&#8217;lere (B\u00fcy\u00fck Dil Modelleri) BattleTech gibi karma\u015f\u0131k strateji oyunlar\u0131n\u0131 \u00f6\u011fretmek, yapay zeka alan\u0131nda heyecan verici bir meydan okumad\u0131r. Serin&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[228],"tags":[],"class_list":{"0":"post-38317","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-c","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>LLM&#039;lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LLM&#039;lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek\" \/>\n<meta property=\"og:description\" content=\"LLM&#039;lere (B\u00fcy\u00fck Dil Modelleri) BattleTech gibi karma\u015f\u0131k strateji oyunlar\u0131n\u0131 \u00f6\u011fretmek, yapay zeka alan\u0131nda heyecan verici bir meydan okumad\u0131r. Serin...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-28T13:00:50+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"LLM&#8217;lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek\",\"datePublished\":\"2026-01-28T13:00:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/\"},\"wordCount\":2217,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"C#\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/\",\"name\":\"LLM'lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-28T13:00:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LLM&#8217;lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"LLM'lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/","og_locale":"tr_TR","og_type":"article","og_title":"LLM'lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek","og_description":"LLM'lere (B\u00fcy\u00fck Dil Modelleri) BattleTech gibi karma\u015f\u0131k strateji oyunlar\u0131n\u0131 \u00f6\u011fretmek, yapay zeka alan\u0131nda heyecan verici bir meydan okumad\u0131r. Serin...","og_url":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-28T13:00:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"LLM&#8217;lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek","datePublished":"2026-01-28T13:00:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/"},"wordCount":2217,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["C#"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/","url":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/","name":"LLM'lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-28T13:00:50+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/llmlere-battletech-oynamayi-ogretmek-bolum-2-c-ile-bir-mcp-sunucusu-ve-ajanlar-insa-etmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"LLM&#8217;lere BattleTech Oynamay\u0131 \u00d6\u011fretmek (B\u00f6l\u00fcm 2): C# ile Bir MCP Sunucusu ve Ajanlar \u0130n\u015fa Etmek"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=38317"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38317\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}