MCP,即模型上下文协议(Model Context Protocol),是一种开创性的框架,目前正在AI与大型语言模型(LLM)社区迅速流行起来。它就像一个AI系统的通用连接器,可以帮助AI无缝地与外部资源、API和服务集成。你可以将MCP想象成一种标准化的协议,它让LLM能够以一致且高效的方式与各种工具和数据源交互,这类似于USB-C接口之于设备的作用。

在本教程中,我们将使用Yahoo Finance的Python API构建我们自己的MCP服务器,以获取实时股票价格信息、进行股票价格比较,并提供历史数据分析。本项目适合初学者,只需具备Python基础知识即可完成。
1. 搭建MCP服务器环境首先,前往claude.ai网站,下载并安装Claude Desktop。然后,使用PIP命令安装MCP及yfinance的Python包:
pip install "mcp[cli]" yfinance2. 构建MCP服务器创建一个项目目录,命名任意。然后创建一个名为stock_price_server.py的Python文件,并添加如下代码。
具体功能包括:
MCP服务器初始化:使用FastMCP类创建一个名为“Stock Price Server”(股票价格服务器)的可定制MCP服务器。股票价格获取:get_stock_price函数用于获取指定股票代码的最新价格,并在市场关闭或数据缺失时有备用方案。资源暴露:stock_resource函数以资源形式暴露股票价格数据,提供用户友好的输出格式。历史数据获取:get_stock_history函数检索指定周期内股票的历史数据,以CSV格式返回。股票比较:compare_stocks函数比较两个股票代码的价格,并返回一个明确的比较信息。错误处理:每个函数都包含稳健的错误处理机制,当数据获取失败时返回有意义的提示消息。具体代码如下所示:
from mcp.server.fastmcp import FastMCPimport yfinance as yf# 创建一个自定义名称的MCP服务器mcp = FastMCP("Stock Price Server")@mcp.tool()def get_stock_price(symbol: str) -> float: """ 获取给定股票代码的当前股票价格。 返回最新的收盘价格,类型为float。 """ try: ticker = yf.Ticker(symbol) data = ticker.history(period="1d") if not data.empty: price = data['Close'].iloc[-1] return float(price) else: info = ticker.info price = info.get("regularMarketPrice", None) if price is not None: return float(price) else: return -1.0 # 表示失败 except Exception: return -1.0 # 表示发生错误@mcp.resource("stock://{symbol}")def stock_resource(symbol: str) -> str: """ 将股票价格数据暴露为资源。 返回给定股票代码的当前股票价格的格式化字符串。 """ price = get_stock_price(symbol) if price < 0: return f"错误:无法获取股票代码 '{symbol}' 的价格。" return f"'{symbol}' 的当前价格为 ${price:.2f}。"@mcp.tool()def get_stock_history(symbol: str, period: str = "1mo") -> str: """ 获取指定股票代码和周期的历史数据,以CSV格式返回。 参数: - symbol:股票代码 - period:历史数据的周期(例如:'1mo', '3mo', '1y') """ try: ticker = yf.Ticker(symbol) data = ticker.history(period=period) if data.empty: return f"未找到股票 '{symbol}' 在 '{period}' 周期内的历史数据。" csv_data = data.to_csv() return csv_data except Exception as e: return f"获取历史数据时出错:{str(e)}"@mcp.tool()def compare_stocks(symbol1: str, symbol2: str) -> str: """ 比较两个股票代码的当前股票价格。 返回比较结果的格式化信息。 参数: - symbol1:第一个股票代码 - symbol2:第二个股票代码 """ price1 = get_stock_price(symbol1) price2 = get_stock_price(symbol2) if price1 < 0 or price2 < 0: return f"错误:无法获取 '{symbol1}' 和 '{symbol2}' 的数据进行比较。" if price1 > price2: result = f"{symbol1} (${price1:.2f}) 高于 {symbol2} (${price2:.2f})。" elif price1 < price2: result = f"{symbol1} (${price1:.2f}) 低于 {symbol2} (${price2:.2f})。" else: result = f"{symbol1} 和 {symbol2} 的价格相同(${price1:.2f})。" return resultif __name__ == "__main__": mcp.run()3. 检查MCP服务器我们现在使用MCP服务器检查器测试服务器,运行以下命令:
mcp dev stock_price_server.py此命令将引导你访问MCP检查器的界面。在该界面中,你可以测试各种工具,确认所有功能正常。
该服务器现在暴露以下工具:
get_stock_price:获取最新股票价格的工具。stock_resource:返回人性化股票价格信息的资源。get_stock_history:以CSV格式返回历史数据的工具。compare_stocks:比较两只股票当前价格的工具。4. 为Claude Desktop配置MCP服务器确认MCP服务器正常后,运行以下终端命令,将服务器集成到Claude Desktop中:
mcp install stock_price_server.py --name "Stock Price Server"重新启动Claude Desktop后,你将在聊天选项下方看到新的图标,这表示我们的MCP已配置成功。你可以点击这些图标查看为Claude Desktop提供的工具数量。
5. 在Claude Desktop中测试MCP服务器我们将首先要求Claude Desktop对比微软和特斯拉股票价格:
提示:“请比较微软和特斯拉股票的价格。”
输入提示后,它会请求使用指定工具的许可,点击“允许本次聊天使用”即可。
接下来,我们请求过去一个月特斯拉股票的历史数据分析:
提示:“请提供过去一个月特斯拉的历史数据。”
同样地,我们获得了出色的分析内容,甚至比手动上传CSV文件更便捷。
结语MCP是一种基于传统功能调用与AI智能代理的新兴概念。未来,我们致力于完善这些技术,实现外部资源与AI的无缝整合。这样,你的AI助手将能够根据你的请求执行更多任务,例如订购食品杂货、发送邮件、创建Spotify播放列表并与你的朋友分享。
