1. 项目概述:一个为Claude设计的技能库
最近在探索AI助手Claude的应用边界时,我遇到了一个非常有意思的项目:kyawshinethu/ClaudeSkills。这本质上是一个GitHub上的开源仓库,但它解决的问题却非常精准——如何让Claude变得更“能干”。简单来说,它不是一个独立的应用程序,而是一个精心设计的“技能包”或“工具箱”,里面包含了大量可以直接被Claude调用的函数、工具和指令集。
想象一下,Claude本身就像一个知识渊博但工具不全的专家。你可以问他任何问题,他都能给出精彩的回答,但当你需要他帮你分析一份Excel表格、从网页上抓取信息、或者生成一张图表时,他可能会告诉你:“抱歉,我目前无法直接操作文件或访问网络。”而ClaudeSkills项目,就是为这位专家配备了一套完整的“瑞士军刀”。它通过定义一系列标准化的“技能”(Skills),让Claude能够理解并执行更复杂的、超出纯文本对话范围的任务。对于任何希望将Claude深度集成到自己的工作流、自动化脚本或产品中的开发者来说,这个项目提供了一个极佳的起点和丰富的范例。
这个项目的核心价值在于“扩展”与“标准化”。它不仅仅提供了几个好用的函数,更重要的是,它定义了一套Claude如何与外部工具交互的“协议”或“接口规范”。这使得开发者可以基于此框架,轻松地为Claude添加自定义技能,或者直接复用社区已经贡献的成熟技能,从而极大地提升了开发效率和Claude的实用性。接下来,我将深入拆解这个项目的设计思路、核心组件以及如何将其应用到实际场景中。
2. 核心架构与设计哲学解析
2.1 技能(Skill)的本质:函数即能力
在ClaudeSkills的语境下,一个“技能”就是一个可以被Claude调用的、具有明确定义的功能单元。这通常对应着一个函数(Function)。每个技能都需要清晰地声明几样东西:技能名称(name)、功能描述(description)、输入参数(input_schema)以及执行函数本身(execute)。
这种设计哲学深受现代API和函数即服务(FaaS)思想的影响。它将复杂的能力封装成一个个黑盒,只暴露必要的接口。例如,一个“获取天气”的技能,其输入可能是一个location(城市名)参数,输出则是结构化的天气信息(温度、湿度、天气状况)。Claude不需要知道这个技能内部是调用了哪个气象API、如何处理网络请求和解析JSON,它只需要知道“有一个叫get_weather的技能,给它一个地点,它能返回天气”。这种抽象极大地降低了Claude(以及使用Claude的开发者)的心智负担。
注意:技能描述(
description)的质量至关重要。它不仅是给开发者看的,更是给Claude“理解”这个技能用途的关键。描述应当清晰、无歧义,并尽可能包含使用场景的提示。一个模糊的描述可能导致Claude在错误的上下文中调用该技能。
2.2 技能库(Skills Library)的组织逻辑
kyawshinethu/ClaudeSkills仓库不是一个杂乱无章的脚本合集,而是有组织的技能库。其组织方式通常遵循两个维度:功能领域和依赖复杂度。
从功能领域看,技能可能被分为以下几类:
- 网络与数据获取类:如网页抓取(
web_scraper)、API调用(call_rest_api)、RSS订阅读取(fetch_rss_feed)。这类技能通常涉及HTTP请求和数据处理。 - 数据处理与转换类:如CSV/JSON解析(
parse_csv)、数据过滤排序(filter_data)、文本摘要(summarize_text)。这类技能专注于信息的结构化处理。 - 文件与系统操作类:如读写本地文件(
read_file,需注意安全限制)、执行系统命令(run_shell_command,高风险,需谨慎)、目录列表(list_directory)。 - 计算与工具类:如执行Python代码片段(
execute_python)、计算器(calculator)、单位换算(unit_converter)。 - 第三方服务集成类:如发送邮件(
send_emailvia SMTP)、数据库查询(query_database)、调用机器学习模型(call_huggingface_model)。这类技能依赖外部服务或SDK。
从依赖复杂度看,仓库可能会区分“核心技能”(无外部依赖或仅依赖标准库)和“扩展技能”(需要安装第三方包,如requests,pandas,sqlalchemy等)。良好的项目结构会通过requirements.txt或pyproject.toml文件来管理这些依赖,并可能提供不同安装选项(如pip install claude-skills[web]来安装网络相关技能包)。
2.3 与Claude的集成机制:从文本到行动
这是整个项目最精妙的部分。Claude本身是一个语言模型,它输出的是文本。如何让它“理解”自己可以调用这些技能,并输出结构化的调用指令呢?常见的集成模式有两种:
模式一:提示词工程(Prompt Engineering)这是最直接的方式。在给Claude的系统提示(System Prompt)或上下文(Context)中,清晰地列出所有可用技能的名称、描述和参数格式。然后指示Claude:“当你需要完成某项任务时,如果你有合适的工具,请以<invoke name=\"skill_name\">{"arg1": "value1"}</invoke>这样的格式输出。”随后,需要一个后处理程序来解析Claude的响应,识别出这些特殊格式的标签,提取出技能名和参数,然后动态调用对应的函数,再将函数执行结果以文本形式反馈给Claude,形成多轮对话。这种方式灵活,但对提示词设计的要求高,且解析逻辑需要自己实现。
模式二:利用Claude API的工具调用(Tool Use / Function Calling)功能这是更现代、更推荐的方式。以Anthropic官方API为例,它原生支持了“工具”(Tools)的概念。开发者可以在API请求的tools参数中,直接按照特定JSON Schema格式定义好技能列表。Claude模型在推理时,如果认为需要调用某个工具,它不会在普通对话文本中输出指令,而是会在响应的特定字段(如content中的tool_use块)里返回一个结构化的调用请求。应用程序收到后,执行对应函数,再将结果以tool_result的形式在下一次请求中传回给Claude。这种方式由API底层支持,格式标准,可靠性高,是ClaudeSkills这类项目理想的后端对接方式。
ClaudeSkills项目通常提供的就是这些技能的定义(函数和Schema),以及一个轻量级的“技能执行器”(Skill Executor)或“技能路由器”(Skill Router)。它负责维护技能注册表,并根据Claude的输出或API的tool_use请求,找到正确的函数并执行。
3. 核心技能模块深度拆解与实操
3.1 数据获取类技能:让Claude拥有“眼睛”
这类技能是扩展Claude能力边界的关键。一个典型的网页抓取技能web_scraper的实现,远不止一个requests.get()那么简单。
实现要点:
- 请求头与会话管理:必须设置合理的
User-Agent,模拟真实浏览器,避免被简单反爬机制屏蔽。对于需要登录或保持状态的网站,要使用requests.Session()。 - 健壮的错误处理:网络请求充满不确定性。代码必须妥善处理连接超时、HTTP错误(如404、500)、SSL证书错误等异常,并给出对用户友好的提示信息,而不是让整个对话崩溃。
- HTML解析与内容提取:推荐使用
BeautifulSoup4或lxml库。技能设计时应考虑灵活性:是提取整个页面的文本,还是根据用户提供的CSS选择器(selector)提取特定部分?一个良好的技能可以同时支持这两种模式。 - 内容清洗与格式化:从HTML中提取的文本通常包含大量空白字符、JavaScript代码等。需要经过清洗(如使用
html2text库或将HTML标签替换为换行),输出干净、易读的纯文本或Markdown格式,方便Claude后续处理。
实操示例:一个增强版网页抓取技能
import requests from bs4 import BeautifulSoup import html2text def web_scraper(url: str, selector: str = None, timeout: int = 10): """ 从指定URL抓取网页内容。 参数: url: 要抓取的网页地址。 selector: (可选) CSS选择器,用于提取页面的特定部分。如未提供,则提取整个主体文本。 timeout: 请求超时时间(秒)。 返回: 字典,包含抓取状态、清洗后的文本或错误信息。 """ headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } try: resp = requests.get(url, headers=headers, timeout=timeout) resp.raise_for_status() # 如果状态码不是200,抛出HTTPError异常 except requests.exceptions.Timeout: return {"status": "error", "message": f"请求超时({timeout}秒)。"} except requests.exceptions.HTTPError as e: return {"status": "error", "message": f"HTTP错误: {e}"} except requests.exceptions.RequestException as e: return {"status": "error", "message": f"请求失败: {e}"} # 解析HTML soup = BeautifulSoup(resp.content, 'html.parser') # 移除脚本、样式等无关标签 for script in soup(["script", "style", "nav", "footer"]): script.decompose() target_element = soup if selector: target_element = soup.select_one(selector) if not target_element: return {"status": "error", "message": f"未找到匹配选择器 '{selector}' 的元素。"} # 转换为Markdown格式文本,更易于阅读和处理 h = html2text.HTML2Text() h.ignore_links = False h.ignore_images = False extracted_text = h.handle(str(target_element)) # 简单清理多余空行 cleaned_text = "\n".join([line.strip() for line in extracted_text.splitlines() if line.strip()]) return { "status": "success", "url": url, "content": cleaned_text[:5000] # 限制返回长度,避免上下文爆炸 }实操心得:在实际使用中,我发现直接返回原始HTML或过长的文本会迅速消耗Claude的上下文窗口。因此,技能内部做长度限制和智能摘要(例如,如果文本超过3000字,先尝试用模型生成摘要)是非常有价值的优化。此外,对于需要分页抓取或处理JavaScript渲染的页面,这个基础技能就不够了,可能需要引入
Selenium或Playwright,但这会显著增加复杂性和运行开销,适合作为“高级网页抓取”独立技能提供。
3.2 数据处理与计算类技能:让Claude成为“分析师”
这类技能将Claude从“聊天顾问”升级为“数据分析伙伴”。一个强大的data_analyzer技能可能包含多个子功能。
核心子技能设计:
- 数据加载(
load_data):支持从字符串、本地文件路径(如果环境允许)或URL加载CSV、JSON数据。使用pandas的read_csv和read_json函数,并自动推断数据类型。 - 描述性统计(
describe_data):对加载的DataFrame,调用df.describe()、df.info()、df.isnull().sum()等,生成一份全面的数据概览报告。 - 数据筛选与排序(
filter_sort_data):允许用户通过自然语言描述的条件进行筛选(如“销售额大于1000的产品”),这需要将自然语言条件解析为pandas的查询表达式。排序则相对简单,指定列名和升降序即可。 - 基本可视化(
plot_data):虽然Claude不能直接显示图片,但技能可以生成图表并保存为文件,然后返回文件路径或Base64编码的图片数据。Claude可以在后续回答中引用这张图。可以使用matplotlib或plotly生成折线图、柱状图、散点图等。
参数设计挑战:最大的难点在于如何将用户模糊的自然语言指令(“帮我找出上周销量最好的三个产品”)转化为精确的技能调用参数({“action”: “filter_and_sort”, “date_column”: “sale_date”, “date_range”: [“2023-10-23”, “2023-10-29”], “sort_by”: “quantity”, “ascending”: False, “top_n”: 3})。在ClaudeSkills的框架下,通常的策略是“分两步走”:第一步,Claude通过与用户对话,澄清需求,并自行构造出结构化的参数;第二步,Claude调用技能时,传入的就是这些已经结构化的参数。技能本身不负责理解自然语言。
示例:一个简单的数据统计技能
import pandas as pd import json def analyze_csv(csv_data: str, operation: str, **kwargs): """ 对CSV格式的字符串数据进行基本分析。 参数: csv_data: CSV格式的字符串数据。 operation: 要执行的操作,可选:'describe', 'head', 'filter'。 **kwargs: 其他操作相关参数。 - 对于'head': n (行数,默认5) - 对于'filter': 一个字典,格式如 {'column': 'value'} 或 {'column': ['>', 100]} 返回: 分析结果的字典或字符串表示。 """ from io import StringIO try: df = pd.read_csv(StringIO(csv_data)) except Exception as e: return {"status": "error", "message": f"解析CSV失败: {e}"} if operation == 'describe': result = df.describe(include='all').to_string() elif operation == 'head': n = kwargs.get('n', 5) result = df.head(n).to_string() elif operation == 'filter': filter_cond = kwargs.get('filter_cond', {}) if not filter_cond: result = "未提供过滤条件。" else: # 这是一个非常简化的过滤,实际应用需要更复杂的解析逻辑 col, val = list(filter_cond.items())[0] if isinstance(val, list) and len(val) == 2: op, compare_val = val if op == '>': filtered_df = df[df[col] > compare_val] # ... 可以扩展其他操作符 else: filtered_df = df[df[col] == val] result = filtered_df.to_string() else: result = f"不支持的操作: {operation}" return {"status": "success", "operation": operation, "result": result}4. 项目集成与高级应用场景
4.1 如何将ClaudeSkills集成到你的应用中
集成ClaudeSkills并非简单地复制粘贴代码,而是一个系统工程。以下是典型的集成步骤:
步骤一:环境搭建与技能安装
- 将
ClaudeSkills仓库克隆到你的项目目录,或通过pip安装(如果项目已打包)。 - 根据你计划使用的技能,安装相应的依赖包(
pip install -r requirements.txt)。 - 在你的应用初始化阶段,创建一个“技能注册中心”(Skill Registry)。这个中心负责加载和管理所有技能。
步骤二:技能注册与路由配置你需要编写一个初始化脚本,将所有需要的技能实例化并注册到中心。
# skill_registry.py class SkillRegistry: def __init__(self): self.skills = {} def register(self, skill_name, skill_function, input_schema): self.skills[skill_name] = { 'function': skill_function, 'schema': input_schema # 符合Tool Calling规范的JSON Schema } def get_tool_definitions(self): """返回所有技能的Schema列表,用于Claude API的tools参数""" return [{'name': name, 'description': func.__doc__, 'input_schema': info['schema']} for name, info in self.skills.items()] def execute(self, skill_name, arguments): if skill_name not in self.skills: raise ValueError(f"技能 '{skill_name}' 未注册。") return self.skills[skill_name]['function'](**arguments) # 初始化注册表并注册技能 registry = SkillRegistry() registry.register('web_scraper', web_scraper, web_scraper_schema) registry.register('analyze_csv', analyze_csv, analyze_csv_schema) # ... 注册更多技能步骤三:与Claude API的对话循环这是核心交互逻辑。你需要构建一个循环,处理用户输入、调用Claude API、执行技能、返回结果。
import anthropic client = anthropic.Anthropic(api_key="your-api-key") registry = ... # 你的技能注册表实例 def chat_with_claude(user_message, conversation_history=[]): # 1. 准备消息历史 messages = conversation_history + [{"role": "user", "content": user_message}] # 2. 调用Claude API,传入技能定义 response = client.messages.create( model="claude-3-sonnet-20240229", max_tokens=1000, messages=messages, tools=registry.get_tool_definitions() # 关键:告诉Claude有哪些工具可用 ) # 3. 处理Claude的响应 final_response = "" for content_block in response.content: if content_block.type == 'text': final_response += content_block.text elif content_block.type == 'tool_use': # Claude请求使用工具 tool_name = content_block.name tool_args = content_block.input # 4. 执行技能 try: tool_result = registry.execute(tool_name, tool_args) # 将结果格式化为Claude期望的tool_result result_content = { "type": "tool_result", "tool_use_id": content_block.id, "content": str(tool_result) # 确保结果是字符串 } # 需要将结果放入下一次API请求的messages中 # 这里简化处理,实际需构建新的消息列表 final_response += f"\n[执行技能 {tool_name},结果: {tool_result}]\n" except Exception as e: error_result = {"type": "tool_result", "tool_use_id": content_block.id, "content": f"技能执行错误: {e}"} # 同上,需要处理错误结果 final_response += f"\n[执行技能 {tool_name} 时出错: {e}]\n" return final_response注意事项:在实际的循环中,
tool_result需要被追加到消息历史中,作为一条assistant的tool_use和user的tool_result,然后再次调用Claude API,让Claude基于工具执行结果继续生成回复。这是一个多步骤的交互过程。许多框架(如LangChain、Semantic Kernel)已经封装了这部分复杂性,但理解底层流程对于调试和定制至关重要。
4.2 构建复杂智能体(Agent)工作流
单个技能是砖瓦,而工作流则是用这些砖瓦建造的大厦。ClaudeSkills的真正威力在于组合多个技能,实现自动化流程。
场景示例:竞品监控日报生成
- 触发:每天上午9点,定时任务启动。
- 技能1:数据收集:调用
web_scraper技能,抓取3个竞争对手官网的“新闻”或“产品发布”页面。 - 技能2:数据预处理:调用
text_summarizer技能,对抓取的长篇文章进行摘要。 - 技能3:信息提取:调用
extract_entities技能(可基于NLP库实现),从摘要中提取产品名、发布日期、关键特性等结构化信息。 - 技能4:数据分析与对比:将提取的结构化信息与自家产品数据库(通过
query_database技能)进行对比,生成差异分析。 - 技能5:报告生成:调用
generate_report技能(可能结合模板和jinja2渲染),将分析结果格式化为一份Markdown或HTML日报。 - 技能6:通知发送:调用
send_email或send_slack_message技能,将日报发送给相关团队。
在这个工作流中,Claude扮演着“协调者”和“决策者”的角色。你可以用一个主提示词来引导Claude:“请根据以下步骤生成竞品日报:首先抓取A、B、C网站,然后...”。Claude会逐步思考,在需要时自动调用相应的技能。更高级的用法是实现一个“规划技能”(planner),让Claude根据一个高级目标(如“了解AI领域最新动态”),自行规划需要调用哪些技能(抓取科技媒体、订阅源、分析趋势),并执行。
4.3 安全性与权限管控考量
赋予Claude调用外部技能的能力,也意味着打开了潜在的安全风险之门。在集成ClaudeSkills时,必须建立严格的安全边界。
- 技能白名单机制:不要盲目注册仓库中的所有技能。根据应用场景,只启用必要的技能。一个面向内部员工的数据分析助手,可能不需要
run_shell_command这种高危技能。 - 参数验证与净化:对所有技能输入参数进行严格验证。例如,对于
web_scraper的url参数,应检查其协议(只允许http/https)、域名(可设置允许列表)等,防止服务器端请求伪造(SSRF)攻击。对于execute_python技能,必须在沙箱环境中运行用户代码,并禁用危险模块(如os,sys,subprocess)。 - 权限分级:可以为技能标注风险等级(如
low,medium,high),并为不同用户或对话会话设置不同的权限级别。普通用户只能使用low风险技能(如计算器、单位换算),而管理员可以使用high风险技能(如文件操作、数据库查询)。 - 审计日志:记录每一次技能调用的详细信息:时间、用户、技能名、输入参数、执行结果(或错误)。这既便于问题排查,也满足了安全审计的要求。
- 资源限制:对技能执行设置超时和资源限制。一个编写不当的网页抓取技能可能陷入死循环或发起大量请求,拖垮服务器。
5. 常见问题、调试技巧与进阶优化
5.1 技能调用失败问题排查
即使按照文档操作,技能调用失败也是家常便饭。以下是一个系统性的排查清单:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| Claude完全不调用技能 | 1. 技能定义未正确传递给API。 2. 系统提示词未引导Claude使用工具。 3. 用户问题过于简单,Claude认为无需工具。 | 1. 检查API请求中的tools参数,确保其格式符合Anthropic API规范。2. 在系统提示词中明确说明:“你拥有以下工具,在需要时请使用它们:...”。 3. 尝试更复杂、明确需要外部能力的问题,如“请帮我查一下纽约现在的天气”。 |
| Claude输出了工具调用格式,但后端未执行 | 1. 后端的技能路由/执行器未正确解析Claude的响应。 2. 技能名与注册名不匹配。 | 1. 打印Claude API的完整响应,检查tool_use块的结构。确保你的代码能正确提取name和input。2. 核对 tool_use.name与你在注册中心注册的技能名是否完全一致(大小写敏感)。 |
| 技能执行时报错(如模块未找到) | 1. 技能依赖的Python包未安装。 2. 技能函数内部代码有bug。 3. 运行环境问题(如路径、权限)。 | 1. 确认技能所需依赖已安装(pip list | grep package_name)。2. 在技能函数内部添加更详细的日志和 try-except,将具体错误信息返回。3. 在技能函数外直接使用相同参数调用,进行单元测试。 |
| 技能执行成功,但Claude不理解结果 | 1. 技能返回的结果格式过于复杂或非结构化。 2. 结果内容过长,超出模型上下文处理能力。 | 1. 尽量让技能返回简洁、清晰的文本或结构化的字典/JSON。Claude擅长处理自然文本。 2. 对长结果进行摘要或分页。可以在技能内部实现摘要,或者设计让Claude主动请求“下一页”的交互模式。 |
| 技能被频繁错误调用 | 1. 技能描述(description)不清晰,导致Claude误解其用途。2. 多个技能功能重叠,Claude选择错误。 | 1. 重写技能描述,使其更精确。例如,将“处理数据”改为“对CSV格式的字符串进行基本统计和筛选”。 2. 细化技能分工,或增加技能选择逻辑(例如,先让Claude询问用户澄清需求)。 |
5.2 性能优化与成本控制
当技能变得复杂或调用频繁时,性能和成本就成为必须考虑的问题。
- 技能懒加载与缓存:不是所有技能都需要在应用启动时就全部加载。可以按需加载(懒加载)技能模块。对于
web_scraper这类网络请求技能,可以对请求结果进行缓存(基于URL和参数生成缓存键),在短时间内相同的请求直接返回缓存,避免重复抓取,既提升速度又节省流量。 - 异步执行:如果技能涉及I/O操作(网络请求、数据库查询、文件读写),应将其改造为异步函数(
async def),并使用asyncio来并发执行。当Claude需要连续调用多个独立技能时,异步可以大幅缩短总等待时间。 - 上下文管理:Claude API按Token收费,且上下文长度有限。技能执行的结果应尽可能精简。避免将一整张网页的HTML或一个巨大的JSON直接塞回上下文。设计技能时就要考虑输出内容的“信息密度”。
- 技能组合与批处理:有时Claude会连续调用多个关联技能。你可以设计一个“宏技能”(Macro Skill),将一系列固定步骤封装起来,只需调用一次。例如,一个
fetch_and_analyze技能,内部依次执行抓取、清洗、分析,最后返回一个综合分析结果,这比三次独立的API往返更高效。
5.3 扩展与自定义:打造你自己的技能
kyawshinethu/ClaudeSkills提供了优秀的范本,但真正的力量在于根据自身业务需求创建自定义技能。
创建自定义技能的步骤:
- 定义接口:明确技能要做什么。用一句话描述清楚,例如:“根据股票代码,获取其最近一年的历史价格数据。”
- 设计输入输出:确定输入参数(如
symbol: 股票代码,period: 时间范围)。输出应结构化和易于理解(如{“prices”: […], “dates”: […], “metadata”: {…}})。 - 实现函数:编写Python函数,实现核心逻辑。注意错误处理和边界情况。
- 编写Schema:为你的函数编写一个详细的JSON Schema,描述每个参数的类型、是否必需、枚举值等。这既是给Claude的说明书,也是参数验证的依据。
- 注册与测试:将新技能注册到你的技能库中。编写简单的测试脚本,模拟Claude的调用进行测试。
一个自定义技能示例:获取股票价格
import yfinance as yf import pandas as pd def get_stock_history(symbol: str, period: str = "1y"): """ 获取指定股票代码的历史价格数据。 参数: symbol: 股票代码,例如 'AAPL' 代表苹果公司。 period: 时间范围,可选 '1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max'。默认为 '1y'。 返回: 包含历史价格数据和基本信息的字典。如果失败,返回错误信息。 """ try: ticker = yf.Ticker(symbol) hist = ticker.history(period=period) if hist.empty: return {"status": "error", "message": f"未找到股票代码 '{symbol}' 的数据或该时间段内无交易。"} # 将DataFrame转换为更易处理的格式 history_list = [] for index, row in hist.iterrows(): history_list.append({ "date": index.strftime('%Y-%m-%d'), "open": round(row['Open'], 2), "high": round(row['High'], 2), "low": round(row['Low'], 2), "close": round(row['Close'], 2), "volume": int(row['Volume']) }) info = ticker.info return { "status": "success", "symbol": symbol, "period": period, "company_name": info.get('longName', 'N/A'), "currency": info.get('currency', 'USD'), "history": history_list[-10:] # 只返回最近10条记录,避免上下文过长 } except Exception as e: return {"status": "error", "message": f"获取数据时发生错误: {str(e)}"} # 对应的JSON Schema (简化版) stock_skill_schema = { "name": "get_stock_history", "description": "获取指定股票代码的历史价格数据。", "input_schema": { "type": "object", "properties": { "symbol": {"type": "string", "description": "股票代码,例如 'AAPL'。"}, "period": { "type": "string", "description": "时间范围。", "enum": ["1d", "5d", "1mo", "3mo", "6mo", "1y", "2y", "5y", "10y", "ytd", "max"], "default": "1y" } }, "required": ["symbol"] } }将这个技能注册后,你就可以直接问Claude:“帮我看看苹果公司(AAPL)过去一个月的股价走势。”Claude会理解你的需求,调用get_stock_history(symbol=“AAPL”, period=“1mo”),拿到结构化的数据后,再为你进行分析和总结。这种将专业能力(金融数据获取)与通用对话能力(Claude的分析和表达)结合的模式,正是ClaudeSkills类项目魅力的所在。