返回市场
索赔MCP服务器

索赔MCP服务器

作者:AdamGustavsson8 星标更新:2025-11-03

项目介绍

Claimify: 基于研究的事实主张提取通过MCP

“Claimify”方法的实现,用于从文本中提取可验证的事实主张,以本地模型上下文协议(MCP)服务器的形式提供。此工具实现了学术论文《有效提取和评估事实主张》(Metropolitansky & Larson, 2025)中详细描述的多阶段事实主张提取方法。

阅读论文

论文中的提示已修改以适用于结构化输出。 这不是官方实现。

概述

Claimify 使用复杂的四阶段流水线从文本中提取可验证的、去上下文化的事实主张:

  1. 句子分割:将文本拆分为带有上下文的独立句子
  2. 选择:筛选出包含可验证命题的句子,排除意见和推测
  3. 消歧:解决歧义或丢弃无法澄清的句子
  4. 分解:将句子分解为原子的、自包含的事实主张

该工具仅使用 OpenAI 的结构化输出功能以提高可靠性,并通过模型上下文协议公开其功能,使其可用于兼容 MCP 的客户端,如 Cursor 和 Claude Desktop。

特性

  • 基于研究的方法论:实现同行评审的 Claimify 方法
  • 结构化输出:使用 OpenAI 的结构化输出以获得可靠且类型安全的响应
  • MCP 集成:无缝集成到开发环境中
  • 强大的解析能力:处理各种文本格式,包括列表和段落
  • 上下文感知:使用周围的句子来解决歧义
  • 多语言支持:在提取主张时保留原始语言
  • 资源存储:自动将提取的主张作为 MCP 资源存储,便于检索
  • 详细的日志记录:详细记录所有 LLM 调用、响应及流水线阶段
  • 生产就绪:包括错误处理、监控和配置管理

要求

  • OpenAI API:需要一个 OpenAI API 密钥(如果您的 MCP 主机不支持采样,例如 GitHub Copilot 在 vsCode 中)
  • 兼容模型:必须使用支持结构化输出的模型:
    • gpt-4o(推荐)
    • gpt-4o-mini(更快更便宜)
  • Python 3.10+:为了正确的类型提示和 Pydantic 支持

快速开始

1. 安装

# 克隆仓库
git clone <repository-url>
cd ClaimsMCP

# 创建并激活虚拟环境
python -m venv claimify-env
source claimify-env/bin/activate  # 在 Windows 上:claimify-env\Scripts\activate

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

# 下载所需的 NLTK 数据(首次运行时会自动下载)
python -c "import nltk; nltk.download('punkt_tab')"

2. 配置

在项目根目录创建一个 .env 文件:

# 复制示例文件
cp env.example .env

编辑 .env 并添加您的 API 密钥:

# API 密钥
OPENAI_API_KEY="your-openai-api-key-here"

# LLM 配置
LLM_MODEL="gpt-4o-2024-08-06"  # 支持结构化输出的模型

# 日志配置
LOG_LLM_CALLS="true"   # 设置为 "false" 以禁用日志
LOG_OUTPUT="stderr"    # "stderr" 或 "file" - 日志发送位置
LOG_FILE="claimify_llm.log"  # 当 LOG_OUTPUT="file" 时使用

MCP 客户端配置

对于 Cursor

  1. 打开 Cursor 并导航至 设置 > MCP
  2. 点击“添加一个新的全局 MCP 服务器”
  3. 将以下配置添加到您的 MCP 设置文件中(通常位于 ~/.cursor/mcp.json):
{
  "mcpServers": {
    "claimify-local": {
      "command": "/path/to/your/claimify-env/bin/python",
      "args": [
        "/path/to/your/project/claimify_server.py"
      ]
    }
  }
}
  1. 替换路径为您 Python 可执行文件和服务器脚本的实际绝对路径

“Claimify 提取服务器”现在应该出现在您的 MCP 启用聊天中的连接工具列表中。

使用示例

配置完成后,您可以在您的 MCP 客户端中使用该工具:

使用提取主张工具

使用提示

服务器提供了两个提示,帮助验证和记录提取的主张:

1. 验证单个主张 (verify_claim)

提供了一个预构建的提示,指示 LLM 根据外部来源验证单个事实主张。

参数:

  • claim_text(必需):要检查的去上下文化的事实主张。

行为:

  1. 指示 LLM 搜索权威来源(学术出版物、信誉良好的新闻机构、官方组织)。
  2. 返回三种状态之一:
    • VERIFIED:主张由可靠的来源明确支持(至少提供三个带有 URL 的参考文献 + 解释)
    • UNCERTAIN:主张可能是正确的但缺乏精确度,存在歧义或证据有限/冲突
    • DISPUTED:主张被可靠来源证明是错误的或矛盾的
  3. 来源不得伪造;优先考虑主要参考文献。

示例检索(概念性 – 实际调用取决于客户端 API):

get_prompt(name="verify_claim", arguments={"claim_text": "Python 最早在 1991 年公开发布。"})

示例预期 LLM 响应格式:

**主张**:Python 最早在 1991 年公开发布。

**状态**:IN_PROGRESS

[经过研究...]

**主张**:Python 最早在 1991 年公开发布。

**状态**:VERIFIED

**证据**:
- 来源 1:[Python.org 发布历史](https://www.python.org/doc/versions/) - 官方 Python 发布历史页面确认了最初的公开发布时间
- 来源 2:[计算机历史博物馆](https://www.computerhistory.org/collections/catalog/102726710) - 档案引用了 Python 的早期开发
- 来源 3:[维基百科 - Python](https://en.wikipedia.org/wiki/Python_(编程语言)) - 百科全书条目引用了原始发布时间

如果不确定:

**主张**:斯德哥尔摩有 800,000 居民。

**状态**:UNCERTAIN

**证据**:
- 来源 1:[瑞典统计局](https://www.scb.se/en/) - 报告根据测量城市本身、市镇还是大都市区而提供的不同人口数字

**分析**:
该主张缺乏对所引用的“斯德哥尔摩”定义的具体性(城市本身约 975k,市镇约 975k,或大都市区约 1.6M,截至 2023 年)。800,000 的数字可能在某些定义和特定时间段内是准确的,但在没有时间和地理上下文的情况下,完全验证是不可能的。

如果反驳:

**主张**:地球是平的。

**状态**:DISPUTED

**分析**:
这一主张与压倒性的科学证据相矛盾。地球的球形已被卫星图像、太空任务和数世纪的天文观测证实。可靠的来源普遍拒绝这一主张。

2. 创建主张报告 (create_claims_report)

生成一个初始的 CLAIMS.md 文件,其中所有主张均标记为 TODO。然后可以逐步验证这些主张,更新它们的状态:TODO → IN_PROGRESS → VERIFIED/UNCERTAIN/DISPUTED。

流程:

  1. 初始创建:所有主张最初状态为 TODO
  2. 验证期间:更新每个主张为 IN_PROGRESS
  3. 验证后:更新为 VERIFIED、UNCERTAIN 或 DISPUTED,并附上证据

参数:

  • 无(将提取资源附加到 VS Code 的上下文中)

行为:

  1. 从附加到上下文的提取资源中解析所有主张
  2. 创建一个所有主张标记为 TODO 的 CLAIMS.md 文件
  3. 提供一个模板结构,准备进行逐步验证

示例用法: 当在 VS Code 中查看提取资源时,将其附加到提示上下文中。提示将生成一个初始的 CLAIMS.md 文件,准备好进行验证。

初始 CLAIMS.md 结构:

# 主张报告

**提取 ID**:extraction_1_1730678400
**生成时间**:2025-11-03
**总主张数**:5
**待办事项**:5
**正在进行**:0
**已验证**:0
**不确定**:0
**反驳**:0

---

## 主张

### 主张 1
**文本**:苹果公司成立于 1976 年。

**状态**:TODO

---

### 主张 2
**文本**:史蒂夫·乔布斯共同创立了苹果公司。

**状态**:TODO

---
...

验证更新后:

### 主张 1
**文本**:苹果公司成立于 1976 年。

**状态**:VERIFIED

**证据**:
- 来源 1:[维基百科 - 苹果公司](https://en.wikipedia.org/wiki/Apple_Inc.) - 表明公司在 1976 年成立
- 来源 2:[苹果官方](https://www.apple.com/about/) - 公司历史确认 1976 年成立
- 来源 3:[大英百科全书](https://www.britannica.com/topic/Apple-Inc) - 百科全书条目验证了成立年份

---

### 主张 2
**文本**:斯德哥尔摩有 800,000 居民。

**状态**:UNCERTAIN

**证据**:
- 来源 1:[瑞典统计局](https://www.scb.se/en/) - 根据定义报告不同的数字

**分析**:
该主张缺乏对所引用的地理定义和时间周期的具体性。截至 2023 年,人口在城市本身(约 975k)、市镇(约 975k)和大都市区(约 1.6M)之间显著变化。800k 的数字可能在历史上对于某些定义是准确的。

---

### 主张 3
**文本**:该公司发明了智能手机。

**状态**:DISPUTED

**分析**:
虽然苹果公司通过 2007 年的 iPhone 推广了智能手机,但它并没有发明智能手机。早期设备如 IBM Simon(1994 年)和黑莓设备(2000 年代初)早于 iPhone。该主张混淆了创新/推广与发明。

---
...

注意:服务器仅提供提示;外部搜索取决于客户端/模型的能力。

示例 1:简单的事实文本

输入:"美国国旗包含 50 颗星和 13 条横杠。"
输出:[
  "美国国旗包含 50 颗星 [代表 50 个州] 和 13 条横杠 [代表最初的 13 个殖民地]。",
  "美国国旗设计于 1777 年",
  "美国国旗已经修改了 27 次"
]

示例 2:事实与意见混合

输入:"苹果公司成立于 1976 年,由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗纳德·韦恩共同创立。这家公司极其创新,拥有世界上最好的产品。"
输出:[
  "苹果公司成立于 1976 年,由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗纳德·韦恩共同创立。"
]

(注意:关于“极其创新”和“拥有世界上最好的产品”的主观内容被过滤掉)

示例 3:多语言支持

输入:"String-systemet 是一个获奖的图标,结合了优雅和极简的设计以及广泛的色彩和尺寸选择。Nisse Strinning 早在 1949 年就创造了第一个架子。"
输出:[
  "String-systemet [一种搁板系统] 是一个获奖的图标 [在设计领域]",
  "String-systemet 结合了优雅和极简的设计以及广泛的色彩和尺寸选择",
  "Nisse Strinning 在 1949 年创造了第一个 String 搁板 [String-systemet]"
]

(注意:内容保留原始瑞典语,并在括号中添加了上下文解释)

访问提取的主张作为资源

每次提取都会生成两种类型的资源:

  1. 聚合提取资源 (claim://extraction_<n>_<timestamp>)
    • 包含元数据(时间戳、预览、问题)和完整的主张列表
    • 返回 JSON 格式
  2. 单个主张资源 (claim://<slug>)
    • 每个主张可通过唯一的 slug(从主张文本派生的 URL 安全标识符)访问
    • 返回纯文本(主张本身)

聚合提取 JSON 示例

{
  "id": "extraction_1_1730678400",
  "timestamp": "2025-11-03T14:30:00.123456",
  "question": "苹果的历史是什么?",
  "text_preview": "苹果公司成立于 1976 年,由史蒂夫·乔布斯...",
  "claims": [
    "苹果公司成立于 1976 年,由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗纳德·韦恩共同创立。"
  ],
  "claim_count": 1
}

URI:claim://apple-inc-was-founded-in-1976-by-steve-jobs

单个主张资源示例

URI 模式claim://<slug>

示例:

  • claim://apple-inc-was-founded-in-1976-by-steve-jobs-steve-wozniak-and-ronald
  • claim://stockholm-is-the-capital-of-sweden
  • claim://python-was-first-publicly-released-in-1991

内容:主张本身的纯文本(无 JSON 包装)

单个主张资源的好处

  • 直接访问:通过 slug 检索任何主张
  • 简单格式:纯文本,无需解析
  • 唯一标识符:每个主张都有一个稳定的、可读的 URI
  • 易于引用:直接链接到单个主张

项目结构

ClaimsMCP/
├── README.md                    # 此文件
├── requirements.txt             # Python 依赖项
├── env.example                  # 环境配置模板
├── claimify_server.py          # 主 MCP 服务器脚本
├── llm_client.py               # 使用结构化输出支持的 LLM 客户端
├── pipeline.py                 # 核心主张提取流水线
├── structured_models.py        # 结构化输出的 Pydantic 模型
├── structured_prompts.py       # 优化的结构化输出提示
├── setup.py                    # 包设置配置
├── test_claimify.py            # 主张提取流水线的测试套件
└── LICENSE                     # Apache 2.0 许可证

架构

该系统遵循模块化架构,采用结构化输出:

  • MCP 服务器:通过模型上下文协议公开主张提取工具
  • ClaimifyPipeline:使用结构化输出编排多阶段提取过程
  • LLMClient:使用结构化输出和 Pydantic 模型处理与 OpenAI API 的通信
  • 结构化模型:定义每个阶段预期响应格式的 Pydantic 模型
  • 阶段函数:选择、消歧和分解的单独函数
  • 提示管理:简化并优化用于结构化输出的提示

结构化输出的优势

实现使用 OpenAI 的结构化输出功能,提供:

  • 类型安全性:响应自动验证为 Pydantic 模型
  • 可靠性:不再出现正则表达式解析失败或畸形 JSON
  • 显式拒绝:基于安全性的拒绝可程序检测
  • 一致性:保证符合预期的响应模式
  • 性能:减少了重试逻辑和错误处理的需求

配置选项

环境变量描述默认值选项
LLM_MODEL使用的具体模型gpt-4o-2024-08-06支持结构化输出的模型
OPENAI_API_KEYOpenAI API 密钥您的 API 密钥
LOG_LLM_CALLS启用所有 LLM 交互的详细日志truetrue, false
LOG_OUTPUT日志输出位置stderrstderr, file
LOG_FILE日志文件名(当 LOG_OUTPUT=file 时使用)claimify_llm.log任意文件名

故障排除

常见问题

  1. “模型不支持结构化输出”错误

    • 确保您正在使用兼容的模型:gpt-4o-2024-08-06gpt-4o-minigpt-4o
    • 更新您的 .env 文件:LLM_MODEL=gpt-4o-2024-08-06
  2. “API 密钥未设置”错误

    • 确保您的 .env