smithery.ai

tushare-plugin-builder

This skill should be used when the user provides a Tushare API document URL and asks to generate a full plugin in this codebase, including extractor, schema, config, query service, and agent/MCP/http usage with testable curl examples.

First seen Mar 17, 2026

Installation

$ npx skills add https://smithery.ai

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from smithery.ai · top by installs.

npx skills add https://smithery.ai

Browse all from smithery.ai

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 13,620 B
  • docs SUMMARY.md 264 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 3 installs

SKILL.md

目的

将 Tushare 文档 URL 转换为本仓库的生产级插件,包含数据抽取、ClickHouse 表结构、查询服务,以及可测试的 curl 示例。

何时使用

  • 用户提供 Tushare 文档 URL 或页面内容,要求生成插件。
  • 用户需要基于某个 Tushare 接口生成插件 + 入库 + service + Agent/MCP 调用。
  • 验证已有插件:用户要求检查某个插件是否符合规范。

工作流程

1) 收集必要输入

  • 确保用户提供了 Tushare 文档 URL。若无法访问,请求截图或复制的文档内容。
  • 若未指定插件名,询问用户。使用 snakecase 命名,与现有 tushare* 插件保持一致。

2) 从文档提取 API 规格

  • 解析接口名称、输入参数、输出字段、使用说明(频率限制、分页、数据量限制)。
  • 记录字段命名差异(如 pctchange vs pctchg)及所需转换。

3) 规划插件结构(参考 references/plugin_conventions.md

  • 目录:src/stockdatasource/plugins/<pluginname>/
  • 文件:init.pyplugin.pyextractor.pyservice.pyschema.jsonconfig.json<plugin_name>.md
  • 以现有 tushare_* 插件为模板。

4) 实现 extractor

  • 使用 tushare SDK,API 调用需用 proxy_context() 包裹。
  • 实现频率限制、超时、重试(tenacity)。
  • 根据 API 特性支持 tradedatestartdate/end_date

5) 实现 plugin

  • 实现 extractdatavalidatedatatransformdataloaddata
  • 插入前添加 versioningestedat 列。
  • 转换数值类型,trade_date 转为 Date

插件分类与角色

必须实现以下方法指定插件的分类和角色:

from stock_datasource.core.base_plugin import PluginCategory, PluginRole

def get_category(self) -> PluginCategory:
    """插件分类 - 按市场划分"""
    return PluginCategory.CN_STOCK  # 或 HK_STOCK, INDEX, ETF_FUND, SYSTEM

def get_role(self) -> PluginRole:
    """插件角色"""
    return PluginRole.PRIMARY  # 或 BASIC, DERIVED, AUXILIARY

分类说明

  • CN_STOCK: A股相关数据
  • HK_STOCK: 港股相关数据
  • INDEX: 指数相关数据
  • ETF_FUND: ETF/基金相关数据
  • SYSTEM: 系统数据(如交易日历)

角色说明

  • PRIMARY: 主数据(如 daily 行情)
  • BASIC: 基础数据(如 stock_basic)
  • DERIVED: 衍生数据(如复权因子)
  • AUXILIARY: 辅助数据(如指数权重)

依赖配置

plugin.py 中实现依赖方法(不是在 config.json 中配置):

def get_dependencies(self) -> List[str]:
    """必须依赖 - 这些插件的数据必须存在才能运行当前插件。
    
    例如:tushare_daily 依赖 tushare_stock_basic 提供股票代码列表。
    """
    return ["tushare_stock_basic"]

def get_optional_dependencies(self) -> List[str]:
    """可选依赖 - 同步主插件时默认会同步这些依赖,用户可选择禁用。
    
    例如:tushare_daily 可选同步 tushare_adj_factor 复权因子。
    """
    return ["tushare_adj_factor"]

依赖规则

  • 必须依赖:在运行当前插件前,会检查依赖插件表中是否有数据
  • 可选依赖:前端展示时会显示可勾选的关联插件,默认勾选

6) 实现 service 查询

  • 至少提供一个日期范围查询和一个最新数据查询。
  • 必须使用参数化查询(禁止字符串拼接)。
  • 返回 JSON 可序列化结构。

7) 定义 schema/config

  • schema.json:使用 ReplacingMergeTreepartitionbytoYYYYMM(tradedate)order_by 为主键。
  • config.json:包含完整的插件配置。

config.json 完整结构

{
  "enabled": true,
  "rate_limit": 120,
  "timeout": 30,
  "retry_attempts": 3,
  "description": "插件描述",
  "schedule": {
    "frequency": "daily",
    "time": "18:00",
    "day_of_week": "monday"
  },
  "parameters": {
    "max_empty_days": 5,
    "validate_prices": true
  },
  "parameters_schema": {
    "trade_date": {
      "type": "string",
      "format": "date",
      "required": true,
      "description": "Trade date in YYYYMMDD format"
    }
  }
}

字段说明

字段 必需 说明
enabled 是否启用插件
rate_limit API 调用频率限制(次/分钟)
timeout 请求超时时间(秒)
retry_attempts 重试次数
description 插件描述
schedule 调度配置
schedule.frequency 调度频率:dailyweekly,默认 daily
schedule.time 执行时间,格式 HH:MM,默认 18:00
schedule.dayofweek weekly 时有效,如 monday
parameters 插件特定参数
parameters_schema 参数 schema,用于验证和前端展示

注意:依赖配置(dependenciesoptionaldependencies不在 config.json 中定义,而是通过 plugin.py 中的 getdependencies()getoptionaldependencies() 方法实现。

8) 创建 ClickHouse 表

  • 根据 schema.json 生成 CREATE TABLE SQL。
  • 使用脚本

```bash # 仅生成 SQL python .codebuddy/skills/tushare-plugin-builder/scripts/generatecreatetablesql.py \ src/stockdatasource/plugins/<plugin_name>/schema.json

# 生成并执行 python .codebuddy/skills/tushare-plugin-builder/scripts/generatecreatetablesql.py \ src/stockdatasource/plugins/<plugin_name>/schema.json --execute ```

9) 验证数据库连接

  • 执行前先验证 ClickHouse 连接是否正常:

```bash # 测试连接 python .codebuddy/skills/tushare-plugin-builder/scripts/verifyclickhouseconnection.py

# 列出所有表 python .codebuddy/skills/tushare-plugin-builder/scripts/verifyclickhouseconnection.py --list

# 验证指定表是否存在 python .codebuddy/skills/tushare-plugin-builder/scripts/verifyclickhouseconnection.py --table <table_name> ```

10) 运行数据拉取测试

  • 执行插件拉取并存储样本数据(如某一交易日)。
  • 代理配置:运行前确保 runtime_config.json 中代理设置正确。
  • 使用脚本

``bash # 运行插件并验证 python .codebuddy/skills/tushare-plugin-builder/scripts/runplugintest.py \ <plugin_name> --date 20250110 --verify ``

  • 或使用模块方式:

``bash python -m stockdatasource.plugins.<pluginname>.plugin --date 20250110 ``

11) 验证 ClickHouse 数据

  • 查询 ClickHouse 确认数据已存储:

``bash # 使用脚本验证 python .codebuddy/skills/tushare-plugin-builder/scripts/verifyclickhouseconnection.py \ --table <table_name> --date 20250110 ``

  • 或手动查询:

``sql SELECT count(*), min(tradedate), max(tradedate) FROM <tablename> WHERE tradedate = '2025-01-10'; ``

12) 测试 HTTP 服务端点

  • 若未运行,启动 HTTP 服务:python -m stockdatasource.services.httpserver
  • 使用脚本

```bash # 列出所有 API 路由 python .codebuddy/skills/tushare-plugin-builder/scripts/verifyservicehttp.py --list

# 测试指定服务方法 python .codebuddy/skills/tushare-plugin-builder/scripts/verifyservicehttp.py \ --service <servicename> \ --method getbydaterange \ --params '{"tscode":"XXX","startdate":"20250101","end_date":"20250110"}'

# 仅生成 curl 命令 python .codebuddy/skills/tushare-plugin-builder/scripts/verifyservicehttp.py \ --service <servicename> --method getlatest --params '{}' --curl ```

13) 测试 MCP 工具可用性

  • 若未运行,启动 MCP 服务:python -m stockdatasource.services.mcpserver
  • 使用脚本

```bash # 列出所有 MCP 工具 python .codebuddy/skills/tushare-plugin-builder/scripts/verifymcptool.py --list

# 搜索相关工具 python .codebuddy/skills/tushare-plugin-builder/scripts/verifymcptool.py --pattern <service_name>

# 验证指定工具 python .codebuddy/skills/tushare-plugin-builder/scripts/verifymcptool.py --tool <tool_name> ```

14) 测试 Agent 集成

  • 向 Orchestrator 发送自然语言查询,应调用新插件的 service。
  • 示例提问:"查询 XXX 指数最近一周的行情数据"
  • 验证:

- Agent 正确识别意图并选择工具。 - 工具调用从 ClickHouse 返回数据。 - 响应格式化后返回给用户。

15) 验证集成点

  • Service 自动发现,无需额外手动注册。
  • MCP/HTTP 端点按生成的路由工作。

验证脚本说明

本 skill 提供以下验证脚本(位于 scripts/ 目录):

脚本 用途
validate_plugin.py 综合验证插件是否符合规范
verifyclickhouseconnection.py 测试数据库连接、列出表、验证数据
generatecreatetable_sql.py 根据 schema.json 生成建表 SQL
runplugintest.py 运行插件 ETL 并验证入库
verifyservicehttp.py 测试 HTTP 服务端点
verifymcptool.py 验证 MCP 工具注册状态

插件验证流程

当用户要求验证已有插件(无论是自己编写还是生成的),执行以下步骤:

1) 运行综合验证脚本

# 验证单个插件
python .codebuddy/skills/tushare-plugin-builder/scripts/validate_plugin.py <plugin_name>

# 显示所有检查详情
python .codebuddy/skills/tushare-plugin-builder/scripts/validate_plugin.py <plugin_name> --verbose

# 列出所有可用插件
python .codebuddy/skills/tushare-plugin-builder/scripts/validate_plugin.py --list

# 验证所有插件
python .codebuddy/skills/tushare-plugin-builder/scripts/validate_plugin.py --all

2) 验证检查项

validate_plugin.py 会自动检查以下内容:

文件结构检查:

  • init.py 存在且导出 Plugin/Service 类
  • plugin.py 存在且继承 BasePlugin
  • extractor.py 存在且使用 proxy_context
  • service.py 存在且继承 BaseService
  • schema.json 存在且包含必需字段
  • config.json 存在且包含必需配置

代码规范检查:

  • plugin.py 实现了 extract/validate/transform/load 方法
  • plugin.py 添加了 version 和 ingestedat 系统列
  • plugin.py 实现了 get_category() 返回正确的 PluginCategory
  • plugin.py 实现了 get_role() 返回正确的 PluginRole
  • plugin.py 实现了 get_dependencies()(返回空列表或依赖插件名)
  • plugin.py 实现了 getoptionaldependencies()(如有可选依赖)
  • extractor.py 使用了重试逻辑(tenacity)
  • service.py 使用参数化 SQL(无 SQL 注入风险)
  • service.py 包含查询方法(get/query/fetch_*)

Schema 规范检查:

  • 包含 tablename、columns、engine、orderby
  • 使用 ReplacingMergeTree 引擎
  • 包含 version 和 ingestedat 系统列
  • 设置了分区策略(partition_by)

运行时检查:

  • 模块可正常导入
  • 数据库表已创建
  • 表中有数据(如已运行过 ETL)

3) 处理验证结果

根据验证结果采取行动:

✅ 通过:插件符合规范,可进行下一步测试。

⚠️ 警告:插件可运行但存在潜在问题,建议修复:

  • 缺少重试逻辑 → 添加 tenacity 装饰器
  • 未检测到参数化查询 → 检查 SQL 是否使用 %(param)s
  • 表为空 → 运行数据拉取测试

❌ 失败:插件存在严重问题,必须修复:

  • SQL 注入风险 → 改用参数化查询
  • 缺少必需文件 → 补充缺失文件
  • 未使用 proxy_context → API 调用将失败
  • 缺少系统列 → 在 schema.json 和 plugin.py 中添加

4) 端到端验证

通过基础检查后,执行完整测试流程:

# 1. 验证数据库连接
python .codebuddy/skills/tushare-plugin-builder/scripts/verify_clickhouse_connection.py

# 2. 建表(如果表不存在)
python .codebuddy/skills/tushare-plugin-builder/scripts/generate_create_table_sql.py \
  src/stock_datasource/plugins/<plugin_name>/schema.json --execute

# 3. 运行 ETL 并验证入库
python .codebuddy/skills/tushare-plugin-builder/scripts/run_plugin_test.py \
  <plugin_name> --date 20250110 --verify

# 4. 测试 HTTP 服务
python .codebuddy/skills/tushare-plugin-builder/scripts/verify_service_http.py \
  --service <service_name> --method get_latest --params '{}'

# 5. 测试 MCP 工具
python .codebuddy/skills/tushare-plugin-builder/scripts/verify_mcp_tool.py \
  --pattern <service_name>

输出检查清单

  • 插件目录已创建,包含所有必需文件。
  • Extractor 使用 proxy_context()tushare SDK。
  • Plugin 实现了 getcategory()getrole() 方法。
  • Plugin 实现了 getdependencies()getoptional_dependencies() 方法。
  • Service 使用参数化 SQL。
  • Schema 匹配 Tushare 输出字段。
  • Config 包含频率限制、schedule 和参数 schema。
  • ClickHouse 表已创建,数据已入库。
  • 通过 SQL 查询验证 ClickHouse 中有数据。
  • HTTP 服务端点已通过 curl 测试。
  • MCP 工具已注册且可调用。
  • Agent 可通过自然语言查询调用该服务。