Finans-Mail-MCP
MCP server that exposes a Microsoft 365 mailbox via the Model Context Protocol, enabling AI assistants to search, read, and download emails and attachments, and optionally send mail.
README
Outlook MCP Sunucusu
Microsoft 365 posta kutusunu MCP (Model Context Protocol) üzerinden internete açan, tek başına çalışan bir Node servisi. Claude Desktop bu sunucuya bağlanıp posta kutusunda arama yapabilir, mesajları okuyabilir, ekleri indirebilir ve (açıkça izin verilirse) mail gönderebilir.
Ana projeden (parasut-ops-panel) tamamen bağımsızdır: Replit'e özgü hiçbir SDK
kullanmaz, kendi package.json dosyası vardır. Render, Railway, Fly veya yeni bir Replit
projesinde aynen çalışır.
1. Önce şunu bilin: hangi posta kutusuna erişilebilir?
Bu sunucu app-only (client credentials) kimlik doğrulaması kullanır. Microsoft 365 tenant'ında bir ApplicationAccessPolicy hangi kutulara app-only erişilebileceğini sınırlar. Test edilmiş güncel durum:
| Posta kutusu | App-only okuma | App-only gönderme |
|---|---|---|
finans@rsresearch.net |
✅ Çalışıyor | ❌ 403 |
omererdogan@rsresearch.net |
❌ 403 (Access is denied) |
❌ 403 |
Yani bu sunucu bulutta bir yerde çalıştığında yalnızca finans@ kutusunu okuyabilir.
omererdogan@ kutusunu da okumak istiyorsanız iki seçenek var:
-
Tenant yöneticisinden politikayı genişletmesini isteyin. Doğru çözüm budur ve sunucuda hiçbir kod değişikliği gerektirmez. Yöneticinin çalıştıracağı komut (Exchange Online PowerShell):
# Mevcut politikayı gör Get-ApplicationAccessPolicy | Format-List AppId,PolicyScopeGroupId,AccessRight # İzin verilen kullanıcı grubuna omererdogan@ ekleyin (grup adı tenant'a göre değişir) Add-DistributionGroupMember -Identity "<mcp-izinli-kutular-grubu>" ` -Member omererdogan@rsresearch.net # Doğrulama Test-ApplicationAccessPolicy -Identity omererdogan@rsresearch.net -AppId <AZURE_CLIENT_ID>Sonuç
AccessCheckResult: GranteddönerseMCP_MAILBOXESlistesine adresi ekleyip servisi yeniden başlatmanız yeterli. -
Yalnızca
finans@ile devam edin. Hiçbir şey yapmanıza gerek yok, varsayılan bu.
Gönderme (
MCP_ALLOW_SEND) varsayılan olarak kapalıdır ve açsanız bilefinans@kutusundan app-only gönderim 403 döner. Gönderim gerekiyorsa Azure uygulamasınaMail.SendApplication izni verilmeli, admin onayı alınmalı ve erişim politikası o kutuyu kapsamalıdır.
2. Araçlar
| Araç | Ne yapar |
|---|---|
list_mailboxes |
Erişilebilen kutuları, varsayılan tarih penceresini ve yazma iznini döner |
list_folders |
Klasörleri iki seviye derinliğe kadar, id değerleriyle listeler |
search_mail |
E-posta arar (klasör, tarih aralığı, gönderen, alıcı, konu, ek filtresi) |
get_message |
Tek mesajın tam gövdesini döner (varsayılan düz metin) |
list_attachments |
Ekleri ad/tür/boyut ile listeler |
get_attachment |
Eki base64 içerikle indirir |
send_mail |
Mail gönderir — yalnızca MCP_ALLOW_SEND=true ise kayıtlı olur |
search_mail hakkında bilmeniz gereken iki şey
a) İki mod vardır ve araç otomatik seçer.
query,toveyasubjectverilirse → metin arama modu (Graph KQL). Bu modda Graph sonuçları alaka düzeyine göre sıralar, tarihe göre değil; tarih sınırı da gün hassasiyetindedir.- Yalnızca tarih /
from/hasAttachmentsverilirse → filtre modu. Sonuçlar en yeniden en eskiye sıralanır.
Bu ayrım Graph'ın bir kısıtından geliyor: $search ile $filter ve $orderby aynı
istekte kullanılamaz.
b) Sonuçlar sayfalıdır. Varsayılan tarih penceresi son 730 gün (~2 yıl). Tek
çağrıda en fazla 100 mesaj döner. Devamı için dönen nextCursor değerini bir sonraki
çağrıda cursor parametresine geçirin. Claude bunu kendiliğinden yapar; siz sadece
"devam et" demeniz yeterli.
3. Yerelde çalıştırma
cd mcp-outlook
cp .env.example .env # değerleri doldurun
npm install
npm run build
npm start
Sağlık kontrolü: curl http://localhost:5000/healthz
MCP_AUTH_TOKEN üretmek için: openssl rand -hex 32
4. Render.com'a kurulum (adım adım)
Render seçilmesinin sebebi: bu Replit projesinin cloud_run dağıtımı askıya alınmış
durumda ve açılması Replit Support gerektiriyor.
-
Kodu GitHub'a gönderin. Render bir Git reposundan deploy eder. Bu klasörün içeriği kendi başına bir deponun kökü olacak şekilde tasarlandı:
package.json,render.yamlvesrc/doğrudan kökte durmalı. Sarmalayıcı birmcp-outlook/klasörünün içine koymayın — Render blueprint'i yalnızca depo kökünde arar.Yine de daha büyük bir deponun alt klasörü olarak tutmak isterseniz:
render.yamldosyasını depo köküne taşıyın ve içinerootDir: <klasör-adı>satırını ekleyin. -
Render panelinde
New→Blueprint→ repoyu seçin. Render köktekirender.yamldosyasını okuyup servisi hazırlar.Blueprint kullanmak istemezseniz
New→Web Serviceile elle de kurabilirsiniz:Alan Değer Root Directory (boş bırakın — depo kökü) Runtime Node Build Command npm ci && npm run buildStart Command npm startHealth Check Path /healthz -
Ortam değişkenlerini girin (Render → servis → Environment):
Anahtar Değer AZURE_TENANT_IDAna projedekiyle aynı AZURE_CLIENT_IDAna projedekiyle aynı AZURE_CLIENT_SECRETAna projedekiyle aynı MCP_AUTH_TOKENopenssl rand -hex 32çıktısıMCP_MAILBOXESfinans@rsresearch.netPORTgirmeyin — Render kendisi enjekte eder. -
Deploy'u bekleyin, sonra doğrulayın:
curl https://<servis-adi>.onrender.com/healthz{"status":"ok",...}görmelisiniz. -
Planı seçerken dikkat: Render'ın ücretsiz katmanı 15 dakika boştan sonra servisi uyutur; uyandırma 30–60 saniye sürer ve Claude bu sürede zaman aşımına düşebilir. Düzenli kullanacaksanız ücretli (Starter) plan gerekir.
render.yamliçindeplan: starteryazılıdır.
Alternatif: yeni bir Replit projesi
mcp-outlook klasörünü yeni bir Replit projesine kopyalayın, aynı ortam değişkenlerini
Secrets olarak girin (PORT=5000), çalıştırma komutunu npm run build && npm start
yapın ve projeyi Autoscale Deployment olarak yayınlayın. Adres
https://<proje>.replit.app/mcp olur. Adımlar aynıdır.
5. Claude Desktop'a bağlama
claude_desktop_config.json dosyası yalnızca stdio sunucuları kabul eder. Doğrudan
"url": "..." yazarsanız Claude Desktop girdiyi sessizce siler. Bu yüzden mcp-remote
adlı köprüyü kullanıyoruz: Claude Desktop ile stdio, sunucumuzla Streamable HTTP konuşur.
Dosyanın yeri:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
İçerik:
{
"mcpServers": {
"outlook": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://<servis-adi>.onrender.com/mcp",
"--transport",
"http-only",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer BURAYA_MCP_AUTH_TOKEN"
}
}
}
}
Üç ayrıntı önemli:
Authorization:${AUTH_HEADER}ifadesinde iki nokta üst üste sonrasında boşluk yoktur. Claude Desktop argümanlardaki boşlukları bozar; bu yüzden token'ıenviçine koyup değişken olarak enjekte ediyoruz.Bearerkelimesienvdeğerinin içindedir.--transport http-onlyşart: bu sunucu stateless çalışır, SSE akışı sunmaz. Bu bayrak olmadanmcp-remoteönce SSE deneyip gereksiz yere bekler.- Node 18+ kurulu olmalı (
npxbunun için gerekli).
Kaydedin ve Claude Desktop'ı tamamen kapatıp yeniden açın. Ayarlar → Connectors
altında outlook görünmeli ve araçlar listelenmelidir.
Deneyin: "finans kutusunda son 6 ayda gönderilen, konusunda fatura geçen mailleri listele."
Claude.ai (tarayıcı) veya mobil uygulama
Web arayüzündeki "Custom Connector" özelliği bearer token değil OAuth 2.0 bekler.
Bu sunucu OAuth uygulamaz, dolayısıyla Claude.ai üzerinden doğrudan bağlanamazsınız.
Masaüstü uygulaması + mcp-remote yolunu kullanın.
6. Güvenlik
MCP_AUTH_TOKENbir paroladır. Onu bilen herkesMCP_MAILBOXESlistesindeki kutuların tamamını okuyabilir. Sohbete, ekran görüntüsüne veya repoya yazmayın.MCP_MAILBOXESbir güvenlik sınırıdır. Azure app-only token teknik olarak tenant'taki her kutuya erişebilir; sunucu her istekte gelen adresi bu listeye karşı doğrular ve listede olmayanı reddeder. Listeyi dar tutun.- Yazma varsayılan olarak kapalıdır.
MCP_ALLOW_SEND=trueyapmadıkçasend_mailaracı Claude'a hiç gösterilmez. - Token'ı değiştirmeniz gerekirse Render'da değeri güncelleyin, servisi yeniden
başlatın ve
claude_desktop_config.jsoniçindeki değeri de güncelleyin.
7. Sorun giderme
| Belirti | Sebep ve çözüm |
|---|---|
401 Yetkisiz |
Token yanlış veya Bearer öneki eksik. env.AUTH_HEADER değeri Bearer ile başlamalı. |
Graph erişimi reddedildi (403) |
Kutu app-only erişime kapalı. Bölüm 1'deki tabloya ve PowerShell adımlarına bakın. |
An identifier was expected at position 0 |
Arama metninde tırnak/parantez vardı. Sunucu bunları temizler; görüyorsanız sürüm eskidir, yeniden derleyin. |
| Claude Desktop'ta sunucu görünmüyor | Config'e "url" yazılmış olabilir — o satırı silin, mcp-remote biçimini kullanın ve uygulamayı tam kapatıp açın. |
| İlk istek zaman aşımına uğruyor | Render ücretsiz katmanı servisi uyutmuş. Starter plana geçin veya bir kez curl /healthz ile uyandırın. |
Graph hız sınırı aşıldı (429) |
Çok hızlı sayfalama yapıldı. Kısa bir süre bekleyip devam edin. |
| Sonuçlar tarih sırasında değil | Metin arama modundasınız (query/to/subject verilmiş). Tarih sıralaması istiyorsanız bu alanları boş bırakın. |
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。