.NET’te WhatsApp MCP Server Aracılığıyla WhatsApp İle Yapay Zeka Entegrasyonu
Merhaba,
Bu içeriğimizde açık kaynak olarak sunulmuş olan WhatsApp MCP Server‘ı kullanarak WhatsApp’ı yapay zeka ile nasıl entegre edebileceğimizi inceleyeceğiz. Tabi bunun için öncelikle WhatsApp MCP Server’ın ne olduğunu tanıyacak, ardından .NET üzerinden OpenAI: GPT-3.5 Turbo AI modeli eşliğinde pratiksel bir çalışma gerçekleştireceğiz.
WhatsApp MCP Server Nedir? Temel Fonksiyonları Nelerdir?
WhatsApp MCP Server, herhangi bir kişisel yahut işletme WhatsApp hesabını bir yapay zeka agent’ı ile entegre etmek için tasarlanmış açık kaynak bir projedir. Bu MCP Server ile WhatsApp’ın hesapları birden fazla cihazda(telefon, bilgisayar, tablet vs.) aynı anda kullanılabilmesini sağlayan Web Multi-Device API özelliği kullanılarak mesajları local bir SQLite veritabanında depolayabilmekte ve yapay zeka araçlarıyla etkileşim kurabilmekteyiz.
Bu MCP Server’ın sağladığı temel fonksiyonlar ve bu fonksiyonlar eşliğinde neler yapılabileceği aşağıda detaylıca açıklanmıştır:
- Mesajlara Erişim
İlgili hesaptaki WhatsApp mesajlarına(yazı, resim, video, belge, ses) erişilebilir. - Mesaj Gönderme ve Alma
Bireysel kişilere veya gruplara metin mesajları, görüntü, video, belgeler veya sesli mesajlar gönderilebilir. - Mesaj veya Kişi Arama
SQLite veritabanında saklanan mesajlar veya kişiler arasında arama yapılabilir. Bunun yanında belirli sohbetlerin geçmiş mesajları listelenebilir. - AI İle Otomasyon ve Entegrasyon
AI araçlarıyla entegre olarak WhatsApp mesajları yönetilebilir, müşteri hizmetleri misali otomatik yanıtlar oluşturulabilir, mesaj içerikleri analiz edilebilir ve bu analizler üzerinden çıkarımlarda bulunulabilir.Özellikle günlük yaşamda kullanıcılar tarafından sipariş bildirim süreçlerinde ‘Paketiniz kargoya verildi!’ gibi bildirimler göndermek amacıyla bu MCP Server kullanılabilir. Bunun dışında randevu hatırlatmaları ve pazarlama kampanyaları gibi durumlarda bu MCP Server ile ciddi farklar yaratılabilir.
WhatsApp MCP Server’ın Mimari Yapısı Nasıldır?
WhatsApp MCP Server’ın mimari yapısı temel olarak üç ana bileşenden oluşmaktadır;
WhatsApp MCP Server’ın Sınırlamaları Nelerdir?
WhatsApp MCP Server’ı kullanırken dikkat edilmesi gereken bazı sınırlamalar söz konusu olabilir. Bunlardan en önemlisi, WhatsApp’ın Web Multi-Device özelliğinin yaklaşık 20 günde bir yeniden kimlik doğrulama gerektirebilmesidir. Evet, 20 gün sonra QR kod ile tekrar bir doğrulama gereksinimi, belirtilen periyotta bir bizlere bir sorumluluk yükleyecektir.
Bir diğer önemli sınırlılık ise local’de kullanılan SQLite veritabanının büyük veri hacimlerinde performans sorunları yaratabilme ihtimalidir. Dolayısıyla çok sipesifik bir görev için bu MCP Server’ın kullanılmasına özen gösterilmelidir.
WhatsApp MCP Server’ın Ayağa Kaldırılması
WhatsApp MCP Server’ı local’de ayağa kaldırabilmek için öncelikle temel gereksinimlerden Go ve Python 3.6+ sürümlerinin kurulu olduklarından emin olunması gerekmektedir. Bunun için go version ve python --version talimatları eşliğinde gerekli sürüm kontrollerinde bulunabilirsiniz.
Ardından uygun bir dizine git clone https://github.com/lharries/whatsapp-mcp.git talimatı eşliğinde ilgili MCP Server’ın projesini klonlayarak çekebilir ve
C:\...\whatsapp-mcp> cd .\whatsapp-bridge\ dizinine gelerek go run main.go talimatıyla Go WhatsApp Bridge bileşenini çalıştırabilirsiniz.
Bu işlem neticesinde üstteki görselde de görüldüğü üzere kimlik doğrulama için bir QR kod sizleri karşılayacaktır. Telefonunuzdaki WhatsApp uygulaması üzerinden bu kodu doğrularsanız aşağıdaki ekran görüntüsünde olduğu gibi hesabınız ile entegrasyon sağlanacak ve tüm mesajlar ve içerikler local’de ki SQLite veritabanına aktarılacaktır.
Hoca görsel neden flulaşıyor diye sorarsanız 🙂 malum, kişisel hesabım üzerinden doğrulama gerçekleştirerek ekran alıntısı alıyorum 🙂 ee haliyle yakın arkadaşlarımla ola ki ahlaki seviyenin bi tık ihmal edildiği mesajların gözünüze çarpabilme ihtimali beni rahatsız etmedi değil 🤣
Velhasıl kelam,
Go WhatsApp Bridge bileşenini ayağa kaldırdıktan sonra artık bu MCP Server’a yazılım üzerinden bağlantı sağlamaya geçebiliriz. Tabi oraya gelmeden önce dikkat edilmesi gereken birkaç husustan daha bahsetmekte fayda görmekteyim: Eğer ki bu projeyi Windows ortamında çalıştırıp, derliyorsanız, bu derlemenin düzgün çalışabilmesi için varsayılan olarak devre dışı olan CGO’nun etkinleştirilmesi gerekmektedir. Bunun için whatsapp-bridge dizininde go env -w CGO_ENABLED=1 talimatının çalıştırılması ve ardından yine go run main.go talimatı ile ilgili bileşenin ayağa kaldırılması yeterli olacaktır.
Evet… Artık WhatsApp MCP Server’ı kullanmaya geçebiliriz.
.NET İle WhatsApp MCP Server’ın Kullanılması
Evet… Artık olayı biraz daha pratik seviyede değerlendireceğiz. .NET platformunda oluşturduğumuz bir MCP Host üzerinden WhatsApp MCP Server’a erişip, kullandığımız LLM’in yeteneklerini nasıl genişletebileceğimizi inceleyebiliriz. Bunun için öncelikle bir Console Application projesi oluşturalım ve içerisine Microsoft.SemanticKernel ve ModelContextProtocol kütüphanelerini yükleyerek çalışmaya hazır hale getirelim.
Ardından uygulama ile WhatsApp MCP Server arasında bağlantı kurarak gerekli tool’ları çekmemizi sağlayacak olan aşağıdaki sınıfı oluşturalım:
public class WhatsAppMCPClient(string MCPServerName)
{
private IMcpClient _mcpClient;
public async Task<IMcpClient> GetClientAsync()
{
if (_mcpClient == null)
_mcpClient = await McpClientFactory.CreateAsync(
clientTransport: new StdioClientTransport(new()
{
Command = "C:/Users/Gencay/.local/bin/uv.exe",
Arguments = [
"--directory",
"C:/***/whatsapp-mcp/whatsapp-mcp-server",
"run",
"main.py"
]
}),
clientOptions: new McpClientOptions()
{
ClientInfo = new ModelContextProtocol.Protocol.Implementation()
{
Name = "WhatsApp.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();
CallToolResult result = await _mcpClient.CallToolAsync(
toolName,
input
);
return result.Content.First(c => c.Type == "text");
}
}
Burada dikkat ederseniz MCP Server ile standart I/O(stdio) üzerinden iletişim kurulmakta ve buna uygun parametreler girilmektedir. Tabi sizler 13. satırdaki dizini local’inizdeki MCP Server’ın dizinine uygun olarak güncellemelisiniz.
Devamında ise aşağıdaki gibi Semantic Kernel ile içeriğimizin ilk satırlarında bahsettiğimiz openrouter platformundaki OpenAI: GPT-3.5 Turbo AI modeli ile uygulamanın entegrasyonunu gerçekleştirelim ve WhatsApp MCP Server‘dan gelen tool’ları function olarak AI modele aktaralım:
WhatsAppMCPClient mcpClient = new("WhatsApp.Server");
var tools = await mcpClient.GetToolListAsync();
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: "openai/gpt-3.5-turbo-0613",
openAIClient: new OpenAIClient(
credential: new ApiKeyCredential("sk-or-v1-b285961db*******35325"),
options: new OpenAIClientOptions
{
Endpoint = new Uri("https://openrouter.ai/api/v1")
}
)
)
.Plugins.AddFromFunctions("Whatsapp", tools.Select(tool => tool.AsKernelFunction()));
var kernel = builder.Build();
Ardından, uygulamanın davranışını belirleyebilmek ve AI modele süreçteki rolünü tam olarak kazandırabilmek için aşağıdaki system prompt’u verelim:
var agentSystemPrompt = @"
Sen bir yapay zeka asistanısın ve WhatsApp üzerinden iletişim hizmetleri sunuyorsun.
Kullanıcı talimatlarını analiz ederek, WhatsApp üzerinden mesaj gönderme, mesaj alma veya diğer WhatsApp işlevlerini gerçekleştir.
Kullanıcıdan gelen talimatları net bir şekilde anlamaya çalış ve uygun araçları (tools) kullanarak işlemleri yerine getir.
Eğer talimat belirsizse, kullanıcıdan ek bilgi iste.
Cevaplarını Türkçe ve kullanıcı dostu bir şekilde ver.
İşte kullanıcının girdisi: {{$input}}
Geçmiş konuşmalar: {{$history}}
";
var systemFunction = kernel.CreateFunctionFromPrompt(
promptTemplate: agentSystemPrompt,
executionSettings: new PromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
});
Burada AI modelle sağlıklı bir iletişim süreci olabilmesi için özellikle kullanıcı girdisi ve geçmiş konuşmalara yukarıdaki gibi atıfta bulunmak gerektiğini ekstradan vurgulamakta fayda görmekteyim.
Ve son olarak agent’ın davranışını şekillendirecek aşağıdaki gerekli çalışmaları geliştirelim:
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}");
}
}
Burada dikkat ederseniz eğer agent ile olan sohbet esnasında geçmiş konuşmaları hatırlayabilmek için ChatHistory sınıfıyla gerekli düzenlemeleri yapmakta ve böylece nihai olarak agent’ı kurgulamış bulunmaktayız. Yaptığımız bunca çalışmanın derli bir şekilde incelenebilmesi için aşağıya toplu halini de alalım:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using OpenAI;
using System.ClientModel;
using WhatsApp_Mcp_Server_DotNet_Integration;
using WhatsApp_Mcp_Server_DotNet_Integration.Services;
WhatsAppMCPClient mcpClient = new("WhatsApp.Server");
var tools = await mcpClient.GetToolListAsync();
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: "openai/gpt-3.5-turbo-0613",
openAIClient: new OpenAIClient(
credential: new ApiKeyCredential("sk-or-v1-b285961db*******35325"),
options: new OpenAIClientOptions
{
Endpoint = new Uri("https://openrouter.ai/api/v1")
}
)
)
.Plugins.AddFromFunctions("Whatsapp", tools.Select(tool => tool.AsKernelFunction()));
var kernel = builder.Build();
#region Agent'a davranışını tanımlayan bir sistem prompt'u veriliyor.
var agentSystemPrompt = @"
Sen bir yapay zeka asistanısın ve WhatsApp üzerinden iletişim hizmetleri sunuyorsun.
Kullanıcı talimatlarını analiz ederek, WhatsApp üzerinden mesaj gönderme, mesaj alma veya diğer WhatsApp işlevlerini gerçekleştir.
Kullanıcıdan gelen talimatları net bir şekilde anlamaya çalış ve uygun araçları (tools) kullanarak işlemleri yerine getir.
Eğer talimat belirsizse, kullanıcıdan ek bilgi iste.
Cevaplarını Türkçe ve kullanıcı dostu bir şekilde ver.
İşte kullanıcının girdisi: {{$input}}
Geçmiş konuşmalar: {{$history}}
";
var systemFunction = kernel.CreateFunctionFromPrompt(
promptTemplate: agentSystemPrompt,
executionSettings: new PromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
});
#endregion
#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
Evet, artık bu AI agent’ı derleyip çalıştırarak WhatsApp MCP Server‘ın yeteneklerinden nasıl istifade ettiğini deneyimleyebiliriz. Tabi buna gelmeden önce, ilgili MCP Server’dan gelen tool’ları incelemek ve hatta AI olmaksızın manuel bir şekilde bu tool’ları kullanarak nasıl işlevsellik gösterdiğine odaklanmak isterim…
WhatsApp MCP Server’ın Sağladığı Tool’lar
WhatsApp MCP Server ile olan etkileşim neticesinde aşağıdaki tool’lara erişim gösterilebilecektir;
- search_contacts : Kişileri isim ve telefon numarasına göre arama yapar.
- list_messages : İstenilen mesajları listeler.
- list_chats : Birden fazla sohbeti listeler.
- get_chat : Tek bir sohbet hakkında bilgi edinilmesini sağlar.
- get_direct_chat_by_contact : Belirli bir kişiyle doğrudan sohbet edilmesini sağlar.
- get_contact_chats : Belirli bir kişiyle ilgili tüm sohbetlerin listelenmesini sağlar.
- get_last_interaction : Bir kişiye gönderilen en son mesajı getirir.
- get_message_context : Bir mesajın sohbet içindeki yerini/konumunu anlamak için önceki ve sonraki mesajları getirir.
- send_message : Belirtilen telefon numarasına veya WhatsApp grup id’sine mesaj gönderir.
- send_file : Belirtilen alıcıya bir dosya (yazı, resim, video, belge, ses) gönderir.
- send_audio_message : Bir ses dosyasını WhatsApp sesli mesaj olarak gönderir.
- download_media : Bir WhatsApp mesajında bulunan medyayı indirir.
Peki hoca! Bu tool’ları AI model olmaksızın elle kullanıp ilgili MCP Server ile manuel nasıl haberleşebiliriz? şeklinde sorunuzu duyar gibiyim… Bunu hemen aşağıdaki gibi en son alınıp/gönderilen 10 mesajın listelenmesini manuel sağlayan aşağıdaki çalışmayla gerçekleştirebiliriz:
var toolResult = await mcpClient.CallToolAsync("list_messages", new Dictionary<string, object?>
{
["limit"] = 5
});
dynamic response = toolResult;
Logger.ConsoleLog("Yanıt: ", ConsoleColor.Cyan);
Console.WriteLine(response.Text);
İşte… Bu minvalde tool’lara erişim gösterebilir ve AI olmaksızın çalışmalarınızı yürütebilirsiniz.
Tabi bir yandan AI modeli ile MCP’nin incelemesini gerçekleştirebilmek için uygulamayı derleyip çalıştırmamız yeterli olacaktır.
‘Client outdated (405) connect failure’ Hatası ve Çözümü
Eğer ki, makale sürecinde yahut sonraki bir zaman diliminde yukarıdaki görselde olduğu gibi Client outdated (405) connect failure hatasını alırsanız adım adım aşağıdaki önergeler eşliğinde ilgili probleme çözüm getirebilirsiniz:
- Go WhatsApp Bridge bileşeninde dependency’leri güncelleyin;
cd whatsapp-bridge go get -u go.mau.fi/whatsmeow
main.godosyasındaki context parametrelerini düzenleyin;
Eski;mediaData, err := client.Download(downloader)
container, err := sqlstore.New("sqlite3", "file:store/whatsapp.db?_foreign_keys=on", dbLog)deviceStore, err := container.GetFirstDevice()
contact, err := client.Store.Contacts.GetContact(jid)
Yeni;
mediaData, err := client.Download(context.Background(), downloader)
container, err := sqlstore.New(context.Background(), "sqlite3", "file:store/whatsapp.db?_foreign_keys=on", dbLog)
deviceStore, err := container.GetFirstDevice(context.Background())
contact, err := client.Store.Contacts.GetContact(context.Background(), jid)
- Dependency’leri resolve edin;
go mod tidy
- Düzenlemeleri doğrulayın;
go build main.go
- Çalıştırın;
go run main.go
Evet, bu adımlar sonrasında alınan hatanın çözüldüğünü ve ilgili MCP Server’ın ayağa kaldırılıp, kullanılabilir olduğunu görebilirsiniz.
Nihai olarak;
WhatsApp MCP Server‘ın, WhatsApp mesajlaşmalarını yapay zeka ile uygulamalara entegre ederek güçlü otomasyon ve veri yönetimi imkanları eşliğinde uygulamaların gelişmiş iletişim süreçlerine daha hızlı ve etkin bir şekilde adapte olmasını sağladığını incelemiş bulunuyoruz.
İ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/WhatsApp_Mcp_Server_DotNet_Integration


Gayet güzel ve faydalı bir makale olmuş. Elinize sağlık.