|
|
from pathlib import Path |
|
|
from typing import NamedTuple |
|
|
|
|
|
import gradio as gr |
|
|
import gradio.themes as gr_themes |
|
|
import markdown |
|
|
|
|
|
from tdagent.tools.get_domain_information import ( |
|
|
dns_enumeration_tool, |
|
|
extractor_of_ioc_from_threatfox_tool, |
|
|
geo_location_tool, |
|
|
scrap_subdomains_tool, |
|
|
) |
|
|
from tdagent.tools.get_url_content import gr_make_http_request |
|
|
from tdagent.tools.internal_company_user_search import gr_internal_company |
|
|
from tdagent.tools.lookup_company_cloud_account_information import ( |
|
|
gr_lookup_company_cloud_account_information, |
|
|
) |
|
|
from tdagent.tools.query_abuse_ip_db import gr_query_abuseipdb |
|
|
from tdagent.tools.rdap import gr_query_rdap |
|
|
from tdagent.tools.retrieve_from_mitre_attack import gr_get_stix_of_attack_id |
|
|
from tdagent.tools.send_email import gr_send_email |
|
|
from tdagent.tools.virus_total import gr_virus_total_url_info |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _read_markdown_body_as_html(path: str = "README.md") -> str: |
|
|
with Path(path).open(encoding="utf-8") as f: |
|
|
lines = f.readlines() |
|
|
|
|
|
|
|
|
if lines and lines[0].strip() == "---": |
|
|
for i in range(1, len(lines)): |
|
|
if lines[i].strip() == "---": |
|
|
lines = lines[i + 1:] |
|
|
break |
|
|
|
|
|
markdown_body = "".join(lines).strip() |
|
|
return markdown.markdown(markdown_body) |
|
|
|
|
|
|
|
|
class ToolInfo(NamedTuple): |
|
|
"""Gradio MCP tool info.""" |
|
|
|
|
|
name: str |
|
|
interface: gr.Interface |
|
|
|
|
|
|
|
|
TOOLS = ( |
|
|
ToolInfo("Make an HTTP request to a URL with specified method and parameters", gr_make_http_request), |
|
|
ToolInfo("Query AbuseIPDB", gr_query_abuseipdb), |
|
|
|
|
|
|
|
|
ToolInfo("Query RDAP", gr_query_rdap), |
|
|
ToolInfo("Virus Total URL info", gr_virus_total_url_info), |
|
|
ToolInfo("Get IP's Location", geo_location_tool), |
|
|
ToolInfo("DNS Enumerator", dns_enumeration_tool), |
|
|
ToolInfo("Subdomain Retriever", scrap_subdomains_tool), |
|
|
ToolInfo("Extractor of IoCs", extractor_of_ioc_from_threatfox_tool), |
|
|
ToolInfo("ATT&CK STIX information", gr_get_stix_of_attack_id), |
|
|
|
|
|
ToolInfo("Fake company directory", gr_internal_company), |
|
|
ToolInfo( |
|
|
"Fake company cloud accounts", |
|
|
gr_lookup_company_cloud_account_information, |
|
|
), |
|
|
ToolInfo("Send email", gr_send_email), |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
custom_css = """ |
|
|
.main-header { |
|
|
background: linear-gradient(135deg, #00a388 0%, #ffae00 100%); |
|
|
padding: 30px; |
|
|
border-radius: 5px; |
|
|
margin-bottom: 20px; |
|
|
text-align: center; |
|
|
} |
|
|
""" |
|
|
with ( |
|
|
gr.Blocks( |
|
|
theme=gr_themes.Origin( |
|
|
primary_hue="teal", |
|
|
spacing_size="sm", |
|
|
font="sans-serif", |
|
|
), |
|
|
title="TDAgent", |
|
|
fill_height=True, |
|
|
fill_width=True, |
|
|
css=custom_css, |
|
|
) as gr_app, |
|
|
): |
|
|
gr.HTML( |
|
|
""" |
|
|
<div class="main-header"> |
|
|
<h1>π©βπ» TDAgentTools & TDAgent π¨βπ»</h1> |
|
|
<p style="font-size: 1.2em; margin: 10px 0 0 0;"> |
|
|
Empowering Cybersecurity with Agentic AI |
|
|
</p> |
|
|
</div> |
|
|
""", |
|
|
) |
|
|
with gr.Tabs(): |
|
|
with gr.TabItem("About"): |
|
|
html_content = _read_markdown_body_as_html("README.md") |
|
|
gr.Markdown(html_content) |
|
|
with gr.TabItem("TDAgentTools"): |
|
|
gr.TabbedInterface( |
|
|
interface_list=[t_info.interface for t_info in TOOLS], |
|
|
tab_names=[t_info.name for t_info in TOOLS], |
|
|
title="TDAgentTools", |
|
|
) |
|
|
with gr.TabItem("Demo"): |
|
|
gr.Markdown( |
|
|
""" |
|
|
This is a demo of TDAgentTools, a simple MCP server. |
|
|
Be carefull with using well-known urls for malware distribution |
|
|
when using the url content extractor tool. |
|
|
""", |
|
|
) |
|
|
gr.HTML( |
|
|
"""<iframe width="560" height="315" src="https://youtube.com/embed/c7Yg_jOD6J0" frameborder="0" allowfullscreen></iframe>""", |
|
|
|
|
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
gr_app.launch(mcp_server=True) |
|
|
|