Skip to main content
Glama
Mianm-l
by Mianm-l
README.md
# ShadowLens (影子透镜) - 企业级 Oracle MCP 只读穿透微服务

> **零侵入 · 绝对只读安全 · 免装 Oracle 客户端 · 智能跨库穿透与对账**

ShadowLens 是专门为**政企与大中型企业老旧系统(致远协同 OA、用友 ERP/NCC、若依供应链等)**打造的私有化只读 MCP (Model Context Protocol) 微服务代理。

它帮助 AI Agent 在**完全不侵入生产代码、不依赖老系统排期开接口、零写操作风险**的前提下,通过语义字典外挂与受控查询原语,实现自然语言驱动的跨表数据穿透、审批卡点追溯与智能双向对账。

---

## 🌟 核心特性

1. **纯 Python Thin 模式,免装 Oracle Instant Client**
   - 彻底摒弃传统配置 `oracle-instantclient-basic`、设置 `LD_LIBRARY_PATH` / `OCI` 动态库的繁重工作。
   - 基于纯 Python TCP/IP Socket 直连 Oracle 11gR2 / 12c / 18c / 19c / 21c / 23c,极致轻量,单容器开箱即用。
2. **多层只读与注入拦截防线**
   - **连接层**:只读账号连接 + `SET TRANSACTION READ ONLY` 会话锁;
   - **应用层**:SQL 语法树严格校验,彻底阻断任何 `INSERT/UPDATE/DELETE/DROP/ALTER` 及存储过程调用;
   - **熔断防线**:单次查询默认 5s 强制超时,默认行数严格截断(防笛卡尔积打垮数据库)。
3. **外挂语义字典(Semantic Overlay)**
   - 通过 `config/schema-dictionary.yaml` 补充中文字段名、业务枚举(如 `0:草稿, 1:审批中, 2:已生效`)与关联链路,解决老旧系统字段命名反人类、无注释的顽疾。
4. **隐私与涉密动态脱敏(Automatic Masking)**
   - 手机号、身份证号、银行卡号、金额等级、密码敏感词自动打码(如 `138****5678`、`110101********1234`),满足国企与涉密数据合规要求。
5. **开箱即用的高保真仿真数据集(Dry-Run Mode)**
   - 内置离线高保真仿真业务数据集,在内网数据库未联通或离线演示时自动无缝接管,开发与测试零阻力。

---

## 📁 目录结构

```text
shadowlens/
├── config/
│   ├── config.yaml               # 数据库连接、安全阈值与微服务端口配置
│   ├── schema-dictionary.yaml    # 业务模块、表名、中文字段及枚举字典映射
│   └── reconciliation-rules.yaml # 跨表双向对账规则配置
├── docs/
│   └── ideas/
│       └── shadowlens-mcp.md     # 固化的项目论证与架构规格 One-Pager
├── src/
│   ├── config.py                 # 配置加载器
│   ├── server.py                 # FastMCP 服务端 (支持 SSE 与 Stdio)
│   ├── db/
│   │   ├── oracle_pool.py        # Oracle Thin Mode 连接池与只读执行器
│   │   └── mock_data.py          # 高保真离线仿真数据集
│   ├── security/
│   │   ├── sql_validator.py      # SQL 严格只读白名单校验器
│   │   └── data_masker.py        # 敏感数据动态脱敏引擎
│   └── services/
│       ├── schema_service.py     # 字典元数据检索服务
│       ├── query_service.py      # 受控参数化查询与枚举转换
│       ├── reconciler.py         # 跨表智能对账引擎
│       └── workflow_monitor.py   # 审批流长超时卡点监控
├── tests/
│   └── test_shadowlens.py        # 完备自动化测试套件
├── Dockerfile                    # 私有化轻量部署镜像
├── docker-compose.yml            # 客户内网单机一键启停编排
└── requirements.txt              # 核心依赖清单
```

---

## 🚀 客户内网私有化快速部署

### 方式一:Docker Compose 一键部署(推荐)

1. **修改数据库配置**:
   编辑 `docker-compose.yml` 中的环境变量,填入客户内网 Oracle 的只读用户与 DSN:
   ```yaml
   environment:
     - ORACLE_DSN=192.168.1.100:1521/ORCLPDB1
     - ORACLE_USER=SHADOW_RO
     - ORACLE_PASSWORD=ReadOnlyPassword#2026
     - SHADOWLENS_DRY_RUN=false
   ```
2. **启动服务**:
   ```bash
   docker compose up -d
   ```
3. **验证健康状态**:
   内网微服务将在 `http://<服务器IP>:8000/sse` 暴露标准 MCP SSE 端点。

---

### 方式二:原生 Python 运行

```bash
# 1. 安装依赖 (Python 3.10+)
pip install -r requirements.txt

# 2. 运行自动化测试
python -m unittest tests/test_shadowlens.py

# 3. 启动内网 SSE 微服务 (监听 8000 端口)
python -m src.server --transport sse --host 0.0.0.0 --port 8000
```

---

## 🔌 客户端与 AI IDE 接入指引

### 1. Antigravity / Cursor / Cherry Studio / Claude 接入配置

在 AI Agent 客户端的 MCP 配置文件(如 `mcp_settings.json`)中添加 SSE 远程微服务配置:

```json
{
  "mcpServers": {
    "shadowlens-oracle": {
      "url": "http://192.168.1.50:8000/sse"
    }
  }
}
```

*注:若使用本地开发模式,亦可配置为 Stdio 命令行模式:*
```json
{
  "mcpServers": {
    "shadowlens-local": {
      "command": "python",
      "args": ["-m", "src.server", "--transport", "stdio"],
      "cwd": "/path/to/shadowlens"
    }
  }
}
```

---

## 🛠️ 暴露给 Agent 的核心 Tools 清单

| 工具名称 | 功能描述 | 典型触发 Prompt 示例 |
| :--- | :--- | :--- |
| `get_table_dictionary` | 检索表字典、字段中文定义、业务枚举与关联关系 | *"查一下采购管理模块有哪些表,订单状态枚举分别代表什么?"* |
| `query_audited_view` | 在受控白名单表/视图中按条件查询(带自动脱敏与枚举反显) | *"查询订单状态为已审批的所有采购订单,返回前 20 条"* |
| `list_reconciliation_rules` | 获取系统已预配置的跨表自动化对账规则清单 | *"系统支持哪些跨系统对账规则?"* |
| `reconcile_cross_tables` | 执行配置化跨表双向对账,检测漏单、金额不一致及异常状态 | *"执行采购单与入库验收对账,找出有差异的批次"* |
| `fetch_stuck_workflows` | 盘点协同 OA / 业务审批流中停留超时(默认 >48h)的卡点单据与当前责任人 | *"帮我查一下当前卡在审批节点超过 48 小时的协同公文有哪些?"* |
| `test_db_connection` | 检查内网 Oracle 数据库连通性、当前模式 (Thin Mode) 与网络延迟 | *"检查当前数据库连接状态"* |

---

## 🔒 安全合规白皮书摘要

- **零写权限**:只读账号 + `SET TRANSACTION READ ONLY` 物理级会话隔离;
- **防注入与防全表扫描**:所有查询经过 AST/正则表达式白名单二次过滤,禁止注释符逃逸,强制绑定参数化变量;
- **隐私保护**:脱敏引擎按规则对联系电话、身份证件、银行账户等自动加掩码,防止高密级数据在对话界面泄露。