告别“纯聊天”!用 Claude Agent SDK 给大模型装上“手和脚” —— 实战 A 股财报分析 Agent
告别“纯聊天”!用 Claude Agent SDK 给大模型装上“手和脚” —— 实战 A 股财报分析 Agent
现在的 LLM 越来越聪明,但它们往往受限于训练数据,缺乏实时获取外部数据或执行本地任务的能力。如何让大模型不仅能“说”,还能“做”?
MCP(Model Context Protocol)协议的出现,为这个问题提供了一个优雅的解决方案。今天,我们将借助 claude-agent-sdk,结合本地部署的开源模型,手把手教你写一个能自动抓取 A 股上市公司财报并落地的实战 Agent!
💡 核心概念解析
在开始看代码之前,我们需要搞懂两个核心概念:
-
1. MCP (Model Context Protocol): 一种让大模型与外部工具进行标准化交互的协议。你可以把它想象成大模型和现实世界之间的“USB 接口”。
-
2. Claude Agent SDK: 虽然名字叫 Claude SDK,但它底层基于 MCP 协议构建。这意味着 它完全可以配合 OpenAI API 兼容的本地模型(如 Qwen)一起使用! 这就是我们今天代码中最酷的地方。
🛠️ 1. 准备工作:环境与配置
代码使用 dotenv 加载环境变量,并巧妙地将 Anthropic SDK 的请求地址重定向到了本地的 http://localhost:1234/v1(通常是 LM Studio 或 vLLM 提供的服务),并将模型替换成了开源的 Qwen。
<span></span><code><span><span><span leaf="">import</span></span><span leaf=""> os</span><span><br><span leaf="">from</span></span><span leaf=""> dotenv</span><span><span leaf=""> import</span></span><span leaf=""> load_dotenv</span><span><br><span leaf="">import</span></span><span leaf=""> akshare</span><span><span leaf=""> as</span></span><span leaf=""> ak</span><span><span leaf=""> # 强大的金融数据获取库</span></span><br><br><span leaf="">load_dotenv()</span><span><br><span leaf=""># 替换为本地部署的大模型</span></span><br><span leaf="">os.environ.setdefault(</span><span><span leaf="">"ANTHROPIC_BASE_URL"</span></span><span leaf="">,</span><span><span leaf=""> "http://localhost:1234/v1"</span></span><span leaf="">)</span><br><span leaf="">os.environ.setdefault(</span><span><span leaf="">"ANTHROPIC_MODEL"</span></span><span leaf="">,</span><span><span leaf=""> "qwen/qwen3.6-35b-a3b"</span></span><span leaf="">)</span><br><span leaf="">os.environ.setdefault(</span><span><span leaf="">"ANTHROPIC_AUTH_TOKEN"</span></span><span leaf="">,</span><span><span leaf=""> "sk-..."</span></span><span leaf="">)</span></span></code>
Tips: 这意味着你无需调用昂贵的商业 API,只需在本地跑一个开源模型,就能体验强大的 Agent 能力!数据完全掌握在自己手里,安全又免费。
🔧 2. 打造专属“工具”:@tool 装饰器
大模型要干活,得先有工具。在 SDK 中,我们使用 @tool 装饰器来定义工具。
<span></span><code><span><span><span leaf="">from</span></span><span leaf=""> claude_agent_sdk</span><span><span leaf=""> import</span></span><span leaf=""> tool</span><span><br><br><span leaf="">@tool(</span><span><span><span leaf="">"getbalance"</span></span><span leaf="">,</span><span><span leaf=""> "获取沪深A股公司的资产负债表..."</span></span><span leaf="">, {</span><span><span leaf="">"stock_code"</span></span><span leaf="">:</span><span><span leaf=""> str</span></span><span leaf="">,</span><span><span leaf=""> "year"</span></span><span leaf="">:</span><span><span leaf=""> str</span></span><span leaf="">}</span></span><span leaf="">)</span></span><span><br><span leaf="">async</span></span><span><span leaf=""> def</span></span><span><span leaf=""> get_balance_sheet_A</span></span><span leaf="">(</span><span><span leaf="">params:</span><span><span leaf=""> dict</span></span></span><span leaf="">):</span><span><br><span leaf=""> # 1. 提取参数</span></span><br><span leaf=""> stock_code = params.get(</span><span><span leaf="">'stock_code'</span></span><span leaf="">,</span><span><span leaf=""> 'SH600600'</span></span><span leaf="">)</span><br><span leaf=""> year_val = params.get(</span><span><span leaf="">'year'</span></span><span leaf="">,</span><span><span leaf=""> '2025'</span></span><span leaf="">)</span><span><br><span leaf=""> </span><br><span leaf=""> # 2. 使用 akshare 获取财报数据</span></span><br><span leaf=""> df_balance_sheet = ak.stock_balance_sheet_by_yearly_em(symbol=stock_code)</span><br><span leaf=""> df_balance_sheet = df_balance_sheet[df_balance_sheet[</span><span><span leaf="">'REPORT_DATE'</span></span><span leaf="">] ==</span><span><span leaf=""> f'</span><span><span leaf="">{year_val}</span></span><span leaf="">-12-31 00:00:00'</span></span><span leaf="">]</span><span><br><span leaf=""> </span><br><span leaf=""> # 3. 保存为本地 CSV 文件</span></span><br><span leaf=""> filepath = os.path.join(os.getcwd(),</span><span><span leaf=""> "data"</span></span><span leaf="">,</span><span><span leaf=""> "financial_statements"</span></span><span leaf="">,</span><span><span leaf=""> f"</span><span><span leaf="">{stock_code}</span></span><span leaf="">_</span><span><span leaf="">{year_val}</span></span><span leaf="">_资产负债表.csv"</span></span><span leaf="">)</span><br><span leaf=""> os.makedirs(os.path.dirname(filepath), exist_ok=</span><span><span leaf="">True</span></span><span leaf="">)</span><br><span leaf=""> df_balance_sheet.to_csv(filepath, index=</span><span><span leaf="">False</span></span><span leaf="">, encoding=</span><span><span leaf="">'utf-8-sig'</span></span><span leaf="">)</span><span><br><span leaf=""> </span><br><span leaf=""> # 4. 按照 MCP 规范返回结果</span></span><span><br><span leaf=""> return</span></span><span leaf=""> {</span><span><span leaf="">"content"</span></span><span leaf="">: [{</span><span><span leaf="">"type"</span></span><span leaf="">:</span><span><span leaf=""> "text"</span></span><span leaf="">,</span><span><span leaf=""> "text"</span></span><span leaf="">:</span><span><span leaf=""> f"资产负债表已保存到:</span><span><span leaf=""> {filepath}</span></span><span leaf="">"</span></span><span leaf="">}]}</span></span></code>
划重点:
-
• 工具名称 (
"getbalance"): 这是模型看到的“函数名”。 -
• 工具描述: 模型就是通过阅读这段描述,来决定什么时候调用这个工具的。写清楚参数类型和用途至关重要!
-
• 返回值规范: MCP 协议要求返回特定的 JSON 结构(包含
content数组),以便模型能够解析工具的执行结果并继续推理。
📦 3. 组装 MCP Server
定义好工具后,我们需要把它包装成一个标准的 MCP Server。这一步就像是把我们的工具打包成了一个独立的服务,随时准备被大模型调用。
<span></span><code><span><span><span leaf="">from</span></span><span leaf=""> claude_agent_sdk</span><span><span leaf=""> import</span></span><span leaf=""> create_sdk_mcp_server</span><br><br><span leaf="">server = create_sdk_mcp_server(</span><br><span leaf=""> name=</span><span><span leaf="">"my-tools"</span></span><span leaf="">,</span><br><span leaf=""> version=</span><span><span leaf="">"1.0.0"</span></span><span leaf="">,</span><br><span leaf=""> tools=[get_balance_sheet_A]</span><br><span leaf="">)</span></span></code>
🚀 4. 启动 Agent 客户端
最后,初始化客户端,把刚才创建的 MCP Server 交给它,并发送指令!
<span></span><code><span><span><span leaf="">from</span></span><span leaf=""> claude_agent_sdk</span><span><span leaf=""> import</span></span><span leaf=""> ClaudeSDKClient, ClaudeAgentOptions</span><span><br><span leaf="">import</span></span><span leaf=""> anyio</span><span><br><br><span leaf=""># 配置 Agent 选项</span></span><br><span leaf="">options = ClaudeAgentOptions(</span><br><span leaf=""> mcp_servers={</span><span><span leaf="">"tools"</span></span><span leaf="">: server},</span><span><br><span leaf=""> # 预授权工具,跳过权限确认弹窗,实现全自动化</span></span><br><span leaf=""> allowed_tools=[</span><span><span leaf="">"mcp__tools__getbalance"</span></span><span leaf="">] </span><br><span leaf="">)</span><span><br><br><span leaf="">async</span></span><span><span leaf=""> def</span></span><span><span leaf=""> main</span></span><span leaf="">():</span><span><br><span leaf=""> async</span></span><span><span leaf=""> with</span></span><span leaf=""> ClaudeSDKClient(options=options)</span><span><span leaf=""> as</span></span><span leaf=""> client:</span><span><br><span leaf=""> # 发送自然语言指令</span></span><span><br><span leaf=""> await</span></span><span leaf=""> client.query(</span><span><span leaf="">"获取 SH600600 的2025年度资产负债表"</span></span><span leaf="">)</span><span><br><br><span leaf=""> # 流式打印大模型的回答</span></span><span><br><span leaf=""> async</span></span><span><span leaf=""> for</span></span><span leaf=""> msg</span><span><span leaf=""> in</span></span><span leaf=""> client.receive_response():</span><span><br><span leaf=""> print</span></span><span leaf="">(msg)</span><br><br><span leaf="">anyio.run(main)</span></span></code>
🔑 核心细节
allowed_tools:
这里的mcp__tools__getbalance是一种约定俗成的工具 ID 命名规则:mcp__{server_name}__{tool_name}。把它加进去,模型在调用时就不会弹出“是否允许执行”的二次确认,实现真正的全自动运行。
⚙️ 5. 完整运行流程复盘
当你运行这段代码时,后台到底发生了什么?
-
1. 用户输入: “获取 SH600600 的2025年度资产负债表”。
-
2. 大模型思考: Qwen 模型分析意图,发现需要获取 A 股财报,于是决定调用
getbalance工具。 -
3. 参数提取: 模型自动从用户的话中提取出
stock_code="SH600600"和year="2025"。 -
4. 工具执行: Python 代码接管,通过
akshare请求金融接口,下载数据并保存为本地 CSV 文件。 -
5. 反馈结果: 工具将“保存成功”的路径信息返回给大模型。
-
6. 最终回复: 大模型根据执行结果,生成一段总结性的话反馈给用户。
📝 总结与思考
通过这不到 100 行的 Python 代码,我们不仅实现了一个具备自然语言理解 + 自动化执行 + 文件读写能力的智能体,还掌握了 MCP 协议的核心机制。
未来可扩展的方向:
-
• 多工具协同: 给 Agent 加上“利润表查询”、“现金流量表查询”等工具,让它能进行全面的财务分析。
-
• 数据可视化: 在工具中加入绘图功能,执行完毕后直接将生成的图表返回给大模型。
-
• 自动化报告: 让大模型读取 CSV 文件,自动生成一份专业的股票分析报告。
无论是金融数据抓取、天气查询还是自动化运维,你都可以用这套模板去构建属于你自己的 AI 助手。赶紧动手试试吧!
如果你觉得这篇文章对你有帮助,欢迎点赞、在看、分享给你的朋友!欢迎在评论区留言交流你在构建 Agent 过程中遇到的坑~
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/stock002/post/20260816/%E5%91%8A%E5%88%AB%E7%BA%AF%E8%81%8A%E5%A4%A9%E7%94%A8-Claude-Agent-SDK-%E7%BB%99%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%A3%85%E4%B8%8A%E6%89%8B%E5%92%8C%E8%84%9A-%E5%AE%9E%E6%88%98-A-%E8%82%A1%E8%B4%A2%E6%8A%A5%E5%88%86%E6%9E%90-Agent/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com