Skip to main content
Glama

Quaestio MCP Server

Quaestio 是一个 Model Context Protocol (MCP) 服务器,用于分析、解答和验证题目。它提供 MCP 工具,使兼容的主机能够发送问题、附件和学习材料,并接收结构化、可追踪且保守的结果。

该服务器既不是用户界面,也不是语言模型。它是 MCP 层,负责组织输入契约、调用已配置的组件、验证响应,并将结构化决策返回给客户端。

本项目中的 MCP

MCP 是一个开放协议,用于将主机应用连接到以标准化方式提供工具和数据的服务器。在 Quaestio 中:

host MCP / cliente MCP
          │
          │ transporte stdio + JSON-RPC
          ▼
Quaestio MCP Server
          │
          ├── ferramentas de resolução e verificação
          ├── parsing, OCR e PDF
          ├── materiais de estudo e busca semântica
          ├── análise e execução controlada de código
          └── políticas de confiabilidade e auditoria

MCP Server 当前暴露 tools 原语。它不将 resources、resource templates 或 prompts 作为单独的 MCP 原语发布。材料、OCR、PDF 和服务器能力均通过工具访问。

使用的协议参考:

Related MCP server: Trust OS MCP Server

功能

  • 解决多项选择和开放式题目;

  • 处理包含内联图片的问题;

  • 在两个可配置的 LLM 后端之间执行共识;

  • 为已配置的模型准备非英语问题;

  • 保留备选项、索引、公式、代码和附件;

  • 在结构上验证提案,并在配置时进行语义验证;

  • 应用可选的确定性和符号数学验证;

  • 添加和搜索本地学习材料;

  • 使用语义嵌入,并可回退到 TF-IDF;

  • 使用 Tesseract 从图像中提取文本;

  • 提取和解释 PDF 文本;

  • 在不执行的情况下分析代码;

  • 在不执行代码的情况下编译/检查语法;

  • 仅在 Docker 沙箱中执行 Python 或 JavaScript;

  • 使用答案键评估批次并计算指标;

  • 返回已执行步骤的 trace。

可靠性原则

该服务器被设计为在没有足够证据时显式失败。

  • 缺少后端或有效提案会导致 needs_review;

  • 模型之间的分歧不会被静默解决;

  • 语义验证不被视为确定性证据;

  • verified 保留给可靠证据,例如确定性数学验证;

  • 模型声明的置信度受服务器限制;

  • 输入、附件、上下文和检索到的材料均被视为不可信数据,绝不可作为系统指令;

  • 外部提供者的故障会转换为警告和结构化状态;

  • 服务器不应被用来将 LLM 的答案视为正确性的保证。

内部架构

tools/call
   │
   ▼
MCP boundary
   │  valida argumentos e serializa resultado
   ▼
QuaestioService
   ├── classificação
   ├── recuperação de materiais
   ├── preparação linguística/OCR
   ├── solver determinístico ou LLM
   ├── consenso
   ├── verificação estrutural/semântica
   └── avaliação e trace

主要内部组件包括:

  • models.py:规范契约和公共状态;

  • mcp_server.py:MCP 注册、分派和传输;

  • service.py:流水线编排;

  • backends.py:确定性后端、LLM、翻译和共识;

  • verification.py:结构和数学验证;

  • semantic_verifier.py:可选的独立语义审查;

  • knowledge.py 和 embeddings.py:本地知识库和语义检索;

  • ocr.py 和 pdf.py:本地内容提取;

  • sandbox.py:Docker 中的受控代码执行。

传输与 MCP 生命周期

主要传输方式是 stdio,适用于本地服务器。主机启动该进程并通过 stdin 和 stdout 与其通信;每条消息均为 JSON-RPC。初始化日志发送到 stderr,以免污染 MCP 通道。

服务器实现了现代流程:

  1. server/discover — 发现版本、身份、能力和说明;

  2. tools/list — 确定性发现工具、模式和缓存;

  3. tools/call — 执行工具并返回结构化结果。

当安装了官方 mcp 包时,服务器使用带 stdio 传输的现代 SDK。如果没有该包,则使用项目内置的最小 stdio 实现。两条路径注册相同的工具集,并遵循现代契约。 每个工具都声明 inputSchema 和 outputSchema;最小 stdio 路径也会在处理程序执行前验证参数。

服务器不会启动 HTTP 端口。Streamable HTTP 不在本版本范围内。

安装

要求:

  • Python 3.11 或更高版本;

  • pip;

  • 用于辅助解答的、与 OpenAI chat API 兼容的 LLM 端点凭据;

  • 仅用于本地 OCR 的 Tesseract;

  • 仅用于 run_code 的 Docker 和本地镜像;

  • 仅用于 PDF 提取的 pypdf。

基本安装:

python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e ".[dev]"

可选附加内容:

pip install -e ".[sdk]"   # Python SDK oficial do MCP
pip install -e ".[math]"  # SymPy
pip install -e ".[pdf]"   # pypdf

配置

将 .env.example 复制为 .env,只填写你想使用的提供者。.env 不应纳入版本控制,也不应共享。

LLM 解答

QUAESTIO_LLM_BASE_URL=https://integrate.api.nvidia.com/v1
QUAESTIO_LLM_API_KEY=...
QUAESTIO_LLM_MODEL=...
QUAESTIO_LLM_TIMEOUT_SECONDS=45

这是主要后端。如果第二个后端已完全配置,Quaestio 将执行共识:

QUAESTIO_SECONDARY_LLM_BASE_URL=https://integrate.api.nvidia.com/v1
QUAESTIO_SECONDARY_LLM_API_KEY=...
QUAESTIO_SECONDARY_LLM_MODEL=...

没有后端时,服务器仍然可用,但无法确定性解决的问题将返回 needs_review。

语言准备

QUAESTIO_TRANSLATION_MODE=auto
QUAESTIO_TRANSLATION_TARGET_LANGUAGE=en
QUAESTIO_TRANSLATOR_BASE_URL=https://integrate.api.nvidia.com/v1
QUAESTIO_TRANSLATOR_API_KEY=...
QUAESTIO_TRANSLATOR_MODEL=...
QUAESTIO_TRANSLATOR_TIMEOUT_SECONDS=30
QUAESTIO_TRANSLATION_OCR=auto
QUAESTIO_TRANSLATION_OCR_LANGUAGE=por+eng

可用模式:

  • never:从不翻译;

  • auto:当问题不是英语时翻译;

  • required:在需要翻译时强制使用翻译器。

原始图像不会被修改。当进行 OCR 时,识别出的文本可用作辅助上下文,但图像仍会作为视觉证据发送。

语义搜索

QUAESTIO_KNOWLEDGE_BASE_PATH=./data/knowledge.json
QUAESTIO_EMBEDDING_BASE_URL=https://integrate.api.nvidia.com/v1
QUAESTIO_EMBEDDING_API_KEY=...
QUAESTIO_EMBEDDING_MODEL=...
QUAESTIO_EMBEDDING_TIMEOUT_SECONDS=30

嵌入(embeddings)是可选的。当不可用时,本地知识库使用 TF-IDF。知识库将材料和向量存储在本地;不要添加无法持久化到该文件中的内容。

独立语义验证

QUAESTIO_VERIFIER_LLM_BASE_URL=https://integrate.api.nvidia.com/v1
QUAESTIO_VERIFIER_LLM_API_KEY=...
QUAESTIO_VERIFIER_LLM_MODEL=...
QUAESTIO_VERIFIER_LLM_TIMEOUT_SECONDS=45

当审查的独立性很重要时,该后端应与 solver 分开。它返回 supports、contradicts 或 uncertain;不会将 LLM 的答案转换为 verified。

可选的本地资源

QUAESTIO_TESSERACT_PATH=
QUAESTIO_DOCKER_PATH=
QUAESTIO_SANDBOX_PYTHON_IMAGE=python:3.12-slim

Docker 沙箱不会自动下载镜像。镜像必须已存在于本地。

如何启动服务器

在可编辑安装之后:

quaestio

非可编辑安装:

$env:PYTHONPATH = "src"
python -m quaestio.mcp_server

该进程看起来像是在等待输入,因为 stdio 传输由 MCP 客户端驱动。这是预期行为。

在 MCP 客户端中配置

MCP 主机需要将服务器命令作为子进程启动。Windows 通用示例:

{
  "mcpServers": {
    "quaestio": {
      "command": "C:\\caminho\\para\\Quaestio\\.venv\\Scripts\\quaestio.exe"
    }
  }
}

或者使用 Python:

{
  "mcpServers": {
    "quaestio": {
      "command": "C:\\caminho\\para\\Quaestio\\.venv\\Scripts\\python.exe",
      "args": ["-m", "quaestio.mcp_server"],
      "env": {
        "PYTHONPATH": "C:\\caminho\\para\\Quaestio\\src"
      }
    }
  }
}

环境变量可以由本地 .env 或主机配置提供。当主机提供密钥机制时,应优先使用,并且切勿在仓库中包含真实密钥。

MCP 工具

解答与验证

工具

用途

solve_question

解答问题并返回答案、状态、置信度、来源、验证和 trace。

solve_questions_batch

批处理最多 500 道问题,并保留其 ID。

verify_answer

验证提案与问题及其选项在结构上的一致性。

verify_answer_semantically

在配置时请求独立的 LLM 验证者进行审查。

classify_question

对类型、学科和主题进行分类。

evaluate_questions

使用答案键解答问题并返回评估指标。

材料与检索

工具

用途

add_study_material

将授权文本添加到本地知识库。

search_study_material

通过 TF-IDF 或 embeddings 搜索相关材料。

解析、OCR 与文档

工具

用途

parse_questions

将编号文本转换为规范问题。

solve_text

解析并解答一段文本。

extract_questions_from_image

通过配置的视觉后端从图像中提取问题。

ocr_image

使用 Tesseract 执行本地 OCR,不持久化图像。

ocr_parse_image

执行 OCR 并将结果转换为问题。

extract_pdf_text

使用 pypdf 从内联 PDF 中提取文本。

extract_questions_from_pdf

提取 PDF 文本并创建规范问题。

对于视觉处理和 OCR,输入必须包含一张内联 base64 图片。URI 引用在规范契约中是允许的,但当前的 OCR 和多模态发送流程使用内联字节。

代码

工具

用途

analyze_code

在不执行的情况下静态分析代码。

compile_code

在不执行的情况下检查语法/编译。

run_code

仅在 Docker 中执行 Python 或 JavaScript,无网络且有资源限制。

run_code 不会在主机上执行代码。如果 Docker、镜像或语言不可用,则返回结构化的不可用状态。

诊断

工具

用途

server_capabilities

展示服务器的能力和可靠性策略。

输入契约

一个规范问题可以这样发送:

{
  "question": "Qual é a capital do Brasil?",
  "options": ["Rio de Janeiro", "Brasília", "São Paulo"],
  "question_id": "q-001",
  "context": "Questão de geografia.",
  "attachments": []
}

主要字段:

  • question:必填文本;

  • options:可选列表,至少包含两个唯一备选项;

  • question_id:在批次中保留的标识符;

  • context:附加上下文或检索到的材料;

  • attachments:图像或文档,通常带有 mime_type 和 data_base64;

  • expected_answer 和 expected_option_index:仅用于带答案键的评估,不作为 solver 的指引。

输出契约

响应包含(除其他字段外):

{
  "question_type": "multiple_choice",
  "answer": "Brasília",
  "option_index": 1,
  "confidence": 0.75,
  "status": "answered",
  "method": "consensus",
  "verification": {
    "status": "answered",
    "verified": false,
    "semantic": {
      "status": "supports",
      "confidence": 0.91
    }
  },
  "sources": [],
  "warnings": [],
  "trace": []
}

响应状态

  • verified:有足够的确定性证据;

  • answered:已生成提案,但没有确定性证明;

  • needs_review:缺少共识、证据或验证;

  • error:流水线出现故障。

仅当客户端通过 expected_answer 或 expected_option_index 提供答案键时,correct 字段才会被填充。

MCP 调用示例

在 server/discover 之后,客户端可以调用:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientInfo": {"name": "example-client", "version": "1.0.0"},
      "io.modelcontextprotocol/clientCapabilities": {}
    },
    "name": "solve_question",
    "arguments": {
      "question": "Qual é a capital do Brasil?",
      "options": ["Rio de Janeiro", "Brasília", "São Paulo"]
    }
  }
}

MCP 结果包含序列化的文本内容,以及为支持结构化结果的客户端提供的 structuredContent。

开发与验证

使用以下命令运行自动化测试套件:

pytest -q

单元测试必须独立运行,不能依赖对提供者的真实调用。针对外部 API 的冒烟测试必须是显式的,使用本地凭据和已授权的问题。

相关技术文档:

当前限制

  • 公开 HTTP 传输尚未实现;

  • 服务器不暴露 MCP 资源或提示词;

  • 语义验证器接受内联图像;外部 URI、PDF 和视频在此阶段尚不发送;

  • 当配置的模型更换时,嵌入索引需要重新索引;

  • OCR 和 PDF 提取依赖于可选的本地安装;

  • 共识和语义审查可降低风险,但无法取代标准答案、形式化证明或人工审查。

Related MCP Connectors

Related MCP Servers