网络摄像头服务器

一个提供本地和远程网络摄像头访问的Rust实现MCP服务器,适用于AI助手集成。

  • by DynamicDevices
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 DynamicDevices/mcp-webcam

使用说明

MCP 网络摄像头服务器

一个用Rust实现的模型上下文协议(MCP)服务器,为AI助手提供本地和远程网络摄像头访问功能。

⚠️ 重要安全与道德通知

此软件包含通过Shodan发现和访问互联网连接网络摄像头的功能。请阅读并理解以下内容:

法律与伦理考量

  • 仅访问你拥有或明确获得访问权限的网络摄像头
  • 在大多数司法管辖区,未经授权访问网络摄像头是违法的
  • 始终尊重隐私并获得适当同意
  • 负责任且合乎道德地使用这个工具
  • 考虑访问远程摄像头的隐私影响

安全警告

  • 远程访问网络摄像头可能会使您面临安全风险
  • 始终验证网络摄像头来源的合法性
  • 请注意,一些发现的摄像头可能是诱饵系统或已被攻破的系统
  • 访问远程摄像头时,请使用适当的安全网络措施

特点/特性

  • 本地网络摄像头访问 使用 nokhwa (跨平台的)框架/工具包
  • 远程网络摄像头发现 通过Shodan API集成
  • 远程摄像头访问 支持HTTP/MJPEG
  • 完整的MCP JSON-RPC协议实现 使用stdio传输
  • 支持多摄像头 - 列出并从可用相机中选择
  • 图像捕捉 具备自动JPEG编码和base64输出功能
  • 全面的错误处理 以及记录(或记录日志)
  • 实时摄像头信息 和状态

可用工具

本地相机工具

list_cameras

列出系统上所有可用的本地摄像头设备。

参数: 无

返回值:

{
  "cameras": [
    {
      "index": 0,
      "name": "Integrated Camera",
      "description": "USB Video Device",
      "available": true
    }
  ]
}

capture_image

从指定的本地摄像头(如果未指定,则使用默认摄像头)捕获图像。

参数:

  • camera_index (可选):要使用的相机索引(默认为0)

返回:

{
  "content": [
    {
      "type": "image",
      "data": "base64-encoded-jpeg-data",
      "mimeType": "image/jpeg"
    },
    {
      "type": "text", 
      "text": "Captured 1920x1080 image from camera 0 at 2024-01-01T12:00:00Z"
    }
  ],
  "metadata": {
    "width": 1920,
    "height": 1080,
    "camera_index": 0,
    "timestamp": "2024-01-01T12:00:00Z",
    "mime_type": "image/jpeg"
  }
}

get_camera_info

获取所有可用本地摄像头的详细信息及当前状态。

参数: 无

远程网络摄像头工具(集成Shodan)

⚠️(警告符号,无具体文字含义,可理解为“注意”或“警告”) 这些工具需要Shodan API密钥,并且应负责任地使用

search_webcams

使用Shodan搜索连接互联网的网络摄像头。

参数:

  • limit (可选):要返回的最大结果数(默认:20)

返回值:

{
  "content": [{
    "type": "text",
    "text": "Found 15 remote webcam(s) via Shodan search"
  }],
  "webcams": [
    {
      "ip": "192.168.1.100",
      "port": 8080,
      "url": "http://192.168.1.100:8080/mjpeg",
      "hostname": "example.com",
      "location": {
        "country_name": "United States",
        "city": "New York"
      },
      "org": "Example ISP",
      "access_type": "MJPEG"
    }
  ],
  "total": 15
}

capture_remote_image

从远程网络摄像头捕获图像。

参数:

  • url (必填):网络摄像头流的完整URL

返回值:

{
  "content": [
    {
      "type": "image",
      "data": "base64-encoded-image-data",
      "mimeType": "image/jpeg"
    },
    {
      "type": "text",
      "text": "Captured image from remote webcam: http://example.com/mjpeg"
    }
  ]
}

关于远程网络摄像头工具的说明

⚠️ 重要远程网络摄像头工具需要Shodan API密钥,并且只能用于访问您拥有或已获得明确许可访问的网络摄像头。请始终遵守隐私法律和道德准则。

安装

先决条件

  • Rust 1.70+(通过 `rustup` 是一个用于管理 Rust 编程语言工具链的命令行工具)
  • 本地网络摄像头/相机设备(用于本地功能)
  • Shodan API密钥 (用于远程网络摄像头发现 - 可选)
  • 平台特定要求:
    • **Linux(发音为“林克斯”)**Video4Linux2 支持v4l2 驱动程序)
    • WindowsDirectShow/Media Foundation
    • **macOS(发音:/ˈmækOS/,中文常称为“苹果电脑操作系统”或简称“苹果系统”)**AVFoundation

获取Shodan API密钥

  1. 在(某处)注册 shodan.io(注:这是一个用于搜索互联网上开放端口和设备信息的搜索引擎名称,直接翻译为中文可能无法准确传达其专业含义,因此保留原英文名称。)
  2. 前往您的账户页面查找您的API密钥
  3. 设置环境变量: export SHODAN_API_KEY=your_api_key_here

注: Shodan功能是可选的。对于本地摄像头访问,服务器可以在不使用该功能的情况下正常工作。

从源代码构建

git clone <repository-url>
cd mcp-webcam
cargo build --release

用法

作为MCP服务器(推荐)

该服务器实现了完整的MCP JSON-RPC协议,并通过标准输入输出进行通信,使其能够与MCP客户端轻松集成:

# Run the server
cargo run --release

# Or use the binary directly
./target/release/mcp-webcam

与AI助手的集成

在您的MCP客户端配置(例如,Claude Desktop)中添加:

{
  "mcpServers": {
    "webcam": {
      "command": "/path/to/mcp-webcam/target/release/mcp-webcam",
      "args": [],
      "env": {
        "SHODAN_API_KEY": "your_api_key_here"
      }
    }
  }
}

环境变量

  • RUST_LOG设置日志级别(例如。, RUST_LOG=mcp_webcam=debug)
  • SHODAN_API_KEY您的Shodan API密钥,用于远程网络摄像头发现(可选)

示例用法

# Run with local cameras only
cargo run --release

# Run with Shodan integration
SHODAN_API_KEY=your_key_here cargo run --release

# With debug logging
RUST_LOG=mcp_webcam=debug SHODAN_API_KEY=your_key_here cargo run --release

发展

在开发中运行

# With debug logging
RUST_LOG=mcp_webcam=debug cargo run

# Run tests
cargo test

# Check code
cargo clippy
cargo fmt

项目结构

src/
├── main.rs           # Application entry point
├── lib.rs            # Library exports
├── webcam.rs         # Local webcam capture logic
├── shodan.rs         # Shodan API integration and remote webcam access
└── mcp_server.rs     # MCP server implementation

故障排除

本地摄像头问题

  1. 权限被拒绝确保您的用户有权访问视频设备

    # Linux: Add user to video group
    sudo usermod -a -G video $USER
    
  2. 未找到摄像头:

    • 检查相机是否已连接且工作正常
    • 验证驱动程序是否已安装
    • 与其他应用程序进行测试(例如。, cheese (在 Linux 上)
  3. 相机忙碌中关闭其他正在使用相机的应用程序

Shodan集成问题

  1. “没有Shodan API密钥”错误:

    • 设定 SHODAN_API_KEY 环境变量
    • 请验证您的API密钥是否正确
  2. 速率限制已超出:

    • Shodan有API速率限制
    • 在提出更多请求之前请稍等
    • 考虑升级您的Shodan计划
  3. 未经授权的错误:

    • 请检查您的API密钥是否有效
    • 确保您的Shodan账户处于活跃状态
  4. 远程网络摄像头访问失败:

    • 许多被发现的网络摄像头可能无法访问
    • 有些可能需要进行身份验证
    • 网络防火墙可能会阻止访问
    • 网络摄像头可能已离线

伦理与法律考量

重要只访问您自己拥有或明确获得访问权限的网络摄像头。未经授权的访问是违法且不道德的。

记录日志

启用调试日志以排查问题:

RUST_LOG=mcp_webcam=debug,nokhwa=debug,reqwest=debug cargo run

依赖项

  • mcprMCP协议实现
  • “nokhwa”在中文中并没有直接对应的词汇,这个词看起来像是一个特定领域或语境下的术语,或者是某种特定语言的音译。如果尝试根据音译来推测其含义,可能会联想到与“图像”、“视觉”或“面部特征”等相关的词汇,但这些都是基于音译的猜测,并没有确切的中文对应词。在实际应用中,如果遇到“nokhwa”这个词,需要根据其出现的具体语境来确定其准确含义跨平台网络摄像头访问
  • reqwestShodan API的HTTP客户端及远程网络摄像头访问工具
  • **“tokio”在中文中通常直接音译为“托基奥”,不过具体翻译可能根据上下文或品牌命名习惯有所调整。在没有特定上下文的情况下,“托基奥”是一个较为通用的翻译。**异步运行时
  • 图像图像处理和编码
  • **base64(一种编码方式,用于将二进制数据编码成ASCII字符串)**图像数据编码
  • 追踪结构化日志记录
  • **时间顺序(或“时序”)**日期/时间处理
  • **serde(在中文语境中,这个词汇通常直接保留原样,因为它是特定技术或库的名称,不直接对应中文的某个词汇,但可以理解为“序列化/反序列化”相关技术的泛指,具体含义需结合上下文)**序列化框架

做出贡献

  1. 为仓库创建分支(或:克隆仓库)
  2. 创建一个特性分支
  3. 进行你的更改
  4. 如适用,请添加测试
  5. 提交一个拉取请求

许可证

[在此添加您的许可证]

更新日志

v0.1.0(版本0.1.0)

  • 初始发布
  • 本地网络摄像头捕获功能
  • MCP服务器实现
  • 跨平台相机支持
  • 用于远程网络摄像头发现的Shodan集成
  • 远程网络摄像头图像捕捉
  • 全面的安全性和伦理使用警告