<?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: Soumit S Rah</title>
    <description>The latest articles on DEV Community by Soumit S Rah (@cocopuff).</description>
    <link>https://dev.to/cocopuff</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%2F2666928%2F7876c0ed-16c2-4f2f-a5d4-bbd8c121936a.jpg</url>
      <title>DEV Community: Soumit S Rah</title>
      <link>https://dev.to/cocopuff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cocopuff"/>
    <language>en</language>
    <item>
      <title>Your RAG Knows Today: Building News-Aware RAG with the Beans API</title>
      <dc:creator>Soumit S Rah</dc:creator>
      <pubDate>Tue, 20 Oct 2026 12:34:27 +0000</pubDate>
      <link>https://dev.to/cocopuff/your-rag-knows-today-building-news-aware-rag-with-the-beans-api-lkk</link>
      <guid>https://dev.to/cocopuff/your-rag-knows-today-building-news-aware-rag-with-the-beans-api-lkk</guid>
      <description>&lt;p&gt;Your users ask what happened today. Your RAG hands them last month's answer with immaculate citations. Congratulations: you built a very articulate time machine.&lt;/p&gt;

&lt;p&gt;A company issues a recall this morning, posts a statement at lunch, and draws new coverage by evening. Your assistant should be able to find those documents when the question arrives. The model is good at writing the answer; it needs current material to write the right one.&lt;/p&gt;

&lt;p&gt;Retrieval-augmented generation fixes the evidence problem by retrieving relevant material at request time and placing it in the model's context. For current public information, that material cannot be one frozen document collection assembled during a heroic Tuesday six months ago. It needs news, press releases, official statements, reports, legal records, research, and the coverage that appeared after the original announcement.&lt;/p&gt;

&lt;p&gt;That is where the &lt;a href="https://developer.cafecito.tech/products/beans" rel="noopener noreferrer"&gt;Beans API&lt;/a&gt; and &lt;a href="https://developer.cafecito.tech/guides/mcp-ai-agents" rel="noopener noreferrer"&gt;Beans MCP&lt;/a&gt; fit: they provide the current publisher-material retrieval layer for a news-aware RAG system.&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG gets more useful when time is allowed to pass
&lt;/h2&gt;

&lt;p&gt;Traditional RAG examples are pleasantly stationary. Upload a handbook, split it into chunks, create embeddings, retrieve five passages, and ask the model which form Gerald in accounting should file.&lt;/p&gt;

&lt;p&gt;Recent events are less considerate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Articles arrive after your last indexing job.&lt;/li&gt;
&lt;li&gt;A press release presents one version of events; independent reporting presents several others.&lt;/li&gt;
&lt;li&gt;A developing Story can contain coverage from multiple publishers across hours or days.&lt;/li&gt;
&lt;li&gt;The newest Article is not necessarily the Article attracting the most attention.&lt;/li&gt;
&lt;li&gt;A body may be unavailable even when the title, summary, source, URL, labels, and publication time are useful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this kind of application, retrieval is not merely “find a similar paragraph.” It is “find the relevant material, establish when it was published, distinguish the document type, inspect related coverage, and preserve the original URLs.” Tiny difference. Only most of the system.&lt;/p&gt;

&lt;p&gt;Beans exposes publisher Articles, Sources, Stories, and external mention observations through one API. Article search supports a natural-language relevance query plus filters for content type, source, domain, author, category, region, entity, sentiment, tags, language, and publication dates. Results include stable IDs that can be used for selective detail and follow-up calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The evidence your application may actually need
&lt;/h2&gt;

&lt;p&gt;Beans currently supports 14 request-filterable content types. The useful point is not the number; numbers look excellent in launch decks and are less helpful during an incident. The useful point is that your retriever can ask for the kind of evidence the question requires.&lt;/p&gt;

&lt;p&gt;Concrete inputs include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;news&lt;/code&gt; and &lt;code&gt;blog&lt;/code&gt; for publisher reporting and commentary;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;press_release&lt;/code&gt; and &lt;code&gt;official_statement&lt;/code&gt; for first-party corporate or institutional claims;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;earnings_report&lt;/code&gt; and &lt;code&gt;financial_report&lt;/code&gt; for company-performance updates;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lawsuit&lt;/code&gt;, &lt;code&gt;enforcement_action&lt;/code&gt;, and &lt;code&gt;contract&lt;/code&gt; for legal and regulatory monitoring;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;research_paper&lt;/code&gt;, &lt;code&gt;technical_documentation&lt;/code&gt;, and &lt;code&gt;whitepaper&lt;/code&gt; for research and engineering context;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;podcast&lt;/code&gt; and &lt;code&gt;site&lt;/code&gt; for additional publication discovery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beans uses a changing catalog of public-information sources, so coverage and timing vary. That is worth saying plainly. “Everything on the internet, instantly” is not a product requirement; it is a cry for help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where recent-event RAG earns its keep
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Incident and crisis assistants
&lt;/h3&gt;

&lt;p&gt;Suppose a user asks, “What is known about the outage, and has the vendor responded?” The concrete material to look for might be a vendor newsroom statement, an engineering blog update, and reporting that checks the vendor's account.&lt;/p&gt;

&lt;p&gt;A useful retrieval plan can combine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;recent &lt;code&gt;news&lt;/code&gt; coverage for independent reporting;&lt;/li&gt;
&lt;li&gt;an &lt;code&gt;official_statement&lt;/code&gt; or &lt;code&gt;press_release&lt;/code&gt; for the vendor's position;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;technical_documentation&lt;/code&gt; for any changed operational guidance;&lt;/li&gt;
&lt;li&gt;related Articles and Story membership to see whether multiple publishers are covering the same event;&lt;/li&gt;
&lt;li&gt;mention observations to identify available external discussion around a selected Article URL.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The generated answer can then separate publisher reporting from the vendor's own statement and link to both. This is more useful than asking the model to remember an outage that began 14 minutes ago. It was busy being a matrix multiplication at the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Competitive and product intelligence
&lt;/h3&gt;

&lt;p&gt;A product team may ask, “What did our competitor launch, how are publishers describing it, and is anyone paying attention?”&lt;/p&gt;

&lt;p&gt;Retrieve &lt;code&gt;press_release&lt;/code&gt;, &lt;code&gt;official_statement&lt;/code&gt;, &lt;code&gt;blog&lt;/code&gt;, and &lt;code&gt;news&lt;/code&gt; Articles around the company and product. Use related-Article calls for adjacent reading, Story Articles for same-event coverage, and trending results or available trend observations for attention context.&lt;/p&gt;

&lt;p&gt;This gives the model first-party claims, outside coverage, and the shape of the conversation. It also reduces the chance that your competitive brief is simply a press release wearing a fake mustache.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Earnings and company-monitoring copilots
&lt;/h3&gt;

&lt;p&gt;For questions such as “What changed this quarter, and how was it reported?”, look for an investor-relations earnings release and a quarterly financial filing, then retrieve relevant press releases, official statements, and news coverage from the available Beans records. Start with &lt;code&gt;earnings_report&lt;/code&gt; and &lt;code&gt;financial_report&lt;/code&gt; to keep those documents distinct from the reporting about them.&lt;/p&gt;

&lt;p&gt;The first-party documents supply the company's published account. Publisher Articles add interpretation and context. Date filters keep the retrieval window tied to the reporting period instead of inviting a beloved result from 2023 to wander into the prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Legal and regulatory watch
&lt;/h3&gt;

&lt;p&gt;Compliance, policy, and risk tools often need to track a company, industry, or jurisdiction across &lt;code&gt;enforcement_action&lt;/code&gt;, &lt;code&gt;lawsuit&lt;/code&gt;, &lt;code&gt;contract&lt;/code&gt;, &lt;code&gt;official_statement&lt;/code&gt;, and &lt;code&gt;news&lt;/code&gt; material. Think of an agency enforcement notice, a court complaint, the company's response, and subsequent reporting as separate pieces of the answer; search for whichever are available.&lt;/p&gt;

&lt;p&gt;Beans entity, region, category, Source, and date filters make that retrieval explicit. Your application can preserve each Article's type and URL, then instruct the model to describe what each source says rather than blending allegations, enforcement notices, and corporate responses into one legally adventurous paragraph.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Research and engineering radar
&lt;/h3&gt;

&lt;p&gt;Developer tools can monitor &lt;code&gt;research_paper&lt;/code&gt;, &lt;code&gt;technical_documentation&lt;/code&gt;, &lt;code&gt;whitepaper&lt;/code&gt;, &lt;code&gt;blog&lt;/code&gt;, and &lt;code&gt;news&lt;/code&gt; material for a technology or organization.&lt;/p&gt;

&lt;p&gt;That supports questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What new research appeared this week?&lt;/li&gt;
&lt;li&gt;Did the project publish technical guidance after the announcement?&lt;/li&gt;
&lt;li&gt;Which publisher Articles discuss the paper rather than merely repeat its title with impressive confidence?&lt;/li&gt;
&lt;li&gt;Is this one Article, several related Articles, or a broader Story?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model still needs to evaluate evidence and communicate uncertainty. Beans supplies retrievable material and structured context; it does not turn a whitepaper into peer review by the healing power of JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical REST retrieval flow
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://developer.cafecito.tech/products/beans/scenarios" rel="noopener noreferrer"&gt;Beans route guide&lt;/a&gt; recommends small, intentional calls. For RAG, a sensible flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search a compact candidate set with &lt;code&gt;GET /beans/articles/search&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Filter by document type, date, entity, region, Source, or other known constraints.&lt;/li&gt;
&lt;li&gt;Select candidates across document types so one busy news cycle does not crowd out the original statement.&lt;/li&gt;
&lt;li&gt;Request &lt;code&gt;GET /beans/articles/{id}?full_content=true&lt;/code&gt; only for the Articles chosen for context.&lt;/li&gt;
&lt;li&gt;Follow Story, similar-Article, Source, or mention links only when the question needs them.&lt;/li&gt;
&lt;li&gt;Build the model context with titles, publication times, content types, summaries or available bodies, and canonical URLs.&lt;/li&gt;
&lt;li&gt;Require the answer to cite those URLs and distinguish first-party material from publisher reporting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is a small server-side JavaScript example. It searches the past seven UTC days across several evidence types because &lt;code&gt;content_type&lt;/code&gt; accepts one value per request. Each Article's &lt;code&gt;published_at&lt;/code&gt; tells you when its publisher says it was published; each collection's &lt;code&gt;meta.as_of&lt;/code&gt; tells you when Beans produced that response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.cafecito.tech&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CAFECITO_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;beansGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Beans returned HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;retrieveRecentContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contentTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;news&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;press_release&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;official_statement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;contentTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nf"&gt;beansGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/beans/articles/search&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstByType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;selected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;firstByType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;details&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nf"&gt;beansGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/beans/articles/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;full_content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;asOf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEntries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;contentTypes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;as_of&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;publishedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;published_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;storyId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;story_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first pass reserves a place for each content type that returns a match, then fills the remaining slots. A press release does not disappear merely because eight news Articles arrived first. Adjust the seven-day window to fit the question.&lt;/p&gt;

&lt;p&gt;Beans collection responses include &lt;code&gt;data&lt;/code&gt;, &lt;code&gt;pagination&lt;/code&gt;, and &lt;code&gt;meta&lt;/code&gt;. Continue pagination only by returning &lt;code&gt;pagination.next_cursor&lt;/code&gt; unchanged on the same route with the same filters. Do not decode it. There is no hidden treasure inside, only a future support ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stories are useful when one event becomes 27 headlines
&lt;/h2&gt;

&lt;p&gt;Article similarity and Story membership answer different questions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /beans/articles/{id}/similar&lt;/code&gt; returns related publisher reading.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /beans/stories&lt;/code&gt; finds related-coverage groups.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /beans/stories/{id}&lt;/code&gt; returns Story detail.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /beans/stories/{id}/articles&lt;/code&gt; returns the Articles assigned to that Story.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For RAG, Story retrieval is useful when the answer should reflect how an event was covered across publishers rather than treating every headline as a separate event. It also gives your application a cleaner unit for deduplication and follow-up research.&lt;/p&gt;

&lt;p&gt;Do not assume that every similar Article belongs to the same Story. Related is not identical. Software occasionally requires nouns to retain their meanings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Or let the agent use Beans through MCP
&lt;/h2&gt;

&lt;p&gt;If your application already has an MCP-capable agent, connect it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.cafecito.tech/beans/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server uses the same Bearer API key as REST. Beans MCP exposes tools such as &lt;code&gt;searchArticles&lt;/code&gt;, &lt;code&gt;getLatestArticles&lt;/code&gt;, &lt;code&gt;getTrendingArticles&lt;/code&gt;, &lt;code&gt;getArticle&lt;/code&gt;, &lt;code&gt;getSimilarArticles&lt;/code&gt;, &lt;code&gt;getArticleMentions&lt;/code&gt;, &lt;code&gt;listStories&lt;/code&gt;, &lt;code&gt;getStory&lt;/code&gt;, &lt;code&gt;listStoryArticles&lt;/code&gt;, and Source or taxonomy discovery tools.&lt;/p&gt;

&lt;p&gt;The tool sequence is the same deliberate retrieval flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;searchArticles&lt;/code&gt; or another collection tool finds candidates.&lt;/li&gt;
&lt;li&gt;The agent reads real UUIDs from &lt;code&gt;data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getArticle&lt;/code&gt; retrieves only selected detail.&lt;/li&gt;
&lt;li&gt;Story, similar, mention, or Source tools add context only when needed.&lt;/li&gt;
&lt;li&gt;The agent cites the returned Article URLs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MCP removes some integration plumbing. It does not remove the need for tool policy, call limits, source attribution, or a stern instruction against inventing UUIDs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production details that prevent exciting weekends
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep the API key on the server or in the agent client's secret store.&lt;/li&gt;
&lt;li&gt;Treat empty &lt;code&gt;data: []&lt;/code&gt; as a successful retrieval with no matches.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;score_threshold&lt;/code&gt; only when &lt;code&gt;q&lt;/code&gt; is present.&lt;/li&gt;
&lt;li&gt;Preserve Article, Source, and Story UUIDs exactly.&lt;/li&gt;
&lt;li&gt;Keep &lt;code&gt;latest&lt;/code&gt;, &lt;code&gt;top-headlines&lt;/code&gt;, &lt;code&gt;trending&lt;/code&gt;, and relevance search conceptually separate.&lt;/li&gt;
&lt;li&gt;Request &lt;code&gt;full_content=true&lt;/code&gt; only for selected Articles and handle missing content.&lt;/li&gt;
&lt;li&gt;Retain canonical Article URLs for attribution.&lt;/li&gt;
&lt;li&gt;Treat categories, entities, sentiments, ideology, trend observations, and generated answers as context that may require verification—not fresh tablets from the mountain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, content availability is not a grant to republish, redistribute, archive, train on, or otherwise reuse it. Review the &lt;a href="https://cafecito.tech/docs/third-party-content-policy/" rel="noopener noreferrer"&gt;Third-Party Content Policy&lt;/a&gt; and assess the rights required for your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;The next time someone asks what changed today, retrieve the dated material, compare the first-party account with publisher reporting, and answer with links to the original documents.&lt;/p&gt;

&lt;p&gt;Beans gives developers REST and MCP access to searchable publisher Articles, Sources, Stories, related reading, and external mention observations. You decide what evidence the question requires, retrieve a compact candidate set, enrich only the selected records, and give the model dated, typed, attributable context.&lt;/p&gt;

&lt;p&gt;Start with the &lt;a href="https://developer.cafecito.tech/products/beans" rel="noopener noreferrer"&gt;Beans developer guide&lt;/a&gt;, use the &lt;a href="https://developer.cafecito.tech/products/beans/scenarios" rel="noopener noreferrer"&gt;workflow examples&lt;/a&gt; for call sequencing, or connect an agent through the &lt;a href="https://developer.cafecito.tech/guides/mcp-ai-agents" rel="noopener noreferrer"&gt;Beans MCP guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Your model can keep doing the prose. Give it Beans for the part where today actually happened.&lt;/p&gt;

</description>
      <category>rag</category>
      <category>mcp</category>
      <category>news</category>
      <category>ai</category>
    </item>
    <item>
      <title>Launching Espresso API &amp; MCP — Curated Business Intelligence for AI Agents &amp; Dashboards</title>
      <dc:creator>Soumit S Rah</dc:creator>
      <pubDate>Tue, 30 Jun 2026 12:01:00 +0000</pubDate>
      <link>https://dev.to/cocopuff/launching-espresso-api-mcp-curated-business-intelligence-for-ai-agents-dashboards-1925</link>
      <guid>https://dev.to/cocopuff/launching-espresso-api-mcp-curated-business-intelligence-for-ai-agents-dashboards-1925</guid>
      <description>&lt;p&gt;It is my pleasure to introduce &lt;a href="https://medium.com/r/?url=https%3A%2F%2Fcafecito.tech" rel="noopener noreferrer"&gt;Project Cafecito&lt;/a&gt;’s next product — &lt;a href="https://developer.cafecito.tech/howtos/espresso-howto" rel="noopener noreferrer"&gt;Espresso API &amp;amp; MCP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The API is part of the larger Espresso product suite, which also includes Espresso Publications: &lt;a href="https://developer.cafecito.tech/howtos/espresso-howto" rel="noopener noreferrer"&gt;Editorials&lt;/a&gt;, &lt;a href="https://x.com/espressovibz" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://www.threads.com/@espresso.sips" rel="noopener noreferrer"&gt;Threads&lt;/a&gt; — our curated digests and deeper human-readable analysis built on the same high-signal intelligence layer. Think of it as concentrated shots of structured intelligence: event digests, synthesized signals, tags, and relationships — served fresh for dashboards, monitoring workflows, and AI agents.&lt;/p&gt;

&lt;p&gt;Like everything we ship these days, it comes with a full &lt;strong&gt;MCP&lt;/strong&gt; server so your agents can sip directly without burning tokens on JSON parsing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Events and Signals Are Produced
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt; are generated from a wide range of public data sources — product price changes, stock market movements, SEC filings, earnings reports, product announcements, corporate partnerships, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt; are the abstraction layer on top. They combine multiple similar events across an extended timeline to identify event chains, causal relationships, and commonality between various entities.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Espresso actually gives you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Clean market event and signal records with timestamps, and domain-specific fields like actions, events, impact_level, marco_context, cross_domain_impacts etc.&lt;/li&gt;
&lt;li&gt;Semantic search with adjustable accuracy.&lt;/li&gt;
&lt;li&gt;Tag filtering.&lt;/li&gt;
&lt;li&gt;Cross event relationships.&lt;/li&gt;
&lt;li&gt;Token-optimized MCP-friendly response.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Start + Python Examples
&lt;/h2&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;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&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;CAFECITO_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.cafecito.tech&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&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;API_KEY&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Semantic search for signals (plain text for MCP/agents)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&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_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/espresso/signals&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;headers&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="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&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;market volatility and interest rate impact&lt;/span&gt;&lt;span class="sh"&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;acc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_type&lt;/span&gt;&lt;span class="sh"&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;text&lt;/span&gt;&lt;span class="sh"&gt;"&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;30&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;resp&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Filter signals by tags
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&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_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/espresso/signals&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;headers&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="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;usa&lt;/span&gt;&lt;span class="sh"&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;policy_reform&lt;/span&gt;&lt;span class="sh"&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;from&lt;/span&gt;&lt;span class="sh"&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;2026-05-01&lt;/span&gt;&lt;span class="sh"&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;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&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;30&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;resp&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&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;Combine&lt;/span&gt; &lt;span class="n"&gt;semantic&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;

&lt;span class="n"&gt;resp&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_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/espresso/signals&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;headers&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="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&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;regulatory changes affecting tech&lt;/span&gt;&lt;span class="sh"&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;tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;regulation&lt;/span&gt;&lt;span class="sh"&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;openai&lt;/span&gt;&lt;span class="sh"&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;acc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;resp&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Response Body (Events)
&lt;/h3&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"actions"&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="s2"&gt;"2026-06-28 Firefighters died and injuries occurred at Wyoming-Utah border."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-28 Large wildfire destroyed parts of ski resorts."&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;"briefing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"On June 28, 2026, three U.S. firefighters died while battling rapidly spreading wildfires near the Colorado-Utah border; approximately 100 sq km burned. Temperatures reached 34°C with strong winds, prompting mass evacuations. The Snyder Fire merged with others, causing significant damage to infrastructure like ski resorts. Causes include severe drought and human factors. This incident reflects escalating regional wildfire risks driven by climate change."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"companies"&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="s2"&gt;"us_federal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"us_state"&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;"cross_domain_impacts"&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="s2"&gt;"public_safety: Increased risk of civilian casualties."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"tourism: Disruption of winter sports facilities."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"environmental: Habitat loss in mountainous areas."&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;"event_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wildfire_outbreak"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"future_outlook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Continued extreme fire seasons expected without mitigation efforts."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"091726f8-421a-566d-9db8-339625f2ed9e"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"impact_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"macro_context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"western_us_climate_crisis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"regions"&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="s2"&gt;"colorado"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"utah"&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;"reported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-28T22:49:07Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"tags"&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="s2"&gt;"wildfire"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"climate_change"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"emergency_response"&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="nl"&gt;"actions"&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="s2"&gt;"2026-06-28 Governments of United States and Iran agree to cease fire"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-30 Bilateral talks scheduled in Oruz"&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;"briefing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"On June 28, 2026, U.S.-Iran governments reached an emergency agreement halting military clashes amid regional tensions. The pause prevents broader war while resuming negotiations by June 30 focused on Ormuz Strait security. This diplomatic step averts immediate market shocks but depends on both sides lowering aggressive rhetoric for tangible outcomes."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"cross_domain_impacts"&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="s2"&gt;"energy_markets: Reduced oil volatility expected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"security_framework: Gulf stability improved temporarily"&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;"event_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"diplomatic_ceasefire"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"future_outlook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Talks may stabilize but risk re-escalation without sustained engagement."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6b4562d2-0a5c-540f-a39e-f1d5cad4ee5f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"impact_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"macro_context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"middle_east_conflict_resolution"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"products"&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="s2"&gt;"petróleo"&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;"regions"&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="s2"&gt;"gulf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"ormuz"&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;"reported"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-28T21:52:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"tags"&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="s2"&gt;"diplomacy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"gulf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"iran"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"fuel"&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;Full documentation is available in the &lt;a href="https://developer.cafecito.tech/introduction" rel="noopener noreferrer"&gt;Developer Portal&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;p&gt;If you’re building AI agents, executive dashboards, automated briefings, or RAG pipelines that need real business/market/policy context — Espresso is the noise-free high-signal layer you’ve been missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;p&gt;v0.1 is live and open. It’s early — we’re still pruning bugs and adding more signals — but it’s already useful enough that I’m using it internally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.cafecito.tech/api/espresso" rel="noopener noreferrer"&gt;Try Espresso here&lt;/a&gt; | &lt;a href="https://developer.cafecito.tech/settings/api-keys" rel="noopener noreferrer"&gt;Get your API key &amp;amp; full docs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So… what now?
&lt;/h2&gt;

&lt;p&gt;Fire it up and start sipping. It's free for a while dude!&lt;/p&gt;

&lt;p&gt;Drop a comment below and tell me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What signals or use cases would make this 10x more useful?&lt;/li&gt;
&lt;li&gt;Any brutal feedback?&lt;/li&gt;
&lt;li&gt;Or just share what you’re building.
I read every single reply (yes, even the mean ones).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy building. May your signals stay strong and your agents well-informed. ☕&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: This is part of the growing Cafecito stack (Beans + Espresso + more brewing). If you liked the no-BS vibe from the Beans launch, you’ll enjoy what’s coming next.&lt;/p&gt;

&lt;p&gt;See you in the comments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Espresso vs Beans — When to Use Which
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.cafecito.tech/settings/api-keys" rel="noopener noreferrer"&gt;Beans API&lt;/a&gt; is your bare metal news and blogs API. You query it when you want raw content being published by different publishers, authors, and news sites. Great for RAG, full article retrieval, or when you need the original source material. Oh by the way, we just added a new route for tracking content propagation across publishers and mentions on social media. It’s good 💩, check it out.&lt;/p&gt;

&lt;p&gt;Espresso API is the structured, curated market intelligence layer. It takes multiple information sources, cross-correlates them, and gives you the data that actually matters for business decision-making — without all the pointless crying, whining, bitching, and moaning noise.&lt;br&gt;
In short:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beans = the full firehose.&lt;/li&gt;
&lt;li&gt;Espresso = the refined shot you actually drink.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://cafecito.tech/" rel="noopener noreferrer"&gt;Cafecito&lt;/a&gt; | &lt;a href="https://espresso.cafecito.tech/" rel="noopener noreferrer"&gt;Espresso&lt;/a&gt; | &lt;a href="https://x.com/espressovibz" rel="noopener noreferrer"&gt;X&lt;/a&gt; | &lt;a href="https://www.threads.com/@espresso.sips" rel="noopener noreferrer"&gt;Threads&lt;/a&gt; | &lt;a href="https://github.com/soumitsalman/go-espresso-api" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
Creators: &lt;a href="https://www.linkedin.com/in/soumitsrahman/" rel="noopener noreferrer"&gt;Soumit Salman Rahman&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/dvidaud/" rel="noopener noreferrer"&gt;Daniel Oliver Vidaud&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>api</category>
      <category>mcp</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built Beans — A Semantic News &amp; Blogs API &amp; MCP for AI Agents and RAG</title>
      <dc:creator>Soumit S Rah</dc:creator>
      <pubDate>Mon, 16 Mar 2026 17:41:43 +0000</pubDate>
      <link>https://dev.to/cocopuff/i-built-beans-a-semantic-news-blogs-api-mcp-for-ai-agents-and-rag-1c6c</link>
      <guid>https://dev.to/cocopuff/i-built-beans-a-semantic-news-blogs-api-mcp-for-ai-agents-and-rag-1c6c</guid>
      <description>&lt;p&gt;☕ After a whole lot of brewing, we are excited to finally launch &lt;a href="https://developer.cafecito.tech/howtos/beans-howto" rel="noopener noreferrer"&gt;Beans&lt;/a&gt; API &amp;amp; MCP from &lt;a href="https://cafecito.tech" rel="noopener noreferrer"&gt;Project Cafecito&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;News APIs are over-priced. Most of them lack vector search capability. Almost all of them lack new propagation timeline and related news finding.  &lt;a href="https://cafecito.tech/beans" rel="noopener noreferrer"&gt;Beans&lt;/a&gt; is different. We built it to &lt;strong&gt;beat market price&lt;/strong&gt; and designed it for developers working on &lt;strong&gt;AI agents&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Beans?
&lt;/h2&gt;

&lt;p&gt;It's an aggregation + search service that pulls fresh content from 7,000+ (We are adding new sources every week) news and blog publishers every day. No crawling, no maintenance — just clean, structured data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Natural language semantic search — Ask in plain text using vector-powered queries (with tunable accuracy)&lt;/li&gt;
&lt;li&gt;Intelligent filtering — By category, named entities, geography, content type, source, time range, and more&lt;/li&gt;
&lt;li&gt;Trend scoring — Surface what's actually gaining traction based on real social shares, likes and comments&lt;/li&gt;
&lt;li&gt;Built-in AI enrichment — Automatic extraction of entities, sentiment, topics, and regions&lt;/li&gt;
&lt;li&gt;Story propagation mapping — Automatically connect related articles across publishers to track how narratives spread&lt;/li&gt;
&lt;li&gt;Clean, consistent JSON output perfect for pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're building AI agents, RAG systems, market intelligence tools, automation workflows, or smart dashboards — Beans gives you high-quality, enriched news data without the usual headaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Status
&lt;/h2&gt;

&lt;p&gt;Free Tier v0.1 is now live and open for you to play with. It's still early — expect the brew to get stronger with your feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a free &lt;a href="https://developer.cafecito.tech/howtos/beans-howto" rel="noopener noreferrer"&gt;API key&lt;/a&gt;&lt;/strong&gt; and get crackin'.&lt;/p&gt;

&lt;p&gt;We would love to get your feedback, &lt;a href="https://github.com/soumitsalman/cafecito-api-manager/issues/new?template=bug_report.yml" rel="noopener noreferrer"&gt;bug reports&lt;/a&gt;, and &lt;a href="https://github.com/soumitsalman/cafecito-api-manager/issues/new?template=feature_request.yml" rel="noopener noreferrer"&gt;feature requests&lt;/a&gt;. Drop a comment below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What use case would you use this for?&lt;/li&gt;
&lt;li&gt;What features would make it 10x more useful for your workflow?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy building! 🚀&lt;/p&gt;

</description>
      <category>newsapi</category>
      <category>rag</category>
      <category>api</category>
      <category>news</category>
    </item>
  </channel>
</rss>
