Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.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;

Go WhatsApp Bridge Python MCP Server Data Storage
  • WhatsApp Web API’ye bağlanarak, mesaj geçmişini toplamak ve diğer mesajlaşma işlemlerini yönetmek için Go (Golang) ile yazılmış bir servistir.
  • İlgili WhatsApp hesabına bağlanabilmek için WhatsApp Web’e girişteki mantıkla birebir aynı olacak şekilde QR kod ile kimlik doğrulama yapmaktadır.
  • Ayrıca tüm mesaj geçmişini whatsapp-mcp\whatsapp-bridge\store dizininde bulunan local bir SQLite veritabanında tutmaktadır.

Kısaca bu bileşen, WhatsApp ile doğrudan etkileşim kurmakta ve yazılımların yahut yapay zeka asistanları gibi diğer sistemlerin erişebileceği veri altyapısını hazırlayarak bir köprü görevi görmektedir.

  • MCP üzerinden mesaj verilerine AI agent’lar için standartlaştırılmış erişim sağlayarak iletişim kurulabilmesine imkan tanıyan bir servistir.
  • Python ile geliştirilmiştir.
  • JSON-RPC protokolünü kullanarak yapay zeka modellerine REST dışında bir yaklaşımla oldukça esnek bir arayüz sunmaktadır.

Bu bileşen sayesinde Claude gibi LLM destekli IDE’ler ya da özel geliştirilmiş olan MCP Host’lar, WhatsApp’ın niteliklerinden istifade edebilmekte ve bu nitelikleri yapay zeka destekli yazılım süreçlerine dahil ederek kullanabilmektedirler.

  • Süreçteki mesajlar, kişiler ve meta veriler gibi tüm datalar whatsapp-mcp\whatsapp-bridge\store dizininde saklanan SQLite veritabanı içinde yer almaktadır. Böylece cloud bağımlılığı söz konusu olmamakta ve WhatsApp gibi kritik bilgileri kapsayan bir servisin gizlilik ilkesi güvence altına alınmış olmaktadır.
  • İlgili dizine göz atarsanız eğer aşağıdaki görselde olduğu gibi messages.db ve whatsapp.db dosyalarının olduğunu göreceksiniz..NET'te WhatsApp MCP Server Aracılığıyla WhatsApp İle Yapay Zeka Entegrasyonu
  • Bu dosyalardan messages.db‘nin içeriğine göz atarsak eğer chats ve messages olmak üzere iki tablonun yer aldığını görmekteyiz.

  1. chats tablosu : Her bir bireysel ya da grup sohbetini temsil etmektedir.
  2. messages tablosu : Tüm mesajların içerik, timespan, gönderen kişi, medya bilgileri vs. gibi detaylarını içermektedir.

Dikkat ederseniz messages.db yapay zeka asistanlarının WhatsApp mesajlarını anlaması, sorgulaması, özetlemesi ve hatta cevap üretebilmesi için optimize edilmiş MCP dostu bir veritabanı olarak tasarlanmıştır.

whatsapp.db‘de ise WhatsApp MCP Server mimarisindeki tüm sohbet verileri kalıcı olarak saklanmaktadır. Yani; whatsapp.db‘de WhatsApp uygulamasından alınan tüm verilerin arşivlenip ana veritabanı olarak kullanılması söz konusuyken, message.db‘de ise MCP Server olarak yapay zekalar tarafından işlenmek üzere filtrelenmiş/verileştirilmiş mesajların tutulması ve böylece daha özet bir veritabanı olarak tasarlanması mevzu bahistir.

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..NET'te WhatsApp MCP Server Aracılığıyla WhatsApp İle Yapay Zeka EntegrasyonuBu 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..NET'te WhatsApp MCP Server Aracılığıyla WhatsApp İle Yapay Zeka EntegrasyonuHoca 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..NET'te WhatsApp MCP Server Aracılığıyla WhatsApp İle Yapay Zeka Entegrasyonu

‘Client outdated (405) connect failure’ Hatası ve Çözümü

.NET'te WhatsApp MCP Server Aracılığıyla WhatsApp İle Yapay Zeka EntegrasyonuEğ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:

  1. Go WhatsApp Bridge bileşeninde dependency’leri güncelleyin;
    cd whatsapp-bridge
    go get -u go.mau.fi/whatsmeow
    
  2. main.go dosyası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)
    
  3. Dependency’leri resolve edin;
    go mod tidy
    
  4. Düzenlemeleri doğrulayın;
    go build main.go
    
  5. Ç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

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Kenan dedi ki:

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

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir