从CLI到AI代理:User Scanner MCP服务器的架构设计与源码剖析
【免费下载链接】user-scanner🕵️♂️ (2-in-1) Email & Username OSINT suite featuring native MCP support for deep data extraction just from a single Email/Username. Analyzes 550+ actively maintained scan vectors (175+ email / 375+ username) for security research, investigations, and digital footprinting.项目地址: https://gitcode.com/GitHub_Trending/us/user-scanner
User Scanner 是一个 2 合 1 的 OSINT 数字足迹扫描套件,仅凭单个邮箱或用户名即可在 550+ 个扫描向量(175+ 邮箱 / 375+ 用户名平台)上执行安全研究与画像分析。本文带你完整剖析它原生MCP 服务器的架构设计与源码实现——看看一个纯 CLI 工具是如何变成 Claude Desktop、Cursor 等 AI 代理随时可调用的智能扫描引擎的。
一、为什么OSINT工具需要MCP服务器?
传统工作流中,OSINT 调查全靠人工:你在终端输入user-scanner -u johndoe,盯着进度条,再把结果手动喂给分析工具。
MCP(Model Context Protocol,模型上下文协议)改变了这一切。它为 AI 大模型提供了一组标准化的"工具接口":AI 代理不再只是"聊天",而是能自主调用真实程序执行任务。
对 User Scanner 来说,接入 MCP 意味着:
- 🤖自主调查:AI 可以直接调用
scan_username发起 550+ 平台的深度扫描 - 🔀递归情报挖掘:通过
cross_scan参数,AI 自动从画像中挖出备用用户名、邮箱并二次扫描 - 🧭动态发现:AI 能先查询
list_available_modules弄清支持哪些平台,再决定扫描范围
整个 MCP 服务器只有 3 个文件、约 470 行代码,却能驱动一个高并发扫描引擎——这正是本文要拆解的核心。
二、整体架构:三层极简设计
MCP 服务器位于 user_scanner/mcp/ 目录,职责划分清晰:
| 文件 | 职责 | 规模 |
|---|---|---|
| server.py | stdio 入口、JSON-RPC 路由、日志配置 | 70 行 |
| schemas.py | 定义暴露给 AI 的工具清单与参数 Schema | 186 行 |
| handlers.py | 参数解析、调用扫描编排器、组装响应 | 211 行 |
入口点在 pyproject.toml 中注册为独立可执行脚本:
user-scanner-mcp = "user_scanner.mcp.server:main"MCP 依赖被设计为可选扩展(pyproject.toml 中mcp = ["mcp>=1.2.0,<2"]),普通用户装基础版不受影响,AI 场景才执行pip install "user-scanner[mcp]"。
💡 架构精髓:MCP 层不实现任何扫描逻辑,它只是翻译官——把 AI 的 JSON 参数翻译成核心编排器的调用,与 CLI 共享同一套扫描引擎。
三、server.py:70行代码的stdio入口
3.1 双通道设计:stdout说话,stderr记录
MCP 协议走标准输入/输出的 JSON-RPC 流,因此任何混入 stdout 的杂音都会摧毁通信。server.py 的第一处关键设计就是日志分流(server.py#L17-L23):
logging.basicConfig( level=logging.INFO, stream=sys.stderr, )3.2 两个装饰器完成全部路由
服务本体极其精简:@app.list_tools()声明工具清单,@app.call_tool()分发执行请求(server.py#L28-L37),全部委托给 schemas 和 handlers。启动时run()通过stdio_server()接管标准流(server.py#L40-L47)。
还有一个贴心细节:缺依赖时给出明确指引而非崩溃(server.py#L6-L12)——未安装mcp包会提示pip install user-scanner[mcp]后优雅退出。-v参数则可切换详细日志级别,方便排障。
四、schemas.py:写给AI看的"工具说明书"
对 AI 来说,Schema 的 description 就是它的"操作手册"。get_tool_list() 声明了 3 个工具:
| 工具 | 作用 |
|---|---|
scan_username | 跨平台用户名深度扫描 + 元数据富化 |
scan_email | 跨平台邮箱注册验证与账号发现 |
list_available_modules | 动态发现所有支持的分类与平台 |
4.1 参数 Schema 的复用技巧
注意 basic_props 与 cross_scan_props 被抽成公共字典,分别update进两个扫描工具的参数表——新增一个全局参数,两个工具自动同步,这是典型的 DRY 实践。
4.2 把"安全默认值"写进描述里
最精彩的是allow_loud的描述文案(schemas.py#L73-L81):明确警告"仅当不需要隐蔽时才设 true,会触发密码重置邮件并惊动目标",默认 stealth 模式。等于给 AI 代理装上了安全护栏,防止它误发"高声"请求。
交叉扫描的 5 个参数(cross_scan/cross_links/cross_emails/cross_depth/cross_sweep)每个都有中文语义级说明,AI 能据此自主决定挖掘深度——更深但更慢的调查,完全由代理权衡。
五、handlers.py:把AI参数翻译成引擎调用
handlers.py 是整个服务器的"心脏",有 4 个值得学习的设计。
5.1 锁串行化:并发请求不打架
MCP 客户端可能同时发起多次工具调用,而扫描引擎依赖模块级全局状态(代理、超时、并发数)。一把asyncio.Lock解决了全部竞争(handlers.py#L40-L41):
_scan_lock = asyncio.Lock()5.2 try/finally 保证状态"用完即还原"
execute_scan() 在锁内应用代理/超时/并发配置,finally块确保无论成败都恢复默认值(handlers.py#L76-L123)——第 N 次请求永远从干净环境开始,这是长驻服务进程的经典防御。
5.3 二次stdout防护:重定向print
编排器内部仍有面向终端的print()输出。handlers 用contextlib.redirect_stdout(sys.stderr)把它们全部劫持到 stderr(handlers.py#L97-L102),再配合asyncio.to_thread把阻塞式扫描丢进线程,既不卡事件循环,也不污染 JSON-RPC 流。
5.4 结构化响应包:AI友好的输出
结果不是原始文本,而是带统计摘要的 JSON 信封(handlers.py#L125-L147):summary给出总数/命中/未找到/错误/跳过的计数,results只含命中项,errored_sites单列失败站点——AI 代理拿到即可直接推理,无需解析噪声。
工具路由本身是一个 3 分支的call_tool()(handlers.py#L198-L211),未知工具名会记录日志并抛出明确错误。
六、底层引擎:CLI与MCP共用同一套扫描核心
MCP 层之所以薄,是因为扫描能力全部沉淀在 user_scanner/core/:
- 动态模块发现:load_modules() 用
importlib扫描分类目录,每个平台就是一个含validate_{名称}函数的模块——新增平台零注册成本 - 统一调度:handlers 调用与 CLI 完全相同的 orchestrator.py(
run_user_full/run_email_full_batch等),保证两条入口行为一致 - 并发引擎:信号量 + 线程池实现默认 60 并发请求(orchestrator.py#L27-L33),
httpx+curl_cffi提供 TLS 指纹伪装 - loud 门控:高危模块(如触发重置邮件的邮箱站,见 helpers.py#L27-L61)在未授权时返回
skipped而非静默执行(orchestrator.py#L60-L61)
想深入了解各层行为,官方文档是最好的配套读物:
- 交叉扫描与置信度模型:docs/CROSS_SCAN.md
- CLI 完整参数手册:docs/FLAGS.md
- Python 库模式调用指南:docs/USAGE.md
- 通配符模式语法:docs/PATTERNS.md
七、快速上手:三步接入你的AI代理 🚀
# 第1步:安装带MCP扩展的版本 pip install "user-scanner[mcp]"第 2 步:在客户端配置(如claude_desktop_config.json或mcp_config.json)中注册服务器:
{ "mcpServers": { "user-scanner": { "command": "user-scanner-mcp" } } }第 3 步:重启客户端,直接用自然语言下指令,例如"用 stealth 模式扫描用户名 johndoe,只看开发平台分类,命中后递归挖掘两跳"——AI 会自主组装module/category + cross_scan + cross_depth参数完成整条调查链路。
🔍 想阅读源码?克隆仓库即可:
git clone https://gitcode.com/GitHub_Trending/us/user-scanner,核心路径见下文清单。
八、源码阅读路线与扩展建议
推荐按依赖顺序阅读(全部相对仓库根目录):
- user_scanner/mcp/server.py —— 70 行,10 分钟掌握 stdio MCP 骨架
- user_scanner/mcp/schemas.py —— 学习如何为 AI 编写高信息量 Schema
- user_scanner/mcp/handlers.py —— 全局状态管理 + stdout 防护的完整范例
- user_scanner/core/orchestrator.py —— 并发调度与 loud 门控
- tests/test_mcp_handlers.py —— 查看工具调用的期望行为与断言
动手扩展:新增工具只需在 schemas.py 的get_tool_list()追加一个types.Tool,再在 handlers.py 的call_tool()加一个路由分支——这正是"薄适配层 + 厚核心引擎"架构的魅力所在。
⚠️合规提醒:User Scanner 仅面向教育用途、授权安全研究与防御性 OSINT 调查。请只在获得明确授权的目标上使用,开发者不对任何滥用行为负责。
【免费下载链接】user-scanner🕵️♂️ (2-in-1) Email & Username OSINT suite featuring native MCP support for deep data extraction just from a single Email/Username. Analyzes 550+ actively maintained scan vectors (175+ email / 375+ username) for security research, investigations, and digital footprinting.项目地址: https://gitcode.com/GitHub_Trending/us/user-scanner
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考