<?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: Rajnandini Patil</title>
    <description>The latest articles on DEV Community by Rajnandini Patil (@rajnandinipatil30).</description>
    <link>https://dev.to/rajnandinipatil30</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%2F4040703%2F1451fc1e-b0fb-43ec-b842-ef8c92b7f736.jpg</url>
      <title>DEV Community: Rajnandini Patil</title>
      <link>https://dev.to/rajnandinipatil30</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rajnandinipatil30"/>
    <language>en</language>
    <item>
      <title>StudyPulse: Building a Student Study Planner with MCP and Google Cloud</title>
      <dc:creator>Rajnandini Patil</dc:creator>
      <pubDate>Tue, 21 Jul 2026 20:10:09 +0000</pubDate>
      <link>https://dev.to/rajnandinipatil30/studypulse-building-a-student-study-planner-with-mcp-and-google-cloud-2hg8</link>
      <guid>https://dev.to/rajnandinipatil30/studypulse-building-a-student-study-planner-with-mcp-and-google-cloud-2hg8</guid>
      <description>&lt;h1&gt;
  
  
  StudyPulse: Building a Student Study Planner with MCP and Google Cloud
&lt;/h1&gt;

&lt;p&gt;I built a study planner that tracks syllabus completion, sends progress reports through Gmail, and adds exams to Google Calendar without exposing Google tokens to the web app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most study apps track &lt;em&gt;activity&lt;/em&gt; — "you studied for 3 hours." They don't tell you if you're &lt;em&gt;ready&lt;/em&gt; for an exam. A student can spend weeks in an app and still not know if they've actually finished the syllabus.&lt;/p&gt;

&lt;p&gt;I was helping a friend study for a competitive exam. She had apps for notes, for questions, for schedules. None of them answered: "Out of everything I need to know, how much do I actually know right now?"&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: One Number, One List
&lt;/h2&gt;

&lt;p&gt;StudyPulse is a web app that does one thing well: it shows you what fraction of your syllabus is done, and what you should study next. You add subjects, break them into topics, tick them off. The app calculates real progress — accounting for partial work — and lets you mail a report to a parent or mentor from your own Gmail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuk82wb66uuue4xhi4uuz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuk82wb66uuue4xhi4uuz.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcuoe89xh7b4y2fy3stkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcuoe89xh7b4y2fy3stkm.png" alt=" " width="799" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjp97b3z04rgw4qqn3v47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjp97b3z04rgw4qqn3v47.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0th5ctb1x1apkq4scpvq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0th5ctb1x1apkq4scpvq.png" alt=" " width="800" height="764"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture: Why MCP Matters
&lt;/h2&gt;

&lt;p&gt;The main architectural decision was to keep Google OAuth tokens outside the web application. Instead of allowing the web app to communicate directly with Gmail and Google Calendar, all Google-related operations go through a separate MCP server.&lt;/p&gt;

&lt;p&gt;Here's where it gets interesting. The app could call Gmail and Google Calendar directly. Instead, it doesn't. Gmail and Calendar talk to a &lt;strong&gt;Model Context Protocol server&lt;/strong&gt; — a standalone service that owns the Google tokens and exposes tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;StudyPulse Web App
        |
        | HTTPS + shared secret
        v
StudyPulse MCP Server
        |
        | Google OAuth tokens
        v
Gmail API + Google Calendar API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The web app&lt;/strong&gt; → (HTTPS + shared secret) → &lt;strong&gt;MCP server&lt;/strong&gt; → (Google OAuth tokens) → &lt;strong&gt;Gmail + Calendar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why? Three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Token isolation&lt;/strong&gt;: The web app never sees a Google token. No token leaks from a web app vulnerability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable tools&lt;/strong&gt;: The same nine MCP tools work from the web, from a cron job, or from Claude Desktop. One integration, many clients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear separation of concerns&lt;/strong&gt;: Google plumbing is someone else's problem. The web app is just business logic.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How We Set It Up: Google Cloud Console
&lt;/h2&gt;

&lt;p&gt;Google Cloud Console is used to configure Gmail, Google Calendar, OAuth permissions, test users, and application credentials.&lt;/p&gt;

&lt;p&gt;The Google part is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a project&lt;/strong&gt; in Google Cloud Console&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable two APIs&lt;/strong&gt;: Gmail API, Google Calendar API (both free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth consent screen&lt;/strong&gt;: mark it External, add your test users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add four scopes&lt;/strong&gt; to the consent screen: gmail.send, gmail.compose, calendar.events, userinfo.email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create an OAuth client&lt;/strong&gt; (Web application type), add your redirect URI: &lt;code&gt;http://localhost:3000/api/google/oauth/callback&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The app handles the OAuth flow from there. Students sign in with a magic link to StudyPulse, then click "Connect Google" in Settings. They consent once — refresh tokens let them stay connected.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web&lt;/strong&gt;: Next.js 15, React 19, Supabase (auth + database)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Server&lt;/strong&gt;: Node.js + @modelcontextprotocol/sdk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APIs&lt;/strong&gt;: Gmail, Google Calendar, Google OAuth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: Vercel (web), any Node host (MCP server)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL with row-level security
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calendar_create_event&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;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Create a student exam event&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&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;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;clientForUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;args&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;h2&gt;
  
  
  What Surprised Us
&lt;/h2&gt;

&lt;p&gt;The project taught us that integration complexity is often less about writing API calls and more about handling authentication, security, and data ownership correctly.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OAuth testing is clunky&lt;/strong&gt;: Manually connecting/reconnecting Google accounts for each test. In production, testing mode refresh tokens expire every 7 days, so students have to reconnect weekly. That's by design for security, but it's a friction point.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP was the right call&lt;/strong&gt;: Isolating tokens forced us to think clearly about the API boundary. The resulting tool set (&lt;code&gt;study_progress_snapshot&lt;/code&gt;, &lt;code&gt;gmail_send_report&lt;/code&gt;, &lt;code&gt;calendar_create_event&lt;/code&gt;) works outside the web app too — Claude Desktop clients can use the same server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Row-level security matters&lt;/strong&gt;: Supabase RLS meant that even if someone leaked the anon key, they could only see their own data. That confidence let us build fast.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;StudyPulse is live for 5 test students. Next: real deployment (Vercel + Render), email verification (CASA assessment if we use restricted Gmail scopes beyond testing), and mobile app (Flutter).&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live demo&lt;/strong&gt;: &lt;code&gt;[https://drive.google.com/file/d/1Kwl3nrJzNpJx28anfxd6f5XCo7KX235Z/view?usp=drive_link]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;code&gt;[https://github.com/Rajnandini-Patil-30/studypulse]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try locally&lt;/strong&gt;: Instructions in the README&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;You don't need to choose between security and developer velocity. An MCP server costs almost nothing to build, buys you token isolation, and lets the same tools work across clients. For student-facing apps handling sensitive data, that's worth the small architectural lift.&lt;/p&gt;




&lt;p&gt;Questions? Drop them in the comments.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>hackathon</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
