Skip to main content
Glama

🛡️ usom-mcp

Türkiye'nin ulusal zararlı bağlantı istihbaratı, AI ajanlarının parmaklarının ucunda.

CI Python MCP Typed License Records

⚡ ~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 exit

Until 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/mcp

There 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

check_url(url, enrich=false)

Is this URL listed? Exact, parent-domain, URL-path and CIDR matching

check_domain(domain, enrich=false)

Is this domain (or a parent of it) listed? IDN-safe

check_ip(ip, enrich=false)

Is this IPv4/IPv6 listed, exactly or inside a listed network?

latest_threats(limit, type, category)

Newest records, newest first

search_threats(query, type, category, source, connection_type, max_criticality_level, date_from, date_to, limit, offset)

Keyword, type, category and date-range search

stats()

Record counts, newest record, last sync, cache state

watch_add(values, label)

Add your own domains / IPs / CIDR networks to a local watch list

watch_remove(values)

Remove entries

watch_list()

Show the list

watch_check(value=None)

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" .-> U
  • Cache-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: true once 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 in watch_check instead).

  • 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_KEY and/or ABUSEIPDB_API_KEY; used only for check_* with enrich=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

check_domain / check_url / check_ip

~1.4–2.1 ms

search_threats (substring over 496k rows)

~47 ms

Cache vs. live API

40 / 40 random records identical

⚙️ Configuration

Variable

Default

Meaning

USOM_MCP_HOME

platform data dir

where cache.db and watch.db live

USOM_MCP_TTL_SECONDS

3600

refresh interval

USOM_MCP_NO_SYNC

unset

1 disables network refreshes (offline use)

USOM_MCP_LOG_LEVEL

INFO

logs go to stderr

VIRUSTOTAL_API_KEY, ABUSEIPDB_API_KEY

unset

optional enrichment

USOM_MCP_TRANSPORT, _HOST, _PORT, _PATH

stdio, 127.0.0.1, 8000, /mcp

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 mypy

Strictly typed, 200+ offline tests, mutation-checked on the critical paths. MIT licensed.


Related MCP server: Nullcone MCP Server

🇹🇷 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/mcp

Kimlik 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

check_url(url, enrich=false)

URL listede mi? Tam, üst alan adı, URL yolu ve CIDR eşleşmesi

check_domain(domain, enrich=false)

Alan adı (veya üst alan adı) listede mi? IDN uyumlu

check_ip(ip, enrich=false)

IPv4/IPv6 tam olarak ya da listelenmiş bir ağın içinde mi?

latest_threats(limit, type, category)

En yeni kayıtlar, yeniden eskiye

search_threats(query, type, category, source, connection_type, max_criticality_level, date_from, date_to, limit, offset)

Kelime, tür, kategori ve tarih aralığı araması

stats()

Kayıt sayıları, en yeni kayıt, son senkronizasyon, cache durumu

watch_add(values, label)

Kendi alan adı / IP / CIDR ağlarını yerel izleme listesine ekle

watch_remove(values)

Kayıt çıkar

watch_list()

Listeyi göster

watch_check(value=None)

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: true işaretlenir.

  • Dikkatli eşleştirme. Scheme, port, kullanıcı bilgisi, hxxp://evil[.]com gibi 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 durum watch_check iç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_KEY ve/veya ABUSEIPDB_API_KEY tanımlayın; yalnızca enrich=true ile check_* 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

check_domain / check_url / check_ip

~1,4–2,1 ms

search_threats (496 bin satırda alt dize)

~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ı

USOM_MCP_HOME

platform veri dizini

cache.db ve watch.db konumu

USOM_MCP_TTL_SECONDS

3600

yenileme aralığı

USOM_MCP_NO_SYNC

tanımsız

1 ağ yenilemelerini kapatır (çevrimdışı kullanım)

USOM_MCP_LOG_LEVEL

INFO

loglar stderr'e gider

VIRUSTOTAL_API_KEY, ABUSEIPDB_API_KEY

tanımsız

isteğe bağlı zenginleştirme

USOM_MCP_TRANSPORT, _HOST, _PORT, _PATH

stdio, 127.0.0.1, 8000, /mcp

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 mypy

Katı tip denetimli, 200'den fazla çevrimdışı test, kritik yollarda mutasyon testiyle sınanmış. MIT lisanslı.


Built for defenders. 🛡️ &nbsp; If this saved you a phishing click, consider leaving a ⭐

Available Tools

10 tools
check_domainCheck DomainA
Read-only

Check whether a domain is listed by USOM, including when a parent domain is listed.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesDomain such as login.example.com (IDN ok).
enrichNoAlso query VirusTotal (needs VIRUSTOTAL_API_KEY).

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYes
noteNo
cacheYes
errorNo
inputYes
staleYesTrue when a refresh failed and cached data may be outdated; warn the user.
sourceNo
matchesNo
verdictYes
warningsNo
enrichmentNo
normalizedNo
data_originYes
enrichment_errorsNo
timestamps_timezoneNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds a genuinely non-obvious behavioral trait: a domain is reported as listed even if only a parent domain is on the list. It does not mention rate limits or the VirusTotal enrichment path whenever enrich is used.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with the primary behavior front-loaded and the parent-domain caveat trailing as a qualifier. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. The description conveys what is checked and the parent-domain nuance, which covers the core behavior. It leaves the choice among sibling check tools unaddressed, a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (domain including IDN, enrich with its API-key requirement) are fully documented in the schema. The description adds nothing about parameters, which is acceptable given full schema coverage and yields the baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: check whether a domain is listed by USOM. The mention of parent-domain listing further sharpens scope. It does not explicitly contrast itself with siblings check_url or check_ip, but the domain-specific framing makes the resource clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to use this tool versus check_url, check_ip, or watch_check. There are no prerequisites or exclusions mentioned. The agent must infer usage purely from the name and resource type.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_ipCheck IpA
Read-only

Check whether an IP address is listed by USOM, exactly or inside a listed network.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYesIPv4 or IPv6 address.
enrichNoAlso query VirusTotal and AbuseIPDB (needs the matching API keys).

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYes
noteNo
cacheYes
errorNo
inputYes
staleYesTrue when a refresh failed and cached data may be outdated; warn the user.
sourceNo
matchesNo
verdictYes
warningsNo
enrichmentNo
normalizedNo
data_originYes
enrichment_errorsNo
timestamps_timezoneNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already establish readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context by identifying the data source (USOM) and the matching semantics (exact or inside a listed network), though it does not mention external API dependencies or rate limits for the optional enrichment path.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that states the tool's action and its two matching modes. There is no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existing output schema and annotations, the description is nearly complete: it identifies the source and matching behavior. A minor gap is that it does not mention the optional external enrichment behavior, though the schema already documents that parameter and its API-key requirement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema, including the enrich flag and its API-key requirement. The description does not add param-level syntax or format details beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: check whether an IP address is listed by USOM. It also specifies the scope of matching (exactly or inside a listed network), which distinguishes it from related check_url and check_domain siblings without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the purpose: use this when checking an IP address against USOM. However, the description does not explicitly say when to prefer this over check_domain, check_url, or search_threats, nor does it mention exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_urlCheck UrlA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to check, e.g. https://example.com/login
enrichNoAlso query VirusTotal (needs VIRUSTOTAL_API_KEY).

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYes
noteNo
cacheYes
errorNo
inputYes
staleYesTrue when a refresh failed and cached data may be outdated; warn the user.
sourceNo
matchesNo
verdictYes
warningsNo
enrichmentNo
normalizedNo
data_originYes
enrichment_errorsNo
timestamps_timezoneNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds matching semantics (exact, parent-domain, URL path, CIDR) and names the result fields (match type, date, source, category), which go beyond annotations, though no auth or rate-limit details are provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus a parenthetical, front-loaded with purpose and then the usage trigger. Every sentence earns its place with no redundant framing or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, read-only and open-world annotations, and full parameter descriptions, the definition supplies the purpose, trigger, match semantics, and result composition an agent needs. Nothing material is missing for a read-only lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters are fully documented in the schema. The description adds no syntax, format, or usage detail for 'url' or 'enrich', so the schema carries the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Check whether') and resource ('a URL'), plus the four match types (exact, parent-domain, URL path, CIDR). It does not name or contrast with sibling tools such as check_domain or check_ip, so sibling differentiation relies on the resource name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call this first when a user asks whether a link is safe,' giving a clear trigger condition. It offers no when-not guidance or alternatives for domain/IP checks, so it provides context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

latest_threatsLatest ThreatsA
Read-only

Return the most recently added USOM records, newest first.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoRestrict to one indicator type.
limitNoHow many records (1-200).
categoryNoCategory code: PH, BP, MD, MI, MU, MC or CA.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
cacheYes
errorNo
itemsYes
staleYesTrue when a refresh failed and cached data may be outdated; warn the user.
offsetYes
sourceNo
returnedYes
data_originYes
total_countYes
timestamps_timezoneNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-data scope are covered. The description contributes the result ordering, which is useful behavioral context, but says nothing about result volume, pagination, or what a 'USOM record' contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the ordering constraint front-loaded and no filler. Nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the safety profile, the description only needs to convey scope and ordering, which it does. The remaining gap is the lack of any sibling differentiation against search_threats.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with type/limit/category all documented in the schema including enum values and the 1-200 bound. The description adds no parameter-level detail, so the schema does all the work and the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the most recently added USOM records') and adds the ordering guarantee ('newest first'), which is genuinely informative. However, it never distinguishes itself from the sibling search_threats, so an agent must infer the difference from the name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'most recently added ... newest first' implies this is the tool for chronological/recency browsing rather than targeted lookup, which is usable guidance. But there is no explicit when-to-use statement, no mention of the alternative search_threats, and no exclusions, so the routing decision is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_threatsSearch ThreatsC
Read-only

Search the USOM list by keyword, type, category, source and date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoIndicator type.
limitNoPage size (1-200).
queryNoCase-insensitive substring of the listed value.
offsetNoRecords to skip.
sourceNoSource code: US, SO, RS, IH or SB.
date_toNoYYYY-MM-DD (whole day included) or with time.
categoryNoCategory code (PH, BP, ...).
date_fromNoYYYY-MM-DD or YYYY-MM-DD HH:MM[:SS], inclusive.
connection_typeNoConnection type code (AC, BC, EK, MC, MF, MM, OT, PH).
max_criticality_levelNoKeep records at this level or more critical (1 = max).

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
cacheYes
errorNo
itemsYes
staleYesTrue when a refresh failed and cached data may be outdated; warn the user.
offsetYes
sourceNo
returnedYes
data_originYes
total_countYes
timestamps_timezoneNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing behavioral beyond that—no pagination/default-limit behavior, no indication of result ordering or scope limits across the USOM list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with the resource and filter axes front-loaded and no wasted words. It is efficient, though terseness here shades into under-specification rather than elegance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the schema fully covers parameters. However, for a 10-parameter open-world search tool, the description omits practical context such as paging behavior, default page size, and how it relates to sibling search tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all ten parameters are already documented with formats, enums and ranges (e.g., source codes, date formats, criticality direction). The description only gestures at the same filter axes, adding no syntax or semantics beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Search') and resource ('the USOM list') plus the filter axes it accepts. It is clear about what the tool does, but it never names or distinguishes itself from siblings like latest_threats, which also surface threat data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is given: it does not say when to prefer this over latest_threats or the check_* lookup tools, nor when a search is inappropriate. The filter list implies usage but leaves the agent to infer routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statsStatsA
Read-only

Report record counts, newest record date, last sync time and cache status.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
cacheYes
staleYesTrue when a refresh failed and cached data may be outdated; warn the user.
sourceNo
by_typeYes
by_sourceYes
by_categoryYes
data_originYes
total_recordsYes
newest_record_dateYes
timestamps_timezoneNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful content context (what data the cache/index exposes), but says nothing about freshness guarantees, cost, or whether the stats reflect the same source the sibling lookups query.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, no filler, front-loaded with the action and then the four returned fields. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only status endpoint with an output schema already present, the description is nearly sufficient. Only the missing guidance on when to consult stats (and how it relates to the sibling lookups) keeps it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies. The description correctly does not invent any parameter discussion, and the schema's additionalProperties:false is consistent with the parameterless call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (Report) and enumerates the exact data points returned: record counts, newest record date, last sync time, cache status. Clearly distinguishable from the threat-lookup siblings, which all deal with individual indicators rather than cache/index metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to prefer this over siblings or what situation calls for a stats check (e.g. diagnosing stale cache before a search returns nothing). Usage is only inferable from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

watch_addWatch AddB
Idempotent

Add your own domains/IPs/networks to the local watch list.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoOptional note, e.g. the owning team.
valuesYesDomains, IPs, URLs or CIDR networks to monitor.

Output Schema

ParametersJSON Schema
NameRequiredDescription
addedYes
totalYes
rejectedYes
already_presentYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and openWorldHint=false, so the safety/repeat behavior is covered. The description adds the genuinely useful scope detail that entries go to a 'local' watch list rather than a shared one, but says nothing about how duplicate entries are reconciled or whether additions are persisted across restarts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the verb first and zero filler. Nothing in it is redundant with the name or schema, and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the input surface is trivial (one required array plus an optional label). Still, for a mutation-style tool the definition omits the preconditions and follow-up actions an agent would want, leaving it merely adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (label, values) are already documented in the schema; the baseline is 3. The description loosely corroborates the 'values' parameter by naming domains/IPs/networks, but contributes no syntax, format, or label semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Add') plus resource and target ('your own domains/IPs/networks to the local watch list'), so the operation is unmistakable. It does not explicitly name or contrast with the nearest siblings (watch_remove, watch_list, watch_check), but the add/remove/list distinction is self-evident from the wording.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisite or exclusion, and no routing to alternatives such as watch_check (to test an entry now) or watch_list (to inspect existing entries). Usage is only implied by the verb 'Add'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNoOne watched entry; omit to scan the whole list in one call.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
cacheYes
cleanYes
errorNo
itemsYes
staleYesTrue when a refresh failed and cached data may be outdated; warn the user.
listedYes
sourceNo
checkedYes
unknownYes
data_originYes
timestamps_timezoneNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide only openWorldHint=true, so the description carries most of the behavioral burden. It usefully discloses that domains report listed subdomains and that each item shows what is new since the previous check, but it does not state read-only status, authentication requirements, rate limits, or side effects. The added output behavior is helpful but incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded around the core action. The second sentence about new items and the subdomain note are useful but slightly clipped, leaving them a bit cryptic rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description does not need to enumerate return values, and it still adds relevant behavioral context about deltas and subdomains. However, for an open-world scan tool with minimal annotations, it leaves out important operational context such as permissions or expected scan scope beyond the watch list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single optional parameter already documents that omitting value scans the entire watch list. The description adds no further parameter syntax, filtering, or formatting details beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: scanning the watch list against USOM. It adds useful scope details, including subdomain reporting and delta reporting since the previous check. It does not explicitly distinguish itself from siblings such as watch_list, but the purpose is clear without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explain when to use this tool versus alternatives like watch_list, check_domain, or check_url. The only usage-like guidance is embedded in the parameter schema, which says to omit value to scan the whole list; that is parameter behavior, not tool selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

watch_listWatch ListA
Read-only

List everything on the local watch list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
entriesYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds only that the list is 'local', which mildly reinforces the no-external-calls signal but says nothing about result size, ordering, or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the verb and scope come first. Nothing in it is wasted or repeated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail is unnecessary, and the description supplies the one thing structured fields cannot: that this enumerates the entire local list. It could be stronger by contrasting explicitly with watch_check, but nothing essential is missing for a zero-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case. The description correctly implies no filtering or arguments are needed to enumerate the list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('local watch list'), and the word 'everything' signals full enumeration rather than a targeted lookup. The meaning is clear against siblings like watch_add/watch_remove, though the description never explicitly names an alternative to contrast with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: an agent can infer this is for browsing the whole watch list versus watch_check for a single entry. There is no explicit when-to-use guidance, no exclusions, and no named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

watch_removeWatch RemoveB
DestructiveIdempotent

Remove entries from the local watch list.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYesEntries to remove from the watch list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
removedYes
rejectedYes
not_foundYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already disclose destructiveHint=true, idempotentHint=true, and openWorldHint=false. The description adds no behavioral context beyond that, such as what happens to missing entries, whether the operation is silent, or any rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no unnecessary words. It is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple one-parameter schema, existing output schema, and annotations covering safety, the description states the core action. However, it omits usage guidance and sibling differentiation, leaving some contextual gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the single parameter is fully documented in the schema. The description repeats the schema's meaning without adding syntax, limitations, or format details, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: remove entries from the local watch list. It is clear what the tool does, but it does not explicitly distinguish itself from related siblings such as watch_add or watch_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool, when not to use it, or which alternatives to prefer. The description only restates the action without providing context for invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.0
    • First observedcheck_domain
    • First observedcheck_ip
    • First observedcheck_url
    • First observedlatest_threats
    • First observedsearch_threats
    • First observedstats
    • First observedwatch_add
    • First observedwatch_check
    • First observedwatch_list
    • First observedwatch_remove

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to check URL safety before fetching content, using Google Web Risk, URLhaus, PhishTank, and AI analysis to return SAFE/SUSPICIOUS/DANGEROUS verdicts.
    1
    55 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides 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.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to check trustworthiness before recommending URLs, products, or organizations, with fail-closed pass/fail verdicts and attested-only recommendations.
    MIT