Cross-product Workflow
Use Beans when you need what publishers published. Use Espresso when you need what happened, what it may mean, and what supports that claim. One API key authenticates both REST and both MCP servers.
Tool names match the hosted MCP catalogs on MCP and AI agents. Shared transport rules live on API conventions.
When to stay on one product
| User intent | Stay on |
|---|---|
| Article URLs, titles, summaries, available full content, social media engagements, similar articles | Beans only |
| Story across publishers and article clusters | Beans only (listStories → getStory → listStoryArticles) |
| Publisher metadata for Beans filters | Beans listSources / getSource |
| Concrete developments (what happened) | Espresso searchEvents / getEvent |
| Meaning, impact, outlook | Espresso searchSignals / getSignal |
| Supporting records and available URLs for a selected Event | Espresso getEventEvidence |
| Intelligence source provenance | Espresso listIntelligenceSources / getIntelligenceSource |
Beans Story tools do not return Espresso Events. Espresso evidence is not a Beans article search.
Beans → Espresso evidence sequence
Run this when the user starts from publisher coverage and then needs structured confirmation or supporting records.
-
Find publisher coverage (Beans).
UsesearchArticles,getLatestArticles,getTopHeadlines,getTrendingArticles, orlistStories. Optionally narrow with discovery tools (listCategories,listEntities,listRegions,listSentiments). -
Select identifiers (Beans).
Takedata[].idfor Articles or Stories. CallgetArticlefor a selected Article UUID. For a Story, callgetStorythenlistStoryArticlesif member Articles are required. Keep canonical Articleurlvalues for citation. -
Formulate the intelligence question (Espresso).
Copy the topic, entity names, and region names the user (or the selected Articles) actually used. Do not assume a Beans Article UUID is an Espresso Event UUID. -
Search what happened (Espresso).
Key points, events →searchEvents(GET /espresso/events). Discover exact filters withlistIntelligenceEntities,listIntelligenceRegions,listIntelligenceEventTypes, and fuzzy tags withlistIntelligenceTagswhen spelling is unknown. -
Get more details on what happened (Espresso).
CallgetEventorgetSignalfor the chosendata[].id. Walk links withgetEventSignalsorgetSignalEventswhen the question needs both facts and conclusions. -
Understand the broader causal chain, impacts and forecast (Espresso).
CallsearchSignals(GET /espresso/signals). Discover exact filters withlistIntelligenceEntities,listIntelligenceRegions,listIntelligenceEventTypes, and fuzzy tags withlistIntelligenceTagswhen spelling is unknown. -
Inspect evidence tracing (Espresso).
After an Event UUID, callgetEventEvidence(GET /espresso/events/{event_id}/evidence). Use returned identity, creation time, tags, Source IDs, and available URLs. An emptydataarray means no evidence records are available for that Event under the supplied filters—not a Beans miss. -
Cite both layers.
- Publisher reading: Beans Article
url(and Story membership if used). - Structured claim: Espresso Event/Signal IDs plus evidence URLs and
getIntelligenceSourcewhen provenance metadata is required.
- Publisher reading: Beans Article
-
Paginate independently.
Beans and Espresso cursors are not interchangeable. Send each product'spagination.next_cursorunchanged on the same route or tool.
Complete composite client
The following programs are complete, copy-pasteable handoffs: they search publisher coverage in Beans, search concrete developments and interpretations in Espresso, then retrieve evidence for the first selected Event. Set CAFECITO_API_KEY before running. Each product keeps its own returned IDs and pagination envelope.
Node 18+ provides fetch; the Python program requires the requests package. The output keeps publisher Article URLs for citation and Espresso Event/Signal IDs plus evidence records for structured support.
REST equivalents for the handoff
| Step | MCP tool | REST |
|---|---|---|
| Publisher search | searchArticles | GET /beans/articles/search |
| Story cluster | listStories / getStory / listStoryArticles | GET /beans/stories, GET /beans/stories/{id}, GET /beans/stories/{id}/articles |
| Article detail | getArticle | GET /beans/articles/{id} |
| What happened | searchEvents / getEvent | GET /espresso/events, GET /espresso/events/{event_id} |
| Evidence | getEventEvidence | GET /espresso/events/{event_id}/evidence |
| Outlook | searchSignals / getSignal | GET /espresso/signals, GET /espresso/signals/{signal_id} |
Health checks remain REST-only: GET /beans/health and GET /espresso/health without a key.
Agent checklist
- Same Bearer key on
https://api.cafecito.tech/beans/mcpandhttps://api.cafecito.tech/espresso/mcp. - Never pass a Beans Article or Story UUID into Espresso path parameters.
- Never answer “what does this mean?” from Beans Article text alone when Espresso Signals are in scope.
- Never answer “what did this publisher print?” from Espresso Events alone when Beans Articles are in scope.
- Do not invent tools outside the MCP catalog.

