关于 Causal Panopticon MCP Server
Causal Panopticon MCP Server 为研究人员、政策分析师和 AI Agent 提供因果发现与推断。它整合 18 个数据源并运行因果算法,返回处理效应和反事实等结构化结果。
主要功能
- 01发现跨领域因果结构
- 02估计干预效应
- 03计算反事实
- 04检验效应可迁移性
- 05检测混杂因素并验证模型
- 06优化因果实验
适用场景
- 01评估政策对经济结果的影响
- 02生成跨领域因果假设
- 03估计临床或公共卫生反事实
- 04规划干预并验证因果模型
MCP 相关
通过 Streamable HTTP 暴露八种因果分析工具,包括因果发现、效应估计、反事实计算和模型验证。MCP 客户端可通过单一连接调用这些工具。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://ryanclinton--causal-panopticon-mcp.apify.actor/mcpclaude mcp add --transport http causal-panopticon https://ryanclinton--causal-panopticon-mcp.apify.actor/mcp{"mcpServers":{"causal-panopticon":{"type":"http","url":"https://ryanclinton--causal-panopticon-mcp.apify.actor/mcp"}}}在 Cursor 中打开{"servers":{"causal-panopticon":{"type":"http","url":"https://ryanclinton--causal-panopticon-mcp.apify.actor/mcp"}}}在 VS Code 中打开{"mcpServers":{"causal-panopticon":{"type":"http","url":"https://ryanclinton--causal-panopticon-mcp.apify.actor/mcp"}}}{"mcpServers":{"causal-panopticon":{"serverUrl":"https://ryanclinton--causal-panopticon-mcp.apify.actor/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
Causal Panopticon MCP 服务
快速开始
添加到你的 MCP 客户端(Claude Desktop、Cursor、Windsurf):
{
"mcpServers": {
"causal-panopticon-mcp": {
"url": "https://ryanclinton--causal-panopticon-mcp.apify.actor/mcp"
}
}
}
Causal Panopticon 是一款面向 AI Agent 的跨领域因果发现与推理引擎,通过 Model Context Protocol 提供服务。它协调经济、健康、环境、安全、政策、金融、学术和劳动力领域的 18 个异构数据源,运用 8 种经过同行评审的因果算法,发现真正的因果关系,而不仅仅是相关性。
它专为需要超越相关性、深入因果结构的研究人员、政策分析师和 AI Agent 打造。每次工具调用都会并行启动最多 18 个数据 Actor,构建因果图,并通过单个 MCP 连接返回结构化推理结果,包括平均处理效应、反事实值、可迁移性判断和经过验证的 DAG 结构。
可以访问哪些数据源?
| 数据点 | 来源 | 覆盖范围 |
|---|---|---|
| 📊 经济时间序列 | FRED Economic Data | 超过 80 万条美国序列 |
| 👷 劳动力统计数据 | BLS Economic Data | 美国就业、工资、价格 |
| 🌐 全球宏观经济指标 | IMF Data | 190 个国家 |
| 🏥 健康统计数据 | WHO GHO Data | 全球健康指标 |
| 🧪 临床研究 | ClinicalTrials.gov | 全球注册试验 |
| 🔬 生物医学文献 | PubMed Search | 超过 3,500 万篇文章 |
| 🌦️ 天气和气候数据 | NOAA Weather | 美国及全球观测数据 |
| 💨 空气质量测量数据 | OpenAQ | 全球监测站 |
| 🔐 网络安全漏洞 | NVD CVE Search | 所有已发布的 CVE |
| 📜 美国立法 | Congress Bill Search | 当前和历史法案 |
| 📋 美国监管文件 | Federal Register Search | 联邦法规和公告 |
| 🏢 企业 SEC 文件 | SEC EDGAR Search | 所有上市公司的文件 |
| 📈 市场和股票数据 | Finnhub Financial Data | 全球股票 |
| 🎓 学术出版物 | OpenAlex | 超过 2.5 亿篇学术作品 |
| 🌪️ 灾害声明 | FEMA Disaster Search | 美国灾害记录 |
| ⚠️ 消费品安全 | CPSC Recall Search | 产品召回警报 |
| 💊 药物不良事件 | FDA Drug Event Search | FAERS 数据库 |
| 💼 就业市场趋势 | Job Market Intelligence | 就业信号 |
为什么使用 Causal Panopticon MCP Server?
基于相关性的分析速度快,但用于决策时风险很高。一个发现空气质量与住院人数相关的政策团队,无法判断是污染导致疾病、疾病导致人们迁往污染地区,还是贫困同时混杂了两者。弄错这一点意味着干预措施白白浪费,机会也会错失。
手动进行因果分析——从 18 个独立来源收集数据、应用条件独立性检验、构建 DAG、检查后门准则——训练有素的经济学家也需要数周时间。这个 MCP 服务只需一次 AI Agent 工具调用即可完成。
通过 MCP 协议连接后,你在 Claude Desktop、Cursor 或任何兼容 MCP 的客户端中的 AI Agent,无需编写任何数据收集代码,即可获得因果推理能力。
- 定时运行——按固定计划运行因果发现,以检测现实世界因果关系随时间发生的结构性变化
- API 访问——通过 Apify 平台 API,从 Python、JavaScript 或任何 HTTP 客户端触发运行
- 代理轮换——通过 Apify 内置的代理基础设施从 18 个来源收集数据,避免触发速率限制
- 监控——当工具调用失败或返回意外结果时,接收 Slack 或电子邮件提醒
- 集成——连接到 Zapier、Make、Google Sheets 或任何兼容 webhook 的工作流
MCP 工具
| 工具 | 算法 | 最适合 | 每次调用成本 |
|---|---|---|---|
discover_cross_domain_causes | PC / GES / NOTEARS 元算法 + 传递熵 | 发现跨领域的因果结构 | $0.04 |
estimate_interventional_effect | Do 演算(三条规则)、后门、前门、IV | 治疗效果估计、政策评估 | $0.04 |
compute_counterfactual | Pearl 的 SCM:溯因 → 行动 → 预测 | 回顾性归因、假设分析 | $0.04 |
transport_causal_effect | Bareinboim-Pearl 可迁移性、s-可采纳性 | 将研究结果推广到不同人群 | $0.04 |
detect_confounders | 图结构 + 偏相关分析 | 识别因果推断面临的威胁 | $0.04 |
simulate_causal_agents | 贝叶斯劝说、Kamenica-Gentzkow 凹化 | 专家意见分歧建模、政策劝说 | $0.04 |
optimize_causal_experiment | 因果贝叶斯优化、期望改进 | 实验设计、主动学习 | $0.04 |
validate_causal_model | DAG 无环性、马尔可夫兼容性、忠实性、BIC | 模型检查、算法比较 | $0.04 |
功能
- 元算法选择 —
auto模式运行全部三种结构学习算法(PC、GES、NOTEARS),并选择 BIC 评分最佳的结果,让你无需手动调优即可获得最适合数据的 DAG - PC 算法 — 使用 Pearson 偏相关检验和 Fisher z 检验(Abramowitz-Stegun 近似)的基于约束的因果发现;可通过
alpha参数控制显著性水平 - GES 算法 — 采用前向和后向 BIC 评分阶段的贪心等价搜索;非常适合因果图较稠密、PC 骨架可能过度剪枝的情况
- NOTEARS 算法 — 使用迹指数无环约束进行连续优化(泰勒级数近似至 8 阶);将组合式 DAG 搜索转化为可微问题
- Do-calculus 识别 — 实现 Pearl 的 do-calculus 三条规则;依次应用后门准则、前门准则和工具变量识别,并返回识别出因果效应的准则
- SCM 反事实 — Pearl 的三步流程:溯因(通过残差化推断外生噪声 U)、行动(修改结构方程以构造假设情景)、预测(沿修改后的 SCM 的拓扑顺序进行传播)
- Bareinboim-Pearl 可迁移性 — 使用选择图评估 s-可容许性;报告在源域中识别的因果效应能否有效迁移至目标域,并提供调整后的估计值
- 传递熵矩阵 — 使用核密度估计计算所有域对之间的滞后互信息;捕捉有向图可能遗漏的信息流
- 余极限图构造 — 使用有向图上的范畴论余极限,将各域的因果图合并为统一的因果图谱,同时保留特定于域的边作为跨域因果主张
- 贝叶斯说服模拟 — 在 Kamenica-Gentzkow 信号发送者-接收者博弈中模拟 3,000 个领域专家 Agent;对发送者在后验信念单纯形上的价值函数进行凹化,以找出最优信息披露策略
- 混杂因素检测 — 报告每个混杂因素的变量名、受其混杂的变量对、混杂强度(偏相关幅度)、该因素在图中是否可调整,以及对于不可调整的混杂因素是否存在工具变量
- 实验优化 — 因果贝叶斯优化通过方差缩减选择预期信息增益最大的干预变量;应用期望改进采集函数,并通过功效分析输出建议样本量
- 模型验证 — 四项独立验证准则:DAG 无环性(Kahn 拓扑排序)、Markov 兼容性(蕴含的独立性在数据中成立)、忠实性(不存在额外的独立性),以及带有各项检验单独 p 值的 BIC 拟合优度
- 并行数据收集 — 所有上游 Actor 通过
runActorsParallel同时运行,每个 Actor 超时限制为 180 秒,失败时则优雅地回退为空数组
跨域因果发现的用例
政策影响研究
评估立法提案的政策分析师和智库需要了解某项法律是否导致了某种结果,而不只是两者是否相关。使用 estimate_interventional_effect,并设置 sourceDomain: "policy" 和 targetDomain: "economics",即可估算立法变更对就业或 GDP 的平均处理效应;同时会报告识别准则,让你了解使用的是后门、前门还是 IV。
跨领域因果假设生成
构建知识图谱的研究团队和 AI Agent 往往局限于单一数据孤岛。discover_cross_domain_causes 会同时从全部 9 个领域组获取数据,通过元算法构建各领域的 DAG,并将其合并为余极限图。结果会呈现跨领域因果边,例如 NOAA 气候变量对 FRED 失业率序列的影响,而这类关联是单领域分析无法发现的。
临床和公共卫生归因
流行病学家和公共卫生研究人员需要反事实估计来回答归因问题。compute_counterfactual 使用 PubMed 和临床试验数据实现 Pearl 的溯因—行动—预测程序:“如果没有引入这项干预,死亡率会是多少?”外生噪声项根据观测残差推断得出,从而提供有统计依据的回顾性估计。
将研究结果推广到不同人群
发展经济学家和国际卫生研究人员经常需要将一个国家的数据研究结果应用于另一个国家。transport_causal_effect 使用根据源领域和目标领域图推导出的选择图,评估 Bareinboim-Pearl 的 s-可容许性。如果效应可迁移,它会返回重新加权后的调整估计;如果不可迁移,则会说明迁移失败的原因。
AI Agent 实验规划
负责因果学习工作流的 AI Agent,例如多次运行研究问题并不断迭代的 Agent,可以使用 optimize_causal_experiment 决定下一步对哪个变量进行干预。期望改进采集函数会选出干预后能最大限度降低目标后验方差的变量,并提供功效分析结果以规划样本量。
下游使用前验证因果模型
在使用发现的 DAG 做出决策或将其传递给下游分析之前,请使用 validate_causal_model 验证它是否满足 DAG 无环性、马尔可夫兼容性和忠实性。该工具会针对每项标准返回单独的检验 p 值,因此你可以报告接受或拒绝该结构的统计依据。
如何连接此 MCP 服务
Claude Desktop
将以下内容添加到你的 claude_desktop_config.json:
{
"mcpServers": {
"causal-panopticon": {
"url": "https://causal-panopticon-mcp.apify.actor/mcp",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
}
}
}
Cursor
将以下内容添加到 Cursor MCP 设置中:
{
"mcpServers": {
"causal-panopticon": {
"url": "https://causal-panopticon-mcp.apify.actor/mcp",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
}
}
}
任意兼容 MCP 的客户端
服务端点为:https://causal-panopticon-mcp.apify.actor/mcp
该服务使用 Streamable HTTP 传输,并支持所有标准 MCP 操作:tools/list、tools/call。
输入参数
此 MCP 服务没有 Actor 级输入。所有参数都由 AI Agent 在调用各工具时直接传入。
各工具参数
| 工具 | 参数 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|---|
discover_cross_domain_causes | query | string | 是 | — | 发送给所有领域执行器的搜索查询(例如“通货膨胀 医疗保健 就业”) |
discover_cross_domain_causes | domains | string[] | 否 | 全部 9 个 | 以下领域的子集:economics、health、environment、security、policy、finance、academia、disaster、labor |
discover_cross_domain_causes | algorithm | enum | 否 | auto | auto、pc、ges 或 notears |
discover_cross_domain_causes | alpha | number | 否 | 0.05 | PC 条件独立性检验的显著性水平 |
discover_cross_domain_causes | maxResults | number | 否 | 20 | 每个上游执行器获取的最大结果数 |
estimate_interventional_effect | query | string | 是 | — | 数据收集查询 |
estimate_interventional_effect | treatment | string | 是 | — | 处理/干预变量名称 |
estimate_interventional_effect | outcome | string | 是 | — | 结果变量名称 |
estimate_interventional_effect | domains | string[] | 否 | 全部 9 个 | 用于数据收集的领域 |
estimate_interventional_effect | maxResults | number | 否 | 15 | 每个执行器的最大结果数 |
compute_counterfactual | query | string | 是 | — | 数据收集查询 |
compute_counterfactual | interventionVariable | string | 是 | — | 要假设发生变化的变量 |
compute_counterfactual | interventionValue | number | 是 | — | 干预的假设值 |
compute_counterfactual | queryVariable | string | 是 | — | 要计算反事实值的变量 |
compute_counterfactual | domains | string[] | 否 | 全部 9 个 | 用于数据收集的领域 |
compute_counterfactual | maxResults | number | 否 | 15 | 每个执行器的最大结果数 |
transport_causal_effect | query | string | 是 | — | 两个领域共有的查询 |
transport_causal_effect | sourceDomain | string | 是 | — | 识别出效应的领域 |
transport_causal_effect | targetDomain | string | 是 | — | 要将效应迁移到的领域 |
transport_causal_effect | treatment | string | 是 | — | 处理变量 |
transport_causal_effect | outcome | string | 是 | — | 结果变量 |
transport_causal_effect | selectionVariables | string[] | 否 | — | 在不同领域之间存在差异的变量 |
transport_causal_effect | maxResults | number | 否 | 15 | 每个执行器的最大结果数 |
detect_confounders | query | string | 是 | — | 数据收集查询 |
detect_confounders | domains | string[] | 否 | 全部 9 个 | 用于数据收集的领域 |
detect_confounders | maxResults | number | 否 | 15 | 每个执行器的最大结果数 |
simulate_causal_agents | query | string | 是 | — | 要评估的因果主张或假设 |
simulate_causal_agents | numStates | number | 否 | 3 | 可能的因果状态数量(2–10) |
simulate_causal_agents | numAgents | number | 否 | 3000 | 要模拟的领域专家 Agent 数量 |
simulate_causal_agents | domains | string[] | 否 | 全部 9 个 | 用于数据收集的领域 |
simulate_causal_agents | maxResults | number | 否 | 10 | 每个执行器的最大结果数 |
optimize_causal_experiment | query | string | 是 | — | 研究问题或目标变量查询 |
optimize_causal_experiment | targetVariable | string | 是 | — | 要了解的变量 |
optimize_causal_experiment | budget | number | 否 | 100 | 实验预算(用于成本估算的抽象单位) |
optimize_causal_experiment | domains | string[] | 否 | 全部 9 个 | 用于数据收集的领域 |
optimize_causal_experiment | maxResults | number | 否 | 15 | 每个执行器的最大结果数 |
validate_causal_model | query | string | 是 | — | 数据收集查询 |
validate_causal_model | domains | string[] | 否 | 全部 9 个 | 用于数据收集的领域 |
validate_causal_model | algorithm | enum | 否 | auto | 要用于验证的算法:auto、pc、ges、notears |
validate_causal_model | maxResults | number | 否 | 15 | 每个执行器的最大结果数 |
使用示例
发现经济学与健康领域之间的因果结构:
{
"query": "inflation unemployment healthcare spending",
"domains": ["economics", "health", "labor"],
"algorithm": "auto",
"alpha": 0.05,
"maxResults": 20
}
估计政策干预效应:
{
"query": "minimum wage employment",
"treatment": "minimum_wage",
"outcome": "employment_rate",
"domains": ["economics", "policy", "labor"],
"maxResults": 15
}
计算健康干预的反事实:
{
"query": "air quality respiratory hospital admissions",
"interventionVariable": "pm25_concentration",
"interventionValue": 12.0,
"queryVariable": "hospital_admissions",
"domains": ["environment", "health"],
"maxResults": 15
}
输入提示
- 缩小领域范围 — 指定 2-3 个重点领域,而不是使用全部 9 个领域,以降低成本并提高因果图中的信噪比
- 使用描述性查询 — 与查询「health」相比,类似「air quality respiratory hospital admissions」的查询能从每个上游参与方检索到更多相关数据,从而提高提取出的数值特征的质量
- 让变量名称与数据相匹配 —
findClosestNode函数使用子字符串匹配,因此像「employment」或「pm25」这样的处理变量/结果变量名称即使与 ID 不完全一致,也能匹配节点 - 探索性工作时调高
alpha— 将alpha: 0.10设置为更宽松地剪除边,使骨架更稠密,便于生成假设 - 在
discover_cross_domain_causes后使用validate_causal_model— 先运行发现,再使用相同的查询和领域参数进行验证,以在得出结论前获取每项模型标准的 p 值
输出示例
discover_cross_domain_causes 输出
{
"algorithm": "NOTEARS",
"totalNodes": 24,
"totalEdges": 31,
"domains": ["economics", "health", "environment", "labor"],
"perDomainGraphs": [
{
"algorithm": "GES",
"nodes": 8,
"edges": 11,
"bicScore": -142.7,
"dagValid": true
},
{
"algorithm": "PC",
"nodes": 6,
"edges": 7,
"bicScore": -98.4,
"dagValid": true
}
],
"crossDomainEdges": [
{
"from": "economics_cpi_inflation",
"to": "health_hospital_admissions",
"weight": 0.64,
"mechanism": "indirect",
"confidence": 0.81
},
{
"from": "environment_pm25",
"to": "labor_absenteeism",
"weight": 0.52,
"mechanism": "direct",
"confidence": 0.74
}
],
"colimitGraph": {
"nodes": 24,
"edges": 31,
"dagValid": true
},
"transferEntropyTopPairs": [
{ "from": "economics", "to": "labor", "entropy": 0.43 },
{ "from": "environment", "to": "health", "entropy": 0.38 }
]
}
estimate_interventional_effect 输出
{
"treatment": "economics_minimum_wage",
"outcome": "labor_employment_rate",
"averageTreatmentEffect": -0.024,
"confidence": 0.78,
"identificationCriterion": "backdoor",
"adjustmentSet": ["economics_gdp_growth", "policy_labor_regulation"],
"confidenceInterval": [-0.041, -0.007],
"graphAlgorithm": "GES",
"graphNodes": 18,
"graphEdges": 22
}
compute_counterfactual 输出
{
"query": "What would hospital admissions be if PM2.5 had been 12?",
"factualValue": 0.47,
"counterfactualValue": 0.31,
"causalEffect": -0.16,
"probability": 0.83,
"mechanism": "direct structural pathway via environment_pm25 -> health_respiratory",
"exogenousNoiseTerms": 6,
"graphAlgorithm": "NOTEARS",
"graphNodes": 14
}
transport_causal_effect 输出
{
"sourceDomain": "health",
"targetDomain": "economics",
"sourceEffect": 0.38,
"transportable": true,
"sAdmissible": true,
"adjustedEffect": 0.29,
"confidence": 0.71,
"selectionNodes": ["gdp_per_capita", "healthcare_expenditure"],
"sourceGraphNodes": 9,
"targetGraphNodes": 11
}
validate_causal_model 输出
{
"overallValid": true,
"dagConstraintSatisfied": true,
"markovCompatible": true,
"faithfulnessHolds": false,
"bicScore": -214.3,
"testResults": [
{ "test": "dag_acyclicity", "pValue": 1.0, "passed": true },
{ "test": "markov_compatibility", "pValue": 0.12, "passed": true },
{ "test": "faithfulness", "pValue": 0.03, "passed": false },
{ "test": "bic_goodness_of_fit", "pValue": 0.24, "passed": true }
],
"graphAlgorithm": "PC",
"graphNodes": 16,
"graphEdges": 19
}
输出字段
通用字段(所有工具)
| 字段 | 类型 | 描述 |
|---|---|---|
graphAlgorithm | string | 选用的算法:PC、GES 或 NOTEARS |
graphNodes | number | 合并因果图中的节点数 |
graphEdges | number | 合并因果图中的有向边数 |
discover_cross_domain_causes
| 字段 | 类型 | 描述 |
|---|---|---|
algorithm | string | 元算法选用的算法(BIC 最佳) |
totalNodes | number | 余极限(合并)图中的节点总数 |
totalEdges | number | 余极限图中的边总数 |
domains | string[] | 本次运行包含的领域 |
perDomainGraphs[] | object[] | 各领域图的摘要,包含算法、节点/边计数、BIC 得分和 DAG 有效性标记 |
crossDomainEdges[] | object[] | 端点分属不同领域图的边 |
crossDomainEdges[].from | string | 源节点 ID(带领域前缀) |
crossDomainEdges[].to | string | 目标节点 ID(带领域前缀) |
crossDomainEdges[].weight | number | 边权重(偏相关绝对值) |
crossDomainEdges[].mechanism | string | direct 或 indirect |
crossDomainEdges[].confidence | number | 对方向的置信度 [0, 1] |
colimitGraph.nodes | number | 合并后的余极限图中的节点总数 |
colimitGraph.edges | number | 合并后的余极限图中的边总数 |
colimitGraph.dagValid | boolean | 余极限图是否满足无环性 |
transferEntropyTopPairs[] | object[] | 按时间滞后传递熵排序的顶级领域对 |
estimate_interventional_effect
| 字段 | 类型 | 描述 |
|---|---|---|
treatment | string | 图中匹配的处理节点 ID |
outcome | string | 图中匹配的结果节点 ID |
averageTreatmentEffect | number | ATE:E[Y | do(X=x)] - E[Y | do(X=x')] |
confidence | number | ATE 估计值的置信度 [0, 1] |
identificationCriterion | string | backdoor、frontdoor、instrumental 或 direct |
adjustmentSet | string[] | 调整公式中使用的变量 |
confidenceInterval | [number, number] | ATE 的 95% 置信区间上下界 |
compute_counterfactual
| 字段 | 类型 | 描述 |
|---|---|---|
query | string | 易于理解的反事实问题 |
factualValue | number | 查询变量的观测值 |
counterfactualValue | number | 假设干预下的估计值 |
causalEffect | number | 反事实效应:反事实值 - 事实值 |
probability | number | 反事实情景的概率 [0, 1] |
mechanism | string | 因果路径的描述 |
exogenousNoiseTerms | number | 推断出的外生噪声变量数量(溯因步骤) |
transport_causal_effect
| 字段 | 类型 | 描述 |
|---|---|---|
sourceDomain | string | 识别出该效应的领域 |
targetDomain | string | 要迁移到的目标领域 |
sourceEffect | number | 源领域中的原始因果效应 |
transportable | boolean | 该效应是否可以有效迁移 |
sAdmissible | boolean | 选择图是否满足 s-可容许性 |
adjustedEffect | number | 目标领域的重加权效应估计值 |
selectionNodes | string[] | 可迁移性图中的选择变量 |
detect_confounders
| 字段 | 类型 | 描述 |
|---|---|---|
totalConfounders | number | 图中发现的混杂因素总数 |
confounders[].variable | string | 混杂变量 ID |
confounders[].confounds | [string, string] | 存在混杂关系的变量对 |
confounders[].strength | number | 混杂强度(偏相关的绝对值) |
confounders[].adjustable | boolean | 该混杂因素是否可观测且可调整 |
confounders[].instrumentAvailable | boolean | 是否存在工具变量 |
confounders[].instrument | string | null | 可用时的 IV 变量名称 |
simulate_causal_agents
| 字段 | 类型 | 描述 |
|---|---|---|
agentsSimulated | number | 模拟的专家 Agent 数量 |
states | number | 可能的因果状态数量 |
convergence | boolean | 说服博弈是否达到均衡 |
equilibriumBeliefs | object | 对各状态的最终后验信念分布 |
senderPayoff | number | 均衡信号下发送方的最优收益 |
receiverPayoff | number | 接收方在均衡时的收益 |
informationRent | number | 发送方获取的信息租金 |
optimalSignals | number | 最优披露策略中的信号数量 |
posteriorCount | number | 凹化价值函数中的后验分布数量 |
optimize_causal_experiment
| 字段 | 类型 | 描述 |
|---|---|---|
targetVariable | string | 图中匹配的目标变量 ID |
optimalIntervention | string | 为最大化信息增益而进行干预的变量 |
expectedInfoGain | number | 后验方差的预期减少量 |
acquisitionFunction | number | 预期改进采集函数值 |
suggestedSampleSize | number | 基于功效分析的建议样本量 |
estimatedCost | number | 以预算单位计的实验估计成本 |
candidateVariables | string[] | 所考虑的所有候选干预变量 |
validate_causal_model
| 字段 | 类型 | 描述 |
|---|---|---|
overallValid | boolean | 若四项标准全部通过,则为 True |
dagConstraintSatisfied | boolean | Kahn 拓扑排序成功(无环) |
markovCompatible | boolean | 数据中成立隐含的条件独立关系 |
faithfulnessHolds | boolean | 数据中不存在额外的条件独立关系 |
bicScore | number | 贝叶斯信息准则(越低越好) |
testResults[] | object[] | 包含 p 值和通过/失败状态的单项测试结果 |
testResults[].test | string | 测试名称 |
testResults[].pValue | number | 测试的 p 值 |
testResults[].passed | boolean | 测试是否通过 |
使用 Causal Panopticon 的费用是多少?
Causal Panopticon 采用按事件计费——每次工具调用收费 $0.04。上游 Actor 执行费用按 Apify 的标准费率另行计费(通常每次上游调用收费 $0.01-0.02)。平台计算资源已包含在内。
| 场景 | 工具调用次数 | 每次调用费用 | 预估总费用 |
|---|---|---|---|
| 快速测试 | 1 | $0.04 | $0.04 |
| 小型研究会话 | 10 | $0.04 | $0.40 |
| 完整分析工作流 | 50 | $0.04 | $2.00 |
| 每日自动运行 | 200 | $0.04 | $8.00 |
| 企业研究工作流 | 1,000 | $0.04 | $40.00 |
你可以为每次运行设置最高消费限额以控制费用。达到预算后,Actor 会停止运行。
Apify 免费计划每月包含 $5 的平台额度——足以免费调用约 125 次工具。与商业因果推断平台相比,后者每月收费 $200-2,000 才能访问单个数据领域。Causal Panopticon 覆盖 9 个领域,且无需订阅承诺。
如何使用 API 调用此服务
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
# Start the MCP server actor in standby mode and call a tool via HTTP
import urllib.request
import json
url = "https://causal-panopticon-mcp.apify.actor/mcp"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
payload = {
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "discover_cross_domain_causes",
"arguments": {
"query": "inflation unemployment health outcomes",
"domains": ["economics", "health", "labor"],
"algorithm": "auto",
"maxResults": 20
}
},
"id": 1
}
data = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(url, data=data, headers=headers, method="POST")
with urllib.request.urlopen(req) as response:
result = json.loads(response.read())
content = result["result"]["content"][0]["text"]
atlas = json.loads(content)
print(f"Algorithm: {atlas['algorithm']}")
print(f"Total nodes: {atlas['totalNodes']}, edges: {atlas['totalEdges']}")
for edge in atlas.get("crossDomainEdges", []):
print(f" {edge['from']} -> {edge['to']} (confidence: {edge['confidence']:.2f})")
JavaScript
const url = "https://causal-panopticon-mcp.apify.actor/mcp";
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_APIFY_TOKEN"
},
body: JSON.stringify({
jsonrpc: "2.0",
method: "tools/call",
params: {
name: "estimate_interventional_effect",
arguments: {
query: "minimum wage employment labor market",
treatment: "minimum_wage",
outcome: "employment_rate",
domains: ["economics", "policy", "labor"],
maxResults: 15
}
},
id: 1
})
});
const result = await response.json();
const content = JSON.parse(result.result.content[0].text);
console.log(`ATE: ${content.averageTreatmentEffect.toFixed(4)}`);
console.log(`Identification: ${content.identificationCriterion}`);
console.log(`Adjustment set: ${content.adjustmentSet.join(", ")}`);
console.log(`95% CI: [${content.confidenceInterval[0].toFixed(4)}, ${content.confidenceInterval[1].toFixed(4)}]`);
cURL
# Call discover_cross_domain_causes
curl -X POST "https://causal-panopticon-mcp.apify.actor/mcp" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "discover_cross_domain_causes",
"arguments": {
"query": "air quality respiratory disease employment",
"domains": ["environment", "health", "labor"],
"algorithm": "auto",
"maxResults": 20
}
},
"id": 1
}'
# List all available tools
curl -X POST "https://causal-panopticon-mcp.apify.actor/mcp" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-d '{"jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1}'
Causal Panopticon 的工作原理
阶段 1:从 18 个来源并行收集数据
调用工具时,服务会识别哪些领域处于活跃状态,并使用 DOMAIN_MAP 常量将每个领域映射到其上游 Actor ID。经济领域映射到 fred、bls 和 imf Actor;健康领域映射到 who、clinicalTrials 和 pubmed;其他领域也以此类推。所有 Actor 调用都会通过 runActorsParallel 同时发出;该函数使用 Promise.all,并为每个 Actor 设置 180 秒超时,超时后返回空数组。构建图之前,结果会按领域归入 domainData 记录。
阶段 2:通过元算法构建因果图
buildCrossDomainAtlas 会从各领域的数据项中提取数值特征——将所有可解析为浮点数的 JSON 字段转换为 CausalNode.values 数组。对于节点数至少为 2 的每个领域,该函数都会运行三种结构学习算法,并选出 BIC 分数最低的结果。PC 算法从一个完整的无向图开始,迭代移除偏相关不显著的边,显著性由 alpha 决定(使用 Fisher z 检验和 Abramowitz-Stegun 累积分布函数近似)。GES 先贪心地向前添加边,再向后删除边,并通过 BIC = n*ln(RSS/n) + k*ln(n) 对每个候选有向无环图进行评分。NOTEARS 使用 trace(exp(W ∘ W)) - d = 0 作为连续无环约束来构建邻接矩阵,并通过 8 阶泰勒级数进行近似。返回每个图之前,会使用拓扑排序(Kahn 算法)验证其是否为有向无环图。
阶段 3:合并跨领域图并计算传递熵
通过合并所有节点和边,将各领域的图合并为余极限图。跨领域边通过计算不同领域图中节点的 Pearson 相关性来推断,计算使用节点的原始值数组——超过阈值的节点对会获得一条有向边,方向从数据密度较高的领域指向较低的领域。所有领域对的传递熵矩阵通过核密度估计计算滞后互信息得出,从而提供一个独立的定向信息流信号,不依赖于结构方程。
阶段 4:因果推断计算
根据调用的工具,合并后的图会输入五种推断流程之一。doCalculus 会在图中搜索后门调整集(即阻断从处理变量到结果变量的所有后门路径的节点集),并计算调整公式;如果不存在这样的集合,则尝试前门路径,然后尝试工具变量。scmCounterfactual 会为每个节点指定一个形式为 X_j = sum(beta_ij * X_i) + U_j 的结构方程,通过回归残差化推断噪声项 U(溯因),将干预变量设为假设值(行动),然后按拓扑顺序传播(预测)。transportCausalEffect 会比较源图和目标图中处理变量与结果变量节点的马尔可夫边界,以评估 s-可采纳性。bayesianPersuasion 会应用 Kamenica-Gentzkow 凹化方法,在概率单纯形上针对发送者的价值函数迭代求出最高凹下包络。
最佳实践提示
-
缩小领域列表,以便聚焦查询。 查询所有 18 个 Actor 会增加延迟和成本。对于经济政策对劳动力市场影响的问题,
["economics", "policy", "labor"]就足够了,也能生成更清晰的因果图。 -
除非有充分理由,否则使用
algorithm: "auto"。 元算法会依据数据密度,通过 BIC 比较 PC、GES 和 NOTEARS,并选出拟合效果最佳的算法。只有在需要确保多次运行结果可复现,或掌握有关预期图结构的领域知识时,才指定具体算法。 -
先运行
detect_confounders,再运行estimate_interventional_effect。 了解有哪些混杂因素及其是否可调整,有助于在运行完整的处理效应估计之前判断后门准则是否适用。如果存在不可调整的混杂因素,且没有可用的工具变量,识别过程可能会退回到前门方法,或导致结果不可靠。 -
使用
validate_causal_model评估统计置信度。faithfulnessHolds: false的结果并不意味着图无效,而是表示数据包含图所隐含内容之外的额外条件独立关系,这在小样本中很常见。请检查各项testResults的 p 值,而不要只依赖overallValid。 -
进行反事实分析时,将
interventionValue设为合理的假设值。 远超观测数据范围的值会产生外推的噪声估计,且概率分数较低。处理变量取值处于其观测分布第 10 至第 90 百分位之间时,反事实结果最可靠。 -
将
optimize_causal_experiment与discover_cross_domain_causes结合使用,开展主动因果学习。 先运行发现工具以获取图结构,再将目标变量传递给实验优化器,以确定下一轮数据收集中应测量或干预哪个变量。 -
增大
maxResults,以获得更高质量的图。 每个上游 Actor 最多返回maxResults个条目;每个节点有更多观测值,可以提高 PC 中偏相关检验和 GES 中 BIC 评分的统计功效。默认值 15-20 较为保守;研究级结果可设为 50。
与其他 Apify actors 结合
| Actor | 组合方式 |
|---|---|
| 公司深度研究 | 将公司情报报告作为领域数据输入;使用 estimate_interventional_effect 识别哪些业务因素会因果性地驱动财务结果 |
| 网站技术栈检测器 | 构建跨公司的技术采用数据集,然后使用 discover_cross_domain_causes 找出技术选择与业务绩效信号之间的因果联系 |
| Trustpilot 评论分析器 | 提取随时间变化的情感分数,并使用 compute_counterfactual 估算未发生特定产品变更时的评论分数 |
| B2B 潜在客户评估器 | 使用 30 多个信号为潜在客户评分,然后将信号传入 detect_confounders,以识别哪些潜在客户评分特征确实具有预测性,哪些会受到公司规模的混杂影响 |
| SERP 排名跟踪器 | 跟踪排名随时间的变化,并使用 transport_causal_effect 测试在一个市场中有效的 SEO 干预措施能否迁移到另一个市场 |
| 监管变更跟踪器 | 将新的监管数据用作 estimate_interventional_effect 的政策领域输入,以估算特定监管变更对行业指标的 ATE |
局限性
- 从观测数据中发现因果关系存在根本性的可识别性限制。 当图中的两个变量在 d 分离意义上等价时,条件独立性检验无法在没有外部假设或实验数据的情况下确定边的方向。返回的 DAG 表示马尔可夫等价类中的一个成员。
- 忠实性和马尔可夫假设可能不成立。 现实世界的数据,尤其是来自异构公共 API 的数据,可能违反忠实性假设(路径相互抵消导致额外的独立性),或者具有非平稳分布。在据此采取行动前,请使用
validate_causal_model验证结果。 - 从 JSON 提取数值特征采用启发式方法。 上游 Actor 会返回包含许多字符串和类别字段的结构化 JSON。特征提取仅转换数值字段。以文本数据为主的领域(例如 PubMed 中的学术摘要)生成的因果图会比较稀疏。
- 传递熵衡量的是信息流动,不一定代表因果关系。 两个领域之间较高的传递熵表明存在时间上的信息传递,但不能确定结构性因果关系的方向。它是互补信号,而非基于结构图进行识别的替代方法。
- 上游 Actor 失败时会返回空数组,而非错误。 如果 18 个源 Actor 中有一部分失败或超时,因果图会基于不完整的数据构建,且不会发出警告。请检查响应中的
graphNodes;数量极低表示该领域的数据收集可能存在问题。 - 变量名匹配使用子字符串搜索。 如果找不到完全匹配项,
findClosestNode函数会按子字符串匹配。过于笼统的处理变量和结果变量名称(例如“rate”)可能会匹配到意料之外的节点。请使用带领域前缀的名称或更具体的术语(例如“employment_rate”“cpi_inflation”),以确保匹配可靠。 - 基于 BIC 的算法选择不保证最优。 BIC 会惩罚模型复杂度,但 BIC 最优的算法并不总是因果上正确的算法。对于较小的样本(每个节点少于 30 个观测值),请考虑明确指定
algorithm: "pc",因为 GES 和 NOTEARS 可能会过拟合。 - 贝叶斯说服模拟使用抽象的收益矩阵。
simulate_causal_agents工具会根据各领域的数据密度推导先验信念,但发送方和接收方的收益采用抽象模型。结果最适合用于对专家意见分歧进行定性方向分析,而非精确量化收益。
集成
- Zapier — 在电子表格或 CRM 中添加新数据时触发因果发现任务,并在下游工作流步骤中接收结构化结果
- Make — 构建自动化研究流水线,按计划调用
estimate_interventional_effect,并将 ATE 结果传送到 Slack 或 Google Sheet - Google Sheets — 将反事实和处理效应结果直接导出到电子表格,供利益相关方审阅,无需接触 API
- Apify API — 从任何 Python、JavaScript 或 HTTP 客户端以编程方式调用 MCP 服务;结果会以 MCP 协议信封中的结构化 JSON 形式返回
- Webhooks — 在长时间运行的因果发现任务完成时接收 POST 通知,其中包含完整的结果载荷
- LangChain / LlamaIndex — 将 MCP 工具直接提供给 LLM 编排框架;Agent 可以调用
discover_cross_domain_causes,然后在多步研究循环中分析返回的因果图结构
故障排除
尽管查询范围很广,图中的节点却很少。 大多数上游 Actor 返回了空数组,这可能是因为查询词与其搜索 API 不匹配,也可能是暂时受到速率限制。请尝试使用更宽泛的查询词,并指定更少的领域。检查每个领域的典型数据格式是否包含数值字段——如果主要数据源是 PubMed 摘要,像 academia 这样以文本为主的领域生成的图会比较稀疏。
averageTreatmentEffect 的值异常偏大或偏小。 ATE 是根据对提取的数值特征拟合的线性结构方程估算的。如果上游数据的数值范围很窄或方差很大,回归系数会反映这一尺度。应将 ATE 解读为数据分布中的相对方向性效应,而非现实世界中的绝对单位效应。
即使领域看起来相似,transportable: false 仍然出现。 当源图中处理节点的马尔可夫边界包含目标领域中的选择节点时,可迁移性检验会失败——这意味着两个总体恰好在这些变量上存在差异。请尝试在目标领域单独运行 detect_confounders,并对照混杂因素列表,了解为何不满足 s-可容许性。
simulate_causal_agents 中出现 convergence: false。 贝叶斯说服博弈在达到迭代上限前未能收敛到稳定均衡。如果先验信念近乎均匀,且收益矩阵的对比度较低,就可能出现这种情况。对于二元因果主张,请尝试将 numStates 增至 2,以得到更简单、收敛性更可靠的凹化问题。
工具返回支出限额错误。 你已达到 Apify 账户或运行设置中配置的单次运行支出限额。启动 Actor 时,请增大 maxTotalChargeUsd 参数,或在 Apify 控制台的账户账单设置中提高限额。
负责任地使用
- 此服务查询公开可用的数据源:美国联邦数据库、WHO、NOAA、OpenAQ、NVD、FEMA、FDA 和学术 API。它不会抓取私人或受限数据源。
- 根据观察性数据得出的因果主张,在用于制定政策或临床决策前,应由领域专家验证。
- 用户有责任确保因果发现的下游应用符合其所在司法辖区的适用法规。
- 未经实验验证,不要将因果推断结果作为影响个人的高风险决策的唯一依据。
- 有关负责任地开展 AI 辅助研究的指导,请参阅 Apify 平台指南。
常见问题
什么是跨领域因果发现?为什么它需要 18 个数据源? 在单一领域内进行因果发现,会遗漏跨越机构边界的关系。经济冲击会导致健康结果;气候事件会造成劳动力中断;网络安全事件会引发监管变化。要识别这些跨领域因果路径,需要同时获取经济、健康、环境及其他领域的数据。18 个源 Actor 覆盖 9 个领域组,为元算法提供足够的异质数据,以构建可信的跨领域因果图谱。
我应该使用哪种因果发现算法——PC、GES 还是 NOTEARS?
使用 algorithm: "auto"(默认值),让服务按 BIC 分数进行选择。如果需要参考:对于变量之间可能存在因果连接的范围已有较强领域知识的稀疏图,PC 最合适;GES 适用于中等密度的图,在节点集较大时,计算速度比 NOTEARS 更快;如果你预计结构连续且稠密,并希望使用基于梯度的优化而非组合搜索,则 NOTEARS 最合适。
此服务能证明因果关系吗?
任何基于观察数据运行的因果发现算法都无法证明因果关系。这些工具会识别在忠实性假设和马尔可夫假设下与数据在统计上相符的候选因果结构。要真正确认因果关系,必须进行实验干预。使用 validate_causal_model 检查统计支持度,并使用 optimize_causal_experiment 设计后续实验,以确认或证伪发现的结构。
estimate_interventional_effect 与回归系数有何不同?
回归系数衡量的是在给定所含变量的条件下的关联。estimate_interventional_effect 使用 do 演算来识别 P(Y|do(X))——即在假设干预将 X 设为某个值的情况下,Y 的分布,而不只是观察到 X 取该值时的分布。关键区别在于,do 演算会利用图结构调整混杂因素,而不只是考虑回归中包含的变量;即使无法通过后门准则阻断路径,也能识别因果效应(通过前门准则或工具变量准则)。
反事实估计有多准确?
准确性取决于:从上游 Agent 提取的数值数据质量、线性结构方程对真实机制的近似程度,以及忠实性假设是否成立。compute_counterfactual 中的 probability 字段反映推断出的外生噪声情景的可信度。高于 0.7 的值表示反事实与观察数据相符;低于 0.5 则表明假设干预与训练分布相差较远。
典型工具调用需要多长时间?
完整的全领域调用(discover_cross_domain_causes 涵盖全部 9 个领域)通常需要 2-4 分钟,因为它会并行启动最多 18 个上游 Agent,每个的超时时间为 180 秒。单领域调用或涵盖 2-3 个领域的调用通常会在 30-90 秒内完成。MCP 服务在调用之间保持待机模式,因此服务本身没有冷启动开销。
我可以定期安排因果发现任务,以检测结构变化吗?
可以。使用 Apify 内置的调度器,以每日、每周或自定义间隔运行 MCP 服务 Actor。比较连续运行结果中的 crossDomainEdges,即可检测领域间的因果关系何时发生变化——例如,检测经济与健康之间的因果联系是否在经济衰退期间增强。
收集并分析这 18 个来源的数据是否合法? 这 18 个上游数据来源均为公开 API,分别来自美国联邦机构(FRED、BLS、Congress、SEC、FEMA、FDA、CPSC、NVD)、国际组织(WHO、IMF)、研究数据库(PubMed、OpenAlex)和环境监测网络(NOAA、OpenAQ)。使用公共 API 符合各来源的服务条款。关于网络抓取合法性的一般信息,请参阅 Apify 的指南。
这与 DoWhy 或 CausalML 等现有因果推断库有何不同? DoWhy 和 CausalML 是 Python 库,需要你提供自己的数据。Causal Panopticon 负责端到端的数据收集、特征提取和图构建,并将整个流程作为 MCP 工具提供,供任何 AI Agent 调用。它面向 Agentic 工作流:AI 需要自主收集证据、构建因果模型并返回可执行的推断结果;而不是面向已有干净数据集、希望进行精细程序化控制的研究人员。
我可以将它与 Claude、GPT-4 或其他 AI 模型搭配使用吗?
可以。任何支持 MCP 客户端的 AI 模型都可以连接到此服务:https://causal-panopticon-mcp.apify.actor/mcp。Claude Desktop 和 Cursor 原生支持 MCP。对于其他模型,可以使用兼容 MCP 的客户端库,或通过 Agent 的工具调用框架直接调用 HTTP 端点。
如果某些上游 Actor 在运行期间失败,会发生什么?
runActor 函数会捕获所有错误并返回空数组,因此运行会继续,但只使用部分数据。受影响的领域不会向因果图贡献任何节点。请监控响应中的 graphNodes:如果其数量远低于指定领域数量所对应的预期值,则可能有一个或多个上游 Actor 失败。Apify 运行日志会显示哪些 Actor 返回了错误。
服务会在调用之间保留我的数据吗? 不会。MCP 服务会独立处理每次工具调用,不会在调用之间持久化因果图或数据。Apify 平台会在你的账户中按运行存储运行日志和输出数据集,你可以通过 Apify 控制台或 API 访问这些内容,以便调试。
帮助我们改进
如果你遇到问题,可以在 Apify 账户中启用运行共享,帮助我们更快地调试:
- 前往 账户设置 > 隐私
- 启用 与公开的 Actor 创建者分享运行
这样,当出现问题时,我们就能查看你的运行详情,从而更快地修复问题。你的数据只有 Actor 开发者可见,不会公开。
支持
发现 Bug 或有功能需求?请在此 Actor 页面中的 问题标签页提交问题。对于自定义因果推断工作流、多领域研究管道或企业集成,请通过 Apify 平台联系我们。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。