<?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: Murali Gour</title>
    <description>The latest articles on DEV Community by Murali Gour (@murali_gour_13cd7a6a6db2c).</description>
    <link>https://dev.to/murali_gour_13cd7a6a6db2c</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%2F3907811%2F5fdeae3c-ecdb-494d-9ed1-55af1ca265e3.png</url>
      <title>DEV Community: Murali Gour</title>
      <link>https://dev.to/murali_gour_13cd7a6a6db2c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/murali_gour_13cd7a6a6db2c"/>
    <language>en</language>
    <item>
      <title>We Built Deterministic JSON Ops for AI Agents — The Problem It Solves</title>
      <dc:creator>Murali Gour</dc:creator>
      <pubDate>Thu, 18 Jun 2026 11:37:06 +0000</pubDate>
      <link>https://dev.to/murali_gour_13cd7a6a6db2c/we-built-deterministic-json-ops-for-ai-agents-the-problem-it-solves-1202</link>
      <guid>https://dev.to/murali_gour_13cd7a6a6db2c/we-built-deterministic-json-ops-for-ai-agents-the-problem-it-solves-1202</guid>
      <description>&lt;p&gt;Every AI agent that calls an external API hits the same wall.&lt;/p&gt;

&lt;p&gt;The response comes back as raw JSON, deeply nested, verbose, full of fields the agent doesn't need. Before the agent can reason over it or take any action, someone has to filter it, reshape it, maybe merge it with another payload.&lt;/p&gt;

&lt;p&gt;Most teams solve this one of three ways. They dump the raw JSON into the context window and let the LLM figure it out. They spin up a Python sidecar. Or they make an extra round-trip to a data service. None of these scale.&lt;/p&gt;

&lt;p&gt;We built DataGrout Data to eliminate all three.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Data does&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data is a suite of deterministic JSON manipulation tools exposed as MCP tools, callable directly by any AI agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;op&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eq&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&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="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$prev.records&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;created_at&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$prev.records&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Python. No extra runtime. Pure deterministic output the agent can immediately act on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The full operation set&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;data.filter — declarative filtering with 10+ operators (eq, neq, gte, lte, contains, starts_with, is_null...)&lt;br&gt;
data.sort — multi-field sorting with per-field direction control&lt;br&gt;
data.aggregate — reduce a field to a sum / mean / min / max / count.&lt;br&gt;
data.merge — combine two JSON datasets on a shared field&lt;br&gt;
data.flatten — simplify deeply nested payloads in one pass&lt;br&gt;
data.map — split large arrays into individual items for parallel processing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why deterministic matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every Data operation is pure, no AI generation touches the transformation layer. The agent decides what to do, Data executes it exactly. This eliminates token waste and hallucination risk on the data layer entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it handles large datasets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data accepts cache_ref outputs, so agents can chain operations on large payloads without retransmitting the full dataset at each step. The output of data.filter passes as a ref into data.sort — not as raw JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it fits in the DataGrout suite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data handles raw JSON payloads from API responses. Frame handles columnar tabular data. Together they cover the two most common data shapes agents encounter in enterprise workflows.&lt;/p&gt;

&lt;p&gt;Launched on Product Hunt today, would love your support and feedback!&lt;/p&gt;

&lt;p&gt;👉 datagrout.ai/tools/data&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>agents</category>
      <category>devtools</category>
    </item>
    <item>
      <title>We built columnar data ops for AI agents — here's why and how</title>
      <dc:creator>Murali Gour</dc:creator>
      <pubDate>Thu, 04 Jun 2026 09:04:23 +0000</pubDate>
      <link>https://dev.to/murali_gour_13cd7a6a6db2c/we-built-columnar-data-ops-for-ai-agents-heres-why-and-how-2ff2</link>
      <guid>https://dev.to/murali_gour_13cd7a6a6db2c/we-built-columnar-data-ops-for-ai-agents-heres-why-and-how-2ff2</guid>
      <description>&lt;p&gt;If you've built an AI agent that touches real enterprise data, you've probably hit this wall.&lt;/p&gt;

&lt;p&gt;Your agent pulls 2,000 records from Salesforce. Now what? The model can't reliably filter, sort, or group 2,000 rows inside its context window. You don't want to dump all of it as raw JSON. And spinning up a Python runtime just to run a pandas filter feels like overkill for what should be a simple operation.&lt;/p&gt;

&lt;p&gt;This is the problem we kept running into at DataGrout. So we built Frame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Frame?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frame is a suite of columnar data operations exposed as MCP tools — callable directly by any AI agent without a Python runtime, extra infrastructure, or round-trips to an analytics API.&lt;/p&gt;

&lt;p&gt;Here's what it looks like in practice. An agent receiving tabular records from a CRM can do this in a single workflow step:&lt;/p&gt;

&lt;p&gt;frame.filter({ payload, where: [{ field: "status", op: "eq", value: "active" }] })&lt;br&gt;
→ frame.sort({ payload: "$filter.records", by: [{ field: "revenue", dir: "desc" }] })&lt;br&gt;
→ frame.slice({ payload: "$sort.records", offset: 0, limit: 50 })&lt;/p&gt;

&lt;p&gt;No Python. No pandas. No external call. Pure deterministic output the agent can immediately act on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The full operation set&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;frame.filter — declarative row filtering with 10+ operators (eq, neq, gte, lte, contains, starts_with, is_null...)&lt;br&gt;
frame.sort — multi-column sorting with per-field direction control&lt;br&gt;
frame.group — aggregate by key, compute counts, sums, averages&lt;br&gt;
frame.pivot — reshape rows into columns for cross-tab analysis&lt;br&gt;
frame.join — merge two datasets on a shared key field&lt;br&gt;
frame.slice — page or window over large records&lt;br&gt;
frame.select — keep, drop, or rename columns in one pass&lt;br&gt;
Frame.pluck —extract one column into a flat array, dot-notation supported&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why deterministic matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the core design decisions with Frame was making every operation pure and deterministic. No AI generation touches the data transformation layer. The agent decides what to do, Frame executes it exactly. This eliminates a whole class of hallucination risk that comes with asking an LLM to reshape data directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handling large datasets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frame accepts cache_ref outputs from previous tool calls, so agents can operate on large paginated datasets without retransmitting the full payload each time. This was critical for production workflows where data sets run into tens of thousands of rows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it composes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frame tools chain together natively via flow.into inside DataGrout workflows. The output of frame.filter feeds directly into frame.sort without any manual wiring. This composability is what makes it genuinely useful in multi-step agent workflows rather than just as a standalone utility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where we are today&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frame is live at datagrout.ai/tools/frame and We launched on &lt;a href="https://www.producthunt.com/products/datagrout-ai/launches/datagrout-frame" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt; today — would appreciate your support if this is useful to you!&lt;br&gt;
We're actively building out the operation set. What data operations are you missing in your agent workflows? Drop them in the comments — we're reading everything.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>agents</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
