会话开始:连通性检查 每次新会话开始,先运行 检查,再执行实际搜索: 根据结果处理: | 结果 | 含义 | 处理方式 | |------|------|----------| | | 正常 | 直接开始搜索 | | | 从未配置或配置丢失 | 向用户索取 MCP 配置(见下方) | | | URL 失效或网络问题 | 让用户重新获取配置并执行 | --- 配置缺失时:向用户索取 MCP 配置 让用户打开以下页面,复制 MCP 配置 JSON 后提供给你: 配置格式示例: 收到配置后,运行连通性测试并永久保存(将 JSON 作为字符串传入 ): - 成功:输出 并提示已保存,后续无需再传 - 失败:根据报错提示处理(配置格式错误 / 网络不通 / URL 无效) --- 快速参考 | 场景 | 命令 | |------|------| | 会话开始连通检查 | | | 保存配置(需 -c 传入 JSON) | | | 普通搜索 | | | 限定时间范围 | | | 返回更多结果 | | | JSON 输出 | | --- 基础用法 --- 时间筛选 可选值: (默认)| | | | --- JSON 输出(便于程序处理) 输出格式: --- 典型工作流 调研某个技术主题 获取实时信息 多轮深入调研 ---

\\n'/\\\\n}\" # newline\n s=\"${s//

会话开始:连通性检查 每次新会话开始,先运行 检查,再执行实际搜索: 根据结果处理: | 结果 | 含义 | 处理方式 | |------|------|----------| | | 正常 | 直接开始搜索 | | | 从未配置或配置丢失 | 向用户索取 MCP 配置(见下方) | | | URL 失效或网络问题 | 让用户重新获取配置并执行 | --- 配置缺失时:向用户索取 MCP 配置 让用户打开以下页面,复制 MCP 配置 JSON 后提供给你: 配置格式示例: 收到配置后,运行连通性测试并永久保存(将 JSON 作为字符串传入 ): - 成功:输出 并提示已保存,后续无需再传 - 失败:根据报错提示处理(配置格式错误 / 网络不通 / URL 无效) --- 快速参考 | 场景 | 命令 | |------|------| | 会话开始连通检查 | | | 保存配置(需 -c 传入 JSON) | | | 普通搜索 | | | 限定时间范围 | | | 返回更多结果 | | | JSON 输出 | | --- 基础用法 --- 时间筛选 可选值: (默认)| | | | --- JSON 输出(便于程序处理) 输出格式: --- 典型工作流 调研某个技术主题 获取实时信息 多轮深入调研 ---

\\r'/\\\\r}\" # CR\n s=\"${s//

会话开始:连通性检查 每次新会话开始,先运行 检查,再执行实际搜索: 根据结果处理: | 结果 | 含义 | 处理方式 | |------|------|----------| | | 正常 | 直接开始搜索 | | | 从未配置或配置丢失 | 向用户索取 MCP 配置(见下方) | | | URL 失效或网络问题 | 让用户重新获取配置并执行 | --- 配置缺失时:向用户索取 MCP 配置 让用户打开以下页面,复制 MCP 配置 JSON 后提供给你: 配置格式示例: 收到配置后,运行连通性测试并永久保存(将 JSON 作为字符串传入 ): - 成功:输出 并提示已保存,后续无需再传 - 失败:根据报错提示处理(配置格式错误 / 网络不通 / URL 无效) --- 快速参考 | 场景 | 命令 | |------|------| | 会话开始连通检查 | | | 保存配置(需 -c 传入 JSON) | | | 普通搜索 | | | 限定时间范围 | | | 返回更多结果 | | | JSON 输出 | | --- 基础用法 --- 时间筛选 可选值: (默认)| | | | --- JSON 输出(便于程序处理) 输出格式: --- 典型工作流 调研某个技术主题 获取实时信息 多轮深入调研 ---

\\t'/\\\\t}\" # tab\n printf '\"%s\"' \"$s\"\n}\n\n# 保存 URL 到配置文件(不修改脚本本身,彻底避免 bash 缓冲读取问题)\nsave_url() {\n local url=\"$1\"\n printf '%s' \"$url\" > \"$CONFIG_FILE\" || die \"写入配置文件失败,请检查文件权限($CONFIG_FILE)\"\n}\n\n# 解析 MCP JSON 配置,提取 url 字段\nparse_mcp_url() {\n local cfg=\"$1\"\n if [[ -n \"$JQ\" ]]; then\n echo \"$cfg\" | jq -re '[.mcpServers[].url] | first' 2>/dev/null \\\n || die \"配置中未找到有效的 url 字段,请确认 JSON 格式正确\"\n elif [[ -n \"$PYTHON\" ]]; then\n $PYTHON -c \"\nimport sys, json\ntry:\n cfg = json.loads(sys.argv[1])\n for srv in cfg.get('mcpServers', {}).values():\n if srv.get('url'):\n print(srv['url'])\n sys.exit(0)\n sys.exit(1)\nexcept Exception as e:\n print(str(e), file=sys.stderr)\n sys.exit(1)\n\" \"$cfg\" || die \"配置中未找到有效的 url 字段,请确认 JSON 格式正确\"\n else\n echo \"$cfg\" \\\n | grep -o '\"url\"[[:space:]]*:[[:space:]]*\"[^\"]*\"' \\\n | head -1 \\\n | sed 's/\"url\"[[:space:]]*:[[:space:]]*\"//;s/\"$//' \\\n || die \"配置中未找到有效的 url 字段\"\n fi\n}\n\n# ── MCP Streamable HTTP 请求 ──────────────────────────────────────────────────\n\n# 发送 MCP POST,返回响应 JSON(自动处理 SSE)\n# 用法: mcp_post \u003curl> \u003cbody> [session_id]\nmcp_post() {\n local url=\"$1\" body=\"$2\" sid=\"${3:-}\"\n local hdr_file ct resp\n\n hdr_file=$(mktemp) || die \"无法创建临时文件\"\n\n local -a cmd=(\n curl -s -S -m 30 --connect-timeout 10\n -X POST\n -H 'Content-Type: application/json'\n -H 'Accept: application/json, text/event-stream'\n -D \"$hdr_file\"\n --data-raw \"$body\"\n )\n [[ -n \"$sid\" ]] && cmd+=(-H \"Mcp-Session-Id: $sid\")\n cmd+=(\"$url\")\n\n if ! resp=$(\"${cmd[@]}\" 2>&1); then\n rm -f \"$hdr_file\"\n die \"$resp\"\n fi\n\n ct=$(grep -i '^content-type:' \"$hdr_file\" | tail -1 \\\n | tr -d '\\r\\n' | sed 's/^[Cc]ontent-[Tt]ype:[[:space:]]*//' || true)\n rm -f \"$hdr_file\"\n\n if [[ \"$ct\" == *event-stream* ]]; then\n # 从 SSE 流中取最后一条含 result / error 的 data 行\n resp=$(printf '%s\\n' \"$resp\" \\\n | grep '^data: ' \\\n | grep -E '\"result\"|\"error\"' \\\n | tail -1 \\\n | cut -c7-)\n fi\n\n printf '%s\\n' \"$resp\"\n}\n\n# 初始化 MCP 会话,输出 Session-ID(可为空)\nmcp_init() {\n local url=\"$1\"\n local hdr_file\n hdr_file=$(mktemp) || die \"无法创建临时文件\"\n\n curl -s -S -m 30 --connect-timeout 10 \\\n -X POST \\\n -H 'Content-Type: application/json' \\\n -H 'Accept: application/json, text/event-stream' \\\n -D \"$hdr_file\" \\\n --data-raw '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"web-search\",\"version\":\"1.0.0\"}}}' \\\n \"$url\" > /dev/null 2>&1 || true\n\n grep -i '^mcp-session-id:' \"$hdr_file\" \\\n | tr -d '\\r\\n' \\\n | sed 's/^[Mm][Cc][Pp]-[Ss]ession-[Ii][Dd]:[[:space:]]*//' \\\n || true\n rm -f \"$hdr_file\"\n}\n\n# 提取 JSON-RPC 错误消息(有错误时输出,否则空)\nrpc_error() {\n echo \"$1\" | grep -o '\"message\":\"[^\"]*\"' | head -1 \\\n | sed 's/\"message\":\"//;s/\"$//' || true\n}\n\n# ── 命令实现 ──────────────────────────────────────────────────────────────────\n\ncmd_ping() {\n local url=\"$1\"\n local sid resp tools\n\n sid=$(mcp_init \"$url\")\n mcp_post \"$url\" \\\n '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{}}' \\\n \"$sid\" > /dev/null 2>&1 || true\n\n resp=$(mcp_post \"$url\" '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\",\"params\":{}}' \"$sid\")\n\n if echo \"$resp\" | grep -q '\"error\"'; then\n local msg; msg=$(rpc_error \"$resp\")\n die \"连接失败:${msg:-未知错误}\"\n fi\n\n if [[ -n \"$JQ\" ]]; then\n tools=$(echo \"$resp\" | jq -r '[.result.tools[].name] | join(\", \")' 2>/dev/null || echo \"(无法解析)\")\n elif [[ -n \"$PYTHON\" ]]; then\n tools=$($PYTHON -c \"\nimport sys, json\nd = json.loads(sys.argv[1])\nnames = [t['name'] for t in d.get('result', {}).get('tools', [])]\nprint(', '.join(names) if names else '(无工具)')\n\" \"$resp\")\n else\n tools=$(echo \"$resp\" \\\n | grep -o '\"name\":\"[^\"]*\"' \\\n | sed 's/\"name\":\"//;s/\"$//' \\\n | tr '\\n' ',' | sed 's/,$//' || echo \"(无法解析)\")\n fi\n\n echo \"✓ 连通成功,可用工具:$tools\"\n}\n\ncmd_search() {\n local url=\"$1\" query=\"$2\" count=\"${3:-5}\" freshness=\"${4:-noLimit}\" as_json=\"${5:-false}\"\n\n # freshness 映射\n local fv=\"\"\n case \"$freshness\" in\n oneDay) fv=\"Day\" ;;\n oneWeek) fv=\"Week\" ;;\n oneMonth) fv=\"Month\" ;;\n oneYear) fv=\"Year\" ;;\n esac\n\n # 构建 tool_arguments JSON\n local q_json; q_json=$(json_str \"$query\")\n local tool_args=\"{\\\"q\\\":${q_json},\\\"count\\\":${count}\"\n [[ -n \"$fv\" ]] && tool_args+=\",\\\"freshness\\\":\\\"${fv}\\\"\"\n tool_args+=\"}\"\n\n local call_body\n call_body=\"{\\\"jsonrpc\\\":\\\"2.0\\\",\\\"id\\\":3,\\\"method\\\":\\\"tools/call\\\",\\\"params\\\":{\\\"name\\\":\\\"web_search\\\",\\\"arguments\\\":${tool_args}}}\"\n\n # 初始化会话\n local sid\n sid=$(mcp_init \"$url\")\n mcp_post \"$url\" \\\n '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{}}' \\\n \"$sid\" > /dev/null 2>&1 || true\n\n # 调用工具\n local resp\n resp=$(mcp_post \"$url\" \"$call_body\" \"$sid\")\n\n if echo \"$resp\" | grep -q '\"error\"'; then\n local msg; msg=$(rpc_error \"$resp\")\n die \"搜索失败:${msg:-未知错误}\"\n fi\n\n # 提取 content[0].text\n local text\n if [[ -n \"$JQ\" ]]; then\n text=$(echo \"$resp\" | jq -r '.result.content[0].text' 2>/dev/null) || die \"无法解析搜索结果\"\n elif [[ -n \"$PYTHON\" ]]; then\n text=$($PYTHON -c \"\nimport sys, json\nd = json.loads(sys.argv[1])\nprint(d['result']['content'][0]['text'])\n\" \"$resp\") || die \"无法解析搜索结果\"\n else\n # grep -P 处理 JSON 转义字符串(GNU grep);失败则输出原始响应\n # 正则 (\\\\.|[^\"])* 匹配:\\\"(转义引号)或任意非引号字符\n text=$(echo \"$resp\" \\\n | grep -oP '\"text\":\"\\K(\\\\.|[^\"])*' \\\n | head -1 \\\n | sed 's/\\\\\"/\"/g;s/\\\\\\\\/\\\\/g' 2>/dev/null) || text=\"\"\n fi\n\n # 格式化并输出结果\n if [[ -n \"$JQ\" ]]; then\n if $as_json; then\n echo \"$text\" | jq -r '\n [ .webPages.value[]? // .result.webPages.value[]? | {\n title: (.name // .title // \"\"),\n url: (.url // \"\"),\n snippet: ((.snippet // .summary // \"\")[:300]),\n site: (.siteName // \"\"),\n published: ((.datePublished // \"\")[:10]),\n source: \"小宿智能搜索\"\n }] ' 2>/dev/null || echo \"$text\"\n else\n echo \"$text\" | jq -r '\n (.webPages.value // .result.webPages.value // []) | to_entries[] |\n \"[\\(.key + 1)] \\(.value.name // .value.title // \"\")\\n URL: \\(.value.url // \"\")\\n 摘要: \\((.value.snippet // .value.summary // \"\")[:200])\\n\"' \\\n 2>/dev/null || echo \"$text\"\n fi\n elif [[ -n \"$PYTHON\" ]]; then\n $PYTHON -c \"\nimport sys, json\n\ntext = sys.argv[1]\nas_json = sys.argv[2] == 'true'\n\ntry:\n data = json.loads(text)\nexcept Exception:\n print(text)\n sys.exit(0)\n\npages = data.get('webPages', {}).get('value', [])\nif not pages:\n pages = data.get('result', {}).get('webPages', {}).get('value', [])\nif not pages:\n print(text[:1000] if not as_json else json.dumps({'raw': text[:1000]}, ensure_ascii=False))\n sys.exit(0)\n\nif as_json:\n out = []\n for p in pages:\n out.append({\n 'title': p.get('name') or p.get('title', ''),\n 'url': p.get('url', ''),\n 'snippet': (p.get('snippet') or p.get('summary', ''))[:300],\n 'site': p.get('siteName', ''),\n 'published': (p.get('datePublished') or '')[:10],\n 'source': '小宿智能搜索',\n })\n print(json.dumps(out, ensure_ascii=False, indent=2))\nelse:\n for i, p in enumerate(pages, 1):\n title = p.get('name') or p.get('title', '')\n url = p.get('url', '')\n snippet = (p.get('snippet') or p.get('summary', ''))[:200]\n site = p.get('siteName', '')\n pub = (p.get('datePublished') or '')[:10]\n print(f'[{i}] {title}')\n if url: print(f' URL: {url}')\n if snippet: print(f' 摘要: {snippet}')\n if site: print(f' 来源: {site} (小宿智能搜索)')\n if pub: print(f' 发布: {pub}')\n print()\n\" \"$text\" \"$as_json\"\n else\n # 最终兜底:输出原始文本,提示安装 python 或 jq\n echo \"(提示:安装 python 或 jq 可获得格式化输出,当前输出原始结果)\" >&2\n echo \"$text\"\n fi\n}\n\n# ── 主函数(包裹全部逻辑,bash 定义函数时整体读入内存,避免自写文件时触发 EOF)──\n\nmain() {\n local ARG_QUERY=\"\" ARG_CONFIG=\"\" ARG_COUNT=5\n local ARG_FRESHNESS=\"noLimit\" ARG_JSON=false ARG_PING=false ARG_SAVE=false\n\n while [[ $# -gt 0 ]]; do\n case \"$1\" in\n -q|--query) ARG_QUERY=\"$2\"; shift 2 ;;\n -c|--config) ARG_CONFIG=\"$2\"; shift 2 ;;\n -n|--count) ARG_COUNT=\"$2\"; shift 2 ;;\n -f|--freshness) ARG_FRESHNESS=\"$2\"; shift 2 ;;\n --json) ARG_JSON=true; shift ;;\n --ping) ARG_PING=true; shift ;;\n --save) ARG_SAVE=true; shift ;;\n *) die \"未知参数:$1(使用 -q/--query、--ping、--save 等)\" ;;\n esac\n done\n\n if $ARG_SAVE; then\n [[ -z \"$ARG_CONFIG\" ]] && die \"--save 需要配合 -c 传入 MCP JSON 配置\"\n local MCP_URL\n MCP_URL=$(parse_mcp_url \"$ARG_CONFIG\")\n echo \"正在检测连通性...\"\n cmd_ping \"$MCP_URL\"\n save_url \"$MCP_URL\"\n echo \"✓ 配置已保存,后续调用无需再传 -c 参数。\" >&2\n\n elif $ARG_PING; then\n [[ -z \"$DEFAULT_MCP_URL\" ]] && die \"未配置 MCP URL,请先使用 --save 完成配置\"\n cmd_ping \"$DEFAULT_MCP_URL\"\n\n else\n [[ -z \"$ARG_QUERY\" ]] && die \"请使用 -q 指定搜索词\"\n [[ -z \"$DEFAULT_MCP_URL\" ]] && die \"未配置 MCP URL,请先使用 --save 完成配置\"\n cmd_search \"$DEFAULT_MCP_URL\" \"$ARG_QUERY\" \"$ARG_COUNT\" \"$ARG_FRESHNESS\" \"$ARG_JSON\"\n fi\n}\n\nmain \"$@\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":12221,"content_sha256":"ed73dcba397c50b76e875a3d33b5a062a1cc9f802b01b773796ac0e31ce46557"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"text":"会话开始:连通性检查","type":"text"}]},{"type":"paragraph","content":[{"text":"每次新会话开始,先运行 ","type":"text","marks":[{"type":"strong"}]},{"text":"--ping","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" 检查,再执行实际搜索:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh --ping","type":"text"}]},{"type":"paragraph","content":[{"text":"根据结果处理:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"结果","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"含义","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"处理方式","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✓ 连通成功,可用工具: web_search","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"正常","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"直接开始搜索","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"错误:未配置 MCP URL","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"从未配置或配置丢失","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"向用户索取 MCP 配置(见下方)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"连接失败: ...","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URL 失效或网络问题","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"让用户重新获取配置并执行 ","type":"text"},{"text":"--save","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"配置缺失时:向用户索取 MCP 配置","type":"text"}]},{"type":"paragraph","content":[{"text":"让用户打开以下页面,复制 MCP 配置 JSON 后提供给你:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"https://mcp.dingtalk.com/#/detail?detailType=instanceMcpDetail&instanceId=78440","type":"text"}]},{"type":"paragraph","content":[{"text":"配置格式示例:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"mcpServers\": {\n \"小宿智能搜索\": {\n \"type\": \"streamable-http\",\n \"url\": \"https://mcp-gw.dingtalk.com/server/...\"\n }\n }\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"收到配置后,运行连通性测试并永久保存(将 JSON 作为字符串传入 ","type":"text"},{"text":"-c","type":"text","marks":[{"type":"code_inline"}]},{"text":"):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh --save -c '{\"mcpServers\":{\"小宿智能搜索\":{\"type\":\"streamable-http\",\"url\":\"\u003c用户提供的URL>\"}}}'","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"成功:输出 ","type":"text"},{"text":"✓ 连通成功,可用工具: ...","type":"text","marks":[{"type":"code_inline"}]},{"text":" 并提示已保存,后续无需再传 ","type":"text"},{"text":"-c","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"失败:根据报错提示处理(配置格式错误 / 网络不通 / URL 无效)","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"快速参考","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"场景","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"命令","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"会话开始连通检查","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh --ping","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"保存配置(需 -c 传入 JSON)","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bash ... --save -c '\u003cMCP JSON配置>'","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"普通搜索","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"关键词\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"限定时间范围","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bash ... -q \"关键词\" -f oneWeek","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"返回更多结果","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bash ... -q \"关键词\" -n 10","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"JSON 输出","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bash ... -q \"关键词\" --json","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"基础用法","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"Python asyncio 最佳实践\"","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"时间筛选","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 一周内的最新文章\nbash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"LLM 评测基准 2025\" -f oneWeek\n\n# 一个月内\nbash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"AI 编程工具对比\" -f oneMonth","type":"text"}]},{"type":"paragraph","content":[{"text":"可选值: ","type":"text"},{"text":"noLimit","type":"text","marks":[{"type":"code_inline"}]},{"text":"(默认)| ","type":"text"},{"text":"oneDay","type":"text","marks":[{"type":"code_inline"}]},{"text":" | ","type":"text"},{"text":"oneWeek","type":"text","marks":[{"type":"code_inline"}]},{"text":" | ","type":"text"},{"text":"oneMonth","type":"text","marks":[{"type":"code_inline"}]},{"text":" | ","type":"text"},{"text":"oneYear","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"JSON 输出(便于程序处理)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"FastAPI 性能优化\" -n 5 --json","type":"text"}]},{"type":"paragraph","content":[{"text":"输出格式:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"[\n {\n \"title\": \"页面标题\",\n \"url\": \"https://...\",\n \"snippet\": \"内容摘要...\",\n \"site\": \"网站名称\",\n \"published\": \"2025-01-01\",\n \"source\": \"小宿智能搜索\"\n }\n]","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"典型工作流","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"调研某个技术主题","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"LangGraph checkpoint 持久化方案\" -n 5","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"获取实时信息","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 近一周新闻\nbash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"OpenAI o3 发布\" -f oneWeek -n 8","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"多轮深入调研","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 第一轮:宽泛了解\nbash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"Rust 异步运行时对比\" -n 5\n# 第二轮:聚焦具体问题\nbash \u003cCURRENT_SKILL_MD_PATH_DIR>/scripts/search.sh -q \"tokio vs async-std 性能基准测试 2024\" -f oneYear -n 5","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"dingtalk-ai-web-search","author":"@skillopedia","source":{"stars":72,"repo_name":"dingtalk-skills","origin_url":"https://github.com/breath57/dingtalk-skills/blob/HEAD/.agents/skills/dingtalk-ai-web-search/SKILL.md","repo_owner":"breath57","body_sha256":"cb73c859dbf0eb89999fd2c6fa9d8bfd7357fb82cd0ed1ba3d84945b7551aa79","cluster_key":"ad1d9d9489b7c5a89fe87c4bba1076168d7081ecc495651aa88970ffb2f081fe","clean_bundle":{"format":"clean-skill-bundle-v1","source":"breath57/dingtalk-skills/.agents/skills/dingtalk-ai-web-search/SKILL.md","attachments":[{"id":"b0c7a539-dbdd-574c-a0d6-255e75f5eb80","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b0c7a539-dbdd-574c-a0d6-255e75f5eb80/attachment.sh","path":"scripts/search.sh","size":12221,"sha256":"ed73dcba397c50b76e875a3d33b5a062a1cc9f802b01b773796ac0e31ce46557","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"8bb9ad94dd26c257fbb744e377f85ac9d0a290edca164aa3dfb37ffd00b774d4","attachment_count":1,"text_attachments":1,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":".agents/skills/dingtalk-ai-web-search/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"general","category_label":"General"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"general","import_tag":"clean-skills-v1","description":"网页搜索与实时信息检索。需要查找最新资讯、实时数据、技术文档、热点事件,或用户说\"搜一下\"、\"帮我查\"、\"查资料\"、\"web search\"等时使用。基于小宿AI智能搜索,支持关键词搜索、时间范围过滤(一天/一周/一月/一年)、自定义结果数量、JSON 输出。"}},"renderedAt":1782989442842}

会话开始:连通性检查 每次新会话开始,先运行 检查,再执行实际搜索: 根据结果处理: | 结果 | 含义 | 处理方式 | |------|------|----------| | | 正常 | 直接开始搜索 | | | 从未配置或配置丢失 | 向用户索取 MCP 配置(见下方) | | | URL 失效或网络问题 | 让用户重新获取配置并执行 | --- 配置缺失时:向用户索取 MCP 配置 让用户打开以下页面,复制 MCP 配置 JSON 后提供给你: 配置格式示例: 收到配置后,运行连通性测试并永久保存(将 JSON 作为字符串传入 ): - 成功:输出 并提示已保存,后续无需再传 - 失败:根据报错提示处理(配置格式错误 / 网络不通 / URL 无效) --- 快速参考 | 场景 | 命令 | |------|------| | 会话开始连通检查 | | | 保存配置(需 -c 传入 JSON) | | | 普通搜索 | | | 限定时间范围 | | | 返回更多结果 | | | JSON 输出 | | --- 基础用法 --- 时间筛选 可选值: (默认)| | | | --- JSON 输出(便于程序处理) 输出格式: --- 典型工作流 调研某个技术主题 获取实时信息 多轮深入调研 ---