[
  {
    "site": "12306",
    "name": "me",
    "description": "Show the logged-in 12306 account summary. Sensitive fields (real name, email, mobile, birth date) are masked by default; pass --include-sensitive to opt in.",
    "access": "read",
    "domain": "kyfw.12306.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "include-sensitive",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Reveal unmasked real name / email / mobile / birth date. The 12306 ID-number mask is server-side and never decoded."
      }
    ],
    "columns": [
      "username",
      "real_name",
      "email",
      "mobile",
      "birth_date",
      "sex",
      "country",
      "user_type",
      "member",
      "active"
    ],
    "type": "js",
    "modulePath": "12306/me.js",
    "sourceFile": "12306/me.js",
    "navigateBefore": "https://kyfw.12306.cn"
  },
  {
    "site": "12306",
    "name": "orders",
    "description": "List in-progress 12306 orders (not yet ridden, refunded, or completed) for the logged-in user",
    "access": "read",
    "domain": "kyfw.12306.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "include-sensitive",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Reveal unmasked passenger names in order rows. Masked by default."
      }
    ],
    "columns": [
      "order_id",
      "order_date",
      "train_code",
      "from_station",
      "to_station",
      "departure",
      "passengers",
      "status",
      "amount"
    ],
    "type": "js",
    "modulePath": "12306/orders.js",
    "sourceFile": "12306/orders.js",
    "navigateBefore": "https://kyfw.12306.cn"
  },
  {
    "site": "12306",
    "name": "passengers",
    "description": "List the logged-in user's saved 12306 passengers. Sensitive fields are masked by default; pass --include-sensitive to opt in.",
    "access": "read",
    "domain": "kyfw.12306.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max passengers to return (1-50)"
      },
      {
        "name": "include-sensitive",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Reveal unmasked real names and birth dates. The 12306 ID-number / mobile masks are server-side and never decoded."
      }
    ],
    "columns": [
      "name",
      "sex",
      "born_year",
      "id_type",
      "id_no",
      "mobile",
      "passenger_type",
      "country"
    ],
    "type": "js",
    "modulePath": "12306/passengers.js",
    "sourceFile": "12306/passengers.js",
    "navigateBefore": "https://kyfw.12306.cn"
  },
  {
    "site": "12306",
    "name": "price",
    "description": "Look up 12306 ticket prices by seat class for one train on a given date and segment (anonymous, no login required)",
    "access": "read",
    "domain": "kyfw.12306.cn",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "train-no",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Internal train_no from `12306 trains` (e.g. 24000000G10L)"
      },
      {
        "name": "from",
        "type": "str",
        "required": true,
        "help": "Origin station (Chinese name, telecode, or pinyin) - must be a stop of this train"
      },
      {
        "name": "to",
        "type": "str",
        "required": true,
        "help": "Destination station - must be a stop of this train"
      },
      {
        "name": "date",
        "type": "str",
        "required": true,
        "help": "Departure date in YYYY-MM-DD"
      },
      {
        "name": "seat-types",
        "type": "str",
        "default": "OM9PA1A3A4FWZ",
        "required": false,
        "help": "Seat-type letters to query (default covers the common classes). Examples: OM9 (二等/一等/商务), A1A3A4 (硬座/硬卧/软卧)."
      }
    ],
    "columns": [
      "seat_code",
      "seat_name",
      "price",
      "currency"
    ],
    "type": "js",
    "modulePath": "12306/price.js",
    "sourceFile": "12306/price.js"
  },
  {
    "site": "12306",
    "name": "stations",
    "description": "Search 12306 (China Railway) stations by Chinese name, telecode, or pinyin keyword",
    "access": "read",
    "domain": "kyfw.12306.cn",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Chinese substring (上海), telecode (AOH), or pinyin (shanghai)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum results (1-50)"
      }
    ],
    "columns": [
      "name",
      "code",
      "pinyin",
      "abbr",
      "city"
    ],
    "type": "js",
    "modulePath": "12306/stations.js",
    "sourceFile": "12306/stations.js"
  },
  {
    "site": "12306",
    "name": "train",
    "description": "List every station a 12306 train calls at, with arrival / departure / stopover time (anonymous, no login required)",
    "access": "read",
    "domain": "kyfw.12306.cn",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "train-no",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Internal train_no from `12306 trains` (e.g. 24000000G10L), not the public code (G1)"
      },
      {
        "name": "from",
        "type": "str",
        "required": true,
        "help": "Origin station for the segment: Chinese name, telecode, or pinyin"
      },
      {
        "name": "to",
        "type": "str",
        "required": true,
        "help": "Destination station for the segment"
      },
      {
        "name": "date",
        "type": "str",
        "required": true,
        "help": "Departure date in YYYY-MM-DD"
      }
    ],
    "columns": [
      "station_no",
      "station_name",
      "arrive_time",
      "start_time",
      "stopover_time"
    ],
    "type": "js",
    "modulePath": "12306/train.js",
    "sourceFile": "12306/train.js"
  },
  {
    "site": "12306",
    "name": "trains",
    "description": "List trains between two 12306 stations on a given date (anonymous, no login required)",
    "access": "read",
    "domain": "kyfw.12306.cn",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "from",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Origin station: Chinese name (北京), telecode (BJP), or pinyin (beijing)"
      },
      {
        "name": "to",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Destination station: same forms as <from>"
      },
      {
        "name": "date",
        "type": "str",
        "required": true,
        "help": "Departure date in YYYY-MM-DD"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Maximum rows (1-100)"
      }
    ],
    "columns": [
      "code",
      "from_station",
      "to_station",
      "start_time",
      "arrive_time",
      "duration",
      "available",
      "business_seat",
      "first_seat",
      "second_seat",
      "soft_sleeper",
      "hard_sleeper",
      "hard_seat",
      "no_seat",
      "train_no"
    ],
    "type": "js",
    "modulePath": "12306/trains.js",
    "sourceFile": "12306/trains.js"
  },
  {
    "site": "1688",
    "name": "assets",
    "description": "列出 1688 商品页可提取的图片/视频素材",
    "access": "read",
    "domain": "www.1688.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "1688 商品 URL 或 offer ID（如 887904326744）"
      }
    ],
    "columns": [
      "offer_id",
      "title",
      "main_count",
      "sku_count",
      "detail_count",
      "video_count"
    ],
    "type": "js",
    "modulePath": "1688/assets.js",
    "sourceFile": "1688/assets.js",
    "navigateBefore": "https://www.1688.com"
  },
  {
    "site": "1688",
    "name": "download",
    "description": "批量下载 1688 商品页可提取的图片和视频素材",
    "access": "read",
    "domain": "www.1688.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "1688 商品 URL 或 offer ID（如 887904326744）"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./1688-downloads",
        "required": false,
        "help": "输出目录"
      }
    ],
    "columns": [
      "index",
      "type",
      "status",
      "size"
    ],
    "type": "js",
    "modulePath": "1688/download.js",
    "sourceFile": "1688/download.js",
    "navigateBefore": "https://www.1688.com"
  },
  {
    "site": "1688",
    "name": "item",
    "description": "1688 商品详情（公开商品字段、价格阶梯、卖家基础信息）",
    "access": "read",
    "domain": "www.1688.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "1688 商品 URL 或 offer ID（如 887904326744）"
      }
    ],
    "columns": [
      "offer_id",
      "title",
      "price_text",
      "moq_text",
      "seller_name",
      "origin_place"
    ],
    "type": "js",
    "modulePath": "1688/item.js",
    "sourceFile": "1688/item.js",
    "navigateBefore": false
  },
  {
    "site": "1688",
    "name": "search",
    "description": "1688 商品搜索（结果候选、卖家链接、价格/MOQ/销量文本）",
    "access": "read",
    "domain": "www.1688.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词，如 \"置物架\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "结果数量上限（默认 20，最大 100）"
      }
    ],
    "columns": [
      "rank",
      "offer_id",
      "title",
      "item_url",
      "price_text",
      "moq_text",
      "seller_name",
      "member_id",
      "location"
    ],
    "type": "js",
    "modulePath": "1688/search.js",
    "sourceFile": "1688/search.js",
    "navigateBefore": false
  },
  {
    "site": "1688",
    "name": "store",
    "description": "1688 店铺/供应商公开信息（联系方式、主营、入驻年限、公开服务信号）",
    "access": "read",
    "domain": "www.1688.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "1688 店铺 URL 或 member ID（如 b2b-22154705262941f196）"
      }
    ],
    "columns": [
      "store_name",
      "years_on_platform_text",
      "location",
      "return_rate_text"
    ],
    "type": "js",
    "modulePath": "1688/store.js",
    "sourceFile": "1688/store.js",
    "navigateBefore": false
  },
  {
    "site": "1point3acres",
    "name": "digest",
    "description": "一亩三分地 精华帖（编辑推荐 / 加精）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回条数（默认 20，最多 50）"
      }
    ],
    "columns": [
      "rank",
      "tid",
      "title",
      "forum",
      "author",
      "replies",
      "views",
      "lastReplyTime",
      "url"
    ],
    "type": "js",
    "modulePath": "1point3acres/digest.js",
    "sourceFile": "1point3acres/digest.js"
  },
  {
    "site": "1point3acres",
    "name": "forum",
    "description": "浏览一亩三分地某个版块的帖子列表（按 fid）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "fid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "版块 ID，例如 145（海外面经）、198（海外职位内推）、27（研究生申请）"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "页码（默认 1）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回条数（默认 20，最多 50）"
      }
    ],
    "columns": [
      "rank",
      "tid",
      "kind",
      "title",
      "author",
      "replies",
      "views",
      "lastReplyTime",
      "url"
    ],
    "type": "js",
    "modulePath": "1point3acres/forum.js",
    "sourceFile": "1point3acres/forum.js"
  },
  {
    "site": "1point3acres",
    "name": "forums",
    "description": "一亩三分地 所有版块（fid + 版块名）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "filter",
        "type": "string",
        "default": "",
        "required": false,
        "help": "按版块名关键字过滤（子串匹配，中英文）"
      }
    ],
    "columns": [
      "fid",
      "name",
      "url"
    ],
    "type": "js",
    "modulePath": "1point3acres/forums.js",
    "sourceFile": "1point3acres/forums.js"
  },
  {
    "site": "1point3acres",
    "name": "hot",
    "description": "一亩三分地 今日热门帖子（按热度排序，约 50 条）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回条数（默认 20，最多 50）"
      }
    ],
    "columns": [
      "rank",
      "tid",
      "title",
      "forum",
      "author",
      "replies",
      "views",
      "lastReplyTime",
      "url"
    ],
    "type": "js",
    "modulePath": "1point3acres/hot.js",
    "sourceFile": "1point3acres/hot.js"
  },
  {
    "site": "1point3acres",
    "name": "latest",
    "description": "一亩三分地 最新发帖（按发帖时间倒序）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回条数（默认 20，最多 50）"
      }
    ],
    "columns": [
      "rank",
      "tid",
      "title",
      "forum",
      "author",
      "replies",
      "views",
      "postTime",
      "url"
    ],
    "type": "js",
    "modulePath": "1point3acres/latest.js",
    "sourceFile": "1point3acres/latest.js"
  },
  {
    "site": "1point3acres",
    "name": "notifications",
    "description": "一亩三分地 站内通知（互动 / 点评 / @ 我；需要登录）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "kind",
        "type": "string",
        "default": "mypost",
        "required": false,
        "help": "通知类型：mypost（我的帖子） / interactive（互动） / system（系统） / app（应用）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回条数"
      }
    ],
    "columns": [
      "index",
      "from",
      "summary",
      "time",
      "threadUrl"
    ],
    "type": "js",
    "modulePath": "1point3acres/notifications.js",
    "sourceFile": "1point3acres/notifications.js",
    "navigateBefore": false
  },
  {
    "site": "1point3acres",
    "name": "search",
    "description": "一亩三分地 站内关键字搜索（需要登录）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键字"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回条数（默认 20，最多 50）"
      },
      {
        "name": "fid",
        "type": "string",
        "default": "",
        "required": false,
        "help": "限定版块 ID（可选）"
      }
    ],
    "columns": [
      "rank",
      "tid",
      "title",
      "forum",
      "author",
      "replies",
      "views",
      "postTime",
      "url"
    ],
    "type": "js",
    "modulePath": "1point3acres/search.js",
    "sourceFile": "1point3acres/search.js",
    "navigateBefore": false
  },
  {
    "site": "1point3acres",
    "name": "thread",
    "description": "一亩三分地 帖子详情 + 楼层（主楼 + 回复）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "tid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "帖子 ID（数字，见 `hot`/`latest` 返回的 tid）"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "楼层分页页码（默认 1）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回楼层条数（默认 10，含主楼）"
      },
      {
        "name": "contentLimit",
        "type": "int",
        "default": 400,
        "required": false,
        "help": "每楼正文截断长度（默认 400 字符，最少 50）"
      }
    ],
    "columns": [
      "floor",
      "pid",
      "author",
      "postTime",
      "content",
      "url"
    ],
    "type": "js",
    "modulePath": "1point3acres/thread.js",
    "sourceFile": "1point3acres/thread.js"
  },
  {
    "site": "1point3acres",
    "name": "user",
    "description": "一亩三分地 用户空间（用户组 / 积分 / 大米 / 帖子数 等）",
    "access": "read",
    "domain": "www.1point3acres.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "who",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "用户名或 uid（纯数字按 uid 查，否则按用户名）"
      }
    ],
    "columns": [
      "uid",
      "username",
      "group",
      "credits",
      "rice",
      "posts",
      "threads",
      "digests",
      "registerTime",
      "lastAccess",
      "profileUrl"
    ],
    "type": "js",
    "modulePath": "1point3acres/user.js",
    "sourceFile": "1point3acres/user.js"
  },
  {
    "site": "36kr",
    "name": "article",
    "description": "获取36氪文章正文内容",
    "access": "read",
    "domain": "www.36kr.com",
    "strategy": "intercept",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Article ID or full 36kr article URL"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "36kr/article.js",
    "sourceFile": "36kr/article.js",
    "navigateBefore": true
  },
  {
    "site": "36kr",
    "name": "hot",
    "description": "36氪热榜 — trending articles (renqi/zonghe/shoucang/catalog)",
    "access": "read",
    "domain": "www.36kr.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items (max 50)"
      },
      {
        "name": "type",
        "type": "string",
        "default": "catalog",
        "required": false,
        "help": "List type: renqi (人气), zonghe (综合), shoucang (收藏), catalog (热门资讯)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "url"
    ],
    "type": "js",
    "modulePath": "36kr/hot.js",
    "sourceFile": "36kr/hot.js"
  },
  {
    "site": "36kr",
    "name": "news",
    "description": "Latest tech/startup news from 36kr (36氪)",
    "access": "read",
    "domain": "www.36kr.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of articles (max 50)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "summary",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "36kr/news.js",
    "sourceFile": "36kr/news.js"
  },
  {
    "site": "36kr",
    "name": "search",
    "description": "搜索36氪文章",
    "access": "read",
    "domain": "www.36kr.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"AI\", \"OpenAI\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results (max 50)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "36kr/search.js",
    "sourceFile": "36kr/search.js"
  },
  {
    "site": "51job",
    "name": "company",
    "description": "51job 公司简介 + 在招职位（按 encCoId）",
    "access": "read",
    "domain": "jobs.51job.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "encCoId",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "加密公司 ID（search 返回的 encCoId）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回职位数（1-50）"
      }
    ],
    "columns": [
      "rank",
      "jobId",
      "title",
      "salary",
      "city",
      "workYear",
      "degree",
      "funcType",
      "issueDate",
      "url",
      "companyName",
      "companyType",
      "companySize",
      "companyIndustry",
      "companyIntro",
      "companyUrl"
    ],
    "type": "js",
    "modulePath": "51job/company.js",
    "sourceFile": "51job/company.js",
    "navigateBefore": false
  },
  {
    "site": "51job",
    "name": "detail",
    "description": "51job 职位详情（按 jobId）",
    "access": "read",
    "domain": "jobs.51job.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "jobId",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "职位 ID（search 返回的 jobId）"
      }
    ],
    "columns": [
      "jobId",
      "title",
      "salary",
      "location",
      "workYear",
      "degree",
      "category",
      "address",
      "ageRequirement",
      "description",
      "welfare",
      "company",
      "companyType",
      "companySize",
      "companyIndustry",
      "companyUrl",
      "url"
    ],
    "type": "js",
    "modulePath": "51job/detail.js",
    "sourceFile": "51job/detail.js",
    "navigateBefore": false
  },
  {
    "site": "51job",
    "name": "hot",
    "description": "51job 推荐职位（按城市/行业/排序浏览）",
    "access": "read",
    "domain": "we.51job.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "area",
        "type": "string",
        "default": "全国",
        "required": false,
        "help": "城市名或 6 位城市码（默认 \"全国\"）"
      },
      {
        "name": "sort",
        "type": "string",
        "default": "综合",
        "required": false,
        "help": "排序：综合 / 最新 / 薪资 / 距离"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "页码（1-based）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回条数（1-50）"
      }
    ],
    "columns": [
      "rank",
      "jobId",
      "title",
      "salary",
      "salaryMin",
      "salaryMax",
      "city",
      "district",
      "workYear",
      "degree",
      "tags",
      "company",
      "companyFull",
      "companyType",
      "companySize",
      "industry",
      "hr",
      "issueDate",
      "url",
      "companyUrl",
      "encCoId"
    ],
    "type": "js",
    "modulePath": "51job/hot.js",
    "sourceFile": "51job/hot.js",
    "navigateBefore": false
  },
  {
    "site": "51job",
    "name": "search",
    "description": "51job 前程无忧关键词职位搜索",
    "access": "read",
    "domain": "we.51job.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "搜索关键词（岗位名 / 技能 / 公司）"
      },
      {
        "name": "area",
        "type": "string",
        "default": "全国",
        "required": false,
        "help": "城市名或 6 位城市码（如 \"杭州\" / \"080200\" / \"全国\"）"
      },
      {
        "name": "salary",
        "type": "string",
        "default": "",
        "required": false,
        "help": "薪资区间（如 \"10-15k\" / \"1-1.5万\" / \"20-30k\"）"
      },
      {
        "name": "experience",
        "type": "string",
        "default": "",
        "required": false,
        "help": "工作年限（如 \"应届\" / \"1-3年\" / \"3-5年\" / \"5-7年\"）"
      },
      {
        "name": "degree",
        "type": "string",
        "default": "",
        "required": false,
        "help": "学历要求（如 \"本科\" / \"大专\" / \"硕士\"）"
      },
      {
        "name": "companyType",
        "type": "string",
        "default": "",
        "required": false,
        "help": "公司性质（如 \"外资\" / \"国企\" / \"民营\"）"
      },
      {
        "name": "companySize",
        "type": "string",
        "default": "",
        "required": false,
        "help": "公司规模（如 \"50-150\" / \"1000-5000\"）"
      },
      {
        "name": "sort",
        "type": "string",
        "default": "综合",
        "required": false,
        "help": "排序：综合 / 最新 / 薪资 / 距离"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "页码（1-based）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回条数（1-50）"
      }
    ],
    "columns": [
      "rank",
      "jobId",
      "title",
      "salary",
      "salaryMin",
      "salaryMax",
      "city",
      "district",
      "workYear",
      "degree",
      "tags",
      "company",
      "companyFull",
      "companyType",
      "companySize",
      "industry",
      "hr",
      "issueDate",
      "url",
      "companyUrl",
      "encCoId"
    ],
    "type": "js",
    "modulePath": "51job/search.js",
    "sourceFile": "51job/search.js",
    "navigateBefore": false
  },
  {
    "site": "aibase",
    "name": "news",
    "description": "AIbase 日报 - 每天三分钟关注AI行业趋势",
    "access": "read",
    "domain": "www.aibase.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of news items to return (max 50)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "url"
    ],
    "type": "js",
    "modulePath": "aibase/news.js",
    "sourceFile": "aibase/news.js"
  },
  {
    "site": "amazon",
    "name": "bestsellers",
    "description": "Amazon Best Sellers pages for category candidate discovery",
    "access": "read",
    "domain": "amazon.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Ranking URL or supported Amazon path. Omit to use the list root."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 100,
        "required": false,
        "help": "Maximum number of ranked items to return (default 100)"
      }
    ],
    "columns": [
      "list_type",
      "rank",
      "asin",
      "title",
      "price_text",
      "rating_value",
      "review_count"
    ],
    "type": "js",
    "modulePath": "amazon/bestsellers.js",
    "sourceFile": "amazon/bestsellers.js",
    "navigateBefore": false
  },
  {
    "site": "amazon",
    "name": "discussion",
    "description": "Amazon review summary and sample customer discussion from product review pages",
    "access": "read",
    "domain": "amazon.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "ASIN or product URL, for example B0FJS72893"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Maximum number of review samples to return (default 10)"
      }
    ],
    "columns": [
      "asin",
      "average_rating_value",
      "total_review_count"
    ],
    "type": "js",
    "modulePath": "amazon/discussion.js",
    "sourceFile": "amazon/discussion.js",
    "navigateBefore": false
  },
  {
    "site": "amazon",
    "name": "movers-shakers",
    "description": "Amazon Movers & Shakers pages for short-term growth signals",
    "access": "read",
    "domain": "amazon.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Ranking URL or supported Amazon path. Omit to use the list root."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 100,
        "required": false,
        "help": "Maximum number of ranked items to return (default 100)"
      }
    ],
    "columns": [
      "list_type",
      "rank",
      "asin",
      "title",
      "price_text",
      "rating_value",
      "review_count"
    ],
    "type": "js",
    "modulePath": "amazon/movers-shakers.js",
    "sourceFile": "amazon/movers-shakers.js",
    "navigateBefore": false
  },
  {
    "site": "amazon",
    "name": "new-releases",
    "description": "Amazon New Releases pages for early momentum discovery",
    "access": "read",
    "domain": "amazon.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Ranking URL or supported Amazon path. Omit to use the list root."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 100,
        "required": false,
        "help": "Maximum number of ranked items to return (default 100)"
      }
    ],
    "columns": [
      "list_type",
      "rank",
      "asin",
      "title",
      "price_text",
      "rating_value",
      "review_count"
    ],
    "type": "js",
    "modulePath": "amazon/new-releases.js",
    "sourceFile": "amazon/new-releases.js",
    "navigateBefore": false
  },
  {
    "site": "amazon",
    "name": "offer",
    "description": "Amazon seller, buy box, and fulfillment facts from the product page",
    "access": "read",
    "domain": "amazon.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "ASIN or product URL, for example B0FJS72893"
      }
    ],
    "columns": [
      "asin",
      "price_text",
      "sold_by",
      "ships_from",
      "is_amazon_sold",
      "is_amazon_fulfilled"
    ],
    "type": "js",
    "modulePath": "amazon/offer.js",
    "sourceFile": "amazon/offer.js",
    "navigateBefore": false
  },
  {
    "site": "amazon",
    "name": "product",
    "description": "Amazon product page facts for candidate validation",
    "access": "read",
    "domain": "amazon.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "ASIN or product URL, for example B0FJS72893"
      }
    ],
    "columns": [
      "asin",
      "title",
      "price_text",
      "rating_value",
      "review_count"
    ],
    "type": "js",
    "modulePath": "amazon/product.js",
    "sourceFile": "amazon/product.js",
    "navigateBefore": false
  },
  {
    "site": "amazon",
    "name": "search",
    "description": "Amazon search results for product discovery and coarse filtering",
    "access": "read",
    "domain": "amazon.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query, for example \"desk shelf organizer\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of results to return (default 20)"
      }
    ],
    "columns": [
      "rank",
      "asin",
      "title",
      "price_text",
      "rating_value",
      "review_count"
    ],
    "type": "js",
    "modulePath": "amazon/search.js",
    "sourceFile": "amazon/search.js",
    "navigateBefore": false
  },
  {
    "site": "antigravity",
    "name": "dump",
    "description": "Dump the DOM to help AI understand the UI",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "htmlFile",
      "snapFile"
    ],
    "type": "js",
    "modulePath": "antigravity/dump.js",
    "sourceFile": "antigravity/dump.js",
    "navigateBefore": true
  },
  {
    "site": "antigravity",
    "name": "extract-code",
    "description": "Extract multi-line code blocks from the current Antigravity conversation",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "code"
    ],
    "type": "js",
    "modulePath": "antigravity/extract-code.js",
    "sourceFile": "antigravity/extract-code.js",
    "navigateBefore": true
  },
  {
    "site": "antigravity",
    "name": "model",
    "description": "Switch the active LLM model in Antigravity",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Target model name (e.g. claude, gemini, o1)"
      }
    ],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "antigravity/model.js",
    "sourceFile": "antigravity/model.js",
    "navigateBefore": true
  },
  {
    "site": "antigravity",
    "name": "new",
    "description": "Start a new conversation / clear context in Antigravity",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "status"
    ],
    "type": "js",
    "modulePath": "antigravity/new.js",
    "sourceFile": "antigravity/new.js",
    "navigateBefore": true
  },
  {
    "site": "antigravity",
    "name": "read",
    "description": "Read the latest chat messages from Antigravity AI",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "last",
        "type": "str",
        "required": false,
        "help": "Number of recent messages to read (not fully implemented due to generic structure, currently returns full history text or latest chunk)"
      }
    ],
    "columns": [
      "role",
      "content"
    ],
    "type": "js",
    "modulePath": "antigravity/read.js",
    "sourceFile": "antigravity/read.js",
    "navigateBefore": true
  },
  {
    "site": "antigravity",
    "name": "send",
    "description": "Send a message to Antigravity AI via the internal Lexical editor",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "message",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "The message text to send"
      }
    ],
    "columns": [
      "Status",
      "Message"
    ],
    "type": "js",
    "modulePath": "antigravity/send.js",
    "sourceFile": "antigravity/send.js",
    "navigateBefore": true
  },
  {
    "site": "antigravity",
    "name": "status",
    "description": "Check Antigravity CDP connection and get current page state",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "status",
      "url",
      "title"
    ],
    "type": "js",
    "modulePath": "antigravity/status.js",
    "sourceFile": "antigravity/status.js",
    "navigateBefore": true
  },
  {
    "site": "antigravity",
    "name": "watch",
    "description": "Stream new chat messages from Antigravity in real-time",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "timeout",
        "type": "int",
        "default": 86400,
        "required": false,
        "help": "Max seconds to keep watching (default: 86400 — 24h)"
      }
    ],
    "columns": [],
    "type": "js",
    "modulePath": "antigravity/watch.js",
    "sourceFile": "antigravity/watch.js",
    "navigateBefore": true
  },
  {
    "site": "apple-podcasts",
    "name": "episodes",
    "description": "List recent episodes of an Apple Podcast (use ID from search)",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Podcast ID (collectionId from search output)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Max episodes to show"
      }
    ],
    "columns": [
      "title",
      "duration",
      "date"
    ],
    "type": "js",
    "modulePath": "apple-podcasts/episodes.js",
    "sourceFile": "apple-podcasts/episodes.js"
  },
  {
    "site": "apple-podcasts",
    "name": "search",
    "description": "Search Apple Podcasts",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max results"
      }
    ],
    "columns": [
      "id",
      "title",
      "author",
      "episodes",
      "genre",
      "url"
    ],
    "type": "js",
    "modulePath": "apple-podcasts/search.js",
    "sourceFile": "apple-podcasts/search.js"
  },
  {
    "site": "apple-podcasts",
    "name": "top",
    "description": "Top podcasts chart on Apple Podcasts",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of podcasts (max 100)"
      },
      {
        "name": "country",
        "type": "str",
        "default": "us",
        "required": false,
        "help": "Country code (e.g. us, cn, gb, jp)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "id"
    ],
    "type": "js",
    "modulePath": "apple-podcasts/top.js",
    "sourceFile": "apple-podcasts/top.js"
  },
  {
    "site": "arxiv",
    "name": "author",
    "description": "List arXiv papers by a given author (newest first)",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "author",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Author name (e.g. \"Yoshua Bengio\" or \"Y Bengio\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max papers to return (max 50)"
      }
    ],
    "columns": [
      "id",
      "title",
      "authors",
      "published",
      "primary_category",
      "url"
    ],
    "type": "js",
    "modulePath": "arxiv/author.js",
    "sourceFile": "arxiv/author.js"
  },
  {
    "site": "arxiv",
    "name": "paper",
    "description": "Get arXiv paper details by ID",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "arXiv paper ID (e.g. 1706.03762)"
      }
    ],
    "columns": [
      "id",
      "title",
      "authors",
      "published",
      "updated",
      "primary_category",
      "categories",
      "abstract",
      "comment",
      "pdf",
      "url"
    ],
    "type": "js",
    "modulePath": "arxiv/paper.js",
    "sourceFile": "arxiv/paper.js"
  },
  {
    "site": "arxiv",
    "name": "recent",
    "description": "List recent arXiv submissions in a category",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "category",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "arXiv category (e.g. cs.CL, cs.LG, math.PR, q-bio.NC)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max results (max 50)"
      }
    ],
    "columns": [
      "id",
      "title",
      "authors",
      "published",
      "primary_category",
      "url"
    ],
    "type": "js",
    "modulePath": "arxiv/recent.js",
    "sourceFile": "arxiv/recent.js"
  },
  {
    "site": "arxiv",
    "name": "search",
    "description": "Search arXiv papers",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"attention is all you need\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max results (max 25)"
      }
    ],
    "columns": [
      "id",
      "title",
      "authors",
      "published",
      "primary_category",
      "url"
    ],
    "type": "js",
    "modulePath": "arxiv/search.js",
    "sourceFile": "arxiv/search.js"
  },
  {
    "site": "baidu-scholar",
    "name": "search",
    "description": "百度学术搜索",
    "access": "read",
    "domain": "xueshu.baidu.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "authors",
      "journal",
      "year",
      "cited",
      "url"
    ],
    "type": "js",
    "modulePath": "baidu-scholar/search.js",
    "sourceFile": "baidu-scholar/search.js"
  },
  {
    "site": "band",
    "name": "bands",
    "description": "List all Bands you belong to",
    "access": "read",
    "domain": "www.band.us",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "band_no",
      "name",
      "members"
    ],
    "type": "js",
    "modulePath": "band/bands.js",
    "sourceFile": "band/bands.js",
    "navigateBefore": "https://www.band.us"
  },
  {
    "site": "band",
    "name": "mentions",
    "description": "Show Band notifications where you are @mentioned",
    "access": "read",
    "domain": "www.band.us",
    "strategy": "intercept",
    "browser": true,
    "args": [
      {
        "name": "filter",
        "type": "str",
        "default": "mentioned",
        "required": false,
        "help": "Filter: mentioned (default) | all | post | comment",
        "choices": [
          "mentioned",
          "all",
          "post",
          "comment"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results"
      },
      {
        "name": "unread",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Show only unread notifications"
      }
    ],
    "columns": [
      "time",
      "band",
      "type",
      "from",
      "text",
      "url"
    ],
    "type": "js",
    "modulePath": "band/mentions.js",
    "sourceFile": "band/mentions.js",
    "navigateBefore": true
  },
  {
    "site": "band",
    "name": "post",
    "description": "Export full content of a post including comments",
    "access": "read",
    "domain": "www.band.us",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "band_no",
        "type": "int",
        "required": true,
        "positional": true,
        "help": "Band number"
      },
      {
        "name": "post_no",
        "type": "int",
        "required": true,
        "positional": true,
        "help": "Post number"
      },
      {
        "name": "output",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Directory to save attached photos"
      },
      {
        "name": "comments",
        "type": "bool",
        "default": true,
        "required": false,
        "help": "Include comments (default: true)"
      }
    ],
    "columns": [
      "type",
      "author",
      "date",
      "text"
    ],
    "type": "js",
    "modulePath": "band/post.js",
    "sourceFile": "band/post.js",
    "navigateBefore": false
  },
  {
    "site": "band",
    "name": "posts",
    "description": "List posts from a Band",
    "access": "read",
    "domain": "www.band.us",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "band_no",
        "type": "int",
        "required": true,
        "positional": true,
        "help": "Band number (get it from: band bands)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results"
      }
    ],
    "columns": [
      "date",
      "author",
      "content",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "band/posts.js",
    "sourceFile": "band/posts.js",
    "navigateBefore": false
  },
  {
    "site": "barchart",
    "name": "flow",
    "description": "Barchart unusual options activity / options flow",
    "access": "read",
    "domain": "www.barchart.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "type",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "Filter: all, call, or put",
        "choices": [
          "all",
          "call",
          "put"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "symbol",
      "type",
      "strike",
      "expiration",
      "last",
      "volume",
      "openInterest",
      "volOiRatio",
      "iv"
    ],
    "type": "js",
    "modulePath": "barchart/flow.js",
    "sourceFile": "barchart/flow.js",
    "navigateBefore": "https://www.barchart.com"
  },
  {
    "site": "barchart",
    "name": "greeks",
    "description": "Barchart options greeks overview (IV, delta, gamma, theta, vega)",
    "access": "read",
    "domain": "www.barchart.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Stock ticker (e.g. AAPL)"
      },
      {
        "name": "expiration",
        "type": "str",
        "required": false,
        "help": "Expiration date (YYYY-MM-DD). Defaults to the nearest available expiration."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of near-the-money strikes per type (1-100)"
      }
    ],
    "columns": [
      "type",
      "strike",
      "last",
      "iv",
      "delta",
      "gamma",
      "theta",
      "vega",
      "rho",
      "volume",
      "openInterest",
      "expiration"
    ],
    "type": "js",
    "modulePath": "barchart/greeks.js",
    "sourceFile": "barchart/greeks.js",
    "navigateBefore": "https://www.barchart.com"
  },
  {
    "site": "barchart",
    "name": "options",
    "description": "Barchart options chain with greeks, IV, volume, and open interest",
    "access": "read",
    "domain": "www.barchart.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Stock ticker (e.g. AAPL)"
      },
      {
        "name": "type",
        "type": "str",
        "default": "Call",
        "required": false,
        "help": "Option type: Call or Put",
        "choices": [
          "Call",
          "Put"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max number of strikes to return"
      }
    ],
    "columns": [
      "strike",
      "bid",
      "ask",
      "last",
      "change",
      "volume",
      "openInterest",
      "iv",
      "delta",
      "gamma",
      "theta",
      "vega",
      "expiration"
    ],
    "type": "js",
    "modulePath": "barchart/options.js",
    "sourceFile": "barchart/options.js",
    "navigateBefore": "https://www.barchart.com"
  },
  {
    "site": "barchart",
    "name": "quote",
    "description": "Barchart stock quote with price, volume, and key metrics",
    "access": "read",
    "domain": "www.barchart.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Stock ticker (e.g. AAPL, MSFT, TSLA)"
      }
    ],
    "columns": [
      "symbol",
      "name",
      "price",
      "change",
      "changePct",
      "open",
      "high",
      "low",
      "prevClose",
      "volume",
      "avgVolume",
      "marketCap",
      "peRatio",
      "eps"
    ],
    "type": "js",
    "modulePath": "barchart/quote.js",
    "sourceFile": "barchart/quote.js",
    "navigateBefore": "https://www.barchart.com"
  },
  {
    "site": "bbc",
    "name": "news",
    "description": "BBC News headlines (RSS)",
    "access": "read",
    "domain": "www.bbc.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of headlines (max 50)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "bbc/news.js",
    "sourceFile": "bbc/news.js"
  },
  {
    "site": "bbc",
    "name": "topic",
    "description": "BBC News headlines for a specific section (RSS feed)",
    "access": "read",
    "domain": "www.bbc.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "topic",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Section name (world / business / politics / health / education / science_and_environment / technology / entertainment_and_arts)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max headlines (1-50)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "description",
      "pubDate",
      "url"
    ],
    "type": "js",
    "modulePath": "bbc/topic.js",
    "sourceFile": "bbc/topic.js"
  },
  {
    "site": "bilibili",
    "name": "comments",
    "description": "获取 B站视频评论（使用官方 API + WBI 签名）",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "bvid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Video BV ID (e.g. BV1WtAGzYEBm)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of comments (max 50)"
      }
    ],
    "columns": [
      "rank",
      "author",
      "text",
      "likes",
      "replies",
      "time"
    ],
    "type": "js",
    "modulePath": "bilibili/comments.js",
    "sourceFile": "bilibili/comments.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "download",
    "description": "下载B站视频（需要 yt-dlp）",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "bvid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Video BV ID (e.g., BV1xxx)"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./bilibili-downloads",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "quality",
        "type": "str",
        "default": "best",
        "required": false,
        "help": "Video quality (best, 1080p, 720p, 480p)"
      }
    ],
    "columns": [
      "bvid",
      "title",
      "status",
      "size"
    ],
    "type": "js",
    "modulePath": "bilibili/download.js",
    "sourceFile": "bilibili/download.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "dynamic",
    "description": "Get Bilibili user dynamic feed",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "id",
      "author",
      "text",
      "likes",
      "url"
    ],
    "type": "js",
    "modulePath": "bilibili/dynamic.js",
    "sourceFile": "bilibili/dynamic.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "favorite",
    "description": "我的收藏夹",
    "access": "write",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "fid",
        "type": "int",
        "required": false,
        "help": "Favorite folder ID (defaults to first folder)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "plays",
      "url"
    ],
    "type": "js",
    "modulePath": "bilibili/favorite.js",
    "sourceFile": "bilibili/favorite.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "feed",
    "description": "动态时间线（不传 uid 查关注时间线，传 uid 查指定用户动态）",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "用户 UID 或用户名（不传则显示关注时间线）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results to return"
      },
      {
        "name": "type",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "Filter: all, video, article, draw, text"
      },
      {
        "name": "pages",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of pages to fetch (each ~20 items)"
      }
    ],
    "columns": [
      "rank",
      "time",
      "author",
      "title",
      "type",
      "likes",
      "url"
    ],
    "type": "js",
    "modulePath": "bilibili/feed.js",
    "sourceFile": "bilibili/feed.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "feed-detail",
    "description": "查看 Bilibili 动态详情（支持充电专属内容）",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "动态 ID（从 feed 命令的 url 中获取）"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "bilibili/feed.js",
    "sourceFile": "bilibili/feed.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "following",
    "description": "获取 Bilibili 用户的关注列表",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "目标用户 ID（默认为当前登录用户）"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "页码"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "每页数量 (最大 50)"
      }
    ],
    "columns": [
      "mid",
      "name",
      "sign",
      "following",
      "fans"
    ],
    "type": "js",
    "modulePath": "bilibili/following.js",
    "sourceFile": "bilibili/following.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "history",
    "description": "我的观看历史",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "progress",
      "url"
    ],
    "type": "js",
    "modulePath": "bilibili/history.js",
    "sourceFile": "bilibili/history.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "hot",
    "description": "B站热门视频",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of videos"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "play",
      "danmaku",
      "bvid",
      "url"
    ],
    "type": "js",
    "modulePath": "bilibili/hot.js",
    "sourceFile": "bilibili/hot.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "me",
    "description": "My Bilibili profile info",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "name",
      "uid",
      "level",
      "coins",
      "followers",
      "following"
    ],
    "type": "js",
    "modulePath": "bilibili/me.js",
    "sourceFile": "bilibili/me.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "ranking",
    "description": "Get Bilibili video ranking board",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "score",
      "url"
    ],
    "type": "js",
    "modulePath": "bilibili/ranking.js",
    "sourceFile": "bilibili/ranking.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "search",
    "description": "Search Bilibili videos or users",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "type",
        "type": "str",
        "default": "video",
        "required": false,
        "help": "video or user"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Result page"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "score",
      "url"
    ],
    "type": "js",
    "modulePath": "bilibili/search.js",
    "sourceFile": "bilibili/search.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "subtitle",
    "description": "获取 Bilibili 视频的字幕",
    "access": "read",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "bvid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Bilibili 视频 BV ID（如 BV1xx411c7mD），或视频 URL / b23.tv 短链"
      },
      {
        "name": "lang",
        "type": "str",
        "required": false,
        "help": "字幕语言代码 (如 zh-CN, en-US, ai-zh)，默认取第一个"
      }
    ],
    "columns": [
      "index",
      "from",
      "to",
      "content"
    ],
    "type": "js",
    "modulePath": "bilibili/subtitle.js",
    "sourceFile": "bilibili/subtitle.js",
    "navigateBefore": true
  },
  {
    "site": "bilibili",
    "name": "summary",
    "description": "获取 B站视频的官方 AI 总结（视频页「AI总结」同款，含分段大纲与时间戳）",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "bvid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Video BV ID / URL / b23.tv short link"
      }
    ],
    "columns": [
      "time",
      "content"
    ],
    "type": "js",
    "modulePath": "bilibili/summary.js",
    "sourceFile": "bilibili/summary.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "user-videos",
    "description": "查看指定用户的投稿视频",
    "access": "read",
    "domain": "www.bilibili.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "User UID or username"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      },
      {
        "name": "order",
        "type": "str",
        "default": "pubdate",
        "required": false,
        "help": "Sort: pubdate, click, stow"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      }
    ],
    "columns": [
      "rank",
      "title",
      "plays",
      "likes",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "bilibili/user-videos.js",
    "sourceFile": "bilibili/user-videos.js",
    "navigateBefore": "https://www.bilibili.com"
  },
  {
    "site": "bilibili",
    "name": "video",
    "description": "Get Bilibili video metadata (title, author, duration, stats, etc.)",
    "access": "read",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "bvid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "BV ID, video URL, or b23.tv short link"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "bilibili/video.js",
    "sourceFile": "bilibili/video.js",
    "navigateBefore": true
  },
  {
    "site": "binance",
    "name": "asks",
    "description": "Order book ask prices for a trading pair",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Trading pair symbol (e.g. BTCUSDT, ETHUSDT)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of price levels (5, 10, 20, 50, 100)"
      }
    ],
    "columns": [
      "rank",
      "ask_price",
      "ask_qty"
    ],
    "type": "js",
    "modulePath": "binance/asks.js",
    "sourceFile": "binance/asks.js"
  },
  {
    "site": "binance",
    "name": "depth",
    "description": "Order book bid and ask prices for a trading pair",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Trading pair symbol (e.g. BTCUSDT, ETHUSDT)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of price levels (5, 10, 20, 50, 100)"
      }
    ],
    "columns": [
      "rank",
      "bid_price",
      "bid_qty",
      "ask_price",
      "ask_qty"
    ],
    "type": "js",
    "modulePath": "binance/depth.js",
    "sourceFile": "binance/depth.js"
  },
  {
    "site": "binance",
    "name": "gainers",
    "description": "Top gaining trading pairs by 24h price change",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of trading pairs"
      }
    ],
    "columns": [
      "rank",
      "symbol",
      "price",
      "change_24h",
      "volume"
    ],
    "type": "js",
    "modulePath": "binance/gainers.js",
    "sourceFile": "binance/gainers.js"
  },
  {
    "site": "binance",
    "name": "klines",
    "description": "Candlestick/kline data for a trading pair",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Trading pair symbol (e.g. BTCUSDT, ETHUSDT)"
      },
      {
        "name": "interval",
        "type": "str",
        "default": "1d",
        "required": false,
        "help": "Kline interval (1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of klines (max 1000)"
      }
    ],
    "columns": [
      "open",
      "high",
      "low",
      "close",
      "volume"
    ],
    "type": "js",
    "modulePath": "binance/klines.js",
    "sourceFile": "binance/klines.js"
  },
  {
    "site": "binance",
    "name": "losers",
    "description": "Top losing trading pairs by 24h price change",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of trading pairs"
      }
    ],
    "columns": [
      "rank",
      "symbol",
      "price",
      "change_24h",
      "volume"
    ],
    "type": "js",
    "modulePath": "binance/losers.js",
    "sourceFile": "binance/losers.js"
  },
  {
    "site": "binance",
    "name": "pairs",
    "description": "List active trading pairs on Binance",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of trading pairs"
      }
    ],
    "columns": [
      "symbol",
      "base",
      "quote",
      "status"
    ],
    "type": "js",
    "modulePath": "binance/pairs.js",
    "sourceFile": "binance/pairs.js"
  },
  {
    "site": "binance",
    "name": "price",
    "description": "Quick price check for a trading pair",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Trading pair symbol (e.g. BTCUSDT, ETHUSDT)"
      }
    ],
    "columns": [
      "symbol",
      "price",
      "change",
      "change_pct",
      "high",
      "low",
      "volume",
      "quote_volume",
      "trades"
    ],
    "type": "js",
    "modulePath": "binance/price.js",
    "sourceFile": "binance/price.js"
  },
  {
    "site": "binance",
    "name": "prices",
    "description": "Latest prices for all trading pairs",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of prices"
      }
    ],
    "columns": [
      "rank",
      "symbol",
      "price"
    ],
    "type": "js",
    "modulePath": "binance/prices.js",
    "sourceFile": "binance/prices.js"
  },
  {
    "site": "binance",
    "name": "ticker",
    "description": "24h ticker statistics for top trading pairs by volume",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of tickers"
      }
    ],
    "columns": [
      "symbol",
      "price",
      "change_pct",
      "high",
      "low",
      "volume",
      "quote_vol",
      "trades"
    ],
    "type": "js",
    "modulePath": "binance/ticker.js",
    "sourceFile": "binance/ticker.js"
  },
  {
    "site": "binance",
    "name": "top",
    "description": "Top trading pairs by 24h volume on Binance",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of trading pairs"
      }
    ],
    "columns": [
      "rank",
      "symbol",
      "price",
      "change_24h",
      "high",
      "low",
      "volume"
    ],
    "type": "js",
    "modulePath": "binance/top.js",
    "sourceFile": "binance/top.js"
  },
  {
    "site": "binance",
    "name": "trades",
    "description": "Recent trades for a trading pair",
    "access": "read",
    "domain": "data-api.binance.vision",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Trading pair symbol (e.g. BTCUSDT, ETHUSDT)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of trades (max 1000)"
      }
    ],
    "columns": [
      "id",
      "price",
      "qty",
      "quote_qty",
      "buyer_maker"
    ],
    "type": "js",
    "modulePath": "binance/trades.js",
    "sourceFile": "binance/trades.js"
  },
  {
    "site": "bloomberg",
    "name": "businessweek",
    "description": "Bloomberg Businessweek top stories (RSS)",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of feed items to return (max 20)"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks"
    ],
    "type": "js",
    "modulePath": "bloomberg/businessweek.js",
    "sourceFile": "bloomberg/businessweek.js"
  },
  {
    "site": "bloomberg",
    "name": "economics",
    "description": "Bloomberg Economics top stories (RSS)",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of feed items to return (max 20)"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks"
    ],
    "type": "js",
    "modulePath": "bloomberg/economics.js",
    "sourceFile": "bloomberg/economics.js"
  },
  {
    "site": "bloomberg",
    "name": "feeds",
    "description": "List the Bloomberg RSS feed aliases used by the adapter",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "name",
      "url"
    ],
    "type": "js",
    "modulePath": "bloomberg/feeds.js",
    "sourceFile": "bloomberg/feeds.js"
  },
  {
    "site": "bloomberg",
    "name": "industries",
    "description": "Bloomberg Industries top stories (RSS)",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of feed items to return (max 20)"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks"
    ],
    "type": "js",
    "modulePath": "bloomberg/industries.js",
    "sourceFile": "bloomberg/industries.js"
  },
  {
    "site": "bloomberg",
    "name": "main",
    "description": "Bloomberg homepage top stories (RSS)",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of feed items to return (max 20)"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks"
    ],
    "type": "js",
    "modulePath": "bloomberg/main.js",
    "sourceFile": "bloomberg/main.js"
  },
  {
    "site": "bloomberg",
    "name": "markets",
    "description": "Bloomberg Markets top stories (RSS)",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of feed items to return (max 20)"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks"
    ],
    "type": "js",
    "modulePath": "bloomberg/markets.js",
    "sourceFile": "bloomberg/markets.js"
  },
  {
    "site": "bloomberg",
    "name": "news",
    "description": "Read a Bloomberg story/article page and return title, full content, and media links",
    "access": "read",
    "domain": "www.bloomberg.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "link",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Bloomberg story/article URL or relative Bloomberg path"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks",
      "content"
    ],
    "type": "js",
    "modulePath": "bloomberg/news.js",
    "sourceFile": "bloomberg/news.js",
    "navigateBefore": "https://www.bloomberg.com"
  },
  {
    "site": "bloomberg",
    "name": "opinions",
    "description": "Bloomberg Opinion top stories (RSS)",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of feed items to return (max 20)"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks"
    ],
    "type": "js",
    "modulePath": "bloomberg/opinions.js",
    "sourceFile": "bloomberg/opinions.js"
  },
  {
    "site": "bloomberg",
    "name": "politics",
    "description": "Bloomberg Politics top stories (RSS)",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of feed items to return (max 20)"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks"
    ],
    "type": "js",
    "modulePath": "bloomberg/politics.js",
    "sourceFile": "bloomberg/politics.js"
  },
  {
    "site": "bloomberg",
    "name": "tech",
    "description": "Bloomberg Tech top stories (RSS)",
    "access": "read",
    "domain": "feeds.bloomberg.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of feed items to return (max 20)"
      }
    ],
    "columns": [
      "title",
      "summary",
      "link",
      "mediaLinks"
    ],
    "type": "js",
    "modulePath": "bloomberg/tech.js",
    "sourceFile": "bloomberg/tech.js"
  },
  {
    "site": "bluesky",
    "name": "feeds",
    "description": "Popular Bluesky feed generators",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of feeds"
      }
    ],
    "columns": [
      "rank",
      "name",
      "likes",
      "creator",
      "description"
    ],
    "type": "js",
    "modulePath": "bluesky/feeds.js",
    "sourceFile": "bluesky/feeds.js"
  },
  {
    "site": "bluesky",
    "name": "followers",
    "description": "List followers of a Bluesky user",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "handle",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Bluesky handle"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of followers"
      }
    ],
    "columns": [
      "rank",
      "handle",
      "name",
      "description"
    ],
    "type": "js",
    "modulePath": "bluesky/followers.js",
    "sourceFile": "bluesky/followers.js"
  },
  {
    "site": "bluesky",
    "name": "following",
    "description": "List accounts a Bluesky user is following",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "handle",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Bluesky handle"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of accounts"
      }
    ],
    "columns": [
      "rank",
      "handle",
      "name",
      "description"
    ],
    "type": "js",
    "modulePath": "bluesky/following.js",
    "sourceFile": "bluesky/following.js"
  },
  {
    "site": "bluesky",
    "name": "profile",
    "description": "Get Bluesky user profile info",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "handle",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Bluesky handle (e.g. bsky.app, jay.bsky.team)"
      }
    ],
    "columns": [
      "handle",
      "name",
      "followers",
      "following",
      "posts",
      "description"
    ],
    "type": "js",
    "modulePath": "bluesky/profile.js",
    "sourceFile": "bluesky/profile.js"
  },
  {
    "site": "bluesky",
    "name": "search",
    "description": "Search Bluesky users",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "handle",
      "name",
      "followers",
      "description"
    ],
    "type": "js",
    "modulePath": "bluesky/search.js",
    "sourceFile": "bluesky/search.js"
  },
  {
    "site": "bluesky",
    "name": "starter-packs",
    "description": "Get starter packs created by a Bluesky user",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "handle",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Bluesky handle"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of starter packs"
      }
    ],
    "columns": [
      "rank",
      "name",
      "description",
      "members",
      "joins"
    ],
    "type": "js",
    "modulePath": "bluesky/starter-packs.js",
    "sourceFile": "bluesky/starter-packs.js"
  },
  {
    "site": "bluesky",
    "name": "thread",
    "description": "Get a Bluesky post thread with replies",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "uri",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Post AT URI (at://did:.../app.bsky.feed.post/...) or bsky.app URL"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of replies"
      }
    ],
    "columns": [
      "author",
      "text",
      "likes",
      "reposts",
      "replies_count"
    ],
    "type": "js",
    "modulePath": "bluesky/thread.js",
    "sourceFile": "bluesky/thread.js"
  },
  {
    "site": "bluesky",
    "name": "trending",
    "description": "Trending topics on Bluesky",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of topics"
      }
    ],
    "columns": [
      "rank",
      "topic",
      "link"
    ],
    "type": "js",
    "modulePath": "bluesky/trending.js",
    "sourceFile": "bluesky/trending.js"
  },
  {
    "site": "bluesky",
    "name": "user",
    "description": "Get recent posts from a Bluesky user",
    "access": "read",
    "domain": "public.api.bsky.app",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "handle",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Bluesky handle (e.g. bsky.app)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "rank",
      "uri",
      "text",
      "likes",
      "reposts",
      "replies"
    ],
    "type": "js",
    "modulePath": "bluesky/user.js",
    "sourceFile": "bluesky/user.js"
  },
  {
    "site": "booking",
    "name": "search",
    "description": "Search Booking.com hotels by destination and dates (server-rendered card scrape).",
    "access": "read",
    "example": "opencli booking search Tokyo --checkin 2026-06-15 --checkout 2026-06-17 -f yaml",
    "domain": "www.booking.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "destination",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Destination keyword (city, district, or hotel name)"
      },
      {
        "name": "checkin",
        "type": "str",
        "required": true,
        "help": "Check-in date YYYY-MM-DD"
      },
      {
        "name": "checkout",
        "type": "str",
        "required": true,
        "help": "Check-out date YYYY-MM-DD"
      },
      {
        "name": "adults",
        "type": "int",
        "default": 2,
        "required": false,
        "help": "Number of adults (1-30)"
      },
      {
        "name": "rooms",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Number of rooms (1-30)"
      },
      {
        "name": "children",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Number of children (0-10)"
      },
      {
        "name": "currency",
        "type": "str",
        "required": false,
        "help": "Force result currency (e.g. USD, JPY, CNY)"
      },
      {
        "name": "lang",
        "type": "str",
        "required": false,
        "help": "Force result language (e.g. en-us, zh-cn, ja)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Max rows to return (1-100; Booking pages 25 per request)"
      },
      {
        "name": "offset",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Result offset for pagination (multiple of 25)"
      }
    ],
    "columns": [
      "rank",
      "name",
      "country",
      "slug",
      "star_rating",
      "review_score",
      "review_count",
      "price_amount",
      "price_currency",
      "distance",
      "recommended_room",
      "url"
    ],
    "type": "js",
    "modulePath": "booking/search.js",
    "sourceFile": "booking/search.js"
  },
  {
    "site": "boss",
    "name": "batchgreet",
    "description": "BOSS直聘批量向推荐候选人发送招呼",
    "access": "write",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "job-id",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Filter by encrypted job ID (greet all jobs if empty)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Max candidates to greet"
      },
      {
        "name": "text",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Custom greeting message (uses default if empty)"
      }
    ],
    "columns": [
      "name",
      "status",
      "detail"
    ],
    "type": "js",
    "modulePath": "boss/batchgreet.js",
    "sourceFile": "boss/batchgreet.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "chatlist",
    "description": "BOSS直聘查看聊天列表（招聘端/求职端）",
    "access": "read",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      },
      {
        "name": "job-id",
        "type": "str",
        "default": "0",
        "required": false,
        "help": "Filter by job ID (0=all, boss side only)"
      },
      {
        "name": "side",
        "type": "str",
        "default": "auto",
        "required": false,
        "help": "Identity side: auto (default), boss (recruiter), or geek (job-seeker)",
        "choices": [
          "auto",
          "boss",
          "geek"
        ]
      }
    ],
    "columns": [
      "name",
      "company",
      "job",
      "title",
      "last_msg",
      "last_time",
      "uid",
      "security_id"
    ],
    "type": "js",
    "modulePath": "boss/chatlist.js",
    "sourceFile": "boss/chatlist.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "chatmsg",
    "description": "BOSS直聘查看聊天消息历史（招聘端/求职端）",
    "access": "read",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Encrypted UID (from chatlist)"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "side",
        "type": "str",
        "default": "auto",
        "required": false,
        "help": "Identity side: auto (default), boss (recruiter), or geek (job-seeker)",
        "choices": [
          "auto",
          "boss",
          "geek"
        ]
      }
    ],
    "columns": [
      "from",
      "type",
      "text",
      "time"
    ],
    "type": "js",
    "modulePath": "boss/chatmsg.js",
    "sourceFile": "boss/chatmsg.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "detail",
    "description": "BOSS直聘查看职位详情",
    "access": "read",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "security-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Security ID from search results (securityId field)"
      }
    ],
    "columns": [
      "name",
      "salary",
      "experience",
      "degree",
      "city",
      "district",
      "description",
      "skills",
      "welfare",
      "boss_name",
      "boss_title",
      "active_time",
      "company",
      "industry",
      "scale",
      "stage",
      "address",
      "url"
    ],
    "type": "js",
    "modulePath": "boss/detail.js",
    "sourceFile": "boss/detail.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "exchange",
    "description": "BOSS直聘交换联系方式（请求手机/微信）",
    "access": "write",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Encrypted UID of the candidate"
      },
      {
        "name": "type",
        "type": "str",
        "default": "phone",
        "required": false,
        "help": "Exchange type: phone or wechat",
        "choices": [
          "phone",
          "wechat"
        ]
      }
    ],
    "columns": [
      "status",
      "detail"
    ],
    "type": "js",
    "modulePath": "boss/exchange.js",
    "sourceFile": "boss/exchange.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "greet",
    "description": "BOSS直聘向新候选人发送招呼（开始聊天）",
    "access": "write",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Encrypted UID of the candidate (from recommend)"
      },
      {
        "name": "security-id",
        "type": "str",
        "required": true,
        "help": "Security ID of the candidate"
      },
      {
        "name": "job-id",
        "type": "str",
        "required": true,
        "help": "Encrypted job ID"
      },
      {
        "name": "text",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Custom greeting message (uses default template if empty)"
      }
    ],
    "columns": [
      "status",
      "detail"
    ],
    "type": "js",
    "modulePath": "boss/greet.js",
    "sourceFile": "boss/greet.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "invite",
    "description": "BOSS直聘发送面试邀请",
    "access": "write",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Encrypted UID of the candidate"
      },
      {
        "name": "time",
        "type": "str",
        "required": true,
        "help": "Interview time (e.g. 2025-04-01 14:00)"
      },
      {
        "name": "address",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Interview address (uses saved address if empty)"
      },
      {
        "name": "contact",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Contact person name (uses saved contact if empty)"
      }
    ],
    "columns": [
      "status",
      "detail"
    ],
    "type": "js",
    "modulePath": "boss/invite.js",
    "sourceFile": "boss/invite.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "joblist",
    "description": "BOSS直聘查看我发布的职位列表",
    "access": "read",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "job_name",
      "salary",
      "city",
      "status",
      "encrypt_job_id"
    ],
    "type": "js",
    "modulePath": "boss/joblist.js",
    "sourceFile": "boss/joblist.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "mark",
    "description": "BOSS直聘给候选人添加标签",
    "access": "write",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Encrypted UID of the candidate"
      },
      {
        "name": "label",
        "type": "str",
        "required": true,
        "help": "Label name (新招呼/沟通中/已约面/已获取简历/已交换电话/已交换微信/不合适/收藏) or label ID"
      },
      {
        "name": "remove",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Remove the label instead of adding"
      }
    ],
    "columns": [
      "status",
      "detail"
    ],
    "type": "js",
    "modulePath": "boss/mark.js",
    "sourceFile": "boss/mark.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "recommend",
    "description": "BOSS直聘查看推荐候选人（新招呼列表）",
    "access": "read",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results to return"
      }
    ],
    "columns": [
      "name",
      "job_name",
      "last_time",
      "labels",
      "encrypt_uid",
      "security_id",
      "encrypt_job_id"
    ],
    "type": "js",
    "modulePath": "boss/recommend.js",
    "sourceFile": "boss/recommend.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "resume",
    "description": "BOSS直聘查看候选人简历（招聘端）",
    "access": "read",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Encrypted UID of the candidate (from chatlist)"
      }
    ],
    "columns": [
      "name",
      "gender",
      "age",
      "experience",
      "degree",
      "active_time",
      "work_history",
      "education",
      "job_chatting",
      "expect"
    ],
    "type": "js",
    "modulePath": "boss/resume.js",
    "sourceFile": "boss/resume.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "search",
    "description": "BOSS直聘搜索职位（不带关键词时返回为你推荐职位）",
    "access": "read",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Search keyword (optional, empty = recommended jobs)"
      },
      {
        "name": "city",
        "type": "str",
        "default": "北京",
        "required": false,
        "help": "City name or code (e.g. 杭州, 上海, 101010100)"
      },
      {
        "name": "experience",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Experience: 在校生(实习)/应届生(校招)/经验不限/1年以内/1-3年/3-5年/5-10年/10年以上"
      },
      {
        "name": "degree",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Degree: 大专/本科/硕士/博士"
      },
      {
        "name": "salary",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Salary: 3K以下/3-5K/5-10K/10-15K/15-20K/20-30K/30-50K/50K以上"
      },
      {
        "name": "industry",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Industry code or name (e.g. 100020, 互联网)"
      },
      {
        "name": "jobType",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Job type: 全职/兼职/实习（不传=不限，混合校招与实习）"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "name",
      "salary",
      "company",
      "area",
      "experience",
      "degree",
      "skills",
      "boss",
      "bossOnline",
      "security_id",
      "url"
    ],
    "type": "js",
    "modulePath": "boss/search.js",
    "sourceFile": "boss/search.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "send",
    "description": "BOSS直聘发送聊天消息",
    "access": "write",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Encrypted UID of the candidate (from chatlist)"
      },
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Message text to send"
      }
    ],
    "columns": [
      "status",
      "detail"
    ],
    "type": "js",
    "modulePath": "boss/send.js",
    "sourceFile": "boss/send.js",
    "navigateBefore": false
  },
  {
    "site": "boss",
    "name": "stats",
    "description": "BOSS直聘职位数据统计",
    "access": "read",
    "domain": "www.zhipin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "job-id",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Encrypted job ID (show all if empty)"
      }
    ],
    "columns": [
      "job_name",
      "salary",
      "city",
      "status",
      "total_chats",
      "encrypt_job_id"
    ],
    "type": "js",
    "modulePath": "boss/stats.js",
    "sourceFile": "boss/stats.js",
    "navigateBefore": false
  },
  {
    "site": "brave",
    "name": "search",
    "description": "Search Brave Search",
    "access": "read",
    "domain": "search.brave.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results per page (max 18)"
      },
      {
        "name": "offset",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Page offset (0, 1, 2...). Brave returns ~18 results per page"
      }
    ],
    "columns": [
      "rank",
      "title",
      "url",
      "snippet"
    ],
    "type": "js",
    "modulePath": "brave/search.js",
    "sourceFile": "brave/search.js"
  },
  {
    "site": "chaoxing",
    "name": "assignments",
    "description": "学习通作业列表",
    "access": "read",
    "domain": "mooc2-ans.chaoxing.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "course",
        "type": "string",
        "required": false,
        "help": "按课程名过滤（模糊匹配）"
      },
      {
        "name": "status",
        "type": "string",
        "default": "all",
        "required": false,
        "help": "按状态过滤",
        "choices": [
          "all",
          "pending",
          "submitted",
          "graded"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "最大返回数量"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 90,
        "required": false,
        "help": "Max seconds for the overall command (default: 90)"
      }
    ],
    "columns": [
      "rank",
      "course",
      "title",
      "deadline",
      "status",
      "score"
    ],
    "type": "js",
    "modulePath": "chaoxing/assignments.js",
    "sourceFile": "chaoxing/assignments.js",
    "navigateBefore": "https://mooc2-ans.chaoxing.com"
  },
  {
    "site": "chaoxing",
    "name": "exams",
    "description": "学习通考试列表",
    "access": "read",
    "domain": "mooc2-ans.chaoxing.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "course",
        "type": "string",
        "required": false,
        "help": "按课程名过滤（模糊匹配）"
      },
      {
        "name": "status",
        "type": "string",
        "default": "all",
        "required": false,
        "help": "按状态过滤",
        "choices": [
          "all",
          "upcoming",
          "ongoing",
          "finished"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "最大返回数量"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 90,
        "required": false,
        "help": "Max seconds for the overall command (default: 90)"
      }
    ],
    "columns": [
      "rank",
      "course",
      "title",
      "start",
      "end",
      "status",
      "score"
    ],
    "type": "js",
    "modulePath": "chaoxing/exams.js",
    "sourceFile": "chaoxing/exams.js",
    "navigateBefore": "https://mooc2-ans.chaoxing.com"
  },
  {
    "site": "chatgpt",
    "name": "ask",
    "description": "Send a prompt to ChatGPT web and wait for the response",
    "access": "write",
    "domain": "chatgpt.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds to wait for response"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      }
    ],
    "columns": [
      "response"
    ],
    "type": "js",
    "modulePath": "chatgpt/ask.js",
    "sourceFile": "chatgpt/ask.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "chatgpt",
    "name": "detail",
    "description": "Open a ChatGPT web conversation by ID and read its messages",
    "access": "read",
    "domain": "chatgpt.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Conversation ID or full /c/<id> URL"
      },
      {
        "name": "markdown",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Emit assistant replies as markdown"
      }
    ],
    "columns": [
      "Index",
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "chatgpt/detail.js",
    "sourceFile": "chatgpt/detail.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "chatgpt",
    "name": "history",
    "description": "List visible ChatGPT web conversation history from the sidebar",
    "access": "read",
    "domain": "chatgpt.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max conversations to show"
      }
    ],
    "columns": [
      "Index",
      "Id",
      "Title",
      "Url"
    ],
    "type": "js",
    "modulePath": "chatgpt/history.js",
    "sourceFile": "chatgpt/history.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "chatgpt",
    "name": "image",
    "description": "Generate images with ChatGPT web and save them locally",
    "access": "write",
    "domain": "chatgpt.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image prompt to send to ChatGPT"
      },
      {
        "name": "image",
        "type": "str",
        "required": false,
        "help": "Local image path to attach before prompting; comma-separated paths are supported"
      },
      {
        "name": "op",
        "type": "str",
        "required": false,
        "help": "Output directory (default: ~/Pictures/chatgpt)"
      },
      {
        "name": "sd",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Skip download shorthand; only show ChatGPT link"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 240,
        "required": false,
        "help": "Max seconds for the overall command (default: 240)"
      }
    ],
    "columns": [
      "status",
      "file",
      "link"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "chatgpt/image.js",
    "sourceFile": "chatgpt/image.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "chatgpt",
    "name": "new",
    "description": "Start a new ChatGPT web conversation",
    "access": "read",
    "domain": "chatgpt.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "chatgpt/new.js",
    "sourceFile": "chatgpt/new.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "chatgpt",
    "name": "read",
    "description": "Read messages in the current ChatGPT web conversation",
    "access": "read",
    "domain": "chatgpt.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "markdown",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Emit assistant replies as markdown"
      }
    ],
    "columns": [
      "Index",
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "chatgpt/read.js",
    "sourceFile": "chatgpt/read.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "chatgpt",
    "name": "send",
    "description": "Send a prompt to ChatGPT web without waiting for the response",
    "access": "write",
    "domain": "chatgpt.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      }
    ],
    "columns": [
      "Status",
      "InjectedText"
    ],
    "type": "js",
    "modulePath": "chatgpt/send.js",
    "sourceFile": "chatgpt/send.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "chatgpt",
    "name": "status",
    "description": "Check ChatGPT web page availability and login state",
    "access": "read",
    "domain": "chatgpt.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Login",
      "Url"
    ],
    "type": "js",
    "modulePath": "chatgpt/status.js",
    "sourceFile": "chatgpt/status.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "chatgpt-app",
    "name": "ask",
    "description": "Send a prompt and wait for the AI response (send + wait + read)",
    "access": "write",
    "domain": "localhost",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "model",
        "type": "str",
        "required": false,
        "help": "Model/mode to use: auto, instant, thinking, 5.2-instant, 5.2-thinking",
        "choices": [
          "auto",
          "instant",
          "thinking",
          "5.2-instant",
          "5.2-thinking"
        ]
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max seconds to wait for response (default: 30)"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "chatgpt-app/ask.js",
    "sourceFile": "chatgpt-app/ask.js"
  },
  {
    "site": "chatgpt-app",
    "name": "model",
    "description": "Switch ChatGPT Desktop model/mode (auto, instant, thinking, 5.2-instant, 5.2-thinking)",
    "access": "read",
    "domain": "localhost",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "model",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Model to switch to",
        "choices": [
          "auto",
          "instant",
          "thinking",
          "5.2-instant",
          "5.2-thinking"
        ]
      }
    ],
    "columns": [
      "Status",
      "Model"
    ],
    "type": "js",
    "modulePath": "chatgpt-app/model.js",
    "sourceFile": "chatgpt-app/model.js"
  },
  {
    "site": "chatgpt-app",
    "name": "new",
    "description": "Open a new chat in ChatGPT Desktop App",
    "access": "read",
    "domain": "localhost",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "chatgpt-app/new.js",
    "sourceFile": "chatgpt-app/new.js"
  },
  {
    "site": "chatgpt-app",
    "name": "read",
    "description": "Read the last visible message from the focused ChatGPT Desktop window",
    "access": "read",
    "domain": "localhost",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "chatgpt-app/read.js",
    "sourceFile": "chatgpt-app/read.js"
  },
  {
    "site": "chatgpt-app",
    "name": "send",
    "description": "Send a message to the active ChatGPT Desktop App window",
    "access": "write",
    "domain": "localhost",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Message to send"
      },
      {
        "name": "model",
        "type": "str",
        "required": false,
        "help": "Model/mode to use: auto, instant, thinking, 5.2-instant, 5.2-thinking",
        "choices": [
          "auto",
          "instant",
          "thinking",
          "5.2-instant",
          "5.2-thinking"
        ]
      }
    ],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "chatgpt-app/send.js",
    "sourceFile": "chatgpt-app/send.js"
  },
  {
    "site": "chatgpt-app",
    "name": "status",
    "description": "Check if ChatGPT Desktop App is running natively on macOS",
    "access": "read",
    "domain": "localhost",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "chatgpt-app/status.js",
    "sourceFile": "chatgpt-app/status.js"
  },
  {
    "site": "chatwise",
    "name": "ask",
    "description": "Send a prompt and wait for the AI response (send + wait + read)",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max seconds to wait (default: 30)"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "chatwise/ask.js",
    "sourceFile": "chatwise/ask.js",
    "navigateBefore": true
  },
  {
    "site": "chatwise",
    "name": "export",
    "description": "Export the current ChatWise conversation to a Markdown file",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "output",
        "type": "str",
        "required": false,
        "help": "Output file (default: /tmp/chatwise-export.md)"
      }
    ],
    "columns": [
      "Status",
      "File",
      "Messages"
    ],
    "type": "js",
    "modulePath": "chatwise/export.js",
    "sourceFile": "chatwise/export.js",
    "navigateBefore": true
  },
  {
    "site": "chatwise",
    "name": "history",
    "description": "List conversation history in ChatWise sidebar",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Index",
      "Title"
    ],
    "type": "js",
    "modulePath": "chatwise/history.js",
    "sourceFile": "chatwise/history.js",
    "navigateBefore": true
  },
  {
    "site": "chatwise",
    "name": "model",
    "description": "Get or switch the active AI model in ChatWise",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "model-name",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Model to switch to (e.g. gpt-4, claude-3)"
      }
    ],
    "columns": [
      "Status",
      "Model"
    ],
    "type": "js",
    "modulePath": "chatwise/model.js",
    "sourceFile": "chatwise/model.js",
    "navigateBefore": true
  },
  {
    "site": "chatwise",
    "name": "new",
    "description": "Start a new ChatWise conversation session",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "chatwise/new.js",
    "sourceFile": "chatwise/new.js",
    "navigateBefore": true
  },
  {
    "site": "chatwise",
    "name": "read",
    "description": "Read the current ChatWise conversation history",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Content"
    ],
    "type": "js",
    "modulePath": "chatwise/read.js",
    "sourceFile": "chatwise/read.js",
    "navigateBefore": true
  },
  {
    "site": "chatwise",
    "name": "screenshot",
    "description": "Capture a snapshot of the current ChatWise window (DOM + Accessibility tree)",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "output",
        "type": "str",
        "required": false,
        "help": "Output file path (default: /tmp/chatwise-snapshot.txt)"
      }
    ],
    "columns": [
      "Status",
      "File"
    ],
    "type": "js",
    "modulePath": "chatwise/screenshot.js",
    "sourceFile": "chatwise/screenshot.js",
    "navigateBefore": true
  },
  {
    "site": "chatwise",
    "name": "send",
    "description": "Send a message to the active ChatWise conversation",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Message to send"
      }
    ],
    "columns": [
      "Status",
      "InjectedText"
    ],
    "type": "js",
    "modulePath": "chatwise/send.js",
    "sourceFile": "chatwise/send.js",
    "navigateBefore": true
  },
  {
    "site": "chatwise",
    "name": "status",
    "description": "Check active CDP connection to ChatWise Desktop",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Url",
      "Title"
    ],
    "type": "js",
    "modulePath": "chatwise/status.js",
    "sourceFile": "chatwise/status.js",
    "navigateBefore": true
  },
  {
    "site": "claude",
    "name": "ask",
    "description": "Send a prompt to Claude and get the response",
    "access": "write",
    "domain": "claude.ai",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds to wait for response"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      },
      {
        "name": "model",
        "type": "str",
        "default": "sonnet",
        "required": false,
        "help": "Model to use: sonnet, opus, or haiku",
        "choices": [
          "sonnet",
          "opus",
          "haiku"
        ]
      },
      {
        "name": "think",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Enable Adaptive thinking"
      },
      {
        "name": "file",
        "type": "str",
        "required": false,
        "help": "Attach a file (image, PDF, text) with the prompt"
      }
    ],
    "columns": [
      "response"
    ],
    "type": "js",
    "modulePath": "claude/ask.js",
    "sourceFile": "claude/ask.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "claude",
    "name": "detail",
    "description": "Open a Claude conversation by ID and read its messages",
    "access": "read",
    "domain": "claude.ai",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Conversation ID (UUID from /chat/<id>)"
      }
    ],
    "columns": [
      "Index",
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "claude/detail.js",
    "sourceFile": "claude/detail.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "claude",
    "name": "history",
    "description": "List conversation history from Claude /recents",
    "access": "read",
    "domain": "claude.ai",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max conversations to show"
      }
    ],
    "columns": [
      "Index",
      "Id",
      "Title",
      "Url"
    ],
    "type": "js",
    "modulePath": "claude/history.js",
    "sourceFile": "claude/history.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "claude",
    "name": "new",
    "description": "Start a new conversation in Claude",
    "access": "read",
    "domain": "claude.ai",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "claude/new.js",
    "sourceFile": "claude/new.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "claude",
    "name": "read",
    "description": "Read the current Claude conversation",
    "access": "read",
    "domain": "claude.ai",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Index",
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "claude/read.js",
    "sourceFile": "claude/read.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "claude",
    "name": "send",
    "description": "Send a prompt to Claude without waiting for the response",
    "access": "write",
    "domain": "claude.ai",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      }
    ],
    "columns": [
      "Status",
      "SubmittedBy",
      "InjectedText"
    ],
    "type": "js",
    "modulePath": "claude/send.js",
    "sourceFile": "claude/send.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "claude",
    "name": "status",
    "description": "Check Claude page availability and login state",
    "access": "read",
    "domain": "claude.ai",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Login",
      "Url"
    ],
    "type": "js",
    "modulePath": "claude/status.js",
    "sourceFile": "claude/status.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "cnki",
    "name": "search",
    "description": "中国知网论文搜索（海外版）",
    "access": "read",
    "domain": "oversea.cnki.net",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "authors",
      "journal",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "cnki/search.js",
    "sourceFile": "cnki/search.js",
    "navigateBefore": false
  },
  {
    "site": "codex",
    "name": "ask",
    "description": "Send a prompt to the current or selected Codex conversation and wait for the AI response",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 60,
        "required": false,
        "help": "Max seconds to wait for response (default: 60)"
      },
      {
        "name": "project",
        "type": "str",
        "required": false,
        "help": "Project label or path to select before running the command"
      },
      {
        "name": "conversation",
        "type": "str",
        "required": false,
        "help": "Conversation title to select within --project"
      },
      {
        "name": "index",
        "type": "str",
        "required": false,
        "help": "1-based conversation index within --project"
      },
      {
        "name": "thread-id",
        "type": "str",
        "required": false,
        "help": "Exact Codex thread id to select"
      }
    ],
    "columns": [
      "Role",
      "Project",
      "Conversation",
      "Text"
    ],
    "type": "js",
    "modulePath": "codex/ask.js",
    "sourceFile": "codex/ask.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "dump",
    "description": "Dump the DOM and Accessibility tree of codex for reverse-engineering",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "action",
      "files"
    ],
    "type": "js",
    "modulePath": "codex/dump.js",
    "sourceFile": "codex/dump.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "export",
    "description": "Export the current Codex conversation to a Markdown file",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "output",
        "type": "str",
        "required": false,
        "help": "Output file (default: /tmp/codex-export.md)"
      }
    ],
    "columns": [
      "Status",
      "File",
      "Messages"
    ],
    "type": "js",
    "modulePath": "codex/export.js",
    "sourceFile": "codex/export.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "extract-diff",
    "description": "Extract visual code review diff patches from Codex",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "File",
      "Diff"
    ],
    "type": "js",
    "modulePath": "codex/extract-diff.js",
    "sourceFile": "codex/extract-diff.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "history",
    "description": "List visible Codex conversation threads grouped by project",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "project",
        "type": "str",
        "required": false,
        "help": "Filter by project label or path"
      },
      {
        "name": "limit",
        "type": "str",
        "required": false,
        "help": "Max conversations per project"
      }
    ],
    "columns": [
      "Project",
      "Index",
      "Title",
      "Updated",
      "Active"
    ],
    "type": "js",
    "modulePath": "codex/history.js",
    "sourceFile": "codex/history.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "model",
    "description": "Get or switch the currently active AI model in Codex Desktop",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "model-name",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "The ID of the model to switch to (e.g. gpt-4)"
      }
    ],
    "columns": [
      "Status",
      "Model"
    ],
    "type": "js",
    "modulePath": "codex/model.js",
    "sourceFile": "codex/model.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "new",
    "description": "Start a new Codex conversation session",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "codex/new.js",
    "sourceFile": "codex/new.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "projects",
    "description": "List Codex projects and visible conversations from the sidebar",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "project",
        "type": "str",
        "required": false,
        "help": "Filter by project label or path"
      },
      {
        "name": "limit",
        "type": "str",
        "required": false,
        "help": "Max conversations per project"
      }
    ],
    "columns": [
      "Project",
      "Index",
      "Title",
      "Updated",
      "Active"
    ],
    "type": "js",
    "modulePath": "codex/projects.js",
    "sourceFile": "codex/projects.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "read",
    "description": "Read the contents of the current or selected Codex conversation thread",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "project",
        "type": "str",
        "required": false,
        "help": "Project label or path to select before running the command"
      },
      {
        "name": "conversation",
        "type": "str",
        "required": false,
        "help": "Conversation title to select within --project"
      },
      {
        "name": "index",
        "type": "str",
        "required": false,
        "help": "1-based conversation index within --project"
      },
      {
        "name": "thread-id",
        "type": "str",
        "required": false,
        "help": "Exact Codex thread id to select"
      }
    ],
    "columns": [
      "Project",
      "Conversation",
      "Content"
    ],
    "type": "js",
    "modulePath": "codex/read.js",
    "sourceFile": "codex/read.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "screenshot",
    "description": "Capture a snapshot of the current Codex window (DOM + Accessibility tree)",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "output",
        "type": "str",
        "required": false,
        "help": "Output file path (default: /tmp/codex-snapshot.txt)"
      }
    ],
    "columns": [
      "Status",
      "File"
    ],
    "type": "js",
    "modulePath": "codex/screenshot.js",
    "sourceFile": "codex/screenshot.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "send",
    "description": "Send text/commands to the current or selected Codex AI composer",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Text, command (e.g. /review), or skill (e.g. $imagegen)"
      },
      {
        "name": "project",
        "type": "str",
        "required": false,
        "help": "Project label or path to select before running the command"
      },
      {
        "name": "conversation",
        "type": "str",
        "required": false,
        "help": "Conversation title to select within --project"
      },
      {
        "name": "index",
        "type": "str",
        "required": false,
        "help": "1-based conversation index within --project"
      },
      {
        "name": "thread-id",
        "type": "str",
        "required": false,
        "help": "Exact Codex thread id to select"
      }
    ],
    "columns": [
      "Status",
      "Project",
      "Conversation",
      "InjectedText"
    ],
    "type": "js",
    "modulePath": "codex/send.js",
    "sourceFile": "codex/send.js",
    "navigateBefore": true
  },
  {
    "site": "codex",
    "name": "status",
    "description": "Check active CDP connection to OpenAI Codex App",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Url",
      "Title"
    ],
    "type": "js",
    "modulePath": "codex/status.js",
    "sourceFile": "codex/status.js",
    "navigateBefore": true
  },
  {
    "site": "coingecko",
    "name": "categories",
    "description": "Crypto categories ranked by aggregated market cap",
    "access": "read",
    "domain": "api.coingecko.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "sort",
        "type": "str",
        "default": "market_cap_desc",
        "required": false,
        "help": "Sort order (market_cap_desc / market_cap_asc / name_desc / name_asc / market_cap_change_24h_desc / market_cap_change_24h_asc)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of categories (1-100; CoinGecko returns ~120 max)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "name",
      "marketCap",
      "volume24h",
      "marketCapChange24hPct",
      "top3Coins"
    ],
    "type": "js",
    "modulePath": "coingecko/categories.js",
    "sourceFile": "coingecko/categories.js"
  },
  {
    "site": "coingecko",
    "name": "coin",
    "description": "Fetch a single cryptocurrency's market data by CoinGecko id (e.g. bitcoin, ethereum).",
    "access": "read",
    "domain": "api.coingecko.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "CoinGecko coin id (lowercase, e.g. bitcoin / ethereum / solana)."
      },
      {
        "name": "currency",
        "type": "string",
        "default": "usd",
        "required": false,
        "help": "Quote currency (usd, cny, eur, jpy, ...)."
      }
    ],
    "columns": [
      "id",
      "symbol",
      "name",
      "rank",
      "price",
      "marketCap",
      "volume24h",
      "change24hPct",
      "change7dPct",
      "change30dPct",
      "ath",
      "athDate",
      "atl",
      "atlDate",
      "circulatingSupply",
      "totalSupply",
      "maxSupply",
      "genesisDate",
      "homepage"
    ],
    "type": "js",
    "modulePath": "coingecko/coin.js",
    "sourceFile": "coingecko/coin.js"
  },
  {
    "site": "coingecko",
    "name": "derivatives",
    "description": "Top crypto derivative (perpetual / futures) markets by 24h volume",
    "access": "read",
    "domain": "api.coingecko.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max rows to return (1-500; CoinGecko returns one large page)."
      },
      {
        "name": "symbol",
        "type": "string",
        "required": false,
        "help": "Optional symbol substring filter (e.g. \"BTC\", \"ETHUSDT\")."
      }
    ],
    "columns": [
      "rank",
      "market",
      "symbol",
      "indexId",
      "contractType",
      "price",
      "change24hPct",
      "fundingRate",
      "openInterestUsd",
      "volume24hUsd",
      "expired"
    ],
    "type": "js",
    "modulePath": "coingecko/derivatives.js",
    "sourceFile": "coingecko/derivatives.js"
  },
  {
    "site": "coingecko",
    "name": "exchanges",
    "description": "Top crypto exchanges by 24h BTC trading volume",
    "access": "read",
    "domain": "api.coingecko.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of exchanges (1-250, CoinGecko per_page upper bound)"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number (1-based)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "name",
      "trustScore",
      "volume24hBtc",
      "country",
      "yearEstablished",
      "url"
    ],
    "type": "js",
    "modulePath": "coingecko/exchanges.js",
    "sourceFile": "coingecko/exchanges.js"
  },
  {
    "site": "coingecko",
    "name": "global",
    "description": "Aggregate crypto market stats: total market cap, volume, dominance",
    "access": "read",
    "domain": "api.coingecko.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "currency",
        "type": "string",
        "default": "usd",
        "required": false,
        "help": "Quote currency for total market cap / volume (usd, cny, eur, jpy, ...)"
      }
    ],
    "columns": [
      "currency",
      "totalMarketCap",
      "totalVolume24h",
      "marketCapChange24hPct",
      "btcDominancePct",
      "ethDominancePct",
      "activeCryptocurrencies",
      "markets",
      "ongoingIcos",
      "updatedAt"
    ],
    "type": "js",
    "modulePath": "coingecko/global.js",
    "sourceFile": "coingecko/global.js"
  },
  {
    "site": "coingecko",
    "name": "top",
    "description": "按市值排序的加密货币行情（默认 USD）",
    "access": "read",
    "domain": "api.coingecko.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "currency",
        "type": "string",
        "default": "usd",
        "required": false,
        "help": "计价币种 (usd / cny / eur / jpy ...)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回数量（默认 10，最多 250）"
      }
    ],
    "columns": [
      "rank",
      "symbol",
      "name",
      "price",
      "change24hPct",
      "marketCap",
      "volume24h",
      "high24h",
      "low24h"
    ],
    "type": "js",
    "modulePath": "coingecko/top.js",
    "sourceFile": "coingecko/top.js"
  },
  {
    "site": "coingecko",
    "name": "trending",
    "description": "Top trending cryptocurrencies on CoinGecko in the last 24h (search-volume based).",
    "access": "read",
    "domain": "api.coingecko.com",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "rank",
      "id",
      "symbol",
      "name",
      "marketCapRank",
      "priceBtc",
      "thumb"
    ],
    "type": "js",
    "modulePath": "coingecko/trending.js",
    "sourceFile": "coingecko/trending.js"
  },
  {
    "site": "coupang",
    "name": "add-to-cart",
    "description": "Add a Coupang product to cart using logged-in browser session",
    "access": "write",
    "domain": "www.coupang.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "product-id",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Coupang product ID"
      },
      {
        "name": "url",
        "type": "str",
        "required": false,
        "help": "Canonical product URL"
      }
    ],
    "columns": [
      "ok",
      "product_id",
      "url",
      "message"
    ],
    "type": "js",
    "modulePath": "coupang/add-to-cart.js",
    "sourceFile": "coupang/add-to-cart.js",
    "navigateBefore": "https://www.coupang.com"
  },
  {
    "site": "coupang",
    "name": "product",
    "description": "Read full product detail (price, rating, seller, delivery) for a Coupang product",
    "access": "read",
    "domain": "www.coupang.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "product-id",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Coupang product ID (digits only)"
      },
      {
        "name": "url",
        "type": "str",
        "required": false,
        "help": "Canonical Coupang product URL (alternative to --product-id)"
      }
    ],
    "columns": [
      "product_id",
      "title",
      "price",
      "original_price",
      "discount_rate",
      "rating",
      "review_count",
      "seller",
      "brand",
      "rocket",
      "delivery_promise",
      "image_url",
      "url"
    ],
    "type": "js",
    "modulePath": "coupang/product.js",
    "sourceFile": "coupang/product.js",
    "navigateBefore": "https://www.coupang.com"
  },
  {
    "site": "coupang",
    "name": "search",
    "description": "Search Coupang products with logged-in browser session",
    "access": "read",
    "domain": "www.coupang.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Search result page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (max 50)"
      },
      {
        "name": "filter",
        "type": "str",
        "required": false,
        "help": "Optional search filter (currently supports: rocket)"
      }
    ],
    "columns": [
      "rank",
      "product_id",
      "title",
      "price",
      "unit_price",
      "rating",
      "review_count",
      "rocket",
      "delivery_type",
      "delivery_promise",
      "url"
    ],
    "type": "js",
    "modulePath": "coupang/search.js",
    "sourceFile": "coupang/search.js",
    "navigateBefore": "https://www.coupang.com"
  },
  {
    "site": "crates",
    "name": "crate",
    "description": "Single crates.io crate metadata (latest version, downloads, license, repo)",
    "access": "read",
    "domain": "crates.io",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "crates.io crate name (e.g. \"serde\", \"tokio\")"
      }
    ],
    "columns": [
      "name",
      "latestVersion",
      "description",
      "downloads",
      "recentDownloads",
      "versions",
      "license",
      "homepage",
      "documentation",
      "repository",
      "keywords",
      "categories",
      "created",
      "updated",
      "url"
    ],
    "type": "js",
    "modulePath": "crates/crate.js",
    "sourceFile": "crates/crate.js"
  },
  {
    "site": "crates",
    "name": "search",
    "description": "Search the public crates.io registry by keyword",
    "access": "read",
    "domain": "crates.io",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"serde\", \"async runtime\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (1-100)"
      }
    ],
    "columns": [
      "rank",
      "name",
      "latestVersion",
      "description",
      "downloads",
      "recentDownloads",
      "repository",
      "updated",
      "url"
    ],
    "type": "js",
    "modulePath": "crates/search.js",
    "sourceFile": "crates/search.js"
  },
  {
    "site": "ctrip",
    "name": "flight",
    "description": "搜索携程一程机票（按出发/到达 IATA 三字码 + 日期）",
    "access": "read",
    "domain": "flights.ctrip.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "from",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Departure IATA code (e.g. BJS / PEK)"
      },
      {
        "name": "to",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Arrival IATA code (e.g. SHA / PVG)"
      },
      {
        "name": "date",
        "type": "str",
        "required": true,
        "help": "Departure date (YYYY-MM-DD)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of flights (1-50)"
      }
    ],
    "columns": [
      "rank",
      "airline",
      "flightNo",
      "aircraft",
      "departureTime",
      "departureAirport",
      "arrivalTime",
      "arrivalAirport",
      "terminal",
      "price",
      "currency",
      "cabin",
      "url"
    ],
    "type": "js",
    "modulePath": "ctrip/flight.js",
    "sourceFile": "ctrip/flight.js",
    "navigateBefore": false
  },
  {
    "site": "ctrip",
    "name": "hotel-search",
    "description": "搜索携程酒店列表（按城市 + 入住/离店日期）",
    "access": "read",
    "domain": "hotels.ctrip.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "city",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Numeric Ctrip city ID (use `ctrip search` or `ctrip hotel-suggest` to discover)"
      },
      {
        "name": "checkin",
        "type": "str",
        "required": true,
        "help": "Check-in date (YYYY-MM-DD)"
      },
      {
        "name": "checkout",
        "type": "str",
        "required": true,
        "help": "Check-out date (YYYY-MM-DD)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of hotels (1-30); SSR first page returns ~13 entries"
      }
    ],
    "columns": [
      "rank",
      "hotelId",
      "name",
      "enName",
      "star",
      "score",
      "scoreLabel",
      "reviewCount",
      "cityName",
      "district",
      "address",
      "lat",
      "lon",
      "price",
      "currency",
      "url"
    ],
    "type": "js",
    "modulePath": "ctrip/hotel-search.js",
    "sourceFile": "ctrip/hotel-search.js",
    "navigateBefore": false
  },
  {
    "site": "ctrip",
    "name": "hotel-suggest",
    "description": "搜索携程酒店上下文联想：城市、商圈、单酒店匹配",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (city, business area, or hotel name)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of results (1-50)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "type",
      "displayType",
      "name",
      "eName",
      "cityId",
      "cityName",
      "provinceName",
      "countryName",
      "lat",
      "lon",
      "score",
      "url"
    ],
    "type": "js",
    "modulePath": "ctrip/hotel-suggest.js",
    "sourceFile": "ctrip/hotel-suggest.js"
  },
  {
    "site": "ctrip",
    "name": "search",
    "description": "搜索携程目的地、景区、火车站和地标联想结果",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (city, scenic spot, landmark)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of results (1-50)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "type",
      "displayType",
      "name",
      "eName",
      "cityId",
      "cityName",
      "provinceName",
      "countryName",
      "lat",
      "lon",
      "score",
      "url"
    ],
    "type": "js",
    "modulePath": "ctrip/search.js",
    "sourceFile": "ctrip/search.js"
  },
  {
    "site": "cursor",
    "name": "ask",
    "description": "Send a prompt and wait for the AI response (send + wait + read)",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max seconds to wait for response (default: 30)"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "cursor/ask.js",
    "sourceFile": "cursor/ask.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "composer",
    "description": "Send a prompt directly into Cursor Composer (Cmd+I shortcut)",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Text to send into Composer"
      }
    ],
    "columns": [
      "Status",
      "InjectedText"
    ],
    "type": "js",
    "modulePath": "cursor/composer.js",
    "sourceFile": "cursor/composer.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "dump",
    "description": "Dump the DOM and Accessibility tree of cursor for reverse-engineering",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "action",
      "files"
    ],
    "type": "js",
    "modulePath": "cursor/dump.js",
    "sourceFile": "cursor/dump.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "export",
    "description": "Export the current cursor conversation to a Markdown file",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "output",
        "type": "str",
        "required": false,
        "help": "Output file (default: /tmp/cursor-export.md)"
      }
    ],
    "columns": [
      "Status",
      "File",
      "Messages"
    ],
    "type": "js",
    "modulePath": "cursor/export.js",
    "sourceFile": "cursor/export.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "extract-code",
    "description": "Extract multi-line code blocks from the current Cursor conversation",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Code"
    ],
    "type": "js",
    "modulePath": "cursor/extract-code.js",
    "sourceFile": "cursor/extract-code.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "history",
    "description": "List recent chat sessions from the Cursor sidebar",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Index",
      "Title"
    ],
    "type": "js",
    "modulePath": "cursor/history.js",
    "sourceFile": "cursor/history.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "model",
    "description": "Get or switch the currently active AI model in Cursor",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "model-name",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "The ID of the model to switch to (e.g. claude-3.5-sonnet)"
      }
    ],
    "columns": [
      "Status",
      "Model"
    ],
    "type": "js",
    "modulePath": "cursor/model.js",
    "sourceFile": "cursor/model.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "new",
    "description": "Start a new Cursor chat or Composer session",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "cursor/new.js",
    "sourceFile": "cursor/new.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "read",
    "description": "Read the current Cursor chat/composer conversation history",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "cursor/read.js",
    "sourceFile": "cursor/read.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "screenshot",
    "description": "Capture a snapshot of the current cursor window (DOM + Accessibility tree)",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "output",
        "type": "str",
        "required": false,
        "help": "Output file path (default: /tmp/cursor-snapshot.txt)"
      }
    ],
    "columns": [
      "Status",
      "File"
    ],
    "type": "js",
    "modulePath": "cursor/screenshot.js",
    "sourceFile": "cursor/screenshot.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "send",
    "description": "Send a prompt directly into Cursor Composer/Chat",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Text to send into Cursor"
      }
    ],
    "columns": [
      "Status",
      "InjectedText"
    ],
    "type": "js",
    "modulePath": "cursor/send.js",
    "sourceFile": "cursor/send.js",
    "navigateBefore": true
  },
  {
    "site": "cursor",
    "name": "status",
    "description": "Check active CDP connection to Cursor AI Editor",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Url",
      "Title"
    ],
    "type": "js",
    "modulePath": "cursor/status.js",
    "sourceFile": "cursor/status.js",
    "navigateBefore": true
  },
  {
    "site": "dblp",
    "name": "author",
    "description": "List dblp publications by a given author (newest first; resolves to top PID match)",
    "access": "read",
    "domain": "dblp.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "author",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Author name (e.g. \"Yoshua Bengio\"). Optional when --pid is given."
      },
      {
        "name": "pid",
        "type": "str",
        "required": false,
        "help": "Canonical dblp PID (e.g. \"56/953\"). Bypasses author search."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max publications (1-200)"
      }
    ],
    "columns": [
      "rank",
      "key",
      "title",
      "authors",
      "venue",
      "year",
      "type",
      "doi",
      "pid",
      "url"
    ],
    "type": "js",
    "modulePath": "dblp/author.js",
    "sourceFile": "dblp/author.js"
  },
  {
    "site": "dblp",
    "name": "paper",
    "aliases": [
      "detail",
      "view"
    ],
    "description": "Fetch a dblp record by canonical key (e.g. conf/nips/VaswaniSPUJGKP17)",
    "access": "read",
    "domain": "dblp.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "key",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "dblp record key (round-tripped from the `key` column of `dblp search`)"
      }
    ],
    "columns": [
      "key",
      "type",
      "title",
      "authors",
      "venue",
      "year",
      "pages",
      "doi",
      "open_access_url",
      "dblp_url"
    ],
    "type": "js",
    "modulePath": "dblp/paper.js",
    "sourceFile": "dblp/paper.js"
  },
  {
    "site": "dblp",
    "name": "search",
    "description": "Search dblp computer-science bibliography by free-text query",
    "access": "read",
    "domain": "dblp.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (title / author / venue, e.g. \"attention is all you need\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (1-100, single dblp page)"
      }
    ],
    "columns": [
      "rank",
      "key",
      "title",
      "authors",
      "venue",
      "year",
      "type",
      "doi",
      "url"
    ],
    "type": "js",
    "modulePath": "dblp/search.js",
    "sourceFile": "dblp/search.js"
  },
  {
    "site": "dblp",
    "name": "venue",
    "description": "Search dblp venue registry (conferences / journals) by name or acronym",
    "access": "read",
    "domain": "dblp.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Venue name or acronym (e.g. \"ICLR\", \"neural networks\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max venues (1-100, single dblp page)"
      }
    ],
    "columns": [
      "rank",
      "acronym",
      "venue",
      "type",
      "url"
    ],
    "type": "js",
    "modulePath": "dblp/venue.js",
    "sourceFile": "dblp/venue.js"
  },
  {
    "site": "deepseek",
    "name": "ask",
    "description": "Send a prompt to DeepSeek and get the response",
    "access": "write",
    "domain": "chat.deepseek.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds to wait for response"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      },
      {
        "name": "model",
        "type": "str",
        "default": "instant",
        "required": false,
        "help": "Model to use: instant, expert, or vision",
        "choices": [
          "instant",
          "expert",
          "vision"
        ]
      },
      {
        "name": "think",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Enable DeepThink mode"
      },
      {
        "name": "search",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Enable web search"
      },
      {
        "name": "file",
        "type": "str",
        "required": false,
        "help": "Attach a file (PDF, image, text) with the prompt"
      }
    ],
    "type": "js",
    "modulePath": "deepseek/ask.js",
    "sourceFile": "deepseek/ask.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "deepseek",
    "name": "detail",
    "description": "Read a specific DeepSeek conversation by ID",
    "access": "read",
    "domain": "chat.deepseek.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Conversation ID (UUID) or full /a/chat/s/<id> URL"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "deepseek/detail.js",
    "sourceFile": "deepseek/detail.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "deepseek",
    "name": "history",
    "description": "List conversation history from DeepSeek sidebar",
    "access": "read",
    "domain": "chat.deepseek.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max conversations to show"
      }
    ],
    "columns": [
      "Index",
      "Title",
      "Url"
    ],
    "type": "js",
    "modulePath": "deepseek/history.js",
    "sourceFile": "deepseek/history.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "deepseek",
    "name": "new",
    "description": "Start a new conversation in DeepSeek",
    "access": "read",
    "domain": "chat.deepseek.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "deepseek/new.js",
    "sourceFile": "deepseek/new.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "deepseek",
    "name": "read",
    "description": "Read the current DeepSeek conversation",
    "access": "read",
    "domain": "chat.deepseek.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "deepseek/read.js",
    "sourceFile": "deepseek/read.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "deepseek",
    "name": "send",
    "description": "Send a prompt to a specific DeepSeek conversation by ID, without waiting for a response",
    "access": "write",
    "domain": "chat.deepseek.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Conversation ID (UUID) or full /a/chat/s/<id> URL"
      },
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 60,
        "required": false,
        "help": "Max seconds for the overall command (default: 60)"
      }
    ],
    "columns": [
      "Status",
      "InjectedText"
    ],
    "type": "js",
    "modulePath": "deepseek/send.js",
    "sourceFile": "deepseek/send.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "deepseek",
    "name": "status",
    "description": "Check DeepSeek page availability and login state",
    "access": "read",
    "domain": "chat.deepseek.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Login",
      "Url"
    ],
    "type": "js",
    "modulePath": "deepseek/status.js",
    "sourceFile": "deepseek/status.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "defillama",
    "name": "protocol",
    "description": "Single DefiLlama protocol details (current TVL, mcap, chains, twitter, github, description)",
    "access": "read",
    "domain": "defillama.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "slug",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "DefiLlama protocol slug (e.g. \"aave\", \"lido\")"
      }
    ],
    "columns": [
      "slug",
      "name",
      "category",
      "isParent",
      "tvl",
      "tvlAt",
      "mcap",
      "chains",
      "twitter",
      "github",
      "audits",
      "listedAt",
      "description",
      "website",
      "url"
    ],
    "type": "js",
    "modulePath": "defillama/protocol.js",
    "sourceFile": "defillama/protocol.js"
  },
  {
    "site": "defillama",
    "name": "protocols",
    "description": "Top DeFi protocols on DefiLlama by current TVL (slug, name, category, TVL, mcap, change_1d/7d, chains)",
    "access": "read",
    "domain": "defillama.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Number of rows to return (1-500)"
      }
    ],
    "columns": [
      "rank",
      "slug",
      "name",
      "category",
      "tvl",
      "mcap",
      "change_1d",
      "change_7d",
      "chains",
      "listedAt",
      "url"
    ],
    "type": "js",
    "modulePath": "defillama/protocols.js",
    "sourceFile": "defillama/protocols.js"
  },
  {
    "site": "devto",
    "name": "latest",
    "description": "Newest dev.to articles (firehose, all tags)",
    "access": "read",
    "domain": "dev.to",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Articles per page (1-100)"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number (1-based)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "author",
      "tags",
      "reactions",
      "comments",
      "published",
      "url"
    ],
    "type": "js",
    "modulePath": "devto/latest.js",
    "sourceFile": "devto/latest.js"
  },
  {
    "site": "devto",
    "name": "read",
    "description": "Read a DEV.to article body by id",
    "access": "read",
    "domain": "dev.to",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "DEV.to article id (numeric, e.g. 3605688)"
      },
      {
        "name": "max-length",
        "type": "int",
        "default": 20000,
        "required": false,
        "help": "Max characters of body to return (min 100)"
      }
    ],
    "columns": [
      "id",
      "title",
      "author",
      "reactions",
      "reading_time",
      "tags",
      "published_at",
      "body",
      "url"
    ],
    "type": "js",
    "modulePath": "devto/read.js",
    "sourceFile": "devto/read.js"
  },
  {
    "site": "devto",
    "name": "tag",
    "description": "Latest DEV.to articles for a specific tag",
    "access": "read",
    "domain": "dev.to",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "tag",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Tag name (e.g. javascript, python, webdev)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of articles"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "author",
      "reactions",
      "comments",
      "reading_time",
      "published_at",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "devto/tag.js",
    "sourceFile": "devto/tag.js"
  },
  {
    "site": "devto",
    "name": "top",
    "description": "Top DEV.to articles of the day",
    "access": "read",
    "domain": "dev.to",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of articles"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "author",
      "reactions",
      "comments",
      "reading_time",
      "published_at",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "devto/top.js",
    "sourceFile": "devto/top.js"
  },
  {
    "site": "devto",
    "name": "user",
    "description": "Recent DEV.to articles from a specific user",
    "access": "read",
    "domain": "dev.to",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "DEV.to username (e.g. ben, thepracticaldev)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of articles"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "reactions",
      "comments",
      "reading_time",
      "published_at",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "devto/user.js",
    "sourceFile": "devto/user.js"
  },
  {
    "site": "dianping",
    "name": "search",
    "description": "大众点评店铺搜索（按关键词 + 城市）",
    "access": "read",
    "domain": "www.dianping.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词，例如 \"火锅\""
      },
      {
        "name": "city",
        "type": "str",
        "required": false,
        "help": "城市名（北京/上海/汕头/beijing/shantou/...）或 cityId 数字。未在静态表中的城市会通过 dianping.com 在线解析。不传则使用 cookie 默认城市"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "返回的店铺数量（最多 15，dianping 单页固定 15 条）"
      }
    ],
    "columns": [
      "rank",
      "shop_id",
      "name",
      "rating",
      "reviews",
      "price",
      "cuisine",
      "district",
      "url"
    ],
    "type": "js",
    "modulePath": "dianping/search.js",
    "sourceFile": "dianping/search.js",
    "navigateBefore": "https://www.dianping.com"
  },
  {
    "site": "dianping",
    "name": "shop",
    "aliases": [
      "detail"
    ],
    "description": "大众点评店铺详情（按 shop_id）",
    "access": "read",
    "domain": "www.dianping.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "shop_id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "店铺 ID（来自 search 的 shop_id 列，或 https://www.dianping.com/shop/<id> URL 段）"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "dianping/shop.js",
    "sourceFile": "dianping/shop.js",
    "navigateBefore": "https://www.dianping.com"
  },
  {
    "site": "dictionary",
    "name": "examples",
    "description": "Read real-world example sentences utilizing the word",
    "access": "read",
    "domain": "api.dictionaryapi.dev",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "word",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Word to get example sentences for"
      }
    ],
    "columns": [
      "word",
      "example"
    ],
    "type": "js",
    "modulePath": "dictionary/examples.js",
    "sourceFile": "dictionary/examples.js"
  },
  {
    "site": "dictionary",
    "name": "search",
    "description": "Search the Free Dictionary API for definitions, parts of speech, and pronunciations.",
    "access": "read",
    "domain": "api.dictionaryapi.dev",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "word",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Word to define (e.g., serendipity)"
      }
    ],
    "columns": [
      "word",
      "phonetic",
      "type",
      "definition"
    ],
    "type": "js",
    "modulePath": "dictionary/search.js",
    "sourceFile": "dictionary/search.js"
  },
  {
    "site": "dictionary",
    "name": "synonyms",
    "description": "Find synonyms for a specific word",
    "access": "read",
    "domain": "api.dictionaryapi.dev",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "word",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Word to find synonyms for (e.g., serendipity)"
      }
    ],
    "columns": [
      "word",
      "synonyms"
    ],
    "type": "js",
    "modulePath": "dictionary/synonyms.js",
    "sourceFile": "dictionary/synonyms.js"
  },
  {
    "site": "discord-app",
    "name": "channels",
    "description": "List channels in the current Discord server",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Index",
      "Channel",
      "Type"
    ],
    "type": "js",
    "modulePath": "discord-app/channels.js",
    "sourceFile": "discord-app/channels.js",
    "navigateBefore": true
  },
  {
    "site": "discord-app",
    "name": "delete",
    "description": "Delete a message by its ID in the active Discord channel",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "message_id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The ID of the message to delete (visible via Developer Mode or the read command)"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "discord-app/delete.js",
    "sourceFile": "discord-app/delete.js",
    "navigateBefore": true
  },
  {
    "site": "discord-app",
    "name": "members",
    "description": "List online members in the current Discord channel",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Index",
      "Name",
      "Status"
    ],
    "type": "js",
    "modulePath": "discord-app/members.js",
    "sourceFile": "discord-app/members.js",
    "navigateBefore": true
  },
  {
    "site": "discord-app",
    "name": "read",
    "description": "Read recent messages from the active Discord channel",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "count",
        "type": "str",
        "default": "20",
        "required": false,
        "help": "Number of messages to read (default: 20)"
      }
    ],
    "columns": [
      "Author",
      "Time",
      "Message"
    ],
    "type": "js",
    "modulePath": "discord-app/read.js",
    "sourceFile": "discord-app/read.js",
    "navigateBefore": true
  },
  {
    "site": "discord-app",
    "name": "search",
    "description": "Search messages in the current Discord server/channel (Cmd+F)",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      }
    ],
    "columns": [
      "Index",
      "Author",
      "Message"
    ],
    "type": "js",
    "modulePath": "discord-app/search.js",
    "sourceFile": "discord-app/search.js",
    "navigateBefore": true
  },
  {
    "site": "discord-app",
    "name": "send",
    "description": "Send a message in the active Discord channel",
    "access": "write",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Message to send"
      }
    ],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "discord-app/send.js",
    "sourceFile": "discord-app/send.js",
    "navigateBefore": true
  },
  {
    "site": "discord-app",
    "name": "servers",
    "description": "List all Discord servers (guilds) in the sidebar",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Index",
      "Server"
    ],
    "type": "js",
    "modulePath": "discord-app/servers.js",
    "sourceFile": "discord-app/servers.js",
    "navigateBefore": true
  },
  {
    "site": "discord-app",
    "name": "status",
    "description": "Check active CDP connection to Discord Desktop",
    "access": "read",
    "domain": "localhost",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Url",
      "Title"
    ],
    "type": "js",
    "modulePath": "discord-app/status.js",
    "sourceFile": "discord-app/status.js",
    "navigateBefore": true
  },
  {
    "site": "dockerhub",
    "name": "image",
    "description": "Fetch a Docker Hub repository's public metadata (stars, pulls, last updated, status)",
    "access": "read",
    "domain": "hub.docker.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "image",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image name (e.g. \"nginx\", \"library/nginx\", \"bitnami/redis\")"
      }
    ],
    "columns": [
      "image",
      "official",
      "stars",
      "pulls",
      "description",
      "lastUpdated",
      "lastModified",
      "registered",
      "status",
      "url"
    ],
    "type": "js",
    "modulePath": "dockerhub/image.js",
    "sourceFile": "dockerhub/image.js"
  },
  {
    "site": "dockerhub",
    "name": "search",
    "description": "Search Docker Hub repositories by keyword",
    "access": "read",
    "domain": "hub.docker.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"nginx\", \"bitnami redis\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Max repositories (1-100, single Docker Hub page)"
      }
    ],
    "columns": [
      "rank",
      "image",
      "official",
      "stars",
      "pulls",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "dockerhub/search.js",
    "sourceFile": "dockerhub/search.js"
  },
  {
    "site": "douban",
    "name": "book-hot",
    "description": "豆瓣图书热门榜单",
    "access": "read",
    "domain": "book.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的图书数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "rating",
      "quote",
      "author",
      "publisher",
      "year",
      "url"
    ],
    "type": "js",
    "modulePath": "douban/book-hot.js",
    "sourceFile": "douban/book-hot.js",
    "navigateBefore": "https://book.douban.com"
  },
  {
    "site": "douban",
    "name": "download",
    "description": "下载电影海报/剧照图片",
    "access": "read",
    "domain": "movie.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "电影 subject ID"
      },
      {
        "name": "type",
        "type": "str",
        "default": "Rb",
        "required": false,
        "help": "豆瓣 photos 的 type 参数，默认 Rb（海报）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "最多下载多少张图片"
      },
      {
        "name": "photo-id",
        "type": "str",
        "required": false,
        "help": "只下载指定 photo_id 的图片"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./douban-downloads",
        "required": false,
        "help": "输出目录"
      }
    ],
    "columns": [
      "index",
      "title",
      "status",
      "size"
    ],
    "type": "js",
    "modulePath": "douban/download.js",
    "sourceFile": "douban/download.js",
    "navigateBefore": "https://movie.douban.com"
  },
  {
    "site": "douban",
    "name": "marks",
    "description": "导出个人观影标记",
    "access": "read",
    "domain": "movie.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "status",
        "type": "str",
        "default": "collect",
        "required": false,
        "help": "标记类型: collect(看过), wish(想看), do(在看), all(全部)",
        "choices": [
          "collect",
          "wish",
          "do",
          "all"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "导出数量， 0 表示全部"
      },
      {
        "name": "uid",
        "type": "str",
        "required": false,
        "help": "用户ID，不填则使用当前登录账号"
      }
    ],
    "columns": [
      "title",
      "year",
      "myRating",
      "myStatus",
      "myDate",
      "myComment",
      "url"
    ],
    "type": "js",
    "modulePath": "douban/marks.js",
    "sourceFile": "douban/marks.js",
    "navigateBefore": "https://movie.douban.com"
  },
  {
    "site": "douban",
    "name": "movie-hot",
    "description": "豆瓣电影热门榜单",
    "access": "read",
    "domain": "movie.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的电影数量"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "rating",
      "votes",
      "year",
      "url"
    ],
    "type": "js",
    "modulePath": "douban/movie-hot.js",
    "sourceFile": "douban/movie-hot.js",
    "navigateBefore": "https://movie.douban.com"
  },
  {
    "site": "douban",
    "name": "photos",
    "description": "获取电影海报/剧照图片列表",
    "access": "read",
    "domain": "movie.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "电影 subject ID"
      },
      {
        "name": "type",
        "type": "str",
        "default": "Rb",
        "required": false,
        "help": "豆瓣 photos 的 type 参数，默认 Rb（海报）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "最多返回多少张图片"
      }
    ],
    "columns": [
      "index",
      "photo_id",
      "subject_id",
      "title",
      "image_url",
      "detail_url"
    ],
    "type": "js",
    "modulePath": "douban/photos.js",
    "sourceFile": "douban/photos.js",
    "navigateBefore": "https://movie.douban.com"
  },
  {
    "site": "douban",
    "name": "reviews",
    "description": "导出个人影评",
    "access": "read",
    "domain": "movie.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "导出数量"
      },
      {
        "name": "uid",
        "type": "str",
        "required": false,
        "help": "用户ID，不填则使用当前登录账号"
      },
      {
        "name": "full",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "获取完整影评内容"
      }
    ],
    "columns": [
      "movieTitle",
      "title",
      "myRating",
      "votes",
      "content",
      "url"
    ],
    "type": "js",
    "modulePath": "douban/reviews.js",
    "sourceFile": "douban/reviews.js",
    "navigateBefore": "https://movie.douban.com"
  },
  {
    "site": "douban",
    "name": "search",
    "description": "搜索豆瓣电影、图书或音乐",
    "access": "read",
    "domain": "search.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "type",
        "type": "str",
        "default": "movie",
        "required": false,
        "help": "搜索类型（movie=电影, book=图书, music=音乐）",
        "choices": [
          "movie",
          "book",
          "music"
        ]
      },
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回结果数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "rating",
      "abstract",
      "url"
    ],
    "type": "js",
    "modulePath": "douban/search.js",
    "sourceFile": "douban/search.js",
    "navigateBefore": false
  },
  {
    "site": "douban",
    "name": "subject",
    "description": "获取豆瓣条目详情",
    "access": "read",
    "domain": "movie.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "豆瓣条目 ID"
      },
      {
        "name": "type",
        "type": "str",
        "default": "movie",
        "required": false,
        "help": "条目类型（movie=电影, book=图书）",
        "choices": [
          "movie",
          "book"
        ]
      }
    ],
    "columns": [
      "id",
      "type",
      "title",
      "subtitle",
      "originalTitle",
      "authors",
      "translators",
      "publisher",
      "publishDate",
      "publishYear",
      "pageCount",
      "binding",
      "price",
      "series",
      "isbn10",
      "isbn13",
      "year",
      "rating",
      "ratingCount",
      "genres",
      "directors",
      "casts",
      "country",
      "duration",
      "summary",
      "url"
    ],
    "type": "js",
    "modulePath": "douban/subject.js",
    "sourceFile": "douban/subject.js",
    "navigateBefore": false
  },
  {
    "site": "douban",
    "name": "top250",
    "description": "豆瓣电影 Top250",
    "access": "read",
    "domain": "movie.douban.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 250,
        "required": false,
        "help": "返回结果数量"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "rating",
      "url"
    ],
    "type": "js",
    "modulePath": "douban/top250.js",
    "sourceFile": "douban/top250.js",
    "navigateBefore": "https://movie.douban.com"
  },
  {
    "site": "doubao",
    "name": "ask",
    "description": "Send a prompt and wait for the Doubao response",
    "access": "write",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 60,
        "required": false,
        "help": "Max seconds to wait (default: 60)"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "doubao/ask.js",
    "sourceFile": "doubao/ask.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao",
    "name": "detail",
    "description": "Read a specific Doubao conversation by ID",
    "access": "read",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Conversation ID (numeric or full URL)"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "doubao/detail.js",
    "sourceFile": "doubao/detail.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao",
    "name": "history",
    "description": "List conversation history from Doubao sidebar",
    "access": "read",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "str",
        "default": "50",
        "required": false,
        "help": "Max number of conversations to show"
      }
    ],
    "columns": [
      "Index",
      "Id",
      "Title",
      "Url"
    ],
    "type": "js",
    "modulePath": "doubao/history.js",
    "sourceFile": "doubao/history.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao",
    "name": "meeting-summary",
    "description": "Get meeting summary and chapters from a Doubao conversation",
    "access": "read",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Conversation ID (numeric or full URL)"
      },
      {
        "name": "chapters",
        "type": "str",
        "default": "false",
        "required": false,
        "help": "Also include AI chapters"
      }
    ],
    "columns": [
      "Section",
      "Content"
    ],
    "type": "js",
    "modulePath": "doubao/meeting-summary.js",
    "sourceFile": "doubao/meeting-summary.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao",
    "name": "meeting-transcript",
    "description": "Get or download the meeting transcript from a Doubao conversation",
    "access": "read",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Conversation ID (numeric or full URL)"
      },
      {
        "name": "download",
        "type": "str",
        "default": "false",
        "required": false,
        "help": "Trigger browser file download instead of reading text"
      }
    ],
    "columns": [
      "Section",
      "Content"
    ],
    "type": "js",
    "modulePath": "doubao/meeting-transcript.js",
    "sourceFile": "doubao/meeting-transcript.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao",
    "name": "new",
    "description": "Start a new conversation in Doubao web chat",
    "access": "read",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Action"
    ],
    "type": "js",
    "modulePath": "doubao/new.js",
    "sourceFile": "doubao/new.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao",
    "name": "read",
    "description": "Read the current Doubao conversation history",
    "access": "read",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "doubao/read.js",
    "sourceFile": "doubao/read.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao",
    "name": "send",
    "description": "Send a message to Doubao web chat",
    "access": "write",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Message to send"
      }
    ],
    "columns": [
      "Status",
      "SubmittedBy",
      "InjectedText"
    ],
    "type": "js",
    "modulePath": "doubao/send.js",
    "sourceFile": "doubao/send.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao",
    "name": "status",
    "description": "Check Doubao chat page availability and login state",
    "access": "read",
    "domain": "www.doubao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Login",
      "Url",
      "Title"
    ],
    "type": "js",
    "modulePath": "doubao/status.js",
    "sourceFile": "doubao/status.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "doubao-app",
    "name": "ask",
    "description": "Send a message to Doubao desktop app and wait for the AI response",
    "access": "write",
    "domain": "doubao-app",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max seconds to wait for response"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "doubao-app/ask.js",
    "sourceFile": "doubao-app/ask.js",
    "navigateBefore": true
  },
  {
    "site": "doubao-app",
    "name": "dump",
    "description": "Dump Doubao desktop app DOM and snapshot to /tmp for debugging",
    "access": "read",
    "domain": "doubao-app",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "File"
    ],
    "type": "js",
    "modulePath": "doubao-app/dump.js",
    "sourceFile": "doubao-app/dump.js",
    "navigateBefore": true
  },
  {
    "site": "doubao-app",
    "name": "new",
    "description": "Start a new chat in Doubao desktop app",
    "access": "read",
    "domain": "doubao-app",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "doubao-app/new.js",
    "sourceFile": "doubao-app/new.js",
    "navigateBefore": true
  },
  {
    "site": "doubao-app",
    "name": "read",
    "description": "Read chat history from Doubao desktop app",
    "access": "read",
    "domain": "doubao-app",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "doubao-app/read.js",
    "sourceFile": "doubao-app/read.js",
    "navigateBefore": true
  },
  {
    "site": "doubao-app",
    "name": "screenshot",
    "description": "Capture a screenshot of the Doubao desktop app window",
    "access": "read",
    "domain": "doubao-app",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "output",
        "type": "str",
        "required": false,
        "help": "Output file path (default: /tmp/doubao-screenshot.png)"
      }
    ],
    "columns": [
      "Status",
      "File"
    ],
    "type": "js",
    "modulePath": "doubao-app/screenshot.js",
    "sourceFile": "doubao-app/screenshot.js",
    "navigateBefore": true
  },
  {
    "site": "doubao-app",
    "name": "send",
    "description": "Send a message to Doubao desktop app",
    "access": "write",
    "domain": "doubao-app",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Message text to send"
      }
    ],
    "columns": [
      "Status",
      "Text"
    ],
    "type": "js",
    "modulePath": "doubao-app/send.js",
    "sourceFile": "doubao-app/send.js",
    "navigateBefore": true
  },
  {
    "site": "doubao-app",
    "name": "status",
    "description": "Check CDP connection to Doubao desktop app",
    "access": "read",
    "domain": "doubao-app",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Url",
      "Title"
    ],
    "type": "js",
    "modulePath": "doubao-app/status.js",
    "sourceFile": "doubao-app/status.js",
    "navigateBefore": true
  },
  {
    "site": "douyin",
    "name": "activities",
    "description": "官方活动列表",
    "access": "read",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "activity_id",
      "title",
      "end_time"
    ],
    "type": "js",
    "modulePath": "douyin/activities.js",
    "sourceFile": "douyin/activities.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "collections",
    "description": "合集列表",
    "access": "read",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "mix_id",
      "name",
      "item_count"
    ],
    "type": "js",
    "modulePath": "douyin/collections.js",
    "sourceFile": "douyin/collections.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "delete",
    "description": "删除作品（优先使用创作者后台作品管理；找不到时回退到旧删除接口）",
    "access": "write",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "aweme_id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "作品 ID / item_id"
      }
    ],
    "columns": [
      "status"
    ],
    "type": "js",
    "modulePath": "douyin/delete.js",
    "sourceFile": "douyin/delete.js",
    "navigateBefore": "https://creator.douyin.com",
    "siteSession": "persistent"
  },
  {
    "site": "douyin",
    "name": "draft",
    "description": "上传视频并保存为草稿",
    "access": "write",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "video",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "视频文件路径"
      },
      {
        "name": "title",
        "type": "str",
        "required": true,
        "help": "视频标题（≤30字）"
      },
      {
        "name": "caption",
        "type": "str",
        "default": "",
        "required": false,
        "help": "正文内容（≤1000字，支持 #话题）"
      },
      {
        "name": "cover",
        "type": "str",
        "default": "",
        "required": false,
        "help": "封面图片路径"
      },
      {
        "name": "visibility",
        "type": "str",
        "default": "public",
        "required": false,
        "help": "",
        "choices": [
          "public",
          "friends",
          "private"
        ]
      }
    ],
    "columns": [
      "status",
      "draft_id"
    ],
    "type": "js",
    "modulePath": "douyin/draft.js",
    "sourceFile": "douyin/draft.js",
    "navigateBefore": false
  },
  {
    "site": "douyin",
    "name": "drafts",
    "description": "获取草稿列表",
    "access": "read",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "aweme_id",
      "title",
      "create_time"
    ],
    "type": "js",
    "modulePath": "douyin/drafts.js",
    "sourceFile": "douyin/drafts.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "hashtag",
    "description": "话题搜索 / AI推荐 / 热点词",
    "access": "read",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "action",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "search=关键词搜索 suggest=AI推荐 hot=热点词",
        "choices": [
          "search",
          "suggest",
          "hot"
        ]
      },
      {
        "name": "keyword",
        "type": "str",
        "default": "",
        "required": false,
        "help": "搜索关键词（search/hot 使用）"
      },
      {
        "name": "cover",
        "type": "str",
        "default": "",
        "required": false,
        "help": "封面 URI（suggest 使用）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "name",
      "id",
      "view_count"
    ],
    "type": "js",
    "modulePath": "douyin/hashtag.js",
    "sourceFile": "douyin/hashtag.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "location",
    "description": "地理位置 POI 搜索",
    "access": "read",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "地名关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "poi_id",
      "name",
      "address",
      "city"
    ],
    "type": "js",
    "modulePath": "douyin/location.js",
    "sourceFile": "douyin/location.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "profile",
    "description": "获取账号信息",
    "access": "read",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "uid",
      "nickname",
      "follower_count",
      "following_count",
      "aweme_count"
    ],
    "type": "js",
    "modulePath": "douyin/profile.js",
    "sourceFile": "douyin/profile.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "publish",
    "description": "定时发布视频到抖音（必须设置 2h ~ 14天后的发布时间）",
    "access": "write",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "video",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "视频文件路径"
      },
      {
        "name": "title",
        "type": "str",
        "required": true,
        "help": "视频标题（≤30字）"
      },
      {
        "name": "schedule",
        "type": "str",
        "required": true,
        "help": "定时发布时间（ISO8601 或 Unix 秒，2h ~ 14天后）"
      },
      {
        "name": "caption",
        "type": "str",
        "default": "",
        "required": false,
        "help": "正文内容（≤1000字，支持 #话题）"
      },
      {
        "name": "cover",
        "type": "str",
        "default": "",
        "required": false,
        "help": "封面图片路径（不提供时使用视频截帧）"
      },
      {
        "name": "visibility",
        "type": "str",
        "default": "public",
        "required": false,
        "help": "",
        "choices": [
          "public",
          "friends",
          "private"
        ]
      },
      {
        "name": "allow_download",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "允许下载"
      },
      {
        "name": "collection",
        "type": "str",
        "default": "",
        "required": false,
        "help": "合集 ID"
      },
      {
        "name": "activity",
        "type": "str",
        "default": "",
        "required": false,
        "help": "活动 ID"
      },
      {
        "name": "poi_id",
        "type": "str",
        "default": "",
        "required": false,
        "help": "地理位置 ID"
      },
      {
        "name": "poi_name",
        "type": "str",
        "default": "",
        "required": false,
        "help": "地理位置名称"
      },
      {
        "name": "hotspot",
        "type": "str",
        "default": "",
        "required": false,
        "help": "关联热点词"
      },
      {
        "name": "no_safety_check",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "跳过内容安全检测"
      },
      {
        "name": "sync_toutiao",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "同步发布到头条"
      }
    ],
    "columns": [
      "status",
      "aweme_id",
      "url",
      "publish_time"
    ],
    "type": "js",
    "modulePath": "douyin/publish.js",
    "sourceFile": "douyin/publish.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "stats",
    "description": "作品数据分析",
    "access": "read",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "aweme_id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "抖音作品 ID（aweme_id，可从作品 URL 末尾获取）"
      }
    ],
    "columns": [
      "metric",
      "value"
    ],
    "type": "js",
    "modulePath": "douyin/stats.js",
    "sourceFile": "douyin/stats.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "update",
    "description": "更新视频信息",
    "access": "write",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "aweme_id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "抖音作品 ID（aweme_id，可从作品 URL 末尾获取）"
      },
      {
        "name": "reschedule",
        "type": "str",
        "default": "",
        "required": false,
        "help": "新的发布时间（ISO8601 或 Unix 秒）"
      },
      {
        "name": "caption",
        "type": "str",
        "default": "",
        "required": false,
        "help": "新的正文内容"
      }
    ],
    "columns": [
      "status"
    ],
    "type": "js",
    "modulePath": "douyin/update.js",
    "sourceFile": "douyin/update.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "douyin",
    "name": "user-videos",
    "description": "获取指定用户的视频列表（含下载地址和热门评论）",
    "access": "read",
    "domain": "www.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "sec_uid",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "用户 sec_uid（URL 末尾部分）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "获取数量（最大 20）"
      },
      {
        "name": "with_comments",
        "type": "bool",
        "default": true,
        "required": false,
        "help": "包含热门评论（默认: true）"
      },
      {
        "name": "comment_limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "每个视频获取多少条评论（最大 10）"
      }
    ],
    "columns": [
      "index",
      "aweme_id",
      "title",
      "duration",
      "digg_count",
      "play_url",
      "top_comments"
    ],
    "type": "js",
    "modulePath": "douyin/user-videos.js",
    "sourceFile": "douyin/user-videos.js",
    "navigateBefore": "https://www.douyin.com"
  },
  {
    "site": "douyin",
    "name": "videos",
    "description": "获取作品列表",
    "access": "read",
    "domain": "creator.douyin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "每页数量"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "页码"
      },
      {
        "name": "status",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "",
        "choices": [
          "all",
          "published",
          "reviewing",
          "scheduled"
        ]
      }
    ],
    "columns": [
      "aweme_id",
      "title",
      "status",
      "play_count",
      "digg_count",
      "create_time"
    ],
    "type": "js",
    "modulePath": "douyin/videos.js",
    "sourceFile": "douyin/videos.js",
    "navigateBefore": "https://creator.douyin.com"
  },
  {
    "site": "duckduckgo",
    "name": "search",
    "description": "Search DuckDuckGo",
    "access": "read",
    "domain": "html.duckduckgo.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results per page (1-10). For multi-page, use --offset"
      },
      {
        "name": "offset",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Result offset for pagination (0, 10, 20...). Uses XHR POST internally"
      },
      {
        "name": "region",
        "type": "str",
        "required": false,
        "help": "Region code (e.g. jp-jp, us-en, cn-zh). Default: all regions"
      },
      {
        "name": "time",
        "type": "str",
        "required": false,
        "help": "Time range: d (day), w (week), m (month), y (year)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "url",
      "snippet",
      "displayUrl",
      "icon",
      "resultType"
    ],
    "type": "js",
    "modulePath": "duckduckgo/search.js",
    "sourceFile": "duckduckgo/search.js"
  },
  {
    "site": "duckduckgo",
    "name": "suggest",
    "description": "DuckDuckGo search suggestions",
    "access": "read",
    "domain": "duckduckgo.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query prefix"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 8,
        "required": false,
        "help": "Max number of suggestions"
      }
    ],
    "columns": [
      "phrase"
    ],
    "type": "js",
    "modulePath": "duckduckgo/suggest.js",
    "sourceFile": "duckduckgo/suggest.js"
  },
  {
    "site": "eastmoney",
    "name": "announcement",
    "description": "上市公司公告（按交易所筛选）",
    "access": "read",
    "domain": "np-anotice-stock.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "market",
        "type": "string",
        "default": "SHA,SZA,BJA",
        "required": false,
        "help": "交易所：SHA (沪) / SZA (深) / BJA (北) 可逗号分隔"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 100)"
      }
    ],
    "columns": [
      "time",
      "code",
      "name",
      "title",
      "category",
      "url"
    ],
    "type": "js",
    "modulePath": "eastmoney/announcement.js",
    "sourceFile": "eastmoney/announcement.js"
  },
  {
    "site": "eastmoney",
    "name": "convertible",
    "description": "可转债行情列表（默认按成交额排序）",
    "access": "read",
    "domain": "push2.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "sort",
        "type": "string",
        "default": "turnover",
        "required": false,
        "help": "排序：turnover / change / drop / price / premium"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 100)"
      }
    ],
    "columns": [
      "rank",
      "bondCode",
      "bondName",
      "bondPrice",
      "bondChangePct",
      "stockCode",
      "stockName",
      "stockPrice",
      "stockChangePct",
      "convPrice",
      "convValue",
      "convPremiumPct",
      "remainingYears",
      "ytm",
      "listDate"
    ],
    "type": "js",
    "modulePath": "eastmoney/convertible.js",
    "sourceFile": "eastmoney/convertible.js"
  },
  {
    "site": "eastmoney",
    "name": "etf",
    "description": "ETF 列表按成交额/涨跌幅排行",
    "access": "read",
    "domain": "push2.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "sort",
        "type": "string",
        "default": "turnover",
        "required": false,
        "help": "排序：turnover / change / drop / volume / rate"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 100)"
      }
    ],
    "columns": [
      "rank",
      "code",
      "name",
      "price",
      "changePercent",
      "change",
      "turnover",
      "volume",
      "turnoverRate"
    ],
    "type": "js",
    "modulePath": "eastmoney/etf.js",
    "sourceFile": "eastmoney/etf.js"
  },
  {
    "site": "eastmoney",
    "name": "holders",
    "description": "十大流通股东（A股 F10 数据）",
    "access": "read",
    "domain": "datacenter-web.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "A股代码（600519 / sh600519 等）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回股东数（默认十大流通股东）"
      }
    ],
    "columns": [
      "rank",
      "reportDate",
      "name",
      "holdNum",
      "floatRatio",
      "change"
    ],
    "type": "js",
    "modulePath": "eastmoney/holders.js",
    "sourceFile": "eastmoney/holders.js"
  },
  {
    "site": "eastmoney",
    "name": "hot-rank",
    "description": "东方财富热股榜",
    "access": "read",
    "domain": "guba.eastmoney.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量"
      }
    ],
    "columns": [
      "rank",
      "symbol",
      "name",
      "price",
      "changePercent",
      "heat",
      "url"
    ],
    "type": "js",
    "modulePath": "eastmoney/hot-rank.js",
    "sourceFile": "eastmoney/hot-rank.js",
    "navigateBefore": true
  },
  {
    "site": "eastmoney",
    "name": "index-board",
    "description": "主要市场指数行情（A股 / 港股 / 美股）",
    "access": "read",
    "domain": "push2.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "group",
        "type": "string",
        "default": "main",
        "required": false,
        "help": "指数分组：main (A股主要), hk (港股), us (美股), all"
      }
    ],
    "columns": [
      "code",
      "name",
      "price",
      "changePercent",
      "change",
      "open",
      "high",
      "low",
      "prevClose"
    ],
    "type": "js",
    "modulePath": "eastmoney/index-board.js",
    "sourceFile": "eastmoney/index-board.js"
  },
  {
    "site": "eastmoney",
    "name": "kline",
    "description": "K线历史数据（分/日/周/月/前复权/后复权）",
    "access": "read",
    "domain": "push2his.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "股票代码（A/HK/US 均可）"
      },
      {
        "name": "period",
        "type": "string",
        "default": "day",
        "required": false,
        "help": "周期：1m/5m/15m/30m/60m/day/week/month"
      },
      {
        "name": "adjust",
        "type": "string",
        "default": "forward",
        "required": false,
        "help": "复权：none / forward / backward"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "返回最近 N 根（末尾）"
      }
    ],
    "columns": [
      "date",
      "open",
      "close",
      "high",
      "low",
      "volume",
      "turnover",
      "amplitude",
      "changePercent",
      "change",
      "turnoverRate"
    ],
    "type": "js",
    "modulePath": "eastmoney/kline.js",
    "sourceFile": "eastmoney/kline.js"
  },
  {
    "site": "eastmoney",
    "name": "kuaixun",
    "description": "东方财富 7x24 财经快讯",
    "access": "read",
    "domain": "np-listapi.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "column",
        "type": "string",
        "default": "102",
        "required": false,
        "help": "频道：102 (重要) / 101 (全部) / 104 / 105 / 106 / 107"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 100)"
      }
    ],
    "columns": [
      "time",
      "title",
      "summary",
      "stocks"
    ],
    "type": "js",
    "modulePath": "eastmoney/kuaixun.js",
    "sourceFile": "eastmoney/kuaixun.js"
  },
  {
    "site": "eastmoney",
    "name": "longhu",
    "description": "龙虎榜明细（A股交易所公开披露榜单）",
    "access": "read",
    "domain": "datacenter-web.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "date",
        "type": "string",
        "default": "",
        "required": false,
        "help": "开始交易日 YYYY-MM-DD (默认昨天)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 100)"
      }
    ],
    "columns": [
      "tradeDate",
      "code",
      "name",
      "closePrice",
      "changeRate",
      "boardAmt",
      "buyAmt",
      "sellAmt",
      "netAmt",
      "turnover",
      "dealRatio",
      "market",
      "reason"
    ],
    "type": "js",
    "modulePath": "eastmoney/longhu.js",
    "sourceFile": "eastmoney/longhu.js"
  },
  {
    "site": "eastmoney",
    "name": "money-flow",
    "description": "主力资金净流入排行（今日/5日/10日）",
    "access": "read",
    "domain": "push2.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "range",
        "type": "string",
        "default": "today",
        "required": false,
        "help": "周期：today / 5d / 10d"
      },
      {
        "name": "order",
        "type": "string",
        "default": "desc",
        "required": false,
        "help": "排序：desc (净流入排行) / asc (净流出)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 100)"
      }
    ],
    "columns": [
      "rank",
      "code",
      "name",
      "price",
      "changePercent",
      "mainNet",
      "mainNetRatio",
      "superNet",
      "bigNet",
      "mediumNet",
      "smallNet"
    ],
    "type": "js",
    "modulePath": "eastmoney/money-flow.js",
    "sourceFile": "eastmoney/money-flow.js"
  },
  {
    "site": "eastmoney",
    "name": "northbound",
    "description": "沪深港通北向/南向资金当日分时净流入（万元）",
    "access": "read",
    "domain": "push2.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "direction",
        "type": "string",
        "default": "north",
        "required": false,
        "help": "方向：north (北向，即外资买A) / south (南向，即内地买港)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回最近 N 分钟"
      }
    ],
    "columns": [
      "time",
      "cumulativeNetYi",
      "minuteNetYi",
      "totalNetYi"
    ],
    "type": "js",
    "modulePath": "eastmoney/northbound.js",
    "sourceFile": "eastmoney/northbound.js"
  },
  {
    "site": "eastmoney",
    "name": "quote",
    "description": "个股实时行情（A股 / 港股 / 美股）— 来自 push2.eastmoney.com",
    "access": "read",
    "domain": "push2.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "symbols",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "股票代码（可用逗号/空格分隔多个）"
      }
    ],
    "columns": [
      "code",
      "name",
      "market",
      "price",
      "changePercent",
      "change",
      "open",
      "high",
      "low",
      "prevClose",
      "volume",
      "turnover",
      "turnoverRate",
      "amplitude",
      "peDynamic",
      "priceBook",
      "marketCap",
      "floatMarketCap"
    ],
    "type": "js",
    "modulePath": "eastmoney/quote.js",
    "sourceFile": "eastmoney/quote.js"
  },
  {
    "site": "eastmoney",
    "name": "rank",
    "description": "东财市场涨跌/成交排行（沪深/北证/创/科/港/美）",
    "access": "read",
    "domain": "push2.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "market",
        "type": "string",
        "default": "hs-a",
        "required": false,
        "help": "市场：hs-a / sh-a / sz-a / bj-a / cyb / kcb / hk / us"
      },
      {
        "name": "sort",
        "type": "string",
        "default": "change",
        "required": false,
        "help": "排序：change / drop / turnover / volume / amplitude / rate"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 100)"
      }
    ],
    "columns": [
      "rank",
      "code",
      "name",
      "price",
      "changePercent",
      "change",
      "turnover",
      "volume",
      "turnoverRate",
      "peDynamic",
      "marketCap"
    ],
    "type": "js",
    "modulePath": "eastmoney/rank.js",
    "sourceFile": "eastmoney/rank.js"
  },
  {
    "site": "eastmoney",
    "name": "sectors",
    "description": "板块排行（行业/概念/地域）按涨跌幅、主力资金或成交额排序",
    "access": "read",
    "domain": "push2.eastmoney.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "type",
        "type": "string",
        "default": "industry",
        "required": false,
        "help": "板块类型：industry / concept / region"
      },
      {
        "name": "sort",
        "type": "string",
        "default": "change",
        "required": false,
        "help": "排序：change / drop / money-flow / out-flow / turnover"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 100)"
      }
    ],
    "columns": [
      "rank",
      "code",
      "name",
      "price",
      "changePercent",
      "mainNet",
      "leadStock",
      "leadChangePercent",
      "upCount",
      "downCount"
    ],
    "type": "js",
    "modulePath": "eastmoney/sectors.js",
    "sourceFile": "eastmoney/sectors.js"
  },
  {
    "site": "endoflife",
    "name": "product",
    "description": "Release cycles + EOL / LTS / support dates for one product on endoflife.date",
    "access": "read",
    "domain": "endoflife.date",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "product",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "endoflife.date product slug (e.g. \"nodejs\", \"python\", \"ubuntu\")"
      }
    ],
    "columns": [
      "product",
      "cycle",
      "releaseDate",
      "latest",
      "latestReleaseDate",
      "lts",
      "support",
      "eol",
      "extendedSupport",
      "eolStatus",
      "url"
    ],
    "type": "js",
    "modulePath": "endoflife/product.js",
    "sourceFile": "endoflife/product.js"
  },
  {
    "site": "facebook",
    "name": "add-friend",
    "description": "Send a friend request on Facebook",
    "access": "write",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Facebook username or profile URL"
      }
    ],
    "columns": [
      "status",
      "username"
    ],
    "type": "js",
    "modulePath": "facebook/add-friend.js",
    "sourceFile": "facebook/add-friend.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "events",
    "description": "Browse Facebook event categories",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of categories"
      }
    ],
    "columns": [
      "index",
      "name"
    ],
    "type": "js",
    "modulePath": "facebook/events.js",
    "sourceFile": "facebook/events.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "feed",
    "description": "Get your Facebook news feed",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "index",
      "author",
      "content",
      "likes",
      "comments",
      "shares"
    ],
    "type": "js",
    "modulePath": "facebook/feed.js",
    "sourceFile": "facebook/feed.js",
    "navigateBefore": false
  },
  {
    "site": "facebook",
    "name": "friends",
    "description": "Get Facebook friend suggestions",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of friend suggestions"
      }
    ],
    "columns": [
      "index",
      "name",
      "mutual"
    ],
    "type": "js",
    "modulePath": "facebook/friends.js",
    "sourceFile": "facebook/friends.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "groups",
    "description": "List your Facebook groups",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of groups"
      }
    ],
    "columns": [
      "index",
      "name",
      "last_post",
      "url"
    ],
    "type": "js",
    "modulePath": "facebook/groups.js",
    "sourceFile": "facebook/groups.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "join-group",
    "description": "Join a Facebook group",
    "access": "write",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "group",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Group ID or URL path (e.g. '1876150192925481' or group name)"
      }
    ],
    "columns": [
      "status",
      "group"
    ],
    "type": "js",
    "modulePath": "facebook/join-group.js",
    "sourceFile": "facebook/join-group.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "marketplace-inbox",
    "description": "List recent Facebook Marketplace buyer/seller conversations",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of conversations to return"
      }
    ],
    "columns": [
      "index",
      "buyer",
      "listing",
      "snippet",
      "time",
      "unread"
    ],
    "type": "js",
    "modulePath": "facebook/marketplace-inbox.js",
    "sourceFile": "facebook/marketplace-inbox.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "marketplace-listings",
    "description": "List your Facebook Marketplace seller listings",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of listings to return"
      }
    ],
    "columns": [
      "index",
      "title",
      "price",
      "status",
      "listed",
      "clicks",
      "actions"
    ],
    "type": "js",
    "modulePath": "facebook/marketplace-listings.js",
    "sourceFile": "facebook/marketplace-listings.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "memories",
    "description": "Get your Facebook memories (On This Day)",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of memories"
      }
    ],
    "columns": [
      "index",
      "source",
      "content",
      "time"
    ],
    "type": "js",
    "modulePath": "facebook/memories.js",
    "sourceFile": "facebook/memories.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "notifications",
    "description": "Get recent Facebook notifications (含 unread / time / url / notif_id / notif_type 列)",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of notifications (1-100)"
      }
    ],
    "columns": [
      "index",
      "unread",
      "text",
      "time",
      "url",
      "notif_id",
      "notif_type"
    ],
    "type": "js",
    "modulePath": "facebook/notifications.js",
    "sourceFile": "facebook/notifications.js",
    "navigateBefore": false
  },
  {
    "site": "facebook",
    "name": "profile",
    "description": "Get Facebook user/page profile info",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Facebook username or page name"
      }
    ],
    "columns": [
      "name",
      "username",
      "friends",
      "followers",
      "url"
    ],
    "type": "js",
    "modulePath": "facebook/profile.js",
    "sourceFile": "facebook/profile.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "facebook",
    "name": "search",
    "description": "Search Facebook for people, pages, or posts",
    "access": "read",
    "domain": "www.facebook.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "index",
      "title",
      "text",
      "url"
    ],
    "type": "js",
    "modulePath": "facebook/search.js",
    "sourceFile": "facebook/search.js",
    "navigateBefore": "https://www.facebook.com"
  },
  {
    "site": "flathub",
    "name": "app",
    "description": "Full Flathub appstream metadata for an app id (license, categories, latest release)",
    "access": "read",
    "domain": "flathub.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "appId",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "AppStream id (e.g. \"org.mozilla.firefox\", \"org.gnome.Calculator\")"
      }
    ],
    "columns": [
      "appId",
      "name",
      "summary",
      "developer",
      "license",
      "isFreeLicense",
      "isEol",
      "categories",
      "keywords",
      "latestVersion",
      "latestReleaseDate",
      "homepage",
      "bugtracker",
      "donation",
      "url"
    ],
    "type": "js",
    "modulePath": "flathub/app.js",
    "sourceFile": "flathub/app.js"
  },
  {
    "site": "flathub",
    "name": "search",
    "description": "Search Flathub apps by keyword",
    "access": "read",
    "domain": "flathub.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Max apps (1-100)"
      }
    ],
    "columns": [
      "rank",
      "appId",
      "name",
      "summary",
      "developer",
      "license",
      "isFreeLicense",
      "mainCategories",
      "installsLastMonth",
      "updatedAt",
      "url"
    ],
    "type": "js",
    "modulePath": "flathub/search.js",
    "sourceFile": "flathub/search.js"
  },
  {
    "site": "flomo",
    "name": "memos",
    "description": "List your Flomo memos",
    "access": "read",
    "domain": "flomoapp.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of memos to fetch (1-200)"
      },
      {
        "name": "since",
        "type": "int",
        "required": false,
        "help": "Only memos updated after this Unix timestamp in seconds"
      },
      {
        "name": "slug",
        "type": "str",
        "required": false,
        "help": "Pagination cursor from a previous memo page"
      }
    ],
    "columns": [
      "id",
      "url",
      "content",
      "slug",
      "tags",
      "images",
      "created_at",
      "updated_at"
    ],
    "type": "js",
    "modulePath": "flomo/memos.js",
    "sourceFile": "flomo/memos.js",
    "navigateBefore": "https://v.flomoapp.com/"
  },
  {
    "site": "gemini",
    "name": "ask",
    "description": "Send a prompt to Gemini and return only the assistant response",
    "access": "write",
    "domain": "gemini.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 60,
        "required": false,
        "help": "Max seconds to wait (default: 60)"
      },
      {
        "name": "new",
        "type": "str",
        "default": "false",
        "required": false,
        "help": "Start a new chat first (true/false, default: false)"
      }
    ],
    "columns": [
      "response"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "gemini/ask.js",
    "sourceFile": "gemini/ask.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "gemini",
    "name": "deep-research",
    "description": "Start a Gemini Deep Research run and confirm it",
    "access": "write",
    "domain": "gemini.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 180,
        "required": false,
        "help": "Max seconds for the overall command (default: 180; confirm-wait clamps internally to 6-20s)"
      },
      {
        "name": "tool",
        "type": "str",
        "required": false,
        "help": "Override tool label (default: Deep Research)"
      },
      {
        "name": "confirm",
        "type": "str",
        "required": false,
        "help": "Override confirm button label (default: Start research)"
      }
    ],
    "columns": [
      "status",
      "url"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "gemini/deep-research.js",
    "sourceFile": "gemini/deep-research.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "gemini",
    "name": "deep-research-result",
    "description": "Export Deep Research report URL from a Gemini conversation",
    "access": "read",
    "domain": "gemini.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Conversation title or URL (optional; defaults to latest conversation)"
      },
      {
        "name": "match",
        "type": "str",
        "default": "contains",
        "required": false,
        "help": "Match mode",
        "choices": [
          "contains",
          "exact"
        ]
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds to wait for Docs export (default: 120)"
      }
    ],
    "columns": [
      "response"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "gemini/deep-research-result.js",
    "sourceFile": "gemini/deep-research-result.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "gemini",
    "name": "image",
    "description": "Generate images with Gemini web and save them locally",
    "access": "write",
    "domain": "gemini.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image prompt to send to Gemini"
      },
      {
        "name": "rt",
        "type": "str",
        "default": "1:1",
        "required": false,
        "help": "Ratio shorthand for aspect ratio (1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3)"
      },
      {
        "name": "st",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Style shorthand, e.g. anime, icon, watercolor"
      },
      {
        "name": "op",
        "type": "str",
        "default": "~/tmp/gemini-images",
        "required": false,
        "help": "Output directory shorthand"
      },
      {
        "name": "sd",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Skip download shorthand; only show Gemini page link"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 240,
        "required": false,
        "help": "Max seconds for the overall command (default: 240)"
      }
    ],
    "columns": [
      "status",
      "file",
      "link"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "gemini/image.js",
    "sourceFile": "gemini/image.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "gemini",
    "name": "new",
    "description": "Start a new conversation in Gemini web chat",
    "access": "read",
    "domain": "gemini.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Action"
    ],
    "type": "js",
    "modulePath": "gemini/new.js",
    "sourceFile": "gemini/new.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "gitee",
    "name": "search",
    "description": "Search repositories on Gitee",
    "access": "read",
    "domain": "gitee.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results (max 50)"
      }
    ],
    "columns": [
      "rank",
      "name",
      "language",
      "stars",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "gitee/search.js",
    "sourceFile": "gitee/search.js"
  },
  {
    "site": "gitee",
    "name": "trending",
    "description": "Recommended open-source projects on Gitee Explore",
    "access": "read",
    "domain": "gitee.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of projects (max 50)"
      }
    ],
    "columns": [
      "name",
      "description",
      "stars",
      "url"
    ],
    "type": "js",
    "modulePath": "gitee/trending.js",
    "sourceFile": "gitee/trending.js"
  },
  {
    "site": "gitee",
    "name": "user",
    "description": "Show a Gitee user profile panel",
    "access": "read",
    "domain": "gitee.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Gitee username"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "gitee/user.js",
    "sourceFile": "gitee/user.js"
  },
  {
    "site": "google",
    "name": "news",
    "description": "Get Google News headlines",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Search query (omit for top stories)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      },
      {
        "name": "lang",
        "type": "str",
        "default": "en",
        "required": false,
        "help": "Language short code (e.g. en, zh)"
      },
      {
        "name": "region",
        "type": "str",
        "default": "US",
        "required": false,
        "help": "Region code (e.g. US, CN)"
      }
    ],
    "columns": [
      "title",
      "source",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "google/news.js",
    "sourceFile": "google/news.js"
  },
  {
    "site": "google",
    "name": "search",
    "description": "Search Google",
    "access": "read",
    "domain": "google.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results (1-100)"
      },
      {
        "name": "lang",
        "type": "str",
        "default": "en",
        "required": false,
        "help": "Language short code (e.g. en, zh)"
      }
    ],
    "columns": [
      "type",
      "title",
      "url",
      "snippet"
    ],
    "type": "js",
    "modulePath": "google/search.js",
    "sourceFile": "google/search.js"
  },
  {
    "site": "google",
    "name": "suggest",
    "description": "Get Google search suggestions",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "lang",
        "type": "str",
        "default": "zh-CN",
        "required": false,
        "help": "Language code"
      }
    ],
    "columns": [
      "suggestion"
    ],
    "type": "js",
    "modulePath": "google/suggest.js",
    "sourceFile": "google/suggest.js"
  },
  {
    "site": "google",
    "name": "trends",
    "description": "Get Google Trends daily trending searches",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "region",
        "type": "str",
        "default": "US",
        "required": false,
        "help": "Region code (e.g. US, CN, JP)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "title",
      "traffic",
      "date"
    ],
    "type": "js",
    "modulePath": "google/trends.js",
    "sourceFile": "google/trends.js"
  },
  {
    "site": "google-scholar",
    "name": "cite",
    "description": "Get citation for a Google Scholar paper",
    "access": "read",
    "domain": "scholar.google.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Paper title to search for"
      },
      {
        "name": "style",
        "type": "str",
        "default": "bibtex",
        "required": false,
        "help": "Citation format",
        "choices": [
          "bibtex",
          "endnote",
          "refman",
          "refworks"
        ]
      },
      {
        "name": "index",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Which search result to cite (1-based)"
      }
    ],
    "columns": [
      "title",
      "format",
      "citation"
    ],
    "type": "js",
    "modulePath": "google-scholar/cite.js",
    "sourceFile": "google-scholar/cite.js"
  },
  {
    "site": "google-scholar",
    "name": "profile",
    "description": "View a Google Scholar author profile",
    "access": "read",
    "domain": "scholar.google.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "author",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Author name or Scholar user ID (e.g. JicYPdAAAAAJ)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max papers to show (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "cited",
      "year"
    ],
    "type": "js",
    "modulePath": "google-scholar/profile.js",
    "sourceFile": "google-scholar/profile.js"
  },
  {
    "site": "google-scholar",
    "name": "search",
    "description": "Google Scholar 学术搜索",
    "access": "read",
    "domain": "scholar.google.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "authors",
      "source",
      "year",
      "cited",
      "url"
    ],
    "type": "js",
    "modulePath": "google-scholar/search.js",
    "sourceFile": "google-scholar/search.js"
  },
  {
    "site": "goproxy",
    "name": "module",
    "description": "Latest version + VCS origin metadata for a Go module on proxy.golang.org",
    "access": "read",
    "domain": "proxy.golang.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "module",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Go module path (e.g. \"github.com/gin-gonic/gin\", \"golang.org/x/net\")"
      }
    ],
    "columns": [
      "module",
      "version",
      "publishedAt",
      "vcs",
      "repository",
      "commit",
      "ref",
      "pkgGoDevUrl",
      "url"
    ],
    "type": "js",
    "modulePath": "goproxy/module.js",
    "sourceFile": "goproxy/module.js"
  },
  {
    "site": "goproxy",
    "name": "versions",
    "description": "Published version tags for a Go module (newest first), optionally with publish times",
    "access": "read",
    "domain": "proxy.golang.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "module",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Go module path (e.g. \"github.com/gin-gonic/gin\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max rows to return (1-200)"
      },
      {
        "name": "with-time",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Fetch each version's publish time (one extra request per row)"
      }
    ],
    "columns": [
      "rank",
      "module",
      "version",
      "publishedAt",
      "url"
    ],
    "type": "js",
    "modulePath": "goproxy/versions.js",
    "sourceFile": "goproxy/versions.js"
  },
  {
    "site": "gov-law",
    "name": "recent",
    "description": "最新法律法规",
    "access": "read",
    "domain": "flk.npc.gov.cn",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "status",
      "publish_date",
      "type",
      "department"
    ],
    "type": "js",
    "modulePath": "gov-law/recent.js",
    "sourceFile": "gov-law/recent.js"
  },
  {
    "site": "gov-law",
    "name": "search",
    "description": "国家法律法规数据库搜索",
    "access": "read",
    "domain": "flk.npc.gov.cn",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "status",
      "publish_date",
      "type",
      "department"
    ],
    "type": "js",
    "modulePath": "gov-law/search.js",
    "sourceFile": "gov-law/search.js"
  },
  {
    "site": "gov-policy",
    "name": "recent",
    "description": "国务院最新政策文件",
    "access": "read",
    "domain": "www.gov.cn",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "date",
      "source",
      "url"
    ],
    "type": "js",
    "modulePath": "gov-policy/recent.js",
    "sourceFile": "gov-policy/recent.js"
  },
  {
    "site": "gov-policy",
    "name": "search",
    "description": "中国政府网政策文件搜索",
    "access": "read",
    "domain": "sousuo.www.gov.cn",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "description",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "gov-policy/search.js",
    "sourceFile": "gov-policy/search.js"
  },
  {
    "site": "grok",
    "name": "ask",
    "description": "Send a message to Grok and get response",
    "access": "write",
    "domain": "grok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Prompt to send to Grok"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds to wait for response (default: 120)"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending (default: false)"
      }
    ],
    "columns": [
      "response"
    ],
    "type": "js",
    "modulePath": "grok/ask.js",
    "sourceFile": "grok/ask.js",
    "navigateBefore": "https://grok.com",
    "siteSession": "persistent"
  },
  {
    "site": "grok",
    "name": "detail",
    "description": "Open a Grok conversation by ID and read its messages",
    "access": "read",
    "domain": "grok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Session ID (UUID) or full https://grok.com/c/<id> URL"
      },
      {
        "name": "markdown",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Emit assistant replies as markdown"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "grok/detail.js",
    "sourceFile": "grok/detail.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "grok",
    "name": "history",
    "description": "List recent Grok conversations from the sidebar (requires login)",
    "access": "read",
    "domain": "grok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max conversations to show (default 20, max 100)"
      }
    ],
    "columns": [
      "Index",
      "Title",
      "Url"
    ],
    "type": "js",
    "modulePath": "grok/history.js",
    "sourceFile": "grok/history.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "grok",
    "name": "image",
    "description": "Generate images on grok.com and return image URLs",
    "access": "write",
    "domain": "grok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Image generation prompt"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 240,
        "required": false,
        "help": "Max seconds to wait for the image (default: 240)"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending (default: false)"
      },
      {
        "name": "count",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Minimum images to wait for before returning (default: 1)"
      },
      {
        "name": "out",
        "type": "string",
        "default": "",
        "required": false,
        "help": "Directory to save downloaded images (uses browser session to bypass auth)"
      }
    ],
    "columns": [
      "url",
      "width",
      "height",
      "path"
    ],
    "type": "js",
    "modulePath": "grok/image.js",
    "sourceFile": "grok/image.js",
    "navigateBefore": "https://grok.com",
    "siteSession": "persistent"
  },
  {
    "site": "grok",
    "name": "new",
    "description": "Start a new conversation in Grok",
    "access": "write",
    "domain": "grok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "grok/new.js",
    "sourceFile": "grok/new.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "grok",
    "name": "read",
    "description": "Read messages in the current Grok conversation",
    "access": "read",
    "domain": "grok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "markdown",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Emit assistant replies as markdown"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "grok/read.js",
    "sourceFile": "grok/read.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "grok",
    "name": "send",
    "description": "Fire-and-forget: send a prompt to Grok without waiting for the reply",
    "access": "write",
    "domain": "grok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send to Grok"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      }
    ],
    "columns": [
      "Status",
      "Prompt"
    ],
    "type": "js",
    "modulePath": "grok/send.js",
    "sourceFile": "grok/send.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "grok",
    "name": "status",
    "description": "Check Grok page availability, login state, current session and model",
    "access": "read",
    "domain": "grok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Login",
      "Model",
      "SessionId",
      "Url"
    ],
    "type": "js",
    "modulePath": "grok/status.js",
    "sourceFile": "grok/status.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "hackernews",
    "name": "ask",
    "description": "Hacker News Ask HN posts",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "hackernews/ask.js",
    "sourceFile": "hackernews/ask.js"
  },
  {
    "site": "hackernews",
    "name": "best",
    "description": "Hacker News best stories",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "hackernews/best.js",
    "sourceFile": "hackernews/best.js"
  },
  {
    "site": "hackernews",
    "name": "jobs",
    "description": "Hacker News job postings",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of job postings"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "author",
      "url"
    ],
    "type": "js",
    "modulePath": "hackernews/jobs.js",
    "sourceFile": "hackernews/jobs.js"
  },
  {
    "site": "hackernews",
    "name": "new",
    "description": "Hacker News newest stories",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "hackernews/new.js",
    "sourceFile": "hackernews/new.js"
  },
  {
    "site": "hackernews",
    "name": "read",
    "description": "Read a Hacker News story and its comment tree",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "HN item ID (e.g. 39847301)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Max top-level comments"
      },
      {
        "name": "depth",
        "type": "int",
        "default": 2,
        "required": false,
        "help": "Max reply depth (1=no replies, 2=one level of replies, etc.)"
      },
      {
        "name": "replies",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Max replies shown per comment at each level"
      },
      {
        "name": "max-length",
        "type": "int",
        "default": 2000,
        "required": false,
        "help": "Max characters per comment body (min 100)"
      }
    ],
    "columns": [
      "type",
      "author",
      "score",
      "text"
    ],
    "type": "js",
    "modulePath": "hackernews/read.js",
    "sourceFile": "hackernews/read.js"
  },
  {
    "site": "hackernews",
    "name": "search",
    "description": "Search Hacker News stories",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      },
      {
        "name": "sort",
        "type": "str",
        "default": "relevance",
        "required": false,
        "help": "Sort by relevance or date",
        "choices": [
          "relevance",
          "date"
        ]
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "hackernews/search.js",
    "sourceFile": "hackernews/search.js"
  },
  {
    "site": "hackernews",
    "name": "show",
    "description": "Hacker News Show HN posts",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "hackernews/show.js",
    "sourceFile": "hackernews/show.js"
  },
  {
    "site": "hackernews",
    "name": "top",
    "description": "Hacker News top stories",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "hackernews/top.js",
    "sourceFile": "hackernews/top.js"
  },
  {
    "site": "hackernews",
    "name": "user",
    "description": "Hacker News user profile",
    "access": "read",
    "domain": "news.ycombinator.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "HN username"
      }
    ],
    "columns": [
      "username",
      "karma",
      "created",
      "about"
    ],
    "type": "js",
    "modulePath": "hackernews/user.js",
    "sourceFile": "hackernews/user.js"
  },
  {
    "site": "hf",
    "name": "datasets",
    "description": "Top Hugging Face datasets (downloads / likes / trending / freshness).",
    "access": "read",
    "domain": "huggingface.co",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "sort",
        "type": "string",
        "default": "downloads",
        "required": false,
        "help": "Sort key: downloads, likes, trending, created_at, last_modified"
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "help": "Optional name/owner substring filter."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max datasets (max 100; one API page)."
      }
    ],
    "columns": [
      "rank",
      "id",
      "author",
      "downloads",
      "likes",
      "tags",
      "lastModified",
      "url"
    ],
    "type": "js",
    "modulePath": "hf/datasets.js",
    "sourceFile": "hf/datasets.js"
  },
  {
    "site": "hf",
    "name": "models",
    "description": "Top Hugging Face models (downloads / likes / trending / freshness).",
    "access": "read",
    "domain": "huggingface.co",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "sort",
        "type": "string",
        "default": "downloads",
        "required": false,
        "help": "Sort key: downloads, likes, trending, created_at, last_modified"
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "help": "Optional name/owner substring filter (e.g. \"llama\", \"mistralai/\")"
      },
      {
        "name": "pipeline",
        "type": "string",
        "required": false,
        "help": "Filter by pipeline tag (e.g. text-generation, image-classification)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max models (max 100; one API page)."
      }
    ],
    "columns": [
      "rank",
      "id",
      "author",
      "pipelineTag",
      "downloads",
      "likes",
      "tags",
      "lastModified",
      "url"
    ],
    "type": "js",
    "modulePath": "hf/models.js",
    "sourceFile": "hf/models.js"
  },
  {
    "site": "hf",
    "name": "paper",
    "description": "Hugging Face paper detail by arXiv id (full title / summary / authors / AI keywords)",
    "access": "read",
    "domain": "huggingface.co",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "arXiv id (e.g. \"1706.03762\") — same value HF uses to mirror the paper"
      }
    ],
    "columns": [
      "id",
      "title",
      "authors",
      "publishedAt",
      "upvotes",
      "aiKeywords",
      "summary",
      "aiSummary",
      "url"
    ],
    "type": "js",
    "modulePath": "hf/paper.js",
    "sourceFile": "hf/paper.js"
  },
  {
    "site": "hf",
    "name": "spaces",
    "description": "Top Hugging Face Spaces (likes / created_at / last_modified).",
    "access": "read",
    "domain": "huggingface.co",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "sort",
        "type": "string",
        "default": "likes",
        "required": false,
        "help": "Sort key: likes, created_at, last_modified"
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "help": "Optional name/owner substring filter (e.g. \"stability\", \"openai/\")"
      },
      {
        "name": "sdk",
        "type": "string",
        "required": false,
        "help": "Filter by Space SDK: gradio / streamlit / docker / static"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max spaces (max 100; one API page)."
      }
    ],
    "columns": [
      "rank",
      "id",
      "author",
      "sdk",
      "likes",
      "tags",
      "lastModified",
      "url"
    ],
    "type": "js",
    "modulePath": "hf/spaces.js",
    "sourceFile": "hf/spaces.js"
  },
  {
    "site": "hf",
    "name": "top",
    "description": "Top upvoted Hugging Face papers",
    "access": "read",
    "domain": "huggingface.co",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of papers"
      },
      {
        "name": "all",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Return all papers (ignore limit)"
      },
      {
        "name": "date",
        "type": "str",
        "required": false,
        "help": "Date (YYYY-MM-DD), defaults to most recent"
      },
      {
        "name": "period",
        "type": "str",
        "default": "daily",
        "required": false,
        "help": "Time period: daily, weekly, or monthly",
        "choices": [
          "daily",
          "weekly",
          "monthly"
        ]
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "upvotes",
      "authors"
    ],
    "type": "js",
    "modulePath": "hf/top.js",
    "sourceFile": "hf/top.js"
  },
  {
    "site": "homebrew",
    "name": "cask",
    "description": "Fetch a Homebrew cask's metadata (version, homepage, deprecation, download URL)",
    "access": "read",
    "domain": "formulae.brew.sh",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "token",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Cask token (e.g. \"firefox\", \"visual-studio-code\", \"google-chrome\")"
      }
    ],
    "columns": [
      "cask",
      "tap",
      "name",
      "version",
      "description",
      "homepage",
      "deprecated",
      "disabled",
      "download",
      "url"
    ],
    "type": "js",
    "modulePath": "homebrew/cask.js",
    "sourceFile": "homebrew/cask.js"
  },
  {
    "site": "homebrew",
    "name": "formula",
    "description": "Fetch a Homebrew formula's metadata (version, license, deps, deprecation, source)",
    "access": "read",
    "domain": "formulae.brew.sh",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Formula name (e.g. \"wget\", \"gcc@13\", \"imagemagick\")"
      }
    ],
    "columns": [
      "formula",
      "tap",
      "version",
      "license",
      "description",
      "homepage",
      "dependencies",
      "deprecated",
      "disabled",
      "source",
      "url"
    ],
    "type": "js",
    "modulePath": "homebrew/formula.js",
    "sourceFile": "homebrew/formula.js"
  },
  {
    "site": "homebrew",
    "name": "popular",
    "description": "List most-installed Homebrew formulae or casks (Homebrew's analytics ranking)",
    "access": "read",
    "domain": "formulae.brew.sh",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "type",
        "type": "str",
        "default": "formula",
        "required": false,
        "help": "Package type (formula / cask)"
      },
      {
        "name": "window",
        "type": "str",
        "default": "30d",
        "required": false,
        "help": "Time window (30d / 90d / 365d)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max rows (1-500)"
      }
    ],
    "columns": [
      "rank",
      "token",
      "type",
      "installs",
      "percent",
      "window",
      "url"
    ],
    "type": "js",
    "modulePath": "homebrew/popular.js",
    "sourceFile": "homebrew/popular.js"
  },
  {
    "site": "hupu",
    "name": "detail",
    "description": "获取虎扑帖子详情 (使用Next.js JSON数据)",
    "access": "read",
    "domain": "bbs.hupu.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "tid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "帖子ID（9位数字）"
      },
      {
        "name": "replies",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "是否包含热门回复"
      }
    ],
    "columns": [
      "title",
      "author",
      "content",
      "replies",
      "lights",
      "url"
    ],
    "type": "js",
    "modulePath": "hupu/detail.js",
    "sourceFile": "hupu/detail.js"
  },
  {
    "site": "hupu",
    "name": "hot",
    "description": "虎扑首页热门帖子（含 lights / replies / forum / is_hot 列）",
    "access": "read",
    "domain": "bbs.hupu.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of threads (1-100)"
      }
    ],
    "columns": [
      "rank",
      "tid",
      "title",
      "lights",
      "replies",
      "forum",
      "is_hot",
      "url"
    ],
    "type": "js",
    "modulePath": "hupu/hot.js",
    "sourceFile": "hupu/hot.js"
  },
  {
    "site": "hupu",
    "name": "like",
    "description": "点赞虎扑回复 (需要登录)",
    "access": "write",
    "domain": "bbs.hupu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "tid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "帖子ID（9位数字）"
      },
      {
        "name": "pid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "回复ID"
      },
      {
        "name": "fid",
        "type": "str",
        "required": true,
        "help": "板块ID（如278汽车区）"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "hupu/like.js",
    "sourceFile": "hupu/like.js",
    "navigateBefore": false
  },
  {
    "site": "hupu",
    "name": "mentions",
    "aliases": [
      "mention"
    ],
    "description": "查看虎扑提到我的回复 (需要登录)",
    "access": "read",
    "domain": "my.hupu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "最多返回多少条消息"
      },
      {
        "name": "max_pages",
        "type": "int",
        "default": 3,
        "required": false,
        "help": "最多抓取多少页"
      },
      {
        "name": "page_str",
        "type": "str",
        "required": false,
        "help": "分页游标；不传时从第一页开始"
      }
    ],
    "columns": [
      "time",
      "username",
      "thread_title",
      "tid",
      "pid",
      "post_content",
      "quote_content",
      "url",
      "reply_url"
    ],
    "type": "js",
    "modulePath": "hupu/mentions.js",
    "sourceFile": "hupu/mentions.js",
    "navigateBefore": false
  },
  {
    "site": "hupu",
    "name": "reply",
    "description": "回复虎扑帖子 (需要登录)",
    "access": "write",
    "domain": "bbs.hupu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "tid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "帖子ID（9位数字）"
      },
      {
        "name": "topic_id",
        "type": "str",
        "required": true,
        "help": "板块ID，即接口中的 topicId（如 502 篮球资讯）"
      },
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "回复内容"
      },
      {
        "name": "quote_id",
        "type": "str",
        "required": false,
        "help": "被引用回复的 pid；填写后会以“回复某条热门回复”的方式发言"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "hupu/reply.js",
    "sourceFile": "hupu/reply.js",
    "navigateBefore": false
  },
  {
    "site": "hupu",
    "name": "search",
    "description": "搜索虎扑帖子 (使用官方API)",
    "access": "read",
    "domain": "bbs.hupu.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "结果页码"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回结果数量"
      },
      {
        "name": "forum",
        "type": "str",
        "required": false,
        "help": "板块ID过滤 (可选)"
      },
      {
        "name": "sort",
        "type": "str",
        "default": "general",
        "required": false,
        "help": "排序方式: general/createtime/replytime/light/reply"
      }
    ],
    "columns": [
      "rank",
      "tid",
      "title",
      "author",
      "replies",
      "lights",
      "forum",
      "url"
    ],
    "type": "js",
    "modulePath": "hupu/search.js",
    "sourceFile": "hupu/search.js"
  },
  {
    "site": "hupu",
    "name": "unlike",
    "description": "取消点赞虎扑回复 (需要登录)",
    "access": "write",
    "domain": "bbs.hupu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "tid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "帖子ID（9位数字）"
      },
      {
        "name": "pid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "回复ID"
      },
      {
        "name": "fid",
        "type": "str",
        "required": true,
        "help": "板块ID（如278汽车区）"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "hupu/unlike.js",
    "sourceFile": "hupu/unlike.js",
    "navigateBefore": false
  },
  {
    "site": "imdb",
    "name": "person",
    "description": "Get actor or director info",
    "access": "read",
    "domain": "www.imdb.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "IMDb person ID (nm0634240) or URL"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max filmography entries"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "imdb/person.js",
    "sourceFile": "imdb/person.js"
  },
  {
    "site": "imdb",
    "name": "reviews",
    "description": "Get user reviews for a movie or TV show",
    "access": "read",
    "domain": "www.imdb.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "IMDb title ID (tt1375666) or URL"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of reviews"
      }
    ],
    "columns": [
      "rank",
      "title",
      "rating",
      "author",
      "date",
      "text"
    ],
    "type": "js",
    "modulePath": "imdb/reviews.js",
    "sourceFile": "imdb/reviews.js"
  },
  {
    "site": "imdb",
    "name": "search",
    "description": "Search IMDb for movies, TV shows, and people",
    "access": "read",
    "domain": "www.imdb.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "year",
      "type",
      "url"
    ],
    "type": "js",
    "modulePath": "imdb/search.js",
    "sourceFile": "imdb/search.js"
  },
  {
    "site": "imdb",
    "name": "title",
    "description": "Get movie or TV show details",
    "access": "read",
    "domain": "www.imdb.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "IMDb title ID (tt1375666) or URL"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "imdb/title.js",
    "sourceFile": "imdb/title.js"
  },
  {
    "site": "imdb",
    "name": "top",
    "description": "IMDb Top 250 Movies",
    "access": "read",
    "domain": "www.imdb.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "rating",
      "votes",
      "genre",
      "url"
    ],
    "type": "js",
    "modulePath": "imdb/top.js",
    "sourceFile": "imdb/top.js"
  },
  {
    "site": "imdb",
    "name": "trending",
    "description": "IMDb Most Popular Movies",
    "access": "read",
    "domain": "www.imdb.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "rating",
      "genre",
      "url"
    ],
    "type": "js",
    "modulePath": "imdb/trending.js",
    "sourceFile": "imdb/trending.js"
  },
  {
    "site": "indeed",
    "name": "job",
    "aliases": [
      "detail",
      "view"
    ],
    "description": "Read the full Indeed job posting by jk (job key)",
    "access": "read",
    "domain": "www.indeed.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Job key (16-char hex from `indeed search`, e.g. \"dccc07ac5a6a3683\")"
      }
    ],
    "columns": [
      "id",
      "title",
      "company",
      "location",
      "salary",
      "job_type",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "indeed/job.js",
    "sourceFile": "indeed/job.js",
    "navigateBefore": false
  },
  {
    "site": "indeed",
    "name": "search",
    "description": "Indeed keyword job search (rendered DOM via browser session, US site)",
    "access": "read",
    "domain": "www.indeed.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Job keyword (title / skill / company)"
      },
      {
        "name": "location",
        "type": "string",
        "default": "",
        "required": false,
        "help": "Location filter (e.g. \"remote\", \"New York, NY\", \"San Francisco\")"
      },
      {
        "name": "fromage",
        "type": "string",
        "default": "",
        "required": false,
        "help": "Recency filter, days back: 1 / 3 / 7 / 14"
      },
      {
        "name": "sort",
        "type": "string",
        "default": "relevance",
        "required": false,
        "help": "Sort order: relevance | date"
      },
      {
        "name": "start",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Pagination offset (multiple of 10, 0-based)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Max rows to return (1-25, capped at one page)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "company",
      "location",
      "salary",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "indeed/search.js",
    "sourceFile": "indeed/search.js",
    "navigateBefore": false
  },
  {
    "site": "instagram",
    "name": "collection-create",
    "description": "Create a new Instagram saved-posts collection (folder)",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Name of the collection to create"
      }
    ],
    "columns": [
      "status",
      "collectionId",
      "collectionName",
      "mediaCount"
    ],
    "type": "js",
    "modulePath": "instagram/collection-create.js",
    "sourceFile": "instagram/collection-create.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "collection-delete",
    "description": "Delete an Instagram saved-posts collection (folder) by name or id",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "target",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Collection name (case-insensitive) or numeric collection_id"
      }
    ],
    "columns": [
      "status",
      "collectionId",
      "collectionName"
    ],
    "type": "js",
    "modulePath": "instagram/collection-delete.js",
    "sourceFile": "instagram/collection-delete.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "comment",
    "description": "Comment on an Instagram post",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username of the post author"
      },
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Comment text"
      },
      {
        "name": "index",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Post index (1 = most recent)"
      }
    ],
    "columns": [
      "status",
      "user",
      "text"
    ],
    "type": "js",
    "modulePath": "instagram/comment.js",
    "sourceFile": "instagram/comment.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "download",
    "description": "Download images and videos from Instagram posts and reels",
    "access": "read",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Instagram post / reel / tv URL"
      },
      {
        "name": "path",
        "type": "str",
        "default": "~/Downloads/Instagram",
        "required": false,
        "help": "Download directory"
      }
    ],
    "type": "js",
    "modulePath": "instagram/download.js",
    "sourceFile": "instagram/download.js",
    "navigateBefore": false
  },
  {
    "site": "instagram",
    "name": "explore",
    "description": "Instagram explore/discover trending posts",
    "access": "read",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "rank",
      "user",
      "caption",
      "likes",
      "comments",
      "type"
    ],
    "type": "js",
    "modulePath": "instagram/explore.js",
    "sourceFile": "instagram/explore.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "follow",
    "description": "Follow an Instagram user",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Instagram username to follow"
      }
    ],
    "columns": [
      "status",
      "username"
    ],
    "type": "js",
    "modulePath": "instagram/follow.js",
    "sourceFile": "instagram/follow.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "followers",
    "description": "List followers of an Instagram user",
    "access": "read",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Instagram username"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of followers"
      }
    ],
    "columns": [
      "rank",
      "username",
      "name",
      "verified",
      "private"
    ],
    "type": "js",
    "modulePath": "instagram/followers.js",
    "sourceFile": "instagram/followers.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "following",
    "description": "List accounts an Instagram user is following",
    "access": "read",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Instagram username"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of accounts"
      }
    ],
    "columns": [
      "rank",
      "username",
      "name",
      "verified",
      "private"
    ],
    "type": "js",
    "modulePath": "instagram/following.js",
    "sourceFile": "instagram/following.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "like",
    "description": "Like an Instagram post",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username of the post author"
      },
      {
        "name": "index",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Post index (1 = most recent)"
      }
    ],
    "columns": [
      "status",
      "user",
      "post"
    ],
    "type": "js",
    "modulePath": "instagram/like.js",
    "sourceFile": "instagram/like.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "note",
    "description": "Publish a text Instagram note",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "content",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Note text (max 60 characters)"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds for the overall command (default: 120)"
      }
    ],
    "columns": [
      "status",
      "detail",
      "noteId"
    ],
    "type": "js",
    "modulePath": "instagram/note.js",
    "sourceFile": "instagram/note.js",
    "navigateBefore": true
  },
  {
    "site": "instagram",
    "name": "post",
    "description": "Post an Instagram feed image or mixed-media carousel",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "media",
        "type": "str",
        "required": false,
        "valueRequired": true,
        "help": "Comma-separated media paths (images/videos, up to 10)"
      },
      {
        "name": "content",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Caption text"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 300,
        "required": false,
        "help": "Max seconds for the overall command (default: 300)"
      }
    ],
    "columns": [
      "status",
      "detail",
      "url"
    ],
    "type": "js",
    "modulePath": "instagram/post.js",
    "sourceFile": "instagram/post.js",
    "navigateBefore": true
  },
  {
    "site": "instagram",
    "name": "profile",
    "description": "Get Instagram user profile info",
    "access": "read",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Instagram username"
      }
    ],
    "columns": [
      "username",
      "name",
      "followers",
      "following",
      "posts",
      "verified",
      "bio"
    ],
    "type": "js",
    "modulePath": "instagram/profile.js",
    "sourceFile": "instagram/profile.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "reel",
    "description": "Post an Instagram reel video",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "video",
        "type": "str",
        "required": false,
        "valueRequired": true,
        "help": "Path to a single .mp4 video file"
      },
      {
        "name": "content",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Caption text"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 600,
        "required": false,
        "help": "Max seconds for the overall command (default: 600)"
      }
    ],
    "columns": [
      "status",
      "detail",
      "url"
    ],
    "type": "js",
    "modulePath": "instagram/reel.js",
    "sourceFile": "instagram/reel.js",
    "navigateBefore": true
  },
  {
    "site": "instagram",
    "name": "save",
    "description": "Save (bookmark) an Instagram post",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username of the post author"
      },
      {
        "name": "index",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Post index (1 = most recent)"
      }
    ],
    "columns": [
      "status",
      "user",
      "post"
    ],
    "type": "js",
    "modulePath": "instagram/save.js",
    "sourceFile": "instagram/save.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "saved",
    "description": "Get your saved Instagram posts (optionally from a specific collection)",
    "access": "read",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of saved posts"
      },
      {
        "name": "collection",
        "type": "str",
        "required": false,
        "help": "Collection name (case-insensitive). Omit for the default \"All posts\" feed."
      }
    ],
    "columns": [
      "index",
      "user",
      "caption",
      "likes",
      "comments",
      "type"
    ],
    "type": "js",
    "modulePath": "instagram/saved.js",
    "sourceFile": "instagram/saved.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "search",
    "description": "Search Instagram users",
    "access": "read",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "username",
      "name",
      "verified",
      "private",
      "url"
    ],
    "type": "js",
    "modulePath": "instagram/search.js",
    "sourceFile": "instagram/search.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "story",
    "description": "Post a single Instagram story image or video",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "media",
        "type": "str",
        "required": false,
        "valueRequired": true,
        "help": "Path to a single story image or video file"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 300,
        "required": false,
        "help": "Max seconds for the overall command (default: 300)"
      }
    ],
    "columns": [
      "status",
      "detail",
      "url"
    ],
    "type": "js",
    "modulePath": "instagram/story.js",
    "sourceFile": "instagram/story.js",
    "navigateBefore": true
  },
  {
    "site": "instagram",
    "name": "unfollow",
    "description": "Unfollow an Instagram user",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Instagram username to unfollow"
      }
    ],
    "columns": [
      "status",
      "username"
    ],
    "type": "js",
    "modulePath": "instagram/unfollow.js",
    "sourceFile": "instagram/unfollow.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "unlike",
    "description": "Unlike an Instagram post",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username of the post author"
      },
      {
        "name": "index",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Post index (1 = most recent)"
      }
    ],
    "columns": [
      "status",
      "user",
      "post"
    ],
    "type": "js",
    "modulePath": "instagram/unlike.js",
    "sourceFile": "instagram/unlike.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "unsave",
    "description": "Unsave (remove bookmark) an Instagram post",
    "access": "write",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username of the post author"
      },
      {
        "name": "index",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Post index (1 = most recent)"
      }
    ],
    "columns": [
      "status",
      "user",
      "post"
    ],
    "type": "js",
    "modulePath": "instagram/unsave.js",
    "sourceFile": "instagram/unsave.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "instagram",
    "name": "user",
    "description": "Get recent posts from an Instagram user",
    "access": "read",
    "domain": "www.instagram.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Instagram username"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 12,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "index",
      "caption",
      "likes",
      "comments",
      "type",
      "date"
    ],
    "type": "js",
    "modulePath": "instagram/user.js",
    "sourceFile": "instagram/user.js",
    "navigateBefore": "https://www.instagram.com"
  },
  {
    "site": "jd",
    "name": "add-cart",
    "description": "京东加入购物车",
    "access": "write",
    "domain": "item.jd.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "sku",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品 SKU ID"
      },
      {
        "name": "num",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "数量"
      },
      {
        "name": "dry-run",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "仅预览，不实际加入购物车"
      }
    ],
    "columns": [
      "status",
      "title",
      "price",
      "sku"
    ],
    "type": "js",
    "modulePath": "jd/add-cart.js",
    "sourceFile": "jd/add-cart.js",
    "navigateBefore": false
  },
  {
    "site": "jd",
    "name": "cart",
    "description": "查看京东购物车",
    "access": "read",
    "domain": "cart.jd.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "index",
      "title",
      "price",
      "quantity",
      "sku"
    ],
    "type": "js",
    "modulePath": "jd/cart.js",
    "sourceFile": "jd/cart.js",
    "navigateBefore": false
  },
  {
    "site": "jd",
    "name": "detail",
    "description": "京东商品详情",
    "access": "read",
    "domain": "item.jd.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "sku",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品 SKU ID"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "jd/detail.js",
    "sourceFile": "jd/detail.js",
    "navigateBefore": false
  },
  {
    "site": "jd",
    "name": "item",
    "description": "京东商品详情（价格、店铺、规格参数、主图、详情图）",
    "access": "read",
    "domain": "item.jd.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "sku",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品 SKU ID（如 100291143898）"
      },
      {
        "name": "images",
        "type": "int",
        "default": 200,
        "required": false,
        "help": "图片数量上限（默认200）"
      }
    ],
    "columns": [
      "title",
      "price",
      "shop",
      "specs",
      "mainImages",
      "detailImages"
    ],
    "type": "js",
    "modulePath": "jd/item.js",
    "sourceFile": "jd/item.js",
    "navigateBefore": "https://item.jd.com"
  },
  {
    "site": "jd",
    "name": "reviews",
    "description": "京东商品评价",
    "access": "read",
    "domain": "item.jd.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "sku",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品 SKU ID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回评价数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "user",
      "content",
      "date"
    ],
    "type": "js",
    "modulePath": "jd/reviews.js",
    "sourceFile": "jd/reviews.js",
    "navigateBefore": false
  },
  {
    "site": "jd",
    "name": "search",
    "description": "京东商品搜索",
    "access": "read",
    "domain": "search.jd.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 30)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "price",
      "shop",
      "sku",
      "url"
    ],
    "type": "js",
    "modulePath": "jd/search.js",
    "sourceFile": "jd/search.js",
    "navigateBefore": false
  },
  {
    "site": "jianyu",
    "name": "detail",
    "description": "读取剑鱼标讯详情页并抽取证据字段",
    "access": "read",
    "domain": "www.jianyu360.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Detail page URL from jianyu/search"
      },
      {
        "name": "query",
        "type": "str",
        "required": false,
        "help": "Optional query for evidence ranking"
      }
    ],
    "columns": [
      "title",
      "publish_time",
      "content_type",
      "project_code",
      "budget_or_limit",
      "deadline_or_open_time",
      "url"
    ],
    "type": "js",
    "modulePath": "jianyu/detail.js",
    "sourceFile": "jianyu/detail.js",
    "navigateBefore": "https://www.jianyu360.cn"
  },
  {
    "site": "jianyu",
    "name": "search",
    "description": "搜索剑鱼标讯公告",
    "access": "read",
    "domain": "www.jianyu360.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword, e.g. \"procurement\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results (max 50)"
      },
      {
        "name": "since_days",
        "type": "int",
        "required": false,
        "help": "Only keep rows published within N days"
      }
    ],
    "columns": [
      "rank",
      "content_type",
      "title",
      "published_at",
      "detail_status",
      "project_code",
      "budget_or_limit",
      "url"
    ],
    "type": "js",
    "modulePath": "jianyu/search.js",
    "sourceFile": "jianyu/search.js",
    "navigateBefore": "https://www.jianyu360.cn"
  },
  {
    "site": "jike",
    "name": "comment",
    "description": "评论即刻帖子",
    "access": "write",
    "domain": "web.okjike.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "帖子 ID"
      },
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "评论内容"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "jike/comment.js",
    "sourceFile": "jike/comment.js",
    "navigateBefore": true
  },
  {
    "site": "jike",
    "name": "create",
    "description": "发布即刻动态",
    "access": "write",
    "domain": "web.okjike.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "动态正文内容"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "jike/create.js",
    "sourceFile": "jike/create.js",
    "navigateBefore": true
  },
  {
    "site": "jike",
    "name": "feed",
    "description": "即刻首页动态流",
    "access": "read",
    "domain": "web.okjike.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "id",
      "author",
      "content",
      "likes",
      "comments",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "jike/feed.js",
    "sourceFile": "jike/feed.js",
    "navigateBefore": "https://web.okjike.com"
  },
  {
    "site": "jike",
    "name": "like",
    "description": "点赞即刻帖子",
    "access": "write",
    "domain": "web.okjike.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "帖子 ID"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "jike/like.js",
    "sourceFile": "jike/like.js",
    "navigateBefore": true
  },
  {
    "site": "jike",
    "name": "notifications",
    "description": "即刻通知",
    "access": "read",
    "domain": "web.okjike.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "type",
      "user",
      "content",
      "time"
    ],
    "type": "js",
    "modulePath": "jike/notifications.js",
    "sourceFile": "jike/notifications.js",
    "navigateBefore": "https://web.okjike.com"
  },
  {
    "site": "jike",
    "name": "post",
    "description": "即刻帖子详情及评论",
    "access": "read",
    "domain": "m.okjike.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Post ID (from post URL)"
      }
    ],
    "columns": [
      "type",
      "author",
      "content",
      "likes",
      "time"
    ],
    "type": "js",
    "modulePath": "jike/post.js",
    "sourceFile": "jike/post.js",
    "navigateBefore": "https://m.okjike.com"
  },
  {
    "site": "jike",
    "name": "repost",
    "description": "转发即刻帖子",
    "access": "write",
    "domain": "web.okjike.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "帖子 ID"
      },
      {
        "name": "text",
        "type": "string",
        "required": false,
        "positional": true,
        "help": "转发附言（可选）"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "jike/repost.js",
    "sourceFile": "jike/repost.js",
    "navigateBefore": true
  },
  {
    "site": "jike",
    "name": "search",
    "description": "搜索即刻帖子",
    "access": "read",
    "domain": "web.okjike.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "即刻搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "id",
      "author",
      "content",
      "likes",
      "comments",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "jike/search.js",
    "sourceFile": "jike/search.js",
    "navigateBefore": "https://web.okjike.com"
  },
  {
    "site": "jike",
    "name": "topic",
    "description": "即刻话题/圈子帖子",
    "access": "read",
    "domain": "m.okjike.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Topic ID (from topic URL, e.g. 553870e8e4b0cafb0a1bef68)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "content",
      "author",
      "likes",
      "comments",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "jike/topic.js",
    "sourceFile": "jike/topic.js",
    "navigateBefore": "https://m.okjike.com"
  },
  {
    "site": "jike",
    "name": "user",
    "description": "即刻用户动态",
    "access": "read",
    "domain": "m.okjike.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Username from profile URL (e.g. wenhao1996)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "id",
      "content",
      "type",
      "likes",
      "comments",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "jike/user.js",
    "sourceFile": "jike/user.js",
    "navigateBefore": "https://m.okjike.com"
  },
  {
    "site": "jimeng",
    "name": "generate",
    "description": "即梦AI 文生图 — 输入 prompt 生成图片",
    "access": "write",
    "domain": "jimeng.jianying.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "图片描述 prompt"
      },
      {
        "name": "model",
        "type": "string",
        "default": "high_aes_general_v50",
        "required": false,
        "help": "模型: high_aes_general_v50 (5.0 Lite), high_aes_general_v42 (4.6), high_aes_general_v40 (4.0)"
      },
      {
        "name": "wait",
        "type": "int",
        "default": 40,
        "required": false,
        "help": "等待生成完成的秒数"
      }
    ],
    "columns": [
      "status",
      "prompt",
      "image_count",
      "image_urls"
    ],
    "type": "js",
    "modulePath": "jimeng/generate.js",
    "sourceFile": "jimeng/generate.js",
    "navigateBefore": "https://jimeng.jianying.com"
  },
  {
    "site": "jimeng",
    "name": "history",
    "description": "即梦AI 查看最近生成的作品",
    "access": "read",
    "domain": "jimeng.jianying.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 5,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "prompt",
      "model",
      "status",
      "image_url",
      "created_at"
    ],
    "type": "js",
    "modulePath": "jimeng/history.js",
    "sourceFile": "jimeng/history.js",
    "navigateBefore": "https://jimeng.jianying.com"
  },
  {
    "site": "jimeng",
    "name": "new",
    "description": "即梦AI 新建会话（workspace）",
    "access": "write",
    "domain": "jimeng.jianying.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "workspace_id",
      "workspace_url"
    ],
    "type": "js",
    "modulePath": "jimeng/new.js",
    "sourceFile": "jimeng/new.js",
    "navigateBefore": "https://jimeng.jianying.com"
  },
  {
    "site": "jimeng",
    "name": "workspaces",
    "description": "即梦AI 查看所有工作区（会话窗口）",
    "access": "read",
    "domain": "jimeng.jianying.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "workspace_id",
      "name",
      "is_pinned",
      "updated_at"
    ],
    "type": "js",
    "modulePath": "jimeng/workspaces.js",
    "sourceFile": "jimeng/workspaces.js",
    "navigateBefore": "https://jimeng.jianying.com"
  },
  {
    "site": "ke",
    "name": "chengjiao",
    "description": "贝壳找房成交记录",
    "access": "read",
    "domain": "ke.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "city",
        "type": "str",
        "default": "bj",
        "required": false,
        "help": "城市代码，如 bj(北京), sh(上海), gz(广州), sz(深圳), zs(中山)"
      },
      {
        "name": "district",
        "type": "str",
        "required": false,
        "help": "区域拼音，如 chaoyang, haidian"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量"
      }
    ],
    "columns": [
      "title",
      "community",
      "layout",
      "area",
      "deal_price",
      "unit_price",
      "deal_date"
    ],
    "type": "js",
    "modulePath": "ke/chengjiao.js",
    "sourceFile": "ke/chengjiao.js",
    "navigateBefore": "https://ke.com"
  },
  {
    "site": "ke",
    "name": "ershoufang",
    "description": "贝壳找房二手房列表",
    "access": "read",
    "domain": "ke.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "city",
        "type": "str",
        "default": "bj",
        "required": false,
        "help": "城市代码，如 bj(北京), sh(上海), gz(广州), sz(深圳), zs(中山)"
      },
      {
        "name": "district",
        "type": "str",
        "required": false,
        "help": "区域拼音，如 chaoyang, haidian, tianhe"
      },
      {
        "name": "min-price",
        "type": "int",
        "required": false,
        "help": "最低总价（万元）"
      },
      {
        "name": "max-price",
        "type": "int",
        "required": false,
        "help": "最高总价（万元）"
      },
      {
        "name": "rooms",
        "type": "int",
        "required": false,
        "help": "几居室 (1-5)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量"
      }
    ],
    "columns": [
      "title",
      "community",
      "layout",
      "area",
      "direction",
      "total_price",
      "unit_price",
      "url"
    ],
    "type": "js",
    "modulePath": "ke/ershoufang.js",
    "sourceFile": "ke/ershoufang.js",
    "navigateBefore": "https://ke.com"
  },
  {
    "site": "ke",
    "name": "xiaoqu",
    "description": "贝壳找房小区列表",
    "access": "read",
    "domain": "ke.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "city",
        "type": "str",
        "default": "bj",
        "required": false,
        "help": "城市代码，如 bj(北京), sh(上海), gz(广州), sz(深圳), zs(中山)"
      },
      {
        "name": "district",
        "type": "str",
        "required": false,
        "help": "区域拼音，如 chaoyang, haidian"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量"
      }
    ],
    "columns": [
      "name",
      "district",
      "avg_price",
      "year",
      "on_sale"
    ],
    "type": "js",
    "modulePath": "ke/xiaoqu.js",
    "sourceFile": "ke/xiaoqu.js",
    "navigateBefore": "https://ke.com"
  },
  {
    "site": "ke",
    "name": "zufang",
    "description": "贝壳找房租房列表",
    "access": "read",
    "domain": "ke.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "city",
        "type": "str",
        "default": "bj",
        "required": false,
        "help": "城市代码，如 bj(北京), sh(上海), gz(广州), sz(深圳), zs(中山)"
      },
      {
        "name": "district",
        "type": "str",
        "required": false,
        "help": "区域拼音，如 chaoyang, haidian"
      },
      {
        "name": "min-price",
        "type": "int",
        "required": false,
        "help": "最低月租（元）"
      },
      {
        "name": "max-price",
        "type": "int",
        "required": false,
        "help": "最高月租（元）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量"
      }
    ],
    "columns": [
      "title",
      "community",
      "area",
      "layout",
      "price",
      "url"
    ],
    "type": "js",
    "modulePath": "ke/zufang.js",
    "sourceFile": "ke/zufang.js",
    "navigateBefore": "https://ke.com"
  },
  {
    "site": "lesswrong",
    "name": "comments",
    "description": "Top comments on a post",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "url-or-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Post URL or LessWrong post ID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Number of comments"
      }
    ],
    "columns": [
      "rank",
      "score",
      "author",
      "text"
    ],
    "type": "js",
    "modulePath": "lesswrong/comments.js",
    "sourceFile": "lesswrong/comments.js"
  },
  {
    "site": "lesswrong",
    "name": "curated",
    "description": "Curated editor's picks",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/curated.js",
    "sourceFile": "lesswrong/curated.js"
  },
  {
    "site": "lesswrong",
    "name": "frontpage",
    "description": "Algorithmic frontpage",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/frontpage.js",
    "sourceFile": "lesswrong/frontpage.js"
  },
  {
    "site": "lesswrong",
    "name": "new",
    "description": "Latest posts",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/new.js",
    "sourceFile": "lesswrong/new.js"
  },
  {
    "site": "lesswrong",
    "name": "read",
    "description": "Read full post by URL or ID",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "url-or-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Post URL or LessWrong post ID"
      }
    ],
    "columns": [
      "title",
      "author",
      "karma",
      "comments",
      "tags",
      "content",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/read.js",
    "sourceFile": "lesswrong/read.js"
  },
  {
    "site": "lesswrong",
    "name": "sequences",
    "description": "List post collections",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author"
    ],
    "type": "js",
    "modulePath": "lesswrong/sequences.js",
    "sourceFile": "lesswrong/sequences.js"
  },
  {
    "site": "lesswrong",
    "name": "shortform",
    "description": "Quick takes / shortform posts",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/shortform.js",
    "sourceFile": "lesswrong/shortform.js"
  },
  {
    "site": "lesswrong",
    "name": "tag",
    "description": "Posts by tag",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "tag",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Tag slug or name"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/tag.js",
    "sourceFile": "lesswrong/tag.js"
  },
  {
    "site": "lesswrong",
    "name": "tags",
    "description": "List popular tags",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "name",
      "posts"
    ],
    "type": "js",
    "modulePath": "lesswrong/tags.js",
    "sourceFile": "lesswrong/tags.js"
  },
  {
    "site": "lesswrong",
    "name": "top",
    "description": "Top all-time",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/top.js",
    "sourceFile": "lesswrong/top.js"
  },
  {
    "site": "lesswrong",
    "name": "top-month",
    "description": "Top this month",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/top-month.js",
    "sourceFile": "lesswrong/top-month.js"
  },
  {
    "site": "lesswrong",
    "name": "top-week",
    "description": "Top this week",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/top-week.js",
    "sourceFile": "lesswrong/top-week.js"
  },
  {
    "site": "lesswrong",
    "name": "top-year",
    "description": "Top this year",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "karma",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/top-year.js",
    "sourceFile": "lesswrong/top-year.js"
  },
  {
    "site": "lesswrong",
    "name": "user",
    "description": "User profile",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "LessWrong username or slug"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "lesswrong/user.js",
    "sourceFile": "lesswrong/user.js"
  },
  {
    "site": "lesswrong",
    "name": "user-posts",
    "description": "List a user's posts",
    "access": "read",
    "domain": "www.lesswrong.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "LessWrong username or slug"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "karma",
      "comments",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "lesswrong/user-posts.js",
    "sourceFile": "lesswrong/user-posts.js"
  },
  {
    "site": "lichess",
    "name": "top",
    "description": "Top-N Lichess leaderboard for a perf type (bullet/blitz/rapid/classical/...)",
    "access": "read",
    "domain": "lichess.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "perf",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Perf type (bullet, blitz, rapid, classical, ultraBullet, chess960, ...)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Top-N rows (1-200)"
      }
    ],
    "columns": [
      "rank",
      "username",
      "id",
      "title",
      "rating",
      "progress",
      "patron",
      "url"
    ],
    "type": "js",
    "modulePath": "lichess/top.js",
    "sourceFile": "lichess/top.js"
  },
  {
    "site": "lichess",
    "name": "user",
    "description": "Fetch a Lichess player profile by username (rating, perfs, counts)",
    "access": "read",
    "domain": "lichess.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Lichess username (case-insensitive)"
      }
    ],
    "columns": [
      "username",
      "id",
      "title",
      "patron",
      "online",
      "tosViolation",
      "createdAt",
      "seenAt",
      "gamesAll",
      "gamesWin",
      "gamesLoss",
      "gamesDraw",
      "topPerfName",
      "topPerfRating",
      "topPerfGames",
      "fideRating",
      "country",
      "bio",
      "url"
    ],
    "type": "js",
    "modulePath": "lichess/user.js",
    "sourceFile": "lichess/user.js"
  },
  {
    "site": "linkedin",
    "name": "connect",
    "description": "Fail-closed LinkedIn connection request sender that verifies the exact profile before optionally sending a note",
    "access": "write",
    "domain": "www.linkedin.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "profile-url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Exact LinkedIn profile URL to open and verify"
      },
      {
        "name": "expected-name",
        "type": "string",
        "required": true,
        "help": "Expected visible profile name"
      },
      {
        "name": "note",
        "type": "string",
        "default": "",
        "required": false,
        "help": "Optional connection note, max 300 chars"
      },
      {
        "name": "send",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Actually click Send. Default is dry-run verification only."
      }
    ],
    "columns": [
      "status",
      "recipient",
      "reason",
      "profile_url",
      "note_chars",
      "connectable",
      "delivery_verified",
      "matched_invitation_name",
      "matched_invitation_url",
      "actualValue",
      "blockReason",
      "expectedValue",
      "observedUrl",
      "safety"
    ],
    "type": "js",
    "modulePath": "linkedin/connect.js",
    "sourceFile": "linkedin/connect.js",
    "navigateBefore": true
  },
  {
    "site": "linkedin",
    "name": "inbox",
    "description": "List LinkedIn messaging inbox conversations and unread messages",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 40,
        "required": false,
        "help": "Maximum conversations to return (1-100)"
      },
      {
        "name": "unread-only",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Return only conversations with unread messages"
      }
    ],
    "columns": [
      "rank",
      "thread_url",
      "thread_id",
      "person_name",
      "last_message_preview",
      "unread",
      "counterparty_type",
      "category",
      "timestamp"
    ],
    "type": "js",
    "modulePath": "linkedin/inbox.js",
    "sourceFile": "linkedin/inbox.js",
    "navigateBefore": "https://www.linkedin.com"
  },
  {
    "site": "linkedin",
    "name": "people-search",
    "description": "Search standard LinkedIn (not Sales Navigator) for people by keyword. Each invocation consumes against LinkedIn's monthly Commercial Use Limit on people search; throttle accordingly.",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "keywords",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "People search keywords, e.g. \"site reliability engineer berlin\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Maximum people to return (1-10); each query counts toward LinkedIn's monthly CUL"
      }
    ],
    "columns": [
      "rank",
      "name",
      "headline",
      "location",
      "profile_url"
    ],
    "type": "js",
    "modulePath": "linkedin/people-search.js",
    "sourceFile": "linkedin/people-search.js",
    "navigateBefore": "https://www.linkedin.com"
  },
  {
    "site": "linkedin",
    "name": "safe-send",
    "description": "Fail-closed LinkedIn message sender that verifies exact thread, recipient, and latest message before filling/sending",
    "access": "write",
    "domain": "www.linkedin.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "thread-url",
        "type": "str",
        "required": true,
        "help": "Exact LinkedIn messaging thread URL to open and verify"
      },
      {
        "name": "expected-name",
        "type": "str",
        "required": true,
        "help": "Expected visible recipient name in the active thread header"
      },
      {
        "name": "message",
        "type": "str",
        "required": true,
        "help": "Message body to send or dry-run"
      },
      {
        "name": "expected-last-text",
        "type": "str",
        "required": false,
        "help": "Substring expected in the currently visible latest conversation context"
      },
      {
        "name": "expected-last-hash",
        "type": "str",
        "required": false,
        "help": "SHA-256 hash of expected latest visible message text"
      },
      {
        "name": "send",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Actually click Send. Default is dry-run verification only."
      },
      {
        "name": "screenshot",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Capture a screenshot during verification"
      }
    ],
    "columns": [
      "status",
      "recipient",
      "reason",
      "thread_url",
      "message_chars",
      "screenshot"
    ],
    "type": "js",
    "modulePath": "linkedin/safe-send.js",
    "sourceFile": "linkedin/safe-send.js",
    "navigateBefore": true
  },
  {
    "site": "linkedin",
    "name": "salesnav-inbox",
    "description": "List LinkedIn Sales Navigator message conversations with API pagination",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "number",
        "default": 40,
        "required": false,
        "help": "Maximum conversations to return (1-500)"
      },
      {
        "name": "max-pages",
        "type": "number",
        "default": 30,
        "required": false,
        "help": "Maximum Sales Navigator API pages to fetch"
      },
      {
        "name": "unread-only",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Return only unread conversations"
      }
    ],
    "columns": [
      "rank",
      "thread_id",
      "thread_url",
      "person_name",
      "last_message_snippet",
      "last_activity_time",
      "unread",
      "unread_count",
      "total_message_count",
      "archived",
      "participants",
      "next_page_starts_at"
    ],
    "type": "js",
    "modulePath": "linkedin/salesnav-inbox.js",
    "sourceFile": "linkedin/salesnav-inbox.js",
    "navigateBefore": true
  },
  {
    "site": "linkedin",
    "name": "salesnav-message",
    "description": "Send or dry-run a LinkedIn Sales Navigator InMail to a lead using the Sales Navigator messaging API",
    "access": "write",
    "domain": "www.linkedin.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "recipient",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Sales Navigator lead URL, LinkedIn /in/ URL from salesnav-search, or urn:li:fs_salesProfile:(...)"
      },
      {
        "name": "subject",
        "type": "string",
        "required": true,
        "help": "InMail subject"
      },
      {
        "name": "body",
        "type": "string",
        "required": true,
        "help": "InMail body"
      },
      {
        "name": "send",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Actually send the InMail. Default is dry-run validation only."
      },
      {
        "name": "copy-to-crm",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Set Sales Navigator copyToCrm on the message request"
      }
    ],
    "columns": [
      "status",
      "recipient",
      "title",
      "company",
      "credits_remaining",
      "credits_before",
      "credits_after",
      "sent_in_salesnav",
      "message_chars",
      "subject_chars",
      "recipient_urn",
      "degree",
      "inmail_restriction",
      "open_link"
    ],
    "type": "js",
    "modulePath": "linkedin/salesnav-message.js",
    "sourceFile": "linkedin/salesnav-message.js",
    "navigateBefore": true
  },
  {
    "site": "linkedin",
    "name": "salesnav-search",
    "description": "Search LinkedIn Sales Navigator for people leads by keyword",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "keywords",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "People search keywords, e.g. \"quality manager food manufacturing\""
      },
      {
        "name": "limit",
        "type": "number",
        "default": 25,
        "required": false,
        "help": "Maximum leads to return (1-500, fetched 25 per request)"
      }
    ],
    "columns": [
      "rank",
      "name",
      "title",
      "company",
      "location",
      "degree",
      "profile_url",
      "lead_url",
      "recipient_urn"
    ],
    "type": "js",
    "modulePath": "linkedin/salesnav-search.js",
    "sourceFile": "linkedin/salesnav-search.js",
    "navigateBefore": true
  },
  {
    "site": "linkedin",
    "name": "salesnav-thread",
    "description": "Return full Sales Navigator message history for a thread id, Sales Navigator inbox URL, lead URL, recipient urn, or exact recipient name",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "thread-or-recipient",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Sales Navigator inbox URL/thread id, Sales Navigator lead URL, recipient urn, or exact participant name"
      },
      {
        "name": "limit",
        "type": "number",
        "default": 200,
        "required": false,
        "help": "Maximum messages to return (1-500)"
      },
      {
        "name": "max-pages",
        "type": "number",
        "default": 30,
        "required": false,
        "help": "Maximum inbox pages to scan when resolving a recipient"
      }
    ],
    "columns": [
      "index",
      "thread_id",
      "thread_url",
      "sender",
      "text",
      "timestamp",
      "subject",
      "message_id",
      "sender_urn",
      "delivered_at",
      "type",
      "total_message_count"
    ],
    "type": "js",
    "modulePath": "linkedin/salesnav-thread.js",
    "sourceFile": "linkedin/salesnav-thread.js",
    "navigateBefore": true
  },
  {
    "site": "linkedin",
    "name": "search",
    "description": "Search LinkedIn jobs",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Job search keywords"
      },
      {
        "name": "location",
        "type": "string",
        "required": false,
        "help": "Location text such as San Francisco Bay Area"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of jobs to return (max 100)"
      },
      {
        "name": "start",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Result offset for pagination"
      },
      {
        "name": "details",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Include full job description and apply URL (slower)"
      },
      {
        "name": "company",
        "type": "string",
        "required": false,
        "help": "Comma-separated company names or LinkedIn company IDs"
      },
      {
        "name": "experience-level",
        "type": "string",
        "required": false,
        "help": "Comma-separated: internship, entry, associate, mid-senior, director, executive"
      },
      {
        "name": "job-type",
        "type": "string",
        "required": false,
        "help": "Comma-separated: full-time, part-time, contract, temporary, volunteer, internship, other"
      },
      {
        "name": "date-posted",
        "type": "string",
        "required": false,
        "help": "One of: any, month, week, 24h"
      },
      {
        "name": "remote",
        "type": "string",
        "required": false,
        "help": "Comma-separated: on-site, hybrid, remote"
      }
    ],
    "columns": [
      "rank",
      "title",
      "company",
      "location",
      "listed",
      "salary",
      "url"
    ],
    "type": "js",
    "modulePath": "linkedin/search.js",
    "sourceFile": "linkedin/search.js",
    "navigateBefore": "https://www.linkedin.com"
  },
  {
    "site": "linkedin",
    "name": "sent-invitations",
    "description": "List pending LinkedIn sent invitations for CRM reconciliation",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "ui",
    "browser": true,
    "args": [],
    "columns": [
      "rank",
      "name",
      "profile_url",
      "invited_date_text"
    ],
    "type": "js",
    "modulePath": "linkedin/sent-invitations.js",
    "sourceFile": "linkedin/sent-invitations.js",
    "navigateBefore": true
  },
  {
    "site": "linkedin",
    "name": "thread-snapshot",
    "description": "Load a LinkedIn messaging thread, scroll for available history, and return a full context snapshot",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "thread-url",
        "type": "str",
        "required": true,
        "help": "Exact LinkedIn messaging thread URL to open and snapshot"
      },
      {
        "name": "max-scrolls",
        "type": "number",
        "default": 30,
        "required": false,
        "help": "Maximum upward scroll attempts to load older messages"
      },
      {
        "name": "json",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Return only JSON snapshot string in the snapshot_json field"
      }
    ],
    "columns": [
      "thread_url",
      "recipient",
      "message_count",
      "latest_text",
      "snapshot_json"
    ],
    "type": "js",
    "modulePath": "linkedin/thread-snapshot.js",
    "sourceFile": "linkedin/thread-snapshot.js",
    "navigateBefore": true
  },
  {
    "site": "linkedin",
    "name": "timeline",
    "description": "Read LinkedIn home timeline posts",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts to return (max 100)"
      }
    ],
    "columns": [
      "rank",
      "author",
      "author_url",
      "headline",
      "text",
      "posted_at",
      "reactions",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "linkedin/timeline.js",
    "sourceFile": "linkedin/timeline.js",
    "navigateBefore": "https://www.linkedin.com"
  },
  {
    "site": "linkedin-learning",
    "name": "course",
    "description": "Get LinkedIn Learning course detail by slug or course URL",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "slug",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Course slug (e.g. agentic-ai-build-your-first-agentic-ai-system) or full /learning/<slug> URL"
      }
    ],
    "columns": [
      "title",
      "slug",
      "description",
      "difficulty",
      "duration_sec",
      "videos_count",
      "rating",
      "rating_count",
      "released",
      "url"
    ],
    "type": "js",
    "modulePath": "linkedin-learning/course.js",
    "sourceFile": "linkedin-learning/course.js",
    "navigateBefore": "https://www.linkedin.com"
  },
  {
    "site": "linkedin-learning",
    "name": "search",
    "description": "Search LinkedIn Learning courses, videos, and learning paths by keyword",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "keywords",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Search keywords, e.g. \"AI agent\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Maximum results to return (1-50)"
      }
    ],
    "columns": [
      "rank",
      "type",
      "title",
      "instructor",
      "difficulty",
      "duration_sec",
      "rating",
      "rating_count",
      "viewers",
      "url"
    ],
    "type": "js",
    "modulePath": "linkedin-learning/search.js",
    "sourceFile": "linkedin-learning/search.js",
    "navigateBefore": "https://www.linkedin.com"
  },
  {
    "site": "linkedin-learning",
    "name": "trending",
    "description": "Browse LinkedIn Learning recommended courses across personalized carousels",
    "access": "read",
    "domain": "www.linkedin.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Maximum results to return (1-50)"
      }
    ],
    "columns": [
      "rank",
      "group",
      "type",
      "title",
      "difficulty",
      "viewers",
      "url"
    ],
    "type": "js",
    "modulePath": "linkedin-learning/trending.js",
    "sourceFile": "linkedin-learning/trending.js",
    "navigateBefore": "https://www.linkedin.com"
  },
  {
    "site": "linux-do",
    "name": "categories",
    "description": "linux.do 分类列表",
    "access": "read",
    "domain": "linux.do",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "subcategories",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Include subcategories"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of categories"
      }
    ],
    "columns": [
      "name",
      "slug",
      "id",
      "topics",
      "description"
    ],
    "type": "js",
    "modulePath": "linux-do/categories.js",
    "sourceFile": "linux-do/categories.js",
    "navigateBefore": "https://linux.do"
  },
  {
    "site": "linux-do",
    "name": "feed",
    "description": "linux.do 话题列表（需登录；支持全站、标签、分类）",
    "access": "read",
    "domain": "linux.do",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "view",
        "type": "str",
        "default": "latest",
        "required": false,
        "help": "View type",
        "choices": [
          "latest",
          "hot",
          "top"
        ]
      },
      {
        "name": "tag",
        "type": "str",
        "required": false,
        "help": "Tag name, slug, or id"
      },
      {
        "name": "category",
        "type": "str",
        "required": false,
        "help": "Category name, slug, id, or parent/name path"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items (per_page)"
      },
      {
        "name": "order",
        "type": "str",
        "default": "default",
        "required": false,
        "help": "Sort order",
        "choices": [
          "default",
          "created",
          "activity",
          "views",
          "posts",
          "category",
          "likes",
          "op_likes",
          "posters"
        ]
      },
      {
        "name": "ascending",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Sort ascending (default: desc)"
      },
      {
        "name": "period",
        "type": "str",
        "required": false,
        "help": "Time period (only for --view top)",
        "choices": [
          "all",
          "daily",
          "weekly",
          "monthly",
          "quarterly",
          "yearly"
        ]
      }
    ],
    "columns": [
      "title",
      "replies",
      "created",
      "likes",
      "views",
      "url"
    ],
    "type": "js",
    "modulePath": "linux-do/categories.js",
    "sourceFile": "linux-do/categories.js",
    "navigateBefore": "https://linux.do"
  },
  {
    "site": "linux-do",
    "name": "search",
    "description": "搜索 linux.do",
    "access": "read",
    "domain": "linux.do",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "views",
      "likes",
      "replies",
      "url"
    ],
    "type": "js",
    "modulePath": "linux-do/search.js",
    "sourceFile": "linux-do/search.js",
    "navigateBefore": "https://linux.do"
  },
  {
    "site": "linux-do",
    "name": "tags",
    "description": "linux.do 标签列表",
    "access": "read",
    "domain": "linux.do",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Number of tags"
      }
    ],
    "columns": [
      "rank",
      "name",
      "slug",
      "count",
      "url"
    ],
    "type": "js",
    "modulePath": "linux-do/tags.js",
    "sourceFile": "linux-do/tags.js",
    "navigateBefore": "https://linux.do"
  },
  {
    "site": "linux-do",
    "name": "topic",
    "description": "linux.do 帖子首页摘要和回复（首屏）",
    "access": "read",
    "domain": "linux.do",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "int",
        "required": true,
        "positional": true,
        "help": "Topic ID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "author",
      "content",
      "likes",
      "created_at"
    ],
    "type": "js",
    "modulePath": "linux-do/topic.js",
    "sourceFile": "linux-do/topic.js",
    "navigateBefore": "https://linux.do"
  },
  {
    "site": "linux-do",
    "name": "topic-content",
    "description": "Get the main topic body as Markdown",
    "access": "read",
    "domain": "linux.do",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "int",
        "required": true,
        "positional": true,
        "help": "Topic ID"
      }
    ],
    "columns": [
      "content"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "linux-do/topic-content.js",
    "sourceFile": "linux-do/topic-content.js",
    "navigateBefore": "https://linux.do"
  },
  {
    "site": "linux-do",
    "name": "user-posts",
    "description": "linux.do 用户的帖子",
    "access": "read",
    "domain": "linux.do",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "index",
      "topic_user",
      "topic",
      "reply",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "linux-do/user-posts.js",
    "sourceFile": "linux-do/user-posts.js",
    "navigateBefore": "https://linux.do"
  },
  {
    "site": "linux-do",
    "name": "user-topics",
    "description": "linux.do 用户创建的话题",
    "access": "read",
    "domain": "linux.do",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of topics"
      }
    ],
    "columns": [
      "rank",
      "title",
      "replies",
      "created_at",
      "likes",
      "views",
      "url"
    ],
    "type": "js",
    "modulePath": "linux-do/user-topics.js",
    "sourceFile": "linux-do/user-topics.js",
    "navigateBefore": "https://linux.do"
  },
  {
    "site": "lobsters",
    "name": "active",
    "description": "Lobste.rs most active discussions",
    "access": "read",
    "domain": "lobste.rs",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "created_at",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "lobsters/active.js",
    "sourceFile": "lobsters/active.js"
  },
  {
    "site": "lobsters",
    "name": "domain",
    "description": "Lobste.rs stories submitted from a specific domain",
    "access": "read",
    "domain": "lobste.rs",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "domain",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Source domain (e.g. github.com, arxiv.org, blog.cloudflare.com)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories (1-25 — single page)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "created_at",
      "tags",
      "submission_url",
      "comments_url"
    ],
    "type": "js",
    "modulePath": "lobsters/domain.js",
    "sourceFile": "lobsters/domain.js"
  },
  {
    "site": "lobsters",
    "name": "hot",
    "description": "Lobste.rs hottest stories",
    "access": "read",
    "domain": "lobste.rs",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "created_at",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "lobsters/hot.js",
    "sourceFile": "lobsters/hot.js"
  },
  {
    "site": "lobsters",
    "name": "newest",
    "description": "Lobste.rs newest stories",
    "access": "read",
    "domain": "lobste.rs",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "created_at",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "lobsters/newest.js",
    "sourceFile": "lobsters/newest.js"
  },
  {
    "site": "lobsters",
    "name": "read",
    "description": "Read a Lobste.rs story and its comment tree",
    "access": "read",
    "domain": "lobste.rs",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Lobste.rs short_id (e.g. 6cmh6h)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Max top-level comments"
      },
      {
        "name": "depth",
        "type": "int",
        "default": 2,
        "required": false,
        "help": "Max reply depth (1=no replies, 2=one level of replies, etc.)"
      },
      {
        "name": "replies",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Max replies shown per comment at each level"
      },
      {
        "name": "max-length",
        "type": "int",
        "default": 2000,
        "required": false,
        "help": "Max characters per comment body (min 100)"
      }
    ],
    "columns": [
      "type",
      "author",
      "score",
      "text"
    ],
    "type": "js",
    "modulePath": "lobsters/read.js",
    "sourceFile": "lobsters/read.js"
  },
  {
    "site": "lobsters",
    "name": "tag",
    "description": "Lobste.rs stories by tag",
    "access": "read",
    "domain": "lobste.rs",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "tag",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Tag name (e.g. programming, rust, security, ai)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of stories"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "author",
      "comments",
      "created_at",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "lobsters/tag.js",
    "sourceFile": "lobsters/tag.js"
  },
  {
    "site": "maimai",
    "name": "search-talents",
    "description": "Search for candidates on Maimai with multi-dimensional filters",
    "access": "read",
    "domain": "maimai.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g., \"Java\", \"产品经理\")"
      },
      {
        "name": "page",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Page number (0-based)"
      },
      {
        "name": "size",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Results per page"
      },
      {
        "name": "positions",
        "type": "str",
        "required": false,
        "help": "Positions (e.g., \"运营\", \"Java 开发工程师\")"
      },
      {
        "name": "companies",
        "type": "str",
        "required": false,
        "help": "Companies, comma-separated (e.g., \"百度\", \"字节跳动，阿里巴巴\")"
      },
      {
        "name": "schools",
        "type": "str",
        "required": false,
        "help": "Schools, comma-separated (e.g., \"北京大学\", \"清华大学，复旦大学\")"
      },
      {
        "name": "provinces",
        "type": "str",
        "required": false,
        "help": "Provinces (e.g., \"北京\", \"上海\")"
      },
      {
        "name": "cities",
        "type": "str",
        "required": false,
        "help": "Cities (e.g., \"北京市\", \"上海市\")"
      },
      {
        "name": "worktimes",
        "type": "str",
        "required": false,
        "help": "Work years: 1=1-3y, 2=3-5y, 3=5-10y, 4=10+y"
      },
      {
        "name": "degrees",
        "type": "str",
        "required": false,
        "help": "Education: 1=大专，2=本科，3=硕士，4=博士，5=MBA"
      },
      {
        "name": "professions",
        "type": "str",
        "required": false,
        "help": "Industries: 01=互联网，02=金融，03=电子，04=通信"
      },
      {
        "name": "is_211",
        "type": "int",
        "required": false,
        "help": "211 university: 0=any, 1=211"
      },
      {
        "name": "is_985",
        "type": "int",
        "required": false,
        "help": "985 university: 0=any, 1=985"
      },
      {
        "name": "sortby",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Sort: 0=relevance, 1=activity, 2=work_years, 3=education"
      },
      {
        "name": "is_direct_chat",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Direct chat: 0=any, 1=available"
      }
    ],
    "columns": [
      "name",
      "job_title",
      "company",
      "historical_companies",
      "location",
      "work_year",
      "school",
      "degree",
      "active_status",
      "age",
      "tags",
      "mutual_friends"
    ],
    "type": "js",
    "modulePath": "maimai/search-talents.js",
    "sourceFile": "maimai/search-talents.js",
    "navigateBefore": "https://maimai.cn"
  },
  {
    "site": "maven",
    "name": "artifact",
    "description": "Fetch a Maven Central artifact's version history (groupId:artifactId[:version])",
    "access": "read",
    "domain": "search.maven.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "coordinate",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Maven coord \"groupId:artifactId\" or \"groupId:artifactId:version\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max versions (1-200, ignored when version is pinned)"
      }
    ],
    "columns": [
      "groupId",
      "artifactId",
      "version",
      "packaging",
      "publishedAt",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "maven/artifact.js",
    "sourceFile": "maven/artifact.js"
  },
  {
    "site": "maven",
    "name": "search",
    "description": "Search Maven Central by keyword (artifact name, groupId, tag)",
    "access": "read",
    "domain": "search.maven.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"jackson\", \"guava\", \"ai.koog\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max artifacts (1-200)"
      }
    ],
    "columns": [
      "rank",
      "coordinate",
      "groupId",
      "artifactId",
      "latestVersion",
      "packaging",
      "versions",
      "lastPublished",
      "repository",
      "url"
    ],
    "type": "js",
    "modulePath": "maven/search.js",
    "sourceFile": "maven/search.js"
  },
  {
    "site": "mdn",
    "name": "search",
    "description": "Search MDN Web Docs by keyword",
    "access": "read",
    "domain": "developer.mozilla.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"fetch\", \"flexbox\", \"Array.prototype.map\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max results (1-50)"
      },
      {
        "name": "locale",
        "type": "str",
        "default": "en-US",
        "required": false,
        "help": "Doc locale (en-US default; de / es / fr / ja / ko / pt-BR / ru / zh-CN / zh-TW)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "slug",
      "locale",
      "summary",
      "url"
    ],
    "type": "js",
    "modulePath": "mdn/search.js",
    "sourceFile": "mdn/search.js"
  },
  {
    "site": "medium",
    "name": "feed",
    "description": "Medium 热门文章 Feed",
    "access": "read",
    "domain": "medium.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "topic",
        "type": "str",
        "default": "",
        "required": false,
        "help": "话题标签（如 technology, programming, ai）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的文章数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "date",
      "readTime",
      "claps"
    ],
    "type": "js",
    "modulePath": "medium/feed.js",
    "sourceFile": "medium/feed.js",
    "navigateBefore": "https://medium.com"
  },
  {
    "site": "medium",
    "name": "search",
    "description": "搜索 Medium 文章",
    "access": "read",
    "domain": "medium.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的文章数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "date",
      "readTime",
      "claps",
      "url"
    ],
    "type": "js",
    "modulePath": "medium/search.js",
    "sourceFile": "medium/search.js",
    "navigateBefore": "https://medium.com"
  },
  {
    "site": "medium",
    "name": "tag",
    "description": "Latest Medium articles tagged with a given keyword (RSS feed)",
    "access": "read",
    "domain": "medium.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "tag",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Lowercase tag slug (e.g. \"programming\", \"machine-learning\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max articles (1-25 — single RSS page)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "description",
      "categories",
      "published",
      "url"
    ],
    "type": "js",
    "modulePath": "medium/tag.js",
    "sourceFile": "medium/tag.js"
  },
  {
    "site": "medium",
    "name": "user",
    "description": "获取 Medium 用户的文章列表",
    "access": "read",
    "domain": "medium.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Medium 用户名（如 @username 或 username）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的文章数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "date",
      "readTime",
      "claps",
      "url"
    ],
    "type": "js",
    "modulePath": "medium/user.js",
    "sourceFile": "medium/user.js",
    "navigateBefore": "https://medium.com"
  },
  {
    "site": "mubu",
    "name": "doc",
    "description": "读取幕布文档内容（默认输出 Markdown，可用 --output text 输出纯文本）",
    "access": "read",
    "domain": "mubu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "文档 ID"
      },
      {
        "name": "output",
        "type": "str",
        "default": "md",
        "required": false,
        "help": "输出格式：md（默认，缩进列表 Markdown，适合导入 Obsidian）或 text（纯文本，适合终端阅读）"
      }
    ],
    "columns": [
      "content"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "mubu/doc.js",
    "sourceFile": "mubu/doc.js",
    "navigateBefore": "https://mubu.com"
  },
  {
    "site": "mubu",
    "name": "docs",
    "description": "列出幕布文档（默认根目录，--starred 查看快速访问列表）",
    "access": "read",
    "domain": "mubu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "folder",
        "type": "str",
        "default": "0",
        "required": false,
        "help": "文件夹 ID（默认根目录 0）"
      },
      {
        "name": "starred",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "只显示快速访问的文档和文件夹"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "最多显示条数"
      }
    ],
    "columns": [
      "type",
      "id",
      "name",
      "updated",
      "stared"
    ],
    "type": "js",
    "modulePath": "mubu/docs.js",
    "sourceFile": "mubu/docs.js",
    "navigateBefore": "https://mubu.com"
  },
  {
    "site": "mubu",
    "name": "notes",
    "description": "读取幕布速记（默认今天）。支持 --date/--month/--year/--from/--to 指定时间范围，--list 为概览模式（日期+条数）。",
    "access": "read",
    "domain": "mubu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "list",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "概览模式：只输出日期和条数，不含速记内容。可与任意时间范围参数组合。"
      },
      {
        "name": "date",
        "type": "str",
        "required": false,
        "help": "单日，格式 YYYY-MM-DD。不指定时间范围则默认今天（系统本地时间）。"
      },
      {
        "name": "month",
        "type": "str",
        "required": false,
        "help": "整月，格式 YYYY-MM。"
      },
      {
        "name": "year",
        "type": "int",
        "required": false,
        "help": "整年，格式 YYYY（整数）。"
      },
      {
        "name": "from",
        "type": "str",
        "required": false,
        "help": "范围起始日，格式 YYYY-MM-DD。须与 --to 同时使用。"
      },
      {
        "name": "to",
        "type": "str",
        "required": false,
        "help": "范围截止日，格式 YYYY-MM-DD。须与 --from 同时使用。"
      },
      {
        "name": "output",
        "type": "str",
        "default": "md",
        "required": false,
        "help": "输出格式：md（默认，Markdown）或 text（纯文本）"
      }
    ],
    "columns": [
      "date",
      "content"
    ],
    "type": "js",
    "modulePath": "mubu/notes.js",
    "sourceFile": "mubu/notes.js",
    "navigateBefore": "https://mubu.com"
  },
  {
    "site": "mubu",
    "name": "recent",
    "description": "最近编辑的幕布文档",
    "access": "read",
    "domain": "mubu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "最多显示条数"
      }
    ],
    "columns": [
      "id",
      "name",
      "updated"
    ],
    "type": "js",
    "modulePath": "mubu/recent.js",
    "sourceFile": "mubu/recent.js",
    "navigateBefore": "https://mubu.com"
  },
  {
    "site": "mubu",
    "name": "search",
    "description": "全局搜索幕布文档和文件夹（标题+内容，服务端全量匹配）。结果含 type/id/name/path/hits/snippet 字段。",
    "access": "read",
    "domain": "mubu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 100,
        "required": false,
        "help": "最多显示条数（默认 100，结果被截断时用 --limit N 调大）"
      }
    ],
    "columns": [
      "type",
      "id",
      "name",
      "path",
      "hits",
      "snippet"
    ],
    "type": "js",
    "modulePath": "mubu/search.js",
    "sourceFile": "mubu/search.js",
    "navigateBefore": "https://mubu.com"
  },
  {
    "site": "notebooklm",
    "name": "current",
    "description": "Show metadata for the currently opened NotebookLM notebook tab",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "id",
      "title",
      "url",
      "source"
    ],
    "type": "js",
    "modulePath": "notebooklm/current.js",
    "sourceFile": "notebooklm/current.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "get",
    "aliases": [
      "metadata"
    ],
    "description": "Get rich metadata for the currently opened NotebookLM notebook",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "id",
      "title",
      "emoji",
      "source_count",
      "created_at",
      "updated_at",
      "url",
      "source"
    ],
    "type": "js",
    "modulePath": "notebooklm/get.js",
    "sourceFile": "notebooklm/get.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "history",
    "description": "List NotebookLM conversation history threads in the current notebook",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "thread_id",
      "item_count",
      "preview",
      "source",
      "notebook_id",
      "url"
    ],
    "type": "js",
    "modulePath": "notebooklm/history.js",
    "sourceFile": "notebooklm/history.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "list",
    "description": "List NotebookLM notebooks via in-page batchexecute RPC in the current logged-in session",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "title",
      "id",
      "is_owner",
      "created_at",
      "source",
      "url"
    ],
    "type": "js",
    "modulePath": "notebooklm/list.js",
    "sourceFile": "notebooklm/list.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "note-list",
    "aliases": [
      "notes-list"
    ],
    "description": "List saved notes from the Studio panel of the current NotebookLM notebook",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "title",
      "created_at",
      "source",
      "url"
    ],
    "type": "js",
    "modulePath": "notebooklm/note-list.js",
    "sourceFile": "notebooklm/note-list.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "notes-get",
    "description": "Get one note from the current NotebookLM notebook by title from the visible note editor",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Note title or id from the current notebook"
      }
    ],
    "columns": [
      "title",
      "content",
      "source",
      "url"
    ],
    "type": "js",
    "modulePath": "notebooklm/notes-get.js",
    "sourceFile": "notebooklm/notes-get.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "open",
    "aliases": [
      "select"
    ],
    "description": "Open one NotebookLM notebook in the adapter session by id or URL",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "notebook",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Notebook id from list output, or a full NotebookLM notebook URL"
      }
    ],
    "columns": [
      "id",
      "title",
      "url",
      "source"
    ],
    "type": "js",
    "modulePath": "notebooklm/open.js",
    "sourceFile": "notebooklm/open.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "source-fulltext",
    "description": "Get the extracted fulltext for one source in the currently opened NotebookLM notebook",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "source",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Source id or title from the current notebook"
      }
    ],
    "columns": [
      "title",
      "kind",
      "char_count",
      "url",
      "source"
    ],
    "type": "js",
    "modulePath": "notebooklm/source-fulltext.js",
    "sourceFile": "notebooklm/source-fulltext.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "source-get",
    "description": "Get one source from the currently opened NotebookLM notebook by id or title",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "source",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Source id or title from the current notebook"
      }
    ],
    "columns": [
      "title",
      "id",
      "type",
      "size",
      "created_at",
      "updated_at",
      "url",
      "source"
    ],
    "type": "js",
    "modulePath": "notebooklm/source-get.js",
    "sourceFile": "notebooklm/source-get.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "source-guide",
    "description": "Get the guide summary and keywords for one source in the currently opened NotebookLM notebook",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "source",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Source id or title from the current notebook"
      }
    ],
    "columns": [
      "source_id",
      "notebook_id",
      "title",
      "type",
      "summary",
      "keywords",
      "source"
    ],
    "type": "js",
    "modulePath": "notebooklm/source-guide.js",
    "sourceFile": "notebooklm/source-guide.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "source-list",
    "description": "List sources for the currently opened NotebookLM notebook",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "title",
      "id",
      "type",
      "size",
      "created_at",
      "updated_at",
      "url",
      "source"
    ],
    "type": "js",
    "modulePath": "notebooklm/source-list.js",
    "sourceFile": "notebooklm/source-list.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "status",
    "description": "Check NotebookLM page availability and login state in the current Chrome session",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "status",
      "login",
      "page",
      "url",
      "title",
      "notebooks"
    ],
    "type": "js",
    "modulePath": "notebooklm/status.js",
    "sourceFile": "notebooklm/status.js",
    "navigateBefore": false
  },
  {
    "site": "notebooklm",
    "name": "summary",
    "description": "Get the summary block from the currently opened NotebookLM notebook",
    "access": "read",
    "domain": "notebooklm.google.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "title",
      "summary",
      "source",
      "url"
    ],
    "type": "js",
    "modulePath": "notebooklm/summary.js",
    "sourceFile": "notebooklm/summary.js",
    "navigateBefore": false
  },
  {
    "site": "nowcoder",
    "name": "companies",
    "description": "Hot companies for interview prep",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "job",
        "type": "str",
        "default": "11002",
        "required": false,
        "help": "Job ID (11002=Java, 11003=C++, 11200=Backend, 11203=QA, 11201=Frontend)"
      }
    ],
    "columns": [
      "rank",
      "company",
      "companyId"
    ],
    "type": "js",
    "modulePath": "nowcoder/companies.js",
    "sourceFile": "nowcoder/companies.js"
  },
  {
    "site": "nowcoder",
    "name": "creators",
    "description": "Top content creators leaderboard",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "nickname",
      "school",
      "level",
      "heat",
      "tag"
    ],
    "type": "js",
    "modulePath": "nowcoder/creators.js",
    "sourceFile": "nowcoder/creators.js"
  },
  {
    "site": "nowcoder",
    "name": "detail",
    "description": "Post detail view (supports ID / UUID / URL)",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Post ID, UUID, or URL"
      }
    ],
    "columns": [
      "title",
      "author",
      "school",
      "content",
      "likes",
      "comments",
      "views",
      "time",
      "location"
    ],
    "type": "js",
    "modulePath": "nowcoder/detail.js",
    "sourceFile": "nowcoder/detail.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "experience",
    "description": "Interview experience posts",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "school",
      "likes",
      "comments",
      "views",
      "id"
    ],
    "type": "js",
    "modulePath": "nowcoder/experience.js",
    "sourceFile": "nowcoder/experience.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "hot",
    "description": "Hot search ranking",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "title",
      "heat"
    ],
    "type": "js",
    "modulePath": "nowcoder/hot.js",
    "sourceFile": "nowcoder/hot.js"
  },
  {
    "site": "nowcoder",
    "name": "jobs",
    "description": "Career category listing",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "id",
      "career",
      "learners"
    ],
    "type": "js",
    "modulePath": "nowcoder/jobs.js",
    "sourceFile": "nowcoder/jobs.js"
  },
  {
    "site": "nowcoder",
    "name": "notifications",
    "description": "Unread message summary",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "type",
      "unread"
    ],
    "type": "js",
    "modulePath": "nowcoder/notifications.js",
    "sourceFile": "nowcoder/notifications.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "papers",
    "description": "Interview question bank by company and job",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "job",
        "type": "str",
        "default": "11002",
        "required": false,
        "help": "Job ID (11002=Java, 11003=C++, 11200=Backend, 11203=QA, 11201=Frontend)"
      },
      {
        "name": "company",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Company ID (e.g. 139=Baidu, 138=Tencent, 239=Huawei)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "title",
      "company",
      "practitioners"
    ],
    "type": "js",
    "modulePath": "nowcoder/papers.js",
    "sourceFile": "nowcoder/papers.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "practice",
    "description": "Categorized practice questions with progress",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "job",
        "type": "str",
        "default": "11226",
        "required": false,
        "help": "Career ID (11226=Software, 11227=Hardware, 11229=Product, 11230=Finance)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "category",
      "subject",
      "total",
      "done",
      "remaining"
    ],
    "type": "js",
    "modulePath": "nowcoder/practice.js",
    "sourceFile": "nowcoder/practice.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "recommend",
    "description": "Recommended feed",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "likes",
      "comments",
      "views",
      "id"
    ],
    "type": "js",
    "modulePath": "nowcoder/recommend.js",
    "sourceFile": "nowcoder/recommend.js"
  },
  {
    "site": "nowcoder",
    "name": "referral",
    "description": "Internal referral posts",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "school",
      "likes",
      "comments",
      "views",
      "id"
    ],
    "type": "js",
    "modulePath": "nowcoder/referral.js",
    "sourceFile": "nowcoder/referral.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "salary",
    "description": "Salary disclosure posts",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "school",
      "likes",
      "comments",
      "views",
      "id"
    ],
    "type": "js",
    "modulePath": "nowcoder/salary.js",
    "sourceFile": "nowcoder/salary.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "search",
    "description": "Full-text search",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "type",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "Search type (all/post/question/user/job)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "school",
      "content",
      "id"
    ],
    "type": "js",
    "modulePath": "nowcoder/search.js",
    "sourceFile": "nowcoder/search.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "suggest",
    "description": "Search suggestions",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      }
    ],
    "columns": [
      "rank",
      "suggestion",
      "type"
    ],
    "type": "js",
    "modulePath": "nowcoder/suggest.js",
    "sourceFile": "nowcoder/suggest.js",
    "navigateBefore": "https://www.nowcoder.com"
  },
  {
    "site": "nowcoder",
    "name": "topics",
    "description": "Hot discussion topics",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "topic",
      "views",
      "posts",
      "heat",
      "id"
    ],
    "type": "js",
    "modulePath": "nowcoder/topics.js",
    "sourceFile": "nowcoder/topics.js"
  },
  {
    "site": "nowcoder",
    "name": "trending",
    "description": "Trending posts",
    "access": "read",
    "domain": "www.nowcoder.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of items"
      }
    ],
    "columns": [
      "rank",
      "title",
      "heat",
      "id"
    ],
    "type": "js",
    "modulePath": "nowcoder/trending.js",
    "sourceFile": "nowcoder/trending.js"
  },
  {
    "site": "npm",
    "name": "downloads",
    "description": "Daily download counts for an npm package over a window",
    "access": "read",
    "domain": "api.npmjs.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "npm package name (e.g. \"react\", \"@vercel/og\")"
      },
      {
        "name": "period",
        "type": "str",
        "default": "last-week",
        "required": false,
        "help": "last-day / last-week / last-month / last-year, or YYYY-MM-DD:YYYY-MM-DD"
      }
    ],
    "columns": [
      "rank",
      "package",
      "day",
      "downloads"
    ],
    "type": "js",
    "modulePath": "npm/downloads.js",
    "sourceFile": "npm/downloads.js"
  },
  {
    "site": "npm",
    "name": "package",
    "description": "Single npm package metadata (latest version, license, homepage, repository). Use `npm downloads` for stats.",
    "access": "read",
    "domain": "registry.npmjs.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "npm package name (e.g. \"react\", \"@vercel/og\")"
      }
    ],
    "columns": [
      "name",
      "latestVersion",
      "description",
      "license",
      "homepage",
      "repository",
      "bugs",
      "maintainers",
      "keywords",
      "created",
      "modified",
      "url"
    ],
    "type": "js",
    "modulePath": "npm/package.js",
    "sourceFile": "npm/package.js"
  },
  {
    "site": "npm",
    "name": "search",
    "description": "Search the public npm registry by keyword",
    "access": "read",
    "domain": "registry.npmjs.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"react\", \"graphql client\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (1-250)"
      }
    ],
    "columns": [
      "rank",
      "name",
      "version",
      "description",
      "weeklyDownloads",
      "dependents",
      "license",
      "publisher",
      "updated",
      "url"
    ],
    "type": "js",
    "modulePath": "npm/search.js",
    "sourceFile": "npm/search.js"
  },
  {
    "site": "nuget",
    "name": "package",
    "description": "Full NuGet package version history (catalogEntry per release)",
    "access": "read",
    "domain": "api.nuget.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "NuGet package id (e.g. \"Newtonsoft.Json\", case-insensitive)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "version",
      "title",
      "authors",
      "tags",
      "language",
      "licenseExpression",
      "projectUrl",
      "published",
      "listed",
      "url"
    ],
    "type": "js",
    "modulePath": "nuget/package.js",
    "sourceFile": "nuget/package.js"
  },
  {
    "site": "nuget",
    "name": "search",
    "description": "Search NuGet packages by keyword",
    "access": "read",
    "domain": "api.nuget.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max packages (1-1000)"
      },
      {
        "name": "prerelease",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Include prerelease versions"
      }
    ],
    "columns": [
      "rank",
      "id",
      "version",
      "title",
      "description",
      "authors",
      "tags",
      "totalDownloads",
      "verified",
      "projectUrl",
      "url"
    ],
    "type": "js",
    "modulePath": "nuget/search.js",
    "sourceFile": "nuget/search.js"
  },
  {
    "site": "nvd",
    "name": "cve",
    "description": "NIST NVD CVE detail (description, CVSS, CWE, KEV flag)",
    "access": "read",
    "domain": "services.nvd.nist.gov",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "CVE identifier (e.g. \"CVE-2021-44228\")"
      }
    ],
    "columns": [
      "id",
      "published",
      "lastModified",
      "vulnStatus",
      "baseScore",
      "severity",
      "attackVector",
      "cwe",
      "kevAdded",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "nvd/cve.js",
    "sourceFile": "nvd/cve.js"
  },
  {
    "site": "oeis",
    "name": "search",
    "description": "Search OEIS sequences by keyword or numeric pattern",
    "access": "read",
    "domain": "oeis.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword or comma-separated terms (e.g. \"fibonacci\", \"1,1,2,3,5,8\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max sequences (1-100)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "name",
      "keywords",
      "preview",
      "author",
      "created",
      "url"
    ],
    "type": "js",
    "modulePath": "oeis/search.js",
    "sourceFile": "oeis/search.js"
  },
  {
    "site": "oeis",
    "name": "sequence",
    "description": "Full OEIS sequence detail by A-number (terms, name, keywords, formula counts)",
    "access": "read",
    "domain": "oeis.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "OEIS sequence id (e.g. \"A000045\" for Fibonacci)"
      }
    ],
    "columns": [
      "id",
      "name",
      "keywords",
      "preview",
      "termCount",
      "offset",
      "author",
      "created",
      "revision",
      "commentCount",
      "formulaCount",
      "referenceCount",
      "xrefCount",
      "linkCount",
      "url"
    ],
    "type": "js",
    "modulePath": "oeis/sequence.js",
    "sourceFile": "oeis/sequence.js"
  },
  {
    "site": "ones",
    "name": "login",
    "description": "ONES Project API — login via Chrome Bridge (POST auth/login); stderr prints export hints for ONES_USER_ID / TOKEN",
    "access": "write",
    "domain": "ones.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "email",
        "type": "str",
        "required": false,
        "help": "Account email (or set ONES_EMAIL)"
      },
      {
        "name": "phone",
        "type": "str",
        "required": false,
        "help": "Account phone (or set ONES_PHONE); ignored if email is set"
      },
      {
        "name": "password",
        "type": "str",
        "required": false,
        "help": "Password (or set ONES_PASSWORD)"
      }
    ],
    "columns": [
      "uuid",
      "name",
      "email",
      "token_preview"
    ],
    "type": "js",
    "modulePath": "ones/login.js",
    "sourceFile": "ones/login.js",
    "navigateBefore": false
  },
  {
    "site": "ones",
    "name": "logout",
    "description": "ONES Project API — invalidate current token (GET auth/logout) via Chrome Bridge",
    "access": "write",
    "domain": "ones.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "ok",
      "detail"
    ],
    "type": "js",
    "modulePath": "ones/logout.js",
    "sourceFile": "ones/logout.js",
    "navigateBefore": false
  },
  {
    "site": "ones",
    "name": "me",
    "description": "ONES Project API — current user (GET users/me) via Chrome Bridge",
    "access": "read",
    "domain": "ones.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "uuid",
      "name",
      "email",
      "phone",
      "status"
    ],
    "type": "js",
    "modulePath": "ones/me.js",
    "sourceFile": "ones/me.js",
    "navigateBefore": false
  },
  {
    "site": "ones",
    "name": "my-tasks",
    "description": "ONES — my work items (filters/peek + strict must query). Default: assignee=me. Use --mode if your site uses field004 for assignee.",
    "access": "read",
    "domain": "ones.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "team",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Team UUID from URL …/team/<uuid>/…, or set ONES_TEAM_UUID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 100,
        "required": false,
        "help": "Max rows (default 100, max 500)"
      },
      {
        "name": "mode",
        "type": "str",
        "default": "assign",
        "required": false,
        "help": "assign=负责人(顶层 assign)；field004=负责人(筛选器示例里的 field004)；owner=创建者；both=负责人∪创建者(两次 peek 去重)",
        "choices": [
          "assign",
          "field004",
          "owner",
          "both"
        ]
      }
    ],
    "columns": [
      "title",
      "status",
      "project",
      "uuid",
      "updated",
      "工时"
    ],
    "type": "js",
    "modulePath": "ones/my-tasks.js",
    "sourceFile": "ones/my-tasks.js",
    "navigateBefore": false
  },
  {
    "site": "ones",
    "name": "task",
    "description": "ONES — work item detail (GET team/:team/task/:id/info); id is URL segment after …/task/",
    "access": "read",
    "domain": "ones.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Work item UUID (often 16 chars) from …/task/<id>"
      },
      {
        "name": "team",
        "type": "str",
        "required": false,
        "help": "Team UUID (8 chars from …/team/<team>/…), or set ONES_TEAM_UUID"
      }
    ],
    "columns": [
      "uuid",
      "summary",
      "number",
      "status_uuid",
      "assign",
      "owner",
      "project_uuid",
      "updated"
    ],
    "type": "js",
    "modulePath": "ones/task.js",
    "sourceFile": "ones/task.js",
    "navigateBefore": false
  },
  {
    "site": "ones",
    "name": "tasks",
    "description": "ONES Project API — list work items (POST team/:team/filters/peek); use token-info -f json for team uuid",
    "access": "read",
    "domain": "ones.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "team",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Team UUID (8 chars), or set ONES_TEAM_UUID"
      },
      {
        "name": "project",
        "type": "str",
        "required": false,
        "help": "Filter by project UUID (field006 / 所属项目)"
      },
      {
        "name": "assign",
        "type": "str",
        "required": false,
        "help": "Filter by assignee user UUID (负责人 assign)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max rows after flattening groups (default 30)"
      }
    ],
    "columns": [
      "title",
      "status",
      "project",
      "uuid",
      "updated",
      "工时"
    ],
    "type": "js",
    "modulePath": "ones/tasks.js",
    "sourceFile": "ones/tasks.js",
    "navigateBefore": false
  },
  {
    "site": "ones",
    "name": "token-info",
    "description": "ONES Project API — session detail (GET auth/token_info) via Chrome Bridge: user, teams, org",
    "access": "read",
    "domain": "ones.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "uuid",
      "name",
      "email",
      "teams",
      "org_name"
    ],
    "type": "js",
    "modulePath": "ones/token-info.js",
    "sourceFile": "ones/token-info.js",
    "navigateBefore": false
  },
  {
    "site": "ones",
    "name": "worklog",
    "description": "ONES — log work hours on a task (defaults to today; use --date to backfill; endpoint falls back by deployment).",
    "access": "write",
    "domain": "ones.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "task",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Work item UUID (usually 16 chars), from my-tasks or browser URL …/task/<id>"
      },
      {
        "name": "hours",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Hours to log for this entry (e.g. 2 or 1.5), converted with ONES_MANHOUR_SCALE"
      },
      {
        "name": "team",
        "type": "str",
        "required": false,
        "help": "Team UUID from URL …/team/<uuid>/…, or set ONES_TEAM_UUID"
      },
      {
        "name": "date",
        "type": "str",
        "required": false,
        "help": "Entry date YYYY-MM-DD, defaults to today (local timezone); use for backfill"
      },
      {
        "name": "note",
        "type": "str",
        "required": false,
        "help": "Optional note (written to description/desc)"
      },
      {
        "name": "owner",
        "type": "str",
        "required": false,
        "help": "Owner user UUID (defaults to current logged-in user)"
      }
    ],
    "columns": [
      "task",
      "date",
      "hours",
      "owner",
      "endpoint"
    ],
    "type": "js",
    "modulePath": "ones/worklog.js",
    "sourceFile": "ones/worklog.js",
    "navigateBefore": false
  },
  {
    "site": "openalex",
    "name": "search",
    "description": "Search OpenAlex Works (papers, books, preprints) by keyword",
    "access": "read",
    "domain": "api.openalex.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search text (e.g. \"transformers\", \"open access scholarly\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max works (1-200, single OpenAlex page)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "year",
      "citations",
      "firstAuthor",
      "venue",
      "openAccess",
      "type",
      "doi",
      "url"
    ],
    "type": "js",
    "modulePath": "openalex/search.js",
    "sourceFile": "openalex/search.js"
  },
  {
    "site": "openalex",
    "name": "work",
    "description": "Fetch a single OpenAlex Work (paper / preprint / book) — metadata + abstract",
    "access": "read",
    "domain": "api.openalex.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "OpenAlex Work id (\"W2741809807\"), DOI (\"10.7717/peerj.4375\"), or full URL"
      }
    ],
    "columns": [
      "id",
      "title",
      "type",
      "year",
      "date",
      "language",
      "authors",
      "venue",
      "citations",
      "openAccess",
      "openAccessUrl",
      "referencedCount",
      "doi",
      "abstract",
      "url"
    ],
    "type": "js",
    "modulePath": "openalex/work.js",
    "sourceFile": "openalex/work.js"
  },
  {
    "site": "openfda",
    "name": "drug-label",
    "description": "Search FDA-approved drug labels (brand or generic name)",
    "access": "read",
    "domain": "fda.gov",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Brand or generic drug name (e.g. \"aspirin\", \"lisinopril\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Max rows (1-25, default 5; openFDA caps anonymous tier at 25/page)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "brandName",
      "genericName",
      "manufacturer",
      "productType",
      "route",
      "productNdc",
      "pharmClass",
      "purpose",
      "indications",
      "warnings",
      "dosage",
      "effectiveTime"
    ],
    "type": "js",
    "modulePath": "openfda/drug-label.js",
    "sourceFile": "openfda/drug-label.js"
  },
  {
    "site": "openfda",
    "name": "food-recall",
    "description": "FDA food recall and enforcement actions (most recent first)",
    "access": "read",
    "domain": "fda.gov",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": false,
        "help": "Free-text Lucene query (e.g. \"salmonella\", \"listeria\"); default: all recent recalls"
      },
      {
        "name": "status",
        "type": "str",
        "required": false,
        "help": "Filter by status: \"Ongoing\", \"Completed\", \"Terminated\""
      },
      {
        "name": "classification",
        "type": "str",
        "required": false,
        "help": "Filter by class: \"Class I\" (most serious), \"Class II\", \"Class III\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max rows (1-100, default 10; openFDA caps anonymous tier at 100/page)"
      }
    ],
    "columns": [
      "rank",
      "recallNumber",
      "status",
      "classification",
      "voluntary",
      "recallingFirm",
      "city",
      "state",
      "country",
      "productDescription",
      "reasonForRecall",
      "productQuantity",
      "distributionPattern",
      "reportDate",
      "recallInitiationDate",
      "terminationDate"
    ],
    "type": "js",
    "modulePath": "openfda/food-recall.js",
    "sourceFile": "openfda/food-recall.js"
  },
  {
    "site": "openreview",
    "name": "author",
    "description": "List OpenReview submissions by an author profile id (newest first)",
    "access": "read",
    "domain": "openreview.net",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "profile",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "OpenReview profile id (e.g. \"~Yoshua_Bengio1\"). Find it on the author profile URL on openreview.net."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Max submissions (1-1000)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "authors",
      "venue",
      "pdate",
      "url"
    ],
    "type": "js",
    "modulePath": "openreview/author.js",
    "sourceFile": "openreview/author.js"
  },
  {
    "site": "openreview",
    "name": "paper",
    "description": "Show full metadata for a single OpenReview paper",
    "access": "read",
    "domain": "openreview.net",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "OpenReview note id (e.g. \"5sRnsubyAK\")"
      }
    ],
    "columns": [
      "id",
      "title",
      "authors",
      "keywords",
      "venue",
      "venueid",
      "primary_area",
      "abstract",
      "pdate",
      "pdf",
      "url"
    ],
    "type": "js",
    "modulePath": "openreview/paper.js",
    "sourceFile": "openreview/paper.js"
  },
  {
    "site": "openreview",
    "name": "reviews",
    "description": "Show full review thread (paper + reviews + decisions) for an OpenReview forum",
    "access": "read",
    "domain": "openreview.net",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "forum",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "OpenReview forum id (same as paper id)"
      },
      {
        "name": "max-length",
        "type": "int",
        "default": 4000,
        "required": false,
        "help": "Per-row text truncation (min 200)"
      }
    ],
    "columns": [
      "type",
      "author",
      "rating",
      "confidence",
      "text"
    ],
    "type": "js",
    "modulePath": "openreview/reviews.js",
    "sourceFile": "openreview/reviews.js"
  },
  {
    "site": "openreview",
    "name": "search",
    "description": "Search OpenReview papers by free-text query",
    "access": "read",
    "domain": "openreview.net",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"diffusion model\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Max results (max 50)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "authors",
      "venue",
      "pdate",
      "url"
    ],
    "type": "js",
    "modulePath": "openreview/search.js",
    "sourceFile": "openreview/search.js"
  },
  {
    "site": "openreview",
    "name": "venue",
    "description": "List papers at an OpenReview venue (e.g. \"ICLR 2024 oral\" or full invitation id)",
    "access": "read",
    "domain": "openreview.net",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "venue",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Venue name (\"ICLR 2024 oral\") or invitation (\"ICLR.cc/2025/Conference/-/Submission\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Max results (max 200)"
      },
      {
        "name": "offset",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Pagination offset"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "authors",
      "keywords",
      "primary_area",
      "pdate",
      "pdf",
      "url"
    ],
    "type": "js",
    "modulePath": "openreview/venue.js",
    "sourceFile": "openreview/venue.js"
  },
  {
    "site": "osv",
    "name": "query",
    "description": "OSV.dev vulnerabilities affecting a package (optionally pinned to a version)",
    "access": "read",
    "domain": "osv.dev",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "package",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Package name (e.g. \"lodash\", \"django\")"
      },
      {
        "name": "ecosystem",
        "type": "string",
        "required": true,
        "help": "OSV ecosystem (npm / PyPI / Go / Maven / NuGet / RubyGems / crates.io / Packagist / ...)"
      },
      {
        "name": "version",
        "type": "string",
        "required": false,
        "help": "Pin to a specific version (e.g. \"4.17.20\"); omit for all known vulns"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max rows to return (1-200)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "summary",
      "severity",
      "aliases",
      "published",
      "modified",
      "affectedPackages",
      "url"
    ],
    "type": "js",
    "modulePath": "osv/query.js",
    "sourceFile": "osv/query.js"
  },
  {
    "site": "osv",
    "name": "vulnerability",
    "description": "Single OSV.dev vulnerability detail (severity, affected packages, CVE/GHSA aliases)",
    "access": "read",
    "domain": "osv.dev",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "OSV vulnerability id (e.g. \"GHSA-29mw-wpgm-hmr9\", \"CVE-2020-28500\")"
      }
    ],
    "columns": [
      "id",
      "summary",
      "severity",
      "aliases",
      "published",
      "modified",
      "affectedPackages",
      "cwes",
      "referenceCount",
      "url"
    ],
    "type": "js",
    "modulePath": "osv/vulnerability.js",
    "sourceFile": "osv/vulnerability.js"
  },
  {
    "site": "packagist",
    "name": "package",
    "description": "Fetch a Packagist package's metadata (version, downloads, license, repo, GitHub stars)",
    "access": "read",
    "domain": "packagist.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Composer package \"<vendor>/<package>\" (e.g. \"symfony/console\", \"monolog/monolog\")"
      }
    ],
    "columns": [
      "package",
      "version",
      "releasedAt",
      "license",
      "description",
      "repository",
      "githubStars",
      "favers",
      "downloads",
      "monthlyDownloads",
      "dailyDownloads",
      "url"
    ],
    "type": "js",
    "modulePath": "packagist/package.js",
    "sourceFile": "packagist/package.js"
  },
  {
    "site": "packagist",
    "name": "search",
    "description": "Search Packagist (PHP / Composer) packages by keyword",
    "access": "read",
    "domain": "packagist.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"symfony\", \"laravel http\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max packages (1-100, single Packagist page)"
      }
    ],
    "columns": [
      "rank",
      "package",
      "description",
      "downloads",
      "favers",
      "repository",
      "url"
    ],
    "type": "js",
    "modulePath": "packagist/search.js",
    "sourceFile": "packagist/search.js"
  },
  {
    "site": "paperreview",
    "name": "feedback",
    "description": "Submit feedback for a paperreview.ai review token",
    "access": "write",
    "domain": "paperreview.ai",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "token",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Review token returned by paperreview.ai"
      },
      {
        "name": "helpfulness",
        "type": "int",
        "required": true,
        "help": "Helpfulness score from 1 to 5"
      },
      {
        "name": "critical-error",
        "type": "str",
        "required": true,
        "help": "Whether the review contains a critical error",
        "choices": [
          "yes",
          "no"
        ]
      },
      {
        "name": "actionable-suggestions",
        "type": "str",
        "required": true,
        "help": "Whether the review contains actionable suggestions",
        "choices": [
          "yes",
          "no"
        ]
      },
      {
        "name": "additional-comments",
        "type": "str",
        "required": false,
        "help": "Optional free-text feedback"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max seconds for the overall command (default: 30)"
      }
    ],
    "columns": [
      "status",
      "token",
      "helpfulness",
      "critical_error",
      "actionable_suggestions",
      "message"
    ],
    "type": "js",
    "modulePath": "paperreview/feedback.js",
    "sourceFile": "paperreview/feedback.js"
  },
  {
    "site": "paperreview",
    "name": "review",
    "description": "Fetch a paperreview.ai review by token",
    "access": "read",
    "domain": "paperreview.ai",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "token",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Review token returned by paperreview.ai"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max seconds for the overall command (default: 30)"
      }
    ],
    "columns": [
      "status",
      "title",
      "venue",
      "numerical_score",
      "has_feedback",
      "review_url"
    ],
    "type": "js",
    "modulePath": "paperreview/review.js",
    "sourceFile": "paperreview/review.js"
  },
  {
    "site": "paperreview",
    "name": "submit",
    "description": "Submit a PDF to paperreview.ai for review",
    "access": "write",
    "domain": "paperreview.ai",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "pdf",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Path to the paper PDF"
      },
      {
        "name": "email",
        "type": "str",
        "required": true,
        "help": "Email address for the submission"
      },
      {
        "name": "venue",
        "type": "str",
        "required": false,
        "help": "Optional target venue such as ICLR or NeurIPS"
      },
      {
        "name": "dry-run",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Validate the input and stop before remote submission"
      },
      {
        "name": "prepare-only",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Request an upload slot but stop before uploading the PDF"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds for the overall command (default: 120)"
      }
    ],
    "columns": [
      "status",
      "file",
      "email",
      "venue",
      "token",
      "review_url",
      "message"
    ],
    "type": "js",
    "modulePath": "paperreview/submit.js",
    "sourceFile": "paperreview/submit.js"
  },
  {
    "site": "pixiv",
    "name": "detail",
    "description": "View illustration details (tags, stats, URLs)",
    "access": "read",
    "domain": "www.pixiv.net",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Illustration ID"
      }
    ],
    "columns": [
      "illust_id",
      "title",
      "author",
      "type",
      "pages",
      "bookmarks",
      "likes",
      "views",
      "tags",
      "created",
      "url"
    ],
    "type": "js",
    "modulePath": "pixiv/detail.js",
    "sourceFile": "pixiv/detail.js",
    "navigateBefore": "https://www.pixiv.net"
  },
  {
    "site": "pixiv",
    "name": "download",
    "description": "Download illustration images from Pixiv",
    "access": "read",
    "domain": "www.pixiv.net",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "illust-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Illustration ID"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./pixiv-downloads",
        "required": false,
        "help": "Output directory"
      }
    ],
    "columns": [
      "index",
      "type",
      "status",
      "size"
    ],
    "type": "js",
    "modulePath": "pixiv/download.js",
    "sourceFile": "pixiv/download.js",
    "navigateBefore": "https://www.pixiv.net"
  },
  {
    "site": "pixiv",
    "name": "illusts",
    "description": "List a Pixiv artist's illustrations",
    "access": "read",
    "domain": "www.pixiv.net",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "user-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Pixiv user ID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "illust_id",
      "pages",
      "bookmarks",
      "tags",
      "created",
      "url"
    ],
    "type": "js",
    "modulePath": "pixiv/illusts.js",
    "sourceFile": "pixiv/illusts.js",
    "navigateBefore": "https://www.pixiv.net"
  },
  {
    "site": "pixiv",
    "name": "ranking",
    "description": "Pixiv illustration rankings (daily/weekly/monthly)",
    "access": "read",
    "domain": "www.pixiv.net",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "mode",
        "type": "str",
        "default": "daily",
        "required": false,
        "help": "Ranking mode",
        "choices": [
          "daily",
          "weekly",
          "monthly",
          "rookie",
          "original",
          "male",
          "female",
          "daily_r18",
          "weekly_r18"
        ]
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "user_id",
      "illust_id",
      "pages",
      "bookmarks",
      "url"
    ],
    "type": "js",
    "modulePath": "pixiv/ranking.js",
    "sourceFile": "pixiv/ranking.js",
    "navigateBefore": "https://www.pixiv.net"
  },
  {
    "site": "pixiv",
    "name": "search",
    "description": "Search Pixiv illustrations by keyword",
    "access": "read",
    "domain": "www.pixiv.net",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword or tag"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      },
      {
        "name": "order",
        "type": "str",
        "default": "date_d",
        "required": false,
        "help": "Sort order",
        "choices": [
          "date_d",
          "date",
          "popular_d",
          "popular_male_d",
          "popular_female_d"
        ]
      },
      {
        "name": "mode",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "Search mode",
        "choices": [
          "all",
          "safe",
          "r18"
        ]
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "user_id",
      "illust_id",
      "pages",
      "bookmarks",
      "tags",
      "url"
    ],
    "type": "js",
    "modulePath": "pixiv/search.js",
    "sourceFile": "pixiv/search.js",
    "navigateBefore": "https://www.pixiv.net"
  },
  {
    "site": "pixiv",
    "name": "user",
    "description": "View Pixiv artist profile",
    "access": "read",
    "domain": "www.pixiv.net",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Pixiv user ID"
      }
    ],
    "columns": [
      "user_id",
      "name",
      "premium",
      "following",
      "illusts",
      "manga",
      "novels",
      "comment",
      "url"
    ],
    "type": "js",
    "modulePath": "pixiv/user.js",
    "sourceFile": "pixiv/user.js",
    "navigateBefore": "https://www.pixiv.net"
  },
  {
    "site": "powerchina",
    "name": "search",
    "description": "搜索中国电建阳光采购公告",
    "access": "read",
    "domain": "bid.powerchina.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword, e.g. \"procurement\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results (max 50)"
      }
    ],
    "columns": [
      "rank",
      "content_type",
      "title",
      "publish_time",
      "project_code",
      "budget_or_limit",
      "url"
    ],
    "type": "js",
    "modulePath": "powerchina/search.js",
    "sourceFile": "powerchina/search.js",
    "navigateBefore": "https://bid.powerchina.cn"
  },
  {
    "site": "producthunt",
    "name": "browse",
    "description": "Best products in a Product Hunt category",
    "access": "read",
    "domain": "www.producthunt.com",
    "strategy": "intercept",
    "browser": true,
    "args": [
      {
        "name": "category",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Category slug, e.g. vibe-coding, ai-agents, developer-tools"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results (max 50)"
      }
    ],
    "columns": [
      "rank",
      "name",
      "tagline",
      "reviews",
      "url"
    ],
    "type": "js",
    "modulePath": "producthunt/browse.js",
    "sourceFile": "producthunt/browse.js",
    "navigateBefore": true
  },
  {
    "site": "producthunt",
    "name": "hot",
    "description": "Today's top Product Hunt launches with vote counts",
    "access": "read",
    "domain": "www.producthunt.com",
    "strategy": "intercept",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results (max 50)"
      }
    ],
    "columns": [
      "rank",
      "name",
      "votes",
      "url"
    ],
    "type": "js",
    "modulePath": "producthunt/hot.js",
    "sourceFile": "producthunt/hot.js",
    "navigateBefore": true
  },
  {
    "site": "producthunt",
    "name": "posts",
    "description": "Latest Product Hunt launches (optional category filter)",
    "access": "read",
    "domain": "www.producthunt.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results (max 50)"
      },
      {
        "name": "category",
        "type": "string",
        "default": "",
        "required": false,
        "help": "Category filter: ai-agents, ai-coding-agents, ai-code-editors, ai-chatbots, ai-workflow-automation, vibe-coding, developer-tools, productivity, design-creative, marketing-sales, no-code-platforms, llms, finance, social-community, engineering-development"
      }
    ],
    "columns": [
      "rank",
      "name",
      "tagline",
      "author",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "producthunt/posts.js",
    "sourceFile": "producthunt/posts.js"
  },
  {
    "site": "producthunt",
    "name": "today",
    "description": "Today's Product Hunt launches (most recent day in feed)",
    "access": "read",
    "domain": "www.producthunt.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results"
      }
    ],
    "columns": [
      "rank",
      "name",
      "tagline",
      "author",
      "url"
    ],
    "type": "js",
    "modulePath": "producthunt/today.js",
    "sourceFile": "producthunt/today.js"
  },
  {
    "site": "pubmed",
    "name": "article",
    "aliases": [
      "paper",
      "read"
    ],
    "description": "Get detailed information for a PubMed article by PMID",
    "access": "read",
    "domain": "pubmed.ncbi.nlm.nih.gov",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "pmid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "PubMed ID, e.g. 37780221"
      },
      {
        "name": "full-abstract",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Do not truncate the abstract in table output"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "pubmed/article.js",
    "sourceFile": "pubmed/article.js"
  },
  {
    "site": "pubmed",
    "name": "author",
    "description": "Search PubMed articles by author name and optional affiliation",
    "access": "read",
    "domain": "pubmed.ncbi.nlm.nih.gov",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Author name, e.g. \"Smith J\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (1-100)"
      },
      {
        "name": "affiliation",
        "type": "str",
        "required": false,
        "help": "Filter by author affiliation"
      },
      {
        "name": "position",
        "type": "str",
        "default": "any",
        "required": false,
        "help": "Author position: any, first, or last",
        "choices": [
          "any",
          "first",
          "last"
        ]
      },
      {
        "name": "year-from",
        "type": "int",
        "required": false,
        "help": "Filter publication year from"
      },
      {
        "name": "year-to",
        "type": "int",
        "required": false,
        "help": "Filter publication year to"
      },
      {
        "name": "sort",
        "type": "str",
        "default": "date",
        "required": false,
        "help": "Sort by date or relevance",
        "choices": [
          "date",
          "relevance"
        ]
      }
    ],
    "columns": [
      "rank",
      "pmid",
      "title",
      "authors",
      "journal",
      "year",
      "article_type",
      "doi",
      "url"
    ],
    "type": "js",
    "modulePath": "pubmed/author.js",
    "sourceFile": "pubmed/author.js"
  },
  {
    "site": "pubmed",
    "name": "citations",
    "description": "Get PubMed citation relationships for an article",
    "access": "read",
    "domain": "pubmed.ncbi.nlm.nih.gov",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "pmid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "PubMed ID, e.g. 37780221"
      },
      {
        "name": "direction",
        "type": "str",
        "default": "citedby",
        "required": false,
        "help": "citedby or references",
        "choices": [
          "citedby",
          "references"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (1-100)"
      }
    ],
    "columns": [
      "rank",
      "pmid",
      "title",
      "authors",
      "journal",
      "year",
      "article_type",
      "doi",
      "url"
    ],
    "type": "js",
    "modulePath": "pubmed/citations.js",
    "sourceFile": "pubmed/citations.js"
  },
  {
    "site": "pubmed",
    "name": "related",
    "description": "Find articles related to a PubMed article",
    "access": "read",
    "domain": "pubmed.ncbi.nlm.nih.gov",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "pmid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "PubMed ID, e.g. 37780221"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (1-100)"
      },
      {
        "name": "score",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Show similarity scores when available"
      }
    ],
    "columns": [
      "rank",
      "pmid",
      "title",
      "authors",
      "journal",
      "year",
      "article_type",
      "score",
      "doi",
      "url"
    ],
    "type": "js",
    "modulePath": "pubmed/related.js",
    "sourceFile": "pubmed/related.js"
  },
  {
    "site": "pubmed",
    "name": "search",
    "description": "Search PubMed articles with advanced filters",
    "access": "read",
    "domain": "pubmed.ncbi.nlm.nih.gov",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query, e.g. \"machine learning cancer\""
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (1-100)"
      },
      {
        "name": "author",
        "type": "str",
        "required": false,
        "help": "Filter by author name"
      },
      {
        "name": "journal",
        "type": "str",
        "required": false,
        "help": "Filter by journal name"
      },
      {
        "name": "year-from",
        "type": "int",
        "required": false,
        "help": "Filter publication year from"
      },
      {
        "name": "year-to",
        "type": "int",
        "required": false,
        "help": "Filter publication year to"
      },
      {
        "name": "article-type",
        "type": "str",
        "required": false,
        "help": "Filter by publication type, e.g. Review or Clinical Trial"
      },
      {
        "name": "has-abstract",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only include articles with abstracts"
      },
      {
        "name": "free-full-text",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only include free full text articles"
      },
      {
        "name": "humans-only",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only include human studies"
      },
      {
        "name": "english-only",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only include English articles"
      },
      {
        "name": "sort",
        "type": "str",
        "default": "relevance",
        "required": false,
        "help": "Sort by relevance, date, author, or journal",
        "choices": [
          "relevance",
          "date",
          "author",
          "journal"
        ]
      }
    ],
    "columns": [
      "rank",
      "pmid",
      "title",
      "authors",
      "journal",
      "year",
      "article_type",
      "doi",
      "url"
    ],
    "type": "js",
    "modulePath": "pubmed/search.js",
    "sourceFile": "pubmed/search.js"
  },
  {
    "site": "pypi",
    "name": "downloads",
    "description": "PyPI download stats for a package (recent totals or full daily history)",
    "access": "read",
    "domain": "pypistats.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "PyPI package name (e.g. \"requests\", \"pandas\")"
      },
      {
        "name": "period",
        "type": "str",
        "default": "recent",
        "required": false,
        "help": "recent (default — 1 row, last day/week/month) or overall (1 row per day)"
      }
    ],
    "columns": [
      "rank",
      "package",
      "period",
      "date",
      "downloads"
    ],
    "type": "js",
    "modulePath": "pypi/downloads.js",
    "sourceFile": "pypi/downloads.js"
  },
  {
    "site": "pypi",
    "name": "package",
    "description": "Single PyPI package metadata (latest version, license, homepage, classifiers)",
    "access": "read",
    "domain": "pypi.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "PyPI package name (e.g. \"requests\", \"pandas\")"
      }
    ],
    "columns": [
      "name",
      "latestVersion",
      "summary",
      "author",
      "license",
      "homepage",
      "repository",
      "requiresPython",
      "keywords",
      "releases",
      "firstReleased",
      "lastReleased",
      "url"
    ],
    "type": "js",
    "modulePath": "pypi/package.js",
    "sourceFile": "pypi/package.js"
  },
  {
    "site": "quark",
    "name": "ls",
    "description": "List files in your Quark Drive",
    "access": "read",
    "domain": "pan.quark.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "path",
        "type": "str",
        "default": "",
        "required": false,
        "positional": true,
        "help": "Folder path to list (empty for root)"
      },
      {
        "name": "depth",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Max depth to traverse"
      },
      {
        "name": "dirs-only",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Show directories only"
      }
    ],
    "columns": [
      "name",
      "is_dir",
      "size",
      "fid",
      "path"
    ],
    "type": "js",
    "modulePath": "quark/ls.js",
    "sourceFile": "quark/ls.js",
    "navigateBefore": "https://pan.quark.cn"
  },
  {
    "site": "quark",
    "name": "mkdir",
    "description": "Create a folder in your Quark Drive",
    "access": "write",
    "domain": "pan.quark.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Folder name"
      },
      {
        "name": "parent",
        "type": "str",
        "required": false,
        "help": "Parent folder path (resolved by name)"
      },
      {
        "name": "parent-fid",
        "type": "str",
        "required": false,
        "help": "Parent folder fid (use directly)"
      }
    ],
    "defaultFormat": "json",
    "type": "js",
    "modulePath": "quark/mkdir.js",
    "sourceFile": "quark/mkdir.js",
    "navigateBefore": "https://pan.quark.cn"
  },
  {
    "site": "quark",
    "name": "mv",
    "description": "Move files to a folder in your Quark Drive",
    "access": "write",
    "domain": "pan.quark.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "fids",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "File IDs to move (comma-separated)"
      },
      {
        "name": "to",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Destination folder path (required unless --to-fid is set)"
      },
      {
        "name": "to-fid",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Destination folder ID (overrides --to)"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds for the overall command (default: 120)"
      }
    ],
    "defaultFormat": "json",
    "type": "js",
    "modulePath": "quark/mv.js",
    "sourceFile": "quark/mv.js",
    "navigateBefore": "https://pan.quark.cn"
  },
  {
    "site": "quark",
    "name": "rename",
    "description": "Rename a file in your Quark Drive",
    "access": "write",
    "domain": "pan.quark.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "fid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "File ID to rename"
      },
      {
        "name": "name",
        "type": "str",
        "required": true,
        "help": "New file name"
      }
    ],
    "defaultFormat": "json",
    "type": "js",
    "modulePath": "quark/rename.js",
    "sourceFile": "quark/rename.js",
    "navigateBefore": "https://pan.quark.cn"
  },
  {
    "site": "quark",
    "name": "rm",
    "description": "Delete files from your Quark Drive",
    "access": "write",
    "domain": "pan.quark.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "fids",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "File IDs to delete (comma-separated)"
      }
    ],
    "defaultFormat": "json",
    "type": "js",
    "modulePath": "quark/rm.js",
    "sourceFile": "quark/rm.js",
    "navigateBefore": "https://pan.quark.cn"
  },
  {
    "site": "quark",
    "name": "save",
    "description": "Save shared files to your Quark Drive",
    "access": "write",
    "domain": "pan.quark.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Quark share URL or pwd_id"
      },
      {
        "name": "to",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Destination folder path"
      },
      {
        "name": "to-fid",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Destination folder ID (overrides --to)"
      },
      {
        "name": "fids",
        "type": "str",
        "default": "",
        "required": false,
        "help": "File IDs to save (comma-separated, from share-tree). Omit to save all."
      },
      {
        "name": "stoken",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Share token (from share-tree output, required with --fids)"
      },
      {
        "name": "passcode",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Share passcode (if required)"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds for the overall command (default: 120)"
      }
    ],
    "defaultFormat": "json",
    "type": "js",
    "modulePath": "quark/save.js",
    "sourceFile": "quark/save.js",
    "navigateBefore": "https://pan.quark.cn"
  },
  {
    "site": "quark",
    "name": "share-tree",
    "description": "Get directory tree from Quark Drive share link as nested JSON",
    "access": "read",
    "domain": "pan.quark.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Quark share URL or pwd_id"
      },
      {
        "name": "passcode",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Share passcode (if required)"
      },
      {
        "name": "depth",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max directory depth"
      }
    ],
    "defaultFormat": "json",
    "type": "js",
    "modulePath": "quark/share-tree.js",
    "sourceFile": "quark/share-tree.js",
    "navigateBefore": "https://pan.quark.cn"
  },
  {
    "site": "qwen",
    "name": "ask",
    "description": "Send a prompt to Qianwen and return the assistant reply",
    "access": "write",
    "domain": "www.qianwen.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send to Qianwen"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 120,
        "required": false,
        "help": "Max seconds to wait for the response"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      },
      {
        "name": "think",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Enable 深度思考 (DeepThink)"
      },
      {
        "name": "research",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Enable 深度研究 (DeepResearch)"
      },
      {
        "name": "markdown",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Emit assistant reply as markdown"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "qwen/ask.js",
    "sourceFile": "qwen/ask.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "qwen",
    "name": "detail",
    "description": "Open a Qianwen conversation by ID and read its messages",
    "access": "read",
    "domain": "www.qianwen.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Session ID (32-char hex) or full https://www.qianwen.com/chat/<id> URL"
      },
      {
        "name": "markdown",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Emit assistant replies as markdown"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "qwen/detail.js",
    "sourceFile": "qwen/detail.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "qwen",
    "name": "history",
    "description": "List recent Qianwen conversations (requires login)",
    "access": "read",
    "domain": "www.qianwen.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max conversations to show (default 20, max 100)"
      }
    ],
    "columns": [
      "Index",
      "Title",
      "Updated",
      "Url"
    ],
    "type": "js",
    "modulePath": "qwen/history.js",
    "sourceFile": "qwen/history.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "qwen",
    "name": "image",
    "description": "Generate images with Qianwen (AI生图) and save them locally",
    "access": "write",
    "domain": "www.qianwen.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image prompt to send"
      },
      {
        "name": "op",
        "type": "str",
        "default": "~/Pictures/qianwen",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": true,
        "required": false,
        "help": "Start a new chat before generating (default: true)"
      },
      {
        "name": "sd",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Skip download; only show the Qianwen link"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 180,
        "required": false,
        "help": "Max seconds to wait for the image response"
      }
    ],
    "columns": [
      "Status",
      "File",
      "Link"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "qwen/image.js",
    "sourceFile": "qwen/image.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "qwen",
    "name": "new",
    "description": "Start a new conversation in Qianwen",
    "access": "write",
    "domain": "www.qianwen.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status"
    ],
    "type": "js",
    "modulePath": "qwen/new.js",
    "sourceFile": "qwen/new.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "qwen",
    "name": "read",
    "description": "Read messages in the current Qianwen conversation",
    "access": "read",
    "domain": "www.qianwen.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "markdown",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Emit assistant replies as markdown"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "qwen/read.js",
    "sourceFile": "qwen/read.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "qwen",
    "name": "send",
    "description": "Fire-and-forget: send a prompt to Qianwen without waiting for the reply",
    "access": "write",
    "domain": "www.qianwen.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send to Qianwen"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      },
      {
        "name": "think",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Enable 深度思考 (DeepThink)"
      },
      {
        "name": "research",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Enable 深度研究 (DeepResearch)"
      }
    ],
    "columns": [
      "Status",
      "Prompt"
    ],
    "type": "js",
    "modulePath": "qwen/send.js",
    "sourceFile": "qwen/send.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "qwen",
    "name": "status",
    "description": "Check Qianwen page availability, login state, current session and model",
    "access": "read",
    "domain": "www.qianwen.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Login",
      "Model",
      "SessionId",
      "Url"
    ],
    "type": "js",
    "modulePath": "qwen/status.js",
    "sourceFile": "qwen/status.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "reddit",
    "name": "comment",
    "description": "Post a comment on a Reddit post",
    "access": "write",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "post-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Post ID (e.g. 1abc123) or fullname (t3_xxx)"
      },
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Comment text"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "reddit/comment.js",
    "sourceFile": "reddit/comment.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "frontpage",
    "description": "Reddit Frontpage / r/all",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "title",
      "subreddit",
      "author",
      "upvotes",
      "comments",
      "url",
      "post_hint",
      "url_overridden_by_dest",
      "preview_image_url",
      "gallery_urls"
    ],
    "type": "js",
    "modulePath": "reddit/frontpage.js",
    "sourceFile": "reddit/frontpage.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "home",
    "description": "Reddit personalized home feed (Best, requires login)",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Number of posts (1–100)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "subreddit",
      "score",
      "comments",
      "postId",
      "author",
      "url",
      "post_hint",
      "url_overridden_by_dest",
      "preview_image_url",
      "gallery_urls"
    ],
    "type": "js",
    "modulePath": "reddit/home.js",
    "sourceFile": "reddit/home.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "hot",
    "description": "Reddit 热门帖子",
    "access": "read",
    "domain": "www.reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "subreddit",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Subreddit name (e.g. programming). Empty for frontpage"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts"
      }
    ],
    "columns": [
      "rank",
      "title",
      "subreddit",
      "score",
      "comments",
      "postId",
      "author",
      "url",
      "post_hint",
      "url_overridden_by_dest",
      "preview_image_url",
      "gallery_urls"
    ],
    "type": "js",
    "modulePath": "reddit/hot.js",
    "sourceFile": "reddit/hot.js",
    "navigateBefore": "https://www.reddit.com"
  },
  {
    "site": "reddit",
    "name": "popular",
    "description": "Reddit Popular posts (/r/popular)",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "subreddit",
      "score",
      "comments",
      "author",
      "url",
      "created_utc",
      "selftext",
      "post_hint",
      "url_overridden_by_dest",
      "preview_image_url",
      "gallery_urls"
    ],
    "type": "js",
    "modulePath": "reddit/popular.js",
    "sourceFile": "reddit/popular.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "read",
    "description": "Read a Reddit post and its comments",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "post-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Post ID (e.g. 1abc123) or full URL"
      },
      {
        "name": "sort",
        "type": "str",
        "default": "best",
        "required": false,
        "help": "Comment sort: best, top, new, controversial, old, qa"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Number of top-level comments"
      },
      {
        "name": "depth",
        "type": "int",
        "default": 2,
        "required": false,
        "help": "Max reply depth (1=no replies, 2=one level of replies, etc.)"
      },
      {
        "name": "replies",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Max replies shown per comment at each level (sorted by score)"
      },
      {
        "name": "max-length",
        "type": "int",
        "default": 2000,
        "required": false,
        "help": "Max characters per comment body (min 100)"
      },
      {
        "name": "expand-more",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Follow Reddit \"more comments\" stubs by calling /api/morechildren.json"
      },
      {
        "name": "expand-rounds",
        "type": "int",
        "default": 2,
        "required": false,
        "help": "Max expansion passes when --expand-more is on (1–5; each round can fan out new \"more\" stubs)"
      }
    ],
    "columns": [
      "type",
      "author",
      "score",
      "text"
    ],
    "type": "js",
    "modulePath": "reddit/read.js",
    "sourceFile": "reddit/read.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "reply",
    "description": "Reply to a Reddit comment",
    "access": "write",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "comment-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Comment ID (e.g. okf3s7u) or fullname (t1_xxx)"
      },
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Reply text"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "reddit/reply.js",
    "sourceFile": "reddit/reply.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "save",
    "description": "Save or unsave a Reddit post",
    "access": "write",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "post-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Post ID (e.g. 1abc123) or fullname (t3_xxx)"
      },
      {
        "name": "undo",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Unsave instead of save"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "reddit/save.js",
    "sourceFile": "reddit/save.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "saved",
    "description": "Browse your saved Reddit posts",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "title",
      "subreddit",
      "score",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "reddit/saved.js",
    "sourceFile": "reddit/saved.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "search",
    "description": "Search Reddit Posts",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Reddit search query"
      },
      {
        "name": "subreddit",
        "type": "string",
        "default": "",
        "required": false,
        "help": "Search within a specific subreddit"
      },
      {
        "name": "sort",
        "type": "string",
        "default": "relevance",
        "required": false,
        "help": "Sort order: relevance, hot, top, new, comments"
      },
      {
        "name": "time",
        "type": "string",
        "default": "all",
        "required": false,
        "help": "Time filter: hour, day, week, month, year, all"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "id",
      "title",
      "subreddit",
      "author",
      "score",
      "comments",
      "url",
      "created_utc",
      "selftext",
      "post_hint",
      "url_overridden_by_dest",
      "preview_image_url",
      "gallery_urls"
    ],
    "type": "js",
    "modulePath": "reddit/search.js",
    "sourceFile": "reddit/search.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "subreddit",
    "description": "Get posts from a specific Subreddit",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "name",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Subreddit name (no `r/` prefix; e.g. `python`)"
      },
      {
        "name": "sort",
        "type": "string",
        "default": "hot",
        "required": false,
        "help": "Sorting method: hot, new, top, rising, controversial"
      },
      {
        "name": "time",
        "type": "string",
        "default": "all",
        "required": false,
        "help": "Time filter for top/controversial: hour, day, week, month, year, all"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "id",
      "title",
      "subreddit",
      "author",
      "upvotes",
      "comments",
      "url",
      "created_utc",
      "selftext",
      "post_hint",
      "url_overridden_by_dest",
      "preview_image_url",
      "gallery_urls"
    ],
    "type": "js",
    "modulePath": "reddit/subreddit.js",
    "sourceFile": "reddit/subreddit.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "subreddit-info",
    "description": "Show metadata for a Reddit subreddit (subscribers, description, created date, NSFW)",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "name",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Subreddit name (no `r/` prefix needed)"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "reddit/subreddit-info.js",
    "sourceFile": "reddit/subreddit-info.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "subscribe",
    "description": "Subscribe or unsubscribe to a subreddit",
    "access": "write",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "subreddit",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Subreddit name (e.g. python)"
      },
      {
        "name": "undo",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Unsubscribe instead of subscribe"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "reddit/subscribe.js",
    "sourceFile": "reddit/subscribe.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "subscribed",
    "description": "List subreddits you are subscribed to",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 100,
        "required": false,
        "help": "Max subreddits to return (1-1000, auto-paginates)"
      }
    ],
    "columns": [
      "id",
      "subreddit",
      "title",
      "subscribers",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "reddit/subscribed.js",
    "sourceFile": "reddit/subscribed.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "upvote",
    "description": "Upvote or downvote a Reddit post",
    "access": "write",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "post-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Post ID (e.g. 1abc123) or fullname (t3_xxx)"
      },
      {
        "name": "direction",
        "type": "string",
        "default": "up",
        "required": false,
        "help": "Vote direction: up, down, none"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "reddit/upvote.js",
    "sourceFile": "reddit/upvote.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "upvoted",
    "description": "Browse your upvoted Reddit posts",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "title",
      "subreddit",
      "score",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "reddit/upvoted.js",
    "sourceFile": "reddit/upvoted.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "user",
    "description": "View a Reddit user profile",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Reddit username (no `u/` prefix needed)"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "reddit/user.js",
    "sourceFile": "reddit/user.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "user-comments",
    "description": "View a Reddit user's comment history",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Reddit username (no `u/` prefix needed)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "subreddit",
      "score",
      "body",
      "url"
    ],
    "type": "js",
    "modulePath": "reddit/user-comments.js",
    "sourceFile": "reddit/user-comments.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "user-posts",
    "description": "View a Reddit user's submitted posts",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Reddit username (no `u/` prefix needed)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": ""
      }
    ],
    "columns": [
      "title",
      "subreddit",
      "score",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "reddit/user-posts.js",
    "sourceFile": "reddit/user-posts.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "reddit",
    "name": "whoami",
    "description": "Show the currently logged-in Reddit user",
    "access": "read",
    "domain": "reddit.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "reddit/whoami.js",
    "sourceFile": "reddit/whoami.js",
    "navigateBefore": "https://reddit.com"
  },
  {
    "site": "rednote",
    "name": "comments",
    "description": "Read comments from a rednote note (supports nested replies)",
    "access": "read",
    "domain": "www.rednote.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Full rednote note URL with xsec_token"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of top-level comments (max 50)"
      },
      {
        "name": "with-replies",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Include nested replies (楼中楼)"
      }
    ],
    "columns": [
      "rank",
      "author",
      "text",
      "likes",
      "time",
      "is_reply",
      "reply_to"
    ],
    "type": "js",
    "modulePath": "rednote/comments.js",
    "sourceFile": "rednote/comments.js",
    "navigateBefore": false
  },
  {
    "site": "rednote",
    "name": "download",
    "description": "Download images and videos from a rednote note",
    "access": "read",
    "domain": "www.rednote.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Full rednote note URL with xsec_token"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./rednote-downloads",
        "required": false,
        "help": "Output directory"
      }
    ],
    "columns": [
      "index",
      "type",
      "status",
      "size"
    ],
    "type": "js",
    "modulePath": "rednote/download.js",
    "sourceFile": "rednote/download.js",
    "navigateBefore": false
  },
  {
    "site": "rednote",
    "name": "feed",
    "description": "Rednote home feed (reads hydrated Pinia store)",
    "access": "read",
    "domain": "www.rednote.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items to return"
      }
    ],
    "columns": [
      "id",
      "title",
      "author",
      "likes",
      "type",
      "url"
    ],
    "type": "js",
    "modulePath": "rednote/feed.js",
    "sourceFile": "rednote/feed.js",
    "navigateBefore": false
  },
  {
    "site": "rednote",
    "name": "note",
    "description": "Read note body and engagement counts from a rednote note",
    "access": "read",
    "domain": "www.rednote.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Full rednote note URL with xsec_token"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "rednote/note.js",
    "sourceFile": "rednote/note.js",
    "navigateBefore": false
  },
  {
    "site": "rednote",
    "name": "notifications",
    "description": "Rednote notifications (mentions/likes/connections)",
    "access": "read",
    "domain": "www.rednote.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "type",
        "type": "str",
        "default": "mentions",
        "required": false,
        "help": "Notification type: mentions, likes, or connections"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of notifications to return"
      }
    ],
    "columns": [
      "rank",
      "user",
      "action",
      "content",
      "note",
      "time"
    ],
    "type": "js",
    "modulePath": "rednote/notifications.js",
    "sourceFile": "rednote/notifications.js",
    "navigateBefore": false
  },
  {
    "site": "rednote",
    "name": "search",
    "description": "Search rednote notes",
    "access": "read",
    "domain": "www.rednote.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "likes",
      "published_at",
      "url",
      "author_url"
    ],
    "type": "js",
    "modulePath": "rednote/search.js",
    "sourceFile": "rednote/search.js",
    "navigateBefore": false
  },
  {
    "site": "rednote",
    "name": "user",
    "description": "Get public notes from a rednote user profile",
    "access": "read",
    "domain": "www.rednote.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "User id or profile URL"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of notes to return"
      }
    ],
    "columns": [
      "id",
      "title",
      "type",
      "likes",
      "url"
    ],
    "type": "js",
    "modulePath": "rednote/user.js",
    "sourceFile": "rednote/user.js",
    "navigateBefore": false
  },
  {
    "site": "rest-countries",
    "name": "country",
    "description": "Look up countries by name (common / official, substring match)",
    "access": "read",
    "domain": "restcountries.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Country name (e.g. \"japan\", \"united kingdom\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 25,
        "required": false,
        "help": "Max rows (1-250)"
      }
    ],
    "columns": [
      "rank",
      "commonName",
      "officialName",
      "cca2",
      "cca3",
      "ccn3",
      "capital",
      "region",
      "subregion",
      "population",
      "area",
      "languages",
      "currencies",
      "latitude",
      "longitude",
      "timezones",
      "independent",
      "unMember",
      "landlocked",
      "flag",
      "url"
    ],
    "type": "js",
    "modulePath": "rest-countries/country.js",
    "sourceFile": "rest-countries/country.js"
  },
  {
    "site": "rest-countries",
    "name": "region",
    "description": "List countries in a region (africa / americas / asia / europe / oceania / antarctic)",
    "access": "read",
    "domain": "restcountries.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "region",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Region name (case-insensitive)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 250,
        "required": false,
        "help": "Max rows (1-250)"
      }
    ],
    "columns": [
      "rank",
      "commonName",
      "officialName",
      "cca2",
      "cca3",
      "ccn3",
      "capital",
      "region",
      "subregion",
      "population",
      "area",
      "languages",
      "currencies",
      "latitude",
      "longitude",
      "timezones",
      "independent",
      "unMember",
      "landlocked",
      "flag",
      "url"
    ],
    "type": "js",
    "modulePath": "rest-countries/region.js",
    "sourceFile": "rest-countries/region.js"
  },
  {
    "site": "reuters",
    "name": "article-detail",
    "description": "Reuters 路透社文章详情：标题/作者/正文文本",
    "access": "read",
    "domain": "www.reuters.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Reuters article URL (must be on reuters.com)"
      }
    ],
    "columns": [
      "title",
      "date",
      "section",
      "section_path",
      "authors",
      "description",
      "word_count",
      "url",
      "body"
    ],
    "type": "js",
    "modulePath": "reuters/article-detail.js",
    "sourceFile": "reuters/article-detail.js",
    "navigateBefore": "https://www.reuters.com"
  },
  {
    "site": "reuters",
    "name": "search",
    "description": "Reuters 路透社新闻搜索",
    "access": "read",
    "domain": "www.reuters.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results (1-40)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "date",
      "section",
      "section_path",
      "authors",
      "url"
    ],
    "type": "js",
    "modulePath": "reuters/search.js",
    "sourceFile": "reuters/search.js",
    "navigateBefore": "https://www.reuters.com"
  },
  {
    "site": "rfc",
    "name": "rfc",
    "description": "Single IETF RFC metadata (title, abstract, working group, authors, std level)",
    "access": "read",
    "domain": "datatracker.ietf.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "number",
        "type": "int",
        "required": true,
        "positional": true,
        "help": "RFC number (e.g. 9000, 791, 2616)"
      }
    ],
    "columns": [
      "rfc",
      "title",
      "state",
      "stdLevel",
      "group",
      "groupType",
      "pages",
      "published",
      "authors",
      "abstract",
      "rfcEditorUrl",
      "url"
    ],
    "type": "js",
    "modulePath": "rfc/rfc.js",
    "sourceFile": "rfc/rfc.js"
  },
  {
    "site": "rubygems",
    "name": "gem",
    "description": "Fetch a RubyGems.org gem's metadata (version, downloads, license, links)",
    "access": "read",
    "domain": "rubygems.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Gem name (e.g. \"rails\", \"sidekiq\")"
      }
    ],
    "columns": [
      "gem",
      "version",
      "releasedAt",
      "downloads",
      "versionDownloads",
      "license",
      "authors",
      "homepage",
      "source",
      "bugs",
      "info",
      "url"
    ],
    "type": "js",
    "modulePath": "rubygems/gem.js",
    "sourceFile": "rubygems/gem.js"
  },
  {
    "site": "rubygems",
    "name": "search",
    "description": "Search RubyGems.org gems by keyword",
    "access": "read",
    "domain": "rubygems.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"rails\", \"redis\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max gems (1-100, single RubyGems page)"
      }
    ],
    "columns": [
      "rank",
      "gem",
      "version",
      "downloads",
      "license",
      "authors",
      "info",
      "url"
    ],
    "type": "js",
    "modulePath": "rubygems/search.js",
    "sourceFile": "rubygems/search.js"
  },
  {
    "site": "sinablog",
    "name": "article",
    "description": "获取新浪博客单篇文章详情",
    "access": "read",
    "domain": "blog.sina.com.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "文章URL（如 https://blog.sina.com.cn/s/blog_xxx.html）"
      }
    ],
    "columns": [
      "title",
      "author",
      "date",
      "category",
      "readCount",
      "commentCount"
    ],
    "type": "js",
    "modulePath": "sinablog/article.js",
    "sourceFile": "sinablog/article.js",
    "navigateBefore": "https://blog.sina.com.cn"
  },
  {
    "site": "sinablog",
    "name": "hot",
    "description": "获取新浪博客热门文章/推荐",
    "access": "read",
    "domain": "blog.sina.com.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的文章数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "date",
      "readCount",
      "url"
    ],
    "type": "js",
    "modulePath": "sinablog/hot.js",
    "sourceFile": "sinablog/hot.js",
    "navigateBefore": "https://blog.sina.com.cn"
  },
  {
    "site": "sinablog",
    "name": "search",
    "description": "搜索新浪博客文章（通过新浪搜索）",
    "access": "read",
    "domain": "blog.sina.com.cn",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的文章数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "date",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "sinablog/search.js",
    "sourceFile": "sinablog/search.js"
  },
  {
    "site": "sinablog",
    "name": "user",
    "description": "获取新浪博客用户的文章列表",
    "access": "read",
    "domain": "blog.sina.com.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "uid",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "新浪博客用户ID（如 1234567890）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的文章数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "date",
      "readCount",
      "url"
    ],
    "type": "js",
    "modulePath": "sinablog/user.js",
    "sourceFile": "sinablog/user.js",
    "navigateBefore": "https://blog.sina.com.cn"
  },
  {
    "site": "sinafinance",
    "name": "news",
    "description": "新浪财经 7x24 小时实时快讯",
    "access": "read",
    "domain": "app.cj.sina.com.cn",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (max 50)"
      },
      {
        "name": "type",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "News type: 0=全部 1=A股 2=宏观 3=公司 4=数据 5=市场 6=国际 7=观点 8=央行 9=其它"
      }
    ],
    "columns": [
      "id",
      "time",
      "content",
      "views"
    ],
    "type": "js",
    "modulePath": "sinafinance/news.js",
    "sourceFile": "sinafinance/news.js"
  },
  {
    "site": "sinafinance",
    "name": "rolling-news",
    "description": "新浪财经滚动新闻",
    "access": "read",
    "domain": "finance.sina.com.cn/roll",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "column",
      "title",
      "date",
      "url"
    ],
    "type": "js",
    "modulePath": "sinafinance/rolling-news.js",
    "sourceFile": "sinafinance/rolling-news.js",
    "navigateBefore": "https://finance.sina.com.cn/roll"
  },
  {
    "site": "sinafinance",
    "name": "stock",
    "description": "新浪财经行情（A股/港股/美股）",
    "access": "read",
    "domain": "suggest3.sinajs.cn,hq.sinajs.cn",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "key",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Stock name or code (e.g. 贵州茅台, 腾讯控股, AAPL)"
      },
      {
        "name": "market",
        "type": "string",
        "default": "auto",
        "required": false,
        "help": "Market: cn, hk, us, auto (default: auto searches cn → hk → us)"
      }
    ],
    "columns": [
      "Symbol",
      "Name",
      "Price",
      "Change",
      "ChangePercent",
      "Open",
      "High",
      "Low",
      "Volume",
      "MarketCap"
    ],
    "type": "js",
    "modulePath": "sinafinance/stock.js",
    "sourceFile": "sinafinance/stock.js"
  },
  {
    "site": "sinafinance",
    "name": "stock-rank",
    "description": "新浪财经热搜榜",
    "access": "read",
    "domain": "finance.sina.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "market",
        "type": "string",
        "default": "cn",
        "required": false,
        "help": "Market: cn (A股), hk (港股), us (美股), wh (外汇), ft (期货)",
        "choices": [
          "cn",
          "hk",
          "us",
          "wh",
          "ft"
        ]
      }
    ],
    "columns": [
      "rank",
      "name",
      "symbol",
      "market",
      "price",
      "change",
      "url"
    ],
    "type": "js",
    "modulePath": "sinafinance/stock-rank.js",
    "sourceFile": "sinafinance/stock-rank.js",
    "navigateBefore": false
  },
  {
    "site": "smzdm",
    "name": "search",
    "description": "什么值得买搜索好价",
    "access": "read",
    "domain": "www.smzdm.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "price",
      "mall",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "smzdm/search.js",
    "sourceFile": "smzdm/search.js",
    "navigateBefore": "https://www.smzdm.com"
  },
  {
    "site": "spotify",
    "name": "auth",
    "description": "Authenticate with Spotify (OAuth — run once)",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "status"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "next",
    "description": "Skip to next track",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "status"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "pause",
    "description": "Pause playback",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "status"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "play",
    "description": "Resume playback or search and play a track/artist",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "default": "",
        "required": false,
        "positional": true,
        "help": "Track or artist to play (optional)"
      }
    ],
    "columns": [
      "track",
      "artist",
      "status"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "prev",
    "description": "Skip to previous track",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "status"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "queue",
    "description": "Add a track to the playback queue",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Track to add to queue"
      }
    ],
    "columns": [
      "track",
      "artist",
      "status"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "repeat",
    "description": "Set repeat mode (off / track / context)",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "mode",
        "type": "str",
        "default": "context",
        "required": false,
        "positional": true,
        "help": "off / track / context",
        "choices": [
          "off",
          "track",
          "context"
        ]
      }
    ],
    "columns": [
      "repeat"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "search",
    "description": "Search for tracks",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results (default: 10)"
      }
    ],
    "columns": [
      "track",
      "artist",
      "album",
      "uri"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "shuffle",
    "description": "Toggle shuffle on/off",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "state",
        "type": "str",
        "default": "on",
        "required": false,
        "positional": true,
        "help": "on or off",
        "choices": [
          "on",
          "off"
        ]
      }
    ],
    "columns": [
      "shuffle"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "status",
    "description": "Show current playback status",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "track",
      "artist",
      "album",
      "status",
      "progress"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "spotify",
    "name": "volume",
    "description": "Set playback volume (0-100)",
    "access": "write",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "level",
        "type": "int",
        "default": 50,
        "required": true,
        "positional": true,
        "help": "Volume 0–100"
      }
    ],
    "columns": [
      "volume"
    ],
    "type": "js",
    "modulePath": "spotify/spotify.js",
    "sourceFile": "spotify/spotify.js"
  },
  {
    "site": "stackoverflow",
    "name": "bounties",
    "description": "Active bounties on Stack Overflow",
    "access": "read",
    "domain": "stackoverflow.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max number of results"
      }
    ],
    "columns": [
      "rank",
      "id",
      "bounty",
      "title",
      "score",
      "answers",
      "views",
      "is_answered",
      "tags",
      "author",
      "creation_date",
      "url"
    ],
    "type": "js",
    "modulePath": "stackoverflow/bounties.js",
    "sourceFile": "stackoverflow/bounties.js"
  },
  {
    "site": "stackoverflow",
    "name": "hot",
    "description": "Hot Stack Overflow questions",
    "access": "read",
    "domain": "stackoverflow.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max number of results"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "answers",
      "views",
      "is_answered",
      "tags",
      "author",
      "creation_date",
      "url"
    ],
    "type": "js",
    "modulePath": "stackoverflow/hot.js",
    "sourceFile": "stackoverflow/hot.js"
  },
  {
    "site": "stackoverflow",
    "name": "read",
    "description": "Read a Stack Overflow question with answers and comments",
    "access": "read",
    "domain": "stackoverflow.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Stack Overflow question id (numeric, e.g. 79935770)"
      },
      {
        "name": "answers-limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max answers to include (1-100; accepted answer always included first)"
      },
      {
        "name": "comments-limit",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Max comments per question/answer (1-100)"
      },
      {
        "name": "max-length",
        "type": "int",
        "default": 4000,
        "required": false,
        "help": "Max characters per body / answer / comment (min 100)"
      }
    ],
    "columns": [
      "type",
      "author",
      "score",
      "accepted",
      "text"
    ],
    "type": "js",
    "modulePath": "stackoverflow/read.js",
    "sourceFile": "stackoverflow/read.js"
  },
  {
    "site": "stackoverflow",
    "name": "related",
    "description": "List Stack Overflow questions related to a given question id.",
    "access": "read",
    "domain": "stackoverflow.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Stack Overflow question id (numeric, e.g. 79935770)."
      },
      {
        "name": "sort",
        "type": "string",
        "default": "rank",
        "required": false,
        "help": "Sort key: rank, activity, votes, creation (rank = SO relevance default)."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max related questions (1-100)."
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "answers",
      "views",
      "isAnswered",
      "tags",
      "author",
      "createdAt",
      "lastActivityAt",
      "url"
    ],
    "type": "js",
    "modulePath": "stackoverflow/related.js",
    "sourceFile": "stackoverflow/related.js"
  },
  {
    "site": "stackoverflow",
    "name": "search",
    "description": "Search Stack Overflow questions",
    "access": "read",
    "domain": "stackoverflow.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max number of results"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "answers",
      "views",
      "is_answered",
      "tags",
      "author",
      "creation_date",
      "url"
    ],
    "type": "js",
    "modulePath": "stackoverflow/search.js",
    "sourceFile": "stackoverflow/search.js"
  },
  {
    "site": "stackoverflow",
    "name": "tag",
    "description": "List Stack Overflow questions tagged with a given tag (most active first).",
    "access": "read",
    "domain": "stackoverflow.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "tag",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Tag slug (e.g. python, rust, typescript)."
      },
      {
        "name": "sort",
        "type": "string",
        "default": "activity",
        "required": false,
        "help": "Sort key: activity, votes, creation, hot, week, month"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max questions to return (max 100)."
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "answers",
      "views",
      "isAnswered",
      "tags",
      "author",
      "createdAt",
      "lastActivityAt",
      "url"
    ],
    "type": "js",
    "modulePath": "stackoverflow/tag.js",
    "sourceFile": "stackoverflow/tag.js"
  },
  {
    "site": "stackoverflow",
    "name": "unanswered",
    "description": "Top voted unanswered questions on Stack Overflow",
    "access": "read",
    "domain": "stackoverflow.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max number of results"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "score",
      "answers",
      "views",
      "tags",
      "author",
      "creation_date",
      "url"
    ],
    "type": "js",
    "modulePath": "stackoverflow/unanswered.js",
    "sourceFile": "stackoverflow/unanswered.js"
  },
  {
    "site": "stackoverflow",
    "name": "user",
    "description": "Find Stack Overflow users by display name (highest reputation first).",
    "access": "read",
    "domain": "stackoverflow.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Display name (or substring) to search."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max users to return (max 100)."
      }
    ],
    "columns": [
      "userId",
      "displayName",
      "reputation",
      "goldBadges",
      "silverBadges",
      "bronzeBadges",
      "location",
      "createdAt",
      "lastAccessAt",
      "url"
    ],
    "type": "js",
    "modulePath": "stackoverflow/user.js",
    "sourceFile": "stackoverflow/user.js"
  },
  {
    "site": "steam",
    "name": "app",
    "description": "Steam storefront detail for a single app id",
    "access": "read",
    "domain": "store.steampowered.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Numeric Steam app id (e.g. \"620\" for Portal 2)"
      },
      {
        "name": "currency",
        "type": "str",
        "default": "us",
        "required": false,
        "help": "Storefront country code (e.g. us / cn / jp / de)"
      }
    ],
    "columns": [
      "id",
      "name",
      "type",
      "isFree",
      "releaseDate",
      "developers",
      "publishers",
      "price",
      "currency",
      "metacritic",
      "recommendations",
      "genres",
      "categories",
      "shortDescription",
      "website",
      "url"
    ],
    "type": "js",
    "modulePath": "steam/app.js",
    "sourceFile": "steam/app.js"
  },
  {
    "site": "steam",
    "name": "search",
    "description": "Search the Steam storefront by name keyword",
    "access": "read",
    "domain": "store.steampowered.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (e.g. \"portal\", \"stardew\")"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (1-50)"
      },
      {
        "name": "currency",
        "type": "str",
        "default": "us",
        "required": false,
        "help": "Storefront country code (e.g. us / cn / jp / de)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "name",
      "price",
      "currency",
      "metascore",
      "platforms",
      "url"
    ],
    "type": "js",
    "modulePath": "steam/search.js",
    "sourceFile": "steam/search.js"
  },
  {
    "site": "steam",
    "name": "top-sellers",
    "description": "Steam top selling games",
    "access": "read",
    "domain": "store.steampowered.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of games"
      }
    ],
    "columns": [
      "rank",
      "name",
      "price",
      "discount",
      "url"
    ],
    "type": "js",
    "modulePath": "steam/top-sellers.js",
    "sourceFile": "steam/top-sellers.js"
  },
  {
    "site": "substack",
    "name": "feed",
    "description": "Substack 热门文章 Feed",
    "access": "read",
    "domain": "substack.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "category",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "文章分类: all, tech, business, culture, politics, science, health"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的文章数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "date",
      "readTime",
      "url"
    ],
    "type": "js",
    "modulePath": "substack/feed.js",
    "sourceFile": "substack/feed.js",
    "navigateBefore": "https://substack.com"
  },
  {
    "site": "substack",
    "name": "publication",
    "description": "获取特定 Substack Newsletter 的最新文章",
    "access": "read",
    "domain": "substack.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Newsletter URL（如 https://example.substack.com）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回的文章数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "date",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "substack/publication.js",
    "sourceFile": "substack/publication.js",
    "navigateBefore": "https://substack.com"
  },
  {
    "site": "substack",
    "name": "search",
    "description": "搜索 Substack 文章和 Newsletter",
    "access": "read",
    "domain": "substack.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "type",
        "type": "str",
        "default": "posts",
        "required": false,
        "help": "搜索类型（posts=文章, publications=Newsletter）",
        "choices": [
          "posts",
          "publications"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回结果数量"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "date",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "substack/search.js",
    "sourceFile": "substack/search.js"
  },
  {
    "site": "suno",
    "name": "download",
    "description": "Download an existing Suno clip (MP3 + optional WAV/M4A/video) by id",
    "access": "write",
    "domain": "suno.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "clip",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Clip UUID or https://suno.com/song/<id> URL"
      },
      {
        "name": "formats",
        "type": "str",
        "required": false,
        "help": "Comma-separated formats: mp3, m4a, wav, video, cover, metadata. Default: mp3,metadata"
      },
      {
        "name": "op",
        "type": "str",
        "required": false,
        "help": "Output directory (default: ~/Music/suno)"
      },
      {
        "name": "confirm-paid",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Required to allow paid downloads (wav). Without it, paid formats are skipped with a warning."
      }
    ],
    "columns": [
      "status",
      "clip",
      "title",
      "files",
      "link"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "suno/download.js",
    "sourceFile": "suno/download.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "suno",
    "name": "generate",
    "description": "Generate music with Suno (V5.5 chirp-fenix by default) and download clips locally",
    "access": "write",
    "domain": "suno.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Simple-mode description (ignored when --lyrics is provided)"
      },
      {
        "name": "lyrics",
        "type": "str",
        "required": false,
        "help": "Custom-mode lyrics (with [Verse]/[Chorus] metatags). Triggers Custom mode."
      },
      {
        "name": "tags",
        "type": "str",
        "required": false,
        "help": "Custom-mode style tags (genre, BPM, instruments...). Used with --lyrics."
      },
      {
        "name": "negative-tags",
        "type": "str",
        "required": false,
        "help": "Custom-mode style exclusions (e.g. \"no vocals, no autotune\"). Used with --lyrics."
      },
      {
        "name": "title",
        "type": "str",
        "required": false,
        "help": "Song title (default: auto-derived from prompt)"
      },
      {
        "name": "instrumental",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "No vocals"
      },
      {
        "name": "model",
        "type": "str",
        "required": false,
        "help": "Model id: chirp-fenix, chirp-bluejay, chirp-v4, chirp-v3-5. Default: chirp-fenix"
      },
      {
        "name": "weirdness",
        "type": "str",
        "required": false,
        "help": "Creative weirdness slider (0..1). Default: 0.5"
      },
      {
        "name": "style-weight",
        "type": "str",
        "required": false,
        "help": "Style adherence slider (0..1). Default: 0.5"
      },
      {
        "name": "formats",
        "type": "str",
        "required": false,
        "help": "Comma-separated download formats: mp3, m4a, wav, video, cover, metadata. Default: mp3,metadata"
      },
      {
        "name": "op",
        "type": "str",
        "required": false,
        "help": "Output directory (default: ~/Music/suno)"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 300,
        "required": false,
        "help": "Max seconds to wait for clips to finish (default: 300)"
      },
      {
        "name": "sd",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Skip download; only print clip ids and Suno URLs"
      },
      {
        "name": "confirm-paid",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Required to allow paid downloads (wav). Without it, paid formats are skipped with a warning."
      }
    ],
    "columns": [
      "status",
      "clip",
      "title",
      "files",
      "link"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "suno/generate.js",
    "sourceFile": "suno/generate.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "suno",
    "name": "list",
    "description": "List recent Suno clips in your library (id, title, status, created_at, link)",
    "access": "read",
    "domain": "suno.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max clips to list (default: 20)"
      },
      {
        "name": "page",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Pagination offset, 0-based (default: 0)"
      }
    ],
    "columns": [
      "rank",
      "clip",
      "title",
      "status",
      "created",
      "link"
    ],
    "type": "js",
    "modulePath": "suno/list.js",
    "sourceFile": "suno/list.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "suno",
    "name": "status",
    "description": "Check Suno login, plan, credit balance, and captcha readiness",
    "access": "read",
    "domain": "suno.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Plan",
      "Credits",
      "Monthly",
      "Captcha"
    ],
    "type": "js",
    "modulePath": "suno/status.js",
    "sourceFile": "suno/status.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "taobao",
    "name": "add-cart",
    "description": "淘宝加入购物车",
    "access": "write",
    "domain": "item.taobao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品 ID"
      },
      {
        "name": "spec",
        "type": "str",
        "required": false,
        "help": "规格关键词（如 \"180度\" \"红色 XL\"），多个规格用空格分隔，模糊匹配"
      },
      {
        "name": "dry-run",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "仅预览，不实际加入购物车"
      }
    ],
    "columns": [
      "status",
      "title",
      "price",
      "selected_spec",
      "item_id"
    ],
    "type": "js",
    "modulePath": "taobao/add-cart.js",
    "sourceFile": "taobao/add-cart.js",
    "navigateBefore": false
  },
  {
    "site": "taobao",
    "name": "cart",
    "description": "查看淘宝购物车",
    "access": "read",
    "domain": "cart.taobao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量 (max 50)"
      }
    ],
    "columns": [
      "index",
      "title",
      "price",
      "spec",
      "shop"
    ],
    "type": "js",
    "modulePath": "taobao/cart.js",
    "sourceFile": "taobao/cart.js",
    "navigateBefore": false
  },
  {
    "site": "taobao",
    "name": "detail",
    "description": "淘宝商品详情",
    "access": "read",
    "domain": "item.taobao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品 ID"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "taobao/detail.js",
    "sourceFile": "taobao/detail.js",
    "navigateBefore": false
  },
  {
    "site": "taobao",
    "name": "reviews",
    "description": "淘宝商品评价",
    "access": "read",
    "domain": "item.taobao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品 ID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回评价数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "user",
      "content",
      "date",
      "spec"
    ],
    "type": "js",
    "modulePath": "taobao/reviews.js",
    "sourceFile": "taobao/reviews.js",
    "navigateBefore": false
  },
  {
    "site": "taobao",
    "name": "search",
    "description": "淘宝商品搜索",
    "access": "read",
    "domain": "s.taobao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "sort",
        "type": "str",
        "default": "default",
        "required": false,
        "help": "排序 (default/sale销量/price价格)",
        "choices": [
          "default",
          "sale",
          "price"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 40)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "price",
      "sales",
      "shop",
      "location",
      "item_id",
      "url"
    ],
    "type": "js",
    "modulePath": "taobao/search.js",
    "sourceFile": "taobao/search.js",
    "navigateBefore": false
  },
  {
    "site": "tdx",
    "name": "hot-rank",
    "description": "通达信热搜榜",
    "access": "read",
    "domain": "pul.tdx.com.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量"
      }
    ],
    "columns": [
      "rank",
      "symbol",
      "name",
      "changePercent",
      "heat",
      "tags"
    ],
    "type": "js",
    "modulePath": "tdx/hot-rank.js",
    "sourceFile": "tdx/hot-rank.js",
    "navigateBefore": true
  },
  {
    "site": "ths",
    "name": "hot-rank",
    "description": "同花顺热股榜",
    "access": "read",
    "domain": "eq.10jqka.com.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量"
      }
    ],
    "columns": [
      "rank",
      "name",
      "changePercent",
      "heat",
      "tags"
    ],
    "type": "js",
    "modulePath": "ths/hot-rank.js",
    "sourceFile": "ths/hot-rank.js",
    "navigateBefore": true
  },
  {
    "site": "tieba",
    "name": "hot",
    "description": "Tieba hot topics",
    "access": "read",
    "domain": "tieba.baidu.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items to return"
      }
    ],
    "columns": [
      "rank",
      "title",
      "discussions",
      "description",
      "url"
    ],
    "type": "js",
    "modulePath": "tieba/hot.js",
    "sourceFile": "tieba/hot.js"
  },
  {
    "site": "tieba",
    "name": "posts",
    "description": "Browse posts in a tieba forum",
    "access": "read",
    "domain": "tieba.baidu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "forum",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Forum name in Chinese"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items to return"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "replies"
    ],
    "type": "js",
    "modulePath": "tieba/posts.js",
    "sourceFile": "tieba/posts.js",
    "navigateBefore": false
  },
  {
    "site": "tieba",
    "name": "read",
    "description": "Read a tieba thread",
    "access": "read",
    "domain": "tieba.baidu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Thread ID"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Number of replies to return"
      }
    ],
    "columns": [
      "floor",
      "author",
      "content",
      "time"
    ],
    "type": "js",
    "modulePath": "tieba/read.js",
    "sourceFile": "tieba/read.js",
    "navigateBefore": false
  },
  {
    "site": "tieba",
    "name": "search",
    "description": "Search posts across tieba",
    "access": "read",
    "domain": "tieba.baidu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number (currently only 1 is supported)",
        "choices": [
          "1"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items to return"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "forum",
      "author",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "tieba/search.js",
    "sourceFile": "tieba/search.js",
    "navigateBefore": false
  },
  {
    "site": "tiktok",
    "name": "comment",
    "description": "Post a comment on a TikTok video",
    "access": "write",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok video URL (https://www.tiktok.com/@user/video/<id>)"
      },
      {
        "name": "text",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Comment text (≤150 chars)"
      }
    ],
    "columns": [
      "url",
      "text",
      "result"
    ],
    "type": "js",
    "modulePath": "tiktok/comment.js",
    "sourceFile": "tiktok/comment.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "creator-videos",
    "description": "TikTok Studio creator content list (views/likes/comments/saves/shares)",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of creator videos to return (max 250)"
      },
      {
        "name": "cursor",
        "type": "string",
        "default": "0",
        "required": false,
        "help": "Non-negative TikTok Studio pagination cursor"
      }
    ],
    "columns": [
      "video_id",
      "title",
      "date",
      "views",
      "likes",
      "comments",
      "saves",
      "shares",
      "url"
    ],
    "type": "js",
    "modulePath": "tiktok/creator-videos.js",
    "sourceFile": "tiktok/creator-videos.js",
    "navigateBefore": "https://www.tiktok.com/tiktokstudio/content"
  },
  {
    "site": "tiktok",
    "name": "explore",
    "description": "Get trending TikTok videos from the recommend feed via page-context APIs",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of videos to return (max 120)"
      }
    ],
    "columns": [
      "index",
      "id",
      "author",
      "url",
      "cover",
      "title",
      "desc",
      "plays",
      "likes",
      "comments",
      "shares",
      "createTime"
    ],
    "type": "js",
    "modulePath": "tiktok/explore.js",
    "sourceFile": "tiktok/explore.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "follow",
    "description": "Follow a TikTok user by username",
    "access": "write",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok username (without @)"
      }
    ],
    "columns": [
      "username",
      "url",
      "result"
    ],
    "type": "js",
    "modulePath": "tiktok/follow.js",
    "sourceFile": "tiktok/follow.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "following",
    "description": "List accounts the logged-in user follows on TikTok via page-context APIs",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of accounts (max 200)"
      }
    ],
    "columns": [
      "index",
      "username",
      "name",
      "secUid",
      "verified",
      "followers",
      "following",
      "url"
    ],
    "type": "js",
    "modulePath": "tiktok/following.js",
    "sourceFile": "tiktok/following.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "friends",
    "description": "Get TikTok friend / who-to-follow suggestions via page-context APIs",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of suggestions (max 100)"
      }
    ],
    "columns": [
      "index",
      "username",
      "name",
      "secUid",
      "verified",
      "followers",
      "following",
      "url"
    ],
    "type": "js",
    "modulePath": "tiktok/friends.js",
    "sourceFile": "tiktok/friends.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "like",
    "description": "Like a TikTok video",
    "access": "write",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok video URL"
      }
    ],
    "columns": [
      "status",
      "likes",
      "url"
    ],
    "type": "js",
    "modulePath": "tiktok/like.js",
    "sourceFile": "tiktok/like.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "live",
    "description": "Browse TikTok live streams via page-context APIs",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of streams (max 60)"
      }
    ],
    "columns": [
      "index",
      "streamer",
      "name",
      "title",
      "viewers",
      "likes",
      "secUid",
      "url"
    ],
    "type": "js",
    "modulePath": "tiktok/live.js",
    "sourceFile": "tiktok/live.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "notifications",
    "description": "Read TikTok inbox notifications (likes, comments, mentions, followers) via page-context APIs",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of notifications (max 100)"
      },
      {
        "name": "type",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "Notification type",
        "choices": [
          "all",
          "likes",
          "comments",
          "mentions",
          "followers"
        ]
      }
    ],
    "columns": [
      "index",
      "id",
      "from",
      "text",
      "createTime"
    ],
    "type": "js",
    "modulePath": "tiktok/notifications.js",
    "sourceFile": "tiktok/notifications.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "profile",
    "description": "Get TikTok user profile info",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok username (without @)"
      }
    ],
    "columns": [
      "username",
      "name",
      "followers",
      "following",
      "likes",
      "videos",
      "verified",
      "bio"
    ],
    "type": "js",
    "modulePath": "tiktok/profile.js",
    "sourceFile": "tiktok/profile.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "save",
    "description": "Add a TikTok video to Favorites",
    "access": "write",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok video URL"
      }
    ],
    "columns": [
      "status",
      "url"
    ],
    "type": "js",
    "modulePath": "tiktok/save.js",
    "sourceFile": "tiktok/save.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "search",
    "description": "Search TikTok videos",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "desc",
      "author",
      "url",
      "plays",
      "likes",
      "comments",
      "shares"
    ],
    "type": "js",
    "modulePath": "tiktok/search.js",
    "sourceFile": "tiktok/search.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "unfollow",
    "description": "Unfollow a TikTok user by username",
    "access": "write",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok username (without @)"
      }
    ],
    "columns": [
      "username",
      "url",
      "result"
    ],
    "type": "js",
    "modulePath": "tiktok/unfollow.js",
    "sourceFile": "tiktok/unfollow.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "unlike",
    "description": "Unlike a TikTok video",
    "access": "write",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok video URL"
      }
    ],
    "columns": [
      "status",
      "likes",
      "url"
    ],
    "type": "js",
    "modulePath": "tiktok/unlike.js",
    "sourceFile": "tiktok/unlike.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "unsave",
    "description": "Remove a TikTok video from Favorites",
    "access": "write",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok video URL"
      }
    ],
    "columns": [
      "status",
      "url"
    ],
    "type": "js",
    "modulePath": "tiktok/unsave.js",
    "sourceFile": "tiktok/unsave.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "tiktok",
    "name": "user",
    "description": "Get recent videos from a TikTok user via page-context APIs",
    "access": "read",
    "domain": "www.tiktok.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "TikTok username (without @)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of videos to return (max 120)"
      }
    ],
    "columns": [
      "index",
      "id",
      "source",
      "author",
      "url",
      "cover",
      "title",
      "desc",
      "plays",
      "likes",
      "comments",
      "shares",
      "createTime"
    ],
    "type": "js",
    "modulePath": "tiktok/user.js",
    "sourceFile": "tiktok/user.js",
    "navigateBefore": "https://www.tiktok.com"
  },
  {
    "site": "toutiao",
    "name": "articles",
    "description": "获取头条号创作者后台文章列表及数据",
    "access": "read",
    "domain": "mp.toutiao.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "页码 (1-4)"
      }
    ],
    "columns": [
      "title",
      "date",
      "status",
      "展现",
      "阅读",
      "点赞",
      "评论"
    ],
    "type": "js",
    "modulePath": "toutiao/articles.js",
    "sourceFile": "toutiao/articles.js",
    "navigateBefore": "https://mp.toutiao.com"
  },
  {
    "site": "toutiao",
    "name": "hot",
    "description": "今日头条首页热榜（公开 API，无需登录）",
    "access": "read",
    "domain": "www.toutiao.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "返回条数 (1-50)"
      }
    ],
    "columns": [
      "rank",
      "group_id",
      "title",
      "query",
      "hot_value",
      "label",
      "url",
      "image_url"
    ],
    "type": "js",
    "modulePath": "toutiao/hot.js",
    "sourceFile": "toutiao/hot.js"
  },
  {
    "site": "tvmaze",
    "name": "search",
    "description": "TVmaze TV show search by title (returns id, name, network, premiered/ended, rating)",
    "access": "read",
    "domain": "tvmaze.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "TV show title or fragment to search for"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max rows to return (1-50)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "name",
      "type",
      "language",
      "genres",
      "status",
      "premiered",
      "ended",
      "network",
      "rating",
      "matchScore",
      "summary",
      "url"
    ],
    "type": "js",
    "modulePath": "tvmaze/search.js",
    "sourceFile": "tvmaze/search.js"
  },
  {
    "site": "tvmaze",
    "name": "show",
    "description": "Single TVmaze TV show detail by id (network, schedule, rating, IMDB/TheTVDB cross-refs)",
    "access": "read",
    "domain": "tvmaze.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "int",
        "required": true,
        "positional": true,
        "help": "TVmaze show id (positive integer)"
      }
    ],
    "columns": [
      "id",
      "name",
      "type",
      "language",
      "genres",
      "status",
      "premiered",
      "ended",
      "runtime",
      "averageRuntime",
      "network",
      "country",
      "schedule",
      "rating",
      "imdb",
      "thetvdb",
      "officialSite",
      "summary",
      "url"
    ],
    "type": "js",
    "modulePath": "tvmaze/show.js",
    "sourceFile": "tvmaze/show.js"
  },
  {
    "site": "twitter",
    "name": "accept",
    "description": "Auto-accept DM requests containing specific keywords",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Keywords to match (comma-separated for OR, e.g. \"群,微信\")"
      },
      {
        "name": "max",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of requests to accept (default: 20)"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 600,
        "required": false,
        "help": "Max seconds for the overall command (default: 600 — batch op)"
      }
    ],
    "columns": [
      "index",
      "status",
      "user",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/accept.js",
    "sourceFile": "twitter/accept.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "article",
    "description": "Fetch a Twitter Article (long-form content) and export as Markdown",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "tweet-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Tweet ID or URL containing the article"
      }
    ],
    "columns": [
      "title",
      "author",
      "content",
      "url"
    ],
    "type": "js",
    "modulePath": "twitter/article.js",
    "sourceFile": "twitter/article.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "block",
    "description": "Block a Twitter user",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Twitter screen name (without @)"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/block.js",
    "sourceFile": "twitter/block.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "bookmark",
    "description": "Bookmark a tweet",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Tweet URL to bookmark"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/bookmark.js",
    "sourceFile": "twitter/bookmark.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "bookmark-folder",
    "description": "Read the tweets inside a single Twitter/X bookmark folder. Get the folder id from `opencli twitter bookmark-folders`.",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "folder-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Folder id from `opencli twitter bookmark-folders`."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of bookmarks to return (default 20)."
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank the folder by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the API's native (saved-time) ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "text",
      "likes",
      "retweets",
      "bookmarks",
      "created_at",
      "url",
      "has_media",
      "media_urls"
    ],
    "type": "js",
    "modulePath": "twitter/bookmark-folder.js",
    "sourceFile": "twitter/bookmark-folder.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "bookmark-folders",
    "description": "List your Twitter/X bookmark folders (the user-created collections under Bookmarks). Returns folder id, name, item count, and created_at.",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "id",
      "name",
      "items",
      "created_at"
    ],
    "type": "js",
    "modulePath": "twitter/bookmark-folders.js",
    "sourceFile": "twitter/bookmark-folders.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "bookmarks",
    "description": "Fetch your Twitter/X bookmarks (the logged-in user's saved tweets, newest first)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of bookmarks to return (default 20)."
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank the bookmarks by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the API's native (saved-time) ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "text",
      "likes",
      "retweets",
      "bookmarks",
      "created_at",
      "url",
      "has_media",
      "media_urls"
    ],
    "type": "js",
    "modulePath": "twitter/bookmarks.js",
    "sourceFile": "twitter/bookmarks.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "delete",
    "description": "Delete a specific tweet by URL",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The URL of the tweet to delete"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/delete.js",
    "sourceFile": "twitter/delete.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "device-follow",
    "description": "Read the /i/timeline device-follow notification stream (tweets aggregated under a bell-icon \"new posts from @userA and N others\" notification)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of tweets to return (1-200, default 20)"
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank by weighted engagement and return the top N. Default 0 keeps upstream ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "text",
      "likes",
      "retweets",
      "replies",
      "views",
      "created_at",
      "url"
    ],
    "type": "js",
    "modulePath": "twitter/device-follow.js",
    "sourceFile": "twitter/device-follow.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "download",
    "description": "Download Twitter/X media (images and videos). Provide either <username> to fetch every media item from their profile via the GraphQL UserMedia endpoint with cursor pagination, or --tweet-url to download a single tweet.",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Twitter username (with or without @) to scan their profile media. Either <username> or --tweet-url is required."
      },
      {
        "name": "tweet-url",
        "type": "str",
        "required": false,
        "help": "Single tweet URL to download. Use this OR <username>, not both required at once."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Maximum number of media items to download when scanning a profile (default 10). Ignored when --tweet-url is used."
      },
      {
        "name": "output",
        "type": "str",
        "default": "./twitter-downloads",
        "required": false,
        "help": "Output directory (default ./twitter-downloads). A per-source subdir is created inside."
      }
    ],
    "columns": [
      "index",
      "tweet_id",
      "url",
      "type",
      "status",
      "size"
    ],
    "type": "js",
    "modulePath": "twitter/download.js",
    "sourceFile": "twitter/download.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "follow",
    "description": "Follow a Twitter user",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Twitter screen name (without @)"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/follow.js",
    "sourceFile": "twitter/follow.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "followers",
    "description": "Get accounts following a Twitter/X user (defaults to the logged-in user when no user is given)",
    "access": "read",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "user",
        "type": "string",
        "required": false,
        "positional": true,
        "help": "Twitter/X handle (with or without @). Omit to fetch followers of the currently logged-in account."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Maximum number of follower rows to return (default 50). Must be a positive integer."
      }
    ],
    "columns": [
      "screen_name",
      "name",
      "bio"
    ],
    "type": "js",
    "modulePath": "twitter/followers.js",
    "sourceFile": "twitter/followers.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "following",
    "description": "Get accounts a Twitter/X user is following (defaults to the logged-in user when no user is given)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "user",
        "type": "string",
        "required": false,
        "positional": true,
        "help": "Twitter/X handle (with or without @). Omit to fetch the accounts the currently logged-in user follows."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Maximum number of following rows to return (default 50). Must be a positive integer."
      }
    ],
    "columns": [
      "screen_name",
      "name",
      "bio",
      "followers"
    ],
    "type": "js",
    "modulePath": "twitter/following.js",
    "sourceFile": "twitter/following.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "hide-reply",
    "description": "Hide a reply on your tweet (useful for hiding bot/spam replies)",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The URL of the reply tweet to hide"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/hide-reply.js",
    "sourceFile": "twitter/hide-reply.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "like",
    "description": "Like a specific tweet",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The URL of the tweet to like"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/like.js",
    "sourceFile": "twitter/like.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "likes",
    "description": "Fetch liked tweets of a Twitter user (defaults to the logged-in user when no username is given)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": false,
        "positional": true,
        "help": "Twitter screen name (with or without @). Defaults to the logged-in user when omitted."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of liked tweets to return (default 20)."
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank the liked tweets by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the API's native (recency) ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "name",
      "text",
      "likes",
      "retweets",
      "created_at",
      "url",
      "has_media",
      "media_urls"
    ],
    "type": "js",
    "modulePath": "twitter/likes.js",
    "sourceFile": "twitter/likes.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "list-add",
    "description": "Add a user to a Twitter/X list you own (no-op if already a member)",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "listId",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Numeric ID of the list you own (e.g. from `opencli twitter lists`)"
      },
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Twitter/X handle to add (with or without @)"
      }
    ],
    "columns": [
      "listId",
      "username",
      "userId",
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/list-add.js",
    "sourceFile": "twitter/list-add.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "list-create",
    "description": "Create a new Twitter/X list (returns the new list id)",
    "access": "write",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "name",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "List name (max 25 chars)"
      },
      {
        "name": "description",
        "type": "string",
        "default": "",
        "required": false,
        "help": "Optional list description (max 100 chars)"
      },
      {
        "name": "mode",
        "type": "string",
        "default": "public",
        "required": false,
        "help": "public | private"
      }
    ],
    "columns": [
      "id",
      "name",
      "description",
      "mode",
      "status"
    ],
    "type": "js",
    "modulePath": "twitter/list-create.js",
    "sourceFile": "twitter/list-create.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "list-remove",
    "description": "Remove a user from a Twitter/X list you own (toggles via UI; no-op if not currently a member)",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "listId",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Numeric ID of the list you own (e.g. from `opencli twitter lists`)"
      },
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Twitter/X handle to remove (with or without @)"
      }
    ],
    "columns": [
      "listId",
      "username",
      "userId",
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/list-remove.js",
    "sourceFile": "twitter/list-remove.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "list-tweets",
    "description": "Fetch tweets from a Twitter/X list timeline",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "listId",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Numeric ID of a Twitter/X list (e.g. from `opencli twitter lists`)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": ""
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank the list timeline by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the list's native (recency) ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "bio",
      "text",
      "likes",
      "retweets",
      "replies",
      "created_at",
      "url",
      "has_media",
      "media_urls",
      "card",
      "quoted_tweet"
    ],
    "type": "js",
    "modulePath": "twitter/list-tweets.js",
    "sourceFile": "twitter/list-tweets.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "lists",
    "description": "Get Twitter/X lists for the logged-in user (owned + subscribed)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Maximum number of lists to return (default 50)."
      }
    ],
    "columns": [
      "id",
      "name",
      "members",
      "followers",
      "mode"
    ],
    "type": "js",
    "modulePath": "twitter/lists.js",
    "sourceFile": "twitter/lists.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "notifications",
    "description": "Get your Twitter/X notifications (the logged-in user's likes/replies/follows feed, newest first)",
    "access": "read",
    "domain": "x.com",
    "strategy": "intercept",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of notifications to return (default 20)."
      }
    ],
    "columns": [
      "id",
      "action",
      "author",
      "text",
      "url"
    ],
    "type": "js",
    "modulePath": "twitter/notifications.js",
    "sourceFile": "twitter/notifications.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "post",
    "description": "Post a new tweet/thread",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The text content of the tweet"
      },
      {
        "name": "images",
        "type": "string",
        "required": false,
        "help": "Image paths, comma-separated, max 4 (jpg/png/gif/webp)"
      }
    ],
    "columns": [
      "status",
      "message",
      "text",
      "id",
      "url"
    ],
    "type": "js",
    "modulePath": "twitter/post.js",
    "sourceFile": "twitter/post.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "profile",
    "description": "Fetch a Twitter user profile — bio, stats, etc. (defaults to the logged-in user when no username is given)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": false,
        "positional": true,
        "help": "Twitter screen name (with or without @). Defaults to the logged-in user when omitted."
      }
    ],
    "columns": [
      "screen_name",
      "name",
      "bio",
      "location",
      "url",
      "followers",
      "following",
      "tweets",
      "likes",
      "verified",
      "created_at"
    ],
    "type": "js",
    "modulePath": "twitter/profile.js",
    "sourceFile": "twitter/profile.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "quote",
    "description": "Quote-tweet a specific tweet with your own text, optionally with a local or remote image",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The URL of the tweet to quote"
      },
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The text content of your quote"
      },
      {
        "name": "image",
        "type": "str",
        "required": false,
        "help": "Optional local image path to attach to the quote tweet"
      },
      {
        "name": "image-url",
        "type": "str",
        "required": false,
        "help": "Optional remote image URL to download and attach to the quote tweet"
      }
    ],
    "columns": [
      "status",
      "message",
      "text"
    ],
    "type": "js",
    "modulePath": "twitter/quote.js",
    "sourceFile": "twitter/quote.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "reply",
    "description": "Reply to a specific tweet, optionally with a local or remote image",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The URL of the tweet to reply to"
      },
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The text content of your reply"
      },
      {
        "name": "image",
        "type": "str",
        "required": false,
        "help": "Optional local image path to attach to the reply"
      },
      {
        "name": "image-url",
        "type": "str",
        "required": false,
        "help": "Optional remote image URL to download and attach to the reply"
      }
    ],
    "columns": [
      "status",
      "message",
      "text",
      "url"
    ],
    "type": "js",
    "modulePath": "twitter/reply.js",
    "sourceFile": "twitter/reply.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "reply-dm",
    "description": "Send a message to recent DM conversations",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Message text to send (e.g. \"我的微信 wxkabi\")"
      },
      {
        "name": "max",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of conversations to reply to (default: 20)"
      },
      {
        "name": "skip-replied",
        "type": "boolean",
        "default": true,
        "required": false,
        "help": "Skip conversations where you already sent the same text (default: true)"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 600,
        "required": false,
        "help": "Max seconds for the overall command (default: 600 — batch op)"
      }
    ],
    "columns": [
      "index",
      "status",
      "user",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/reply-dm.js",
    "sourceFile": "twitter/reply-dm.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "retweet",
    "description": "Retweet a specific tweet",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The URL of the tweet to retweet"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/retweet.js",
    "sourceFile": "twitter/retweet.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "search",
    "description": "Search Twitter/X for tweets, with optional --from / --has / --exclude / --product filters mapped to X's search operators",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Search query. Raw X operators (e.g. \"exact phrase\", #tag, OR, lang:en, since:YYYY-MM-DD, from:, since:) are passed through unchanged."
      },
      {
        "name": "filter",
        "type": "string",
        "default": "top",
        "required": false,
        "help": "Legacy alias for --product. Kept for backwards compatibility; if --product is set it wins.",
        "choices": [
          "top",
          "live"
        ]
      },
      {
        "name": "product",
        "type": "string",
        "required": false,
        "help": "Which X search tab to read: top (default), live (Latest), photos, videos. Maps to the f= URL param.",
        "choices": [
          "top",
          "live",
          "photos",
          "videos"
        ]
      },
      {
        "name": "from",
        "type": "string",
        "required": false,
        "help": "Restrict to tweets authored by <user>. Leading @ is stripped. Equivalent to appending `from:<user>` to the query."
      },
      {
        "name": "has",
        "type": "string",
        "required": false,
        "help": "Restrict to tweets that have media|images|videos|links|replies. Maps to X's `filter:<has>` operator.",
        "choices": [
          "media",
          "images",
          "videos",
          "links",
          "replies"
        ]
      },
      {
        "name": "exclude",
        "type": "string",
        "required": false,
        "help": "Exclude tweets matching <type>: replies|retweets|media|links. Maps to X's `-filter:<x>` operator (retweets → -filter:nativeretweets).",
        "choices": [
          "replies",
          "retweets",
          "media",
          "links"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Maximum number of tweets to return (default 15). Result count after server-side filtering."
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank the results by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps X's native ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "bio",
      "text",
      "created_at",
      "likes",
      "views",
      "url",
      "has_media",
      "media_urls",
      "card",
      "quoted_tweet"
    ],
    "type": "js",
    "modulePath": "twitter/search.js",
    "sourceFile": "twitter/search.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "thread",
    "description": "Get a tweet thread (original + all replies)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "tweet-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Tweet numeric ID (e.g. 1234567890) or full status URL"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": ""
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank the thread by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the conversation's structural ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "bio",
      "text",
      "likes",
      "retweets",
      "url",
      "has_media",
      "media_urls",
      "card",
      "quoted_tweet"
    ],
    "type": "js",
    "modulePath": "twitter/thread.js",
    "sourceFile": "twitter/thread.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "timeline",
    "description": "Fetch the logged-in user's home timeline (for-you algorithmic feed by default; pass --type following for the chronological feed of accounts you follow)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "type",
        "type": "str",
        "default": "for-you",
        "required": false,
        "help": "Which home-timeline feed to read. Default for-you (algorithmic). Use following for the chronological feed of accounts you follow.",
        "choices": [
          "for-you",
          "following"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Maximum number of tweets to return (default 20)."
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank the timeline by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps X's native ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "bio",
      "text",
      "likes",
      "retweets",
      "replies",
      "views",
      "created_at",
      "url",
      "has_media",
      "media_urls",
      "card",
      "quoted_tweet"
    ],
    "type": "js",
    "modulePath": "twitter/timeline.js",
    "sourceFile": "twitter/timeline.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "trending",
    "description": "Twitter/X trending topics",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of trends to show"
      }
    ],
    "columns": [
      "rank",
      "topic",
      "category"
    ],
    "type": "js",
    "modulePath": "twitter/trending.js",
    "sourceFile": "twitter/trending.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "tweets",
    "description": "Fetch a Twitter user's most recent tweets (chronological, excludes pinned; defaults to the logged-in user when no username is given)",
    "access": "read",
    "domain": "x.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": false,
        "positional": true,
        "help": "Twitter screen name (with or without @). Defaults to the logged-in user when omitted."
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max tweets to return"
      },
      {
        "name": "top-by-engagement",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "When set to N>0, re-rank the tweets by weighted engagement (likes×1 + retweets×3 + replies×2 + bookmarks×5 + log10(views+1)×0.5) and return the top N. Default 0 keeps the chronological ordering."
      }
    ],
    "columns": [
      "id",
      "author",
      "created_at",
      "is_retweet",
      "text",
      "likes",
      "retweets",
      "replies",
      "views",
      "url",
      "has_media",
      "media_urls",
      "quoted_tweet"
    ],
    "type": "js",
    "modulePath": "twitter/tweets.js",
    "sourceFile": "twitter/tweets.js",
    "navigateBefore": "https://x.com"
  },
  {
    "site": "twitter",
    "name": "unblock",
    "description": "Unblock a Twitter user",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Twitter screen name (without @)"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/unblock.js",
    "sourceFile": "twitter/unblock.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "unbookmark",
    "description": "Remove a tweet from bookmarks",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Tweet URL to unbookmark"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/unbookmark.js",
    "sourceFile": "twitter/unbookmark.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "unfollow",
    "description": "Unfollow a Twitter user",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "username",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Twitter screen name (without @)"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/unfollow.js",
    "sourceFile": "twitter/unfollow.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "unlike",
    "description": "Remove a like from a specific tweet",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The URL of the tweet to unlike"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/unlike.js",
    "sourceFile": "twitter/unlike.js",
    "navigateBefore": true
  },
  {
    "site": "twitter",
    "name": "unretweet",
    "description": "Undo a retweet on a specific tweet",
    "access": "write",
    "domain": "x.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "The URL of the tweet to unretweet"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "twitter/unretweet.js",
    "sourceFile": "twitter/unretweet.js",
    "navigateBefore": true
  },
  {
    "site": "uisdc",
    "name": "news",
    "description": "优设读报 - 最新 AI/设计行业新闻",
    "access": "read",
    "domain": "www.uisdc.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of news items to return (max 50)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "summary",
      "url"
    ],
    "type": "js",
    "modulePath": "uisdc/news.js",
    "sourceFile": "uisdc/news.js"
  },
  {
    "site": "uiverse",
    "name": "code",
    "description": "Export Uiverse component code (HTML, CSS, React, or Vue)",
    "access": "read",
    "domain": "uiverse.io",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Uiverse URL or author/slug identifier"
      },
      {
        "name": "target",
        "type": "str",
        "required": true,
        "help": "Code target to export",
        "choices": [
          "html",
          "css",
          "react",
          "vue"
        ]
      }
    ],
    "columns": [
      "target",
      "username",
      "slug",
      "language",
      "length"
    ],
    "type": "js",
    "modulePath": "uiverse/code.js",
    "sourceFile": "uiverse/code.js",
    "navigateBefore": "https://uiverse.io"
  },
  {
    "site": "uiverse",
    "name": "preview",
    "description": "Capture a screenshot of the Uiverse preview element",
    "access": "read",
    "domain": "uiverse.io",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "input",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Uiverse URL or author/slug identifier"
      },
      {
        "name": "output",
        "type": "str",
        "required": false,
        "help": "Output image path (defaults to a temp file)"
      },
      {
        "name": "padding",
        "type": "int",
        "default": 8,
        "required": false,
        "help": "Extra padding around the captured preview in pixels"
      }
    ],
    "columns": [
      "username",
      "slug",
      "width",
      "height",
      "output"
    ],
    "type": "js",
    "modulePath": "uiverse/preview.js",
    "sourceFile": "uiverse/preview.js",
    "navigateBefore": "https://uiverse.io"
  },
  {
    "site": "v2ex",
    "name": "daily",
    "description": "V2EX 每日签到并领取铜币",
    "access": "write",
    "domain": "www.v2ex.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "v2ex/daily.js",
    "sourceFile": "v2ex/daily.js",
    "navigateBefore": "https://www.v2ex.com"
  },
  {
    "site": "v2ex",
    "name": "hot",
    "description": "V2EX 热门话题",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of topics"
      }
    ],
    "columns": [
      "id",
      "rank",
      "title",
      "node",
      "replies",
      "url"
    ],
    "type": "js",
    "modulePath": "v2ex/hot.js",
    "sourceFile": "v2ex/hot.js"
  },
  {
    "site": "v2ex",
    "name": "latest",
    "description": "V2EX 最新话题",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of topics"
      }
    ],
    "columns": [
      "id",
      "rank",
      "title",
      "node",
      "replies",
      "url"
    ],
    "type": "js",
    "modulePath": "v2ex/latest.js",
    "sourceFile": "v2ex/latest.js"
  },
  {
    "site": "v2ex",
    "name": "me",
    "description": "V2EX 获取个人资料 (余额/未读提醒)",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "username",
      "balance",
      "unread_notifications",
      "daily_reward_ready"
    ],
    "type": "js",
    "modulePath": "v2ex/me.js",
    "sourceFile": "v2ex/me.js",
    "navigateBefore": "https://www.v2ex.com"
  },
  {
    "site": "v2ex",
    "name": "member",
    "description": "V2EX 用户资料",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username"
      }
    ],
    "columns": [
      "username",
      "tagline",
      "website",
      "github",
      "twitter",
      "location"
    ],
    "type": "js",
    "modulePath": "v2ex/member.js",
    "sourceFile": "v2ex/member.js"
  },
  {
    "site": "v2ex",
    "name": "node",
    "description": "V2EX 节点话题列表",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "name",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Node name (e.g. python, javascript, apple)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of topics (API returns max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "replies",
      "url"
    ],
    "type": "js",
    "modulePath": "v2ex/node.js",
    "sourceFile": "v2ex/node.js"
  },
  {
    "site": "v2ex",
    "name": "nodes",
    "description": "V2EX 所有节点列表",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Number of nodes"
      }
    ],
    "columns": [
      "rank",
      "name",
      "title",
      "topics",
      "stars"
    ],
    "type": "js",
    "modulePath": "v2ex/nodes.js",
    "sourceFile": "v2ex/nodes.js"
  },
  {
    "site": "v2ex",
    "name": "notifications",
    "description": "V2EX 获取提醒 (回复/由于)",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of notifications"
      }
    ],
    "columns": [
      "type",
      "content",
      "time"
    ],
    "type": "js",
    "modulePath": "v2ex/notifications.js",
    "sourceFile": "v2ex/notifications.js",
    "navigateBefore": "https://www.v2ex.com"
  },
  {
    "site": "v2ex",
    "name": "replies",
    "description": "V2EX 主题回复列表",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Topic ID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of replies"
      }
    ],
    "columns": [
      "floor",
      "author",
      "content"
    ],
    "type": "js",
    "modulePath": "v2ex/replies.js",
    "sourceFile": "v2ex/replies.js"
  },
  {
    "site": "v2ex",
    "name": "topic",
    "description": "V2EX 主题详情和回复",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Topic ID"
      }
    ],
    "columns": [
      "id",
      "title",
      "content",
      "member",
      "created",
      "node",
      "replies",
      "url"
    ],
    "type": "js",
    "modulePath": "v2ex/topic.js",
    "sourceFile": "v2ex/topic.js"
  },
  {
    "site": "v2ex",
    "name": "user",
    "description": "V2EX 用户发帖列表",
    "access": "read",
    "domain": "www.v2ex.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "username",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Username"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of topics (API returns max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "node",
      "replies",
      "url"
    ],
    "type": "js",
    "modulePath": "v2ex/user.js",
    "sourceFile": "v2ex/user.js"
  },
  {
    "site": "wanfang",
    "name": "search",
    "description": "万方数据论文搜索",
    "access": "read",
    "domain": "s.wanfangdata.com.cn",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回结果数量 (max 20)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "authors",
      "source",
      "year",
      "type",
      "cited",
      "url"
    ],
    "type": "js",
    "modulePath": "wanfang/search.js",
    "sourceFile": "wanfang/search.js"
  },
  {
    "site": "web",
    "name": "read",
    "description": "Fetch any web page and export as Markdown",
    "access": "read",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "help": "Any web page URL"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./web-articles",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "download-images",
        "type": "boolean",
        "default": true,
        "required": false,
        "help": "Download images locally"
      },
      {
        "name": "wait",
        "type": "int",
        "default": 3,
        "required": false,
        "help": "Seconds to wait after page load"
      },
      {
        "name": "wait-for",
        "type": "str",
        "required": false,
        "valueRequired": true,
        "help": "CSS selector to wait for in the main document or same-origin iframes"
      },
      {
        "name": "wait-until",
        "type": "str",
        "default": "domstable",
        "required": false,
        "help": "Readiness policy after navigation: domstable or networkidle",
        "choices": [
          "domstable",
          "networkidle"
        ]
      },
      {
        "name": "frames",
        "type": "str",
        "default": "same-origin",
        "required": false,
        "help": "Iframe handling mode: relevant same-origin, all-same-origin, or none",
        "choices": [
          "same-origin",
          "all-same-origin",
          "none"
        ]
      },
      {
        "name": "diagnose",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Print render diagnostics (frames, empty containers, XHR/API-like requests) to stderr"
      },
      {
        "name": "stdout",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Print markdown to stdout instead of saving to a file"
      }
    ],
    "columns": [
      "title",
      "author",
      "publish_time",
      "status",
      "size",
      "saved"
    ],
    "type": "js",
    "modulePath": "web/read.js",
    "sourceFile": "web/read.js",
    "navigateBefore": false
  },
  {
    "site": "weibo",
    "name": "comments",
    "description": "Get comments on a Weibo post",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Post ID (numeric idstr)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of comments (max 50)"
      }
    ],
    "columns": [
      "rank",
      "author",
      "text",
      "likes",
      "replies",
      "time"
    ],
    "type": "js",
    "modulePath": "weibo/comments.js",
    "sourceFile": "weibo/comments.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "delete",
    "description": "Delete one of my Weibo posts by id",
    "access": "write",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Post ID (numeric idstr or mblogid from URL / weibo me / weibo post output)"
      }
    ],
    "columns": [
      "status",
      "id",
      "mblogid"
    ],
    "type": "js",
    "modulePath": "weibo/delete.js",
    "sourceFile": "weibo/delete.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "favorites",
    "description": "我的微博收藏列表",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "数量（最多50）"
      }
    ],
    "columns": [
      "author",
      "text",
      "time",
      "source",
      "likes",
      "comments",
      "reposts",
      "url"
    ],
    "type": "js",
    "modulePath": "weibo/favorites.js",
    "sourceFile": "weibo/favorites.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "feed",
    "description": "Fetch Weibo timeline (for-you or following)",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "type",
        "type": "str",
        "default": "for-you",
        "required": false,
        "help": "Timeline type: for-you (algorithmic) or following (chronological)",
        "choices": [
          "for-you",
          "following"
        ]
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of posts (max 50)"
      }
    ],
    "columns": [
      "id",
      "author",
      "text",
      "reposts",
      "comments",
      "likes",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "weibo/feed.js",
    "sourceFile": "weibo/feed.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "hot",
    "description": "微博热搜",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Number of items (max 50)"
      }
    ],
    "columns": [
      "rank",
      "word",
      "hot_value",
      "category",
      "label",
      "url"
    ],
    "type": "js",
    "modulePath": "weibo/hot.js",
    "sourceFile": "weibo/hot.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "me",
    "description": "My Weibo profile info",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "screen_name",
      "uid",
      "followers",
      "following",
      "statuses",
      "verified",
      "location"
    ],
    "type": "js",
    "modulePath": "weibo/me.js",
    "sourceFile": "weibo/me.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "post",
    "description": "Get a single Weibo post",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Post ID (numeric idstr or mblogid from URL)"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "weibo/post.js",
    "sourceFile": "weibo/post.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "publish",
    "description": "Publish a new Weibo post immediately",
    "access": "write",
    "domain": "weibo.com",
    "strategy": "ui",
    "browser": true,
    "args": [
      {
        "name": "text",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Weibo text content (max 2000 chars)"
      },
      {
        "name": "images",
        "type": "string",
        "required": false,
        "help": "Image paths, comma-separated, max 9 (jpg/png/gif/webp)"
      }
    ],
    "columns": [
      "status",
      "message",
      "text"
    ],
    "type": "js",
    "modulePath": "weibo/publish.js",
    "sourceFile": "weibo/publish.js",
    "navigateBefore": true
  },
  {
    "site": "weibo",
    "name": "search",
    "description": "搜索微博",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results (max 50)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "author",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "weibo/search.js",
    "sourceFile": "weibo/search.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "user",
    "description": "Get Weibo user profile",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "User ID (numeric uid) or screen name"
      }
    ],
    "columns": [
      "screen_name",
      "uid",
      "followers",
      "following",
      "statuses",
      "verified",
      "description",
      "location",
      "url"
    ],
    "type": "js",
    "modulePath": "weibo/user.js",
    "sourceFile": "weibo/user.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weibo",
    "name": "user-posts",
    "description": "List Weibo posts from a user, optionally filtered by date range",
    "access": "read",
    "domain": "weibo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "User ID (numeric uid) or screen name"
      },
      {
        "name": "start",
        "type": "str",
        "required": false,
        "help": "Start date in Asia/Shanghai (YYYY-MM-DD)"
      },
      {
        "name": "end",
        "type": "str",
        "required": false,
        "help": "End date in Asia/Shanghai (YYYY-MM-DD)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of posts (1-100)"
      },
      {
        "name": "include-retweets",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Include retweets"
      }
    ],
    "columns": [
      "rank",
      "id",
      "mblogid",
      "author",
      "uid",
      "text",
      "time",
      "reposts",
      "comments",
      "likes",
      "pic_count",
      "url"
    ],
    "type": "js",
    "modulePath": "weibo/user-posts.js",
    "sourceFile": "weibo/user-posts.js",
    "navigateBefore": "https://weibo.com"
  },
  {
    "site": "weixin",
    "name": "create-draft",
    "description": "创建微信公众号图文草稿",
    "access": "write",
    "domain": "mp.weixin.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "title",
        "type": "str",
        "required": true,
        "help": "文章标题 (最长64字)"
      },
      {
        "name": "content",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "文章正文"
      },
      {
        "name": "author",
        "type": "str",
        "required": false,
        "help": "作者名 (最长8字)"
      },
      {
        "name": "cover-image",
        "type": "str",
        "required": false,
        "help": "封面图片路径 (会先上传到正文再设为封面)"
      },
      {
        "name": "summary",
        "type": "str",
        "required": false,
        "help": "文章摘要"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 180,
        "required": false,
        "help": "Max seconds for the overall command (default: 180)"
      }
    ],
    "columns": [
      "status",
      "detail"
    ],
    "type": "js",
    "modulePath": "weixin/create-draft.js",
    "sourceFile": "weixin/create-draft.js",
    "navigateBefore": false
  },
  {
    "site": "weixin",
    "name": "download",
    "description": "下载微信公众号文章为 Markdown 格式",
    "access": "read",
    "domain": "mp.weixin.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "help": "WeChat article URL (mp.weixin.qq.com/s/xxx)"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./weixin-articles",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "download-images",
        "type": "boolean",
        "default": true,
        "required": false,
        "help": "Download images locally"
      }
    ],
    "columns": [
      "title",
      "author",
      "publish_time",
      "status",
      "size",
      "saved"
    ],
    "type": "js",
    "modulePath": "weixin/download.js",
    "sourceFile": "weixin/download.js",
    "navigateBefore": "https://mp.weixin.qq.com"
  },
  {
    "site": "weixin",
    "name": "drafts",
    "description": "列出微信公众号草稿箱",
    "access": "read",
    "domain": "mp.weixin.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "最多显示条数"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 60,
        "required": false,
        "help": "Max seconds for the overall command (default: 60)"
      }
    ],
    "columns": [
      "Index",
      "Title",
      "Time"
    ],
    "type": "js",
    "modulePath": "weixin/drafts.js",
    "sourceFile": "weixin/drafts.js",
    "navigateBefore": false
  },
  {
    "site": "weixin",
    "name": "search",
    "description": "使用搜狗微信搜索公众号文章；如需导出正文 Markdown，请使用 weixin download 处理公众号文章链接",
    "access": "read",
    "domain": "weixin.sogou.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词；如需正文 Markdown，请使用 weixin download 处理公众号文章链接"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "结果页码，从 1 开始"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回条数，最大 10"
      }
    ],
    "columns": [
      "rank",
      "page",
      "title",
      "url",
      "summary",
      "publish_time"
    ],
    "type": "js",
    "modulePath": "weixin/search.js",
    "sourceFile": "weixin/search.js"
  },
  {
    "site": "weread",
    "name": "ai-outline",
    "description": "Get AI-generated outline for a book",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "book-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Book ID (from shelf or search results)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 200,
        "required": false,
        "help": "Max outline items to return"
      },
      {
        "name": "depth",
        "type": "int",
        "default": 4,
        "required": false,
        "help": "Max outline depth (2=topics, 3=key points, 4=details)"
      },
      {
        "name": "raw",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Output structured rows (chapter/idx/level/text) for programmatic use"
      }
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "weread/ai-outline.js",
    "sourceFile": "weread/ai-outline.js",
    "navigateBefore": "https://weread.qq.com"
  },
  {
    "site": "weread",
    "name": "book",
    "description": "View book details on WeRead",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "book-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Book ID from search or shelf results"
      }
    ],
    "columns": [
      "title",
      "author",
      "publisher",
      "intro",
      "category",
      "rating"
    ],
    "type": "js",
    "modulePath": "weread/book.js",
    "sourceFile": "weread/book.js",
    "navigateBefore": "https://weread.qq.com"
  },
  {
    "site": "weread",
    "name": "highlights",
    "description": "List your highlights (underlines) in a book",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "book-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Book ID (from shelf or search results)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results"
      }
    ],
    "columns": [
      "chapter",
      "text",
      "createTime"
    ],
    "type": "js",
    "modulePath": "weread/highlights.js",
    "sourceFile": "weread/highlights.js",
    "navigateBefore": "https://weread.qq.com"
  },
  {
    "site": "weread",
    "name": "notebooks",
    "description": "List books that have highlights or notes",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "title",
      "author",
      "noteCount",
      "bookId"
    ],
    "type": "js",
    "modulePath": "weread/notebooks.js",
    "sourceFile": "weread/notebooks.js",
    "navigateBefore": "https://weread.qq.com"
  },
  {
    "site": "weread",
    "name": "notes",
    "description": "List your notes (thoughts) on a book",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "book-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Book ID (from shelf or search results)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results"
      }
    ],
    "columns": [
      "chapter",
      "text",
      "review",
      "createTime"
    ],
    "type": "js",
    "modulePath": "weread/notes.js",
    "sourceFile": "weread/notes.js",
    "navigateBefore": "https://weread.qq.com"
  },
  {
    "site": "weread",
    "name": "ranking",
    "description": "WeRead book rankings by category",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "category",
        "type": "str",
        "default": "all",
        "required": false,
        "positional": true,
        "help": "Category: all (default), rising, or numeric category ID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "category",
      "readingCount",
      "bookId"
    ],
    "type": "js",
    "modulePath": "weread/ranking.js",
    "sourceFile": "weread/ranking.js"
  },
  {
    "site": "weread",
    "name": "search",
    "description": "Search books on WeRead",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "bookId",
      "url"
    ],
    "type": "js",
    "modulePath": "weread/search.js",
    "sourceFile": "weread/search.js"
  },
  {
    "site": "weread",
    "name": "shelf",
    "description": "List books on your WeRead bookshelf",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results"
      }
    ],
    "columns": [
      "title",
      "author",
      "progress",
      "bookId"
    ],
    "type": "js",
    "modulePath": "weread/shelf.js",
    "sourceFile": "weread/shelf.js",
    "navigateBefore": "https://weread.qq.com"
  },
  {
    "site": "weread-official",
    "name": "book",
    "description": "Show WeRead book metadata, chapters, and reading progress",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "bookId",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "WeRead bookId (from `weread-official search`)"
      },
      {
        "name": "no-chapters",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Skip /book/chapterinfo call"
      },
      {
        "name": "no-progress",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Skip /book/getprogress call"
      }
    ],
    "columns": [
      "section",
      "idx",
      "key",
      "value",
      "link"
    ],
    "type": "js",
    "modulePath": "weread-official/book.js",
    "sourceFile": "weread-official/book.js"
  },
  {
    "site": "weread-official",
    "name": "discover",
    "description": "Personalized or similar-book recommendations from WeRead",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "bookId",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Anchor bookId for similar-book mode; omit for personalized recommendations"
      },
      {
        "name": "count",
        "type": "int",
        "default": 12,
        "required": false,
        "help": "Page size (default 12)"
      },
      {
        "name": "max-idx",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Pagination cursor (recommend: previous searchIdx; similar: previous idx)"
      },
      {
        "name": "session-id",
        "type": "str",
        "required": false,
        "help": "Carry-forward sessionId for /book/similar paging"
      }
    ],
    "columns": [
      "rank",
      "mode",
      "bookId",
      "title",
      "author",
      "rating",
      "readingCount",
      "category",
      "idx",
      "reason",
      "cover",
      "intro",
      "link"
    ],
    "type": "js",
    "modulePath": "weread-official/discover.js",
    "sourceFile": "weread-official/discover.js"
  },
  {
    "site": "weread-official",
    "name": "list-apis",
    "description": "List every api_name supported by the WeRead agent gateway",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "rank",
      "apiName",
      "description",
      "required",
      "optional",
      "extras"
    ],
    "type": "js",
    "modulePath": "weread-official/list-apis.js",
    "sourceFile": "weread-official/list-apis.js"
  },
  {
    "site": "weread-official",
    "name": "notes",
    "description": "List notebooks overview or merged highlights+thoughts for a book",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "bookId",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Limit to one book; omit for full notebook overview"
      },
      {
        "name": "count",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Page size for the notebooks overview (1-100)"
      },
      {
        "name": "last-sort",
        "type": "int",
        "required": false,
        "help": "Cursor: pass previous page sort value to fetch the next page (/user/notebooks)"
      }
    ],
    "columns": [
      "kind",
      "bookId",
      "title",
      "author",
      "chapter",
      "reviewCount",
      "noteCount",
      "bookmarkCount",
      "totalNotes",
      "progress",
      "finished",
      "sort",
      "range",
      "text",
      "thought",
      "star",
      "createTime",
      "link"
    ],
    "type": "js",
    "modulePath": "weread-official/notes.js",
    "sourceFile": "weread-official/notes.js"
  },
  {
    "site": "weread-official",
    "name": "readdata",
    "description": "Reading statistics: time, streak, preferences, top books",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "mode",
        "type": "str",
        "default": "monthly",
        "required": false,
        "help": "Stat window: weekly / monthly / annually / overall",
        "choices": [
          "weekly",
          "monthly",
          "annually",
          "overall"
        ]
      },
      {
        "name": "base-time",
        "type": "int",
        "required": false,
        "help": "Optional Unix timestamp inside the target period; default is current period"
      }
    ],
    "columns": [
      "section",
      "idx",
      "key",
      "value",
      "detail"
    ],
    "type": "js",
    "modulePath": "weread-official/readdata.js",
    "sourceFile": "weread-official/readdata.js"
  },
  {
    "site": "weread-official",
    "name": "review",
    "description": "Browse public reviews of a WeRead book",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "bookId",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "WeRead bookId (from `weread-official search`)"
      },
      {
        "name": "type",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "Review filter (all/recommend/thumbs-down/newest/neutral)",
        "choices": [
          "all",
          "recommend",
          "thumbs-down",
          "newest",
          "neutral"
        ]
      },
      {
        "name": "count",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Page size (1-100, default 20)"
      },
      {
        "name": "max-idx",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Pagination cursor — pass idx from last row of previous page"
      },
      {
        "name": "synckey",
        "type": "int",
        "required": false,
        "help": "Sync cursor returned by previous response"
      }
    ],
    "columns": [
      "rank",
      "idx",
      "reviewId",
      "star",
      "starLabel",
      "author",
      "isFinish",
      "chapter",
      "content",
      "createTime",
      "link"
    ],
    "type": "js",
    "modulePath": "weread-official/review.js",
    "sourceFile": "weread-official/review.js"
  },
  {
    "site": "weread-official",
    "name": "search",
    "description": "Search WeRead store via the official agent gateway",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "scope",
        "type": "str",
        "default": "ebook",
        "required": false,
        "help": "Search type (all/ebook/webnovel/audio/author/fulltext/booklist/mp/article)",
        "choices": [
          "all",
          "ebook",
          "webnovel",
          "audio",
          "author",
          "fulltext",
          "booklist",
          "mp",
          "article"
        ]
      },
      {
        "name": "count",
        "type": "int",
        "required": false,
        "help": "Page size (gateway default 15 when omitted)"
      },
      {
        "name": "max-idx",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Pagination offset, use searchIdx of last item from previous page"
      }
    ],
    "columns": [
      "rank",
      "scope",
      "bookId",
      "title",
      "author",
      "rating",
      "readingCount",
      "category",
      "searchIdx",
      "cover",
      "intro",
      "link"
    ],
    "type": "js",
    "modulePath": "weread-official/search.js",
    "sourceFile": "weread-official/search.js"
  },
  {
    "site": "weread-official",
    "name": "shelf",
    "description": "Sync your WeRead shelf (books + albums + article bookmark entry) via the official gateway",
    "access": "read",
    "domain": "weread.qq.com",
    "strategy": "public",
    "browser": false,
    "args": [],
    "columns": [
      "kind",
      "id",
      "title",
      "author",
      "category",
      "secret",
      "isTop",
      "finished",
      "updateTime",
      "cover",
      "link"
    ],
    "type": "js",
    "modulePath": "weread-official/shelf.js",
    "sourceFile": "weread-official/shelf.js"
  },
  {
    "site": "wikidata",
    "name": "entity",
    "description": "Fetch a Wikidata entity by Q/P/L id (label, description, aliases, claim summary)",
    "access": "read",
    "domain": "www.wikidata.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Entity id (e.g. Q937 = Albert Einstein, P31 = instance of)"
      },
      {
        "name": "language",
        "type": "str",
        "default": "en",
        "required": false,
        "help": "Display language (ISO 639, falls back to English when missing)"
      }
    ],
    "columns": [
      "qid",
      "type",
      "label",
      "description",
      "aliases",
      "claimPropertyCount",
      "sitelinkCount",
      "enwikiTitle",
      "modified",
      "url"
    ],
    "type": "js",
    "modulePath": "wikidata/entity.js",
    "sourceFile": "wikidata/entity.js"
  },
  {
    "site": "wikidata",
    "name": "search",
    "description": "Search Wikidata items by keyword (returns Q-IDs)",
    "access": "read",
    "domain": "www.wikidata.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (label / alias)"
      },
      {
        "name": "language",
        "type": "str",
        "default": "en",
        "required": false,
        "help": "Search & display language (ISO 639, e.g. en, fr, zh)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max items (1-50)"
      }
    ],
    "columns": [
      "rank",
      "qid",
      "label",
      "description",
      "matchType",
      "matchText",
      "url"
    ],
    "type": "js",
    "modulePath": "wikidata/search.js",
    "sourceFile": "wikidata/search.js"
  },
  {
    "site": "wikipedia",
    "name": "page",
    "description": "Full plain-text extract of a Wikipedia article (optional paragraph cap).",
    "access": "read",
    "domain": "wikipedia.org",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "title",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Article title (e.g. \"Transformer (machine learning model)\")"
      },
      {
        "name": "lang",
        "type": "string",
        "default": "en",
        "required": false,
        "help": "Language code (en, zh, ja, de, ...)."
      },
      {
        "name": "paragraphs",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Cap to first N paragraphs (0 = full article)."
      }
    ],
    "columns": [
      "title",
      "description",
      "pageId",
      "paragraphs",
      "extract",
      "url"
    ],
    "type": "js",
    "modulePath": "wikipedia/page.js",
    "sourceFile": "wikipedia/page.js"
  },
  {
    "site": "wikipedia",
    "name": "random",
    "description": "Get a random Wikipedia article",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "lang",
        "type": "str",
        "default": "en",
        "required": false,
        "help": "Language code (e.g. en, zh, ja)"
      }
    ],
    "columns": [
      "title",
      "description",
      "extract",
      "url"
    ],
    "type": "js",
    "modulePath": "wikipedia/random.js",
    "sourceFile": "wikipedia/random.js"
  },
  {
    "site": "wikipedia",
    "name": "search",
    "description": "Search Wikipedia articles",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max results"
      },
      {
        "name": "lang",
        "type": "str",
        "default": "en",
        "required": false,
        "help": "Language code (e.g. en, zh, ja)"
      }
    ],
    "columns": [
      "title",
      "snippet",
      "url"
    ],
    "type": "js",
    "modulePath": "wikipedia/search.js",
    "sourceFile": "wikipedia/search.js"
  },
  {
    "site": "wikipedia",
    "name": "summary",
    "description": "Get Wikipedia article summary",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "title",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Article title (e.g. \"Transformer (machine learning model)\")"
      },
      {
        "name": "lang",
        "type": "str",
        "default": "en",
        "required": false,
        "help": "Language code (e.g. en, zh, ja)"
      }
    ],
    "columns": [
      "title",
      "description",
      "extract",
      "url"
    ],
    "type": "js",
    "modulePath": "wikipedia/summary.js",
    "sourceFile": "wikipedia/summary.js"
  },
  {
    "site": "wikipedia",
    "name": "trending",
    "description": "Most-read Wikipedia articles (yesterday)",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max results"
      },
      {
        "name": "lang",
        "type": "str",
        "default": "en",
        "required": false,
        "help": "Language code (e.g. en, zh, ja)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "description",
      "views"
    ],
    "type": "js",
    "modulePath": "wikipedia/trending.js",
    "sourceFile": "wikipedia/trending.js"
  },
  {
    "site": "wttr",
    "name": "current",
    "description": "Current weather conditions for a location (city, lat,lon, or airport code)",
    "access": "read",
    "domain": "wttr.in",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "location",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "City name, \"lat,lon\", airport ICAO code, or \"@domain\""
      }
    ],
    "columns": [
      "location",
      "region",
      "country",
      "latitude",
      "longitude",
      "observedAt",
      "tempC",
      "tempF",
      "feelsLikeC",
      "feelsLikeF",
      "description",
      "humidity",
      "cloudCover",
      "pressure",
      "precipMm",
      "visibilityKm",
      "uvIndex",
      "windKmph",
      "windDirection",
      "windDirectionDegree"
    ],
    "type": "js",
    "modulePath": "wttr/current.js",
    "sourceFile": "wttr/current.js"
  },
  {
    "site": "wttr",
    "name": "forecast",
    "description": "Multi-day weather forecast (up to 3 days, wttr.in free tier max)",
    "access": "read",
    "domain": "wttr.in",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "location",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "City name, \"lat,lon\", airport ICAO code, or \"@domain\""
      },
      {
        "name": "days",
        "type": "int",
        "default": 3,
        "required": false,
        "help": "Max forecast days (1-3, wttr.in caps the response at 3 days)"
      }
    ],
    "columns": [
      "rank",
      "date",
      "minTempC",
      "maxTempC",
      "avgTempC",
      "minTempF",
      "maxTempF",
      "avgTempF",
      "sunHour",
      "totalSnowCm",
      "uvIndex",
      "description",
      "sunrise",
      "sunset"
    ],
    "type": "js",
    "modulePath": "wttr/forecast.js",
    "sourceFile": "wttr/forecast.js"
  },
  {
    "site": "xianyu",
    "name": "chat",
    "description": "打开闲鱼聊一聊会话，并可选发送消息",
    "access": "write",
    "domain": "www.goofish.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "item_id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "闲鱼商品 item_id"
      },
      {
        "name": "user_id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "聊一聊对方的 user_id / peerUserId"
      },
      {
        "name": "text",
        "type": "str",
        "required": false,
        "help": "Message to send after opening the chat"
      }
    ],
    "columns": [
      "status",
      "peer_name",
      "item_title",
      "price",
      "location",
      "message"
    ],
    "type": "js",
    "modulePath": "xianyu/chat.js",
    "sourceFile": "xianyu/chat.js",
    "navigateBefore": false
  },
  {
    "site": "xianyu",
    "name": "inbox",
    "description": "列出闲鱼最近私信会话",
    "access": "read",
    "domain": "www.goofish.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of conversations to return"
      },
      {
        "name": "unread-only",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Return only conversations with unread messages"
      },
      {
        "name": "resolve-ids",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "Click each visible conversation to resolve item_id and peer_user_id from the chat URL"
      }
    ],
    "columns": [
      "rank",
      "peer_name",
      "peer_user_id",
      "item_id",
      "item_title",
      "price",
      "last_message",
      "unread",
      "unread_count",
      "url"
    ],
    "type": "js",
    "modulePath": "xianyu/inbox.js",
    "sourceFile": "xianyu/inbox.js",
    "navigateBefore": false
  },
  {
    "site": "xianyu",
    "name": "item",
    "description": "查看闲鱼商品详情",
    "access": "read",
    "domain": "www.goofish.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "item_id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "闲鱼商品 item_id"
      }
    ],
    "columns": [
      "item_id",
      "title",
      "price",
      "condition",
      "brand",
      "location",
      "seller_name",
      "want_count"
    ],
    "type": "js",
    "modulePath": "xianyu/item.js",
    "sourceFile": "xianyu/item.js",
    "navigateBefore": false
  },
  {
    "site": "xianyu",
    "name": "messages",
    "description": "读取指定闲鱼私信会话的最近聊天内容",
    "access": "read",
    "domain": "www.goofish.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "item_id",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "闲鱼商品 item_id"
      },
      {
        "name": "user_id",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "聊一聊对方的 user_id / peerUserId"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Number of visible messages to return"
      },
      {
        "name": "rank",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Conversation rank from xianyu inbox; clicks the visible row instead of requiring IDs"
      }
    ],
    "columns": [
      "index",
      "peer_name",
      "item_title",
      "message",
      "item_id",
      "peer_user_id",
      "url"
    ],
    "type": "js",
    "modulePath": "xianyu/messages.js",
    "sourceFile": "xianyu/messages.js",
    "navigateBefore": false
  },
  {
    "site": "xianyu",
    "name": "publish",
    "description": "发布闲鱼宝贝（需先在浏览器中登录闲鱼）",
    "access": "write",
    "domain": "www.goofish.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "title",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品标题"
      },
      {
        "name": "description",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品描述/详情"
      },
      {
        "name": "price",
        "type": "float",
        "required": true,
        "positional": true,
        "help": "出售价格（元）"
      },
      {
        "name": "condition",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "成色：全新 / 几乎全新 / 轻微使用 / 明显使用 / 老旧"
      },
      {
        "name": "category",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "商品分类关键词（如：手机、衣服、图书）"
      },
      {
        "name": "original_price",
        "type": "float",
        "required": false,
        "help": "原价（选填，用于显示折扣）"
      },
      {
        "name": "location",
        "type": "str",
        "required": false,
        "help": "所在地区（选填，如：杭州）"
      },
      {
        "name": "images",
        "type": "str",
        "required": false,
        "help": "本地图片路径，多张用逗号分隔（选填，如：/tmp/a.jpg,/tmp/b.jpg）"
      }
    ],
    "columns": [
      "status",
      "item_id",
      "title",
      "price",
      "condition",
      "url",
      "message"
    ],
    "type": "js",
    "modulePath": "xianyu/publish.js",
    "sourceFile": "xianyu/publish.js",
    "navigateBefore": false
  },
  {
    "site": "xianyu",
    "name": "reply",
    "description": "回复指定闲鱼私信会话",
    "access": "write",
    "domain": "www.goofish.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "item_id",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "闲鱼商品 item_id"
      },
      {
        "name": "user_id",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "聊一聊对方的 user_id / peerUserId"
      },
      {
        "name": "text",
        "type": "str",
        "required": true,
        "help": "Message text to send"
      },
      {
        "name": "rank",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Conversation rank from xianyu inbox; clicks the visible row instead of requiring IDs"
      }
    ],
    "columns": [
      "status",
      "peer_name",
      "item_title",
      "price",
      "location",
      "message"
    ],
    "type": "js",
    "modulePath": "xianyu/reply.js",
    "sourceFile": "xianyu/reply.js",
    "navigateBefore": false
  },
  {
    "site": "xianyu",
    "name": "search",
    "description": "搜索闲鱼商品",
    "access": "read",
    "domain": "www.goofish.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results to return"
      }
    ],
    "columns": [
      "item_id",
      "rank",
      "title",
      "price",
      "condition",
      "brand",
      "location",
      "badge",
      "url"
    ],
    "type": "js",
    "modulePath": "xianyu/search.js",
    "sourceFile": "xianyu/search.js",
    "navigateBefore": false
  },
  {
    "site": "xiaoe",
    "name": "catalog",
    "description": "小鹅通课程目录（支持普通课程、专栏、大专栏）",
    "access": "read",
    "domain": "h5.xet.citv.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "课程页面 URL"
      }
    ],
    "columns": [
      "ch",
      "chapter",
      "no",
      "title",
      "type",
      "resource_id",
      "url",
      "status"
    ],
    "type": "js",
    "modulePath": "xiaoe/catalog.js",
    "sourceFile": "xiaoe/catalog.js",
    "navigateBefore": "https://h5.xet.citv.cn"
  },
  {
    "site": "xiaoe",
    "name": "content",
    "description": "提取小鹅通图文页面内容为文本",
    "access": "read",
    "domain": "h5.xet.citv.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "页面 URL"
      }
    ],
    "columns": [
      "title",
      "content",
      "content_length",
      "image_count"
    ],
    "type": "js",
    "modulePath": "xiaoe/content.js",
    "sourceFile": "xiaoe/content.js",
    "navigateBefore": "https://h5.xet.citv.cn"
  },
  {
    "site": "xiaoe",
    "name": "courses",
    "description": "列出已购小鹅通课程（含 URL 和店铺名）",
    "access": "read",
    "domain": "study.xiaoe-tech.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "title",
      "shop",
      "url"
    ],
    "type": "js",
    "modulePath": "xiaoe/courses.js",
    "sourceFile": "xiaoe/courses.js",
    "navigateBefore": "https://study.xiaoe-tech.com"
  },
  {
    "site": "xiaoe",
    "name": "detail",
    "description": "小鹅通课程详情（名称、价格、学员数、店铺）",
    "access": "read",
    "domain": "h5.xet.citv.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "课程页面 URL"
      }
    ],
    "columns": [
      "name",
      "price",
      "original_price",
      "user_count",
      "shop_name"
    ],
    "type": "js",
    "modulePath": "xiaoe/detail.js",
    "sourceFile": "xiaoe/detail.js",
    "navigateBefore": "https://h5.xet.citv.cn"
  },
  {
    "site": "xiaoe",
    "name": "play-url",
    "description": "小鹅通视频/音频/直播回放 M3U8 播放地址",
    "access": "read",
    "domain": "h5.xet.citv.cn",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "小节页面 URL"
      }
    ],
    "columns": [
      "title",
      "resource_id",
      "m3u8_url",
      "duration_sec",
      "method"
    ],
    "type": "js",
    "modulePath": "xiaoe/play-url.js",
    "sourceFile": "xiaoe/play-url.js",
    "navigateBefore": "https://h5.xet.citv.cn"
  },
  {
    "site": "xiaohongshu",
    "name": "comments",
    "description": "获取小红书笔记评论（支持楼中楼子回复）",
    "access": "read",
    "domain": "www.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Full Xiaohongshu note URL with xsec_token"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of top-level comments (max 50)"
      },
      {
        "name": "with-replies",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Include nested replies (楼中楼)"
      }
    ],
    "columns": [
      "rank",
      "author",
      "text",
      "likes",
      "time",
      "is_reply",
      "reply_to"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/comments.js",
    "sourceFile": "xiaohongshu/comments.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "creator-note-detail",
    "description": "小红书单篇笔记详情页数据 (笔记信息 + 核心/互动数据 + 观看来源 + 观众画像 + 趋势数据)",
    "access": "read",
    "domain": "creator.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note-id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "Note ID (from creator-notes or note-detail page URL)"
      }
    ],
    "columns": [
      "section",
      "metric",
      "value",
      "extra"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/creator-note-detail.js",
    "sourceFile": "xiaohongshu/creator-note-detail.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "creator-notes",
    "description": "小红书创作者笔记列表 + 每篇数据 (标题/日期/观看/点赞/收藏/评论)",
    "access": "read",
    "domain": "creator.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of notes to return"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "date",
      "views",
      "likes",
      "collects",
      "comments",
      "url"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/creator-notes-summary.js",
    "sourceFile": "xiaohongshu/creator-notes-summary.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "creator-notes-summary",
    "description": "小红书最近笔记批量摘要 (列表 + 单篇关键数据汇总)",
    "access": "read",
    "domain": "creator.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 3,
        "required": false,
        "help": "Number of recent notes to summarize"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 180,
        "required": false,
        "help": "Max seconds for the overall command (default: 180)"
      }
    ],
    "columns": [
      "rank",
      "id",
      "title",
      "views",
      "likes",
      "collects",
      "comments",
      "shares",
      "avg_view_time",
      "rise_fans",
      "top_source",
      "top_interest",
      "url"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/creator-notes-summary.js",
    "sourceFile": "xiaohongshu/creator-notes-summary.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "creator-profile",
    "description": "小红书创作者账号信息 (粉丝/关注/获赞/成长等级)",
    "access": "read",
    "domain": "creator.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/creator-profile.js",
    "sourceFile": "xiaohongshu/creator-profile.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "creator-stats",
    "description": "小红书创作者数据总览 (观看/点赞/收藏/评论/分享/涨粉，含每日趋势)",
    "access": "read",
    "domain": "creator.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "period",
        "type": "string",
        "default": "seven",
        "required": false,
        "help": "Stats period: seven or thirty",
        "choices": [
          "seven",
          "thirty"
        ]
      }
    ],
    "columns": [
      "metric",
      "total",
      "trend"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/creator-stats.js",
    "sourceFile": "xiaohongshu/creator-stats.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "delete-note",
    "description": "删除小红书已发布笔记 (creator center UI automation)",
    "access": "write",
    "domain": "creator.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Note ID (e.g. 6a08ba0b000000000702a893 from xiaohongshu creator-notes / URL)"
      },
      {
        "name": "execute",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Actually click delete + confirm. Default is dry-run target verification only."
      }
    ],
    "columns": [
      "status",
      "note_id",
      "message"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/delete-note.js",
    "sourceFile": "xiaohongshu/delete-note.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "download",
    "description": "下载小红书笔记中的图片和视频",
    "access": "read",
    "domain": "www.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Full Xiaohongshu note URL with xsec_token, or xhslink short link"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./xiaohongshu-downloads",
        "required": false,
        "help": "Output directory"
      }
    ],
    "columns": [
      "index",
      "type",
      "status",
      "size"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/download.js",
    "sourceFile": "xiaohongshu/download.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "feed",
    "description": "小红书首页推荐 Feed (via Pinia Store Action)",
    "access": "read",
    "domain": "www.xiaohongshu.com",
    "strategy": "intercept",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items to return"
      }
    ],
    "columns": [
      "id",
      "title",
      "author",
      "likes",
      "type",
      "url"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/feed.js",
    "sourceFile": "xiaohongshu/feed.js",
    "navigateBefore": true
  },
  {
    "site": "xiaohongshu",
    "name": "note",
    "description": "获取小红书笔记正文和互动数据",
    "access": "read",
    "domain": "www.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "note-id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Full Xiaohongshu note URL with xsec_token"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/note.js",
    "sourceFile": "xiaohongshu/note.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "notifications",
    "description": "小红书通知 (mentions/likes/connections)",
    "access": "read",
    "domain": "www.xiaohongshu.com",
    "strategy": "intercept",
    "browser": true,
    "args": [
      {
        "name": "type",
        "type": "str",
        "default": "mentions",
        "required": false,
        "help": "Notification type: mentions, likes, or connections"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of notifications to return"
      }
    ],
    "columns": [
      "rank",
      "user",
      "action",
      "content",
      "note",
      "time"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/notifications.js",
    "sourceFile": "xiaohongshu/notifications.js",
    "navigateBefore": true
  },
  {
    "site": "xiaohongshu",
    "name": "publish",
    "description": "小红书发布图文笔记 (creator center UI automation)",
    "access": "write",
    "domain": "creator.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "title",
        "type": "str",
        "required": true,
        "help": "笔记标题 (最多20字)"
      },
      {
        "name": "content",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "笔记正文"
      },
      {
        "name": "images",
        "type": "str",
        "required": true,
        "help": "图片路径，逗号分隔，最多9张 (jpg/png/gif/webp)"
      },
      {
        "name": "topics",
        "type": "str",
        "required": false,
        "help": "话题标签，逗号分隔，不含 # 号"
      },
      {
        "name": "draft",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "保存为草稿，不直接发布"
      }
    ],
    "columns": [
      "status",
      "detail"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/publish.js",
    "sourceFile": "xiaohongshu/publish.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "search",
    "description": "搜索小红书笔记",
    "access": "read",
    "domain": "www.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "likes",
      "published_at",
      "url"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/search.js",
    "sourceFile": "xiaohongshu/search.js",
    "navigateBefore": false
  },
  {
    "site": "xiaohongshu",
    "name": "user",
    "description": "Get public notes from a Xiaohongshu user profile",
    "access": "read",
    "domain": "www.xiaohongshu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "string",
        "required": true,
        "positional": true,
        "help": "User id or profile URL"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 15,
        "required": false,
        "help": "Number of notes to return"
      }
    ],
    "columns": [
      "id",
      "title",
      "type",
      "likes",
      "url"
    ],
    "type": "js",
    "modulePath": "xiaohongshu/user.js",
    "sourceFile": "xiaohongshu/user.js",
    "navigateBefore": false
  },
  {
    "site": "xiaoyuzhou",
    "name": "download",
    "description": "Download Xiaoyuzhou episode audio",
    "access": "read",
    "domain": "www.xiaoyuzhoufm.com",
    "strategy": "local",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Episode ID (eid from podcast-episodes output)"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./xiaoyuzhou-downloads",
        "required": false,
        "help": "Output directory"
      }
    ],
    "columns": [
      "title",
      "podcast",
      "status",
      "size",
      "file"
    ],
    "type": "js",
    "modulePath": "xiaoyuzhou/download.js",
    "sourceFile": "xiaoyuzhou/download.js"
  },
  {
    "site": "xiaoyuzhou",
    "name": "episode",
    "description": "View details of a Xiaoyuzhou podcast episode",
    "access": "read",
    "domain": "www.xiaoyuzhoufm.com",
    "strategy": "local",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Episode ID (eid from podcast-episodes output)"
      }
    ],
    "columns": [
      "title",
      "podcast",
      "duration",
      "plays",
      "comments",
      "likes",
      "date"
    ],
    "type": "js",
    "modulePath": "xiaoyuzhou/episode.js",
    "sourceFile": "xiaoyuzhou/episode.js"
  },
  {
    "site": "xiaoyuzhou",
    "name": "podcast",
    "description": "View a Xiaoyuzhou podcast profile",
    "access": "read",
    "domain": "www.xiaoyuzhoufm.com",
    "strategy": "local",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Podcast ID (from xiaoyuzhoufm.com URL)"
      }
    ],
    "columns": [
      "title",
      "author",
      "description",
      "subscribers",
      "episodes",
      "updated"
    ],
    "type": "js",
    "modulePath": "xiaoyuzhou/podcast.js",
    "sourceFile": "xiaoyuzhou/podcast.js"
  },
  {
    "site": "xiaoyuzhou",
    "name": "podcast-episodes",
    "description": "List episodes of a Xiaoyuzhou podcast",
    "access": "read",
    "domain": "www.xiaoyuzhoufm.com",
    "strategy": "local",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Podcast ID (from xiaoyuzhoufm.com URL)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max episodes to show"
      }
    ],
    "columns": [
      "eid",
      "title",
      "duration",
      "plays",
      "date"
    ],
    "type": "js",
    "modulePath": "xiaoyuzhou/podcast-episodes.js",
    "sourceFile": "xiaoyuzhou/podcast-episodes.js"
  },
  {
    "site": "xiaoyuzhou",
    "name": "transcript",
    "description": "Download Xiaoyuzhou transcript as JSON and text (requires local credentials)",
    "access": "read",
    "domain": "www.xiaoyuzhoufm.com",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Episode ID (eid from podcast-episodes output)"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./xiaoyuzhou-transcripts",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "json",
        "type": "boolean",
        "default": true,
        "required": false,
        "help": "Save transcript JSON file"
      },
      {
        "name": "text",
        "type": "boolean",
        "default": true,
        "required": false,
        "help": "Save extracted transcript text file"
      }
    ],
    "columns": [
      "title",
      "podcast",
      "status",
      "segments",
      "json_file",
      "text_file"
    ],
    "type": "js",
    "modulePath": "xiaoyuzhou/transcript.js",
    "sourceFile": "xiaoyuzhou/transcript.js"
  },
  {
    "site": "xueqiu",
    "name": "comments",
    "description": "获取单只股票的讨论动态",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Stock symbol, e.g. SH600519, AAPL, or 00700"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of discussion posts to return"
      }
    ],
    "columns": [
      "author",
      "text",
      "likes",
      "replies",
      "retweets",
      "created_at",
      "url"
    ],
    "type": "js",
    "modulePath": "xueqiu/comments.js",
    "sourceFile": "xueqiu/comments.js",
    "navigateBefore": false
  },
  {
    "site": "xueqiu",
    "name": "earnings-date",
    "description": "获取股票预计财报发布日期（公司大事）",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "股票代码，如 SH600519、SZ000858、00700"
      },
      {
        "name": "next",
        "type": "bool",
        "default": false,
        "required": false,
        "help": "仅返回最近一次未发布的财报日期"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回数量，默认 10"
      }
    ],
    "columns": [
      "date",
      "report",
      "status"
    ],
    "type": "js",
    "modulePath": "xueqiu/earnings-date.js",
    "sourceFile": "xueqiu/earnings-date.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "xueqiu",
    "name": "feed",
    "description": "获取雪球首页时间线（关注用户的动态）",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "页码，默认 1"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "每页数量，默认 20"
      }
    ],
    "columns": [
      "author",
      "text",
      "likes",
      "replies",
      "url"
    ],
    "type": "js",
    "modulePath": "xueqiu/feed.js",
    "sourceFile": "xueqiu/feed.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "xueqiu",
    "name": "fund-holdings",
    "description": "获取蛋卷基金持仓明细（可用 --account 按子账户过滤）",
    "access": "read",
    "domain": "danjuanfunds.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "account",
        "type": "str",
        "default": "",
        "required": false,
        "help": "按子账户名称或 ID 过滤"
      }
    ],
    "columns": [
      "accountName",
      "fdCode",
      "fdName",
      "marketValue",
      "volume",
      "dailyGain",
      "holdGain",
      "holdGainRate",
      "marketPercent"
    ],
    "type": "js",
    "modulePath": "xueqiu/fund-holdings.js",
    "sourceFile": "xueqiu/fund-holdings.js",
    "navigateBefore": "https://danjuanfunds.com/my-money"
  },
  {
    "site": "xueqiu",
    "name": "fund-snapshot",
    "description": "获取蛋卷基金快照（总资产、子账户、持仓，推荐 -f json 输出）",
    "access": "read",
    "domain": "danjuanfunds.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "asOf",
      "totalAssetAmount",
      "totalFundMarketValue",
      "accountCount",
      "holdingCount"
    ],
    "type": "js",
    "modulePath": "xueqiu/fund-snapshot.js",
    "sourceFile": "xueqiu/fund-snapshot.js",
    "navigateBefore": "https://danjuanfunds.com/my-money"
  },
  {
    "site": "xueqiu",
    "name": "groups",
    "description": "获取雪球自选股分组列表（含模拟组合）",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "pid",
      "name",
      "count"
    ],
    "type": "js",
    "modulePath": "xueqiu/groups.js",
    "sourceFile": "xueqiu/groups.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "xueqiu",
    "name": "hot",
    "description": "获取雪球热门动态",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量，默认 20，最大 50"
      }
    ],
    "columns": [
      "rank",
      "author",
      "text",
      "likes",
      "url"
    ],
    "type": "js",
    "modulePath": "xueqiu/hot.js",
    "sourceFile": "xueqiu/hot.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "xueqiu",
    "name": "hot-stock",
    "description": "获取雪球热门股票榜",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "返回数量，默认 20，最大 50"
      },
      {
        "name": "type",
        "type": "str",
        "default": "10",
        "required": false,
        "help": "榜单类型 10=人气榜(默认) 12=关注榜"
      }
    ],
    "columns": [
      "rank",
      "symbol",
      "name",
      "price",
      "changePercent",
      "heat"
    ],
    "type": "js",
    "modulePath": "xueqiu/hot-stock.js",
    "sourceFile": "xueqiu/hot-stock.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "xueqiu",
    "name": "kline",
    "description": "获取雪球股票K线（历史行情）数据",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "股票代码，如 SH600519、SZ000858、AAPL"
      },
      {
        "name": "days",
        "type": "int",
        "default": 14,
        "required": false,
        "help": "回溯天数（默认14天）"
      }
    ],
    "columns": [
      "date",
      "open",
      "high",
      "low",
      "close",
      "volume"
    ],
    "type": "js",
    "modulePath": "xueqiu/kline.js",
    "sourceFile": "xueqiu/kline.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "xueqiu",
    "name": "search",
    "description": "搜索雪球股票（代码或名称）",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "搜索关键词，如 茅台、AAPL、腾讯"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "返回数量，默认 10"
      }
    ],
    "columns": [
      "symbol",
      "name",
      "exchange",
      "price",
      "changePercent",
      "url"
    ],
    "type": "js",
    "modulePath": "xueqiu/search.js",
    "sourceFile": "xueqiu/search.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "xueqiu",
    "name": "stock",
    "description": "获取雪球股票实时行情",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "股票代码，如 SH600519、SZ000858、AAPL、00700"
      }
    ],
    "columns": [
      "name",
      "symbol",
      "price",
      "changePercent",
      "marketCap"
    ],
    "type": "js",
    "modulePath": "xueqiu/stock.js",
    "sourceFile": "xueqiu/stock.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "xueqiu",
    "name": "watchlist",
    "description": "获取雪球自选股/模拟组合股票列表",
    "access": "read",
    "domain": "xueqiu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "pid",
        "type": "str",
        "default": "-1",
        "required": false,
        "help": "分组ID：-1=全部(默认) -4=模拟 -5=沪深 -6=美股 -7=港股 -10=实盘 0=持仓（通过 xueqiu groups 获取）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 100,
        "required": false,
        "help": "默认 100"
      }
    ],
    "columns": [
      "symbol",
      "name",
      "price",
      "changePercent"
    ],
    "type": "js",
    "modulePath": "xueqiu/watchlist.js",
    "sourceFile": "xueqiu/watchlist.js",
    "navigateBefore": "https://xueqiu.com"
  },
  {
    "site": "yahoo",
    "name": "search",
    "description": "Search Yahoo (powered by Bing)",
    "access": "read",
    "domain": "search.yahoo.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 7,
        "required": false,
        "help": "Number of results per page (max 7)"
      },
      {
        "name": "page",
        "type": "int",
        "default": 1,
        "required": false,
        "help": "Page number (1, 2, 3...). Yahoo returns ~7 results per page"
      }
    ],
    "columns": [
      "rank",
      "title",
      "url",
      "snippet"
    ],
    "type": "js",
    "modulePath": "yahoo/search.js",
    "sourceFile": "yahoo/search.js"
  },
  {
    "site": "yahoo-finance",
    "name": "quote",
    "description": "Yahoo Finance 股票行情",
    "access": "read",
    "domain": "finance.yahoo.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "symbol",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Stock ticker (e.g. AAPL, MSFT, TSLA)"
      }
    ],
    "columns": [
      "symbol",
      "name",
      "price",
      "change",
      "changePercent",
      "open",
      "high",
      "low",
      "volume",
      "marketCap"
    ],
    "type": "js",
    "modulePath": "yahoo-finance/quote.js",
    "sourceFile": "yahoo-finance/quote.js",
    "navigateBefore": "https://finance.yahoo.com"
  },
  {
    "site": "yollomi",
    "name": "background",
    "description": "Generate AI background for a product/object image (5 credits)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "image",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image URL (upload via \"opencli yollomi upload\" first)"
      },
      {
        "name": "prompt",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Background description (optional)"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/background.js",
    "sourceFile": "yollomi/background.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "edit",
    "description": "Edit images with AI text prompts (Qwen image edit)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "image",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Input image URL (upload via \"opencli yollomi upload\" first)"
      },
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Editing instruction (e.g. \"Make it look vintage\")"
      },
      {
        "name": "model",
        "type": "str",
        "default": "qwen-image-edit",
        "required": false,
        "help": "Edit model",
        "choices": [
          "qwen-image-edit",
          "qwen-image-edit-plus"
        ]
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "credits",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/edit.js",
    "sourceFile": "yollomi/edit.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "face-swap",
    "description": "Swap faces between two photos (3 credits)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "source",
        "type": "str",
        "required": true,
        "help": "Source face image URL"
      },
      {
        "name": "target",
        "type": "str",
        "required": true,
        "help": "Target photo URL"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/face-swap.js",
    "sourceFile": "yollomi/face-swap.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "generate",
    "description": "Generate images with AI (text-to-image or image-to-image)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Text prompt describing the image"
      },
      {
        "name": "model",
        "type": "str",
        "default": "z-image-turbo",
        "required": false,
        "help": "Model ID (z-image-turbo, flux-schnell, nano-banana, flux-2-pro, ...)"
      },
      {
        "name": "ratio",
        "type": "str",
        "default": "1:1",
        "required": false,
        "help": "Aspect ratio",
        "choices": [
          "1:1",
          "16:9",
          "9:16",
          "4:3",
          "3:4"
        ]
      },
      {
        "name": "image",
        "type": "str",
        "required": false,
        "help": "Input image URL for image-to-image (upload via \"opencli yollomi upload\" first)"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URLs, skip download"
      }
    ],
    "columns": [
      "index",
      "status",
      "file",
      "size",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/generate.js",
    "sourceFile": "yollomi/generate.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "models",
    "description": "List available Yollomi AI models (image, video, tools)",
    "access": "read",
    "strategy": "public",
    "browser": false,
    "args": [
      {
        "name": "type",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "Filter by model type",
        "choices": [
          "all",
          "image",
          "video",
          "tool"
        ]
      }
    ],
    "columns": [
      "type",
      "model",
      "credits",
      "description"
    ],
    "type": "js",
    "modulePath": "yollomi/models.js",
    "sourceFile": "yollomi/models.js"
  },
  {
    "site": "yollomi",
    "name": "object-remover",
    "description": "Remove unwanted objects from images (3 credits)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "image",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image URL"
      },
      {
        "name": "mask",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Mask image URL (white = area to remove)"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/object-remover.js",
    "sourceFile": "yollomi/object-remover.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "remove-bg",
    "description": "Remove image background with AI (free)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "image",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image URL to remove background from"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/remove-bg.js",
    "sourceFile": "yollomi/remove-bg.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "restore",
    "description": "Restore old or damaged photos with AI (4 credits)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "image",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image URL to restore"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/restore.js",
    "sourceFile": "yollomi/restore.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "try-on",
    "description": "Virtual try-on — see how clothes look on a person (3 credits)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "person",
        "type": "str",
        "required": true,
        "help": "Person photo URL (upload via \"opencli yollomi upload\" first)"
      },
      {
        "name": "cloth",
        "type": "str",
        "required": true,
        "help": "Clothing image URL"
      },
      {
        "name": "cloth-type",
        "type": "str",
        "default": "upper",
        "required": false,
        "help": "Clothing type",
        "choices": [
          "upper",
          "lower",
          "overall"
        ]
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/try-on.js",
    "sourceFile": "yollomi/try-on.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "upload",
    "description": "Upload an image or video to Yollomi (returns URL for other commands)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "file",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Local file path to upload"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/upload.js",
    "sourceFile": "yollomi/upload.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "upscale",
    "description": "Upscale image resolution with AI (1 credit)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "image",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Image URL to upscale"
      },
      {
        "name": "scale",
        "type": "str",
        "default": "2",
        "required": false,
        "help": "Upscale factor (2 or 4)",
        "choices": [
          "2",
          "4"
        ]
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "scale",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/upscale.js",
    "sourceFile": "yollomi/upscale.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "yollomi",
    "name": "video",
    "description": "Generate videos with AI (text-to-video or image-to-video)",
    "access": "write",
    "domain": "yollomi.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Text prompt describing the video"
      },
      {
        "name": "model",
        "type": "str",
        "default": "kling-2-1",
        "required": false,
        "help": "Model (kling-2-1, openai-sora-2, google-veo-3-1, wan-2-5-t2v, ...)"
      },
      {
        "name": "image",
        "type": "str",
        "required": false,
        "help": "Input image URL for image-to-video"
      },
      {
        "name": "ratio",
        "type": "str",
        "default": "16:9",
        "required": false,
        "help": "Aspect ratio",
        "choices": [
          "1:1",
          "16:9",
          "9:16",
          "4:3",
          "3:4"
        ]
      },
      {
        "name": "output",
        "type": "str",
        "default": "./yollomi-output",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "no-download",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Only show URL, skip download"
      }
    ],
    "columns": [
      "status",
      "file",
      "size",
      "credits",
      "url"
    ],
    "type": "js",
    "modulePath": "yollomi/video.js",
    "sourceFile": "yollomi/video.js",
    "navigateBefore": "https://yollomi.com"
  },
  {
    "site": "youdao",
    "name": "note",
    "description": "Read a public shared Youdao Note",
    "access": "read",
    "domain": "share.note.youdao.com",
    "strategy": "public",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Full share URL of the Youdao Note"
      }
    ],
    "columns": [
      "title",
      "content",
      "summary",
      "keywords",
      "created_at",
      "file_size",
      "url"
    ],
    "type": "js",
    "modulePath": "youdao/note.js",
    "sourceFile": "youdao/note.js"
  },
  {
    "site": "youtube",
    "name": "channel",
    "description": "Get YouTube channel info and recent videos",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Channel ID (UCxxxx) or handle (@name)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max recent videos (max 30)"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "youtube/channel.js",
    "sourceFile": "youtube/channel.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "comments",
    "description": "Get YouTube video comments",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "YouTube video URL or video ID"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max comments (max 100)"
      }
    ],
    "columns": [
      "rank",
      "author",
      "text",
      "likes",
      "replies",
      "time"
    ],
    "type": "js",
    "modulePath": "youtube/comments.js",
    "sourceFile": "youtube/comments.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "feed",
    "description": "Get YouTube homepage recommended videos",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max videos to return (default 20, max 100)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "channel",
      "video_id",
      "views",
      "duration",
      "published",
      "url"
    ],
    "type": "js",
    "modulePath": "youtube/feed.js",
    "sourceFile": "youtube/feed.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "history",
    "description": "Get YouTube watch history",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 30,
        "required": false,
        "help": "Max videos to return (default 30, max 200)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "channel",
      "views",
      "duration",
      "url"
    ],
    "type": "js",
    "modulePath": "youtube/history.js",
    "sourceFile": "youtube/history.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "like",
    "description": "Like a YouTube video",
    "access": "write",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "YouTube video URL or video ID"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "youtube/like.js",
    "sourceFile": "youtube/like.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "playlist",
    "description": "Get YouTube playlist info and video list",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Playlist URL or playlist ID (PLxxxxxx)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Max videos to return (default 50, max 200)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "channel",
      "duration",
      "views",
      "published",
      "url"
    ],
    "type": "js",
    "modulePath": "youtube/playlist.js",
    "sourceFile": "youtube/playlist.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "search",
    "description": "Search YouTube videos",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max results (max 50)"
      },
      {
        "name": "type",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Filter type: shorts, video, channel, playlist"
      },
      {
        "name": "upload",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Upload date: hour, today, week, month, year"
      },
      {
        "name": "sort",
        "type": "str",
        "default": "",
        "required": false,
        "help": "Sort by: relevance, date, views, rating"
      }
    ],
    "columns": [
      "rank",
      "title",
      "channel",
      "views",
      "duration",
      "published",
      "url"
    ],
    "type": "js",
    "modulePath": "youtube/search.js",
    "sourceFile": "youtube/search.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "subscribe",
    "description": "Subscribe to a YouTube channel",
    "access": "write",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "channel",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Channel ID (UCxxxx) or handle (@name)"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "youtube/subscribe.js",
    "sourceFile": "youtube/subscribe.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "subscriptions",
    "description": "List subscribed YouTube channels",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Max channels to return (default 50)"
      }
    ],
    "columns": [
      "rank",
      "name",
      "handle",
      "subscribers",
      "url"
    ],
    "type": "js",
    "modulePath": "youtube/subscriptions.js",
    "sourceFile": "youtube/subscriptions.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "transcript",
    "description": "Get YouTube video transcript/subtitles",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "YouTube video URL or video ID"
      },
      {
        "name": "lang",
        "type": "str",
        "required": false,
        "help": "Language code (e.g. en, zh-Hans). Omit to auto-select"
      },
      {
        "name": "mode",
        "type": "str",
        "default": "grouped",
        "required": false,
        "help": "Output mode: grouped (readable paragraphs) or raw (every segment)"
      }
    ],
    "type": "js",
    "modulePath": "youtube/transcript.js",
    "sourceFile": "youtube/transcript.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "unlike",
    "description": "Remove like from a YouTube video",
    "access": "write",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "YouTube video URL or video ID"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "youtube/unlike.js",
    "sourceFile": "youtube/unlike.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "unsubscribe",
    "description": "Unsubscribe from a YouTube channel",
    "access": "write",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "channel",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Channel ID (UCxxxx) or handle (@name)"
      }
    ],
    "columns": [
      "status",
      "message"
    ],
    "type": "js",
    "modulePath": "youtube/unsubscribe.js",
    "sourceFile": "youtube/unsubscribe.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "video",
    "description": "Get YouTube video metadata (title, views, description, etc.)",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "YouTube video URL or video ID"
      }
    ],
    "columns": [
      "field",
      "value"
    ],
    "type": "js",
    "modulePath": "youtube/video.js",
    "sourceFile": "youtube/video.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "youtube",
    "name": "watch-later",
    "description": "Get your YouTube Watch Later queue",
    "access": "read",
    "domain": "www.youtube.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Max videos to return (default 50, max 200)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "channel",
      "duration",
      "views",
      "published",
      "url"
    ],
    "type": "js",
    "modulePath": "youtube/watch-later.js",
    "sourceFile": "youtube/watch-later.js",
    "navigateBefore": "https://www.youtube.com"
  },
  {
    "site": "yuanbao",
    "name": "ask",
    "description": "Send a prompt to Yuanbao web chat and wait for the assistant response",
    "access": "write",
    "domain": "yuanbao.tencent.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send"
      },
      {
        "name": "timeout",
        "type": "int",
        "default": 60,
        "required": false,
        "help": "Max seconds to wait (default: 60)"
      },
      {
        "name": "search",
        "type": "boolean",
        "default": true,
        "required": false,
        "help": "Enable Yuanbao internet search (default: true)"
      },
      {
        "name": "think",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Enable Yuanbao deep thinking (default: false)"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "defaultFormat": "plain",
    "type": "js",
    "modulePath": "yuanbao/ask.js",
    "sourceFile": "yuanbao/ask.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "yuanbao",
    "name": "detail",
    "description": "Open a Yuanbao conversation by ID and read its messages",
    "access": "read",
    "domain": "yuanbao.tencent.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Full https://yuanbao.tencent.com/chat/<agentId>/<convId> URL or \"<agentId>/<convId>\" pair (a UUID alone is not enough — Yuanbao requires the agent slug)"
      }
    ],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "yuanbao/detail.js",
    "sourceFile": "yuanbao/detail.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "yuanbao",
    "name": "history",
    "description": "List recent Yuanbao conversations from the sidebar (requires login)",
    "access": "read",
    "domain": "yuanbao.tencent.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Max conversations to list (sidebar virtual scroll caps actual count)"
      }
    ],
    "columns": [
      "Index",
      "Title",
      "AgentId",
      "SessionId",
      "Url"
    ],
    "type": "js",
    "modulePath": "yuanbao/history.js",
    "sourceFile": "yuanbao/history.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "yuanbao",
    "name": "new",
    "description": "Start a new conversation in Yuanbao web chat",
    "access": "read",
    "domain": "yuanbao.tencent.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Action"
    ],
    "type": "js",
    "modulePath": "yuanbao/new.js",
    "sourceFile": "yuanbao/new.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "yuanbao",
    "name": "read",
    "description": "Read messages in the current Yuanbao conversation",
    "access": "read",
    "domain": "yuanbao.tencent.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Role",
      "Text"
    ],
    "type": "js",
    "modulePath": "yuanbao/read.js",
    "sourceFile": "yuanbao/read.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "yuanbao",
    "name": "send",
    "description": "Fire-and-forget: send a prompt to Yuanbao without waiting for the reply",
    "access": "write",
    "domain": "yuanbao.tencent.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "prompt",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Prompt to send to Yuanbao"
      },
      {
        "name": "new",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Start a new chat before sending"
      }
    ],
    "columns": [
      "Status",
      "Prompt"
    ],
    "type": "js",
    "modulePath": "yuanbao/send.js",
    "sourceFile": "yuanbao/send.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "yuanbao",
    "name": "status",
    "description": "Check Yuanbao page availability, login state, current session and model",
    "access": "read",
    "domain": "yuanbao.tencent.com",
    "strategy": "cookie",
    "browser": true,
    "args": [],
    "columns": [
      "Status",
      "Login",
      "Model",
      "ModelId",
      "AgentId",
      "SessionId",
      "Url"
    ],
    "type": "js",
    "modulePath": "yuanbao/status.js",
    "sourceFile": "yuanbao/status.js",
    "navigateBefore": false,
    "siteSession": "persistent"
  },
  {
    "site": "zhihu",
    "name": "answer",
    "description": "Answer a Zhihu question",
    "access": "write",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "target",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Zhihu question URL or typed target"
      },
      {
        "name": "text",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Answer text"
      },
      {
        "name": "file",
        "type": "str",
        "required": false,
        "help": "Answer text file path"
      },
      {
        "name": "execute",
        "type": "boolean",
        "required": false,
        "help": "Actually perform the write action"
      }
    ],
    "columns": [
      "status",
      "outcome",
      "message",
      "target_type",
      "target",
      "created_target",
      "created_url",
      "author_identity"
    ],
    "type": "js",
    "modulePath": "zhihu/answer.js",
    "sourceFile": "zhihu/answer.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "answer-comments",
    "description": "知乎回答评论列表",
    "access": "read",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Answer ID, full Zhihu answer URL, or typed target (answer:<qid>:<aid>)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of top-level comments (max 1000)"
      },
      {
        "name": "replies-limit",
        "type": "int",
        "default": 3,
        "required": false,
        "help": "Number of replies to include per top-level comment (max 100)"
      }
    ],
    "columns": [
      "rank",
      "comment_rank",
      "reply_rank",
      "depth",
      "id",
      "parent_id",
      "author",
      "reply_to",
      "likes",
      "created_at",
      "url",
      "content"
    ],
    "type": "js",
    "modulePath": "zhihu/answer-comments.js",
    "sourceFile": "zhihu/answer-comments.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "answer-detail",
    "description": "知乎单个回答完整内容（按 answer ID 获取）",
    "access": "read",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Answer ID, full Zhihu answer URL, or typed target (answer:<qid>:<aid>)"
      },
      {
        "name": "max-content",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "Optional cap on stripped content length in characters (0 = no truncation, return the full answer)"
      }
    ],
    "columns": [
      "id",
      "author",
      "votes",
      "comments",
      "question_id",
      "question_title",
      "url",
      "created_at",
      "updated_at",
      "content"
    ],
    "type": "js",
    "modulePath": "zhihu/answer-detail.js",
    "sourceFile": "zhihu/answer-detail.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "collection",
    "description": "知乎收藏夹内容列表（需要登录）",
    "access": "read",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "收藏夹 ID (数字，可从收藏夹 URL 中获取)"
      },
      {
        "name": "offset",
        "type": "int",
        "default": 0,
        "required": false,
        "help": "起始偏移量（用于分页）"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "每页数量（最大 20）"
      }
    ],
    "columns": [
      "rank",
      "type",
      "title",
      "author",
      "votes",
      "excerpt",
      "url"
    ],
    "type": "js",
    "modulePath": "zhihu/collection.js",
    "sourceFile": "zhihu/collection.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "collections",
    "description": "知乎收藏夹列表（需要登录）",
    "access": "read",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "每页数量（最大 20）"
      }
    ],
    "columns": [
      "rank",
      "title",
      "item_count",
      "description",
      "collection_id"
    ],
    "type": "js",
    "modulePath": "zhihu/collections.js",
    "sourceFile": "zhihu/collections.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "comment",
    "description": "Create a top-level comment on a Zhihu answer or article",
    "access": "write",
    "domain": "zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "target",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Zhihu target URL or typed target"
      },
      {
        "name": "text",
        "type": "str",
        "required": false,
        "positional": true,
        "help": "Comment text"
      },
      {
        "name": "file",
        "type": "str",
        "required": false,
        "help": "Comment text file path"
      },
      {
        "name": "execute",
        "type": "boolean",
        "required": false,
        "help": "Actually perform the write action"
      }
    ],
    "columns": [
      "status",
      "outcome",
      "message",
      "target_type",
      "target",
      "author_identity",
      "created_url"
    ],
    "type": "js",
    "modulePath": "zhihu/comment.js",
    "sourceFile": "zhihu/comment.js",
    "navigateBefore": "https://zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "download",
    "description": "导出知乎文章为 Markdown 格式",
    "access": "read",
    "domain": "zhuanlan.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "help": "Article URL (zhuanlan.zhihu.com/p/xxx)"
      },
      {
        "name": "output",
        "type": "str",
        "default": "./zhihu-articles",
        "required": false,
        "help": "Output directory"
      },
      {
        "name": "download-images",
        "type": "boolean",
        "default": false,
        "required": false,
        "help": "Download images locally"
      }
    ],
    "columns": [
      "title",
      "author",
      "publish_time",
      "status",
      "size"
    ],
    "type": "js",
    "modulePath": "zhihu/download.js",
    "sourceFile": "zhihu/download.js",
    "navigateBefore": "https://zhuanlan.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "favorite",
    "description": "Favorite a Zhihu answer or article into a specific collection",
    "access": "write",
    "domain": "zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "target",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Zhihu target URL or typed target"
      },
      {
        "name": "collection",
        "type": "str",
        "required": false,
        "help": "Collection name"
      },
      {
        "name": "collection-id",
        "type": "str",
        "required": false,
        "help": "Stable collection id"
      },
      {
        "name": "execute",
        "type": "boolean",
        "required": false,
        "help": "Actually perform the write action"
      }
    ],
    "columns": [
      "status",
      "outcome",
      "message",
      "target_type",
      "target",
      "collection_name",
      "collection_id"
    ],
    "type": "js",
    "modulePath": "zhihu/favorite.js",
    "sourceFile": "zhihu/favorite.js",
    "navigateBefore": "https://zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "follow",
    "description": "Follow a Zhihu user or question",
    "access": "write",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "target",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Zhihu target URL or typed target"
      },
      {
        "name": "execute",
        "type": "boolean",
        "required": false,
        "help": "Actually perform the write action"
      }
    ],
    "columns": [
      "status",
      "outcome",
      "message",
      "target_type",
      "target"
    ],
    "type": "js",
    "modulePath": "zhihu/follow.js",
    "sourceFile": "zhihu/follow.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "hot",
    "description": "知乎热榜",
    "access": "read",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items to return"
      }
    ],
    "columns": [
      "rank",
      "title",
      "heat",
      "answers"
    ],
    "type": "js",
    "modulePath": "zhihu/hot.js",
    "sourceFile": "zhihu/hot.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "like",
    "description": "Like a Zhihu answer or article",
    "access": "write",
    "domain": "zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "target",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Zhihu target URL or typed target"
      },
      {
        "name": "execute",
        "type": "boolean",
        "required": false,
        "help": "Actually perform the write action"
      }
    ],
    "columns": [
      "status",
      "outcome",
      "message",
      "target_type",
      "target"
    ],
    "type": "js",
    "modulePath": "zhihu/like.js",
    "sourceFile": "zhihu/like.js",
    "navigateBefore": "https://zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "question",
    "description": "知乎问题详情和回答",
    "access": "read",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Question ID (numeric)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 5,
        "required": false,
        "help": "Number of answers (max 1000; use normal-sized requests)"
      },
      {
        "name": "sort",
        "type": "str",
        "default": "default",
        "required": false,
        "help": "Answer order: default or created",
        "choices": [
          "default",
          "created"
        ]
      }
    ],
    "columns": [
      "rank",
      "id",
      "author",
      "votes",
      "url",
      "content"
    ],
    "type": "js",
    "modulePath": "zhihu/question.js",
    "sourceFile": "zhihu/question.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "recommend",
    "description": "知乎首页推荐",
    "access": "read",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of items to return (max 1000; use normal-sized requests)"
      }
    ],
    "columns": [
      "rank",
      "type",
      "title",
      "author",
      "votes",
      "url"
    ],
    "type": "js",
    "modulePath": "zhihu/recommend.js",
    "sourceFile": "zhihu/recommend.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zhihu",
    "name": "search",
    "description": "知乎搜索",
    "access": "read",
    "domain": "www.zhihu.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search query"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Number of results (max 1000; use normal-sized requests)"
      },
      {
        "name": "type",
        "type": "str",
        "default": "all",
        "required": false,
        "help": "Result type: all, answer, article, or question",
        "choices": [
          "all",
          "answer",
          "article",
          "question"
        ]
      }
    ],
    "columns": [
      "rank",
      "title",
      "type",
      "author",
      "votes",
      "url"
    ],
    "type": "js",
    "modulePath": "zhihu/search.js",
    "sourceFile": "zhihu/search.js",
    "navigateBefore": "https://www.zhihu.com"
  },
  {
    "site": "zlibrary",
    "name": "info",
    "description": "Get book details and available download formats from a Z-Library book page",
    "access": "read",
    "domain": "z-library.im",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "url",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Z-Library book page URL (e.g. https://z-library.im/book/...)"
      }
    ],
    "columns": [
      "title",
      "pdf",
      "epub",
      "url"
    ],
    "type": "js",
    "modulePath": "zlibrary/info.js",
    "sourceFile": "zlibrary/info.js",
    "navigateBefore": false
  },
  {
    "site": "zlibrary",
    "name": "search",
    "description": "Search Z-Library for books by title, author, ISBN, or keyword",
    "access": "read",
    "domain": "z-library.im",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "query",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword (title, author, ISBN, etc.)"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 10,
        "required": false,
        "help": "Max results (1–25)"
      }
    ],
    "columns": [
      "rank",
      "title",
      "author",
      "url"
    ],
    "type": "js",
    "modulePath": "zlibrary/search.js",
    "sourceFile": "zlibrary/search.js",
    "navigateBefore": false
  },
  {
    "site": "zsxq",
    "name": "dynamics",
    "description": "获取所有星球的最新动态",
    "access": "read",
    "domain": "wx.zsxq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of dynamics to return"
      }
    ],
    "columns": [
      "time",
      "group",
      "author",
      "title",
      "comments",
      "likes",
      "url"
    ],
    "type": "js",
    "modulePath": "zsxq/dynamics.js",
    "sourceFile": "zsxq/dynamics.js",
    "navigateBefore": "https://wx.zsxq.com"
  },
  {
    "site": "zsxq",
    "name": "groups",
    "description": "列出当前账号加入的星球",
    "access": "read",
    "domain": "wx.zsxq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 50,
        "required": false,
        "help": "Number of groups to return"
      }
    ],
    "columns": [
      "group_id",
      "name",
      "category",
      "members",
      "topics",
      "joined_at",
      "url"
    ],
    "type": "js",
    "modulePath": "zsxq/groups.js",
    "sourceFile": "zsxq/groups.js",
    "navigateBefore": "https://wx.zsxq.com"
  },
  {
    "site": "zsxq",
    "name": "search",
    "description": "搜索星球内容",
    "access": "read",
    "domain": "wx.zsxq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "keyword",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Search keyword"
      },
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of results to return"
      },
      {
        "name": "group_id",
        "type": "str",
        "required": false,
        "help": "Optional group id; defaults to the active group in Chrome"
      }
    ],
    "columns": [
      "topic_id",
      "group",
      "author",
      "title",
      "comments",
      "likes",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "zsxq/search.js",
    "sourceFile": "zsxq/search.js",
    "navigateBefore": "https://wx.zsxq.com"
  },
  {
    "site": "zsxq",
    "name": "topic",
    "description": "获取单个话题详情和评论",
    "access": "read",
    "domain": "wx.zsxq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "id",
        "type": "str",
        "required": true,
        "positional": true,
        "help": "Topic ID"
      },
      {
        "name": "group_id",
        "type": "str",
        "required": false,
        "help": "Group ID (optional; defaults to active group in Chrome)"
      },
      {
        "name": "comment_limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of comments to fetch"
      }
    ],
    "columns": [
      "topic_id",
      "type",
      "author",
      "title",
      "comments",
      "likes",
      "comment_preview",
      "url"
    ],
    "type": "js",
    "modulePath": "zsxq/topic.js",
    "sourceFile": "zsxq/topic.js",
    "navigateBefore": "https://wx.zsxq.com"
  },
  {
    "site": "zsxq",
    "name": "topics",
    "description": "获取当前星球的话题列表",
    "access": "read",
    "domain": "wx.zsxq.com",
    "strategy": "cookie",
    "browser": true,
    "args": [
      {
        "name": "limit",
        "type": "int",
        "default": 20,
        "required": false,
        "help": "Number of topics to return"
      },
      {
        "name": "group_id",
        "type": "str",
        "required": false,
        "help": "Optional group id; defaults to the active group in Chrome"
      }
    ],
    "columns": [
      "topic_id",
      "type",
      "author",
      "title",
      "comments",
      "likes",
      "time",
      "url"
    ],
    "type": "js",
    "modulePath": "zsxq/topics.js",
    "sourceFile": "zsxq/topics.js",
    "navigateBefore": "https://wx.zsxq.com"
  }
]
