跳转至

MCP.Tools


get_data_info

def get_data_info(data_path: str | Path,
                  vars_list: List[str] | None = None,
                  encoding: str = "utf-8",
                  head: int = 0) -> str:
    ...

输入参数: - data_path:数据文件的绝对文件系统路径或 URL(必填) - vars_list:可选变量子集规范,用于选择性分析(默认:null,所有变量) - encoding:文本格式文件的字符编码(默认:UTF-8,.dta 格式忽略) - head:预览数据集时显示的行数(默认:0,禁用预览以避免大样本上下文溢出)

返回结构: 包含多层元数据的序列化 JSON 字符串:

{
  "overview": {"source": <path>, "obs": <int>, "var_numbers": <int>, "var_list": [<array>]},
  "info_config": {"metrics": [<array>], "max_display": <int>, "decimal_places": <int>},
  "vars_detail": {<variable_name>: {"var": <str>, "type": <str>, "summary": {...}}},
  "saved_path": <cache_file_path>
}

操作示例

# 本地文件分析
get_data_info("/data/econometrics/survey.dta")
get_data_info("~/Documents/exports/quarterly.csv", vars_list=["gdp", "inflation", "unemployment"])

# 远程数据获取
get_data_info("https://repository.org/datasets/panel_data.xlsx")

# 编码源处理
get_data_info("/data/legacy/latin1_data.csv", encoding="latin1")

支持格式: - Stata.dta - CSV/文本.csv.tsv.psv - Excel.xlsx.xls - SPSS.sav.zsav

实现架构: 该工具通过多层抽象级联运行。基础是多态类层次结构,其中 DataInfoBase 定义了格式特定处理器(DtaDataInfoCsvDataInfoExcelDataInfoSpssDataInfo)的抽象接口。内容完整性验证使用 MD5 哈希,可配置后缀长度用于缓存标识。配置传播遵循优先级链:运行时参数覆盖环境变量(STATA_MCP_DATA_INFO_DECIMAL_PLACESSTATA_MCP_DATA_INFO_STRING_KEEP_NUMBER),环境变量又覆盖 ~/.statamcp/config.toml 中的 TOML 配置。

统计计算利用 pandas DataFrame 操作,后端为 NumPy。指标系统实现可配置的计算流水线,默认指标(obsmeanstderrminmax)可通过配置扩展以包含四分位数(q1q3)和分布形状度量(skewnesskurtosis)。类型分派将字符串变量(在 max_display 阈值下的观测计数和唯一值采样)与数值变量(带 decimal_places 精度舍入的中心趋势、离散度和分布形状计算)分开。

缓存策略采用内容可寻址存储,哈希计算决定缓存文件命名:data_info__<name>_<ext>__hash_<suffix>.json。缓存解析在调用时进行,当内容哈希分歧时自动重新生成。缓存目录默认为 ~/.statamcp/.cache/,但可通过 cache_dir 参数覆盖为项目特定的 stata-mcp-tmp/ 位置。


stata_do

def stata_do(dofile_path: str,
             log_file_name: str | None = None,
             is_read_log: bool = True) -> Dict[str, Union[str, None]]:
    ...

输入参数: - dofile_path:目标 .do 文件的绝对或相对路径(必填) - log_file_name:不带时间戳的自定义日志文件名(可选,如为 null 则自动生成) - is_read_log:是否获取日志内容的布尔标志(默认:true)

返回结构: 包含执行元数据和可选日志负载的字典:

{
  "log_file_path": "<absolute_path_to_stata_log>",
  "log_content": "<full_log_text_or_'Not_read_log'>"
}

错误情况返回:{"error": "<exception_message>"}

操作示例

# 带日志获取的标准执行
stata_do("/Users/project/stata-mcp-dofile/20250104153045.do")

# 自定义日志命名
stata_do("~/analysis/regression_pipeline.do", log_file_name="quarterly_results")

# 不读取日志的执行
stata_do("/tmp/estimation.do", is_read_log=False)

实现架构: 该工具封装了实现平台特定命令调用策略的 StataDo 执行器类。跨平台抽象通过 StataFinder 类抽象 Stata 可执行文件位置:macOS 探测 /Applications/Stata/ 层级,Windows 查询 Program Files 注册表,Linux 在系统 PATH 中查询 stata-mp。执行流水线涉及 do 文件暂存、带 -b 批处理模式标志的 Stata CLI 调用、日志文件重定向和退出代码监控。

日志文件管理在 stata-mcp-log/ 目录结构内运行,当省略 log_file_name 时自动生成时间戳。执行器根据 is_read_log 标志实现差异化日志处理:启用时执行文件读取操作并返回内容;禁用时返回占位符字符串以最小化 I/O 开销。

异常处理将失败分为三个层级:缺失 do 文件产物的 FileNotFoundError,Stata 执行失败或日志生成问题的 RuntimeError,以及执行或写入权限不足的 PermissionError。错误情况返回带 "error" 键的字典而非抛出异常,以保持 MCP 协议兼容性。


write_dofile

⚠️ 默认禁用:此工具需要 ENABLE_WRITE_DOFILE=true 配置才能使用。

现代 AI 智能体具有原生文件写入能力,使该工具变得多余。 要启用,请设置 STATA_MCP__ENABLE_WRITE_DOFILE=true 或在配置中添加 [BETA] ENABLE_WRITE_DOFILE = true

def write_dofile(content: str,
                 encoding: str | None = None) -> str:
    ...

输入参数: - content:要持久化的 Stata 命令序列(必填) - encoding:文件输出的字符编码(可选,默认为 UTF-8)

返回结构: 包含生成的 do 文件绝对 POSIX 兼容路径的字符串

操作示例

# 基本回归分析
write_dofile("""
use "/data/survey.dta", clear
regress income age education experience
outreg2 using "`output_path'/results.doc", replace
""")

# 带编码规范的时间序列分析
write_dofile("""
tsset date
arima gdp, ar(1) ma(1)
predict forecast
""", encoding="latin1")

# 数据转换流水线
write_dofile("""
gen log_gdp = ln(gdp)
gen diff_income = d(income)
xtset country_id year
xtreg diff_income log_gdp, fe
""")

实现架构: 该工具在 stata-mcp-dofile/ 目录层级内实现原子文件创建。文件命名采用 ISO 8601 基本格式时间戳生成(YYYYMMDDHHMMSS.do),确保时间唯一性和按时间排序。写入操作使用 Python 内置的 open() 函数,模式为 "w" 和指定的编码参数,执行隐式文件创建和截断以实现原子写入语义。

与输出重定向命令(outreg2esttab)的集成需要在 do 文件生成之前与 results_doc_path 提示协调以建立输出目录路径。这种关注点分离使得跨多个 Stata 执行周期的确定性输出路径管理成为可能。

该工具不执行 Stata 代码内容的语法验证或语义分析。代码正确性、命令序列和宏展开有效性仍然是调用上下文的责任。错误处理将文件 I/O 操作包装在 try-except 块中,并进行结构化日志记录以跟踪成功/失败。

⚠️ 弃用通知:此工具默认禁用,将在未来版本中移除。现代 AI 智能体具有原生文件写入能力 - 请使用那些功能替代。


read_log

def read_log(file_path: str,
             encoding: str = "utf-8",
             is_beta: bool = False,
             lines: int = 0,
             *,
             output_format: Literal["full", "core", "dict"] = "dict") -> str:
    ...

输入参数: - file_path:目标日志文件的绝对路径(必填,.log.smcl) - encoding:文本解码的字符编码(可选,默认为 UTF-8) - is_beta:启用结构化日志解析(可选,默认:false) - 仅限 macOS/Linux - Windows 用户请使用默认行为 - 推荐用于 .smcl 文件配合 dict 格式 - lines:内容裁剪控制(默认:0,不裁剪) - > 0:返回前 N 项(full/core 模式为行数,dict 模式为条目数) - < 0:返回后 |N| 项 - 0:返回完整内容 - output_formatis_beta=true 时的输出格式(可选,默认:"dict") - full:未经处理的原始日志内容 - core:去除框架行的清洁内容 - dict:结构化的命令-结果对(推荐)

返回结构: - 默认模式(is_beta=false):文件的原始字符串内容 - Beta 模式(is_beta=true):取决于 output_format: - full:纯文本日志内容 - core:不含框架(页眉、页脚、日志命令)的日志内容 - dict:命令-结果列表的字符串表示

操作示例

# 读取日志文件(默认模式)
read_log("/Users/project/stata-mcp-log/20250104153045.log")

# 使用结构化解析读取 SMCL 日志(macOS/Linux)
read_log("/Users/project/stata-mcp-log/20250104153045.smcl",
         is_beta=True,
         output_format="dict")

# 获取去除框架的清洁日志内容
read_log("~/stata-mcp-log/session.log",
         is_beta=True,
         output_format="core")

# 仅读取前 50 行
read_log("~/stata-mcp-log/session.log", lines=50)

# 读取最后 20 个命令结果(dict 格式)
read_log("~/stata-mcp-log/session.log",
         is_beta=True,
         output_format="dict",
         lines=-20)

# 使用自定义编码读取
read_log("~/analysis/tables/results.txt", encoding="utf-8")

实现架构: 该工具实现双模式日志读取:传统文件读取和通过 StataLog 模块的结构化解析。

传统模式is_beta=false):通过 Python 的 open() 函数进行通用文件读取,模式为 "r"。路径验证通过 Path.exists() 检查文件是否存在。内容读取使用单次 file.read() 操作获取完整文件内容。

结构化解析模式is_beta=true,仅 Unix):利用 stata_log 模块,提供: - StataLogTEXT.log(纯文本)文件解析器 - StataLogSMCL.smcl(Stata 标记与控制语言)文件解析器 - StataLogInfo:包含 command_result_list 结构化命令-输出对的数据类

StataLog 工厂类(from_path() 方法)自动检测文件扩展名并返回相应的解析器。框架移除消除日志页眉/页脚、log using/close 命令和 do 文件执行标记,仅保留实际的 Stata 命令及其输出。

lines 裁剪:通过 _trim_lines() 辅助函数实现。正数取前 N 项,负数取后 |N| 项,0 返回完整内容。对于 dict 格式,裁剪作用于列表条目而非文本行。

错误处理覆盖:缺失文件的 FileNotFoundError、I/O 失败的 IOError、无效 output_formatValueError,以及编码不匹配的 UnicodeDecodeError


ado_package_install

def ado_package_install(package: str,
                        source: str = "ssc",
                        is_replace: bool = True,
                        package_source_from: str | None = None) -> str:
    ...

输入参数: - package:包标识符(必填) - SSC:包名(如 "outreg2") - GitHub:"username/reponame" 格式(如 "sepinetam/texiv") - net:包名,package_source_from 指定来源 - source:分发源(可选,默认:"ssc") - 选项:"ssc"、"github"、"net" - is_replace:强制替换标志(可选,默认:true) - package_source_from:'net' 安装的源 URL 或目录(可选)

返回结构: 包含安装操作完整 Stata 执行日志的字符串

操作示例

# SSC 包安装
ado_package_install("outreg2", source="ssc")

# GitHub 包安装
ado_package_install("sepinetam/texiv", source="github")

# 网络安装
ado_package_install("custompkg", source="net", package_source_from="https://example.com/stata/")

# 强制重新安装
ado_package_install("estout", source="ssc", is_replace=True)

实现架构: 该工具实现平台差异化的安装策略。Unix 系统(macOS/Linux)通过继承自基础安装器接口的专用安装器类执行:SSC_Install 通过 Stata CLI 调用 ssc install <package>, replaceGITHUB_Install 执行 github install <username/reponame>, replaceNET_Install 运行 net install <package> from(<source>), replace。Windows 系统绕过直接安装,而是通过 write_dofile 生成临时 do 文件并委托给 stata_do 执行。

安装验证通过消息解析进行,安装器类检查 Stata 输出中的成功指示器。check_installed_from_msg() 方法执行正则或子字符串匹配以识别成功安装模式。失败的安装触发错误日志记录,通过调试级日志记录完整消息捕获。

性能考虑建议避免不必要的调用,因为网络延迟、仓库查找开销和包已存在时的冗余安装尝试。该工具不实现本地安装缓存——每次调用都查询远程仓库或文件系统。


help

仅限 macOS 和 Linux

def help(cmd: str) -> str:
    ...

输入参数: - cmd:Stata 命令名(必填,如 "regress"、"describe"、"xtset")

返回结构: 包含 Stata 帮助文本输出的字符串,可选缓存状态前缀(如 "Cached result for regress: ...")

操作示例

# 回归命令帮助
help("regress")

# 面板数据命令
help("xtset")
help("xtreg")

# 数据管理
help("merge")
help("reshape")

实现架构: 该工具通过带缓存层的 CLI 调用实现 Stata 命令文档检索。文档请求以 help <cmd> 命令在批处理模式下执行 Stata,捕获 stdout 作为返回值。StataHelp 类通过 StataFinder 检测的平台特定 Stata CLI 路径管理调用。

缓存架构在 ~/.statamcp/help/ 目录维护帮助文本缓存,使用基于命令名的文件存储。缓存行为可通过环境变量控制:STATA_MCP__CACHE_HELP(默认:true)启用/禁用缓存;STATA_MCP__SAVE_HELP 控制缓存持久化。缓存结果包含指示缓存状态的前缀消息:"Cached result for {cmd}: ..." 与实时帮助文本。

双重注册将 help 同时注册为 MCP 工具和资源,通过 _TOOL_REGISTRY 系统实现。资源 URI 模式 help://stata/{cmd} 通过 MCP 资源协议启用基于 URI 的访问,工具注册启用直接调用。这种双重注册为不同的 MCP 客户端实现提供灵活的访问模式。该工具通过 _TOOL_REGISTRY 中的 unix_only 标志进行限制,仅在 macOS 和 Linux 上可用。

缓存失效需要手动删除缓存文件或环境变量配置;不存在基于 TTL 的过期。帮助文本语言取决于 Stata 安装区域设置;多语言支持需要单独的 Stata 安装或区域设置重新配置。