Skip to main content
Glama

UniMCPSim - 通用MCP模拟器

UniMCPSim是一个通用的MCP(Model Context Protocol)模拟器,可以动态模拟各种产品的API接口,为开发和测试提供便利。

🌟 主要特性

  • 通用MCP模拟器:基于FastMCP框架,支持标准MCP协议

  • 多产品支持:预置9个常用产品模拟器,涵盖安全、通讯、网络、工单等领域

  • MCP Playground ⭐ NEW v2.9.0:交互式MCP测试工具,通过大模型对话验证MCP Server是否正常工作

  • AI增强响应:兼容OpenAI API接口(支持OpenAI、Qwen、Deepseek、Claude、Gemini等),生成真实的模拟响应数据

  • 智能动作生成:基于数据库提示词模板,AI自动生成API动作定义

  • 配置导入导出 (v2.8.0):应用配置一键导入导出,支持批量迁移和备份

  • Web界面配置 (v2.6.0):通过可视化界面配置大模型参数,无需手动编辑配置文件

  • 增强日志系统:详细记录所有MCP调用、AI调用、认证失败等,支持DEBUG模式

  • Web管理界面:提供完整的Web后台管理系统

  • Token权限管理:支持Token认证和细粒度权限控制

  • 模板驱动:支持自定义提示词模板,快速创建新的应用模拟器

  • 容器化部署 (v2.12.3):支持Docker Compose、SQLite数据卷持久化和GitHub Actions自动构建发布

📁 项目结构

UniMCPSim/
├── README.md                 # 项目说明文档
├── requirements.txt          # Python依赖包
├── mcp_server.py            # MCP服务器主程序
├── admin_server.py          # Web管理后台
├── models.py                # 数据库模型定义
├── auth_utils.py            # 认证工具
├── ai_generator.py          # AI响应生成器
├── mcp_client.py            # MCP客户端(Playground用)
├── playground_service.py    # Playground服务
├── logger_utils.py          # 增强日志系统
├── start_servers.py         # 服务启动脚本
├── data/                    # 数据目录
│   └── unimcp.db           # SQLite数据库 (自动创建)
├── logs/                    # 日志目录 (自动创建)
│   ├── unimcp_all.log      # 所有日志
│   ├── unimcp_error.log    # 错误日志
│   └── unimcp_debug.log    # DEBUG详细日志
├── static/                  # 静态资源
│   └── css/
│       └── main.css        # 统一CSS样式
├── templates/               # HTML模板
│   ├── _navigation.html     # 导航组件
│   ├── _footer.html         # 页脚组件
│   ├── login.html           # 登录页
│   ├── dashboard.html       # 仪表板
│   ├── apps.html            # 应用管理
│   ├── tokens.html          # Token管理
│   ├── prompts.html         # 提示词管理
│   ├── playground.html      # MCP Playground
│   ├── logs.html            # 审计日志
│   └── change_password.html # 密码修改
└── tests/                   # 测试文件
    ├── simple_test.py       # 核心功能测试
    └── test_e2e.py         # 端到端测试
├── docs/                    # 文档目录
│   └── images/              # 图片资源
│       ├── diagrams/        # 架构图
│       │   ├── technical-architecture.svg  # 技术架构图 (SVG格式)
│       │   └── technical-architecture.png  # 技术架构图 (PNG格式)
│       └── screenshots/     # 功能截图

🏗️ 系统架构

UniMCPSim采用分层架构设计,清晰划分各组件职责,确保系统的可扩展性和可维护性。

技术架构图

技术架构图也提供 SVG格式 供高清查看

架构层次

系统整体分为四个核心层次,各层之间通过标准化接口进行交互:

1. 客户端层 (Client Layer)

  • MCP客户端: 支持Claude Desktop、Cline、Continue等标准MCP客户端

  • HTTP客户端: 兼容cURL、Postman等REST API工具

  • Web浏览器: 提供友好的管理界面访问

  • 测试客户端: 内置自动化测试脚本

  • 外部系统: 支持CI/CD集成和自动化流程

2. 应用层 (Application Layer)

  • MCP服务器 (mcp_server.py, 端口9090)

    • 基于FastMCP框架实现标准MCP协议

    • 支持动态工具注册和调用

    • 实现Token认证机制

    • 提供RESTful API接口

  • 管理服务器 (admin_server.py, 端口9091)

    • 基于Flask框架构建

    • 提供Web管理界面

    • 用户认证和会话管理

    • 权限控制和审计功能

  • 产品模拟器集合: 预置9个高频使用场景的模拟器

  • 启动脚本 (start_servers.py): 一键启动所有服务

3. 服务层 (Service Layer)

  • AI响应生成器 (ai_generator.py)

    • 兼容OpenAI API接口(支持OpenAI、Qwen、Deepseek、Claude、Gemini等)

    • 智能生成模拟响应数据

    • 基于提示词模板动态生成动作定义

    • 详细记录AI调用信息(耗时、token使用量等)

  • 增强日志系统 (logger_utils.py)

    • 多层级日志文件(all/error/debug)

    • 详细记录MCP调用、AI调用、工具调用等

    • 支持DEBUG模式,记录完整调用详情

    • 日志自动轮转(10MB/文件,保留5个备份)

  • 认证工具 (auth_utils.py)

    • 密码哈希和验证

    • JWT Token生成和验证

    • 会话管理

  • 数据模型 (models.py)

    • SQLAlchemy ORM映射

    • 数据库抽象层

    • 业务实体定义

4. 数据层 (Data Layer)

  • SQLite数据库: 轻量级本地存储,零配置

  • 静态资源: CSS/JavaScript文件

  • HTML模板: Jinja2模板引擎

  • 环境配置: .env文件管理敏感配置

核心工作流程

  1. 请求流程: 客户端 → MCP服务器 → 服务层 → 数据层

  2. 认证流程: Token验证 → 权限检查 → 资源访问

  3. AI增强流程: 请求解析 → 提示词构建 → OpenAI调用 → 响应格式化

技术优势

  • 标准化协议: 完整支持MCP协议规范,确保与各类MCP客户端的兼容性

  • 模块化设计: 各组件职责单一,便于独立开发和测试

  • AI驱动: 利用大语言模型能力,动态生成真实的模拟数据

  • 易于扩展: 通过Web界面或配置文件即可添加新的模拟器

  • 零依赖部署: SQLite数据库无需额外配置,开箱即用

🚀 快速开始

1. 环境准备

确保已安装Python 3.8+

# 克隆项目
git clone <repository-url>
cd UniMCPSim

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
# Linux/Mac:
source venv/bin/activate
# Windows:
venv\Scripts\activate

# 安装依赖
pip install -r requirements.txt

# 设置环境变量(重要!)
unset HTTPS_PROXY
unset HTTP_PROXY

2. 环境变量配置

推荐方式: 通过Web界面配置大模型(v2.6.0+)

从 v2.6.0 开始,您可以通过 Web 管理界面配置大模型参数,无需手动编辑 .env 文件:

  1. 启动服务后访问:http://localhost:9091/admin/

  2. 登录(默认:admin / admin123)

  3. 点击"大模型配置"菜单

  4. 填写配置并点击"测试连接"验证

  5. 保存配置即可使用

v2.11.0+ 多配置管理: 支持预注册多个大模型配置,一键切换活跃配置,配置热切换无需重启服务。

多LLM配置管理界面

传统方式: 通过 .env 文件配置(可选,向后兼容)

如果您更喜欢使用配置文件,也可以创建 .env 文件:

# 创建.env文件
cat > .env << 'EOF'
# ===== AI大模型配置 =====
# 注意:v2.6.0+ 推荐通过Web界面配置,此处配置为备用方式
# 配置优先级:数据库配置(Web界面)> .env文件

# AI API配置(可选 - 推荐通过Web界面配置)
# 支持OpenAI、Qwen、Deepseek、Claude、Gemini等所有兼容OpenAI API的服务
OPENAI_API_KEY=your_api_key_here
OPENAI_MODEL=gpt-4o-mini
OPENAI_API_BASE_URL=https://api.openai.com/v1
OPENAI_ENABLE_THINKING=false  # 禁用思考模式,防止影响JSON输出(默认false)
OPENAI_STREAM=false  # 控制stream模式,某些模型如qwq-32b强制要求true(默认false)

# ===== 服务端口配置 =====
MCP_SERVER_PORT=9090
ADMIN_SERVER_PORT=9091

# ===== 日志配置 =====
DEBUG=false              # 启用DEBUG模式记录详细调用信息
LOG_LEVEL=INFO          # 日志级别: DEBUG, INFO, WARNING, ERROR
LOG_DIR=logs            # 日志文件存储目录
EOF

配置优先级说明(v2.6.0+):

  • 🥇 数据库配置(通过Web界面设置)- 最高优先级

  • 🥈 .env 文件(传统方式)- 备用方案

⚠️ 注意

  • v2.6.0+ 推荐使用Web界面配置大模型(更安全、更方便)

  • 如果数据库中已有配置,将优先使用数据库配置

  • .env 文件作为备用方案,确保向后兼容

  • 支持任何兼容OpenAI API接口的服务(OpenAI、Qwen、Deepseek、Claude、Gemini等)

  • 如果没有配置AI API,新建应用的AI辅助生成功能将无法使用

  • 启用DEBUG=true可记录完整的调用详情,包括完整token、headers、AI prompt等(仅用于排查问题)

OPENAI_ENABLE_THINKING配置说明

  • 默认值: false (禁用thinking模式)

  • 用途: 控制大模型是否启用思考过程输出

  • 重要性: 许多支持thinking模式的大模型(如qwen-thinking、DeepSeek-R1、QwQ等)在启用thinking时会在响应中包含思考过程,这会干扰JSON格式的解析,导致API响应生成失败

  • 建议: 保持默认值false,除非你明确知道使用的模型不会因thinking模式影响JSON输出

  • 设置为true: 仅在需要调试或使用特定模型时启用

OPENAI_STREAM配置说明

  • 默认值: false (禁用stream模式)

  • 用途: 控制是否使用stream模式调用AI API

  • 重要性: 某些模型(如qwq-32b)强制要求使用stream模式,否则会返回400错误:"This model only support stream mode"

  • 适用模型: qwq-32b、部分deepseek-r1变体等

  • 建议: 根据使用的模型调整

    • 常规模型(gpt-4o-mini、qwen3-max等): 保持false

    • 强制stream模型(qwq-32b等): 设置为true

  • 注意: Stream模式下无法获取token使用量统计信息

3. 启动服务

方式一:一键启动(推荐)

python start_servers.py

方式二:分别启动

# 启动MCP服务器(端口9090)
python mcp_server.py

# 启动Web管理后台(端口9091)
python admin_server.py

看到以下输出表示启动成功:

==========================================================
UniMCPSim - Universal MCP Simulator
==========================================================

初始化默认模拟器...
✅ 已创建默认管理员用户

启动服务...
服务已启动:
----------------------------------------------------------
MCP服务器: http://localhost:9090/<Category>/<Product>?token=<token>
管理后台: http://localhost:9091/admin/
默认账号: admin / admin123
----------------------------------------------------------

按 Ctrl+C 停止服务

4. 访问服务

启动成功后,可以访问以下服务:

🐳 Docker部署

使用Docker Compose(推荐)

# 构建并启动
docker compose up -d --build

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f unimcpsim

默认会挂载以下目录,容器升级或重建不会丢失数据:

./data  -> /app/data   # SQLite数据库
./logs  -> /app/logs   # 运行日志

使用已发布镜像

GitHub Actions 会在推送 mainv* 标签时构建并发布镜像到 GHCR:

docker pull ghcr.io/flagify-com/unimcpsim:latest
docker run -d --name unimcpsim \
  --restart unless-stopped \
  -p 9090:9090 \
  -p 9091:9091 \
  -v $(pwd)/data:/app/data \
  -v $(pwd)/logs:/app/logs \
  -e TZ=Asia/Shanghai \
  ghcr.io/flagify-com/unimcpsim:latest

也可以使用指定提交对应的镜像标签,便于在生产环境锁定版本:

docker pull ghcr.io/flagify-com/unimcpsim:sha-8ff8e19

注意:GitHub Packages 的网页详情页可能因登录状态、组织权限或包权限配置显示 404;部署时以 docker pull ghcr.io/flagify-com/unimcpsim:<tag> 为准。如果 docker pull 返回 denied / unauthorized,请检查 GHCR 包是否已设置为 Public;如果返回超时或 TLS 握手失败,通常是网络或企业出口未放行 GHCR 相关域名。

企业内网离线交付

客户环境不能直连 GitHub / GHCR 时,可以在可联网环境先拉取官方镜像并导出离线包:

docker pull ghcr.io/flagify-com/unimcpsim:sha-8ff8e19

docker save ghcr.io/flagify-com/unimcpsim:sha-8ff8e19 \
  | gzip > unimcpsim-sha-8ff8e19.tar.gz

sha256sum unimcpsim-sha-8ff8e19.tar.gz > SHA256SUMS

unimcpsim-sha-8ff8e19.tar.gzSHA256SUMS 传入内网后:

sha256sum -c SHA256SUMS
gunzip -c unimcpsim-sha-8ff8e19.tar.gz | docker load

docker tag ghcr.io/flagify-com/unimcpsim:sha-8ff8e19 unimcpsim:sha-8ff8e19

内网部署示例:

docker run -d --name unimcpsim \
  --restart unless-stopped \
  -p 9090:9090 \
  -p 9091:9091 \
  -v /opt/unimcpsim/data:/app/data \
  -v /opt/unimcpsim/logs:/app/logs \
  -e TZ=Asia/Shanghai \
  unimcpsim:sha-8ff8e19

如果客户有 Harbor / Nexus / 私有 Docker Registry,建议将官方镜像同步到内网镜像仓库,再由客户服务器从内网仓库拉取:

docker tag ghcr.io/flagify-com/unimcpsim:sha-8ff8e19 \
  harbor.example.com/security/unimcpsim:sha-8ff8e19

docker push harbor.example.com/security/unimcpsim:sha-8ff8e19

内网/国内环境构建

Dockerfile 支持构建参数,可使用国内镜像源或复用已有基础镜像加速构建:

docker build \
  --build-arg USE_CHINA_MIRRORS=true \
  --build-arg PYTHON_IMAGE=python:3.11-slim \
  -t unimcpsim:local .

# 如果内网已有基础镜像,也可以复用:
docker build \
  --build-arg USE_CHINA_MIRRORS=true \
  --build-arg PYTHON_IMAGE=deepsocx-backend:latest \
  -t unimcpsim:local .

🧪 功能验证测试

1. 测试核心功能

打开新终端,运行功能测试:

cd UniMCPSim
source venv/bin/activate
unset HTTPS_PROXY && unset HTTP_PROXY

# 运行核心功能测试
python tests/simple_test.py

期望输出:

############################################################
# UniMCPSim 功能验证测试
############################################################

============================================================
测试应用列表功能
============================================================
✅ 找到 9 个已启用的应用:
   - VirusTotal威胁情报 (/Security/VirusTotal)
   - 微步在线威胁情报 (/Security/ThreatBook)
   - 青藤云HIDS (/Security/QingTengHIDS)
   - 企业微信 (/IM/WeChat)
   - 腾讯会议 (/Meeting/TencentMeeting)
   - Jira工单系统 (/Ticket/Jira)
   - 华为交换机 (/Network/HuaweiSwitch)
   - Cisco路由器 (/Network/CiscoRouter)
   - 深信服防火墙 (/Firewall/Sangfor)

============================================================
UniMCPSim 核心功能测试
============================================================
✅ 使用Token: dbb02af0...a525

测试 1: 企业微信发送消息 ✅ 成功
测试 2: VirusTotal IP扫描 ✅ 成功
测试 3: Jira创建工单 ✅ 成功
测试 4: 深信服防火墙封禁IP ✅ 成功
测试 5: 华为交换机查看接口 ✅ 成功

============================================================
测试总结
============================================================
🎉 所有测试通过!

2. Web管理后台验证

浏览器访问:http://localhost:9091/admin/

  • 用户名:admin

  • 密码:admin123

可以查看:

  • 📊 系统概览

  • 🔧 应用管理

  • 🎫 Token管理

  • 📋 审计日志

3. API接口测试

# 获取Demo Token - 方法1:从管理后台复制
# 访问 http://localhost:9091/admin/tokens 复制Demo Token

# 获取Demo Token - 方法2:使用脚本
TOKEN=$(python -c "
import sys
sys.path.append('.')
from models import db_manager, Token
session = db_manager.get_session()
try:
    demo_token = session.query(Token).filter_by(name='Demo Token').first()
    if demo_token:
        print(demo_token.token)
finally:
    session.close()
")

# 测试企业微信发送消息
curl "http://localhost:9090/IM/WeChat?token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "send_text_message",
    "parameters": {
      "to_user": "test_user",
      "content": "Hello from UniMCPSim!"
    }
  }'

🔧 配置说明

预置模拟器列表

系统预置了以下9个产品模拟器:

分类

产品名称

路径

功能描述

Security

VirusTotal威胁情报

/Security/VirusTotal

IP/域名威胁检测

Security

微步在线威胁情报

/Security/ThreatBook

威胁情报查询

Security

青藤云HIDS

/Security/QingTengHIDS

主机入侵检测

IM

企业微信

/IM/WeChat

企业即时通讯

Meeting

腾讯会议

/Meeting/TencentMeeting

视频会议管理

Ticket

Jira工单系统

/Ticket/Jira

工单管理

Network

华为交换机

/Network/HuaweiSwitch

网络设备管理

Network

Cisco路由器

/Network/CiscoRouter

路由器配置

Firewall

深信服防火墙

/Firewall/Sangfor

防火墙策略管理

API使用示例

企业微信发送消息示例

# 获取Demo Token (在管理后台获取或使用脚本)
TOKEN="demo-token-here"

# 直接调用企业微信API端点
curl "http://localhost:9090/IM/WeChat?token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "send_text_message",
    "parameters": {
      "to_user": "test_user",
      "content": "Hello from UniMCPSim!"
    }
  }'

其他产品示例

VirusTotal IP扫描

curl "http://localhost:9090/Security/VirusTotal?token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "scan_ip",
    "parameters": {
      "ip": "8.8.8.8"
    }
  }'

Jira创建工单

curl "http://localhost:9090/Ticket/Jira?token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "create_issue",
    "parameters": {
      "project_key": "TEST",
      "issue_type": "Task",
      "summary": "测试工单",
      "description": "这是一个测试工单",
      "priority": "High"
    }
  }'

深信服防火墙封禁IP

curl "http://localhost:9090/Firewall/Sangfor?token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "block_ip_address",
    "parameters": {
      "ip_address": "192.168.1.100",
      "reason": "可疑活动"
    }
  }'

📚 MCP客户端接入指南

Cherry Studio 集成示例

UniMCPSim 完美支持 Cherry Studio 等 MCP 客户端,以下是详细的集成步骤:

1. 在 Cherry Studio 中创建 MCP 服务器

创建MCP服务器

在 Cherry Studio 中:

  1. 打开设置页面

  2. 选择 "MCP 服务器" 选项

  3. 点击 "添加新服务器"

2. 配置 UniMCPSim 服务器

配置参数:

  • 服务器名称: UniMCPSim

  • 服务器地址: http://localhost:9090/{Category}/{Product}?token={your-token}

  • 协议: HTTP

  • 认证: Token认证

示例配置:

  • 企业微信: http://localhost:9090/IM/WeChat?token=your-demo-token

  • 威胁情报: http://localhost:9090/Security/VirusTotal?token=your-demo-token

3. 查看可用工具列表

MCP工具列表

配置成功后,Cherry Studio 会自动识别 UniMCPSim 提供的所有工具:

  • ✅ 企业微信消息发送

  • ✅ 威胁情报查询

  • ✅ 工单管理

  • ✅ 网络设备控制

  • ✅ 防火墙策略管理

4. 在对话中使用 MCP 工具

使用MCP工具

在 Cherry Studio 的对话界面中:

  1. 自然语言描述需求

  2. AI自动选择合适的工具

  3. 执行具体操作

  4. 获取真实的模拟响应

MCP Playground 测试工具 ⭐ NEW v2.9.0

UniMCPSim v2.9.0 新增 MCP Playground 功能,无需外部客户端即可直接在 Web 界面中测试 MCP Server。

MCP Playground

功能特点

  • 可视化配置: 通过 JSON 编辑器配置任意 MCP Server

  • 实时连接测试: 一键测试连接并查看可用工具列表

  • AI 对话交互: 通过自然语言与大模型对话,自动调用 MCP 工具

  • 工具调用可视化: 实时显示工具调用过程和返回结果

  • 自定义系统提示词: 可编辑系统提示词控制 AI 行为

使用方法

  1. 登录管理后台,点击导航栏的"MCP Playground"

  2. 在左侧配置区粘贴 MCP Server 配置(JSON 格式)

  3. 点击"测试连接"验证配置并获取工具列表

  4. 在右侧对话区输入指令,AI 将自动调用相应的 MCP 工具

MCP 配置示例

{
  "mcpServers": {
    "QAXFW": {
      "name": "奇安信防火墙",
      "type": "streamableHttp",
      "description": "奇安信防火墙MCP服务",
      "isActive": true,
      "baseUrl": "http://127.0.0.1:9090/Firewall/QAXFW?token=YOUR_TOKEN_HERE"
    }
  }
}

适用场景

  • 🔧 快速验证新建的 MCP Server 是否正常工作

  • 🧪 测试 MCP 工具的参数和返回值

  • 📚 学习和了解 MCP 协议的工作方式

  • 🔍 调试 MCP 工具调用问题

🛠️ 管理后台使用指南

Web管理界面功能

  1. 登录系统

  2. 仪表板

    • 查看系统运行状态和统计信息

    • 监控应用数量、Token数量、今日调用量

    • 显示系统启动时间和健康状态

  3. 应用管理 ⭐ 增强功能

    • 查看所有可用应用列表

    • 创建新的应用模拟器

    • 编辑应用配置和动作定义

    • 点击应用名称查看详细信息:完整的应用信息和动作列表

    • 一键生成MCP配置:自动生成标准MCP客户端配置,支持复制到Cherry Studio、Claude Desktop或Cline

    • 配置导入导出 (v2.8.0):

      • 📤 导出:支持导出全部应用或选择性导出指定应用,自动生成时间戳文件名

      • 📥 导入:从JSON文件导入应用配置,导入前预览新建/覆盖应用列表

      • 自动识别同名应用(按category+name匹配)并直接覆盖

      • 完整的JSON格式验证和友好错误提示

      • 导入成功后提醒手动设置Token权限

    • 使用AI自动生成动作定义

  4. Token管理 ⭐ 增强功能

    • 创建新的访问Token

    • 可视化权限管理:通过模态框查看和编辑Token权限

    • 批量权限设置:全选/取消全选功能,快速配置应用访问权限

    • 查看Token使用记录和授权应用数量

    • 启用/禁用Token

  5. 提示词管理

    • 管理AI生成提示词模板

    • 自定义动作生成和响应模拟模板

    • 支持系统变量(app_name, action_name等)

  6. 审计日志

    • 查看所有API调用记录

    • 监控系统使用情况

    • 追踪操作历史

  7. 账户管理

    • 修改管理员密码

    • 安全退出

创建新应用示例

以下是在管理后台创建新应用的截图示例:

创建安恒扫描器应用 创建安恒网络安全扫描器应用

创建微步威胁情报应用 创建微步在线威胁情报应用

通过Web界面可以轻松:

  • 📝 填写应用基本信息

  • 🔧 配置API动作定义

  • 🤖 使用AI自动生成动作

  • ✅ 实时验证配置

  1. Token管理

    • 创建新的访问Token

    • 配置Token权限

    • 查看Token使用记录

  2. 审计日志

    • 查看所有API调用记录

    • 监控系统使用情况

添加新的模拟器

通过Web管理界面添加(推荐)

  1. 访问 http://localhost:9091/admin/

  2. 登录管理后台

  3. 进入"应用管理"页面

  4. 点击"创建新应用"按钮

  5. 填写应用信息:

    • 应用名称(英文)

    • 显示名称(中文)

    • 分类

    • 描述

  6. 配置动作定义或使用AI自动生成

动作定义格式

在创建应用时,动作定义使用以下JSON格式:

[
  {
    "name": "your_action",
    "display_name": "动作显示名称",
    "description": "动作描述",
    "parameters": [
      {
        "key": "param_name",
        "type": "String",
        "required": true,
        "description": "参数描述"
      }
    ]
  }
]

访问新的模拟器

创建完成后,即可通过以下URL访问:

http://localhost:9090/{Category}/{ProductName}?token=<your-token>

🎯 MCP协议详细使用说明

MCP服务器地址

产品特定端点(推荐)

URL格式: http://localhost:9090/<Category>/<Product>?token=<your-token>

示例端点:

  • 企业微信: http://localhost:9090/IM/WeChat?token=<your-token>

  • 华为交换机: http://localhost:9090/Network/HuaweiSwitch?token=<your-token>

  • 深信服防火墙: http://localhost:9090/Firewall/Sangfor?token=<your-token>

完整MCP使用示例

步骤1:初始化MCP连接

curl -X POST "http://localhost:9090/IM/WeChat?token=f1bb3770-6e46-4fe6-b518-e1c738c7b6a4" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "method": "initialize",
    "params": {
      "protocolVersion": "0.1.0",
      "capabilities": {},
      "clientInfo": {
        "name": "demo-client",
        "version": "1.0.0"
      }
    },
    "id": 1
  }' \
  -D headers.txt

响应示例:

event: message
data: {
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-06-18",
    "capabilities": {
      "experimental": {},
      "prompts": {"listChanged": true},
      "resources": {"subscribe": false, "listChanged": true},
      "tools": {"listChanged": true}
    },
    "serverInfo": {
      "name": "UniMCPSim",
      "version": "1.0.0"
    },
    "instructions": "Universal MCP Simulator - 通用MCP模拟器,可动态模拟各种产品的API接口"
  }
}

重要: 从响应头中提取mcp-session-id

session_id=$(grep -i 'mcp-session-id:' headers.txt | tr -d '\r' | cut -d' ' -f2-)
echo "会话ID: $session_id"

步骤2:企业微信发送消息示例

# 使用提取的会话ID
curl -X POST "http://localhost:9090/IM/WeChat?token=f1bb3770-6e46-4fe6-b518-e1c738c7b6a4" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "mcp-session-id: $session_id" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "execute_action",
      "arguments": {
        "token": "f1bb3770-6e46-4fe6-b518-e1c738c7b6a4",
        "category": "IM",
        "product": "WeChat",
        "action": "send_message",
        "parameters": {
          "to_user": "zhang.san",
          "text": "项目会议将于明天下午2点在A会议室举行,请准时参加。"
        }
      }
    },
    "id": 2
  }'

Python客户端示例

import asyncio
import httpx
import json

class UniMCPSimClient:
    def __init__(self, base_url="http://localhost:9090", token=None, product_path=None):
        self.base_url = base_url
        self.token = token
        self.product_path = product_path  # 例如: "IM/WeChat"
        self.session_id = None

    @property
    def endpoint_url(self):
        """获取完整的端点URL"""
        if self.product_path:
            return f"{self.base_url}/{self.product_path}"
        else:
            return f"{self.base_url}/mcp"

    async def initialize(self):
        """初始化MCP连接"""
        async with httpx.AsyncClient() as client:
            payload = {
                "jsonrpc": "2.0",
                "method": "initialize",
                "params": {
                    "protocolVersion": "0.1.0",
                    "capabilities": {},
                    "clientInfo": {"name": "python-client", "version": "1.0.0"}
                },
                "id": 1
            }

            response = await client.post(
                f"{self.endpoint_url}?token={self.token}",
                json=payload,
                headers={
                    "Content-Type": "application/json",
                    "Accept": "application/json, text/event-stream"
                }
            )

            # 提取会话ID
            self.session_id = response.headers.get('mcp-session-id')
            return response.status_code == 200

    async def execute_action(self, category, product, action, parameters):
        """执行模拟器动作"""
        if not self.session_id:
            raise Exception("请先调用initialize()初始化连接")

        async with httpx.AsyncClient() as client:
            payload = {
                "jsonrpc": "2.0",
                "method": "tools/call",
                "params": {
                    "name": "execute_action",
                    "arguments": {
                        "token": self.token,
                        "category": category,
                        "product": product,
                        "action": action,
                        "parameters": parameters
                    }
                },
                "id": 2
            }

            response = await client.post(
                f"{self.endpoint_url}?token={self.token}",
                json=payload,
                headers={
                    "Content-Type": "application/json",
                    "Accept": "application/json, text/event-stream",
                    "mcp-session-id": self.session_id
                }
            )

            return response.text

# 使用示例
async def main():
    # 使用产品特定端点(推荐)
    client = UniMCPSimClient(
        token="f1bb3770-6e46-4fe6-b518-e1c738c7b6a4",
        product_path="IM/WeChat"
    )

    # 初始化连接
    if await client.initialize():
        print("✅ MCP连接初始化成功")

        # 企业微信发送消息
        result = await client.execute_action(
            category="IM",
            product="WeChat",
            action="send_message",
            parameters={
                "to_user": "zhang.san",
                "text": "Python客户端测试消息"
            }
        )
        print("发送消息结果:", result)
    else:
        print("❌ MCP连接初始化失败")

# 运行示例
if __name__ == "__main__":
    asyncio.run(main())

🧪 测试

核心功能测试

# 运行核心功能测试
python tests/simple_test.py

测试内容包括:

  • ✅ 应用列表功能

  • ✅ 企业微信发送消息

  • ✅ VirusTotal IP扫描

  • ✅ Jira创建工单

  • ✅ 深信服防火墙封禁IP

  • ✅ 华为交换机查看接口

端到端测试

# 运行端到端测试(需要服务器运行)
python tests/test_e2e.py

一键测试脚本

创建文件 test_wechat.sh

#!/bin/bash

# 设置变量
MCP_SERVER="http://localhost:9090/IM/WeChat"
TOKEN="f1bb3770-6e46-4fe6-b518-e1c738c7b6a4"

echo "=== UniMCPSim 企业微信测试 ==="

# 步骤1:初始化连接
echo "1. 初始化MCP连接..."
init_response=$(curl -s -X POST "${MCP_SERVER}?token=${TOKEN}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "method": "initialize",
    "params": {
      "protocolVersion": "0.1.0",
      "capabilities": {},
      "clientInfo": {"name": "test-client", "version": "1.0.0"}
    },
    "id": 1
  }' \
  -D /tmp/headers.txt)

# 提取会话ID
session_id=$(grep -i 'mcp-session-id:' /tmp/headers.txt | tr -d '\r' | cut -d' ' -f2-)

if [ -z "$session_id" ]; then
    echo "❌ 获取会话ID失败"
    exit 1
fi

echo "✅ 连接成功,会话ID: $session_id"

# 步骤2:发送消息
echo ""
echo "2. 测试企业微信发送消息..."
msg_response=$(curl -s -X POST "${MCP_SERVER}?token=${TOKEN}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "mcp-session-id: $session_id" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "execute_action",
      "arguments": {
        "token": "'$TOKEN'",
        "category": "IM",
        "product": "WeChat",
        "action": "send_message",
        "parameters": {
          "to_user": "test.user",
          "text": "这是一条测试消息"
        }
      }
    },
    "id": 2
  }')

if echo "$msg_response" | grep -q "event: message"; then
    echo "✅ 消息发送成功"
    echo "$msg_response" | grep "data:" | sed 's/data: //'
else
    echo "❌ 消息发送失败"
    echo "$msg_response"
fi

echo ""
echo "=== 测试完成 ==="

使用方法:

chmod +x test_wechat.sh
./test_wechat.sh

🔍 故障排除

常见问题

  1. 端口被占用

# 检查端口占用
lsof -i :9090
lsof -i :9091

# 杀死占用进程
kill -9 <PID>
  1. 依赖安装失败

# 升级pip
pip install --upgrade pip

# 清除缓存重新安装
pip cache purge
pip install -r requirements.txt
  1. 数据库错误

# 完全重置
rm -rf data/
mkdir data
python init_simulators.py
  1. 网络代理干扰

# 确保取消代理设置
unset HTTPS_PROXY
unset HTTP_PROXY
unset http_proxy
unset https_proxy

# 验证
echo $HTTPS_PROXY  # 应该为空

调试和故障排除

常见错误

  1. HTTP 406 Not Acceptable

    • 缺少正确的Accept头

    • 解决:添加 Accept: application/json, text/event-stream

  2. HTTP 400 Bad Request: Missing session ID

    • 未先进行initialize或session ID丢失

    • 解决:先调用initialize方法获取session ID

  3. HTTP 401 Unauthorized

    • Token无效或已过期

    • 解决:检查Token是否正确

  4. 工具调用返回error

    • 参数不正确或缺少必填参数

    • 解决:检查API文档确认参数格式

查看详细日志

启动服务器时可以看到详细的请求日志:

python mcp_server.py

获取可用Token

# 通过Web管理后台
curl "http://localhost:9091/admin/api/tokens" -H "Authorization: Bearer <session>"

# 或直接查询数据库
python -c "
from models import db_manager, Token
session = db_manager.get_session()
tokens = session.query(Token).filter_by(enabled=True).all()
for token in tokens:
    print(f'{token.name}: {token.token}')
session.close()
"

常用操作

重启服务

# 停止服务 (Ctrl+C)
# 重新启动
python start_servers.py

重置数据库

# 删除现有数据库
rm -f data/unimcp.db

# 重新初始化
python init_simulators.py

🎯 成功标志

看到以下输出表示系统运行正常:

  1. 服务启动成功

    • MCP服务器运行在9090端口

    • Web管理后台运行在9091端口

    • 无错误日志输出

  2. 功能测试通过

    • python tests/simple_test.py 显示 "🎉 所有测试通过!"

    • 9个应用模拟器全部可用

    • Demo Token正常工作

  3. Web界面正常

    • 能够正常登录管理后台

    • 各个页面加载正常

    • 数据显示正确

🔧 开发说明

技术栈

  • 后端框架: FastMCP (MCP服务) + Flask (Web管理)

  • 数据库: SQLite + SQLAlchemy ORM

  • AI集成: OpenAI API

  • 前端: HTML + CSS + JavaScript (原生)

  • 认证: JWT Token + 会话管理

扩展开发

  1. 添加新的MCP工具

@mcp.tool()
async def your_new_tool(param1: str, param2: int) -> str:
    """工具描述"""
    # 实现逻辑
    return "result"
  1. 自定义AI响应模板 编辑 ai_generator.py 中的响应模板

  2. 添加新的Web页面templates/ 目录添加HTML模板,在 admin_server.py 添加路由

📊 日志系统

UniMCPSim v2.3+ 引入了增强的日志系统,帮助您更好地诊断和监控系统运行。

日志文件

所有日志文件存储在 logs/ 目录(可通过环境变量 LOG_DIR 自定义):

  • unimcp_all.log - 所有日志(INFO及以上级别)

    • 记录所有成功和失败的请求

    • 包含基本的调用信息(路径、方法、token前8位等)

    • 适合日常监控和审计

  • unimcp_error.log - 错误日志

    • 只记录错误和警告

    • 快速定位问题

    • 包含详细的错误堆栈信息

  • unimcp_debug.log - DEBUG详细日志(仅在DEBUG模式下生成)

    • 记录完整的调用详情

    • 包含完整token、HTTP headers、完整请求/响应内容

    • AI调用的完整prompt和response

    • 数据库操作详情

    • 仅用于排查复杂问题

记录内容

1. MCP Server调用

2025-09-30 16:05:12 - INFO - MCP Request: POST:tools/list /ThreatIntelligence/Threatbook - SUCCESS

记录信息:

  • 请求方法和MCP方法名

  • 应用路径

  • Token(默认只记录前8位)

  • 请求参数

  • 是否成功

  • 错误信息(如果失败)

2. AI模型调用

2025-09-30 16:10:30 - INFO - AI Call: OpenAI/qwen3-max - SUCCESS (duration: 1.23s)

记录信息:

  • AI提供商和模型

  • 调用耗时

  • Token使用量(prompt_tokens、completion_tokens)

  • DEBUG模式下记录完整的prompt和response

3. 工具调用

2025-09-30 16:12:15 - INFO - Tool Call: query_ip_threat_intel (app: ThreatIntelligence/Threatbook) - SUCCESS

记录信息:

  • 工具名称

  • 所属应用

  • 参数

  • 执行结果

  • 错误信息(如果失败)

4. 认证失败

2025-09-30 16:15:00 - WARNING - Auth Failure: Token required (path: /IM/WeChat, ip: 127.0.0.1)

记录信息:

  • 失败原因

  • 访问路径

  • 客户端IP

  • Token信息(如有)

DEBUG模式

启用DEBUG模式可记录更详细的诊断信息:

# 在 .env 文件中设置
DEBUG=true
LOG_LEVEL=DEBUG

DEBUG模式额外记录:

  • ✅ 完整的API Token(非DEBUG只记录前8位)

  • ✅ 完整的HTTP Headers

  • ✅ 完整的请求和响应内容

  • ✅ AI调用的完整prompt和response

  • ✅ 数据库操作详情

⚠️ 安全提醒

  • DEBUG模式会记录敏感信息(token、prompt等),仅在开发和排查问题时启用

  • 生产环境请使用 DEBUG=false

  • 日志文件已自动添加到 .gitignore,不会被提交到版本控制

日志轮转

日志系统自动进行文件轮转:

  • 单个日志文件最大 10MB

  • 保留最近 5 个备份文件

  • 自动压缩和清理旧日志

使用场景

  1. 监控MCP调用

    # 实时查看所有请求
    tail -f logs/unimcp_all.log
    
    # 只看错误
    tail -f logs/unimcp_error.log
  2. 排查Cherry Studio调用问题

    • 启用DEBUG模式

    • 查看 unimcp_debug.log 中的完整headers和session ID

    • 确认是否真正调用了MCP Server

  3. 诊断AI响应问题

    • 启用DEBUG模式

    • 查看AI调用的完整prompt和response

    • 检查token使用量和耗时

  4. 审计和安全

    • 查看认证失败记录

    • 追踪特定token的使用情况

    • 监控异常访问模式

🤝 贡献

欢迎提交Issue和Pull Request来改进项目!

📄 许可证

本项目采用MIT许可证 - 查看 LICENSE 文件了解详情

📞 支持

如有问题或建议,请:

  • 提交GitHub Issue

  • 联系项目维护者


UniMCPSim - 让API模拟变得简单高效!🚀

现在您可以:

  • 🔌 通过MCP协议连接各种客户端如Cherry Studio

  • 🌐 使用Web界面管理应用和Token

  • 🧪 开发和测试需要多种API的应用

  • 🔧 根据需要添加自定义模拟器

  • 🤖 利用AI智能生成真实的模拟响应

F
license - not found
-
quality - not tested
B
maintenance

Maintenance

Maintainers
<1hResponse time
Release cycle
Releases (12mo)

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/flagify-com/UniMCPSim'

If you have feedback or need assistance with the MCP directory API, please join our Discord server