usom-mcp
Provides optional threat-intelligence enrichment for URL, domain, and IP checks by querying the VirusTotal API when enrichment is enabled and an API key is configured. It sends the indicator to VirusTotal and returns additional reputation data alongside USOM results.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@usom-mcp is garanti-kredi-uzmani.cloud a phishing site?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🛡️ usom-mcp
Türkiye'nin ulusal zararlı bağlantı istihbaratı, AI ajanlarının parmaklarının ucunda.
Turkey's national malicious-link intelligence, at your AI agent's fingertips.
⚡ ~2 ms lookups · 🗄️ 496k records cached locally · 🔭 watch your own domains · 🔌 zero config
🇬🇧 English | 🇹🇷 Türkçe
Unofficial project. Not affiliated with, endorsed by, or operated by T.C. Cumhurbaşkanlığı Siber Güvenlik Başkanlığı (SGB) / USOM.Resmî değildir; T.C. Siber Güvenlik Başkanlığı / USOM ile bağlantısı yoktur.
🇬🇧 English
✨ What is this?
usom-mcp is an MCP server that puts the USOM / T.C. Siber Güvenlik Başkanlığı malicious-address list behind a handful of well-designed tools. Ask Claude, Cursor or your own security agent "is this link safe?" and get an answer in milliseconds, with the record date, source, category and match type, not a guess.
You ▸ Is https://garanti-kredi-uzmani.cloud/login legit?
Claude▸ ⚠️ No. USOM lists garanti-kredi-uzmani.cloud (exact match)
· category: Financial Phishing (BP)
· source: İHBAR (reporting) · criticality 4
· record date: 2026-10-06 14:26:41 (timezone not specified by USOM)
Don't enter credentials. Cache is fresh (synced 11 min ago).The conversation above is illustrative; the record behind it is real data from the live list.
🚀 Quick start
Requires Python 3.11+ and uv.
uvx usom-mcp # run the server (stdio)
uvx usom-mcp --sync # optional: pre-build the local cache, then exitUntil the first PyPI release, run from source:
uvx --from git+https://github.com/MustafaKemal0146/usom-mcp usom-mcp
{
"mcpServers": {
"usom": { "command": "uvx", "args": ["usom-mcp"] }
}
}claude mcp add usom -- uvx usom-mcp
# with optional enrichment keys:
claude mcp add usom -e VIRUSTOTAL_API_KEY=... -e ABUSEIPDB_API_KEY=... -- uvx usom-mcp{
"mcpServers": {
"usom": { "command": "uvx", "args": ["usom-mcp"] }
}
}uvx usom-mcp --transport http --host 127.0.0.1 --port 8000 # endpoint: http://127.0.0.1:8000/mcp
claude mcp add --transport http usom http://127.0.0.1:8000/mcpThere is no authentication. Keep it on 127.0.0.1; every client of one HTTP server shares the same watch list.
💡 Pro tip: copy SKILL.md into your skills directory so Claude knows when to call which tool, and to always cite the record date and source.
🧰 Tools
Tool | What it does |
| Is this URL listed? Exact, parent-domain, URL-path and CIDR matching |
| Is this domain (or a parent of it) listed? IDN-safe |
| Is this IPv4/IPv6 listed, exactly or inside a listed network? |
| Newest records, newest first |
| Keyword, type, category and date-range search |
| Record counts, newest record, last sync, cache state |
| Add your own domains / IPs / CIDR networks to a local watch list |
| Remove entries |
| Show the list |
| Scan the whole list in one call. For domains it also finds listed subdomains below them and what is new since last check |
Every check returns verdict (listed · not_listed · unknown) and, for each hit, its match type (exact, subdomain, www_variant, url_exact, url_prefix, cidr), record date, source, category, connection type and criticality (1 = highest). Every response carries stale, data_origin (cache / live), cache{…} and source. Bad input never crashes a call: you get a structured error with a hint.
🏗️ How it works
flowchart LR
C["Claude · Cursor · agents"] -- "MCP (stdio / HTTP)" --> S["usom-mcp"]
S --> DB[("SQLite cache<br/>~496k records")]
S --> W[("watch.db<br/>your assets")]
B["background sync"] -- "full once, then hourly incremental" --> DB
B <-- "siberguvenlik.gov.tr/api" --> U(["USOM / SGB API"])
S -. "live fallback while cache builds" .-> UCache-first. A local SQLite copy answers in about 2 ms. The first start downloads everything in the background (50 requests, about 4–9 minutes measured, ~100 MB on disk, because the upstream service is slow). Until it is ready,
check_*answers from the live API (data_origin: "live").Stays fresh. Hourly incremental updates (a few seconds), a full re-download every 7 days or whenever the upstream count drifts, which catches deleted records.
Survives outages. If USOM is unreachable you keep getting answers from the last cache, with
stale: trueonce it is older than the TTL.Careful matching. Scheme, port, userinfo, defanged input (
hxxp://evil[.]com), IDN → punycode and IPv6 canonical form are normalized. A listed parent domain matches its subdomains; the reverse does not (it shows up inwatch_checkinstead).Hostile-data aware. The list is partly crowd-sourced. Values containing whitespace or control characters are rejected before they can reach a language model.
Optional enrichment. Set
VIRUSTOTAL_API_KEYand/orABUSEIPDB_API_KEY; used only forcheck_*withenrich=true, never for watch scans. This sends the indicator to a third party. Without keys nothing is called and no field is added.
📊 Measured (real data, 6 Oct 2026)
Records cached | 495,817 (domain 473,243 · url 6,927 · ip 15,641 · ip6 6) |
Full download | 265 s (4–9 min across runs) · 50 requests · ~96 MB |
Incremental sync | ~5 s |
| ~1.4–2.1 ms |
| ~47 ms |
Cache vs. live API | 40 / 40 random records identical |
⚙️ Configuration
Variable | Default | Meaning |
| platform data dir | where |
|
| refresh interval |
| unset |
|
|
| logs go to stderr |
| unset | optional enrichment |
|
| CLI defaults |
📡 Data source
Data comes from the official API at https://siberguvenlik.gov.tr/api/ (OpenAPI: /api/openapi.yaml, no authentication). The old usom.gov.tr/url-list.txt file is gone: usom.gov.tr now redirects to siberguvenlik.gov.tr and the .txt distribution ended on 1 June 2026. Please read the upstream terms of use before redistributing the data. Every hit is attributed to T.C. Siber Güvenlik Başkanlığı / USOM.
⚠️ Limitations (read this)
"Not listed" is not "safe". USOM is one national list, not a full reputation database.
Record timestamps come without a timezone; they are passed through unchanged.
CIDR matching is implemented, but the list currently contains no network entries.
🧪 Development
uv sync
uv run pytest tests/unit -q # unit tests (offline)
USOM_LIVE=1 uv run pytest tests/integration -m live # hits the real API
uv run ruff check src tests && uv run mypyStrictly typed, 200+ offline tests, mutation-checked on the critical paths. MIT licensed.
Related MCP server: trust-score
🇹🇷 Türkçe
✨ Bu nedir?
usom-mcp, USOM / T.C. Siber Güvenlik Başkanlığı zararlı adres listesini birkaç iyi tasarlanmış araçla sunan bir MCP sunucusudur. Claude'a, Cursor'a ya da kendi güvenlik ajanına "bu link güvenli mi?" diye sor; tahmin değil, kayıt tarihi, kaynak, kategori ve eşleşme tipi ile milisaniyeler içinde cevap al.
Sen ▸ https://garanti-kredi-uzmani.cloud/login güvenilir mi?
Claude▸ ⚠️ Hayır. USOM garanti-kredi-uzmani.cloud'u listeliyor (tam eşleşme)
· kategori: Bankacılık - Oltalama (BP)
· kaynak: İHBAR · kritiklik 4
· kayıt tarihi: 2026-10-06 14:26:41 (USOM saat dilimi belirtmiyor)
Bilgi girmeyin. Cache güncel (11 dk önce senkronlandı).Yukarıdaki konuşma örnektir; arkasındaki kayıt canlı listeden gelen gerçek veridir.
🚀 Hızlı başlangıç
Python 3.11+ ve uv gerekir.
uvx usom-mcp # sunucuyu çalıştır (stdio)
uvx usom-mcp --sync # isteğe bağlı: yerel cache'i önceden oluşturup çıkİlk PyPI sürümüne kadar kaynaktan çalıştırın:
uvx --from git+https://github.com/MustafaKemal0146/usom-mcp usom-mcp
{
"mcpServers": {
"usom": { "command": "uvx", "args": ["usom-mcp"] }
}
}claude mcp add usom -- uvx usom-mcp
# isteğe bağlı zenginleştirme anahtarlarıyla:
claude mcp add usom -e VIRUSTOTAL_API_KEY=... -e ABUSEIPDB_API_KEY=... -- uvx usom-mcp{
"mcpServers": {
"usom": { "command": "uvx", "args": ["usom-mcp"] }
}
}uvx usom-mcp --transport http --host 127.0.0.1 --port 8000 # uç nokta: http://127.0.0.1:8000/mcp
claude mcp add --transport http usom http://127.0.0.1:8000/mcpKimlik doğrulaması yoktur. 127.0.0.1'de tutun; aynı HTTP sunucusuna bağlanan tüm istemciler aynı izleme listesini paylaşır.
💡 İpucu: Claude'un hangi aracı ne zaman çağıracağını ve kayıt tarihi ile kaynağı mutlaka belirtmesini öğrenmesi için SKILL.md dosyasını skill dizininize kopyalayın.
🧰 Araçlar
Araç | Ne yapar |
| URL listede mi? Tam, üst alan adı, URL yolu ve CIDR eşleşmesi |
| Alan adı (veya üst alan adı) listede mi? IDN uyumlu |
| IPv4/IPv6 tam olarak ya da listelenmiş bir ağın içinde mi? |
| En yeni kayıtlar, yeniden eskiye |
| Kelime, tür, kategori ve tarih aralığı araması |
| Kayıt sayıları, en yeni kayıt, son senkronizasyon, cache durumu |
| Kendi alan adı / IP / CIDR ağlarını yerel izleme listesine ekle |
| Kayıt çıkar |
| Listeyi göster |
| Tüm listeyi tek çağrıda tara. Alan adları için altında listelenmiş alt alan adlarını ve son kontrolden beri yeni olanları da bulur |
Her kontrol verdict (listed · not_listed · unknown) döner; her eşleşme için eşleşme tipi (exact, subdomain, www_variant, url_exact, url_prefix, cidr), kayıt tarihi, kaynak, kategori, bağlantı tipi ve kritiklik (1 = en yüksek) bulunur. Her yanıtta stale, data_origin (cache / live), cache{…} ve source vardır. Hatalı girdi çağrıyı çökertmez: ipucu içeren yapılandırılmış bir error alırsınız.
🏗️ Nasıl çalışır
Önce cache. Yerel SQLite kopyası yaklaşık 2 ms'de cevap verir. İlk açılışta her şey arka planda indirilir (50 istek, ölçülen yaklaşık 4–9 dakika, diskte ~100 MB; kaynak servis yavaştır). Hazır olana kadar
check_*canlı API'den cevap verir (data_origin: "live").Taze kalır. Saatlik artımlı güncelleme (birkaç saniye); 7 günde bir ya da kaynakla kayıt sayısı ayrışınca tam yeniden indirme, böylece silinen kayıtlar da yakalanır.
Kesintiye dayanıklı. USOM'a erişilemezse son cache ile cevap vermeye devam eder; yaş TTL'yi aşınca
stale: trueişaretlenir.Dikkatli eşleştirme. Scheme, port, kullanıcı bilgisi,
hxxp://evil[.]comgibi zararsızlaştırılmış girdiler, IDN → punycode ve IPv6 kanonik biçim normalize edilir. Listelenmiş üst alan adı alt alan adlarını kapsar; tersi geçerli değildir (bu durumwatch_checkiçinde ayrıca gösterilir).Düşmanca veriye karşı bilinçli. Liste kısmen halk ihbarlarından oluşur. Boşluk veya kontrol karakteri içeren değerler, bir dil modeline ulaşmadan reddedilir.
İsteğe bağlı zenginleştirme.
VIRUSTOTAL_API_KEYve/veyaABUSEIPDB_API_KEYtanımlayın; yalnızcaenrich=trueilecheck_*araçlarında çalışır, izleme taramalarında asla. Göstergeyi üçüncü tarafa gönderir. Anahtar yoksa hiçbir çağrı yapılmaz ve alan eklenmez.
📊 Ölçülen değerler (gerçek veri, 6 Ekim 2026)
Cache'teki kayıt | 495.817 (domain 473.243 · url 6.927 · ip 15.641 · ip6 6) |
Tam indirme | 265 sn (koşulara göre 4–9 dk) · 50 istek · ~96 MB |
Artımlı senkronizasyon | ~5 sn |
| ~1,4–2,1 ms |
| ~47 ms |
Cache ↔ canlı API | 40 / 40 rastgele kayıt birebir aynı |
⚙️ Yapılandırma (ortam değişkenleri)
Değişken | Varsayılan | Anlamı |
| platform veri dizini |
|
|
| yenileme aralığı |
| tanımsız |
|
|
| loglar stderr'e gider |
| tanımsız | isteğe bağlı zenginleştirme |
|
| CLI varsayılanları |
📡 Veri kaynağı
Veri, resmî API'den gelir: https://siberguvenlik.gov.tr/api/ (OpenAPI: /api/openapi.yaml, kimlik doğrulama yok). Eski usom.gov.tr/url-list.txt dosyası artık yok: usom.gov.tr adresi siberguvenlik.gov.tr'ye yönleniyor ve .txt paylaşımı 1 Haziran 2026'da sona erdi. Veriyi yeniden dağıtmadan önce kaynağın kullanım şartlarını okuyun. Tüm sonuçlarda kaynak T.C. Siber Güvenlik Başkanlığı / USOM olarak belirtilir.
⚠️ Sınırlamalar (lütfen okuyun)
"Listede yok" ≠ "güvenli". USOM tek bir ulusal listedir, tam bir itibar veritabanı değildir.
Kayıt zaman damgaları saat dilimi olmadan gelir; olduğu gibi aktarılır.
CIDR eşleştirmesi uygulanmıştır, ancak listede şu an ağ kaydı yoktur.
🧪 Geliştirme
uv sync
uv run pytest tests/unit -q # birim testler (çevrimdışı)
USOM_LIVE=1 uv run pytest tests/integration -m live # gerçek API'ye gider
uv run ruff check src tests && uv run mypyKatı tip denetimli, 200'den fazla çevrimdışı test, kritik yollarda mutasyon testiyle sınanmış. MIT lisanslı.
Built for defenders. 🛡️ If this saved you a phishing click, consider leaving a ⭐
Available Tools
10 toolscheck_domainCheck DomainARead-only
Check whether a domain is listed by USOM, including when a parent domain is listed.
Inputs: domain (required), enrich. Returns: kind, note, cache, error, +11 more
check_ipCheck IpARead-only
Check whether an IP address is listed by USOM, exactly or inside a listed network.
Inputs: ip (required), enrich. Returns: kind, note, cache, error, +11 more
check_urlCheck UrlARead-only
Check whether a URL is listed by USOM (exact, parent-domain, URL path or CIDR match).
Call this first when a user asks whether a link is safe. The result carries the match type, record date, source and category of every hit.
Inputs: url (required), enrich. Returns: kind, note, cache, error, +11 more
latest_threatsLatest ThreatsARead-only
Return the most recently added USOM records, newest first.
Inputs: type, limit, category. Returns: note, cache, error, items, +7 more
search_threatsSearch ThreatsCRead-only
Search the USOM list by keyword, type, category, source and date range.
Inputs: type, limit, query, offset, +6 more. Returns: note, cache, error, items, +7 more
statsStatsARead-only
Report record counts, newest record date, last sync time and cache status.
Inputs: no named parameters. Returns: cache, stale, source, by_type, +6 more
watch_addWatch AddBIdempotent
Add your own domains/IPs/networks to the local watch list.
Inputs: values (required), label. Returns: added, total, rejected, already_present
watch_checkWatch CheckB
Scan the watch list against USOM. Domains also report listed subdomains below them.
Each item shows what is new since the previous check.
Inputs: value. Returns: note, cache, clean, error, +8 more
watch_listWatch ListARead-only
List everything on the local watch list.
Inputs: no named parameters. Returns: total, entries
watch_removeWatch RemoveBDestructiveIdempotent
Remove entries from the local watch list.
Inputs: values (required). Returns: total, removed, rejected, not_found
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Most tools target clearly distinct actions or resource types: check_url, check_domain, and check_ip are well-separated, and the watch_* tools have distinct roles. search_threats and latest_threats overlap somewhat because latest_threats is a specialized recent-record query, but the descriptions make the intended use clear.
All tool names use consistent snake_case with predictable verb/noun or domain-prefixed patterns such as check_url, watch_add, and watch_list. The only minor outlier is stats, which is still readable and consistent with the overall style.
Ten tools is well-scoped for a USOM threat-intelligence and local watch-list server. Each tool covers a distinct lookup, monitoring, or watch-list operation without obvious redundancy.
The surface covers threat search, URL/domain/IP checks, recent records, stats, and full local watch-list lifecycle operations including add, remove, list, and check. This is complete for the apparent domain and supports common agent workflows without dead ends.
Maintenance
Related MCP Connectors
Threat-intelligence verdicts on a URL, domain or IP before a coding agent connects to it.
Threat-intelligence verdicts on a URL, domain or IP before a coding agent connects to it.
Free, no-API-key network lookups for AI agents — IP geolocation, DNS, WHOIS, HTTP and SSL/TLS certificate checks, and full domain health reports.
URL intelligence for AI agents and developers. 16 tools, 25 signal weights, 20 free checks.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides real-time threat intelligence for AI agents, enabling checks on IPs, domains, URLs, hashes, CVEs, prompt-injection payloads, and malicious AI-skill/MCP-tool definitions against a free database of 890K+ IOCs.-
- AlicenseNot gradedqualityCmaintenanceProvides AI agents with zero-cost, zero-dependency trust evaluation for domains, URLs, wallets, APIs, and IPs, returning a 0-100 score with SSL, DNS, WHOIS, security header, and content sub-scores, plus batch comparison to rank multiple targets.MIT
- AlicenseAqualityCmaintenanceGives AI agents threat-intelligence verdicts for IPs, domains, URLs and hashes, CVE lookups with EPSS and CISA KEV data, and a prompt-injection gate that scans untrusted text before the agent acts on it. Agents can also batch-check up to 100 indicators, hunt brand-lookalike domains, and track scan and request quotas.1203 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to inspect a URL before opening, following, or recommending it, by tracing redirect chains via headers, stripping tracking parameters, detecting phishing-style URL tricks, and cross-checking threat-intel feeds to return a SAFE, SUSPICIOUS, or DANGEROUS verdict with supporting evidence. It also scans text for embedded and defanged links and vets agent skills prior to installation.1MIT