<?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: Mads Hansen</title>
    <description>The latest articles on Forem by Mads Hansen (@mads_hansen_27b33ebfee4c9).</description>
    <link>https://forem.com/mads_hansen_27b33ebfee4c9</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%2F3846701%2F6570ac8b-d5e5-413f-9198-dbbfaa431fc1.png</url>
      <title>Forem: Mads Hansen</title>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mads_hansen_27b33ebfee4c9"/>
    <language>en</language>
    <item>
      <title>Natural language SQL needs query budgets</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Mon, 11 May 2026 03:00:21 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/natural-language-sql-needs-query-budgets-2h8a</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/natural-language-sql-needs-query-budgets-2h8a</guid>
      <description>&lt;p&gt;Read-only access is necessary for AI database agents.&lt;/p&gt;

&lt;p&gt;It is not enough.&lt;/p&gt;

&lt;p&gt;A read-only agent can still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scan too much data&lt;/li&gt;
&lt;li&gt;run expensive queries&lt;/li&gt;
&lt;li&gt;return more rows than needed&lt;/li&gt;
&lt;li&gt;touch sensitive tables&lt;/li&gt;
&lt;li&gt;answer from a scope the user did not intend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why production natural language SQL needs query budgets.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a query budget?
&lt;/h2&gt;

&lt;p&gt;A query budget defines what an AI database workflow is allowed to spend or touch before a query runs.&lt;/p&gt;

&lt;p&gt;It can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;maximum rows returned&lt;/li&gt;
&lt;li&gt;maximum runtime&lt;/li&gt;
&lt;li&gt;approved tables or views&lt;/li&gt;
&lt;li&gt;allowed columns&lt;/li&gt;
&lt;li&gt;maximum date range&lt;/li&gt;
&lt;li&gt;cost or warehouse limits&lt;/li&gt;
&lt;li&gt;rate limits per user/workflow&lt;/li&gt;
&lt;li&gt;approval requirements for exceptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not to make agents less useful.&lt;/p&gt;

&lt;p&gt;The point is to make useful access predictable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Natural language hides query shape
&lt;/h2&gt;

&lt;p&gt;A user asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which customers are at risk this quarter?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That may be a perfectly reasonable business question.&lt;/p&gt;

&lt;p&gt;But the generated query might be much broader than the user expected.&lt;/p&gt;

&lt;p&gt;So the system needs boundaries outside the model’s wording.&lt;/p&gt;

&lt;p&gt;Budget by workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;support lookup: one customer, short date range, redacted fields&lt;/li&gt;
&lt;li&gt;sales analysis: approved CRM views, aggregate output, row cap&lt;/li&gt;
&lt;li&gt;finance reporting: approved revenue model, scheduled run, owner review&lt;/li&gt;
&lt;li&gt;diagnostics: operational metrics, no customer PII, time-boxed queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full piece: &lt;a href="https://conexor.io/blog/ai-database-query-budgets?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;AI database query budgets: the missing control for natural language SQL&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; helps teams connect databases and APIs to MCP-compatible AI clients.&lt;/p&gt;

&lt;p&gt;Read-only access is the starting point.&lt;/p&gt;

&lt;p&gt;Query budgets make the boundary visible, enforceable, and reviewable.&lt;/p&gt;

</description>
      <category>database</category>
      <category>ai</category>
      <category>mcp</category>
      <category>sql</category>
    </item>
    <item>
      <title>MCP Tool Search does not replace permission design</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Mon, 11 May 2026 03:00:20 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/mcp-tool-search-does-not-replace-permission-design-2p9g</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/mcp-tool-search-does-not-replace-permission-design-2p9g</guid>
      <description>&lt;p&gt;MCP Tool Search is a good answer to a very real problem: tool catalogs are getting too large to dump into every agent conversation.&lt;/p&gt;

&lt;p&gt;Loading fewer tool definitions means less token waste, less confusion, and fewer irrelevant capabilities competing for the model’s attention.&lt;/p&gt;

&lt;p&gt;But for database-connected agents, discovery is only half the problem.&lt;/p&gt;

&lt;p&gt;The harder question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is this tool allowed to do once the model finds it?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Discovery is not authorization
&lt;/h2&gt;

&lt;p&gt;A searchable tool catalog can help an agent find the right capability.&lt;/p&gt;

&lt;p&gt;It should not become a shortcut around the permission model.&lt;/p&gt;

&lt;p&gt;For database MCP servers, I would rather expose narrow workflow tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_monthly_revenue_summary&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list_overdue_invoices&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find_customers_with_usage_drop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_support_escalation_context&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Than broad tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_sql&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;query_table&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_statement&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tool Search can make safe capabilities easier to find.&lt;/p&gt;

&lt;p&gt;It can also make unsafe capabilities easier to reach if the catalog is poorly designed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Metadata becomes production interface
&lt;/h2&gt;

&lt;p&gt;With Tool Search, names, descriptions, tags, and schemas matter even more.&lt;/p&gt;

&lt;p&gt;A useful tool definition should make clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what business question it answers&lt;/li&gt;
&lt;li&gt;whether it is read-only or write-capable&lt;/li&gt;
&lt;li&gt;which approved view or source it uses&lt;/li&gt;
&lt;li&gt;what limits are enforced&lt;/li&gt;
&lt;li&gt;when the model should not use it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That metadata is not decoration.&lt;/p&gt;

&lt;p&gt;It shapes model behavior.&lt;/p&gt;

&lt;p&gt;Full piece: &lt;a href="https://conexor.io/blog/mcp-tool-search-database-agents?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;MCP Tool Search for database agents: discovery is not permission design&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; is MCP infrastructure for connecting databases and APIs to AI clients like Claude, ChatGPT, Cursor, n8n, and Continue.&lt;/p&gt;

&lt;p&gt;Discovery should make safe capabilities easier to find.&lt;/p&gt;

&lt;p&gt;It should not make unsafe capabilities easier to reach.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>Your AI database workflow needs evidence, not just answers</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Sun, 10 May 2026 02:37:24 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/your-ai-database-workflow-needs-evidence-not-just-answers-101d</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/your-ai-database-workflow-needs-evidence-not-just-answers-101d</guid>
      <description>&lt;p&gt;If an AI agent answers questions from live production data, the answer should not be the only artifact.&lt;/p&gt;

&lt;p&gt;Teams also need evidence.&lt;/p&gt;

&lt;p&gt;Who asked? What was the intent? Which tool ran? Which data source was touched? How much data came back? Were limits applied? Was approval required?&lt;/p&gt;

&lt;p&gt;That is the difference between a helpful demo and an audit-ready MCP database workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  A chat transcript is not an audit trail
&lt;/h2&gt;

&lt;p&gt;A final answer can be useful and still be impossible to review.&lt;/p&gt;

&lt;p&gt;A better trail captures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;original user request&lt;/li&gt;
&lt;li&gt;selected MCP tool&lt;/li&gt;
&lt;li&gt;database connection or approved view&lt;/li&gt;
&lt;li&gt;operation type&lt;/li&gt;
&lt;li&gt;row count returned&lt;/li&gt;
&lt;li&gt;limits, filters, and redaction rules&lt;/li&gt;
&lt;li&gt;final answer delivered to the user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This lets teams review both the result and the path that produced it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Log scope, not unnecessary raw data
&lt;/h2&gt;

&lt;p&gt;Auditability should not become a second data exposure problem.&lt;/p&gt;

&lt;p&gt;Often, the audit log should capture metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;view/table group&lt;/li&gt;
&lt;li&gt;columns returned&lt;/li&gt;
&lt;li&gt;row count&lt;/li&gt;
&lt;li&gt;filters applied&lt;/li&gt;
&lt;li&gt;redaction policy&lt;/li&gt;
&lt;li&gt;normalized query shape&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need enough evidence to review access without copying sensitive production data everywhere.&lt;/p&gt;

&lt;p&gt;Full piece: &lt;a href="https://conexor.io/blog/audit-ready-mcp-database-workflows?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Audit-ready MCP database workflows: what evidence to capture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; helps teams connect databases and APIs to MCP-compatible AI clients.&lt;/p&gt;

&lt;p&gt;The important question is not only: “can the agent answer?”&lt;/p&gt;

&lt;p&gt;It is: “can we explain how the agent answered?”&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>MCP tool schemas are contracts, not comments</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Sun, 10 May 2026 02:37:23 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/mcp-tool-schemas-are-contracts-not-comments-4fn5</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/mcp-tool-schemas-are-contracts-not-comments-4fn5</guid>
      <description>&lt;p&gt;An MCP tool schema is not just documentation.&lt;/p&gt;

&lt;p&gt;It is part of the model’s operating environment.&lt;/p&gt;

&lt;p&gt;The model reads the tool name, description, input schema, and output shape to decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether to use the tool&lt;/li&gt;
&lt;li&gt;what arguments to send&lt;/li&gt;
&lt;li&gt;what the result means&lt;/li&gt;
&lt;li&gt;whether the tool is safe for the user’s intent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means schema drift can become behavior drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters for database tools
&lt;/h2&gt;

&lt;p&gt;If a normal API changes, a typed client or test suite may fail.&lt;/p&gt;

&lt;p&gt;If an MCP database tool changes, the agent might keep running but behave differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a parameter changes and the agent stops using the tool&lt;/li&gt;
&lt;li&gt;a description becomes broader and the model overuses it&lt;/li&gt;
&lt;li&gt;an output field disappears and the agent reasons from missing context&lt;/li&gt;
&lt;li&gt;a tool name hides whether it is read-only or write-capable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For database-connected agents, the schema is part of the safety boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Review the contract before runtime
&lt;/h2&gt;

&lt;p&gt;Production teams should review MCP tool schema changes before agents see them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;removed tools&lt;/li&gt;
&lt;li&gt;changed required fields&lt;/li&gt;
&lt;li&gt;tightened constraints&lt;/li&gt;
&lt;li&gt;changed descriptions on high-risk tools&lt;/li&gt;
&lt;li&gt;new access to sensitive tables or fields&lt;/li&gt;
&lt;li&gt;new write-capable operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not every change should be blocked.&lt;/p&gt;

&lt;p&gt;But meaningful contract changes should be visible.&lt;/p&gt;

&lt;p&gt;Full piece: &lt;a href="https://conexor.io/blog/mcp-schema-drift-database-agents?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;MCP schema drift: why database agents need stable tool contracts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; is MCP infrastructure for connecting databases and APIs to AI clients like Claude, ChatGPT, Cursor, n8n, and Continue.&lt;/p&gt;

&lt;p&gt;Schema drift is inevitable.&lt;/p&gt;

&lt;p&gt;Silent schema drift is optional.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>Your AI database agent probably needs fewer rows, not more context</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Sat, 09 May 2026 01:29:53 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/your-ai-database-agent-probably-needs-fewer-rows-not-more-context-25od</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/your-ai-database-agent-probably-needs-fewer-rows-not-more-context-25od</guid>
      <description>&lt;p&gt;A lot of AI database safety discussions start and stop at read-only access.&lt;/p&gt;

&lt;p&gt;Read-only is necessary.&lt;/p&gt;

&lt;p&gt;It is not sufficient.&lt;/p&gt;

&lt;p&gt;A read-only agent with broad table access can still return customer records, private notes, billing details, free-text fields, and operational data that was never needed for the question.&lt;/p&gt;

&lt;p&gt;The agent did not mutate anything.&lt;/p&gt;

&lt;p&gt;It still saw too much.&lt;/p&gt;

&lt;p&gt;That is why data minimization matters for AI database workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Most users want an answer, not a dump
&lt;/h2&gt;

&lt;p&gt;A useful agent does not need unlimited rows.&lt;/p&gt;

&lt;p&gt;It needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the right approved view&lt;/li&gt;
&lt;li&gt;enough schema context&lt;/li&gt;
&lt;li&gt;scoped permissions&lt;/li&gt;
&lt;li&gt;row limits&lt;/li&gt;
&lt;li&gt;redaction before data reaches the model&lt;/li&gt;
&lt;li&gt;audit logs showing what was returned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model should not receive every table just because the database role can technically read it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Approved views beat raw tables
&lt;/h2&gt;

&lt;p&gt;Approved views let teams encode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;safe columns&lt;/li&gt;
&lt;li&gt;valid joins&lt;/li&gt;
&lt;li&gt;source-of-truth metrics&lt;/li&gt;
&lt;li&gt;default filters&lt;/li&gt;
&lt;li&gt;fields that should never leave the database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That improves security and answer quality at the same time.&lt;/p&gt;

&lt;p&gt;A model working against a clean semantic view is less likely to confuse implementation details with business meaning.&lt;/p&gt;

&lt;p&gt;We wrote the full piece here: &lt;a href="https://conexor.io/blog/data-minimization-for-ai-database-agents?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Data minimization for AI database agents: return less by default&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; helps teams expose databases and APIs as MCP tools for AI clients without turning “more context” into the default.&lt;/p&gt;

&lt;p&gt;Returning less data is not friction.&lt;/p&gt;

&lt;p&gt;It is what makes the workflow safe enough to repeat.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>AI database agents need approval gates, not vibes</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Sat, 09 May 2026 01:26:37 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/ai-database-agents-need-approval-gates-not-vibes-5d28</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/ai-database-agents-need-approval-gates-not-vibes-5d28</guid>
      <description>&lt;p&gt;Read-only is the right default for AI database access.&lt;/p&gt;

&lt;p&gt;Most teams do not need an agent to change production data. They need it to answer questions from live systems without waiting for a SQL handoff.&lt;/p&gt;

&lt;p&gt;But eventually, useful workflows drift toward actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;update a ticket&lt;/li&gt;
&lt;li&gt;tag an account&lt;/li&gt;
&lt;li&gt;refresh a derived table&lt;/li&gt;
&lt;li&gt;draft a config change&lt;/li&gt;
&lt;li&gt;trigger a downstream workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where “the prompt says ask first” stops being a real control.&lt;/p&gt;

&lt;p&gt;The approval gate has to live in the tool layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Do not jump from read-only to full write access
&lt;/h2&gt;

&lt;p&gt;The dangerous pattern is treating write access as one switch.&lt;/p&gt;

&lt;p&gt;Read-only feels safe. Write access feels useful. So a team adds a broader credential, exposes a generic SQL tool, and relies on the model to be careful.&lt;/p&gt;

&lt;p&gt;That is not production architecture.&lt;/p&gt;

&lt;p&gt;Better intermediate states are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;draft-only tools&lt;/li&gt;
&lt;li&gt;preview tools&lt;/li&gt;
&lt;li&gt;approval-required tools&lt;/li&gt;
&lt;li&gt;allowlisted stored procedures&lt;/li&gt;
&lt;li&gt;rollback-aware workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent can help prepare the work without automatically crossing the final boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Preview before execution
&lt;/h2&gt;

&lt;p&gt;Every write-capable tool should be able to show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the exact operation proposed&lt;/li&gt;
&lt;li&gt;affected tables or APIs&lt;/li&gt;
&lt;li&gt;estimated or exact affected row count&lt;/li&gt;
&lt;li&gt;the permission being used&lt;/li&gt;
&lt;li&gt;why the agent believes the action is appropriate&lt;/li&gt;
&lt;li&gt;what approval is required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the agent cannot clearly explain the change, it should not execute the change.&lt;/p&gt;

&lt;p&gt;We wrote the full breakdown here: &lt;a href="https://conexor.io/blog/approval-gates-for-ai-database-writes?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Approval gates for AI database writes: where automation should stop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; is MCP infrastructure for connecting databases and APIs to AI clients like Claude, ChatGPT, Cursor, n8n, and Continue.&lt;/p&gt;

&lt;p&gt;The goal is not to make agents powerful by default.&lt;/p&gt;

&lt;p&gt;It is to make the boundary explicit:&lt;/p&gt;

&lt;p&gt;read → draft → preview → approve → execute → audit.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>Agent memory gets risky when the agent can query your database</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Fri, 08 May 2026 01:42:11 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/agent-memory-gets-risky-when-the-agent-can-query-your-database-2dh1</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/agent-memory-gets-risky-when-the-agent-can-query-your-database-2dh1</guid>
      <description>&lt;p&gt;Agent memory sounds harmless.&lt;/p&gt;

&lt;p&gt;Remember my preferred report format. Remember which metrics I care about. Remember that we exclude test accounts from revenue.&lt;/p&gt;

&lt;p&gt;Useful.&lt;/p&gt;

&lt;p&gt;But once the same agent can query a database, memory stops being just convenience. It becomes part of the decision surface.&lt;/p&gt;

&lt;p&gt;A recalled preference can influence which tool the agent chooses, what SQL it writes, what rows it returns, and what it treats as relevant.&lt;/p&gt;

&lt;p&gt;That means memory needs governance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Not all context is the same
&lt;/h2&gt;

&lt;p&gt;For database workflows, I separate two kinds of context:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Curated schema context&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;table meaning&lt;/li&gt;
&lt;li&gt;approved joins&lt;/li&gt;
&lt;li&gt;metric definitions&lt;/li&gt;
&lt;li&gt;source-of-truth notes&lt;/li&gt;
&lt;li&gt;safe default filters&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User/session memory&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preferred formats&lt;/li&gt;
&lt;li&gt;recurring questions&lt;/li&gt;
&lt;li&gt;past feedback&lt;/li&gt;
&lt;li&gt;task-specific working notes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first should be reviewable and durable.&lt;/p&gt;

&lt;p&gt;The second should be scoped, redacted, and easy to forget.&lt;/p&gt;

&lt;p&gt;Mixing them casually is where the risk starts.&lt;/p&gt;




&lt;h2&gt;
  
  
  What should not become memory
&lt;/h2&gt;

&lt;p&gt;For database-connected agents, I would avoid storing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raw query result rows&lt;/li&gt;
&lt;li&gt;credentials or secrets&lt;/li&gt;
&lt;li&gt;copied customer data&lt;/li&gt;
&lt;li&gt;tenant-specific details in global memory&lt;/li&gt;
&lt;li&gt;unverified business assumptions&lt;/li&gt;
&lt;li&gt;temporary exceptions that should expire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Long-term memory should not become a cache of everything the agent has ever seen.&lt;/p&gt;

&lt;p&gt;It should be a controlled source of useful context.&lt;/p&gt;

&lt;p&gt;We wrote the full piece here: &lt;a href="https://conexor.io/blog/agent-memory-for-database-workflows?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Agent memory for database workflows: useful context or hidden risk?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And yes, this is exactly where MCP architecture matters. &lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; helps expose databases and APIs as MCP tools for AI clients without turning memory into permission.&lt;/p&gt;

&lt;p&gt;Memory makes agents more useful.&lt;/p&gt;

&lt;p&gt;Boundaries make that usefulness repeatable.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>Short-lived credentials are not optional for AI database agents</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Fri, 08 May 2026 01:42:10 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/short-lived-credentials-are-not-optional-for-ai-database-agents-5fni</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/short-lived-credentials-are-not-optional-for-ai-database-agents-5fni</guid>
      <description>&lt;p&gt;The risky part of AI database access is not the first query.&lt;/p&gt;

&lt;p&gt;It is the credential that keeps working after the demo.&lt;/p&gt;

&lt;p&gt;Static service keys are convenient. They are also exactly how a harmless prototype turns into standing access to live business data.&lt;/p&gt;

&lt;p&gt;AI agents are different from normal backend services. They can choose tools dynamically, retry tasks, carry context across steps, and chain actions in ways the original developer may not have listed one by one.&lt;/p&gt;

&lt;p&gt;That does not mean agents are unusable.&lt;/p&gt;

&lt;p&gt;It means credential lifetime is part of the architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  The better default
&lt;/h2&gt;

&lt;p&gt;For database-facing agents, I would rather see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;per-session credentials for interactive users&lt;/li&gt;
&lt;li&gt;per-task credentials for automation&lt;/li&gt;
&lt;li&gt;separate roles for read/reporting tools vs write/admin tools&lt;/li&gt;
&lt;li&gt;short TTLs for higher-privilege access&lt;/li&gt;
&lt;li&gt;no credentials stored in prompts, traces, or long-term memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Short-lived access reduces exposure time.&lt;/p&gt;

&lt;p&gt;But TTL is only half the story.&lt;/p&gt;

&lt;p&gt;A short-lived admin credential is still an admin credential.&lt;/p&gt;

&lt;p&gt;The other half is scope.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pair TTL with tool boundaries
&lt;/h2&gt;

&lt;p&gt;A production MCP database server should not hand every workflow one generic database credential and one generic &lt;code&gt;execute_sql&lt;/code&gt; tool.&lt;/p&gt;

&lt;p&gt;Better patterns are narrower:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;approved reporting views&lt;/li&gt;
&lt;li&gt;read-only roles by default&lt;/li&gt;
&lt;li&gt;named tools for recurring business questions&lt;/li&gt;
&lt;li&gt;query timeouts and row limits&lt;/li&gt;
&lt;li&gt;approval gates for write-capable actions&lt;/li&gt;
&lt;li&gt;audit logs for every meaningful tool call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model should not decide the credential scope.&lt;/p&gt;

&lt;p&gt;The infrastructure should.&lt;/p&gt;

&lt;p&gt;We wrote the full breakdown here: &lt;a href="https://conexor.io/blog/short-lived-credentials-for-ai-database-agents?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Short-lived credentials for AI database agents: reduce the blast radius first&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; is built around this MCP layer: connecting databases and APIs to AI clients while keeping access specific, temporary, observable, and governable.&lt;/p&gt;

&lt;p&gt;The practical question is not: can the agent connect?&lt;/p&gt;

&lt;p&gt;It is: what can this specific user, workflow, and tool do right now?&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>SELECT-only is the floor for AI analytics, not the finish line</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Thu, 07 May 2026 01:22:00 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/select-only-is-the-floor-for-ai-analytics-not-the-finish-line-15ao</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/select-only-is-the-floor-for-ai-analytics-not-the-finish-line-15ao</guid>
      <description>&lt;p&gt;Read-only database access is the right default for AI analytics.&lt;/p&gt;

&lt;p&gt;It is also not enough.&lt;/p&gt;

&lt;p&gt;That sounds weird until you watch what happens in production.&lt;/p&gt;

&lt;p&gt;A team gives an AI agent a role that can only run &lt;code&gt;SELECT&lt;/code&gt;. Everyone relaxes because the agent cannot mutate data.&lt;/p&gt;

&lt;p&gt;Then it runs an expensive query.&lt;/p&gt;

&lt;p&gt;Or returns 50,000 rows when a summary would have been enough.&lt;/p&gt;

&lt;p&gt;Or exposes sensitive columns.&lt;/p&gt;

&lt;p&gt;Or answers from the wrong table because the schema looked obvious and wasn't.&lt;/p&gt;

&lt;p&gt;No data was modified.&lt;/p&gt;

&lt;p&gt;The workflow can still be unsafe.&lt;/p&gt;




&lt;h2&gt;
  
  
  What SELECT-only actually solves
&lt;/h2&gt;

&lt;p&gt;It prevents writes.&lt;/p&gt;

&lt;p&gt;That is important. It should usually be the first boundary.&lt;/p&gt;

&lt;p&gt;But it does not decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which rows can be viewed&lt;/li&gt;
&lt;li&gt;which columns are sensitive&lt;/li&gt;
&lt;li&gt;which tables are authoritative&lt;/li&gt;
&lt;li&gt;which queries are too expensive&lt;/li&gt;
&lt;li&gt;which metric definitions are correct&lt;/li&gt;
&lt;li&gt;which answers need an audit trail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read-only protects data integrity.&lt;/p&gt;

&lt;p&gt;It does not automatically protect confidentiality, performance, or answer quality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Governed read-only is the real goal
&lt;/h2&gt;

&lt;p&gt;For AI analytics, the safer pattern is narrower:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;approved reporting views&lt;/li&gt;
&lt;li&gt;schema context in business language&lt;/li&gt;
&lt;li&gt;row limits and timeouts&lt;/li&gt;
&lt;li&gt;aggregate-first tools&lt;/li&gt;
&lt;li&gt;separate paths for write-capable operations&lt;/li&gt;
&lt;li&gt;audit logs for every meaningful query&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model should not have to remember all of that from a prompt.&lt;/p&gt;

&lt;p&gt;The access layer should enforce it.&lt;/p&gt;

&lt;p&gt;We wrote more here: &lt;a href="https://conexor.io/blog/read-only-ai-analytics-select-only-is-not-enough?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Read-only AI analytics: why SELECT-only is necessary but not enough&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; is built around this exact MCP layer: connecting live databases and APIs to AI clients without turning every prompt into a production risk review.&lt;/p&gt;

&lt;p&gt;The practical question is not "can the AI only SELECT?"&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;p&gt;SELECT what, for whom, through which tool, with which context, under which limits, and with what audit trail?&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>Your AI database connector is a control plane, not a shortcut</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Thu, 07 May 2026 01:21:59 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/your-ai-database-connector-is-a-control-plane-not-a-shortcut-83j</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/your-ai-database-connector-is-a-control-plane-not-a-shortcut-83j</guid>
      <description>&lt;p&gt;The first successful AI database query is not the milestone.&lt;/p&gt;

&lt;p&gt;It's the trap.&lt;/p&gt;

&lt;p&gt;Because the demo question is always harmless:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What was revenue last month?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then the connector spreads. More people use it. More clients get wired in. More tables become reachable. Suddenly, the thing you treated as a convenience layer is sitting between natural language and production data.&lt;/p&gt;

&lt;p&gt;That is not a shortcut anymore.&lt;/p&gt;

&lt;p&gt;It is a control plane.&lt;/p&gt;




&lt;h2&gt;
  
  
  The five boundaries that matter
&lt;/h2&gt;

&lt;p&gt;Before connecting Claude, ChatGPT, Cursor, or an internal agent to live data, teams should define five things clearly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identity&lt;/strong&gt; — who is asking, through which client, and under which workspace?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope&lt;/strong&gt; — which schemas, views, columns, and tools are in bounds?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema context&lt;/strong&gt; — what does the data actually mean in business terms?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution limits&lt;/strong&gt; — how much can be queried, returned, or attempted?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability&lt;/strong&gt; — what can be reviewed later when an answer matters?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If those boundaries are vague, the connector becomes a thin wrapper around credentials.&lt;/p&gt;

&lt;p&gt;That might be fine locally.&lt;/p&gt;

&lt;p&gt;It is not how production teams should expose business data to AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP helps, but it does not replace architecture
&lt;/h2&gt;

&lt;p&gt;MCP gives AI clients a useful tool layer.&lt;/p&gt;

&lt;p&gt;But an MCP database server still needs real product decisions: read-only defaults, approved views, result limits, tool descriptions, blocked operations, and logs.&lt;/p&gt;

&lt;p&gt;The goal is not simply "let the model query the database."&lt;/p&gt;

&lt;p&gt;The goal is: make the organization understand exactly what the model is allowed to do.&lt;/p&gt;

&lt;p&gt;We wrote the full checklist here: &lt;a href="https://conexor.io/blog/ai-database-connector-architecture-checklist?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;AI database connector architecture: the five boundaries teams should define first&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you're building this layer, &lt;a href="https://conexor.io?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Conexor&lt;/a&gt; connects databases and APIs to MCP-compatible clients like Claude, ChatGPT, Cursor, n8n, and Continue.&lt;/p&gt;

&lt;p&gt;The connector is where the risk concentrates.&lt;/p&gt;

&lt;p&gt;Treat it like infrastructure.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>If an AI database question is asked twice, it probably should not live only as a prompt</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Wed, 06 May 2026 00:38:28 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/if-an-ai-database-question-is-asked-twice-it-probably-should-not-live-only-as-a-prompt-4dii</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/if-an-ai-database-question-is-asked-twice-it-probably-should-not-live-only-as-a-prompt-4dii</guid>
      <description>&lt;p&gt;The first impressive AI database moment is usually a one-off question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What was MRR last month?&lt;/p&gt;

&lt;p&gt;Which customers are at risk?&lt;/p&gt;

&lt;p&gt;Where did usage drop this week?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is useful.&lt;/p&gt;

&lt;p&gt;But most reporting problems are not one-off.&lt;/p&gt;

&lt;p&gt;They repeat.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real bottleneck is recurring work
&lt;/h2&gt;

&lt;p&gt;Teams do not only need one answer.&lt;/p&gt;

&lt;p&gt;They need the same class of answer every Monday, after every release, before every board update, or whenever a metric crosses a threshold.&lt;/p&gt;

&lt;p&gt;If a human has to remember the prompt, choose the right context, check the same tables, paste the same results, and verify the same assumptions every time, the AI helped.&lt;/p&gt;

&lt;p&gt;But it did not remove the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next step is a repeatable workflow
&lt;/h2&gt;

&lt;p&gt;A repeatable AI reporting workflow defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which data sources are in scope&lt;/li&gt;
&lt;li&gt;which MCP tools may be used&lt;/li&gt;
&lt;li&gt;what the question means in business terms&lt;/li&gt;
&lt;li&gt;how often it should run&lt;/li&gt;
&lt;li&gt;who receives the result&lt;/li&gt;
&lt;li&gt;what gets logged for review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not make the workflow less flexible.&lt;/p&gt;

&lt;p&gt;It makes it dependable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: weekly customer health
&lt;/h2&gt;

&lt;p&gt;The one-off prompt is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Show accounts where usage dropped more than 20% week over week.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The workflow is more useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;query the approved usage summary view&lt;/li&gt;
&lt;li&gt;join only approved account metadata&lt;/li&gt;
&lt;li&gt;exclude test accounts&lt;/li&gt;
&lt;li&gt;flag accounts with open high-priority tickets&lt;/li&gt;
&lt;li&gt;summarize reasons for concern&lt;/li&gt;
&lt;li&gt;send the result every Monday&lt;/li&gt;
&lt;li&gt;store the query trail for audit/debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is no longer just a clever answer.&lt;/p&gt;

&lt;p&gt;It is operational reporting.&lt;/p&gt;

&lt;p&gt;Conexor is working in this MCP infrastructure layer: helping teams expose databases and APIs as controlled tools for AI clients, so useful questions can become repeatable workflows instead of fragile prompt rituals.&lt;/p&gt;

&lt;p&gt;Longer version: &lt;a href="https://conexor.io/blog/repeatable-ai-reporting-workflows-with-mcp-flows?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Repeatable AI reporting workflows: when one-off database questions are not enough&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Practical rule:&lt;/p&gt;

&lt;p&gt;If a database question is asked more than twice, it probably should not live only as a chat prompt.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>database</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Do not give AI agents cloud access when they only need database answers</title>
      <dc:creator>Mads Hansen</dc:creator>
      <pubDate>Wed, 06 May 2026 00:37:22 +0000</pubDate>
      <link>https://forem.com/mads_hansen_27b33ebfee4c9/do-not-give-ai-agents-cloud-access-when-they-only-need-database-answers-3jdm</link>
      <guid>https://forem.com/mads_hansen_27b33ebfee4c9/do-not-give-ai-agents-cloud-access-when-they-only-need-database-answers-3jdm</guid>
      <description>&lt;p&gt;Azure SQL often holds the answers teams ask for every week.&lt;/p&gt;

&lt;p&gt;Customer usage. Billing events. Operational metrics. Support signals. Reporting data.&lt;/p&gt;

&lt;p&gt;So the natural question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;can Claude, ChatGPT, Cursor, or an internal AI agent query that data directly?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;But the safe version is not “give the agent Azure access.”&lt;/p&gt;

&lt;p&gt;The safe version is an MCP layer that exposes narrow, auditable database tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wrong abstraction is cloud access
&lt;/h2&gt;

&lt;p&gt;When teams hear “connect AI to Azure,” they often start with subscriptions, resource groups, service principals, and broad operational APIs.&lt;/p&gt;

&lt;p&gt;That may be useful for cloud operations.&lt;/p&gt;

&lt;p&gt;It is the wrong default for business-data questions.&lt;/p&gt;

&lt;p&gt;If the user asks, “which accounts expanded usage last month?”, the agent does not need wide Azure control.&lt;/p&gt;

&lt;p&gt;It needs controlled access to approved Azure SQL views.&lt;/p&gt;

&lt;p&gt;Cloud permissions answer what infrastructure can be touched.&lt;/p&gt;

&lt;p&gt;Database tools answer what business questions can be asked.&lt;/p&gt;

&lt;p&gt;Those are different boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a safer Azure SQL MCP setup looks like
&lt;/h2&gt;

&lt;p&gt;A production-facing MCP server should define boring, narrow tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;query approved reporting views&lt;/li&gt;
&lt;li&gt;inspect allowed schema context&lt;/li&gt;
&lt;li&gt;summarize aggregate results&lt;/li&gt;
&lt;li&gt;reject queries outside scope&lt;/li&gt;
&lt;li&gt;log who asked, what ran, and what came back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start read-only.&lt;/p&gt;

&lt;p&gt;Use a dedicated database user.&lt;/p&gt;

&lt;p&gt;Grant access only to approved schemas or views.&lt;/p&gt;

&lt;p&gt;Describe fields in business language.&lt;/p&gt;

&lt;p&gt;Enforce result limits.&lt;/p&gt;

&lt;p&gt;Log the query trail.&lt;/p&gt;

&lt;p&gt;If the workflow later needs actions, make those separate tools with separate approvals. Do not hide writes behind &lt;code&gt;execute_sql&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Conexor focuses on this MCP infrastructure layer: exposing databases and APIs to AI clients through controlled tools, not broad credentials.&lt;/p&gt;

&lt;p&gt;Longer version: &lt;a href="https://conexor.io/blog/azure-sql-mcp-server-ai-agents-production-access?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=content" rel="noopener noreferrer"&gt;Azure SQL MCP server: how to give AI agents useful access without broad cloud permissions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The practical rule:&lt;/p&gt;

&lt;p&gt;Do not give an AI agent cloud access when it only needs business-data access.&lt;/p&gt;

&lt;p&gt;Use MCP to expose the narrow tools the workflow actually needs.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>azure</category>
      <category>database</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
