<?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: Qasim Muhammad</title>
    <description>The latest articles on DEV Community by Qasim Muhammad (@qasim157).</description>
    <link>https://dev.to/qasim157</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%2F3837851%2F1a2b79c0-c959-45ef-b215-a68515f17bef.jpg</url>
      <title>DEV Community: Qasim Muhammad</title>
      <link>https://dev.to/qasim157</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qasim157"/>
    <language>en</language>
    <item>
      <title>nylas webhook server — What It Does and How to Use It</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Fri, 10 Apr 2026 22:00:07 +0000</pubDate>
      <link>https://dev.to/qasim157/nylas-webhook-server-what-it-does-and-how-to-use-it-21l3</link>
      <guid>https://dev.to/qasim157/nylas-webhook-server-what-it-does-and-how-to-use-it-21l3</guid>
      <description>&lt;p&gt;Webhooks fire when email arrives, events change, or contacts update. &lt;code&gt;nylas webhook server&lt;/code&gt; helps you start a local webhook server for development.&lt;/p&gt;

&lt;p&gt;The nylas webhook server command starts a local HTTP server that receives webhook events from Nylas.  It automatically creates a tunnel so Nylas can reach your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nylas/nylas-cli/nylas
nylas init
nylas webhook server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start on default port:&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;nylas webhook server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Start on a custom port:&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;nylas webhook server &lt;span class="nt"&gt;--port&lt;/span&gt; 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Webhooks replace polling. Instead of checking every 30 seconds whether new email arrived, the webhook pushes the event to your endpoint within seconds. This reduces API calls and improves latency for your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Syntax
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas webhook server &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--port&lt;/span&gt; PORT]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Related Commands
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/webhook-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook list&lt;/code&gt;&lt;/a&gt; — List all webhooks&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/webhook-create" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook create&lt;/code&gt;&lt;/a&gt; — Create a webhook for real-time event notifications&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/webhook-delete" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook delete&lt;/code&gt;&lt;/a&gt; — Delete an existing webhook by ID&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/webhook-test-send" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook test send&lt;/code&gt;&lt;/a&gt; — Send a test webhook event to a URL&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Full docs:&lt;/strong&gt; &lt;a href="https://cli.nylas.com/docs/commands/webhook-server" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook server&lt;/code&gt; reference&lt;/a&gt; — all flags, advanced examples, and troubleshooting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All commands:&lt;/strong&gt; &lt;a href="https://cli.nylas.com/docs/commands" rel="noopener noreferrer"&gt;Nylas CLI Command Reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;code&gt;brew install nylas/nylas-cli/nylas&lt;/code&gt; — &lt;a href="https://cli.nylas.com/guides/getting-started" rel="noopener noreferrer"&gt;other install methods&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>webhooks</category>
      <category>api</category>
      <category>devtools</category>
    </item>
    <item>
      <title>E2E Email Testing with Playwright and Cypress — No Gmail Credentials Required</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Fri, 10 Apr 2026 21:58:36 +0000</pubDate>
      <link>https://dev.to/qasim157/e2e-email-testing-with-playwright-and-cypress-no-gmail-credentials-required-33ig</link>
      <guid>https://dev.to/qasim157/e2e-email-testing-with-playwright-and-cypress-no-gmail-credentials-required-33ig</guid>
      <description>&lt;p&gt;Your Playwright test clicks "Reset Password." An email gets sent. Now what?&lt;/p&gt;

&lt;p&gt;Most teams fake this with mocked SMTP or MailHog. Tests pass locally but break in staging because the email never actually arrived. There's a better way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Real Test Inbox
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nylas/nylas-cli/nylas
nylas init
nylas inbound create e2e-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/inbound-create" rel="noopener noreferrer"&gt;&lt;code&gt;nylas inbound create&lt;/code&gt;&lt;/a&gt; provisions a managed email address that receives real email. No MX records. No mail server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Poll for Messages in Your Test
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/inbound-messages" rel="noopener noreferrer"&gt;&lt;code&gt;nylas inbound messages&lt;/code&gt;&lt;/a&gt; checks for new mail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas inbound messages inbox_abc123 &lt;span class="nt"&gt;--unread&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parse the JSON output to extract reset links, verification codes, or confirmation emails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor in Real Time
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/inbound-monitor" rel="noopener noreferrer"&gt;&lt;code&gt;nylas inbound monitor&lt;/code&gt;&lt;/a&gt; streams messages as they arrive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas inbound monitor inbox_abc123 &lt;span class="nt"&gt;--tunnel&lt;/span&gt; cloudflared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Extract OTP Codes
&lt;/h2&gt;

&lt;p&gt;Testing two-factor auth? &lt;a href="https://cli.nylas.com/docs/commands/workflow-otp-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas workflow otp list&lt;/code&gt;&lt;/a&gt; extracts one-time passwords:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas workflow otp list &lt;span class="nt"&gt;--limit&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  List All Test Inboxes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/inbound-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas inbound list&lt;/code&gt;&lt;/a&gt; shows your managed addresses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas inbound list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Not MailHog?
&lt;/h2&gt;

&lt;p&gt;MailHog intercepts SMTP locally — your app must be configured to send through it. Nylas Inbound addresses receive email through real infrastructure. If it arrives here, it'll arrive in Gmail too.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI Integration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Nylas CLI&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;curl -fsSL https://cli.nylas.com/install.sh | bash&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run E2E tests&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;NYLAS_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.NYLAS_API_KEY }}&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;nylas auth config --api-key $NYLAS_API_KEY&lt;/span&gt;
    &lt;span class="s"&gt;npx playwright test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Webhook Testing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/webhook-test-send" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook test send&lt;/code&gt;&lt;/a&gt; fires test events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas webhook &lt;span class="nb"&gt;test &lt;/span&gt;send https://staging.myapp.com/hooks/email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/webhook-server" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook server&lt;/code&gt;&lt;/a&gt; starts a local receiver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas webhook server &lt;span class="nt"&gt;--port&lt;/span&gt; 4000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;All commands:&lt;/strong&gt; &lt;a href="https://cli.nylas.com/docs/commands" rel="noopener noreferrer"&gt;Nylas CLI Command Reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get started:&lt;/strong&gt; &lt;code&gt;brew install nylas/nylas-cli/nylas&lt;/code&gt; — &lt;a href="https://cli.nylas.com/guides/getting-started" rel="noopener noreferrer"&gt;other install methods&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>playwright</category>
      <category>email</category>
      <category>devops</category>
    </item>
    <item>
      <title>Build a Cross-Platform Communication Hub — Email, Slack, Contacts &amp; Webhooks from One CLI</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Fri, 10 Apr 2026 03:48:12 +0000</pubDate>
      <link>https://dev.to/qasim157/build-a-cross-platform-communication-hub-email-slack-contacts-webhooks-from-one-cli-1ik9</link>
      <guid>https://dev.to/qasim157/build-a-cross-platform-communication-hub-email-slack-contacts-webhooks-from-one-cli-1ik9</guid>
      <description>&lt;p&gt;Your communication is scattered. Email in Gmail. Messages in Slack. Contacts in Outlook. Notifications via webhooks. Testing with throwaway inboxes. Managing all of this means switching between five different tools.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; unifies email, Slack, contacts, webhooks, and inbound email into a single command-line interface. Automate cross-platform workflows, build notification pipelines, and manage your entire communication stack from the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up Your Hub
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nylas/nylas-cli/nylas
nylas init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log into the Nylas Dashboard to manage apps and API keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas dashboard login &lt;span class="nt"&gt;--google&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/dashboard-login" rel="noopener noreferrer"&gt;&lt;code&gt;nylas dashboard login&lt;/code&gt;&lt;/a&gt; supports Google, Microsoft, and GitHub SSO. Check your session with &lt;a href="https://cli.nylas.com/docs/commands/dashboard-status" rel="noopener noreferrer"&gt;&lt;code&gt;nylas dashboard status&lt;/code&gt;&lt;/a&gt; and list apps with &lt;a href="https://cli.nylas.com/docs/commands/dashboard-apps-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas dashboard apps list&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Slack Integration
&lt;/h2&gt;

&lt;p&gt;Connect Slack by storing your bot token:&lt;/p&gt;

&lt;h3&gt;
  
  
  Authenticate
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/slack-auth-set" rel="noopener noreferrer"&gt;&lt;code&gt;nylas slack auth set&lt;/code&gt;&lt;/a&gt; stores your token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas slack auth &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--token&lt;/span&gt; xoxb-your-bot-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Browse Channels
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/slack-channels-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas slack channels list&lt;/code&gt;&lt;/a&gt; shows all channels you can access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas slack channels list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Read Messages
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/slack-messages-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas slack messages list&lt;/code&gt;&lt;/a&gt; shows recent messages in a channel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas slack messages list &lt;span class="nt"&gt;--channel&lt;/span&gt; general &lt;span class="nt"&gt;--limit&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Search Across Slack
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/slack-messages-search" rel="noopener noreferrer"&gt;&lt;code&gt;nylas slack messages search&lt;/code&gt;&lt;/a&gt; finds messages workspace-wide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas slack messages search &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"deploy production"&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Send Messages
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/slack-messages-send" rel="noopener noreferrer"&gt;&lt;code&gt;nylas slack messages send&lt;/code&gt;&lt;/a&gt; posts to any channel or DM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas slack messages send &lt;span class="nt"&gt;--channel&lt;/span&gt; deploys &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"v2.3.1 deployed to production"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update Your Status
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/slack-status-set" rel="noopener noreferrer"&gt;&lt;code&gt;nylas slack status set&lt;/code&gt;&lt;/a&gt; changes your status from the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas slack status &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"In a meeting"&lt;/span&gt; &lt;span class="nt"&gt;--emoji&lt;/span&gt; &lt;span class="s2"&gt;":calendar:"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Users
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/slack-users-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas slack users list&lt;/code&gt;&lt;/a&gt; shows workspace members:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas slack &lt;span class="nb"&gt;users &lt;/span&gt;list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contact Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List Contacts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/contacts-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas contacts list&lt;/code&gt;&lt;/a&gt; displays your address book:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas contacts list &lt;span class="nt"&gt;--limit&lt;/span&gt; 50 &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Search Contacts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/contacts-search" rel="noopener noreferrer"&gt;&lt;code&gt;nylas contacts search&lt;/code&gt;&lt;/a&gt; finds people by name or email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas contacts search &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"Sarah"&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  View Contact Details
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/contacts-show" rel="noopener noreferrer"&gt;&lt;code&gt;nylas contacts show&lt;/code&gt;&lt;/a&gt; shows everything — emails, phones, company, custom fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas contacts show &lt;span class="nt"&gt;--id&lt;/span&gt; contact_abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Contacts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/contacts-create" rel="noopener noreferrer"&gt;&lt;code&gt;nylas contacts create&lt;/code&gt;&lt;/a&gt; adds to your address book:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas contacts create &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Sarah Connor"&lt;/span&gt; &lt;span class="nt"&gt;--email&lt;/span&gt; &lt;span class="s2"&gt;"sarah@skynet.com"&lt;/span&gt; &lt;span class="nt"&gt;--company&lt;/span&gt; &lt;span class="s2"&gt;"Cyberdyne"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sync and Groups
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/contacts-sync" rel="noopener noreferrer"&gt;&lt;code&gt;nylas contacts sync&lt;/code&gt;&lt;/a&gt; refreshes the local cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas contacts &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/contacts-groups-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas contacts groups list&lt;/code&gt;&lt;/a&gt; shows contact groups (Google) or categories (Outlook):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas contacts &lt;span class="nb"&gt;groups &lt;/span&gt;list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Webhooks — Real-Time Notifications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a Webhook
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/webhook-create" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook create&lt;/code&gt;&lt;/a&gt; registers a URL for real-time events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas webhook create &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.myapp.com/hooks/email &lt;span class="nt"&gt;--triggers&lt;/span&gt; message.created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Webhooks
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/webhook-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook list&lt;/code&gt;&lt;/a&gt; shows all registered hooks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas webhook list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manage Webhooks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/webhook-update" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook update&lt;/code&gt;&lt;/a&gt; — change URL or triggers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/webhook-delete" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook delete&lt;/code&gt;&lt;/a&gt; — remove a webhook&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/webhook-triggers" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook triggers&lt;/code&gt;&lt;/a&gt; — list all available trigger types&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Test and Debug
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/webhook-test-send" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook test send&lt;/code&gt;&lt;/a&gt; fires a test event to verify your endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas webhook &lt;span class="nb"&gt;test &lt;/span&gt;send https://api.myapp.com/hooks/email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/webhook-server" rel="noopener noreferrer"&gt;&lt;code&gt;nylas webhook server&lt;/code&gt;&lt;/a&gt; starts a local HTTP server for development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas webhook server &lt;span class="nt"&gt;--port&lt;/span&gt; 4000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Inbound Email — Receive Without a Mail Server
&lt;/h2&gt;

&lt;p&gt;Need to receive email for testing or automation? Inbound gives you managed addresses — no MX records, no mail server, no OAuth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create an Inbox
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/inbound-create" rel="noopener noreferrer"&gt;&lt;code&gt;nylas inbound create&lt;/code&gt;&lt;/a&gt; provisions a new address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas inbound create test-runner
&lt;span class="c"&gt;# → test-runner@yourapp.nylas.email&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Inboxes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/inbound-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas inbound list&lt;/code&gt;&lt;/a&gt; shows all your managed addresses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas inbound list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Read Received Messages
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/inbound-messages" rel="noopener noreferrer"&gt;&lt;code&gt;nylas inbound messages&lt;/code&gt;&lt;/a&gt; lists messages in an inbox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas inbound messages inbox_abc123 &lt;span class="nt"&gt;--unread&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Monitor in Real Time
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/inbound-monitor" rel="noopener noreferrer"&gt;&lt;code&gt;nylas inbound monitor&lt;/code&gt;&lt;/a&gt; streams new messages as they arrive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas inbound monitor inbox_abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extract OTP Codes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/workflow-otp-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas workflow otp list&lt;/code&gt;&lt;/a&gt; scans emails for one-time passwords — useful for automated testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas workflow otp list &lt;span class="nt"&gt;--limit&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Putting It Together: Cross-Platform Alert Pipeline
&lt;/h2&gt;

&lt;p&gt;Here's a real workflow — when a webhook fires, email the team and post to Slack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Triggered by webhook server&lt;/span&gt;
&lt;span class="nv"&gt;EVENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Email the team&lt;/span&gt;
nylas email send &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--to&lt;/span&gt; team@company.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subject&lt;/span&gt; &lt;span class="s2"&gt;"Alert: &lt;/span&gt;&lt;span class="nv"&gt;$EVENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"A new event was triggered. Check the dashboard."&lt;/span&gt; &lt;span class="nt"&gt;--yes&lt;/span&gt;

&lt;span class="c"&gt;# Post to Slack&lt;/span&gt;
nylas slack messages send &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--channel&lt;/span&gt; alerts &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;":rotating_light: &lt;/span&gt;&lt;span class="nv"&gt;$EVENT&lt;/span&gt;&lt;span class="s2"&gt; triggered — check email for details"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Full Command Reference
&lt;/h2&gt;

&lt;p&gt;Every Slack, contacts, webhook, and inbound command with complete documentation: &lt;a href="https://cli.nylas.com/docs/commands" rel="noopener noreferrer"&gt;Nylas CLI Command Reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>slack</category>
      <category>webhooks</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Track Every Action Your AI Agent Takes — Audit Logs, Auth Management &amp; Compliance for CLI Automation</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Fri, 10 Apr 2026 03:48:11 +0000</pubDate>
      <link>https://dev.to/qasim157/track-every-action-your-ai-agent-takes-audit-logs-auth-management-compliance-for-cli-automation-33de</link>
      <guid>https://dev.to/qasim157/track-every-action-your-ai-agent-takes-audit-logs-auth-management-compliance-for-cli-automation-33de</guid>
      <description>&lt;p&gt;Your AI agent just sent 47 emails. Which ones? To whom? At what time? If you can't answer those questions, you have an accountability gap.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; has built-in audit logging that records every command execution — timestamps, arguments, exit codes, and who invoked it (human or AI agent). Combined with granular auth management, you get full control over what your automation can access and a complete paper trail of what it did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Audit Logging Matters
&lt;/h2&gt;

&lt;p&gt;SOC 2 compliance requires logging access to customer data. AI agent safety requires tracking autonomous actions. CI/CD debugging requires knowing exactly what commands ran. The CLI's audit system handles all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up Audit Logging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initialize
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-init" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit init&lt;/code&gt;&lt;/a&gt; creates the log directory and default config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas audit init &lt;span class="nt"&gt;--enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure retention (default 90 days) and max file size (default 50 MB) during init, or set them later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable/Disable Logging
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-logs-enable" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit logs enable&lt;/code&gt;&lt;/a&gt; starts recording:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas audit logs &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-logs-disable" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit logs disable&lt;/code&gt;&lt;/a&gt; stops recording (existing logs are preserved):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas audit logs disable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-logs-status" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit logs status&lt;/code&gt;&lt;/a&gt; shows whether logging is active:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas audit logs status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  View Audit Logs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-logs-show" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit logs show&lt;/code&gt;&lt;/a&gt; displays recorded activity with powerful filters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# All recent activity&lt;/span&gt;
nylas audit logs show

&lt;span class="c"&gt;# Filter by date range&lt;/span&gt;
nylas audit logs show &lt;span class="nt"&gt;--since&lt;/span&gt; 2025-04-01 &lt;span class="nt"&gt;--until&lt;/span&gt; 2025-04-10

&lt;span class="c"&gt;# Filter by command&lt;/span&gt;
nylas audit logs show &lt;span class="nt"&gt;--command&lt;/span&gt; &lt;span class="s2"&gt;"email send"&lt;/span&gt;

&lt;span class="c"&gt;# Filter by invoker (who ran the command)&lt;/span&gt;
nylas audit logs show &lt;span class="nt"&gt;--invoker&lt;/span&gt; claude-code

&lt;span class="c"&gt;# Filter by source&lt;/span&gt;
nylas audit logs show &lt;span class="nt"&gt;--source&lt;/span&gt; mcp

&lt;span class="c"&gt;# Combine filters for targeted investigation&lt;/span&gt;
nylas audit logs show &lt;span class="nt"&gt;--invoker&lt;/span&gt; cursor &lt;span class="nt"&gt;--command&lt;/span&gt; &lt;span class="s2"&gt;"email send"&lt;/span&gt; &lt;span class="nt"&gt;--since&lt;/span&gt; 2025-04-08 &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--invoker&lt;/code&gt; filter distinguishes between &lt;code&gt;terminal&lt;/code&gt; (human), &lt;code&gt;claude-code&lt;/code&gt;, &lt;code&gt;cursor&lt;/code&gt;, and other AI agents. The &lt;code&gt;--source&lt;/code&gt; filter separates &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;mcp&lt;/code&gt;, and &lt;code&gt;sdk&lt;/code&gt; invocations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summarize Activity
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-logs-summary" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit logs summary&lt;/code&gt;&lt;/a&gt; aggregates stats:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas audit logs summary &lt;span class="nt"&gt;--days&lt;/span&gt; 30 &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output includes total commands run, error rates, most-used commands, top invokers (AI vs human), and busiest hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export for Compliance
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-export" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit export&lt;/code&gt;&lt;/a&gt; writes logs to JSON or CSV for external analysis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# JSON export&lt;/span&gt;
nylas audit &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; json &lt;span class="nt"&gt;-o&lt;/span&gt; audit-april.json

&lt;span class="c"&gt;# CSV for spreadsheet analysis&lt;/span&gt;
nylas audit &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; csv &lt;span class="nt"&gt;--since&lt;/span&gt; 2025-04-01 &lt;span class="nt"&gt;-o&lt;/span&gt; audit-april.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configure Audit Settings
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-config-show" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit config show&lt;/code&gt;&lt;/a&gt; displays current settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas audit config show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-config-set" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit config set&lt;/code&gt;&lt;/a&gt; changes individual settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas audit config &lt;span class="nb"&gt;set &lt;/span&gt;retention_days 180
nylas audit config &lt;span class="nb"&gt;set &lt;/span&gt;max_size_mb 100
nylas audit config &lt;span class="nb"&gt;set &lt;/span&gt;rotate_daily &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Clear Logs (Destructive)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/audit-logs-clear" rel="noopener noreferrer"&gt;&lt;code&gt;nylas audit logs clear&lt;/code&gt;&lt;/a&gt; permanently deletes all entries. Always export first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas audit &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; backup.json
nylas audit logs clear &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Authentication Management
&lt;/h2&gt;

&lt;p&gt;Audit logging shows you what happened. Auth management controls what &lt;em&gt;can&lt;/em&gt; happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure API Credentials
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/auth-config" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth config&lt;/code&gt;&lt;/a&gt; stores your API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas auth config &lt;span class="nt"&gt;--api-key&lt;/span&gt; nyl_abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Connect Accounts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/auth-login" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth login&lt;/code&gt;&lt;/a&gt; authenticates via OAuth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  View Connected Accounts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/auth-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth list&lt;/code&gt;&lt;/a&gt; shows all grants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas auth list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Current State
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/auth-whoami" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth whoami&lt;/code&gt;&lt;/a&gt; — which account is active&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/auth-status" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth status&lt;/code&gt;&lt;/a&gt; — is the token valid&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/auth-token" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth token&lt;/code&gt;&lt;/a&gt; — display the current token (for debugging)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/auth-scopes" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth scopes&lt;/code&gt;&lt;/a&gt; — what permissions are granted&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/auth-show" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth show&lt;/code&gt;&lt;/a&gt; — full details for a specific account&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/auth-providers" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth providers&lt;/code&gt;&lt;/a&gt; — list supported email providers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Switch Between Accounts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/auth-switch" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth switch&lt;/code&gt;&lt;/a&gt; changes the active account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas auth switch grant_abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove Access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/auth-logout" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth logout&lt;/code&gt;&lt;/a&gt; — disconnect from the current session&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/auth-remove" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth remove&lt;/code&gt;&lt;/a&gt; — permanently delete a grant and all cached tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migrate from v2
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/auth-migrate" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth migrate&lt;/code&gt;&lt;/a&gt; upgrades stored credentials from API v2 to v3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nuclear Option
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/config-reset" rel="noopener noreferrer"&gt;&lt;code&gt;nylas config reset&lt;/code&gt;&lt;/a&gt; clears everything — API keys, sessions, grants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas config reset &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Putting It Together: Secure AI Agent Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Initialize with audit logging&lt;/span&gt;
nylas init
nylas audit init &lt;span class="nt"&gt;--enable&lt;/span&gt;

&lt;span class="c"&gt;# 2. Connect only the accounts the agent needs&lt;/span&gt;
nylas auth login

&lt;span class="c"&gt;# 3. Verify least-privilege access&lt;/span&gt;
nylas auth scopes

&lt;span class="c"&gt;# 4. Let the agent work...&lt;/span&gt;

&lt;span class="c"&gt;# 5. Review what it did&lt;/span&gt;
nylas audit logs show &lt;span class="nt"&gt;--invoker&lt;/span&gt; claude-code &lt;span class="nt"&gt;--since&lt;/span&gt; today
nylas audit logs summary &lt;span class="nt"&gt;--days&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install the Nylas CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nylas/nylas-cli/nylas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See the &lt;a href="https://cli.nylas.com/guides/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt; for other install methods.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Command Reference
&lt;/h2&gt;

&lt;p&gt;All audit and auth commands with complete flag documentation: &lt;a href="https://cli.nylas.com/docs/commands" rel="noopener noreferrer"&gt;Nylas CLI Command Reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>security</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>Manage Google Calendar, Outlook &amp; Exchange from the Command Line — AI Scheduling Included</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Fri, 10 Apr 2026 03:48:09 +0000</pubDate>
      <link>https://dev.to/qasim157/manage-google-calendar-outlook-exchange-from-the-command-line-ai-scheduling-included-f12</link>
      <guid>https://dev.to/qasim157/manage-google-calendar-outlook-exchange-from-the-command-line-ai-scheduling-included-f12</guid>
      <description>&lt;p&gt;Managing calendars across Google, Outlook, and Exchange usually means three different UIs, three different APIs, and three sets of credentials. The &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; unifies them into one command-line interface — list events, create meetings, check availability, and let AI handle the scheduling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nylas/nylas-cli/nylas
nylas init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once authenticated, every calendar command works against Google Calendar, Outlook, Exchange, Yahoo, and iCloud identically.&lt;/p&gt;

&lt;h2&gt;
  
  
  List Your Calendars
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar list&lt;/code&gt;&lt;/a&gt; shows all calendars on your account — primary, shared, and subscribed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  View Upcoming Events
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-events-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar events list&lt;/code&gt;&lt;/a&gt; displays your schedule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Next 7 days (default)&lt;/span&gt;
nylas calendar events list

&lt;span class="c"&gt;# Next 30 days&lt;/span&gt;
nylas calendar events list &lt;span class="nt"&gt;--days&lt;/span&gt; 30

&lt;span class="c"&gt;# In a specific timezone&lt;/span&gt;
nylas calendar events list &lt;span class="nt"&gt;--days&lt;/span&gt; 7 &lt;span class="nt"&gt;--timezone&lt;/span&gt; America/New_York &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Inspect a Single Event
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-events-show" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar events show&lt;/code&gt;&lt;/a&gt; gives you every detail — attendees with RSVP status, recurrence rules, conferencing links:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar events show &lt;span class="nt"&gt;--id&lt;/span&gt; evt_abc123 &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create Events
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-events-create" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar events create&lt;/code&gt;&lt;/a&gt; adds events directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar events create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Sprint Review"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--start&lt;/span&gt; &lt;span class="s2"&gt;"2025-04-15T14:00:00"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--end&lt;/span&gt; &lt;span class="s2"&gt;"2025-04-15T15:00:00"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--participants&lt;/span&gt; &lt;span class="s2"&gt;"alice@co.com,bob@co.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s2"&gt;"Zoom"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Update and Delete Events
&lt;/h2&gt;

&lt;p&gt;Modify with &lt;a href="https://cli.nylas.com/docs/commands/calendar-events-update" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar events update&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar events update &lt;span class="nt"&gt;--id&lt;/span&gt; evt_abc123 &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Sprint Review (Moved)"&lt;/span&gt; &lt;span class="nt"&gt;--start&lt;/span&gt; &lt;span class="s2"&gt;"2025-04-16T14:00:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remove with &lt;a href="https://cli.nylas.com/docs/commands/calendar-events-delete" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar events delete&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar events delete &lt;span class="nt"&gt;--id&lt;/span&gt; evt_abc123 &lt;span class="nt"&gt;--notify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--notify&lt;/code&gt; flag sends cancellation emails to attendees.&lt;/p&gt;

&lt;h2&gt;
  
  
  RSVP from the Terminal
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-events-rsvp" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar events rsvp&lt;/code&gt;&lt;/a&gt; responds to invitations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar events rsvp &lt;span class="nt"&gt;--id&lt;/span&gt; evt_xyz789 &lt;span class="nt"&gt;--status&lt;/span&gt; &lt;span class="nb"&gt;yes
&lt;/span&gt;nylas calendar events rsvp &lt;span class="nt"&gt;--id&lt;/span&gt; evt_xyz789 &lt;span class="nt"&gt;--status&lt;/span&gt; maybe
nylas calendar events rsvp &lt;span class="nt"&gt;--id&lt;/span&gt; evt_xyz789 &lt;span class="nt"&gt;--status&lt;/span&gt; no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AI-Powered Scheduling
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. The CLI has built-in AI features that go beyond CRUD.&lt;/p&gt;

&lt;h3&gt;
  
  
  Natural Language Event Creation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-schedule-ai" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar schedule ai&lt;/code&gt;&lt;/a&gt; parses plain English:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar schedule ai &lt;span class="s2"&gt;"Team standup tomorrow at 9am for 15 minutes"&lt;/span&gt;
nylas calendar schedule ai &lt;span class="s2"&gt;"Lunch with Sarah next Friday at noon"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Find a Meeting Time
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-find-time" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar find-time&lt;/code&gt;&lt;/a&gt; queries everyone's availability and returns open slots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar find-time &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--participants&lt;/span&gt; &lt;span class="s2"&gt;"alice@co.com,bob@co.com,carol@co.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--duration&lt;/span&gt; 30 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--days&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Availability
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-availability-check" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar availability check&lt;/code&gt;&lt;/a&gt; shows free/busy windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar availability check &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--start&lt;/span&gt; &lt;span class="s2"&gt;"2025-04-15T09:00:00Z"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--end&lt;/span&gt; &lt;span class="s2"&gt;"2025-04-15T17:00:00Z"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--participants&lt;/span&gt; &lt;span class="s2"&gt;"alice@co.com,bob@co.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Detect Conflicts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-ai-conflicts" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar ai conflicts&lt;/code&gt;&lt;/a&gt; scans your calendar for double-bookings and tight back-to-back slots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar ai conflicts &lt;span class="nt"&gt;--days&lt;/span&gt; 14
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI flags hard conflicts (simultaneous events), soft conflicts (less than 15 minutes between meetings), and travel-time risks.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Rescheduling
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-ai-reschedule" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar ai reschedule&lt;/code&gt;&lt;/a&gt; suggests optimal alternative times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar ai reschedule &lt;span class="nt"&gt;--id&lt;/span&gt; evt_conflicting123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It analyzes participant availability and calendar density to propose 3 conflict-free alternatives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Calendar Analytics
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-analyze" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar analyze&lt;/code&gt;&lt;/a&gt; breaks down your meeting load:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas calendar analyze &lt;span class="nt"&gt;--days&lt;/span&gt; 30 &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output includes total meeting hours, busiest day of the week, average meeting duration, recurring vs one-off ratio, and focus-time gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timezone Tools (100% Offline)
&lt;/h2&gt;

&lt;p&gt;The CLI includes standalone timezone utilities that work without an API key or internet connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/timezone-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas timezone list&lt;/code&gt;&lt;/a&gt; — browse all IANA timezones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas timezone list &lt;span class="nt"&gt;--filter&lt;/span&gt; America
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/timezone-convert" rel="noopener noreferrer"&gt;&lt;code&gt;nylas timezone convert&lt;/code&gt;&lt;/a&gt; — convert between zones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas timezone convert &lt;span class="nt"&gt;--from&lt;/span&gt; &lt;span class="s2"&gt;"America/New_York"&lt;/span&gt; &lt;span class="nt"&gt;--to&lt;/span&gt; &lt;span class="s2"&gt;"Asia/Tokyo"&lt;/span&gt; &lt;span class="nt"&gt;--time&lt;/span&gt; &lt;span class="s2"&gt;"2025-04-15T09:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/timezone-find-meeting" rel="noopener noreferrer"&gt;&lt;code&gt;nylas timezone find-meeting&lt;/code&gt;&lt;/a&gt; — find overlapping work hours across zones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas timezone find-meeting &lt;span class="nt"&gt;--zones&lt;/span&gt; &lt;span class="s2"&gt;"America/New_York,Europe/London,Asia/Tokyo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/timezone-dst" rel="noopener noreferrer"&gt;&lt;code&gt;nylas timezone dst&lt;/code&gt;&lt;/a&gt; — check DST transitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas timezone dst &lt;span class="nt"&gt;--zone&lt;/span&gt; &lt;span class="s2"&gt;"America/New_York"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/timezone-info" rel="noopener noreferrer"&gt;&lt;code&gt;nylas timezone info&lt;/code&gt;&lt;/a&gt; — current offset and status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas timezone info &lt;span class="s2"&gt;"Europe/London"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Full Command Reference
&lt;/h2&gt;

&lt;p&gt;All calendar and timezone commands with full flag documentation: &lt;a href="https://cli.nylas.com/docs/commands" rel="noopener noreferrer"&gt;Nylas CLI Command Reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>calendar</category>
      <category>scheduling</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Give Your AI Coding Agent Email, Calendar &amp; Contacts — One CLI Command</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Fri, 10 Apr 2026 03:48:08 +0000</pubDate>
      <link>https://dev.to/qasim157/give-your-ai-coding-agent-email-calendar-contacts-one-cli-command-4l95</link>
      <guid>https://dev.to/qasim157/give-your-ai-coding-agent-email-calendar-contacts-one-cli-command-4l95</guid>
      <description>&lt;p&gt;Claude Code can't read your email. Cursor can't check your calendar. GitHub Copilot can't search your contacts. Until you give them access.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; connects AI assistants to your email, calendar, and contacts through the Model Context Protocol (MCP). One command. No API code. Your agent can then send emails, create events, search contacts, and manage your inbox on your behalf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP Matters for AI Agents
&lt;/h2&gt;

&lt;p&gt;MCP is an open standard that lets AI assistants call external tools. Instead of copy-pasting email content into Claude, the agent reads your inbox directly. Instead of describing a meeting, the agent creates it on your calendar.&lt;/p&gt;

&lt;p&gt;The Nylas CLI ships a built-in MCP server that exposes 50+ email, calendar, and contact operations as tools your agent can call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install and Authenticate
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nylas/nylas-cli/nylas
nylas init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/init" rel="noopener noreferrer"&gt;&lt;code&gt;nylas init&lt;/code&gt;&lt;/a&gt; handles account setup. For headless environments, use &lt;a href="https://cli.nylas.com/docs/commands/auth-config" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth config&lt;/code&gt;&lt;/a&gt; with an API key directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Connect Your AI Assistant
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/mcp-install" rel="noopener noreferrer"&gt;&lt;code&gt;nylas mcp install&lt;/code&gt;&lt;/a&gt; writes the MCP configuration for your assistant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Interactive — pick your assistant&lt;/span&gt;
nylas mcp &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Direct — specify the assistant&lt;/span&gt;
nylas mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--assistant&lt;/span&gt; claude-code
nylas mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--assistant&lt;/span&gt; cursor
nylas mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--assistant&lt;/span&gt; windsurf

&lt;span class="c"&gt;# All detected assistants at once&lt;/span&gt;
nylas mcp &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Your agent now has email, calendar, and contacts tools.&lt;/p&gt;

&lt;p&gt;Check the installation with &lt;a href="https://cli.nylas.com/docs/commands/mcp-status" rel="noopener noreferrer"&gt;&lt;code&gt;nylas mcp status&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas mcp status
&lt;span class="c"&gt;# Shows which assistants are configured and server state&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Need to remove it later? &lt;a href="https://cli.nylas.com/docs/commands/mcp-uninstall" rel="noopener noreferrer"&gt;&lt;code&gt;nylas mcp uninstall&lt;/code&gt;&lt;/a&gt; cleans up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas mcp uninstall &lt;span class="nt"&gt;--assistant&lt;/span&gt; cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Start the MCP Server
&lt;/h2&gt;

&lt;p&gt;The server runs automatically when your assistant starts, but you can also start it manually with &lt;a href="https://cli.nylas.com/docs/commands/mcp-serve" rel="noopener noreferrer"&gt;&lt;code&gt;nylas mcp serve&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas mcp serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful for debugging — you can see every tool call your agent makes in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Your Agent Can Do Now
&lt;/h2&gt;

&lt;p&gt;Once connected, your AI assistant can:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read and search email:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Show me unread emails from the last 24 hours"
→ Agent calls nylas email list --unread --json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/email-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email list&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://cli.nylas.com/docs/commands/email-search" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email search&lt;/code&gt;&lt;/a&gt; are the most-used tools for AI agents that need inbox context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Send email on your behalf:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Reply to Sarah's email and accept the meeting"
→ Agent calls nylas email send --to sarah@... --subject "Re: ..." --body "..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/email-send" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email send&lt;/code&gt;&lt;/a&gt; with &lt;code&gt;--yes&lt;/code&gt; skips the confirmation prompt, which agents need for autonomous operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manage your calendar:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Schedule a 30-minute standup tomorrow at 9am with the team"
→ Agent calls nylas calendar events create --title "Standup" --start ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/calendar-events-create" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar events create&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://cli.nylas.com/docs/commands/calendar-events-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas calendar events list&lt;/code&gt;&lt;/a&gt; give agents full calendar access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search contacts:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Find Sarah's email address"
→ Agent calls nylas contacts list --json and searches
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/contacts-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas contacts list&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://cli.nylas.com/docs/commands/contacts-search" rel="noopener noreferrer"&gt;&lt;code&gt;nylas contacts search&lt;/code&gt;&lt;/a&gt; power contact lookups.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Chat Interface
&lt;/h2&gt;

&lt;p&gt;Don't want to use MCP? &lt;a href="https://cli.nylas.com/docs/commands/chat" rel="noopener noreferrer"&gt;&lt;code&gt;nylas chat&lt;/code&gt;&lt;/a&gt; launches a web-based AI chat that's already connected to your email and calendar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Default agent&lt;/span&gt;
nylas chat

&lt;span class="c"&gt;# Use Claude&lt;/span&gt;
nylas chat &lt;span class="nt"&gt;--agent&lt;/span&gt; claude

&lt;span class="c"&gt;# Use a local model via Ollama&lt;/span&gt;
nylas chat &lt;span class="nt"&gt;--agent&lt;/span&gt; ollama &lt;span class="nt"&gt;--model&lt;/span&gt; llama3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configure Your AI Provider
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/ai-config" rel="noopener noreferrer"&gt;&lt;code&gt;nylas ai config&lt;/code&gt;&lt;/a&gt; lets you choose between local models (Ollama, LM Studio) for privacy or cloud providers (OpenAI, Anthropic) for capability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas ai config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Other Ways to Interact
&lt;/h2&gt;

&lt;p&gt;The CLI offers three UI modes beyond the terminal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/tui" rel="noopener noreferrer"&gt;&lt;code&gt;nylas tui&lt;/code&gt;&lt;/a&gt; — interactive terminal UI with keyboard navigation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/ui" rel="noopener noreferrer"&gt;&lt;code&gt;nylas ui&lt;/code&gt;&lt;/a&gt; — web-based configuration dashboard&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/air" rel="noopener noreferrer"&gt;&lt;code&gt;nylas air&lt;/code&gt;&lt;/a&gt; — full email client in your browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security: Track What Your Agent Does
&lt;/h2&gt;

&lt;p&gt;When AI agents have email access, you need visibility. The Nylas CLI has built-in audit logging that records every command an agent executes. See the &lt;a href="https://cli.nylas.com/guides/audit-logging-for-ai-agents" rel="noopener noreferrer"&gt;audit logging guide&lt;/a&gt; for setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Command Reference
&lt;/h2&gt;

&lt;p&gt;Every MCP, email, calendar, and contacts command has a detailed reference page at the &lt;a href="https://cli.nylas.com/docs/commands" rel="noopener noreferrer"&gt;Nylas CLI Command Reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>cli</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Automate Your Entire Email Workflow from the Terminal — No SMTP, No Sendmail</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Fri, 10 Apr 2026 03:48:06 +0000</pubDate>
      <link>https://dev.to/qasim157/automate-your-entire-email-workflow-from-the-terminal-no-smtp-no-sendmail-5apo</link>
      <guid>https://dev.to/qasim157/automate-your-entire-email-workflow-from-the-terminal-no-smtp-no-sendmail-5apo</guid>
      <description>&lt;p&gt;You have a cron job that needs to send a report every morning. A CI pipeline that emails test results. An AI agent that triages your inbox. All of these need email — and all of them hate SMTP configuration.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; handles email through Gmail, Outlook, Exchange, Yahoo, iCloud, and IMAP from a single command-line interface. No SMTP server. No app passwords. No sendmail configuration. Here's how to build a complete email automation workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Get Set Up in 2 Minutes
&lt;/h2&gt;

&lt;p&gt;Install and authenticate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nylas/nylas-cli/nylas
nylas init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/init" rel="noopener noreferrer"&gt;&lt;code&gt;nylas init&lt;/code&gt;&lt;/a&gt; runs a 4-step wizard: account creation, app selection, API key generation, and email sync. For CI/CD, skip the wizard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas init &lt;span class="nt"&gt;--api-key&lt;/span&gt; nyl_abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Already have credentials? Use &lt;a href="https://cli.nylas.com/docs/commands/auth-config" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth config&lt;/code&gt;&lt;/a&gt; to store your API key, then &lt;a href="https://cli.nylas.com/docs/commands/auth-login" rel="noopener noreferrer"&gt;&lt;code&gt;nylas auth login&lt;/code&gt;&lt;/a&gt; to connect a mailbox via OAuth.&lt;/p&gt;

&lt;p&gt;Want to try it without connecting a real account? &lt;a href="https://cli.nylas.com/docs/commands/demo-email-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas demo email list&lt;/code&gt;&lt;/a&gt; shows sample data with zero configuration.&lt;/p&gt;

&lt;p&gt;Pro tip: run &lt;a href="https://cli.nylas.com/docs/commands/completion-bash" rel="noopener noreferrer"&gt;&lt;code&gt;nylas completion bash&lt;/code&gt;&lt;/a&gt; and pipe the output to your shell's completion directory — every flag and subcommand gets tab-completion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Read Your Inbox
&lt;/h2&gt;

&lt;p&gt;List recent messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas email list &lt;span class="nt"&gt;--limit&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/email-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email list&lt;/code&gt;&lt;/a&gt; supports filters that make automation practical:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Unread only&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--unread&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;

&lt;span class="c"&gt;# From a specific sender&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--from&lt;/span&gt; boss@company.com

&lt;span class="c"&gt;# Only messages with attachments&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--has-attachment&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; | jq &lt;span class="s1"&gt;'.[].subject'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read a specific message with &lt;a href="https://cli.nylas.com/docs/commands/email-read" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email read&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas email &lt;span class="nb"&gt;read &lt;/span&gt;msg_abc123 &lt;span class="nt"&gt;--raw&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the message is GPG-encrypted, add &lt;code&gt;--decrypt --verify&lt;/code&gt; to decrypt and verify the signature inline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Search Like You Mean It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/email-search" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email search&lt;/code&gt;&lt;/a&gt; queries across your entire mailbox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas email search &lt;span class="s2"&gt;"invoice"&lt;/span&gt; &lt;span class="nt"&gt;--after&lt;/span&gt; 2025-01-01 &lt;span class="nt"&gt;--limit&lt;/span&gt; 10 &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter by sender, date range, read status, or attachment presence. Pipe &lt;code&gt;--json&lt;/code&gt; output into &lt;code&gt;jq&lt;/code&gt; to extract exactly the fields you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Send Email — One Command
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/email-send" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email send&lt;/code&gt;&lt;/a&gt; handles plain sends, scheduled delivery, GPG encryption, and tracking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic send&lt;/span&gt;
nylas email send &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--to&lt;/span&gt; user@example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subject&lt;/span&gt; &lt;span class="s2"&gt;"Daily Report"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"See attached metrics."&lt;/span&gt; &lt;span class="nt"&gt;--yes&lt;/span&gt;

&lt;span class="c"&gt;# Schedule for 2 hours from now&lt;/span&gt;
nylas email send &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--to&lt;/span&gt; team@company.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subject&lt;/span&gt; &lt;span class="s2"&gt;"Reminder"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"Standup in 30 minutes"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--schedule&lt;/span&gt; 2h

&lt;span class="c"&gt;# GPG signed and encrypted&lt;/span&gt;
nylas email send &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--to&lt;/span&gt; legal@partner.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subject&lt;/span&gt; &lt;span class="s2"&gt;"Contract v2"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"Attached."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sign&lt;/span&gt; &lt;span class="nt"&gt;--encrypt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check what's queued with &lt;a href="https://cli.nylas.com/docs/commands/email-scheduled-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email scheduled list&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Let AI Write Your Emails
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com/docs/commands/email-smart-compose" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email smart-compose&lt;/code&gt;&lt;/a&gt; generates drafts from natural language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas email smart-compose &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"Decline the meeting politely, suggest next week"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--to&lt;/span&gt; manager@company.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass &lt;code&gt;--thread-id&lt;/code&gt; to give the AI context from an existing conversation.&lt;/p&gt;

&lt;p&gt;For inbox analysis, &lt;a href="https://cli.nylas.com/docs/commands/email-ai-analyze" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email ai analyze&lt;/code&gt;&lt;/a&gt; extracts sentiment, action items, and summaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nylas email ai analyze &lt;span class="nt"&gt;--id&lt;/span&gt; msg_abc123 &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"What action items are in this email?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Manage Messages at Scale
&lt;/h2&gt;

&lt;p&gt;Batch operations from shell scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mark all unread as read&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--unread&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].id'&lt;/span&gt; | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;nylas email mark &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Star important messages&lt;/span&gt;
nylas email mark starred &lt;span class="nt"&gt;--id&lt;/span&gt; msg_xyz789
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other management commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-delete" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email delete&lt;/code&gt;&lt;/a&gt; — remove a message&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-drafts-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email drafts list&lt;/code&gt;&lt;/a&gt; — view saved drafts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-folders-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email folders list&lt;/code&gt;&lt;/a&gt; — list Gmail labels and Outlook folders&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-threads-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email threads list&lt;/code&gt;&lt;/a&gt; — view conversation threads&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-attachments-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email attachments list&lt;/code&gt;&lt;/a&gt; — inspect attachments on a message&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-metadata-show" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email metadata show&lt;/code&gt;&lt;/a&gt; — debug headers and Message-ID&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-templates-list" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email templates list&lt;/code&gt;&lt;/a&gt; — reuse saved templates&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-mark-read" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email mark read&lt;/code&gt;&lt;/a&gt; — set the read flag&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cli.nylas.com/docs/commands/email-mark-starred" rel="noopener noreferrer"&gt;&lt;code&gt;nylas email mark starred&lt;/code&gt;&lt;/a&gt; — star/flag a message&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Putting It Together: A Cron Job
&lt;/h2&gt;

&lt;p&gt;Here's a real example — a daily script that emails you a summary of unread messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;COUNT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;nylas email list &lt;span class="nt"&gt;--unread&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; | jq length&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;SUBJECTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;nylas email list &lt;span class="nt"&gt;--unread&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 5 | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].subject'&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

nylas email send &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--to&lt;/span&gt; me@company.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subject&lt;/span&gt; &lt;span class="s2"&gt;"Inbox Summary: &lt;/span&gt;&lt;span class="nv"&gt;$COUNT&lt;/span&gt;&lt;span class="s2"&gt; unread"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"Top 5 subjects:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="nv"&gt;$SUBJECTS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add it to crontab: &lt;code&gt;0 8 * * * /path/to/inbox-summary.sh&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Command Reference
&lt;/h2&gt;

&lt;p&gt;Every command shown here has a detailed reference page with all flags, examples, and troubleshooting at the &lt;a href="https://cli.nylas.com/docs/commands" rel="noopener noreferrer"&gt;Nylas CLI Command Reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>email</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Sync Contacts Across Gmail and Outlook with OpenClaw</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Mon, 06 Apr 2026 00:39:13 +0000</pubDate>
      <link>https://dev.to/qasim157/sync-contacts-across-gmail-and-outlook-with-openclaw-14f8</link>
      <guid>https://dev.to/qasim157/sync-contacts-across-gmail-and-outlook-with-openclaw-14f8</guid>
      <description>&lt;p&gt;You use Gmail for personal stuff and Outlook for work. Someone emails your personal address about a project. You know their name but not their work email. You open Outlook contacts — they're not there. You open Gmail contacts — found them, but now you need to copy the address and switch back.&lt;/p&gt;

&lt;p&gt;Your OpenClaw agent can search both accounts at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll build
&lt;/h2&gt;

&lt;p&gt;An agent workflow that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Searches contacts across multiple email accounts simultaneously&lt;/li&gt;
&lt;li&gt;Finds the right person regardless of which account knows them&lt;/li&gt;
&lt;li&gt;Pulls contact details — email, phone, company, title&lt;/li&gt;
&lt;li&gt;Uses that information in follow-up actions (send email, schedule meeting)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No exporting CSVs. No switching between Google Contacts and Outlook People. One question, one answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You need the Nylas plugin with at least two connected accounts. If you followed &lt;a href="https://dev.to/qasim157/the-nylas-plugin-for-openclaw-send-email-manage-calendar-search-contacts-511d"&gt;The Nylas Plugin for OpenClaw&lt;/a&gt;, you're most of the way there.&lt;/p&gt;

&lt;p&gt;Install (if you haven't already):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @nylas/openclaw-nylas-plugin
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.nylas.config.apiKey nyl_v0_your_key_here
openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure named grants for your accounts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.nylas.config.grants &lt;span class="s1"&gt;'{"work":"grant-id-1","personal":"grant-id-2"}'&lt;/span&gt;
openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find your grant IDs with &lt;code&gt;openclaw nylas discover&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Full setup: &lt;a href="https://cli.nylas.com/guides/install-openclaw-nylas-plugin" rel="noopener noreferrer"&gt;cli.nylas.com/guides/install-openclaw-nylas-plugin&lt;/a&gt;. New to the CLI? Start with the &lt;a href="https://cli.nylas.com/guides/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search contacts across accounts
&lt;/h2&gt;

&lt;p&gt;The simplest case — you need someone's email:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find the contact info for Sarah Chen."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_list_contacts&lt;/code&gt; on your default grant. But with multi-account configured, you can search everywhere:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Search for Sarah Chen across both my work and personal accounts."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent runs &lt;code&gt;nylas_list_contacts&lt;/code&gt; twice — once per grant — and merges the results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Email&lt;/th&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Phone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Work&lt;/td&gt;
&lt;td&gt;Sarah Chen&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:s.chen@bigcorp.com"&gt;s.chen@bigcorp.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;BigCorp&lt;/td&gt;
&lt;td&gt;+1-555-0142&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal&lt;/td&gt;
&lt;td&gt;Sarah Chen&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:sarah.chen@gmail.com"&gt;sarah.chen@gmail.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;+1-555-0142&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same person, two different email addresses. Now you know which one to use depending on the context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real workflows
&lt;/h2&gt;

&lt;p&gt;Contact lookup is rarely the end goal. It's usually the first step in something bigger. Here's where it gets useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find and email
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find Bob Martinez's work email and send him a message about the Q3 proposal."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calls &lt;code&gt;nylas_list_contacts&lt;/code&gt; with the search query&lt;/li&gt;
&lt;li&gt;Finds &lt;a href="mailto:bob.martinez@company.com"&gt;bob.martinez@company.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;nylas_send_email&lt;/code&gt; with the address it just found&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No need to look up the email separately. The agent connects the dots. For more on sending email, see the &lt;a href="https://cli.nylas.com/guides/send-email-from-terminal" rel="noopener noreferrer"&gt;send email guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find and schedule
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Look up everyone from the design team in my contacts and find a time we're all free next week."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calls &lt;code&gt;nylas_list_contacts&lt;/code&gt; searching for "design" in company/group fields&lt;/li&gt;
&lt;li&gt;Collects the email addresses&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;nylas_check_availability&lt;/code&gt; with all of them&lt;/li&gt;
&lt;li&gt;Reports back with open slots&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contact search → calendar availability → meeting creation, all in one conversation. (We covered the scheduling part in &lt;a href="https://dev.to/qasim157/automate-meeting-scheduling-with-openclaw-and-nylas-535f"&gt;Automate Meeting Scheduling&lt;/a&gt;.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Find and push to CRM
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find all contacts from BigCorp and export them to Salesforce."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent searches your contacts, collects the results, and you can pipe them into your CRM. The &lt;a href="https://cli.nylas.com/guides/export-email-to-salesforce" rel="noopener noreferrer"&gt;export email to Salesforce guide&lt;/a&gt; walks through the full integration. For HubSpot and Pipedrive workflows, see the &lt;a href="https://cli.nylas.com/guides/crm-email-workflows" rel="noopener noreferrer"&gt;CRM email workflows guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find duplicates
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Search for contacts named 'Johnson' across both accounts. Are there any duplicates?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent searches both grants, compares results by name and email, and flags matches:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Found 3 contacts named Johnson. Mike Johnson appears in both accounts — &lt;a href="mailto:mike.j@work.com"&gt;mike.j@work.com&lt;/a&gt; (work) and &lt;a href="mailto:mikej@gmail.com"&gt;mikej@gmail.com&lt;/a&gt; (personal). The other two are different people."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not a full dedup tool, but enough to spot the obvious overlaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What contacts data is available?
&lt;/h2&gt;

&lt;p&gt;The Nylas Contacts API returns structured fields for each contact:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Sarah Chen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email(s)&lt;/td&gt;
&lt;td&gt;
&lt;a href="mailto:s.chen@bigcorp.com"&gt;s.chen@bigcorp.com&lt;/a&gt;, &lt;a href="mailto:sarah@personal.com"&gt;sarah@personal.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phone(s)&lt;/td&gt;
&lt;td&gt;+1-555-0142 (mobile), +1-555-0100 (work)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company&lt;/td&gt;
&lt;td&gt;BigCorp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Engineering Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Address&lt;/td&gt;
&lt;td&gt;123 Main St, San Francisco, CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Groups&lt;/td&gt;
&lt;td&gt;Design Team, Project Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes&lt;/td&gt;
&lt;td&gt;Met at KubeCon 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The agent can access all of these. Ask for exactly what you need:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What company does &lt;a href="mailto:raj@example.com"&gt;raj@example.com&lt;/a&gt; work for?"&lt;/p&gt;

&lt;p&gt;"Give me the phone numbers for everyone in the 'Sales' group."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  When contacts aren't enough
&lt;/h2&gt;

&lt;p&gt;Sometimes the person you're looking for isn't in your contacts. They emailed you once, six months ago, and you never saved them.&lt;/p&gt;

&lt;p&gt;The agent can fall back to email search:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I need to reach someone named Park who emailed me about the API migration. Check my contacts first, then search my email if you don't find them."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Searches &lt;code&gt;nylas_list_contacts&lt;/code&gt; — no results&lt;/li&gt;
&lt;li&gt;Falls back to &lt;code&gt;nylas_list_emails&lt;/code&gt; searching for "Park" + "API migration"&lt;/li&gt;
&lt;li&gt;Finds the email thread and extracts the address: &lt;a href="mailto:j.park@vendor.io"&gt;j.park@vendor.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contacts and email working together. One tool picks up where the other leaves off. We covered email search workflows in more detail in the &lt;a href="https://dev.to/qasim157/build-an-email-triage-agent-that-actually-sends-replies-39lc"&gt;email triage post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer the terminal?
&lt;/h2&gt;

&lt;p&gt;If you'd rather search contacts from the command line without an agent, the &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; has you covered. The &lt;a href="https://cli.nylas.com/guides" rel="noopener noreferrer"&gt;guides&lt;/a&gt; walk through contact management and other workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Previous posts:&lt;/strong&gt; &lt;a href="https://dev.to/qasim157/the-nylas-plugin-for-openclaw-send-email-manage-calendar-search-contacts-511d"&gt;The Nylas Plugin for OpenClaw&lt;/a&gt; · &lt;a href="https://dev.to/qasim157/build-an-email-triage-agent-that-actually-sends-replies-39lc"&gt;Email Triage Agent&lt;/a&gt; · &lt;a href="https://dev.to/qasim157/automate-meeting-scheduling-with-openclaw-and-nylas-535f"&gt;Meeting Scheduling&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@nylas/openclaw-nylas-plugin" rel="noopener noreferrer"&gt;@nylas/openclaw-nylas-plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas CLI:&lt;/strong&gt; &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;cli.nylas.com&lt;/a&gt; — email, calendar &amp;amp; contacts from your terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas docs:&lt;/strong&gt; &lt;a href="https://developer.nylas.com/docs/v3/" rel="noopener noreferrer"&gt;developer.nylas.com/docs/v3&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Two accounts, one search, zero tab-switching. Your agent knows everyone you know.&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>nylas</category>
      <category>contacts</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Automate Meeting Scheduling with OpenClaw and Nylas</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Mon, 06 Apr 2026 00:37:39 +0000</pubDate>
      <link>https://dev.to/qasim157/automate-meeting-scheduling-with-openclaw-and-nylas-535f</link>
      <guid>https://dev.to/qasim157/automate-meeting-scheduling-with-openclaw-and-nylas-535f</guid>
      <description>&lt;p&gt;Scheduling a meeting sounds simple. Then you do it: check three people's availability, find a 30-minute slot that works for everyone, create the event, and send an email with the details. Four steps, three tabs, ten minutes gone.&lt;/p&gt;

&lt;p&gt;Your OpenClaw agent can do all four in one conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll build
&lt;/h2&gt;

&lt;p&gt;An agent workflow that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checks availability across multiple participants&lt;/li&gt;
&lt;li&gt;Finds the first open slot that works for everyone&lt;/li&gt;
&lt;li&gt;Creates the calendar event with attendees&lt;/li&gt;
&lt;li&gt;Sends a confirmation email with the meeting details&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One prompt. No tab-switching. No back-and-forth Slack messages asking "does 2pm work?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You need the Nylas plugin installed. If you followed &lt;a href="https://dev.to/qasim157/the-nylas-plugin-for-openclaw-send-email-manage-calendar-search-contacts-511d"&gt;The Nylas Plugin for OpenClaw&lt;/a&gt;, you're set.&lt;/p&gt;

&lt;p&gt;If not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @nylas/openclaw-nylas-plugin
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.nylas.config.apiKey nyl_v0_your_key_here
openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full setup: &lt;a href="https://cli.nylas.com/guides/install-openclaw-nylas-plugin" rel="noopener noreferrer"&gt;cli.nylas.com/guides/install-openclaw-nylas-plugin&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Check availability
&lt;/h2&gt;

&lt;p&gt;Start with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Check if Alice, Bob, and I are all free this Thursday between 9am and 5pm."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_check_availability&lt;/code&gt; with the participant emails and time window. It returns free/busy blocks for each person:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;You&lt;/th&gt;
&lt;th&gt;Alice&lt;/th&gt;
&lt;th&gt;Bob&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9:00–10:00&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Busy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:00–11:00&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Busy&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11:00–12:00&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:00–1:00&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Busy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Busy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:00–2:00&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2:00–3:00&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Busy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Busy&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:00–4:00&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:00–5:00&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Busy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three open slots: 11am, 1pm, and 3pm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Pick a slot
&lt;/h2&gt;

&lt;p&gt;The agent already knows the open slots. Ask it to choose:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Book the earliest available slot for a 30-minute meeting."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or be specific:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use the 1pm slot — mornings are for deep work."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent picks 1:00–1:30pm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Create the event
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create the meeting. Title it 'Sprint Planning'. Add a Google Meet link."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_create_event&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title:&lt;/strong&gt; Sprint Planning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When:&lt;/strong&gt; Thursday 1:00–1:30pm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attendees:&lt;/strong&gt; &lt;a href="mailto:alice@company.com"&gt;alice@company.com&lt;/a&gt;, &lt;a href="mailto:bob@company.com"&gt;bob@company.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conferencing:&lt;/strong&gt; Google Meet link auto-generated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The event appears on all three calendars. Attendees get the standard calendar invite notification. For more on managing calendar events, see the &lt;a href="https://cli.nylas.com/guides/manage-calendar-from-terminal" rel="noopener noreferrer"&gt;calendar management guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Send a heads-up email
&lt;/h2&gt;

&lt;p&gt;Calendar invites are easy to miss. A quick email helps:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Send Alice and Bob an email confirming the meeting. Include the time, Meet link, and ask them to add agenda items to the doc."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_send_email&lt;/code&gt; with the details from the event it just created. No copy-pasting the Meet link or double-checking the time — the agent already has the context. See the &lt;a href="https://cli.nylas.com/guides/send-email-from-terminal" rel="noopener noreferrer"&gt;send email guide&lt;/a&gt; for more on email workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The single-prompt version
&lt;/h2&gt;

&lt;p&gt;Once you've done this a few times, compress it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find a 30-minute slot this week where Alice, Bob, and I are all free. Book it as 'Sprint Planning' with a Google Meet link. Email everyone with the details."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent chains: availability check → slot selection → event creation → email confirmation. You approve once and it's done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling conflicts
&lt;/h2&gt;

&lt;p&gt;Real calendars are messy. Here's how the agent handles common problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No open slots this week:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"No overlapping free time this week. Want me to check next week, or should I find the slot where only one person has a conflict?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Timezone mismatches:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Alice is in London (GMT+1). The 1pm slot for you is 6pm for her. Still want to book it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The plugin uses your configured timezone and converts automatically. Set it once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.nylas.config.defaultTimezone America/New_York
openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Recurring meetings:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Make this a weekly recurring meeting, same time every Thursday."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent passes the recurrence rule to &lt;code&gt;nylas_create_event&lt;/code&gt;. One command sets up the series. If you're working with Google Calendar specifically, the &lt;a href="https://cli.nylas.com/guides/manage-google-calendar" rel="noopener noreferrer"&gt;Google Calendar guide&lt;/a&gt; covers provider-specific details. For Outlook users, the &lt;a href="https://cli.nylas.com/guides/manage-outlook-calendar-cli" rel="noopener noreferrer"&gt;Outlook calendar guide&lt;/a&gt; handles the Microsoft-specific quirks. And if you're on Exchange, the &lt;a href="https://cli.nylas.com/guides/manage-exchange-calendar-cli" rel="noopener noreferrer"&gt;Exchange calendar guide&lt;/a&gt; covers on-prem setups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this beats Calendly
&lt;/h2&gt;

&lt;p&gt;Calendly and similar tools work great for external scheduling — someone picks a slot from your public availability page. But for internal meetings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don't need a booking page for a 1:1 with your teammate&lt;/li&gt;
&lt;li&gt;Calendly can't check other people's calendars (only yours)&lt;/li&gt;
&lt;li&gt;It can't send a custom follow-up email with agenda items&lt;/li&gt;
&lt;li&gt;It can't adjust based on context ("avoid mornings" or "prefer after standup")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent sees everyone's calendar at once, understands your preferences, and handles the follow-up. It's scheduling with context, not just availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going further
&lt;/h2&gt;

&lt;p&gt;Layer in more context from the plugin's other tools:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Before booking, check my email for any messages from Alice about rescheduling."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_list_emails&lt;/code&gt; to search for recent messages from Alice, finds one saying "Can we push to Friday?", and adjusts the search window. Email + calendar + contacts working together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer the terminal?
&lt;/h2&gt;

&lt;p&gt;If you'd rather manage calendar events directly from the command line, the &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; handles it. The &lt;a href="https://cli.nylas.com/guides/manage-calendar-from-terminal" rel="noopener noreferrer"&gt;calendar management guide&lt;/a&gt; walks through creating events, checking availability, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Previous posts:&lt;/strong&gt; &lt;a href="https://dev.to/qasim157/the-nylas-plugin-for-openclaw-send-email-manage-calendar-search-contacts-511d"&gt;The Nylas Plugin for OpenClaw&lt;/a&gt; · &lt;a href="https://dev.to/qasim157/build-an-email-triage-agent-that-actually-sends-replies-39lc"&gt;Email Triage Agent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@nylas/openclaw-nylas-plugin" rel="noopener noreferrer"&gt;@nylas/openclaw-nylas-plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas CLI:&lt;/strong&gt; &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;cli.nylas.com&lt;/a&gt; — email, calendar &amp;amp; contacts from your terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas docs:&lt;/strong&gt; &lt;a href="https://developer.nylas.com/docs/v3/" rel="noopener noreferrer"&gt;developer.nylas.com/docs/v3&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Four steps, one conversation, zero tab-switching. Your agent just became your scheduling assistant.&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>nylas</category>
      <category>calendar</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Build an Email Triage Agent that Actually Sends Replies</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Mon, 06 Apr 2026 00:33:04 +0000</pubDate>
      <link>https://dev.to/qasim157/build-an-email-triage-agent-that-actually-sends-replies-39lc</link>
      <guid>https://dev.to/qasim157/build-an-email-triage-agent-that-actually-sends-replies-39lc</guid>
      <description>&lt;p&gt;Most email triage demos stop at classification. They read your inbox, sort messages into buckets, and call it done. You still have to write the replies yourself.&lt;/p&gt;

&lt;p&gt;Let's build one that closes the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll build
&lt;/h2&gt;

&lt;p&gt;An OpenClaw agent workflow that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pulls your unread emails&lt;/li&gt;
&lt;li&gt;Classifies each one (urgent, needs reply, FYI, spam)&lt;/li&gt;
&lt;li&gt;Drafts replies for the "needs reply" bucket&lt;/li&gt;
&lt;li&gt;Shows you the drafts for approval before sending&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No copy-pasting between tabs. No context-switching. The agent reads, thinks, writes, and waits for your go-ahead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You need the Nylas plugin installed. If you followed &lt;a href="https://dev.to/qasim157/the-nylas-plugin-for-openclaw-send-email-manage-calendar-search-contacts-511d"&gt;The Nylas Plugin for OpenClaw&lt;/a&gt;, you're already set.&lt;/p&gt;

&lt;p&gt;If not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @nylas/openclaw-nylas-plugin
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.nylas.config.apiKey nyl_v0_your_key_here
openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full setup: &lt;a href="https://cli.nylas.com/guides/install-openclaw-nylas-plugin" rel="noopener noreferrer"&gt;cli.nylas.com/guides/install-openclaw-nylas-plugin&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Pull unread emails
&lt;/h2&gt;

&lt;p&gt;Start by asking your agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me my unread emails from today."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_list_emails&lt;/code&gt; with &lt;code&gt;{ unread: true }&lt;/code&gt; and returns a summary — sender, subject, and a preview of each message.&lt;/p&gt;

&lt;p&gt;A typical Monday morning might look like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;From&lt;/th&gt;
&lt;th&gt;Subject&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:boss@company.com"&gt;boss@company.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Q3 planning — need your input by EOD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:ci@github.com"&gt;ci@github.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Build failed on main&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:vendor@saas.io"&gt;vendor@saas.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Your invoice is ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:newsletter@techblog.com"&gt;newsletter@techblog.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;This week in distributed systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:alice@company.com"&gt;alice@company.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Can you review my PR?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five emails. Three need a reply. One is informational. One is noise.&lt;/p&gt;

&lt;p&gt;The same search capabilities work for automated workflows too — like &lt;a href="https://cli.nylas.com/guides/extract-otp-codes-from-email" rel="noopener noreferrer"&gt;extracting OTP codes from email&lt;/a&gt; for test automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Classify
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Classify these emails: urgent, needs-reply, fyi, or skip."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent reads the full body of each message (calling &lt;code&gt;nylas_get_email&lt;/code&gt; for each) and categorizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Urgent:&lt;/strong&gt; #1 (boss, deadline today)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Needs reply:&lt;/strong&gt; #2 (CI failure, team needs to know you're on it), #5 (PR review request)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FYI:&lt;/strong&gt; #3 (invoice, no action needed right now)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skip:&lt;/strong&gt; #4 (newsletter)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No rules engine. No regex. The agent reads context the way you would.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Draft replies
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Draft replies for the urgent and needs-reply emails. Keep them short."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_create_draft&lt;/code&gt; for each one. For more on how sending works under the hood, see the &lt;a href="https://cli.nylas.com/guides/send-email-from-terminal" rel="noopener noreferrer"&gt;send email guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To &lt;a href="mailto:boss@company.com"&gt;boss@company.com&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Got it — I'll have my section ready by 4pm. Want me to drop it in the shared doc or send it over email?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;To &lt;a href="mailto:ci@github.com"&gt;ci@github.com&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Looking into the build failure now. Likely the config change from yesterday — I'll push a fix within the hour."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;To &lt;a href="mailto:alice@company.com"&gt;alice@company.com&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'll review your PR this afternoon. Anything specific you want me to focus on?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The drafts sit in your Drafts folder. Nothing has been sent yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Review and send
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me the drafts you just created."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent lists the drafts. You read them, maybe tweak the wording:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Change the reply to Alice — say I'll look at it after lunch, not this afternoon."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent updates the draft. When you're satisfied:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Send all three drafts."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_send_email&lt;/code&gt; for each one. Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it a daily habit
&lt;/h2&gt;

&lt;p&gt;Once you trust the workflow, you can compress it into a single prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Check my unread emails. Classify them. Draft short replies for anything urgent or that needs a response. Show me the drafts before sending."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent chains all four steps: list → classify → draft → present. You review once, approve once, and move on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why drafts matter
&lt;/h2&gt;

&lt;p&gt;Skipping the draft step is tempting. Don't. Here's what goes wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent misreads tone. A blunt reply to your boss's email lands badly.&lt;/li&gt;
&lt;li&gt;The agent hallucinates a commitment. "I'll have it done by noon" when you meant end of day.&lt;/li&gt;
&lt;li&gt;The agent replies-all to something that should've been a DM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drafts are the safety net. The agent does the heavy lifting; you keep the final say. If you're building your own triage agent in Python, the &lt;a href="https://cli.nylas.com/guides/ai-email-triage-agent" rel="noopener noreferrer"&gt;AI email triage guide&lt;/a&gt; covers the implementation details. For a deeper dive into the architecture, see &lt;a href="https://cli.nylas.com/guides/build-ai-email-triage-agent" rel="noopener noreferrer"&gt;building an AI email triage agent&lt;/a&gt; with the CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond email: adding calendar context
&lt;/h2&gt;

&lt;p&gt;The plugin also has calendar tools. You can layer them in:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Before drafting the reply to my boss, check my calendar for today. If I have meetings until 3pm, adjust the timeline in the reply."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nylas_list_events&lt;/code&gt;, sees you're booked until 3pm, and drafts: "I'll have my section ready by 5pm" instead of 4pm. For more on calendar management, see the &lt;a href="https://cli.nylas.com/guides/manage-calendar-from-terminal" rel="noopener noreferrer"&gt;calendar guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is where single-tool agents fall apart. Email-only tools can't see your calendar. Calendar-only tools can't draft replies. The Nylas plugin gives your agent the full picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer the terminal?
&lt;/h2&gt;

&lt;p&gt;If you want to triage email without an agent — just you and the command line — the &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; gives you the same email, calendar, and contacts access from your terminal. The &lt;a href="https://cli.nylas.com/guides" rel="noopener noreferrer"&gt;guides&lt;/a&gt; walk through common workflows step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Previous post:&lt;/strong&gt; &lt;a href="https://dev.to/qasim157/the-nylas-plugin-for-openclaw-send-email-manage-calendar-search-contacts-511d"&gt;The Nylas Plugin for OpenClaw&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@nylas/openclaw-nylas-plugin" rel="noopener noreferrer"&gt;@nylas/openclaw-nylas-plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas CLI:&lt;/strong&gt; &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;cli.nylas.com&lt;/a&gt; — email, calendar &amp;amp; contacts from your terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas docs:&lt;/strong&gt; &lt;a href="https://developer.nylas.com/docs/v3/" rel="noopener noreferrer"&gt;developer.nylas.com/docs/v3&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Five unread emails. Three replies drafted, reviewed, and sent. Total time: under two minutes.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>automation</category>
      <category>openclaw</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Nylas Plugin for OpenClaw: Send Email, Manage Calendar, Search Contacts</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Mon, 06 Apr 2026 00:26:30 +0000</pubDate>
      <link>https://dev.to/qasim157/the-nylas-plugin-for-openclaw-send-email-manage-calendar-search-contacts-511d</link>
      <guid>https://dev.to/qasim157/the-nylas-plugin-for-openclaw-send-email-manage-calendar-search-contacts-511d</guid>
      <description>&lt;p&gt;Your OpenClaw agent can browse the web and write code. But it can't check your inbox, create a calendar event, or look up a contact.&lt;/p&gt;

&lt;p&gt;One plugin fixes that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll build
&lt;/h2&gt;

&lt;p&gt;By the end of this post, your OpenClaw agent will be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send and search emails (Gmail, Outlook, IMAP — any provider)&lt;/li&gt;
&lt;li&gt;Create, update, and delete calendar events&lt;/li&gt;
&lt;li&gt;Search contacts across connected accounts&lt;/li&gt;
&lt;li&gt;Switch between multiple email accounts by name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No SMTP config. No OAuth dance. No provider-specific code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://dashboard-v3.nylas.com" rel="noopener noreferrer"&gt;dashboard-v3.nylas.com&lt;/a&gt; and create an API key&lt;/li&gt;
&lt;li&gt;Connect at least one email account under Grants → Add Account&lt;/li&gt;
&lt;li&gt;Install the plugin:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @nylas/openclaw-nylas-plugin
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.nylas.config.apiKey nyl_v0_your_key_here
openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verify: &lt;code&gt;openclaw nylas status&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;New to the Nylas CLI? The &lt;a href="https://cli.nylas.com/guides/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt; walks through installation and first-time setup. Full plugin setup with troubleshooting: &lt;a href="https://cli.nylas.com/guides/install-openclaw-nylas-plugin" rel="noopener noreferrer"&gt;cli.nylas.com/guides/install-openclaw-nylas-plugin&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;Once installed, you talk to your agent naturally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Send an email
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Send an email to &lt;a href="mailto:alice@example.com"&gt;alice@example.com&lt;/a&gt; with the subject 'Meeting tomorrow' and ask if 2pm works."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Behind the scenes, the plugin calls &lt;code&gt;nylas_send_email&lt;/code&gt; — your agent never touches SMTP. For a deeper look at sending email from the command line, see the &lt;a href="https://cli.nylas.com/guides/send-email-from-terminal" rel="noopener noreferrer"&gt;send email guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search your inbox
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find all unread emails from the engineering team in the last 3 days."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The plugin uses &lt;code&gt;nylas_list_emails&lt;/code&gt; with folder, sender, date, and unread filters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a calendar event
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a 30-minute meeting called 'Design Review' tomorrow at 2pm with &lt;a href="mailto:alice@example.com"&gt;alice@example.com&lt;/a&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The plugin calls &lt;code&gt;nylas_create_event&lt;/code&gt; with attendees, time, and duration. It handles timezone conversion using your configured timezone (defaults to UTC). See the &lt;a href="https://cli.nylas.com/guides/manage-calendar-from-terminal" rel="noopener noreferrer"&gt;calendar management guide&lt;/a&gt; for more on managing events.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check availability
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Am I free Thursday between 10am and 4pm?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;nylas_check_availability&lt;/code&gt; queries your calendar and returns open slots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Record a meeting
&lt;/h3&gt;

&lt;p&gt;The plugin handles calendar events, but you can also &lt;a href="https://cli.nylas.com/guides/record-meetings-from-terminal" rel="noopener noreferrer"&gt;record meetings directly from the terminal&lt;/a&gt; — capture Zoom, Google Meet, and Teams calls without leaving the command line.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search contacts
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find the email address for someone named Chen at Acme Corp."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;nylas_list_contacts&lt;/code&gt; searches across all connected accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prefer the terminal over agents?
&lt;/h3&gt;

&lt;p&gt;If you want email, calendar, and contacts directly from the command line (no agent required), check out the &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt;. Same Nylas API, terminal-native interface. The &lt;a href="https://cli.nylas.com/guides" rel="noopener noreferrer"&gt;guides&lt;/a&gt; cover everything from &lt;a href="https://cli.nylas.com/guides/send-email-from-terminal" rel="noopener noreferrer"&gt;sending your first email&lt;/a&gt; to &lt;a href="https://cli.nylas.com/guides/manage-google-calendar" rel="noopener noreferrer"&gt;managing Google Calendar&lt;/a&gt; from the shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple accounts
&lt;/h2&gt;

&lt;p&gt;If your API key has multiple grants (work Gmail + personal Outlook), the plugin handles it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.nylas.config.grants &lt;span class="s1"&gt;'{"work":"grant-id-1","personal":"grant-id-2"}'&lt;/span&gt;
openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then tell your agent which account to use:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Send this from my work account."&lt;br&gt;
"Check my personal calendar for Friday."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The plugin resolves the grant by name.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's under the hood
&lt;/h2&gt;

&lt;p&gt;The plugin exposes 16 tools to your agent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;list, get, send, draft, threads, folders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calendar&lt;/td&gt;
&lt;td&gt;list calendars, list/get/create/update/delete events, check availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contacts&lt;/td&gt;
&lt;td&gt;list, get&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;auto-discover grants&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All tools use the &lt;a href="https://developer.nylas.com/docs/v3/" rel="noopener noreferrer"&gt;Nylas API v3&lt;/a&gt; through the official Node SDK. The plugin auto-discovers your grant ID, client ID, and organization from just the API key — so there's nothing else to configure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standalone usage in your own projects
&lt;/h2&gt;

&lt;p&gt;Don't use OpenClaw? The package works as a regular npm module too:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createNylasClient&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="s2"&gt;@nylas/openclaw-nylas-plugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createNylasClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nyl_v0_your_key_here&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="c1"&gt;// Send an email&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;recipient@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello from code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;p&amp;gt;Sent with @nylas/openclaw-nylas-plugin&amp;lt;/p&amp;gt;&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="c1"&gt;// List recent emails&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listMessages&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// List calendar events&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listEvents&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;calendarId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@nylas/openclaw-nylas-plugin" rel="noopener noreferrer"&gt;@nylas/openclaw-nylas-plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas CLI:&lt;/strong&gt; &lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;cli.nylas.com&lt;/a&gt; — email, calendar &amp;amp; contacts from your terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas docs:&lt;/strong&gt; &lt;a href="https://developer.nylas.com/docs/v3/" rel="noopener noreferrer"&gt;developer.nylas.com/docs/v3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nylas dashboard:&lt;/strong&gt; &lt;a href="https://dashboard-v3.nylas.com" rel="noopener noreferrer"&gt;dashboard-v3.nylas.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Three commands to install. Zero provider-specific config. Your agent now has an inbox.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>api</category>
      <category>openclaw</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Turn Your Inbox into CRM Intelligence — Export Email Data to Salesforce, HubSpot, and Pipedrive</title>
      <dc:creator>Qasim Muhammad</dc:creator>
      <pubDate>Thu, 02 Apr 2026 17:14:47 +0000</pubDate>
      <link>https://dev.to/qasim157/turn-your-inbox-into-crm-intelligence-export-email-data-to-salesforce-hubspot-and-pipedrive-kd8</link>
      <guid>https://dev.to/qasim157/turn-your-inbox-into-crm-intelligence-export-email-data-to-salesforce-hubspot-and-pipedrive-kd8</guid>
      <description>&lt;p&gt;Your CRM is only as good as the data in it. Most sales teams lose deals because contacts go stale, emails aren't logged, and relationship context lives in individual inboxes instead of the CRM.&lt;/p&gt;

&lt;p&gt;Manually copy-pasting email data into Salesforce, HubSpot, or Pipedrive doesn't scale. Native email sync features from CRM vendors are expensive add-ons. Building custom integrations against Gmail API or Microsoft Graph takes weeks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cli.nylas.com" rel="noopener noreferrer"&gt;Nylas CLI&lt;/a&gt; extracts structured email and contact data from any provider (Gmail, Outlook, Exchange, Yahoo, iCloud, IMAP) and exports it in formats every CRM can ingest — CSV for bulk import, JSON for API sync, or direct API calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install and authenticate
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nylas/nylas-cli/nylas
nylas auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full setup: &lt;a href="https://cli.nylas.com/guides/getting-started" rel="noopener noreferrer"&gt;Getting Started with Nylas CLI&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Extract contacts from your inbox
&lt;/h2&gt;

&lt;p&gt;Every email contains contact data. Pull it out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get all unique senders from recent emails&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 500 | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].from[0] | "\(.email),\(.name // "")"'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; contacts.csv

&lt;span class="c"&gt;# Get contacts with email frequency (who emails you most)&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 1000 | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].from[0].email'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; contact-frequency.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For advanced contact enrichment from email signatures: &lt;a href="https://cli.nylas.com/guides/enrich-contacts-from-email" rel="noopener noreferrer"&gt;Parse Email Signatures for Contact Enrichment&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Group emails by company domain
&lt;/h2&gt;

&lt;p&gt;Identify which organizations email you most:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Extract corporate domains (filter out freemail)&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 500 | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].from[0].email'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;@ &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-vE&lt;/span&gt; &lt;span class="s1"&gt;'gmail|yahoo|hotmail|outlook\.com'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/organize-emails-by-company" rel="noopener noreferrer"&gt;Group Inbox by Corporate Email Domain&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Export to Salesforce
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CSV import (bulk)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate Salesforce-compatible Lead CSV&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 500 | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].from[0] | [.name // "", .email, (.email | split("@")[1])] | @csv'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; salesforce-leads.csv

&lt;span class="c"&gt;# Add headers&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'1i\Name,Email,Company'&lt;/span&gt; salesforce-leads.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upload via Salesforce Data Import Wizard or Data Loader.&lt;/p&gt;

&lt;h3&gt;
  
  
  API sync (real-time)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="c1"&gt;# Fetch recent contacts from email
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nylas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;emails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Upsert to Salesforce
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://your-instance.salesforce.com/services/data/v58.0/sobjects/Lead/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SF_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LastName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Company&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/export-email-to-salesforce" rel="noopener noreferrer"&gt;Export Email Data to Salesforce&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Export to HubSpot
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Upsert contacts to HubSpot
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.hubapi.com/crm/v3/objects/contacts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;HUBSPOT_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;firstname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lastname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/export-email-to-hubspot" rel="noopener noreferrer"&gt;Export Email Data to HubSpot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Export to Pipedrive
&lt;/h2&gt;

&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/export-email-to-pipedrive" rel="noopener noreferrer"&gt;Export Email Data to Pipedrive&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Export to Zoho CRM
&lt;/h2&gt;

&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/export-email-to-zoho-crm" rel="noopener noreferrer"&gt;Export Email Data to Zoho CRM&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Export to Dynamics 365
&lt;/h2&gt;

&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/export-email-to-dynamics-365" rel="noopener noreferrer"&gt;Export Email Data to Dynamics 365&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Build org charts from CC patterns
&lt;/h2&gt;

&lt;p&gt;Who CCs whom reveals reporting lines. A manager is usually CC'd on reports from their team:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Extract CC relationships&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 500 | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[] | select(.cc != null) | 
    .from[0].email as $from | 
    .cc[].email as $cc | 
    "\($from) -&amp;gt; \($cc)"'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/contact-hierarchy-from-email" rel="noopener noreferrer"&gt;Reconstruct Org Charts from Email CC Patterns&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Score relationship strength
&lt;/h2&gt;

&lt;p&gt;Not all contacts are equal. Measure relationship strength by email frequency, response time, and recency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Emails per contact in the last 30 days&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--after&lt;/span&gt; &lt;span class="s2"&gt;"30 days ago"&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 1000 | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].from[0].email'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/map-organization-contacts" rel="noopener noreferrer"&gt;Visualize Communication Patterns Between Organizations&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automate outbound with mail merge
&lt;/h2&gt;

&lt;p&gt;Once your CRM data is enriched, send personalized outreach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bulk send from CSV&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;, &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; email name company&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;nylas email send &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--to&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--subject&lt;/span&gt; &lt;span class="s2"&gt;"Quick question about &lt;/span&gt;&lt;span class="nv"&gt;$company&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"Hi &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;, I noticed we've been exchanging emails..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--yes&lt;/span&gt;
  &lt;span class="nb"&gt;sleep &lt;/span&gt;2
&lt;span class="k"&gt;done&lt;/span&gt; &amp;lt; outreach-list.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/personalize-outbound-email-cli" rel="noopener noreferrer"&gt;CLI Mail Merge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For draft-based workflows with review steps: &lt;a href="https://cli.nylas.com/guides/auto-create-email-drafts" rel="noopener noreferrer"&gt;Automate Email Draft Creation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a fuzzy email autocomplete
&lt;/h2&gt;

&lt;p&gt;Speed up email composition with contact autocomplete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate a contact frequency list for autocomplete&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 2000 | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].from[0] | "\(.name // "") &amp;lt;\(.email)&amp;gt;"'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.email-contacts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/email-autocomplete-cli" rel="noopener noreferrer"&gt;Build Shell-Integrated Email Autocomplete&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Graph analysis with Neo4j
&lt;/h2&gt;

&lt;p&gt;For advanced relationship mapping, import email data into a graph database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Export sender-recipient pairs for Neo4j import&lt;/span&gt;
nylas email list &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 1000 | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[] | .from[0].email + "," + (.to[0].email // "unknown")'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; email-edges.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://cli.nylas.com/guides/import-email-graph-database" rel="noopener noreferrer"&gt;Model Email as a Graph: Neo4j and Network Analysis&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Works with any email provider
&lt;/h2&gt;

&lt;p&gt;All CRM workflows work across Gmail, Outlook, Exchange, Yahoo, iCloud, and IMAP. No provider-specific code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/list-gmail-emails" rel="noopener noreferrer"&gt;List Gmail Emails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/list-outlook-emails" rel="noopener noreferrer"&gt;List Outlook Emails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/list-exchange-emails" rel="noopener noreferrer"&gt;List Exchange Emails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/office365-email-powershell" rel="noopener noreferrer"&gt;Office 365 Email from PowerShell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full guide with company mapping, relationship scoring, and CRM sync patterns: &lt;a href="https://cli.nylas.com/guides/crm-email-workflows" rel="noopener noreferrer"&gt;CRM Email Workflows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Related guides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/send-email-from-terminal" rel="noopener noreferrer"&gt;Send Email from the Command Line&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/build-ai-email-triage-agent" rel="noopener noreferrer"&gt;Build an AI Email Triage Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/email-as-memory-for-ai-agents" rel="noopener noreferrer"&gt;Email as Memory for AI Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/give-ai-agent-email-address" rel="noopener noreferrer"&gt;Give Your AI Agent an Email Address&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/powershell-email-reports" rel="noopener noreferrer"&gt;Automated Email Reports with PowerShell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/best-cli-email-tools-compared" rel="noopener noreferrer"&gt;Best CLI Email Tools Compared&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.nylas.com/guides/secure-email-handling-cli" rel="noopener noreferrer"&gt;Secure Email Handling for CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All guides: &lt;a href="https://cli.nylas.com/guides" rel="noopener noreferrer"&gt;cli.nylas.com/guides&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>devops</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
