<?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>Forem: Gnana-Shishir-Kumar</title>
    <description>The latest articles on Forem by Gnana-Shishir-Kumar (@gnanashishirkumar).</description>
    <link>https://forem.com/gnanashishirkumar</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3834151%2Ffe00064a-a98a-4a10-9961-c1d8bdededa3.png</url>
      <title>Forem: Gnana-Shishir-Kumar</title>
      <link>https://forem.com/gnanashishirkumar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gnanashishirkumar"/>
    <language>en</language>
    <item>
      <title>EZRide Intel — I Built an AI Assistant for Boston's Hidden Free Bus Using Notion MCP</title>
      <dc:creator>Gnana-Shishir-Kumar</dc:creator>
      <pubDate>Sun, 29 Mar 2026 22:57:36 +0000</pubDate>
      <link>https://forem.com/gnanashishirkumar/ezride-intel-i-built-an-ai-assistant-for-bostons-hidden-free-bus-using-notion-mcp-27af</link>
      <guid>https://forem.com/gnanashishirkumar/ezride-intel-i-built-an-ai-assistant-for-bostons-hidden-free-bus-using-notion-mcp-27af</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/notion-2026-03-04"&gt;Notion MCP Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Most people in Boston and Cambridge have no idea that a completely free public shuttle has been running since 2002 — no fare, no ID, no registration. It connects North Station in Boston all the way to Cambridgeport via Kendall Square and MIT, and it's open to &lt;strong&gt;everyone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's called EZRide. And almost nobody knows it exists.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;EZRide Intel&lt;/strong&gt; — an AI-powered transit assistant that makes this hidden public resource discoverable, with &lt;strong&gt;Notion as the sole database layer&lt;/strong&gt;. No PostgreSQL, no Firebase, no JSON files at runtime. Every read, every write, every analytics query goes through Notion MCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🚌 &lt;strong&gt;AI Transit Assistant&lt;/strong&gt; — answers questions about routes, stops, schedules, and fares using data served live from Notion&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Ridership Analytics Dashboard&lt;/strong&gt; — historical ridership analysis from 2015-2025 with Chart.js visualizations, all data sourced from a Notion Analytics database&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Live Alert Management&lt;/strong&gt; — active stop closures shown in the sidebar, resolvable with one click that updates Notion in real time via &lt;code&gt;pages.update&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🗺️ &lt;strong&gt;Trip Planner&lt;/strong&gt; — saves formatted trip plans directly to Notion as rich pages using &lt;code&gt;blocks.children.append&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Notion Global Search&lt;/strong&gt; — searches across all EZRide databases simultaneously using the Notion &lt;code&gt;search&lt;/code&gt; API&lt;/li&gt;
&lt;li&gt;🕐 &lt;strong&gt;Recent Searches&lt;/strong&gt; — sidebar shows live questions pulled from the Notion Query Log DB, updated after every chat interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Video Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://youtu.be/LBt1OOiA-vg" rel="noopener noreferrer"&gt;https://youtu.be/LBt1OOiA-vg&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Show Me the Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Gnana-Shishir-Kumar/ezride-intel" rel="noopener noreferrer"&gt;https://github.com/Gnana-Shishir-Kumar/ezride-intel&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Notion MCP
&lt;/h2&gt;

&lt;p&gt;Notion MCP is not a side integration in this project — &lt;strong&gt;it is the entire data layer&lt;/strong&gt;. Here's the full architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Charles River TMA data (charlesrivertma.org)
        ↓
   ingest.py (one-time seed script)
        ↓
  Notion Workspace (5 databases via MCP)
  ├── Routes DB      — 4 service patterns with stops, times, directions
  ├── Stops DB       — 16 stops with neighborhoods and service notes  
  ├── Alerts DB      — active stop closures, resolvable via pages.update
  ├── Query Log DB   — every user question + AI answer + timestamp
  └── Analytics DB   — ridership data 2015-2025 (11 years)
        ↕
   agent.py — reads all 5 DBs → Gemini generates answer → logs back to Notion
        ↓
   Flask web app (localhost:5000)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Notion MCP tools used:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;databases.query&lt;/code&gt;&lt;/strong&gt; — the core of the RAG pipeline. Every user question triggers live queries to Routes, Stops, Alerts, and Analytics databases. The results become Gemini's context window — so the AI's knowledge comes entirely from Notion at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;pages.create&lt;/code&gt;&lt;/strong&gt; — used in two ways: the ingest script seeds all 16 stops, 4 routes, 2 alerts, and 11 years of analytics into Notion on setup. Then at runtime, every user question is logged as a new page in the Query Log DB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;pages.update&lt;/code&gt;&lt;/strong&gt; — powers the human-in-the-loop alert resolution. When a transit alert is resolved, clicking "Mark Resolved" in the UI calls &lt;code&gt;pages.update&lt;/code&gt; to change the Status property from Active → Resolved in Notion live. No page refresh needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;blocks.children.append&lt;/code&gt;&lt;/strong&gt; — the Trip Planner creates a full rich Notion page with headings, callout blocks, and bulleted stop lists when a user saves a trip plan. The page appears instantly in their Notion workspace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;search&lt;/code&gt;&lt;/strong&gt; — the global search bar queries across all EZRide databases simultaneously using Notion's search API, returning matching stops, routes, and analytics records.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Notion as the database matters
&lt;/h3&gt;

&lt;p&gt;Most projects use Notion as a UI layer on top of a "real" database. In EZRide Intel, Notion &lt;strong&gt;is&lt;/strong&gt; the database. There is no fallback. If you disconnect the Notion integration, the AI has no context, the dashboard has no data, and the query log has nowhere to write.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Non-technical users can edit stop data, add alerts, or update schedules directly in Notion — no code changes needed&lt;/li&gt;
&lt;li&gt;The Query Log becomes a living analytics dashboard in Notion itself — you can see what people are asking in real time&lt;/li&gt;
&lt;li&gt;Alerts can be managed by a transit operator directly in Notion, and the web app reflects changes instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The civic problem this solves
&lt;/h3&gt;

&lt;p&gt;EZRide averaged 500,000 passengers per year before COVID — yet Cambridge city councillors have said publicly that even bus drivers don't know the routes are open to the public. People get turned away at the door. The awareness gap is real.&lt;/p&gt;

&lt;p&gt;EZRide Intel makes the service discoverable through natural language. Ask it anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"Is EZRide really free?"&lt;/em&gt; → Yes, 100% free, no ID required&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"What stops are near MIT?"&lt;/em&gt; → Main/Vassar and Vassar/Mass Ave for weekdays&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"How did COVID affect ridership?"&lt;/em&gt; → Annual riders dropped from 508,000 in 2019 to 142,000 in 2020 — a 72% decline&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Are there any current stop closures?"&lt;/em&gt; → Broadway/Galileo closed Mon-Fri, use Kendall Square (71 Ames St)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data sources
&lt;/h3&gt;

&lt;p&gt;All route, stop, and schedule data sourced from the &lt;a href="https://charlesrivertma.org" rel="noopener noreferrer"&gt;Charles River TMA official site&lt;/a&gt;. Historical ridership anchor points from official statements: 2012 daily average of 2,500 riders and pre-COVID annual ridership of ~500,000 sourced from &lt;a href="https://mass.streetsblog.org/2025/06/02/ezride-in-cambridge-expands-schedule-with-frequent-service-midday-and-weekend-trips/" rel="noopener noreferrer"&gt;Streetsblog Massachusetts&lt;/a&gt; and Wikipedia. Intermediate years reconstructed as realistic synthetic data following known trends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Python + Flask&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI&lt;/strong&gt;: Google Gemini 2.5 Flash via &lt;code&gt;google-generativeai&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: Notion (via &lt;code&gt;notion-client&lt;/code&gt; Python SDK)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Vanilla HTML/CSS/JavaScript + Chart.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data ingestion&lt;/strong&gt;: Custom Python seed script (&lt;code&gt;ingest.py&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern&lt;/strong&gt;: RAG (Retrieval Augmented Generation) — Notion data as context window&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>ai</category>
      <category>notionchallenge</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
