<?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: prathyusha k</title>
    <description>The latest articles on DEV Community by prathyusha k (@prathyusha_kilaru).</description>
    <link>https://dev.to/prathyusha_kilaru</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%2F3901187%2F7fc7437e-0e20-4631-b63c-0a4fb3780d5d.png</url>
      <title>DEV Community: prathyusha k</title>
      <link>https://dev.to/prathyusha_kilaru</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prathyusha_kilaru"/>
    <language>en</language>
    <item>
      <title>I built the tool StackOne's CEO said every developer needs</title>
      <dc:creator>prathyusha k</dc:creator>
      <pubDate>Wed, 10 Jun 2026 20:05:30 +0000</pubDate>
      <link>https://dev.to/prathyusha_kilaru/i-built-the-tool-stackones-ceo-said-every-developer-needs-491j</link>
      <guid>https://dev.to/prathyusha_kilaru/i-built-the-tool-stackones-ceo-said-every-developer-needs-491j</guid>
      <description>&lt;p&gt;I wasted 30 minutes debugging my AI agent last month.&lt;/p&gt;

&lt;p&gt;Stepped through the orchestration code, checked the prompt, &lt;br&gt;
added console logs everywhere. Turns out the tool call itself &lt;br&gt;
was failing. The agent had nothing to do with it.&lt;/p&gt;

&lt;p&gt;Wrong BambooHR subdomain. Silent redirect. isError: false. &lt;br&gt;
Classic.&lt;/p&gt;

&lt;p&gt;StackOne's CEO posted about this exact problem — test your &lt;br&gt;
tools via RPC before wiring into your agent. There's no easy &lt;br&gt;
visual tool to do that. So I built one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 3 bugs that motivated this&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug 1 — Accept header&lt;/strong&gt;&lt;br&gt;
StackOne's MCP server requires both &lt;code&gt;application/json&lt;/code&gt; and &lt;br&gt;
&lt;code&gt;text/event-stream&lt;/code&gt; in the Accept header. Miss one and it &lt;br&gt;
rejects the connection before processing anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug 2 — Silent BambooHR failure&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;isError: false&lt;/code&gt; and HTTP 200 — but the employee never &lt;br&gt;
appeared. Wrong subdomain connected in StackOne. The response &lt;br&gt;
was a redirect, not a creation. Always verify in the target &lt;br&gt;
system, not just the response code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug 3 — Wrong Slack tool name&lt;/strong&gt;&lt;br&gt;
I assumed &lt;code&gt;slack_post_message&lt;/code&gt;. StackOne uses &lt;br&gt;
&lt;code&gt;slack_send_message&lt;/code&gt;. Never assume tool names match the &lt;br&gt;
provider API. Always call &lt;code&gt;tools/list&lt;/code&gt; first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;StackOne Agent Playground&lt;/strong&gt; — 4 features, one goal: test &lt;br&gt;
everything before your agent touches it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RPC Tool Tester&lt;/strong&gt;&lt;br&gt;
Select integration, pick tool from auto-loaded list, fill &lt;br&gt;
arguments, fire. See full response with isError badge and &lt;br&gt;
latency. No more guessing tool names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token Visualizer&lt;/strong&gt;&lt;br&gt;
Full tool loading = 14,280 tokens. After Tool Discovery = &lt;br&gt;
840 tokens. 94% reduction. Live bar chart with real numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow Simulator&lt;/strong&gt;&lt;br&gt;
4-step onboarding workflow — Greenhouse and BambooHR mock, &lt;br&gt;
Notion and Slack live. Real pages created, real Slack messages &lt;br&gt;
sent. Full audit trail per step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defender Tester&lt;/strong&gt;&lt;br&gt;
Paste any tool response, scan for prompt injection. Highlights &lt;br&gt;
exact flagged phrases and explains the attack pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One bug I hit building this&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This throws a runtime error in Vite&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ToolCallResult&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../types&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// This is correct — interfaces are type-only&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ToolCallResult&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../types&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Classic TypeScript + Vite gotcha. &lt;code&gt;import type&lt;/code&gt; tells Vite &lt;br&gt;
the import is for type-checking only, not runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/prathyushak828/stackone-agent-playground
&lt;span class="nb"&gt;cd &lt;/span&gt;stackone-agent-playground
npm &lt;span class="nb"&gt;install
cp&lt;/span&gt; .env.example .env
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No backend. Mock mode works without any credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/prathyushak828/stackone-agent-playground" rel="noopener noreferrer"&gt;https://github.com/prathyushak828/stackone-agent-playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Previous: &lt;a href="https://github.com/prathyushak828/stackone-onboarding-agent" rel="noopener noreferrer"&gt;AI Employee Onboarding Agent&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>typescript</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I Built an AI Agent That Guards Your Credit Cards 24/7</title>
      <dc:creator>prathyusha k</dc:creator>
      <pubDate>Thu, 28 May 2026 23:47:25 +0000</pubDate>
      <link>https://dev.to/prathyusha_kilaru/i-built-an-ai-agent-that-guards-your-credit-cards-247-2g9f</link>
      <guid>https://dev.to/prathyusha_kilaru/i-built-an-ai-agent-that-guards-your-credit-cards-247-2g9f</guid>
      <description>&lt;p&gt;Hello, I am Prathyusha. When I decided to build a fraud detection agent, I did not just read about it. I built it from scratch.&lt;br&gt;
This is the story of building FraudGuard AI — an agent that monitors every credit card transaction in real time, detects fraud using Claude AI, and blocks your card while you sleep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built&lt;/strong&gt;&lt;br&gt;
An AI agent that monitors all your bank accounts and credit cards in real time — using Claude AI as the fraud detection brain and a custom MCP server as the backbone.&lt;/p&gt;

&lt;p&gt;One scan does everything:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:3000/scan-all" rel="noopener noreferrer"&gt;http://localhost:3000/scan-all&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 1: Fetching transactions...       ✓  10 transactions loaded&lt;br&gt;
Step 2: Running rule checks...         ✓  5 flags raised&lt;br&gt;
Step 3: Analyzing with Claude AI...    ✓  Risk scores assigned&lt;br&gt;
Step 4: Handling fraud...              ✓  1 card blocked, 2 emails sent&lt;br&gt;
Step 5: Dashboard updated...           ✓  Live feed refreshed&lt;/p&gt;

&lt;p&gt;Scan complete in seconds.&lt;br&gt;
Full action log written to memory.&lt;/p&gt;

&lt;p&gt;The Problem It Solves&lt;br&gt;
Most fraud alerts arrive after the damage is done:&lt;/p&gt;

&lt;p&gt;→  Bank flags a transaction after it goes through&lt;br&gt;
→  You get a notification too late&lt;br&gt;
→  Attacker already has what they need&lt;br&gt;
→  You spend hours disputing and waiting&lt;/p&gt;

&lt;p&gt;That is the reality for millions of people every day. This agent catches fraud the moment it happens — and acts on it immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is MCP?&lt;/strong&gt;&lt;br&gt;
MCP stands for Model Context Protocol. It is an open standard that lets AI agents connect to external tools in a structured way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without MCP:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agent → custom code → Plaid&lt;br&gt;
Agent → different code → Gmail&lt;br&gt;
Agent → another code → Block API&lt;/p&gt;

&lt;p&gt;With a custom MCP server:&lt;/p&gt;

&lt;p&gt;Agent → ONE MCP server → Plaid&lt;br&gt;
                       → Claude AI&lt;br&gt;
                       → Gmail&lt;br&gt;
                       → Block handler&lt;/p&gt;

&lt;p&gt;One server. All tools. Clean architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Browser / API call&lt;br&gt;
↓&lt;br&gt;
mcp-server.js — exposes all 11 tools&lt;br&gt;
↓&lt;br&gt;
plaid-client.js — fetches transactions&lt;br&gt;
↓&lt;br&gt;
claude-agent.js — fraud analysis&lt;br&gt;
↓  ↓&lt;br&gt;
Rule checks    Claude AI (Anthropic API)&lt;br&gt;
↓&lt;br&gt;
block-handler.js — 2AM rule engine&lt;br&gt;
↓  ↓&lt;br&gt;
Auto-block    Email approval (Gmail API)&lt;br&gt;
↓&lt;br&gt;
dashboard — live HTML/CSS/JS UI&lt;/p&gt;

&lt;p&gt;Built in Node.js. 5 server files. Clean structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;**&lt;/p&gt;

&lt;p&gt;→  Language       →  Node.js + JavaScript&lt;br&gt;
→  AI Brain       →  Claude AI (Anthropic API)&lt;br&gt;
→  Bank Data      →  Plaid API&lt;br&gt;
→  Agent Backbone →  Custom MCP Server&lt;br&gt;
→  Notifications  →  Gmail API&lt;br&gt;
→  Dashboard      →  HTML + CSS + JS&lt;br&gt;
→  Data           →  Mock data (safe for GitHub)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 2AM Rule — My Favourite Feature&lt;/strong&gt;&lt;br&gt;
The biggest problem with fraud alerts is bad timing. They interrupt you at 3AM and you end up ignoring them. So I built a time-aware rule:&lt;/p&gt;

&lt;p&gt;─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;Before 2AM&lt;/strong&gt;&lt;br&gt;
A fraud alert email is sent with one-click YES / NO buttons.&lt;br&gt;
Click YES → transaction approved, card stays active.&lt;br&gt;
Click NO  → card blocked instantly.&lt;br&gt;
─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;After 2AM&lt;/strong&gt;&lt;br&gt;
Agent auto-blocks the card immediately. No interruptions.&lt;br&gt;
A full morning report arrives when you wake up.&lt;br&gt;
─────────────────────────────────────────&lt;/p&gt;

&lt;p&gt;No midnight interruptions. No missed fraud. The agent handles it either way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 Real Errors I Hit&lt;br&gt;
These taught me the most about building AI agents.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;Error 1 — Gmail OAuth redirect_uri_mismatch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Error 400: redirect_uri_mismatch&lt;br&gt;
Access blocked: This app's request is invalid&lt;/p&gt;

&lt;p&gt;Why: Created OAuth credentials as Desktop App type. Desktop Apps do not support redirect URIs, so the OAuth Playground rejected the request.&lt;/p&gt;

&lt;p&gt;Fix: Delete the Desktop App credential. Create a new one as Web Application type. Add this exact URI to Authorized Redirect URIs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/oauthplayground" rel="noopener noreferrer"&gt;https://developers.google.com/oauthplayground&lt;/a&gt;&lt;br&gt;
─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;Error 2 — Claude model deprecated&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;404: model claude-sonnet-4-20250514 not found&lt;br&gt;
The model is deprecated and will reach end-of-life&lt;/p&gt;

&lt;p&gt;Why: Used an outdated model string that had been deprecated by Anthropic.&lt;/p&gt;

&lt;p&gt;Fix: One line change in claude-agent.js. Updated to the current model:&lt;/p&gt;

&lt;p&gt;claude-sonnet-4-6&lt;br&gt;
─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;Error 3 — Gmail not configured fallback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[Gmail] Not configured — logging email to console instead&lt;/p&gt;

&lt;p&gt;Why: The .env file still had placeholder values for Gmail credentials. The system silently fell back to console logging instead of throwing an error.&lt;/p&gt;

&lt;p&gt;Fix: Complete the full OAuth Playground flow. Make sure all three Gmail values are real in .env:&lt;/p&gt;

&lt;p&gt;GMAIL_CLIENT_ID=real_value&lt;br&gt;
GMAIL_CLIENT_SECRET=real_value&lt;br&gt;
GMAIL_REFRESH_TOKEN=1//real_value&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Check your terminal for [Gmail] CONFIGURED ✅ on startup. That confirms Gmail is live before you test anything.&lt;br&gt;
─────────────────────────────────────────&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned About Building AI Agents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✓  Always check model names against current Anthropic docs — they deprecate fast&lt;br&gt;
✓  OAuth credentials type matters — Web Application not Desktop App for redirect flows&lt;br&gt;
✓  Use placeholder detection in code — fail loudly when keys are missing&lt;br&gt;
✓  Mock data is not just for testing — it makes your repo safe and instantly runnable&lt;br&gt;
✓  Time-aware logic makes agents feel genuinely intelligent, not just automated&lt;br&gt;
✓  Hybrid detection (rules + AI) is stronger than either approach alone&lt;br&gt;
&lt;strong&gt;Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✓  Plaid connected       →  10 mock transactions loaded across 3 accounts&lt;br&gt;
✓  Claude AI running     →  82% confidence on Frankfurt fraud detection&lt;br&gt;
✓  Gmail live            →  Fraud alert email sent with YES / NO buttons&lt;br&gt;
✓  Card blocked          →  One click in email blocks card instantly&lt;br&gt;
✓  Dashboard live        →  Real-time feed, alerts, and card controls&lt;br&gt;
✓  GitHub ready          →  Mock data, .env.example, full README&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thought&lt;/strong&gt;&lt;br&gt;
Building this agent taught me that AI is most powerful when it understands context — not just data. Claude AI did not just flag the Frankfurt transaction because it was foreign. It understood the combination of foreign location, unknown merchant, and 2AM timing together.&lt;/p&gt;

&lt;p&gt;That kind of contextual reasoning is what separates an AI agent from a simple rule engine.&lt;/p&gt;

&lt;p&gt;And the 2AM rule? That is just good product thinking. The best automation knows when to act and when to ask.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running With Mock Data vs Your Real Cards&lt;/strong&gt;&lt;br&gt;
The project ships with mock data by default. This means you can clone it, run it, and see the full fraud detection working instantly — no bank account needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What mock data includes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✓  10 realistic fake transactions across 3 accounts&lt;br&gt;
✓  2 high-risk scenarios — Frankfurt foreign transaction, CryptoExchange at 3AM&lt;br&gt;
✓  3 medium-risk scenarios — velocity attack, $1.00 test charge, luxury jewelry store&lt;br&gt;
✓  5 normal transactions — Starbucks, Shell, Netflix, Whole Foods, Texas Roadhouse&lt;br&gt;
✓  Pre-assigned risk levels and fraud reasons for instant testing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want to connect your real cards&lt;br&gt;
You need to replace 3 things in the project:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Get a Plaid account&lt;/strong&gt;&lt;br&gt;
→  Go to dashboard.plaid.com and create a free developer account&lt;br&gt;
→  Get your PLAID_CLIENT_ID and PLAID_SECRET&lt;br&gt;
→  Add both to your .env file&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Replace mock data with live Plaid data&lt;/strong&gt;&lt;br&gt;
In server/plaid-client.js, the switch is already built in. The file automatically detects whether your Plaid keys are real or placeholders:&lt;/p&gt;

&lt;p&gt;→  Placeholder keys → runs on mock data automatically&lt;br&gt;
→  Real Plaid keys  → fetches live transactions from your bank&lt;/p&gt;

&lt;p&gt;No code changes needed. Just add your real keys to .env and restart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Connect your bank via Plaid Link&lt;/strong&gt;&lt;br&gt;
→  Plaid uses OAuth — your bank password is entered directly on your bank's website&lt;br&gt;
→  The app never sees your actual login credentials&lt;br&gt;
→  Plaid never shares raw card numbers — only transaction metadata&lt;br&gt;
→  Start with Plaid Sandbox mode to test with fake bank data first&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important — what Plaid shares vs what stays private&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✓  Transaction amounts                →  shared&lt;br&gt;
✓  Merchant names                     →  shared&lt;br&gt;
✓  Transaction timestamps             →  shared&lt;br&gt;
✓  Tokenized account IDs              →  shared&lt;br&gt;
✗  Your actual card number          →  never shared&lt;br&gt;
✗  Your bank login credentials      →  never shared&lt;br&gt;
✗  Your CVV or PIN                  →  never shared&lt;/p&gt;

&lt;p&gt;This is why Plaid is trusted by apps like Venmo, Robinhood, and thousands of others. Your sensitive details never leave your bank.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full Code on GitHub&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/prathyushak828/FraudGuard-AI-AI-powered-fraud-detection-agent" rel="noopener noreferrer"&gt;https://github.com/prathyushak828/FraudGuard-AI-AI-powered-fraud-detection-agent&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;If you are building AI agents that work with real-world APIs and need intelligent decision-making — Claude AI and a custom MCP server is worth your time.&lt;/p&gt;

&lt;h1&gt;
  
  
  MCP   #AI   #NodeJS   #FraudDetection   #Claude   #Anthropic   #BuildInPublic   #SideProject
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>node</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I build an AI agent using StackOne MCP</title>
      <dc:creator>prathyusha k</dc:creator>
      <pubDate>Tue, 05 May 2026 21:18:19 +0000</pubDate>
      <link>https://dev.to/prathyusha_kilaru/i-build-an-ai-agent-using-stackone-mcp-3dl4</link>
      <guid>https://dev.to/prathyusha_kilaru/i-build-an-ai-agent-using-stackone-mcp-3dl4</guid>
      <description>&lt;p&gt;Hello myself Prathyusha. When I decided to apply to StackOne, I did not send &lt;br&gt;
a resume first. I built something with their platform first.&lt;/p&gt;

&lt;p&gt;This is the story of building an AI agent using StackOne MCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI agent that onboards a new employee across &lt;br&gt;
4 enterprise platforms automatically — using &lt;br&gt;
StackOne MCP as the single integration gateway.&lt;/p&gt;

&lt;p&gt;One command does everything:&lt;/p&gt;

&lt;p&gt;npm run onboard -- &lt;br&gt;
example employee name: Priya Sharma&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;Step 1: Fetching candidate...     ✓ Priya Sharma&lt;br&gt;
Step 2: Creating BambooHR record... ✓ Employee #115&lt;br&gt;
Step 3: Creating Notion page...   ✓ Checklist created&lt;br&gt;
Step 4: Sending Slack message...  ✓ Team notified&lt;/p&gt;

&lt;p&gt;Onboarding complete in seconds.&lt;br&gt;
Audit trail written to audit-log.json.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem It Solves&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most companies onboard employees manually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HR types data into BambooHR by hand.&lt;/li&gt;
&lt;li&gt;Someone creates a Notion doc from scratch.&lt;/li&gt;
&lt;li&gt;Manager writes a Slack welcome manually.&lt;/li&gt;
&lt;li&gt;IT gets notified separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is 2 to 4 hours of manual work per new hire.&lt;br&gt;
This agent does all of it in seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is StackOne MCP?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP stands for Model Context Protocol.&lt;/li&gt;
&lt;li&gt;It is an open standard that lets AI agents &lt;/li&gt;
&lt;li&gt;connect to external tools in a structured way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Without StackOne:&lt;/strong&gt;&lt;br&gt;
Agent → custom code → BambooHR&lt;br&gt;
Agent → different code → Notion&lt;br&gt;
Agent → another code → Slack&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With StackOne MCP:&lt;/strong&gt;&lt;br&gt;
Agent → ONE endpoint → BambooHR&lt;br&gt;
                    → Notion&lt;br&gt;
                    → Slack&lt;/p&gt;

&lt;p&gt;One API key. One endpoint. 260+ integrations.&lt;br&gt;
Auth, retries, and audit logging handled &lt;br&gt;
automatically by StackOne's Falcon engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CLI input&lt;br&gt;
    ↓&lt;br&gt;
src/index.ts    — reads candidate name&lt;br&gt;
    ↓&lt;br&gt;
src/agent.ts    — orchestrates 4 steps&lt;br&gt;
    ↓&lt;br&gt;
src/stackone.ts — MCP client&lt;br&gt;
    ↓&lt;br&gt;
api.stackone.com/mcp&lt;br&gt;
    ↓         ↓        ↓&lt;br&gt;
BambooHR   Notion   Slack&lt;br&gt;
    ↓&lt;br&gt;
audit-log.json&lt;/p&gt;

&lt;p&gt;Built in TypeScript. 9 files. Clean structure.&lt;br&gt;
Supports multiple candidates in one command:&lt;/p&gt;

&lt;p&gt;npm run onboard -- john sarah alex priya&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Language   → TypeScript&lt;br&gt;
Runtime    → Node.js + tsx&lt;br&gt;
Gateway    → StackOne MCP server&lt;br&gt;
HRIS       → BambooHR&lt;br&gt;
Docs       → Notion&lt;br&gt;
Messaging  → Slack&lt;br&gt;
Audit      → JSON file&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 Real Errors I Hit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These taught me the most about StackOne MCP.&lt;/p&gt;

&lt;p&gt;─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;Error 1 — Missing Accept Header&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not Acceptable: Client must accept both&lt;br&gt;
application/json and text/event-stream&lt;/p&gt;

&lt;p&gt;Why: StackOne MCP uses streaming protocol.&lt;br&gt;
Must declare support for both formats.&lt;/p&gt;

&lt;p&gt;Fix: Add this header to every request:&lt;/p&gt;

&lt;p&gt;"Accept": "application/json, text/event-stream"&lt;br&gt;
─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;Error 2 — Silent BambooHR Redirect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No error thrown. Agent said success.&lt;br&gt;
Employee never appeared in BambooHR.&lt;/p&gt;

&lt;p&gt;The response was returning:&lt;br&gt;
"location": "&lt;a href="https://www.bamboohr.com" rel="noopener noreferrer"&gt;https://www.bamboohr.com&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
"location": "&lt;a href="https://api.bamboohr.com/" rel="noopener noreferrer"&gt;https://api.bamboohr.com/&lt;/a&gt;&lt;br&gt;
             .../mytestorg/.../employees/115"&lt;/p&gt;

&lt;p&gt;Why: Wrong BambooHR account connected &lt;br&gt;
in StackOne. Requests went to wrong instance.&lt;/p&gt;

&lt;p&gt;Fix: Delete wrong account in StackOne.&lt;br&gt;
Re-link with correct subdomain: mytestorg.&lt;br&gt;
─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;Error 3 — Wrong Slack Tool Name&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP error -32602: Tool slack_post_message &lt;br&gt;
not found&lt;/p&gt;

&lt;p&gt;Why: StackOne names tools differently &lt;br&gt;
from the underlying provider APIs.&lt;/p&gt;

&lt;p&gt;Fix: Called tools/list to see all Slack tools.&lt;br&gt;
Correct name was slack_send_message.&lt;br&gt;
Field name was channel_id not channel.&lt;/p&gt;

&lt;p&gt;Pro tip: Always use tools/list before &lt;br&gt;
assuming tool names. Saves hours of guessing.&lt;br&gt;
─────────────────────────────────────────&lt;br&gt;
&lt;strong&gt;What I Learned About StackOne MCP&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always accept text/event-stream in headers.&lt;/li&gt;
&lt;li&gt;Each integration has its own Account ID.&lt;/li&gt;
&lt;li&gt;Use tools/list to find exact tool names.
&lt;/li&gt;
&lt;li&gt;All tools wrap fields inside body object.&lt;/li&gt;
&lt;li&gt;Wrong account = silent redirect, not error.&lt;/li&gt;
&lt;li&gt;StackOne Logs shows every API call made.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;BambooHR → Employee #115 created ✓&lt;br&gt;
Notion   → Onboarding page with Day 1 checklist ✓&lt;br&gt;
Slack    → Welcome message in #onboarding-alerts ✓&lt;br&gt;
Audit    → 4 timestamped entries logged ✓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thought&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;StackOne MCP made connecting to 4 enterprise &lt;br&gt;
platforms easier than connecting to one platform &lt;br&gt;
the traditional way.&lt;/p&gt;

&lt;p&gt;One API key replaced four SDKs.&lt;br&gt;
One endpoint replaced four auth systems.&lt;br&gt;
One integration replaced months of work.&lt;/p&gt;

&lt;p&gt;Full code on GitHub:&lt;br&gt;
github.com/prathyushak828/stackone-onboarding-agent&lt;/p&gt;

&lt;p&gt;If you are building AI agents that need to touch &lt;br&gt;
enterprise SaaS — StackOne MCP is worth your time.&lt;/p&gt;

&lt;h1&gt;
  
  
  StackOne #MCP #TypeScript #AIAgents #BuildInPublic
&lt;/h1&gt;

</description>
      <category>mcp</category>
      <category>typescript</category>
      <category>ai</category>
      <category>stackone</category>
    </item>
  </channel>
</rss>
