<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: dustin liang</title>
    <description>The latest articles on DEV Community by dustin liang (@dustinliang).</description>
    <link>https://dev.to/dustinliang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4225315%2F194bea3d-fab9-4742-972c-b4cb527604c2.png</url>
      <title>DEV Community: dustin liang</title>
      <link>https://dev.to/dustinliang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dustinliang"/>
    <language>en</language>
    <item>
      <title>How AI Agents Pull A-Share Heat Data via MCP in About Five Minutes</title>
      <dc:creator>dustin liang</dc:creator>
      <pubDate>Wed, 04 Nov 2026 03:41:04 +0000</pubDate>
      <link>https://dev.to/dustinliang/how-ai-agents-pull-a-share-heat-data-via-mcp-in-about-five-minutes-5dkm</link>
      <guid>https://dev.to/dustinliang/how-ai-agents-pull-a-share-heat-data-via-mcp-in-about-five-minutes-5dkm</guid>
      <description>&lt;p&gt;Most LLM agents that touch Chinese equities hit the same wall: the model can reason about a sector, but it has no structured, timely view of &lt;em&gt;what the market is actually talking about&lt;/em&gt;. Scraping forums and news sites is brittle, slow, and full of raw text you probably should not be redistributing.&lt;/p&gt;

&lt;p&gt;Lava (熔岩) is a read-only data service that turns A-share news flow into structured &lt;strong&gt;heat&lt;/strong&gt; signals for stocks and concept boards, exposed over both MCP and REST. This post walks through what the data means, which tools exist, and how to wire an agent to it quickly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lava returns attention/heat data only. No bullish/bearish labels, no original text, no price targets, and nothing in this article is investment advice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What "heat" means in Lava
&lt;/h2&gt;

&lt;p&gt;Lava counts and weights &lt;strong&gt;mentions&lt;/strong&gt; of A-share stocks and concept boards across institutional notes, commentators, and mainstream financial news. Sources are anonymized into stable IDs (for example an agency ID), so you can track source quality without seeing names or source text.&lt;/p&gt;

&lt;p&gt;Three data categories matter most for agents:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Heat (stock and board level)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raw heat&lt;/strong&gt;: how often a stock or concept was mentioned in a time window (1h to 7d).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weighted heat&lt;/strong&gt;: mentions weighted by the historical score of the source. A mention from a high-scoring source counts more than one from a noisy account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acceleration&lt;/strong&gt;: change in heat versus the previous window, i.e. "what is suddenly getting hotter".&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Concept rotation
&lt;/h3&gt;

&lt;p&gt;A-share narratives move through &lt;strong&gt;concept boards&lt;/strong&gt; (AI computing, solid-state batteries, low-altitude economy, etc.). Lava tracks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which concepts are hottest market-wide right now;&lt;/li&gt;
&lt;li&gt;which stocks drive the heat inside a concept;&lt;/li&gt;
&lt;li&gt;which concepts a given stock is currently most associated with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comparing those across windows gives you a rotation view: attention leaving one board and arriving at another.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. First-mention
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;first-mention&lt;/strong&gt; is a stock that had zero mentions in the previous 7 days and just got its first one. It is a novelty signal: useful for "what entered the conversation today" digests, and a natural input for research triage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool surface
&lt;/h2&gt;

&lt;p&gt;The MCP server and the REST API share one schema. Tool names below match the OpenAPI &lt;code&gt;operationId&lt;/code&gt;s, so an agent can resolve them deterministically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Market-wide lists
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool (&lt;code&gt;operationId&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Key params&lt;/th&gt;
&lt;th&gt;Returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listHotStocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /hot/stocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;window&lt;/code&gt;, &lt;code&gt;market&lt;/code&gt;, &lt;code&gt;min_score&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Most-mentioned stocks in window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listHotConcepts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /hot/concepts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;window&lt;/code&gt;, &lt;code&gt;min_score&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Hottest concept boards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listWeightedHotStocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /hot/weighted&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;as_of_date&lt;/code&gt;, &lt;code&gt;days&lt;/code&gt;, &lt;code&gt;min_score&lt;/code&gt;, &lt;code&gt;order&lt;/code&gt;, &lt;code&gt;market&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Heat weighted by source score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listAcceleratingHotStocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /hot/accelerating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;window&lt;/code&gt;, &lt;code&gt;order&lt;/code&gt;, &lt;code&gt;min_mentions&lt;/code&gt;, &lt;code&gt;market&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Momentum-sorted heat changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listFirstMentions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /hot/first-mentions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;hours&lt;/code&gt;, &lt;code&gt;min_score&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Stocks first mentioned after 7 quiet days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Single stock / single concept
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Key params&lt;/th&gt;
&lt;th&gt;Returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getStockHeatWindows&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /heat/windows&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;stock_name&lt;/code&gt; or &lt;code&gt;ts_code&lt;/code&gt;, &lt;code&gt;min_score&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Heat for 1h…7d windows + hourly last 24h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listOpinionsByStock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /opinions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ts_code&lt;/code&gt;, &lt;code&gt;days&lt;/code&gt;, &lt;code&gt;start_date&lt;/code&gt;, &lt;code&gt;end_date&lt;/code&gt;, &lt;code&gt;only_this_stock&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Mention records (structured, no text)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listConceptStocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /concepts/stocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;concept&lt;/code&gt;, &lt;code&gt;days&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Top-mentioned stocks inside a concept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listStockConcepts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /concepts/by-stock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ts_code&lt;/code&gt;, &lt;code&gt;days&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Hottest concepts linked to a stock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getStockAgencyCoverage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /coverage/stocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ts_code&lt;/code&gt;, &lt;code&gt;days&lt;/code&gt;, &lt;code&gt;min_score&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Source-coverage time series&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listNewsStockHits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /news/hits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ts_code&lt;/code&gt;, &lt;code&gt;hours&lt;/code&gt;, &lt;code&gt;src&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Stocks named in mainstream news&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  History and source quality
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Key params&lt;/th&gt;
&lt;th&gt;Returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getDailyHeatPanel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /panel/daily&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;type&lt;/code&gt;, &lt;code&gt;codes&lt;/code&gt;, &lt;code&gt;names&lt;/code&gt;, &lt;code&gt;from&lt;/code&gt;, &lt;code&gt;to&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Daily panel (mentions, source count, weighted heat) for backtests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listAgencyRanking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /agencies/ranking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;order&lt;/code&gt;, &lt;code&gt;min_score&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;, &lt;code&gt;offset&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Current source scores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listAgencyPit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /agencies/pit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;as_of_date&lt;/code&gt;, &lt;code&gt;agency_id&lt;/code&gt;, &lt;code&gt;min_score&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Point-in-time source scores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getAgencyHistory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /agencies/{agency_id}/history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;start_date&lt;/code&gt;, &lt;code&gt;end_date&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Score history of one source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;searchOpinions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /opinions/search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;keyword&lt;/code&gt;, &lt;code&gt;since&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Keyword search over mention records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getAccount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /account&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Balance and usage (free call)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;ts_code&lt;/code&gt; uses the Tushare-style format, e.g. &lt;code&gt;300750.SZ&lt;/code&gt;, &lt;code&gt;688256.SH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Point-in-time (PIT) scores matter if you backtest: &lt;code&gt;listAgencyPit&lt;/code&gt; gives source scores &lt;strong&gt;as they were&lt;/strong&gt; on &lt;code&gt;as_of_date&lt;/code&gt;, so weighted heat in your backtest does not leak future information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five-minute setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: get a key
&lt;/h3&gt;

&lt;p&gt;Sign up, copy your API key (format &lt;code&gt;lvk_…&lt;/code&gt;), and note the MCP endpoint URL from the docs. Keys go in a header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer lvk_xxxxxxxx
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never commit the key; read it from an environment variable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: register the MCP server
&lt;/h3&gt;

&lt;p&gt;Most MCP clients (Claude Desktop, Cursor, Cline, custom agents) accept a remote HTTP server entry like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lava"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;LAVA_MCP_URL&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ${LAVA_API_KEY}"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the client; it should list the tools above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: sanity check
&lt;/h3&gt;

&lt;p&gt;Call &lt;code&gt;getAccount&lt;/code&gt; first. It costs nothing and confirms auth. Then try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;listHotConcepts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;24h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: REST fallback
&lt;/h3&gt;

&lt;p&gt;If your agent framework does not speak MCP, the same data is plain HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LAVA_BASE&lt;/span&gt;&lt;span class="s2"&gt;/hot/first-mentions?hours=24&amp;amp;min_score=60&amp;amp;limit=20"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$LAVA_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LAVA_BASE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;LAVA_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lava&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;concepts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lava&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/hot/concepts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;24h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Three agent patterns that work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pattern A: morning attention digest
&lt;/h3&gt;

&lt;p&gt;Goal: a short brief of "what the market is discussing", generated before the open.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;listHotConcepts(window="24h", limit=10)&lt;/code&gt; → top boards.&lt;/li&gt;
&lt;li&gt;For the top 3 boards: &lt;code&gt;listConceptStocks(concept=..., days=1, limit=5)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;listFirstMentions(hours=24, min_score=60, limit=10)&lt;/code&gt; → new names.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;listAcceleratingHotStocks(window="24h", min_mentions=3, limit=10)&lt;/code&gt; → movers in attention.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Prompt the model to describe &lt;em&gt;attention&lt;/em&gt; only: "rank by heat, note rotation versus yesterday, list first-mentions". Instruct it explicitly not to produce buy/sell language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern B: concept rotation tracker
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;listHotConcepts&lt;/code&gt; at &lt;code&gt;window="24h"&lt;/code&gt; and &lt;code&gt;window="7d"&lt;/code&gt; and diff the ranks. A concept high on 24h but low on 7d is newly rotating in; the reverse is cooling off. Store daily snapshots, or skip the bookkeeping and pull &lt;code&gt;getDailyHeatPanel(type="concept", names=...)&lt;/code&gt; for history.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern C: single-stock context for a research agent
&lt;/h3&gt;

&lt;p&gt;When a user asks about a ticker, have the agent fetch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;getStockHeatWindows(ts_code=...)&lt;/code&gt; for the 1h–7d curve;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;listStockConcepts(ts_code=..., days=7)&lt;/code&gt; for which narratives it is riding;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getStockAgencyCoverage(ts_code=..., days=30, min_score=60)&lt;/code&gt; to see if coverage breadth is growing or shrinking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives the model grounded context ("heat is concentrated in the last 6 hours, mainly via the AI computing board, with coverage from more high-score sources than last week") instead of hallucinated sentiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;min_score&lt;/code&gt;&lt;/strong&gt; on most calls. Filtering to higher-scored sources removes a lot of noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer &lt;code&gt;ts_code&lt;/code&gt; over names&lt;/strong&gt; to avoid ambiguity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache market-wide lists&lt;/strong&gt; for a few minutes; agents tend to call them repeatedly in one session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing is per call&lt;/strong&gt; (roughly 1,000 calls for 5 RMB), so cap &lt;code&gt;limit&lt;/code&gt; and avoid loops that fan out over every stock in a board.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance by design&lt;/strong&gt;: no raw text and anonymized sources make it easier to show outputs to end users without redistribution issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example: what a board heat page looks like
&lt;/h2&gt;

&lt;p&gt;If you want to see the data before writing code, the AI board heat monitor (&lt;a href="https://lava.ai-dolphin.com/monitor/board-ai-heat" rel="noopener noreferrer"&gt;https://lava.ai-dolphin.com/monitor/board-ai-heat&lt;/a&gt;) shows a concept heat series built from these same endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;An agent with Lava attached can answer "what is the A-share market paying attention to, and how is that changing?" with structured numbers instead of guesses. Setup is one header and one server entry; the useful part is combining heat, concept rotation, and first-mention into workflows.&lt;/p&gt;

&lt;p&gt;Research notes, methodology, and worked examples are here: &lt;strong&gt;&lt;a href="https://lava.ai-dolphin.com/research" rel="noopener noreferrer"&gt;https://lava.ai-dolphin.com/research&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>mcp</category>
      <category>ai</category>
      <category>api</category>
    </item>
  </channel>
</rss>
