<?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: Srinivas Kondepudi</title>
    <description>The latest articles on DEV Community by Srinivas Kondepudi (@sirinivask).</description>
    <link>https://dev.to/sirinivask</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%2F3929806%2F3e582fb0-6ad8-4b28-bd40-b27808c07692.jpg</url>
      <title>DEV Community: Srinivas Kondepudi</title>
      <link>https://dev.to/sirinivask</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sirinivask"/>
    <language>en</language>
    <item>
      <title>How to stream Claude Code audit logs into Microsoft Sentinel (with Chron)</title>
      <dc:creator>Srinivas Kondepudi</dc:creator>
      <pubDate>Tue, 26 May 2026 15:41:50 +0000</pubDate>
      <link>https://dev.to/sirinivask/how-to-stream-claude-code-audit-logs-into-microsoft-sentinel-with-chron-49jb</link>
      <guid>https://dev.to/sirinivask/how-to-stream-claude-code-audit-logs-into-microsoft-sentinel-with-chron-49jb</guid>
      <description>&lt;p&gt;If your team uses Claude Code (or any MCP-based AI tool), those sessions are currently invisible to your security stack. No SIEM events. No audit trail. Nothing.&lt;/p&gt;

&lt;p&gt;Chron fixes that. It's an MCP server that logs every AI session to a local SQLite database and can relay structured metadata events to your SIEM. This post walks through the Azure Sentinel integration end to end.&lt;/p&gt;

&lt;p&gt;What gets logged&lt;/p&gt;

&lt;p&gt;Chron transmits metadata only, never message content:&lt;/p&gt;

&lt;p&gt;Event Fields&lt;br&gt;
session_started session ID prefix, AI tool, timestamp, OS&lt;br&gt;
message_logged  role (user/assistant), session ID prefix&lt;br&gt;
secret_detected detection type, masked value&lt;br&gt;
Prerequisites&lt;/p&gt;

&lt;p&gt;Chron installed (npm install -g chron-mcp or via npx)&lt;br&gt;
Azure subscription with a Log Analytics workspace&lt;br&gt;
App Registration with a client secret&lt;br&gt;
Azure setup (5 steps)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a Data Collection Endpoint (DCE) — Azure Portal &amp;gt; Monitor &amp;gt; Data Collection Endpoints &amp;gt; Create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a custom table — Log Analytics workspace &amp;gt; Tables &amp;gt; Create &amp;gt; New custom log (MMA-based) — name it ChronEvents_CL, add columns: EventType, SessionIdPrefix, AiTool, OS, ChronVersion, Computer, Role, DetectionType, MaskedValue (all string type)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a Data Collection Rule (DCR) — Monitor &amp;gt; Data Collection Rules &amp;gt; Create, point the stream Custom-ChronEvents_CL to your workspace table&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign role — on the DCR resource, add your App Registration as Monitoring Metrics Publisher&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note down your Tenant ID, Client ID, Client Secret, DCE URL, and DCR Immutable ID (starts with dcr-)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connect Chron&lt;br&gt;
chron connect sentinel&lt;/p&gt;

&lt;p&gt;The CLI prompts for your credentials, authenticates against Azure AD, sends a test event, and patches ~/.claude.json automatically. You should see the test event in Log Analytics within 5-10 minutes (first ingestion into a new custom table can take up to 15 min).&lt;/p&gt;

&lt;p&gt;Verify in Log Analytics&lt;/p&gt;

&lt;p&gt;ChronEvents_CL&lt;br&gt;
| order by TimeGenerated desc&lt;br&gt;
| take 10&lt;/p&gt;

&lt;p&gt;If the table doesn't appear yet, check the DCR &amp;gt; Monitoring tab for ingestion errors. The most common issue is a missing Monitoring Metrics Publisher role on the DCR (not the workspace).&lt;/p&gt;

&lt;p&gt;What you get&lt;/p&gt;

&lt;p&gt;Once connected, every Claude Code session generates a real-time stream of events in your Sentinel workspace. You can build workbooks, alerts, and hunting queries on top of it — e.g. alert when EventType == "secret_detected", or track AI tool adoption across your org by machine ID.&lt;/p&gt;

&lt;p&gt;Issues can be logged here: &lt;a href="https://github.com/SirinivasK/chron" rel="noopener noreferrer"&gt;https://github.com/SirinivasK/chron&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.amazonaws.com%2Fuploads%2Farticles%2Ftfhll9yq1u2vudlc9fdm.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.amazonaws.com%2Fuploads%2Farticles%2Ftfhll9yq1u2vudlc9fdm.png" alt="AI Session logs from Chron to Azure" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>mcp</category>
      <category>governance</category>
    </item>
    <item>
      <title>How I wired chron into CrowdStrike LogScale - and shipped 5 dashboards with it</title>
      <dc:creator>Srinivas Kondepudi</dc:creator>
      <pubDate>Mon, 18 May 2026 15:12:03 +0000</pubDate>
      <link>https://dev.to/sirinivask/how-i-wired-chron-into-crowdstrike-logscale-and-shipped-5-dashboards-with-it-2oeh</link>
      <guid>https://dev.to/sirinivask/how-i-wired-chron-into-crowdstrike-logscale-and-shipped-5-dashboards-with-it-2oeh</guid>
      <description>&lt;p&gt;In my first post I wrote about why I built chron, an MCP server that logs every AI conversation to local SQLite. This one is about what I built next: streaming those events into CrowdStrike LogScale so security teams can see AI activity across their org.&lt;/p&gt;

&lt;p&gt;The problem with local-only logging&lt;br&gt;
chron stores everything locally. That's good for individuals, your data, your machine, no cloud. But for an org with 50 developers all using Claude or Cursor, "local SQLite per machine" doesn't give anyone a picture of what's happening org wide.&lt;/p&gt;

&lt;p&gt;Security teams need a centralized view. And they already have one: their SIEM.&lt;/p&gt;

&lt;p&gt;Why LogScale (Humio)&lt;br&gt;
CrowdStrike acquired Humio in 2021 and rebranded it LogScale. It's one of the fastest log ingestion systems available, and it's already deployed at most enterprises that take security seriously. If I could get chron events into LogScale, I'd be sending data somewhere security teams already look.&lt;/p&gt;

&lt;p&gt;LogScale has a clean structured ingest API. You POST an array of events, each with a timestamp and key-value attributes. No schema to define upfront, it's schema less by default.&lt;/p&gt;

&lt;p&gt;The relay design&lt;br&gt;
I wanted the integration to be genuinely zero-friction for chron's critical path. Logging a message should never slow down because the relay is having a bad day.&lt;/p&gt;

&lt;p&gt;The solution: fire-and-forget via setImmediate.&lt;/p&gt;

&lt;p&gt;export function emitEvent(payload: ChronEventPayload): void {&lt;br&gt;
  const url = process.env.CHRON_LOGSCALE_URL;&lt;br&gt;
  const token = process.env.CHRON_LOGSCALE_TOKEN;&lt;br&gt;
  if (!url || !token) return;&lt;/p&gt;

&lt;p&gt;setImmediate(() =&amp;gt;&lt;br&gt;
    fetch(url, {&lt;br&gt;
      method: 'POST',&lt;br&gt;
      headers: {&lt;br&gt;
        'Authorization': &lt;code&gt;Bearer ${token}&lt;/code&gt;,&lt;br&gt;
        'Content-Type': 'application/json',&lt;br&gt;
      },&lt;br&gt;
      body: buildLogScalePayload(payload),&lt;br&gt;
    }).catch(() =&amp;gt; undefined)&lt;br&gt;
  );&lt;br&gt;
}&lt;br&gt;
setImmediate pushes the fetch to the next iteration of the event loop, after the current operation completes. The .catch(() =&amp;gt; undefined) means a failed relay never surfaces as an error. The audit log always writes to local SQLite first. The relay is best effort.&lt;/p&gt;

&lt;p&gt;Three event types&lt;br&gt;
chron emits exactly three event types to LogScale:&lt;/p&gt;

&lt;p&gt;session_started - when a new AI session begins. Includes the AI tool name and an anonymized machine ID (SHA-256 of hostname, truncated to 16 chars).&lt;/p&gt;

&lt;p&gt;message_logged - when a message is recorded. Includes role (user/assistant), timestamp, session prefix. Message content never leaves the machine.&lt;/p&gt;

&lt;p&gt;secret_detected - when the auto-scanner finds a credential in a user message. Includes detection type (aws_key, github_token, etc.) and a masked value. The real value stays local.&lt;/p&gt;

&lt;p&gt;That last point matters: chron's secret detection is designed to alert without exfiltrating. The masked value in LogScale tells the CISO "a GitHub token appeared in a developer's AI prompt on this machine at this time." The token itself is not in LogScale.&lt;/p&gt;

&lt;p&gt;The connect CLI&lt;br&gt;
Getting the credentials set up should be one command, not a documentation page.&lt;/p&gt;

&lt;p&gt;chron connect crowdstrike&lt;br&gt;
This prompts for your LogScale URL and ingest token, sends a real test event, validates the HTTP 200 response, and saves the config to ~/.chron/config.json. It also prints the exact env block to paste into ~/.claude.json so the credentials load automatically on every Claude Code session.&lt;/p&gt;

&lt;p&gt;Five dashboards, ready to import&lt;br&gt;
The hardest part of a new data source isn't the ingest — it's getting useful queries in front of the people who need them. I shipped five LQL queries and one importable dashboard YAML with chron 0.1.14.&lt;/p&gt;

&lt;p&gt;The dashboard covers:&lt;/p&gt;

&lt;p&gt;AI tool usage by count (which tools are developers actually using)&lt;br&gt;
Daily active developers by machine&lt;br&gt;
Sessions per developer&lt;br&gt;
Secret detections by type over time&lt;br&gt;
API key alert query for scheduled SOC alerting&lt;br&gt;
Import the YAML into LogScale and all five widgets are live. If you have chron running on even one machine, you'll see data immediately.&lt;/p&gt;

&lt;p&gt;What's next&lt;br&gt;
The relay currently supports LogScale and a generic HTTP endpoint (CHRON_RELAY_URL). Splunk, Elastic, and Datadog integrations are on the roadmap, the event schema is the same, just different destination formats.&lt;/p&gt;

&lt;p&gt;If you're running LogScale and want to try it:&lt;/p&gt;

&lt;p&gt;npx -y chron-mcp&lt;br&gt;
chron connect crowdstrike&lt;br&gt;
Restart Claude Code or Cursor, have a conversation, and watch the events appear in your LogScale stream.&lt;/p&gt;

&lt;p&gt;github.com/sirinivask/chron&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.amazonaws.com%2Fuploads%2Farticles%2Fvthhivqzqabz07us8x9c.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.amazonaws.com%2Fuploads%2Farticles%2Fvthhivqzqabz07us8x9c.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>claude</category>
      <category>mcp</category>
    </item>
    <item>
      <title>I built an MCP server to log every AI conversation, here's what I learned</title>
      <dc:creator>Srinivas Kondepudi</dc:creator>
      <pubDate>Wed, 13 May 2026 17:47:43 +0000</pubDate>
      <link>https://dev.to/sirinivask/i-built-an-mcp-server-to-log-every-ai-conversation-heres-what-i-learned-c28</link>
      <guid>https://dev.to/sirinivask/i-built-an-mcp-server-to-log-every-ai-conversation-heres-what-i-learned-c28</guid>
      <description>&lt;p&gt;Every serious system gets audited; databases, code, finances. AI shouldn't be the exception. I'm building the tools to close that gap. chron is the first one.&lt;/p&gt;

&lt;p&gt;The problem&lt;/p&gt;

&lt;p&gt;I was doing long coding sessions with Claude. We'd work through a problem, make decisions, figure out an approach together. Then the context window fills up. It resets. And suddenly the AI has forgotten everything, but I still need to know what we decided and why.&lt;/p&gt;

&lt;p&gt;I wanted a permanent local record. Not stored in some cloud. Not owned by any AI company. Just mine, on my machine, in a format I can actually read.&lt;/p&gt;

&lt;p&gt;What is MCP?&lt;br&gt;
MCP (Model Context Protocol) is an open standard from Anthropic that lets you extend Claude with custom tools. Think of it like a plugin system, you build a server that exposes tools, Claude learns to call them, and suddenly your AI can do things it couldn't before.&lt;/p&gt;

&lt;p&gt;I'd never built one before. This was my first.&lt;/p&gt;

&lt;p&gt;Turns out it's simpler than it sounds. You define a tool with three things:&lt;/p&gt;

&lt;p&gt;A name Claude can call&lt;br&gt;
A description Claude reads to know when to use it&lt;br&gt;
An input schema so Claude knows what arguments to pass&lt;br&gt;
That's it. Claude figures out the rest.&lt;/p&gt;

&lt;p&gt;What I built&lt;br&gt;
chron; an MCP server that automatically logs every AI conversation to a local SQLite database. Every message. Every timestamp. Fully yours.&lt;/p&gt;

&lt;p&gt;npx -y chron-mcp&lt;br&gt;
Run that once in your terminal. It detects which AI tools you have installed, Claude Desktop, Claude Code, Cursor, Windsurf, and configures them automatically. Restart your AI tool. Done. Everything gets logged from that point on, with zero manual steps.&lt;/p&gt;

&lt;p&gt;Three things I built that were interesting&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hash chaining&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each message stores a SHA-256 hash that includes the previous message's hash, same idea as a blockchain, but much simpler. It means you can verify the log hasn't been tampered with. If anyone edits an old message, every hash after it breaks.&lt;/p&gt;

&lt;p&gt;message 1: hash(content)           → abc123&lt;br&gt;
message 2: hash(content + abc123)  → def456&lt;br&gt;
message 3: hash(content + def456)  → ghi789&lt;br&gt;
Run verify_session and chron walks the chain. Any break means tampering.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Auto-setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The hardest part of building an MCP server isn't the server, it's getting people to install it. Writing JSON config files by hand is a real barrier.&lt;/p&gt;

&lt;p&gt;So npx -y chron-mcp now does it automatically. It reads your filesystem, detects which AI clients are installed, writes their config files, and installs a SessionStart hook in Claude Code so the logging skill loads on every new session. One command, restart, works.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The SessionStart hook&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Claude Code has a hook system; shell commands that run automatically at session start. I use this to inject the chron skill instructions so Claude knows to call the logging tools without you doing anything. This was the missing piece. Without it, the MCP server is registered but idle.&lt;/p&gt;

&lt;p&gt;What surprised me&lt;br&gt;
The install experience is harder than the feature itself. Getting the MCP server running took a day. Getting it to work without any user configuration took a week.&lt;/p&gt;

&lt;p&gt;Also: npm download counts are mostly bots. chron crossed 1,000 downloads in the first week, but honest estimate is maybe 50–150 real humans. Security scanners and registry mirrors download every new package automatically. Worth knowing before you celebrate.&lt;/p&gt;

&lt;p&gt;What's next&lt;br&gt;
The data is locked in SQLite right now. The next step is a local web UI — npx chron-mcp --ui opens a browser showing your sessions, messages, and stats. If AI is doing real work, you should be able to read the log without writing SQL.&lt;/p&gt;

&lt;p&gt;If you use Claude, Cursor, or Windsurf and you care about keeping a record of your AI conversations, give it a try.&lt;/p&gt;

&lt;p&gt;npx -y chron-mcp&lt;br&gt;
GitHub: github.com/sirinivask/chron&lt;/p&gt;

&lt;p&gt;I'm happy to answer questions about building MCP servers, it's genuinely worth learning right now.&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.amazonaws.com%2Fuploads%2Farticles%2F4a18k3p26p74cub48o1d.jpeg" 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.amazonaws.com%2Fuploads%2Farticles%2F4a18k3p26p74cub48o1d.jpeg" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
