<?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: Jordan Tate</title>
    <description>The latest articles on DEV Community by Jordan Tate (@conduyt).</description>
    <link>https://dev.to/conduyt</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%2F4222766%2F1ea44cb5-cf74-4690-9ab5-0254c76e4cb9.png</url>
      <title>DEV Community: Jordan Tate</title>
      <link>https://dev.to/conduyt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/conduyt"/>
    <language>en</language>
    <item>
      <title>How to let an AI agent work in your CRM without breaking it</title>
      <dc:creator>Jordan Tate</dc:creator>
      <pubDate>Mon, 02 Nov 2026 16:53:44 +0000</pubDate>
      <link>https://dev.to/conduyt/how-to-let-an-ai-agent-work-in-your-crm-without-breaking-it-266c</link>
      <guid>https://dev.to/conduyt/how-to-let-an-ai-agent-work-in-your-crm-without-breaking-it-266c</guid>
      <description>&lt;p&gt;An AI agent that can read your CRM is useful. An AI agent that can write to it can also merge the wrong contacts, move deals nobody asked it to move, and text a lead at 11pm.&lt;/p&gt;

&lt;p&gt;So don't start by giving the agent everything. Treat it like a new hire: limited access, small jobs, and someone checking the work. (Disclosure: I work at a CRM company, and I use our product for the examples below.)&lt;/p&gt;

&lt;p&gt;Here's the order that works, whichever CRM you use.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Give the agent its own API key
&lt;/h2&gt;

&lt;p&gt;Don't hand it an admin key or your personal one. A separate key gets you three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can see which changes came from the agent.&lt;/li&gt;
&lt;li&gt;You can scope it to what the job needs.&lt;/li&gt;
&lt;li&gt;You can revoke it without logging your whole team out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your CRM only offers one all-powerful key, treat that as a real limit and keep the agent read-only through your own proxy until it doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Start read-only
&lt;/h2&gt;

&lt;p&gt;Give the agent read scopes for a week or two and make it prove itself on jobs where a mistake costs nothing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarize a contact's history before a sales call&lt;/li&gt;
&lt;li&gt;List deals that haven't moved in 14 days&lt;/li&gt;
&lt;li&gt;Find contacts with missing fields&lt;/li&gt;
&lt;li&gt;Draft (don't send) a follow-up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll learn more from this than from any demo, including how messy your data is, because an agent repeats your mess back to you with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Use MCP if your CRM has it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; gives an agent a typed list of tools instead of a pile of API docs. The agent can see what exists and what parameters each tool takes, so it guesses less.&lt;/p&gt;

&lt;p&gt;Setup is usually a few lines of config. This is the shape for Claude Desktop, using our own server as the example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"conduyt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"conduyt-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CONDUYT_API_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://conduyt.app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"CONDUYT_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cdy_your_key_here"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the key in the env block or a secret manager, not in a prompt. Check what the server exposes before you connect it. Ours has a &lt;code&gt;conduyt_check_permissions&lt;/code&gt; tool that reports what the current key can do, which is a good first call for any agent. If yours has nothing like it, have the agent try a harmless read and a harmless write, and confirm the write is refused.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Decide which writes are safe, then widen slowly
&lt;/h2&gt;

&lt;p&gt;Not all writes carry the same risk. A rough ladder:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Suggested handling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Add a note, create a task, add a tag&lt;/td&gt;
&lt;td&gt;Let it run, review weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Update a field, move a deal stage&lt;/td&gt;
&lt;td&gt;Let it run on rules you wrote down, spot-check daily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Merge or delete records, bulk changes&lt;/td&gt;
&lt;td&gt;Human approval every time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer-facing&lt;/td&gt;
&lt;td&gt;Send an email or text&lt;/td&gt;
&lt;td&gt;Human approval until you trust it, and always check consent and opt-outs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is the one that hurts. A bad field update is a cleanup job. A bad text to a lead can be a compliance problem, and in the US that includes 10DLC registration and opt-out rules. Sending stays with a human longer than anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Look for guardrails built for concurrency
&lt;/h2&gt;

&lt;p&gt;Agents are fast, and they act on data that may be seconds old. Two things to check in your CRM's API:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conflict detection.&lt;/strong&gt; If a rep edits a deal while the agent is working from a stale copy, does the write fail or silently overwrite the rep? Look for revision or version checks. In our API, some writes accept an &lt;code&gt;expectedRevision&lt;/code&gt; and return a 409 if the record changed underneath you. Whatever your CRM calls it, you want that behavior, and you want the agent told to re-read and retry rather than force it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two-step destructive actions.&lt;/strong&gt; Our merge tool won't run on the first call. It's marked destructive and asks for a confirmation of the impact first. If your CRM has no equivalent, wrap destructive calls yourself and require a human yes.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Write the rules down where the agent can read them
&lt;/h2&gt;

&lt;p&gt;An agent can't follow a rule that only exists in someone's head. Put them in the system prompt or a shared doc:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which pipelines it can touch&lt;/li&gt;
&lt;li&gt;What "stale" means here&lt;/li&gt;
&lt;li&gt;Who to assign new tasks to&lt;/li&gt;
&lt;li&gt;When it must stop and ask&lt;/li&gt;
&lt;li&gt;What it should never do&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Short and specific beats long and general.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Check the work on a schedule
&lt;/h2&gt;

&lt;p&gt;Pick a time each week to read what the agent changed. If your CRM keeps a timeline or audit trail, use it. If mistakes keep falling, widen its access. If they aren't, fix the rule or narrow the scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start on Monday
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create a separate read-only key.&lt;/li&gt;
&lt;li&gt;Connect it through MCP or a small script.&lt;/li&gt;
&lt;li&gt;Ask it one question you already know the answer to, like "which deals over $5,000 haven't moved in two weeks?"&lt;/li&gt;
&lt;li&gt;Compare the answer with what you know.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last step tells you whether your agent, or your data, is ready for more.&lt;/p&gt;

&lt;p&gt;If you want to see how the tool side looks in practice, &lt;a href="https://conduyt.com/mcp/" rel="noopener noreferrer"&gt;our MCP server page&lt;/a&gt; lists what an agent can do in Conduyt. The steps above work with any CRM that has an API.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Jordan Tate is VP of Customer Relations at &lt;a href="https://conduyt.com" rel="noopener noreferrer"&gt;Conduyt&lt;/a&gt;, a flat-price CRM for small sales teams. This post was drafted with AI assistance.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>crm</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
