摘要:穿透式监管不止是政策要求,更是一道工程题。当监管视线从集团总部延伸到末级子公司、从年度报表切换到实时预警,传统ERP系统捉襟见肘。本文从数据架构视角拆解穿透式监管的技术瓶颈,提出"身份-关系-行为"三支柱模型,并通过Python代码示例+企查查MCP工具链,演示客商准入、关联交易审查、虚假贸易识别、合同监控、投资尽调五大场景的完整实现路径。
基于企查查MCP 2026年6月版本,6大Server、182+原子工具。


一、问题:穿透式监管的技术瓶颈到底在哪

国资监管不是新鲜事,但2026年国资委"1号文"提出的"全级次、全链条、全过程、全要素"四个穿透,跟以往任何一轮监管升级有一个本质断裂。

以前的监管管的是"报表"——企业报什么,监管看什么。年度财务报告、季度经营数据、定期合规自查,监管的视野半径等于企业主动提交的信息半径。这个模式成立的前提是:企业报的东西是真的、报的东西是全的。

穿透式监管不打算继续依赖这个前提。它要的不是"你告诉我什么",而是"我要看到什么"。

这个转变意味着:当监管不再依赖企业自行填报的数据,就必须从企业外部获取独立信息做交叉验证。通俗地讲——

穿透式监管有一个隐含的、不可回避的技术前提:必须有一套独立于企业内部的、覆盖全量市场主体的、持续更新的外部数据源。

建系统、过合规当然重要。但如果数据层没打通,系统建得再好也只是在空转。下面从三个结构性问题来说明这一点。
在这里插入图片描述

1.1 关联关系:集团自己看不全

一家央企对自己的子公司架构是清楚的——谁控股谁,产权登记系统里都有。但"清楚"仅限于直接持股的那几层。

二级子公司投了外部企业 → 外部企业又投了另一家 → 再往下……这些间接的、跨层级的、非并表的关联关系,集团自己的系统里几乎不可见。

更隐蔽的是人员维度的关联——同一批人在不同企业中交叉任职,构成一个"不在产权图谱上但实际存在利益协同"的隐性网络。传统系统对此无能为力。

1.2 交易对手:ERP里看不到真实画像

给你签合同的这家公司——社保缴纳人数是不是零?注册地址是不是居民楼?经营范围跟交易品类是不是完全不匹配?半年内有没有频繁变更股东?

这些信息,哪个ERP系统里都看不到。但穿透式监管要求的就是看到这些东西——因为虚假贸易的破绽不在合同条款里,在交易对手的身份上。

1.3 时间维度:年度快照拍不到风险累积

三年前的行政处罚、五年前的股权纠纷判决、去年被列入的经营异常名录——这些"过去时"的风险,在年度财务报告这个"现在时"的快照里完全不可见。

而裁判文书在法院系统、行政处罚在监管机关、经营异常在市场监督管理部门、失信记录在信用中国平台——它们分散在不同机构的数据孤岛中,需要被系统化整合。

这三个盲区指向同一个结论:穿透式监管能不能真正"穿"下去,最终取决于外部数据的覆盖深度和调用效率。


二、数据三支柱:技术架构与代码实现

把前面的问题抽象成一个技术架构,穿透式监管底层需要三种外部数据能力,我称之为"数据三支柱"。
在这里插入图片描述

2.1 支柱一:身份数据——“这家企业到底是谁”

穿透式监管意义上的"身份数据"至少覆盖四个层次:

层次 核查内容 关键维度
L1 主体资格 存续状态、经营范围、注册资本实缴 工商登记 + 税务登记
L2 控制关系 直接/间接股东、最终受益人、代持 股权穿透至自然人
L3 空壳识别 经营场所、社保记录、年报闭环 多源交叉验证
L4 资质验证 行政许可能效期、吊销/撤销记录 行业主管部门数据

代码实现:企业身份全维度核验

import requests
import json

# 企查查企业工商信息核验 API 调用示例
# 文档:https://openapi.qcc.com/

class CompanyIdentityVerifier:
    """企业身份数据四层核验"""
    
    def __init__(self, api_key: str, base_url: str = "https://api.qcc.com"):
        self.api_key = api_key
        self.base_url = base_url
        self.headers = {"Authorization": f"Bearer {api_key}"}
    
    def verify_basic_info(self, company_name: str, credit_code: str) -> dict:
        """
        L1 主体资格核验
        校验企业名称、统一社会信用代码、法人代表是否一致
        """
        endpoint = f"{self.base_url}/company/verify"
        payload = {
            "keyword": company_name,
            "creditCode": credit_code
        }
        resp = requests.post(endpoint, json=payload, headers=self.headers)
        return resp.json()
    
    def penetrate_shareholders(self, company_id: str, max_depth: int = 10) -> list:
        """
        L2 控制关系穿透
        沿股权链向上穿透至最终自然人,返回完整持股路径
        """
        endpoint = f"{self.base_url}/company/shareholder/penetrate"
        payload = {
            "companyId": company_id,
            "maxDepth": max_depth,
            "threshold": 0.05  # 持股5%以上的股东才纳入穿透
        }
        resp = requests.post(endpoint, json=payload, headers=self.headers)
        shareholder_chain = resp.json()
        
        # 识别代持风险:如果某层股东在多家公司中集中出现
        for node in shareholder_chain.get("nodes", []):
            if node.get("crossHoldingCount", 0) > 3:
                node["riskFlag"] = "POTENTIAL_NOMINEE"
        
        return shareholder_chain
    
    def detect_shell_company(self, company_id: str) -> dict:
        """
        L3 空壳识别
        交叉比对社保、年报、经营地址等维度
        """
        endpoint = f"{self.base_url}/company/risk/shell-check"
        payload = {"companyId": company_id}
        resp = requests.post(endpoint, json=payload, headers=self.headers)
        result = resp.json()
        
        # 典型空壳信号
        shell_signals = {
            "zero_social_security": result.get("socialSecurityCount", 0) == 0,
            "residential_address": "居民" in result.get("address", ""),
            "mismatch_annual_report": result.get("annualReportMismatch", False),
            "frequent_shareholder_change": result.get("shareholderChange6Months", 0) > 2,
        }
        result["shellProbability"] = sum(shell_signals.values()) / len(shell_signals)
        return result
    
    def verify_qualifications(self, company_id: str) -> list:
        """
        L4 资质验证
        返回行政许可列表,标注有效期和吊销状态
        """
        endpoint = f"{self.base_url}/company/qualifications"
        payload = {"companyId": company_id}
        resp = requests.post(endpoint, json=payload, headers=self.headers)
        qualifications = resp.json().get("data", [])
        
        # 筛选即将到期或已失效的资质
        from datetime import datetime, timedelta
        alerts = []
        for qual in qualifications:
            expiry = datetime.strptime(qual["expiryDate"], "%Y-%m-%d")
            if expiry < datetime.now():
                alerts.append(f"资质[{qual['name']}]已过期")
            elif expiry < datetime.now() + timedelta(days=90):
                alerts.append(f"资质[{qual['name']}]距到期不足90天")
        
        return {"qualifications": qualifications, "alerts": alerts}


# 使用示例
if __name__ == "__main__":
    verifier = CompanyIdentityVerifier(api_key="your_api_key")
    
    # 四层核验一体化调用
    company = "XX供应链有限公司"
    basic = verifier.verify_basic_info(company, "91110000XXXXXXXXXX")
    shareholders = verifier.penetrate_shareholders(basic["companyId"])
    shell_check = verifier.detect_shell_company(basic["companyId"])
    qualifications = verifier.verify_qualifications(basic["companyId"])
    
    print(f"核验结果: {json.dumps({
        'basic': basic['status'],
        'shellProbability': shell_check['shellProbability'],
        'qualificationAlerts': len(qualifications['alerts'])
    }, indent=2, ensure_ascii=False)}")

预期返回示例

{
  "basic": "VERIFIED",
  "companyId": "9a8b7c6d5e4f",
  "shellProbability": 0.75,
  "shellSignals": {
    "zero_social_security": true,
    "residential_address": true,
    "mismatch_annual_report": true,
    "frequent_shareholder_change": false
  },
  "shareholderChain": {
    "depth": 5,
    "finalBeneficiary": "张三",
    "riskFlags": ["CROSS_HOLDING_DETECTED"]
  },
  "qualificationAlerts": [
    "资质[危险化学品经营许可证]距到期不足90天"
  ]
}

2.2 支柱二:关系数据——“谁跟谁是一伙的”

关系数据覆盖股权、人员、交易三个维度:

维度 查询路径 识别目标
股权 出资链条 → 最终自然人 金字塔结构、交叉持股、影子实控人
人员 董监高任职 → 企业间交叉 隐性控制、一致行动人
交易 共同对手方 → 供应商/客户网络 间接利益输送通道

代码实现:企业关系网络子图发现

import networkx as nx
from typing import Set, Dict

class RelationshipGraphBuilder:
    """企业关系知识图谱构建"""
    
    def __init__(self, api_client):
        self.api = api_client
        self.graph = nx.MultiDiGraph()
    
    def discover_subgraph(
        self, 
        company_id: str, 
        degrees: int = 3
    ) -> Dict[str, Set[str]]:
        """
        以目标企业为中心,抓取N度范围内的关联关系子图
        
        Args:
            company_id: 目标企业ID
            degrees: 穿透度数(3-5度推荐,过大会导致性能问题)
        
        Returns:
            按关系类型分类的关联企业集合
        """
        # 构建三层关系网络
        relations = {
            "investment": self._trace_investment_chain(company_id, degrees),
            "personnel": self._find_personnel_overlap(company_id, degrees),
            "transaction": self._detect_transaction_links(company_id, degrees)
        }
        
        # 交叉维度分析:找同时出现在多个维度中的企业
        all_entities = {}
        for rel_type, entities in relations.items():
            for entity_id in entities:
                if entity_id not in all_entities:
                    all_entities[entity_id] = set()
                all_entities[entity_id].add(rel_type)
        
        # 同时出现在3个维度 = 高风险隐性关联
        high_risk = {
            eid for eid, rels in all_entities.items() 
            if len(rels) >= 3
        }
        
        return {
            "relations": relations,
            "highRiskEntities": list(high_risk),
            "totalNodes": len(all_entities)
        }
    
    def _trace_investment_chain(self, company_id: str, depth: int) -> set:
        """沿股权链追溯投资关系"""
        endpoint = f"{self.api.base_url}/graph/investment"
        payload = {"companyId": company_id, "maxDepth": depth}
        resp = requests.post(endpoint, json=payload, headers=self.api.headers)
        data = resp.json()
        
        # 构建NetworkX有向图(投资方向)
        for edge in data.get("edges", []):
            self.graph.add_edge(
                edge["from"], edge["to"], 
                weight=edge["ratio"],
                relation_type="investment"
            )
        
        return {n for n in self.graph.nodes()}
    
    def _find_personnel_overlap(self, company_id: str, depth: int) -> set:
        """识别人员重叠"""
        endpoint = f"{self.api.base_url}/graph/personnel"
        payload = {"companyId": company_id, "maxDepth": depth}
        resp = requests.post(endpoint, json=payload, headers=self.api.headers)
        data = resp.json()
        
        related_companies = set()
        for person in data.get("personnel", []):
            for company in person.get("positions", []):
                if company["companyId"] != company_id:
                    related_companies.add(company["companyId"])
                    self.graph.add_edge(
                        company_id, company["companyId"],
                        via_person=person["name"],
                        relation_type="personnel_overlap"
                    )
        
        return related_companies
    
    def _detect_transaction_links(self, company_id: str, depth: int) -> set:
        """通过共同交易对手方发现间接关联"""
        endpoint = f"{self.api.base_url}/graph/transaction-link"
        payload = {"companyId": company_id, "maxDepth": depth}
        resp = requests.post(endpoint, json=payload, headers=self.api.headers)
        data = resp.json()
        
        linked = set()
        for partner in data.get("commonPartners", []):
            if partner["sharedCompanies"] > 3:
                # 共享超过3个交易对手方 = 可疑信号
                for linked_company in partner["linkedEntities"]:
                    linked.add(linked_company)
        
        return linked


# 使用示例
graph_builder = RelationshipGraphBuilder(api_client=verifier)
result = graph_builder.discover_subgraph("9a8b7c6d5e4f", degrees=3)
print(f"子图规模: {result['totalNodes']}个节点, "
      f"高风险关联: {len(result['highRiskEntities'])}个")

2.3 支柱三:行为数据——持续监控与技术实现

行为数据覆盖司法涉诉、行政处罚、经营异常、信用记录、资产变动五大类。它的核心特征是持续变化,因此技术实现的关键是自动化监控 + 主动推送

from datetime import datetime
import asyncio

class BehaviorMonitor:
    """企业行为数据持续监控 + 风险预警"""
    
    def __init__(self, api_client, alert_threshold: float = 0.6):
        self.api = api_client
        self.threshold = alert_threshold
        self.watchlist: Dict[str, datetime] = {}
    
    def add_to_watchlist(self, company_id: str):
        """将企业加入监控清单"""
        self.watchlist[company_id] = datetime.now()
    
    def check_risk_events(self, company_id: str) -> dict:
        """全维度行为数据查询"""
        dimensions = [
            "judicial_cases",       # 司法涉诉
            "administrative_penalty", # 行政处罚
            "business_exception",    # 经营异常
            "dishonest_record",      # 失信记录
            "asset_freeze"           # 资产冻结
        ]
        
        results = {}
        for dim in dimensions:
            endpoint = f"{self.api.base_url}/company/behavior/{dim}"
            resp = requests.post(
                endpoint, 
                json={"companyId": company_id, "timeRange": "3Y"},
                headers=self.api.headers
            )
            data = resp.json()
            results[dim] = {
                "total": data.get("count", 0),
                "recent_6m": data.get("recent6Months", 0),
                "severity": data.get("maxSeverity", "normal")
            }
        
        # 风险评分:近期事件数量 + 严重程度加权
        severity_weights = {"high": 3, "medium": 2, "low": 1, "normal": 0}
        risk_score = sum(
            results[dim]["recent_6m"] * severity_weights[results[dim]["severity"]]
            for dim in dimensions
        )
        results["riskScore"] = risk_score
        results["riskLevel"] = (
            "HIGH" if risk_score > 10 
            else "MEDIUM" if risk_score > 5 
            else "LOW"
        )
        
        return results
    
    async def daily_scan(self):
        """每日定时扫描监控清单中的所有企业"""
        while True:
            alerts = []
            for company_id in list(self.watchlist.keys()):
                result = self.check_risk_events(company_id)
                if result["riskLevel"] == "HIGH":
                    alerts.append({
                        "companyId": company_id,
                        "riskScore": result["riskScore"],
                        "details": result,
                        "timestamp": datetime.now().isoformat()
                    })
            
            if alerts:
                self._send_alerts(alerts)
            
            # 每日运行一次
            await asyncio.sleep(86400)
    
    def _send_alerts(self, alerts: list):
        """推送预警(对接企业微信/钉钉/飞书/邮件)"""
        webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
        for alert in alerts:
            message = {
                "msgtype": "markdown",
                "markdown": {
                    "content": f"""
## 🚨 企业风险预警
> 企业ID: {alert['companyId']}
> 风险评分: **{alert['riskScore']}** (HIGH)
> 检测时间: {alert['timestamp']}

请及时评估对该企业合同履行的影响。
                    """
                }
            }
            requests.post(webhook_url, json=message)

三、五大业务场景:完整代码实践

在这里插入图片描述

3.1 场景一:客商入库——从"资格核验"升级为"风险画像"

业务痛点:当前客商准入只核验营业执照复印件,回答不了"这家公司有没有问题"。

技术方案:在入库审批节点上,系统自动调取外部数据,完成四层身份核验 + 风险标记。

#!/bin/bash
# 客商入库自动化核验脚本
# 触发时机:采购系统提交供应商入库申请时

COMPANY_NAME="$1"
CREDIT_CODE="$2"

echo "=== 开始核验供应商: ${COMPANY_NAME} ==="

# 步骤1:工商信息核验
echo "[1/5] 工商信息核验..."
BASIC_RESULT=$(curl -s -X POST https://api.qcc.com/company/verify \
  -H "Authorization: Bearer ${QCC_API_KEY}" \
  -d "{\"keyword\":\"${COMPANY_NAME}\",\"creditCode\":\"${CREDIT_CODE}\"}")

STATUS=$(echo $BASIC_RESULT | jq -r '.status')
if [ "$STATUS" != "VERIFIED" ]; then
    echo "❌ 工商核验不通过: ${STATUS}"
    exit 1
fi

# 步骤2:股权穿透
echo "[2/5] 股权穿透..."
COMPANY_ID=$(echo $BASIC_RESULT | jq -r '.companyId')
SHAREHOLDER_RESULT=$(curl -s -X POST https://api.qcc.com/company/shareholder/penetrate \
  -H "Authorization: Bearer ${QCC_API_KEY}" \
  -d "{\"companyId\":\"${COMPANY_ID}\",\"maxDepth\":10}")

BENEFICIARY=$(echo $SHAREHOLDER_RESULT | jq -r '.finalBeneficiary')
echo "  最终受益人: ${BENEFICIARY}"

# 步骤3:空壳检测
echo "[3/5] 空壳检测..."
SHELL_RESULT=$(curl -s -X POST https://api.qcc.com/company/risk/shell-check \
  -H "Authorization: Bearer ${QCC_API_KEY}" \
  -d "{\"companyId\":\"${COMPANY_ID}\"}")

SHELL_PROB=$(echo $SHELL_RESULT | jq -r '.shellProbability')
if (( $(echo "$SHELL_PROB > 0.5" | bc -l) )); then
    echo "⚠️ 空壳风险概率: ${SHELL_PROB}"
fi

# 步骤4:司法风险扫描
echo "[4/5] 司法风险扫描..."
RISK_RESULT=$(curl -s -X POST https://api.qcc.com/company/risk/scan \
  -H "Authorization: Bearer ${QCC_API_KEY}" \
  -d "{\"companyId\":\"${COMPANY_ID}\"}")

RISK_FLAGS=$(echo $RISK_RESULT | jq -r '.riskFlags | join(", ")')
echo "  风险标记: ${RISK_FLAGS:-无}"

# 步骤5:综合风险评级
echo "[5/5] 综合评估..."
# 整合四层核验结果,输出入库决策建议
RISK_SCORE=$(echo $RISK_RESULT | jq -r '.overallScore')
echo ""
echo "=== 核验完成 ==="
echo "供应商: ${COMPANY_NAME}"
echo "综合风险评分: ${RISK_SCORE}/100"
echo "建议: $(if [ $RISK_SCORE -gt 80 ]; then echo '❌ 高风险,不建议入库'; elif [ $RISK_SCORE -gt 50 ]; then echo '⚠️ 提交风控部门复核'; else echo '✅ 自动通过'; fi)"

3.2 场景二:关联交易审查——从"企业申报"到"子图发现"

业务痛点:关联方清单是企业自己报的。如果企业不报,审查就无从启动。

技术方案:知识图谱的子图发现能力——一次查询抓取N度范围内所有关联节点。

def find_hidden_related_parties(
    company_id: str, 
    blacklist_companies: list
) -> list:
    """
    关联交易审查核心函数
    在目标企业的关系网络中,查找与黑名单企业存在隐性关联的节点
    
    算法思路:
    1. 以目标企业为中心,构建3-5度关系子图
    2. 找出子图中与黑名单企业通过任何路径相连的节点
    3. 这些节点就是"隐性关联方"
    """
    graph_builder = RelationshipGraphBuilder(api_client)
    subgraph = graph_builder.discover_subgraph(company_id, degrees=4)
    
    # 构造关系网络
    G = graph_builder.graph
    
    hidden_relations = []
    for node in subgraph["highRiskEntities"]:
        # 检查该节点是否有通向黑名单企业的路径
        for blacklisted in blacklist_companies:
            if nx.has_path(G, node, blacklisted):
                path = nx.shortest_path(G, node, blacklisted)
                hidden_relations.append({
                    "entity": node,
                    "connectedTo": blacklisted,
                    "pathLength": len(path),
                    "path": path,
                    "riskType": "HIDDEN_RELATED_PARTY"
                })
    
    # 按路径长度排序:越短的关系越直接,风险越高
    hidden_relations.sort(key=lambda x: x["pathLength"])
    
    return hidden_relations


# 使用示例
blacklist = ["blacklisted_company_001", "blacklisted_company_002"]
hidden = find_hidden_related_parties("target_company_id", blacklist)
for relation in hidden:
    print(f"⚠️ 发现隐性关联: {relation['entity']} ←→ {relation['connectedTo']} "
          f"(距离: {relation['pathLength']}度)")

预期返回

[
  {
    "entity": "XX贸易有限公司",
    "connectedTo": "blacklisted_company_001",
    "pathLength": 2,
    "path": [
      "XX贸易有限公司",
      "张三(共同法人)",
      "blacklisted_company_001"
    ],
    "riskType": "HIDDEN_RELATED_PARTY"
  }
]

3.3 场景三:虚假贸易——交叉比对自动识别

业务痛点:合同真实、发票真实、资金流真实,但贸易本身是假的。破绽不在单据上,在交易对手的企业画像上。

技术方案:将内部交易数据与外部企业数据进行交叉比对,输出矛盾信号。

def detect_fake_trade(
    internal_transaction: dict,
    external_profile: dict
) -> dict:
    """
    虚假贸易识别引擎
    
    Args:
        internal_transaction: 内部交易数据(合同金额、品类、对手方)
        external_profile: 外部企业数据(注册资本、社保、经营范围、关联关系)
    
    Returns:
        矛盾信号列表 + 虚假贸易概率
    """
    anomalies = []
    
    # 规则1:交易规模与经营能力不匹配
    contract_amount = internal_transaction["amount"]
    registered_capital = external_profile["registeredCapital"]
    social_security = external_profile["socialSecurityCount"]
    
    if social_security == 0 and contract_amount > registered_capital * 2:
        anomalies.append({
            "type": "CAPACITY_MISMATCH",
            "detail": f"社保0人,合同金额({contract_amount}万)远超注册资金({registered_capital}万)",
            "severity": "HIGH"
        })
    
    # 规则2:经营范围与交易品类不匹配
    biz_scope = external_profile["businessScope"]
    trade_category = internal_transaction["category"]
    if not is_category_in_scope(trade_category, biz_scope):
        anomalies.append({
            "type": "SCOPE_MISMATCH",
            "detail": f"交易品类[{trade_category}]不在经营范围中",
            "severity": "MEDIUM"
        })
    
    # 规则3:隐性关联关系
    buyer_id = internal_transaction["buyerId"]
    seller_id = internal_transaction["sellerId"]
    hidden_link = check_hidden_relationship(buyer_id, seller_id)
    if hidden_link:
        anomalies.append({
            "type": "HIDDEN_RELATIONSHIP",
            "detail": f"买方与卖方存在隐性关联: {hidden_link}",
            "severity": "HIGH"
        })
    
    # 规则4:短期频繁变更
    if external_profile.get("shareholderChange6Months", 0) > 3:
        anomalies.append({
            "type": "FREQUENT_CHANGE",
            "detail": f"近6个月股东变更{external_profile['shareholderChange6Months']}次",
            "severity": "MEDIUM"
        })
    
    # 综合评分
    severity_score = sum(
        3 if a["severity"] == "HIGH" else 2 for a in anomalies
    )
    
    return {
        "transactionId": internal_transaction["id"],
        "anomalies": anomalies,
        "anomalyCount": len(anomalies),
        "fakeProbability": min(severity_score / 10, 1.0),
        "decision": "REJECT" if severity_score >= 5 else "REVIEW" if severity_score >= 3 else "PASS"
    }


def is_category_in_scope(category: str, business_scope: str) -> bool:
    """检查交易品类是否在企业经营范围内"""
    # 实际实现可使用NLP相似度匹配
    category_keywords = {
        "电解铜": ["有色金属", "矿产品", "金属材料"],
        "医疗器械": ["医疗器械", "医疗设备"],
        "化工原料": ["化工", "化学", "危险化学品"]
    }
    keywords = category_keywords.get(category, [category])
    return any(kw in business_scope for kw in keywords)

3.4 场景四:合同全周期风险监控

import schedule
import time

class ContractRiskMonitor:
    """合同履行期间的全周期风险监控"""
    
    def __init__(self, api_client, db_conn):
        self.api = api_client
        self.db = db_conn
        self.monitor = BehaviorMonitor(api_client)
    
    def load_active_contracts(self) -> list:
        """从合同台账中加载所有履行中的合同"""
        cursor = self.db.execute(
            "SELECT contract_id, counterparty_id, amount, expiry "
            "FROM contracts WHERE status = 'ACTIVE'"
        )
        return cursor.fetchall()
    
    def scan_all_counterparties(self):
        """批量扫描所有合同相对方"""
        contracts = self.load_active_contracts()
        alerts = []
        
        for contract in contracts:
            risk = self.monitor.check_risk_events(contract["counterparty_id"])
            
            if risk["riskLevel"] in ("HIGH", "MEDIUM"):
                alerts.append({
                    "contractId": contract["contract_id"],
                    "counterpartyId": contract["counterparty_id"],
                    "contractAmount": contract["amount"],
                    "riskLevel": risk["riskLevel"],
                    "riskDetails": risk
                })
        
        # 按合同金额 × 风险等级排序,优先处理大额高风险合同
        alerts.sort(
            key=lambda x: x["contractAmount"] * (3 if x["riskLevel"] == "HIGH" else 2),
            reverse=True
        )
        
        return alerts


# 定时任务:每日凌晨3点执行全量扫描
monitor = ContractRiskMonitor(api_client, db_connection)

schedule.every().day.at("03:00").do(monitor.scan_all_counterparties)

while True:
    schedule.run_pending()
    time.sleep(60)

3.5 场景五:投资尽调——穿透式核查

-- 投资尽调穿透式核查:SQL视角的数据整合
-- 此查询整合了目标企业及其关联方的多维风险数据

WITH target_company AS (
    SELECT * FROM companies WHERE id = '9a8b7c6d5e4f'
),
shareholder_tree AS (
    -- 递归CTE:股权穿透至最终受益人
    SELECT 
        shareholder_id,
        company_id,
        ratio,
        1 AS depth
    FROM shareholdings
    WHERE company_id = '9a8b7c6d5e4f'
    
    UNION ALL
    
    SELECT 
        s.shareholder_id,
        s.company_id,
        s.ratio,
        st.depth + 1
    FROM shareholdings s
    JOIN shareholder_tree st ON s.company_id = st.shareholder_id
    WHERE st.depth < 10
),
related_parties AS (
    -- 关联方识别:人员任职 + 共同投资
    SELECT DISTINCT 
        p.company_id AS related_id,
        'PERSONNEL' AS relation_type
    FROM personnel p
    WHERE p.person_id IN (
        SELECT person_id FROM personnel WHERE company_id = '9a8b7c6d5e4f'
    )
    
    UNION
    
    SELECT DISTINCT
        i.investee_id AS related_id,
        'CO_INVESTMENT' AS relation_type
    FROM investments i
    WHERE i.investor_id IN (
        SELECT shareholder_id FROM shareholder_tree
    )
)
-- 主查询:汇总所有风险信号
SELECT
    tc.name AS target_name,
    COUNT(DISTINCT st.shareholder_id) AS shareholder_count,
    MAX(st.depth) AS max_penetration_depth,
    COUNT(DISTINCT rl.case_id) FILTER (
        WHERE rl.case_date > CURRENT_DATE - INTERVAL '3 years'
    ) AS recent_lawsuits,
    COUNT(DISTINCT ap.case_id) AS admin_penalties,
    COUNT(DISTINCT dh.record_id) AS dishonesty_records,
    COUNT(DISTINCT af.asset_id) AS frozen_assets,
    -- 综合风险评级
    CASE 
        WHEN COUNT(DISTINCT dh.record_id) > 0 THEN 'HIGH'
        WHEN COUNT(DISTINCT rl.case_id) > 5 THEN 'MEDIUM'
        ELSE 'LOW'
    END AS overall_risk
FROM target_company tc
LEFT JOIN shareholder_tree st ON true
LEFT JOIN related_parties rp ON true
LEFT JOIN risk_lawsuits rl ON rl.company_id IN (
    SELECT related_id FROM related_parties UNION SELECT '9a8b7c6d5e4f'
)
LEFT JOIN admin_penalties ap ON ap.company_id IN (
    SELECT related_id FROM related_parties UNION SELECT '9a8b7c6d5e4f'
)
LEFT JOIN dishonest_records dh ON dh.company_id IN (
    SELECT related_id FROM related_parties UNION SELECT '9a8b7c6d5e4f'
)
LEFT JOIN asset_freezes af ON af.company_id IN (
    SELECT related_id FROM related_parties UNION SELECT '9a8b7c6d5e4f'
)
GROUP BY tc.name;

四、MCP Server配置与工具速查

企查查MCP(基于2026年6月版本)提供6大Server、182+原子工具,支持SSE协议实时传输。

4.1 MCP Server配置

{
  "mcpServers": {
    "qcc-company": {
      "command": "npx",
      "args": ["@qcc/mcp-company@latest"],
      "env": {
        "QCC_API_KEY": "your_api_key_here"
      }
    },
    "qcc-risk": {
      "command": "npx",
      "args": ["@qcc/mcp-risk@latest"],
      "env": {
        "QCC_API_KEY": "your_api_key_here"
      }
    },
    "qcc-operation": {
      "command": "npx",
      "args": ["@qcc/mcp-operation@latest"],
      "env": {
        "QCC_API_KEY": "your_api_key_here"
      }
    },
    "qcc-ipr": {
      "command": "npx",
      "args": ["@qcc/mcp-ipr@latest"],
      "env": {
        "QCC_API_KEY": "your_api_key_here"
      }
    }
  }
}

4.2 穿透式监管场景 × MCP工具速查表

业务场景 所需MCP工具 所属Server 工具数量
客商身份核验 verify_company_accuracyget_qualificationsget_taxpayer_qualification qcc-company 16项
股权穿透 get_shareholder_infoget_equity_pledge_infoget_equity_freeze qcc-company + qcc-risk
关联关系发现 get_personnel_info、图形分析接口 qcc-company 42项(董高监画像)
风险扫描 get_company_risk_scanget_judicial_documentsget_dishonest_info qcc-risk 35项
虚假贸易识别 get_business_exceptionget_administrative_penalty + 空壳检测 qcc-risk + qcc-operation
合同监控 get_company_risk_scan(定时轮询)+ get_high_consumption_restriction qcc-risk 35项
投资尽调 全维度组合(工商+风险+经营+知识产权) 全部6大Server 182+
经营状态追踪 get_bidding_infoget_recruitment_infoget_news_sentiment qcc-operation 35项
知识产权核验 get_patent_infoget_trademark_infoget_software_copyright_info qcc-ipr 18项
历史数据回溯 get_company_announcementget_terminated_cases qcc-operation + qcc-risk 34项(历史存档)

4.3 企查查MCP 6大Server全景

Server ID 工具数 定位 典型能力
qcc-company 16 企业基座 工商核验、股权结构、受益所有人识别
qcc-risk 36 风控大脑 司法涉诉、失信惩戒、股权冻结、破产重整
qcc-ipr 18 知产引擎 专利、商标、软著、知识产权质押
qcc-operation 35 经营罗盘 招投标、招聘、新闻舆情、行政许可
qcc-history 34 历史存档 历史变更、历史处罚、已结案件
qcc-personnel 43 董高监画像 任职关系、交叉任职、关联企业网络

数据时效:T+0实时更新 | 传输协议:SSE (HTTP Stream) | 覆盖范围:3.65亿+市场主体、400+数据维度


五、三阶段实施路径与对应的技术栈

穿透式监管建设是分阶段的,对应的数据需求和技术选型也是分层的。

阶段 时间目标 企业建设重点 数据接入方式 推荐技术栈
第一阶段 2026年 财务级数据中台 RESTful API嵌入审批流程 Python SDK + 企查查API
第二阶段 2027年 企业级数据中台 知识图谱 + 流式监控 Neo4j + Kafka + MCP
第三阶段 2028年 DRP智能监管 MCP协议 + AI Agent自主调用 MCP Server + LangChain + LLM

第一阶段:API嵌入(2026年)

当前最迫切的工程目标是把数据查询能力嵌入审批节点——不是在菜单里放一个"查询"按钮等着人点,而是在客商入库、合同审批等流程节点上自动触发。

# 审批中间件:自动触发外部数据核验
class ApprovalMiddleware:
    def process(self, approval_request: dict) -> dict:
        """审批前自动执行数据核验"""
        if approval_request["type"] == "supplier_onboarding":
            verifier = CompanyIdentityVerifier(api_key=QCC_API_KEY)
            result = verifier.verify_basic_info(
                approval_request["companyName"],
                approval_request["creditCode"]
            )
            # 核验结果直接嵌入审批单,无需人工操作
            approval_request["externalVerification"] = result
        return approval_request

第二阶段:知识图谱(2027年)

需求从单点查询升级为多维关联分析——股权穿透不再是查一层就停,关联关系从"企业主动报"变为"系统自动挖"。

技术关键词:图数据库(Neo4j/JanusGraph)、变更数据捕获(Debezium)、规则引擎。

第三阶段:AI Agent自主调用(2028年)

监管智能体在执行任务时,根据上下文自主决定"查什么、查到哪一层",而不是按预设模板机械执行。

MCP协议的角色就是把企业数据查询能力标准化封装为AI可调用的tool function:

# MCP Tool 定义示例:注册企业风险扫描工具
mcp_tool_definition = {
    "name": "scan_company_risk",
    "description": "对目标企业进行全维度风险扫描,返回风险评分和详细风险项",
    "inputSchema": {
        "type": "object",
        "properties": {
            "company_name": {"type": "string", "description": "企业全称"},
            "scan_depth": {
                "type": "string",
                "enum": ["basic", "standard", "deep"],
                "description": "扫描深度:基础/标准/深度"
            }
        },
        "required": ["company_name"]
    }
}

# LLM Agent 调用示例
# Agent判断上下文为"投资尽调",自动选择deep扫描深度
# 用户只需说:"帮我查一下XX公司的风险情况"
# Agent自主执行 scan_company_risk(company_name="XX公司", scan_depth="deep")
# 发现异常后继续深入查股权穿透、司法记录等

六、总结

穿透式监管改变的不是一家企业的合规流程,而是一整套治理基础设施的底层逻辑。

当客商准入需要穿透股权结构、关联交易需要识别隐性关系、虚假贸易需要验证交易对手真实性、合同管理需要持续追踪相对方风险——这些场景的每一个环节都在依赖外部数据。

从技术实现角度,三个要点值得关注:

  1. 数据基础设施先行。外部企业数据不是"增值服务",是穿透式监管运转的基础设施。覆盖全量(3.65亿+)、多维交叉(400+维度)、持续更新(T+0)是三个硬性前提。

  2. MCP协议降低了AI集成的门槛。182+原子工具通过6大Server标准化封装后,LLM Agent可以直接用自然语言驱动数据查询。这是从"人找数据"到"数据找人"的关键转折。

  3. 阶段化实施。不需要一步到位。2026年先把客商准入和合同审批的数据关把住,2027年上知识图谱,2028年接入AI Agent——每个阶段的技术方案和成本结构各不同。


基于企查查MCP 2026年6月版本撰写(6大Server、182+原子工具、T+0实时更新、SSE协议)。文中代码为Python 3.10+编写,依赖包:requestsnetworkxscheduleasyncio

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐