告别“纯聊天”!用 Claude Agent SDK 给大模型装上“手和脚” —— 实战 A 股财报分析 Agent

现在的 LLM 越来越聪明,但它们往往受限于训练数据,缺乏实时获取外部数据或执行本地任务的能力。如何让大模型不仅能“说”,还能“做”?

MCP(Model Context Protocol)协议的出现,为这个问题提供了一个优雅的解决方案。今天,我们将借助 claude-agent-sdk,结合本地部署的开源模型,手把手教你写一个能自动抓取 A 股上市公司财报并落地的实战 Agent!


💡 核心概念解析

在开始看代码之前,我们需要搞懂两个核心概念:

  1. 1. MCP (Model Context Protocol): 一种让大模型与外部工具进行标准化交互的协议。你可以把它想象成大模型和现实世界之间的“USB 接口”。

  2. 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="">&nbsp;os</span><span><br><span leaf="">from</span></span><span leaf="">&nbsp;dotenv</span><span><span leaf="">&nbsp;import</span></span><span leaf="">&nbsp;load_dotenv</span><span><br><span leaf="">import</span></span><span leaf="">&nbsp;akshare</span><span><span leaf="">&nbsp;as</span></span><span leaf="">&nbsp;ak</span><span><span leaf="">&nbsp;# 强大的金融数据获取库</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="">&nbsp;"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="">&nbsp;"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="">&nbsp;"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="">&nbsp;claude_agent_sdk</span><span><span leaf="">&nbsp;import</span></span><span leaf="">&nbsp;tool</span><span><br><br><span leaf="">@tool(</span><span><span><span leaf="">"getbalance"</span></span><span leaf="">,</span><span><span leaf="">&nbsp;"获取沪深A股公司的资产负债表..."</span></span><span leaf="">, {</span><span><span leaf="">"stock_code"</span></span><span leaf="">:</span><span><span leaf="">&nbsp;str</span></span><span leaf="">,</span><span><span leaf="">&nbsp;"year"</span></span><span leaf="">:</span><span><span leaf="">&nbsp;str</span></span><span leaf="">}</span></span><span leaf="">)</span></span><span><br><span leaf="">async</span></span><span><span leaf="">&nbsp;def</span></span><span><span leaf="">&nbsp;get_balance_sheet_A</span></span><span leaf="">(</span><span><span leaf="">params:</span><span><span leaf="">&nbsp;dict</span></span></span><span leaf="">):</span><span><br><span leaf="">&nbsp; &nbsp; # 1. 提取参数</span></span><br><span leaf="">&nbsp; &nbsp; stock_code = params.get(</span><span><span leaf="">'stock_code'</span></span><span leaf="">,</span><span><span leaf="">&nbsp;'SH600600'</span></span><span leaf="">)</span><br><span leaf="">&nbsp; &nbsp; year_val = params.get(</span><span><span leaf="">'year'</span></span><span leaf="">,</span><span><span leaf="">&nbsp;'2025'</span></span><span leaf="">)</span><span><br><span leaf="">&nbsp; &nbsp;&nbsp;</span><br><span leaf="">&nbsp; &nbsp; # 2. 使用 akshare 获取财报数据</span></span><br><span leaf="">&nbsp; &nbsp; df_balance_sheet = ak.stock_balance_sheet_by_yearly_em(symbol=stock_code)</span><br><span leaf="">&nbsp; &nbsp; df_balance_sheet = df_balance_sheet[df_balance_sheet[</span><span><span leaf="">'REPORT_DATE'</span></span><span leaf="">] ==</span><span><span leaf="">&nbsp;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="">&nbsp; &nbsp;&nbsp;</span><br><span leaf="">&nbsp; &nbsp; # 3. 保存为本地 CSV 文件</span></span><br><span leaf="">&nbsp; &nbsp; filepath = os.path.join(os.getcwd(),</span><span><span leaf="">&nbsp;"data"</span></span><span leaf="">,</span><span><span leaf="">&nbsp;"financial_statements"</span></span><span leaf="">,</span><span><span leaf="">&nbsp;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="">&nbsp; &nbsp; os.makedirs(os.path.dirname(filepath), exist_ok=</span><span><span leaf="">True</span></span><span leaf="">)</span><br><span leaf="">&nbsp; &nbsp; 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="">&nbsp; &nbsp;&nbsp;</span><br><span leaf="">&nbsp; &nbsp; # 4. 按照 MCP 规范返回结果</span></span><span><br><span leaf="">&nbsp; &nbsp; return</span></span><span leaf="">&nbsp;{</span><span><span leaf="">"content"</span></span><span leaf="">: [{</span><span><span leaf="">"type"</span></span><span leaf="">:</span><span><span leaf="">&nbsp;"text"</span></span><span leaf="">,</span><span><span leaf="">&nbsp;"text"</span></span><span leaf="">:</span><span><span leaf="">&nbsp;f"资产负债表已保存到:</span><span><span leaf="">&nbsp;{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="">&nbsp;claude_agent_sdk</span><span><span leaf="">&nbsp;import</span></span><span leaf="">&nbsp;create_sdk_mcp_server</span><br><br><span leaf="">server = create_sdk_mcp_server(</span><br><span leaf="">&nbsp; &nbsp; name=</span><span><span leaf="">"my-tools"</span></span><span leaf="">,</span><br><span leaf="">&nbsp; &nbsp; version=</span><span><span leaf="">"1.0.0"</span></span><span leaf="">,</span><br><span leaf="">&nbsp; &nbsp; 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="">&nbsp;claude_agent_sdk</span><span><span leaf="">&nbsp;import</span></span><span leaf="">&nbsp;ClaudeSDKClient, ClaudeAgentOptions</span><span><br><span leaf="">import</span></span><span leaf="">&nbsp;anyio</span><span><br><br><span leaf=""># 配置 Agent 选项</span></span><br><span leaf="">options = ClaudeAgentOptions(</span><br><span leaf="">&nbsp; &nbsp; mcp_servers={</span><span><span leaf="">"tools"</span></span><span leaf="">: server},</span><span><br><span leaf="">&nbsp; &nbsp; # 预授权工具,跳过权限确认弹窗,实现全自动化</span></span><br><span leaf="">&nbsp; &nbsp; allowed_tools=[</span><span><span leaf="">"mcp__tools__getbalance"</span></span><span leaf="">]&nbsp;</span><br><span leaf="">)</span><span><br><br><span leaf="">async</span></span><span><span leaf="">&nbsp;def</span></span><span><span leaf="">&nbsp;main</span></span><span leaf="">():</span><span><br><span leaf="">&nbsp; &nbsp; async</span></span><span><span leaf="">&nbsp;with</span></span><span leaf="">&nbsp;ClaudeSDKClient(options=options)</span><span><span leaf="">&nbsp;as</span></span><span leaf="">&nbsp;client:</span><span><br><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; # 发送自然语言指令</span></span><span><br><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; await</span></span><span leaf="">&nbsp;client.query(</span><span><span leaf="">"获取 SH600600 的2025年度资产负债表"</span></span><span leaf="">)</span><span><br><br><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; # 流式打印大模型的回答</span></span><span><br><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; async</span></span><span><span leaf="">&nbsp;for</span></span><span leaf="">&nbsp;msg</span><span><span leaf="">&nbsp;in</span></span><span leaf="">&nbsp;client.receive_response():</span><span><br><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 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. 1. 用户输入: “获取 SH600600 的2025年度资产负债表”。

  2. 2. 大模型思考: Qwen 模型分析意图,发现需要获取 A 股财报,于是决定调用 getbalance 工具。

  3. 3. 参数提取: 模型自动从用户的话中提取出 stock_code="SH600600" 和 year="2025"

  4. 4. 工具执行: Python 代码接管,通过 akshare 请求金融接口,下载数据并保存为本地 CSV 文件。

  5. 5. 反馈结果: 工具将“保存成功”的路径信息返回给大模型。

  6. 6. 最终回复: 大模型根据执行结果,生成一段总结性的话反馈给用户。


📝 总结与思考

通过这不到 100 行的 Python 代码,我们不仅实现了一个具备自然语言理解 + 自动化执行 + 文件读写能力的智能体,还掌握了 MCP 协议的核心机制。

未来可扩展的方向:

  • • 多工具协同: 给 Agent 加上“利润表查询”、“现金流量表查询”等工具,让它能进行全面的财务分析。

  • • 数据可视化: 在工具中加入绘图功能,执行完毕后直接将生成的图表返回给大模型。

  • • 自动化报告: 让大模型读取 CSV 文件,自动生成一份专业的股票分析报告。

无论是金融数据抓取、天气查询还是自动化运维,你都可以用这套模板去构建属于你自己的 AI 助手。赶紧动手试试吧!


如果你觉得这篇文章对你有帮助,欢迎点赞、在看、分享给你的朋友!欢迎在评论区留言交流你在构建 Agent 过程中遇到的坑~