Merhaba,
Bu içeriğimizde, bu güne kadar yaptığımız yapay zekâ çalışmalarını pratiğe dökecek ve bir görev yönetimi sürecinde bizlere eşlik edecek ve belli başlı sorumlulukları üstlenecek AI Agent’ını baştan sona geliştiriyor olacağız. Tabi bu geliştirme sürecinde başlıktan da anlayacağınız üzere geliştireceğimiz uygulamanın AI modeli ile entegrasyonunu Semantic Kernel ile gerçekleştirecek ve bir yandan da sürece görev yönetimine dair yetenekleri dahil edebilmek için de MCP‘den istifade edeceğiz. Buyurun, bu heyecan verici çalışmaya hiç vakit kaybetmeksizin başlayalım…
İlk olarak geliştireceğimiz uygulamaya MCP ile görev yönetimi yeteneklerini aktarabilmek için aracı olarak kullanacağımız mcpverse.dev platformunu sizlere tanıtarak başlangıç yapmak istiyorum.
mcpverse.dev Platformu Nedir? Ne Amaca Hizmet Etmektedir?
mcpverse.dev, geliştiriciler tarafından yapay zekâ sistemlerinde MCP ile uyumlu server’lara hızlı ve zahmetsizce erişim sağlayan bir platformdur. Bu platform; hali hazırda PostgreSQL, MySQL, MongoDB, GitHub, Todoist, HubSpot vs. gibi popüler servislerin MCP Server’larını barındırmakta ve bunlara herhangi bir yerel kurulum, yapılandırma yahut sunucu yönetimi gerekmeksizin oldukça kolay entegrasyon kurma olanağı tanımaktadır. Böylece geliştiricilerin yapacakları çalışmalara istinaden MCP Server oluşturma maliyetinden süreci törpüleyerek, fikirlerini hızlıca test edebilecekleri bir altyapı sunmaktadır.
Bizler bu çalışmamızda mcpverse.dev platformu üzerinden Todoist servisinden istifade edecek ve tüm görev yönetimiyle ilgili yetenekleri bu MCP Server’dan edineceğiz.
AI Agent’ın Geliştirilmesi
AI Agent’ı geliştirebilmek için öncelikle Microsoft.SemanticKernel kütüphanesini yüklemeli ve aşağıdaki temel yapılandırmayı gerçekleştirmeliyiz.
Logger.ConsoleLog("AI Agent başlatılıyor...", ConsoleColor.Green);
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: "qwen/qwen3-32b",
openAIClient: new OpenAIClient(
credential: new ApiKeyCredential("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"),
options: new OpenAIClientOptions
{
Endpoint = new Uri("https://openrouter.ai/api/v1")
}
)
);
var kernel = builder.Build();
Burada görüldüğü üzere AI modeli olarak OpenRouter üzerinden Qwen: Qwen3 32B modeli uygulamaya entegre edilmektedir.
Bu entegrasyondan sonra oluşturulacak AI Agent’a aşağıdaki gibi system prompt’u girelim ve genel anlamda nasıl bir davranışa sahip olacağının sınırlarını belirleyelim;
#region Agent'a davranışını tanımlayan bir sistem prompt'u veriliyor.
var agentSystemPrompt = @"
Sen bir yapay zeka asistanısın.
Kullanıcı görev yönetimiyle ilgili sorular soracak ve senden yardım bekleyecektir.
Bu soruları en iyi şekilde cevapla ve yardımcı ol.
Verileri analiz edebilir, aralarında mantıksal ilişki kurabilirsin.
İhtiyaç gördüğün taktirde farklı görevleri yerine getirebilirsin.
İşte kullanıcının girdisi: {{$input}}
Geçmiş konuşmalar: {{$history}}
Yanıtı açık ve yardımcı bir şekilde aşağıda ver:
";
var systemFunction = kernel.CreateFunctionFromPrompt(
promptTemplate: agentSystemPrompt,
executionSettings: new PromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
});
#endregion
Tabi burada dikkat ederseniz, system prompt’unu CreateFunctionFromPrompt fonksiyonu ile Semantic Kernel’a dahil ediyor ve bir function haline getiriyoruz. Bu function’a verilen executionSettings parametresinden de anlaşılacağı üzere, kullanıcıdan gelecek olan prompt’un mahiyetine göre AI modeli tarafından hangi yeteneklerin tetikleneceği otomatik olarak belirlenecektir.
Artık bu altyapıdan sonra aşağıdaki gibi oluşturacağımız AI Agent’ın davranışını şekillendirebiliriz;
#region Agent çalıştırılıyor.
var chatHistory = new ChatHistory();
Logger.ConsoleLog("AI Agent hazır! Sorunuzu yazın :", ConsoleColor.Cyan);
while (true)
{
Logger.ConsoleLog("> ", ConsoleColor.Cyan, false);
var userInput = Console.ReadLine();
chatHistory.AddUserMessage(userInput);
if (string.IsNullOrEmpty(userInput))
continue;
try
{
var agentContext = new KernelArguments()
{
["input"] = userInput,
["history"] = string.Join("\n", chatHistory.Select(h => $"{h.Role}: {h.Content}"))
};
var result = await systemFunction.InvokeAsync(kernel, agentContext);
chatHistory.AddAssistantMessage(result.GetValue<string>());
Logger.ConsoleLog("\nYanıt : ", ConsoleColor.Cyan);
Console.WriteLine(result.GetValue<string>());
}
catch (Exception ex)
{
Console.WriteLine($"Hata oluştu : {ex.Message}");
}
}
#endregion
Görüldüğü üzere kullanıcı açısından geçmişi hatırlanan ve sürekli soru sorup cevabı alınabilen bir chatbot misali yapı inşa etmiş bulunuyoruz. Artık temel yapıyı inşa ettiğimize göre mcpverse.dev platformu üzerinden Todoist servisine bağlanacak MCP Client çalışmasına başlayabiliriz.
mcpverse.dev Platformunda Todoist Yapılanması
mcpverse.dev platformunda Todoist server yapılanması için aşağıdaki ekran görüntüsünde olduğu gibi ilgili servis üzerinden ‘Create Server’ butonuna tıklanmalı ve açılan popup üzerinden ‘Todoist API token’ alanına app.todoist.com adresinden alınan token verilmelidir.
Şimdi bizler Claude yahut Cursor’a nazaran kendi özel MCP Client’ımızı tasarlayacağımızdan dolayı URL’den istifade edecek ve 2. önergede söylediği gibi mcpverse.dev platformundan alacağımız token’ı header’a ekleyerek gerekli yapılandırmada bulunuyor olacağız.
Yani anlayacağınız, bu aşamaya kadar ilgili Todoist MCP Server servisinin bize özel oturumuyla mcpverse.dev platformu arasında token üzerinden bir entegrasyonda bulunmuş olduk. Bundan sonra ise oluşturacağımız MCP Client’ta mcpverse.dev platformunun bize vereceği token ile bu MCP Server URL’i üzerinden bir bağlantı oluşturacak ve gerekli olan ilişki ağını nihayete erdirmiş olacağız.
Haliyle MCP Client’ın yapılandırmasına geçmeden önce mcpverse.dev platformundan aşağıdaki görseldeki gibi bir API key’in alınması gerekmektedir.
MCP Client’ın Yapılandırması
mcpverse.dev platformu üzerinden Todoist MCP Server’ına bağlantı kurmuş bir MCP Client’ı aşağıdaki gibi tasarlayabiliriz;
public class QwenAIMCPClient(string MCPServerName)
{
private IMcpClient _mcpClient;
public async Task<IMcpClient> GetClientAsync()
{
if (_mcpClient == null)
_mcpClient = await McpClientFactory.CreateAsync(
clientTransport: new SseClientTransport(new()
{
Endpoint = new Uri("https://api.mcpverse.dev/api/mcp/sse?server_id=7a183875-2ce9-4b5c-9d7d-5a6a671ce0bd"),
Name = MCPServerName,
AdditionalHeaders = new()
{
["Authorization"] = "Bearer sk_KHddl4LT0p_ssAKEuVWWdgoTn3-pNgZ4ZaghjRnOkR0BE9LYKF8T0dPG7sCGb2FnLBO1suANgBnZ_PIT"
}
}),
clientOptions: new McpClientOptions()
{
ClientInfo = new Implementation()
{
Name = "Qwen.AI.MCP.Client",
Version = "1.0.0"
}
}
);
return _mcpClient;
}
public async Task<IList<McpClientTool>> GetToolListAsync()
{
_mcpClient = await GetClientAsync();
IList<McpClientTool> tools = await _mcpClient.ListToolsAsync();
return tools;
}
public async Task<object> CallToolAsync(string toolName, Dictionary<string, object?> input)
{
_mcpClient = await GetClientAsync();
CallToolResponse response = await _mcpClient.CallToolAsync(
toolName,
input
);
return response.Content.First(c => c.Type == "text").Text;
}
}
Burada özellikle GetClientAsync metoduna odaklanırsak eğer remote bir MCP Server’dan canlı veri alacağımız için SSE tekniğine göre yapılandırmada bulunmamızı sağlayacak olan SseClientTransport üzerinden bir çalışma gerçekleştirilmekte ve Endpoint‘e mcpverse.dev platformundan edinilen URL verilmektedir. Aynı şekilde header kısmının authorization key’ine de yine aynı platformdan biraz önce elde ettiğimiz api key bearer olarak verilmektedir.
Evet, artık MCP Client hazır olduğuna göre artık AI Agent’ta bu MCP Client’ı kullanarak Todoist yeteneklerini sürece dahil edebilir ve testimizi gerçekleştirebiliriz.
AI Agent’a Todoist Yeteneklerinin Dahil Edilmesi
Yukarıdaki satırlarda geliştirdiğimiz AI Agent’a biraz önce oluşturduğumuz MCP Client üzerinden Todoist yeteneklerini dahil edebilmek için aşağıdaki gibi bir çalışmanın yapılması gerekmektedir;
Logger.ConsoleLog("AI Agent başlatılıyor...", ConsoleColor.Green);
QwenAIMCPClient mcpClient = new("todoist.mcpverse.dev");
var tools = await mcpClient.GetToolListAsync();
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: "qwen/qwen3-32b",
openAIClient: new OpenAIClient(
credential: new ApiKeyCredential("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"),
options: new OpenAIClientOptions
{
Endpoint = new Uri("https://openrouter.ai/api/v1")
}
)
)
.Plugins.AddFromFunctions("Todoist", tools.Select(tool => tool.AsKernelFunction()));
.
.
.
Bu işlemden sonra uygulamayı derleyip çalıştırabilir ve davranışsal olarak test edebiliriz.
İşte, kendimize ait görev yönetimi sürecinde bizlere eşlik eden basit ama etkili bir AI Agent’ı oluşturmuş olduk🥳Bundan sonra bu tarz AI Agent’ları daha efektif bir şekilde oluşturmamızı sağlayacak olan farklı teknolojik altyapılara da odaklanacak ve yer yer bu tarz pratiksel içerikleri kaleme almaya devam ediyor olacağız.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışmaya aşağıdaki GitHub adresinden erişebilirsiniz.
https://github.com/gncyyldz/Todoist_AI_Agent_With_SK_And_MCP_Example