告别“纯聊天”!用 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

1
2
3
4
5
6
7
8
9
import os
from dotenv import load_dotenv
import akshare as ak # 强大的金融数据获取库

load_dotenv()
# 替换为本地部署的大模型
os.environ.setdefault("ANTHROPIC_BASE_URL", "http://localhost:1234/v1")
os.environ.setdefault("ANTHROPIC_MODEL", "qwen/qwen3.6-35b-a3b")
os.environ.setdefault("ANTHROPIC_AUTH_TOKEN", "sk-...")

Tips: 这意味着你无需调用昂贵的商业 API,只需在本地跑一个开源模型,就能体验强大的 Agent 能力!数据完全掌握在自己手里,安全又免费。


🔧 2. 打造专属“工具”:@tool 装饰器

大模型要干活,得先有工具。在 SDK 中,我们使用 @tool 装饰器来定义工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from claude_agent_sdk import tool

@tool("getbalance", "获取沪深A股公司的资产负债表...", {"stock_code": str, "year": str})
async def get_balance_sheet_A(params: dict):
# 1. 提取参数
stock_code = params.get('stock_code', 'SH600600')
year_val = params.get('year', '2025')

# 2. 使用 akshare 获取财报数据
df_balance_sheet = ak.stock_balance_sheet_by_yearly_em(symbol=stock_code)
df_balance_sheet = df_balance_sheet[df_balance_sheet['REPORT_DATE'] == f'{year_val}-12-31 00:00:00']

# 3. 保存为本地 CSV 文件
filepath = os.path.join(os.getcwd(), "data", "financial_statements", f"{stock_code}_{year_val}_资产负债表.csv")
os.makedirs(os.path.dirname(filepath), exist_ok=True)
df_balance_sheet.to_csv(filepath, index=False, encoding='utf-8-sig')

# 4. 按照 MCP 规范返回结果
return {"content": [{"type": "text", "text": f"资产负债表已保存到: {filepath}"}]}

划重点:

  • 工具名称 ("getbalance"): 这是模型看到的“函数名”。
  • 工具描述: 模型就是通过阅读这段描述,来决定什么时候调用这个工具的。写清楚参数类型和用途至关重要!
  • 返回值规范: MCP 协议要求返回特定的 JSON 结构(包含 content 数组),以便模型能够解析工具的执行结果并继续推理。

📦 3. 组装 MCP Server

定义好工具后,我们需要把它包装成一个标准的 MCP Server。这一步就像是把我们的工具打包成了一个独立的服务,随时准备被大模型调用。

1
2
3
4
5
6
7
from claude_agent_sdk import create_sdk_mcp_server

server = create_sdk_mcp_server(
name="my-tools",
version="1.0.0",
tools=[get_balance_sheet_A]
)

🚀 4. 启动 Agent 客户端

最后,初始化客户端,把刚才创建的 MCP Server 交给它,并发送指令!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
import anyio

# 配置 Agent 选项
options = ClaudeAgentOptions(
mcp_servers={"tools": server},
# 预授权工具,跳过权限确认弹窗,实现全自动化
allowed_tools=["mcp__tools__getbalance"]
)

async def main():
async with ClaudeSDKClient(options=options) as client:
# 发送自然语言指令
await client.query("获取 SH600600 的2025年度资产负债表")

# 流式打印大模型的回答
async for msg in client.receive_response():
print(msg)

anyio.run(main)

🔑 核心细节 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 过程中遇到的坑~