用 LangChain 调用 API 访问 Narwhal

借助 LangChain 和 Narwhal,你可以用自然语言询问节假日、发布日期、经济数据、大宗商品、外汇和预测市场方面的问题。用 API 密钥通过 MCP 把智能体连接到 Narwhal,加载只读工具,由智能体为每个问题选择工具。

你将完成的设置

LangChain 把智能体连接到 Narwhal 的只读 MCP 工具,最终你会得到一个对每个数据领域各提一个问题的 Python 脚本。连接部分用 langchain-mcp-adapters 加载工具,用 langgraph.prebuilt 中的 create_react_agent 构建智能体。Narwhal 的各个数据 API 共用一个账户和一个 API 密钥,REST 和 MCP 共用该密钥。脚本带着 Authorization: Bearer YOUR_KEY 请求头连接到 https://api.narwhalapi.com/mcp。提示词就是普通的问题,调用哪个工具由智能体决定。

设置你的 API 密钥

  1. 创建免费密钥 在 narwhalapi.com/signup 创建免费密钥。脚本中的 MCP 连接使用这个 Narwhal 密钥;同一个密钥也适用于 REST API。
  2. 把密钥存入环境变量 把密钥保存在名为 NARWHAL_API_KEY 的环境变量中。输入命令之前,先把 YOUR_KEY 替换成你的密钥,然后在该环境中启动脚本。Python 连接部分会读取这个变量来构造 Bearer 请求头。
    保存你的 Narwhal 密钥
    export NARWHAL_API_KEY="YOUR_KEY"

用代码获取数据

MCP 连接使用 streamable_http 作为传输方式。MultiServerMCPClient 保存服务器 URL 和授权请求头,get_tools() 则把只读工具提供给智能体。在脚本中,问题文本和连接设置是分开的:URL 留在客户端配置里,每条用户消息来自 PROMPTS。提问时不必写进端点或工具名称,就能询问某个领域。

  1. 安装依赖包 安装 MCP 适配器、LangGraph 以及脚本使用的模型集成。适配器提供 MultiServerMCPClient,LangGraph 则提供用于调用 Narwhal 工具的预置智能体。
    安装智能体依赖包
    pip install langchain-mcp-adapters langgraph langchain-anthropic
  2. 保存智能体脚本 把下面的代码保存为 agent.py。它用 await client.get_tools() 加载工具,构建智能体,并把 PROMPTS 中的每个问题作为用户消息发送。打印出的每个答案,都是智能体返回的最后一条消息的内容。
加载 Narwhal 工具,每个领域各问一个问题
import asyncio, os
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent

PROMPTS = {
    "holidays": "Is 25 December 2026 a public holiday in the United States?",
    "release dates": "When is the US CPI release in November 2026?",
    "economics": "What is the latest US CPI index and its month-on-month change?",
    "commodities": "What is the Brent spot price in dollars a barrel?",
    "FX": "What are the USD/EUR and USD/IDR rates?",
    "predictions": "What are the Fed rate odds for its next meeting?",
}

async def main():
    client = MultiServerMCPClient({
        "narwhal": {
            "transport": "streamable_http",
            "url": "https://api.narwhalapi.com/mcp",
            "headers": {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"},
        }
    })
    tools = await client.get_tools()
    agent = create_react_agent("anthropic:claude-sonnet-5-5", tools)
    for area, question in PROMPTS.items():
        result = await agent.ainvoke({"messages": [("user", question)]})
        print(area, "->", result["messages"][-1].content)

asyncio.run(main())
  1. 启动智能体 在保存有 Narwhal 密钥的环境中运行保存好的文件。想问别的问题,就修改相应的提示词文本。请让提示词保持为自然语言问题,以便智能体选择工具。
    运行保存的脚本
    python agent.py

各领域的示例使用与完整脚本相同的 agent 和 PROMPTS。在构建好智能体之后,把示例放进 main(),就能提出该领域的问题并打印答案。每个示例旁边的 REST URL 标明了对应的数据端点及其返回的响应字段。

按计划定时运行

通过 cron 或应用的调度器运行 python agent.py,并确保脚本能读取 NARWHAL_API_KEY。定时运行的脚本和手动运行时一样,遵循同样的提示词循环。请把脚本启动时希望智能体提出的问题,设置在 PROMPTS 中。

每次成功的工具调用会消耗该密钥额度中的一次调用。定时任务只负责启动脚本,用哪些工具由智能体根据脚本中的问题来选择。如果想限制定时智能体可用的工具,请在把工具列表传给 create_react_agent 之前先过滤它。

用 LangChain 查询节假日

询问 2026 年 12 月 25 日是不是美国的公共假日。节假日工具是 calendars_list_holidays。对应的 REST 数据来自 https://api.narwhalapi.com/v1/calendars/holidays/USA/2026,返回 holidays,每个条目都有 date 和 name。示例把 PROMPTS 中的节假日问题发送给智能体。

询问节假日
result = await agent.ainvoke({
    "messages": [("user", PROMPTS["holidays"])]
})
print(result["messages"][-1].content)

用 LangChain 查询发布日期

询问 2026 年 11 月美国 CPI 在哪天发布。发布日期工具是 economics_list_releases。对应的 REST URL 是 https://api.narwhalapi.com/v1/economics/calendar?countries=USA&start_date=2026-11-01&end_date=2026-11-30&limit=100。读取 releases,其条目包含 at、period、topic 和 status。这个问题询问的是经济日历中的发布日期。

询问发布日期
result = await agent.ainvoke({
    "messages": [("user", PROMPTS["release dates"])]
})
print(result["messages"][-1].content)

用 LangChain 查询经济数据

用经济数据的提示词询问美国 CPI 指数及其环比变化。CPI 工具是 economics_get_cpi。对应的 REST URL https://api.narwhalapi.com/v1/economics/USA/cpi/observations?start=2025-09 返回 observations,每个条目都有 period 和 value。智能体接收问题,并选择工具来回答。Narwhal 的经济数据包括 CPI、通胀、GDP 和收益率。在 CPI 响应中,period 标识观测期间,value 是观测值;提示词让智能体给出指数和环比变化。

询问经济数据
result = await agent.ainvoke({
    "messages": [("user", PROMPTS["economics"])]
})
print(result["messages"][-1].content)

用 LangChain 查询大宗商品

询问 Brent 现货价格,以每桶多少美元计。现货价格工具是 commodities_get_spot_price。对应的 REST URL 是 https://api.narwhalapi.com/v1/commodities/spot/BRENT/USD,响应中有 price 字段。大宗商品现货代码例如 XAU、XAG、XPT、XPD、XCU、BRENT 和 WTI。

询问大宗商品
result = await agent.ainvoke({
    "messages": [("user", PROMPTS["commodities"])]
})
print(result["messages"][-1].content)

用 LangChain 查询外汇

用外汇的提示词询问 USD/EUR 和 USD/IDR 汇率。汇率工具是 fx_get_rates。对应的 REST URL https://api.narwhalapi.com/v1/fx/rates/USD?currencies=EUR,IDR 返回 rates,每个条目都有 currency 和 rate。两个货币对都包含在发送给智能体的同一个问题中。

询问外汇
result = await agent.ainvoke({
    "messages": [("user", PROMPTS["FX"])]
})
print(result["messages"][-1].content)

用 LangChain 查询预测市场

用预测市场的提示词询问美联储利率的概率。政策路径工具是 predictions_get_policy_path。对应的 REST URL 是 https://api.narwhalapi.com/v1/predictions/policy-paths/federal-reserve。其 meetings 条目包含 resolves_at、p_cut、p_hold 和 p_hike,分别表示会议的结算时间,以及降息、维持不变或加息的概率。用结算时间就能确定这些概率对应的是哪一次会议。示例问题询问的是利率概率,智能体会把它当作用户消息接收。

询问预测市场
result = await agent.ainvoke({
    "messages": [("user", PROMPTS["predictions"])]
})
print(result["messages"][-1].content)

工具调用会消耗请求次数吗?

会。请求用量取决于智能体进行的工具调用。把问题列表放进 PROMPTS,并不能决定智能体会为这些问题选择哪些工具。安排定时运行时,请把它的工具调用也计算在内。

如何限制工具?

先按名称过滤 get_tools() 返回的列表,再把它传给智能体。名称包括 economics_get_cpi、economics_list_releases、calendars_list_holidays、commodities_get_spot_price、fx_get_rates 和 predictions_get_policy_path。把过滤后的列表作为 tools 参数传给 create_react_agent,智能体就只拥有你选定的工具。

发布于。

后续步骤