<?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: Corsair</title>
    <description>The latest articles on DEV Community by Corsair (@corsairdev).</description>
    <link>https://dev.to/corsairdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3902355%2F9c351fc1-c5ca-40ee-a035-44f6816eda6f.jpg</url>
      <title>DEV Community: Corsair</title>
      <link>https://dev.to/corsairdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/corsairdev"/>
    <language>en</language>
    <item>
      <title>Google OAuth 2.0 for Developers: Implementation, Security Best Practices, and Troubleshooting</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Fri, 04 Sep 2026 15:46:52 +0000</pubDate>
      <link>https://dev.to/corsairdev/google-oauth-20-for-developers-implementation-security-best-practices-and-troubleshooting-39pl</link>
      <guid>https://dev.to/corsairdev/google-oauth-20-for-developers-implementation-security-best-practices-and-troubleshooting-39pl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0j42iluo9nxwaesjmgl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0j42iluo9nxwaesjmgl0.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;Google OAuth 2.0 often looks simple at first: create credentials, redirect a user to Google, receive authorization, and start calling an API. The complexity appears when that flow has to work reliably for real users across multiple environments, sessions, permissions, and Google services.&lt;/p&gt;

&lt;p&gt;A production-ready Google OAuth implementation has to manage much more than the initial authorization screen. Developers need to configure redirect URIs correctly, request appropriate scopes, separate authentication from API authorization, store tokens securely, refresh credentials when they expire, handle sign-out behavior, and recover gracefully when authorization stops working.&lt;/p&gt;

&lt;p&gt;It is also important to understand that Google Sign-In and Google API authorization are related but different processes. One Tap and Sign In With Google establish who the user is and generally return an ID token. OAuth authorization determines what Google data your application can access and issues access tokens for Google APIs. Google explicitly separates these authentication and authorization flows in Google Identity Services.&lt;/p&gt;

&lt;p&gt;This guide walks through Google OAuth implementation from initial configuration to production security, One Tap, token management, common Google OAuth errors, and the choice between Firebase Authentication and Google Cloud Identity Platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Google OAuth 2.0: Credentials, Consent Screens, Redirect URIs, and Scopes
&lt;/h2&gt;

&lt;p&gt;Every Google OAuth implementation starts with a project in Google Cloud and an OAuth client that represents your application.&lt;/p&gt;

&lt;p&gt;For a typical web application, the authorization flow follows this sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your application sends the user to Google's authorization service.&lt;/li&gt;
&lt;li&gt;Google identifies the application using its OAuth client ID.&lt;/li&gt;
&lt;li&gt;The user reviews the requested permissions.&lt;/li&gt;
&lt;li&gt;Google sends an authorization code back to an approved redirect URI.&lt;/li&gt;
&lt;li&gt;Your backend exchanges the authorization code for tokens.&lt;/li&gt;
&lt;li&gt;Your application uses the access token when calling permitted Google APIs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For server-based applications, Google recommends the authorization code flow because the application can securely exchange the code on its backend and store refresh tokens outside the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the OAuth Client
&lt;/h3&gt;

&lt;p&gt;First, create an OAuth client for the appropriate application type in Google Cloud.&lt;/p&gt;

&lt;p&gt;A web application normally receives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client ID:&lt;/strong&gt; Identifies the application to Google.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client secret:&lt;/strong&gt; Authenticates the application during server-side token operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorized redirect URIs:&lt;/strong&gt; Defines exactly where Google may return the user after authorization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your client secret should remain on your backend. It should never be included in frontend JavaScript, committed to a public repository, exposed through logs, or stored in publicly accessible configuration.&lt;/p&gt;

&lt;p&gt;Google specifically recommends protecting OAuth client secrets and keeping them outside publicly accessible source trees.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure the Consent Experience
&lt;/h3&gt;

&lt;p&gt;The consent screen tells users which application is requesting access and what that application wants permission to do.&lt;/p&gt;

&lt;p&gt;Your configuration will typically include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application name&lt;/li&gt;
&lt;li&gt;Support information&lt;/li&gt;
&lt;li&gt;Authorized domains&lt;/li&gt;
&lt;li&gt;Intended audience&lt;/li&gt;
&lt;li&gt;Requested scopes&lt;/li&gt;
&lt;li&gt;Developer contact information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Public applications requesting certain sensitive or restricted Google API scopes may also need to complete Google's verification process.&lt;/p&gt;

&lt;p&gt;The consent screen should match what your product actually does. Asking for broad access without a clear product reason increases both security exposure and user hesitation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Redirect URIs Carefully
&lt;/h3&gt;

&lt;p&gt;Redirect URI configuration is one of the most frequent causes of Google OAuth errors.&lt;/p&gt;

&lt;p&gt;Google compares the redirect URI in the authorization request with the URI registered for the OAuth client. The values need to match exactly.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://app.example.com/oauth/google/callback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is different from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://app.example.com/oauth/google/callback/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Differences in scheme, capitalization, hostname, port, path, or trailing slash can result in &lt;code&gt;redirect_uri_mismatch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Google also requires HTTPS for normal production redirect URIs, with localhost receiving special treatment for development.&lt;/p&gt;

&lt;p&gt;A useful deployment practice is to define separate OAuth clients or carefully controlled redirect URI configurations for development, staging, and production rather than constantly editing one configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Request Only the Scopes You Need
&lt;/h3&gt;

&lt;p&gt;Scopes determine what the user is allowing your application to access.&lt;/p&gt;

&lt;p&gt;A calendar application might initially need permission to read calendar events. It does not automatically need permission to modify calendars, read Gmail, access Drive files, and manage contacts.&lt;/p&gt;

&lt;p&gt;This is where least privilege begins.&lt;/p&gt;

&lt;p&gt;Google recommends incremental authorization: request permissions when the user actually reaches a feature that needs them rather than requesting every possible permission during the first interaction.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A user signs into your application.&lt;/li&gt;
&lt;li&gt;The user chooses to connect Google Calendar.&lt;/li&gt;
&lt;li&gt;Your application requests the required Calendar scope.&lt;/li&gt;
&lt;li&gt;Later, the user enables a Gmail feature.&lt;/li&gt;
&lt;li&gt;Only then does your application request the necessary Gmail scope.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a clearer consent experience and a smaller permission surface.&lt;/p&gt;

&lt;p&gt;If you are implementing several third-party connections rather than managing every authorization flow independently, Corsair's &lt;a href="https://docs.corsair.dev/concepts/oauth" rel="noopener noreferrer"&gt;OAuth 2.0 authentication documentation&lt;/a&gt; demonstrates how OAuth connections, callbacks, encrypted token storage, and token refresh can be handled through a common integration layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Google One Tap, Automatic Sign-In, and Sign-Out Flows
&lt;/h2&gt;

&lt;p&gt;One of the most important concepts in modern Google Identity Services is the separation between authentication and authorization.&lt;/p&gt;

&lt;p&gt;Authentication answers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is this user?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authorization answers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Google resources has this user allowed the application to access?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One Tap belongs primarily to authentication.&lt;/p&gt;

&lt;p&gt;If your application only needs basic identity information through scopes such as &lt;code&gt;openid&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, and &lt;code&gt;profile&lt;/code&gt;, Google recommends considering Sign In With Google rather than building a broader API authorization flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing Google One Tap
&lt;/h3&gt;

&lt;p&gt;Google One Tap allows an eligible user to authenticate without navigating through a traditional sign-in page.&lt;/p&gt;

&lt;p&gt;A basic JavaScript initialization can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;client_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_GOOGLE_CLIENT_ID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;handleCredentialResponse&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When authentication succeeds, the credential response contains an ID token. Your application should send that credential to a trusted backend where it can be verified before creating or restoring an application session.&lt;/p&gt;

&lt;p&gt;One Tap should not be treated as the mechanism that automatically gives your application permission to read Drive files, send Gmail messages, or modify Calendar events.&lt;/p&gt;

&lt;p&gt;Those actions require a separate authorization flow and the appropriate Google API scopes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatic Sign-In
&lt;/h3&gt;

&lt;p&gt;Google Identity Services can automatically select an eligible returning account in supported situations.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;client_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_GOOGLE_CLIENT_ID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;handleCredentialResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;auto_select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When automatic selection is enabled and the user meets Google's eligibility requirements, authentication can complete with less interaction.&lt;/p&gt;

&lt;p&gt;Developers should still treat automatic sign-in as a UX optimization rather than an assumption. Browser behavior, user settings, Google sessions, FedCM support, privacy controls, and other conditions can affect whether automatic authentication occurs.&lt;/p&gt;

&lt;p&gt;Your application should therefore continue to provide a normal Sign In With Google path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handle Sign-Out Correctly
&lt;/h3&gt;

&lt;p&gt;A subtle problem appears when your application signs someone out locally while Google Identity Services still considers that user eligible for automatic selection.&lt;/p&gt;

&lt;p&gt;The result can become a loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user signs out.&lt;/li&gt;
&lt;li&gt;Your application destroys the local session.&lt;/li&gt;
&lt;li&gt;The page reloads.&lt;/li&gt;
&lt;li&gt;Automatic sign-in immediately authenticates the same Google account again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From the user's perspective, the sign-out button appears broken.&lt;/p&gt;

&lt;p&gt;Google provides &lt;code&gt;disableAutoSelect()&lt;/code&gt; specifically for this situation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;signOut&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disableAutoSelect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Destroy your application session here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Google recommends calling this method when the user signs out of your website so automatic selection does not immediately recreate the session.&lt;/p&gt;

&lt;p&gt;Remember that application sign-out, Google account sign-out, and OAuth consent revocation are three different actions.&lt;/p&gt;

&lt;p&gt;Signing out of your application should usually terminate your application session. Revoking OAuth consent is a separate decision and should normally be used when the user explicitly disconnects their Google account or removes an integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Securing Google OAuth Tokens: DPoP, Token Storage, Rotation, and Least Privilege Access
&lt;/h2&gt;

&lt;p&gt;A successful authorization flow is only the beginning. Token handling determines whether the integration remains secure after the user closes the consent screen.&lt;/p&gt;

&lt;p&gt;OAuth commonly involves three important credentials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authorization code:&lt;/strong&gt; Temporary credential exchanged by the backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access token:&lt;/strong&gt; Short-lived credential used when calling Google APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refresh token:&lt;/strong&gt; Longer-lived credential that can obtain new access tokens without requiring the user to complete authorization every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The authorization code flow is especially useful for applications that need Google API access when the user is not actively present because the backend can securely retain the refresh token.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Long-Lived Tokens on the Server
&lt;/h3&gt;

&lt;p&gt;Refresh tokens are highly valuable credentials.&lt;/p&gt;

&lt;p&gt;If someone obtains a valid refresh token, they may be able to continue obtaining access tokens until the authorization is revoked or the credential otherwise becomes invalid.&lt;/p&gt;

&lt;p&gt;Good Google OAuth best practices include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store tokens in a protected server-side datastore.&lt;/li&gt;
&lt;li&gt;Encrypt sensitive credentials at rest.&lt;/li&gt;
&lt;li&gt;Restrict which application services can retrieve them.&lt;/li&gt;
&lt;li&gt;Never expose refresh tokens to an AI model prompt or browser when the backend can perform the API request instead.&lt;/li&gt;
&lt;li&gt;Prevent credentials from appearing in logs, analytics events, traces, or error-reporting systems.&lt;/li&gt;
&lt;li&gt;Separate credentials by account and tenant.&lt;/li&gt;
&lt;li&gt;Revoke credentials when a user intentionally disconnects an integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When an application serves multiple organizations or users, credential isolation becomes particularly important. Corsair's &lt;a href="https://docs.corsair.dev/concepts/multi-tenancy" rel="noopener noreferrer"&gt;multi-tenancy documentation&lt;/a&gt; shows a model in which credentials, database operations, and API calls are scoped to an individual tenant rather than sharing one global credential context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Refresh Access Tokens Instead of Reauthorizing Users
&lt;/h3&gt;

&lt;p&gt;Access tokens expire.&lt;/p&gt;

&lt;p&gt;For applications using the authorization code flow with offline access, a stored refresh token can obtain another access token without sending the user through the consent flow each time.&lt;/p&gt;

&lt;p&gt;Google client libraries can automate much of this process. If you implement token refresh yourself, your application needs to recognize expired credentials, securely call the token endpoint, persist updated token information when appropriate, and handle refresh failures.&lt;/p&gt;

&lt;p&gt;Do not solve token expiration by repeatedly asking users to reconnect unless the refresh token is genuinely unavailable, expired, revoked, or invalid.&lt;/p&gt;

&lt;p&gt;Also avoid continuously generating new refresh tokens. Google applies limits to the number of refresh tokens issued for user and client combinations, and excessive issuance can eventually cause older tokens to stop working.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understand What DPoP Adds
&lt;/h3&gt;

&lt;p&gt;DPoP, or Demonstrating Proof of Possession, adds another security property to OAuth token operations.&lt;/p&gt;

&lt;p&gt;A normal bearer credential can potentially be used by whoever possesses it. DPoP introduces a cryptographic key and requires the client to prove possession of the associated private key during supported token operations.&lt;/p&gt;

&lt;p&gt;Google currently supports optional DPoP for its web server OAuth token exchange. When DPoP is used during the exchange, the resulting refresh token is bound to the corresponding key. Subsequent refresh operations need proofs signed using that same private key.&lt;/p&gt;

&lt;p&gt;Google recommends protecting that private key with mechanisms such as hardware-backed storage where possible.&lt;/p&gt;

&lt;p&gt;An important implementation detail is that Google's access tokens still use the &lt;code&gt;Bearer&lt;/code&gt; token type even when DPoP is used. The additional protection applies to supported token endpoint interactions and the DPoP-bound refresh token rather than turning the Google access token itself into a DPoP access token.&lt;/p&gt;

&lt;p&gt;That distinction matters when designing your security model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apply Least Privilege Beyond Scopes
&lt;/h3&gt;

&lt;p&gt;Least privilege does not end after selecting OAuth scopes.&lt;/p&gt;

&lt;p&gt;You should also control what your own application can do with those permissions.&lt;/p&gt;

&lt;p&gt;Imagine an application receives permission to modify Google Calendar. That does not necessarily mean every feature, background job, AI agent, or user role should be capable of deleting events.&lt;/p&gt;

&lt;p&gt;Authorization should therefore exist at several layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Google OAuth scopes determine what the Google credential permits.&lt;/li&gt;
&lt;li&gt;Your application permissions determine which users can trigger particular operations.&lt;/li&gt;
&lt;li&gt;Your integration layer determines which tools and endpoints are exposed.&lt;/li&gt;
&lt;li&gt;Approval controls can protect destructive or sensitive operations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For developers who need to manage authentication methods, encrypted credentials, refresh behavior, and tenant-specific credentials through a common layer, the &lt;a href="https://docs.corsair.dev/concepts/auth" rel="noopener noreferrer"&gt;Corsair authentication documentation&lt;/a&gt; covers the credential lifecycle and storage model used by Corsair.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Google OAuth Errors and How to Troubleshoot Them
&lt;/h2&gt;

&lt;p&gt;Most Google OAuth errors become much easier to fix once you identify which stage of the flow failed.&lt;/p&gt;

&lt;p&gt;Was the authorization request rejected? Did the callback fail? Did the token exchange fail? Did a previously valid refresh token stop working? Did Google reject the final API request?&lt;/p&gt;

&lt;p&gt;Debugging the flow stage first prevents developers from randomly changing credentials and scopes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;redirect_uri_mismatch&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This is one of the most common Google OAuth errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it means:&lt;/strong&gt; The redirect URI submitted by your application does not exactly match an authorized redirect URI associated with the OAuth client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP versus HTTPS&lt;/li&gt;
&lt;li&gt;Domain and subdomain&lt;/li&gt;
&lt;li&gt;Port&lt;/li&gt;
&lt;li&gt;Callback path&lt;/li&gt;
&lt;li&gt;Capitalization&lt;/li&gt;
&lt;li&gt;Trailing slash&lt;/li&gt;
&lt;li&gt;Environment configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google explicitly requires the redirect URI to match the registered value, including scheme, case, and trailing slash.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;invalid_client&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it means:&lt;/strong&gt; Google could not validate the OAuth client.&lt;/p&gt;

&lt;p&gt;For a server-based flow, check whether the client ID and client secret belong to the same OAuth client and environment.&lt;/p&gt;

&lt;p&gt;This commonly appears when staging credentials reach production, an old secret remains in deployment configuration, or the application is using credentials for the wrong OAuth client type.&lt;/p&gt;

&lt;p&gt;Google documents incorrect OAuth client credentials as a cause of &lt;code&gt;invalid_client&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;invalid_grant&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This error is more ambiguous because it can relate to several credential problems.&lt;/p&gt;

&lt;p&gt;The authorization code or refresh token may be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invalid&lt;/li&gt;
&lt;li&gt;Expired&lt;/li&gt;
&lt;li&gt;Revoked&lt;/li&gt;
&lt;li&gt;Already used where reuse is not allowed&lt;/li&gt;
&lt;li&gt;Associated with a different redirect URI&lt;/li&gt;
&lt;li&gt;Otherwise inconsistent with the authorization request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google's token endpoint documentation identifies invalid, expired, revoked, or mismatched grants as common causes of &lt;code&gt;invalid_grant&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the problem involves a refresh token, determine whether the user revoked access, the token became invalid, or your application stored the wrong credential before sending the user through OAuth again.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;access_denied&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;access_denied&lt;/code&gt; can simply mean that the user declined the authorization request.&lt;/p&gt;

&lt;p&gt;Do not automatically treat this as an application failure.&lt;/p&gt;

&lt;p&gt;Your interface should return the user to a safe application state and clearly explain that the requested feature cannot work without the requested permission.&lt;/p&gt;

&lt;p&gt;Avoid creating an authorization loop that immediately opens the consent dialog again.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;admin_policy_enforced&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Google Workspace administrators can restrict applications or scopes that users inside their organization are allowed to authorize.&lt;/p&gt;

&lt;p&gt;If OAuth works for personal Google accounts but fails for users from a particular organization, administrator policy should be part of your investigation.&lt;/p&gt;

&lt;p&gt;Google documents &lt;code&gt;admin_policy_enforced&lt;/code&gt; when Workspace administrator policies prevent the requested authorization.&lt;/p&gt;

&lt;p&gt;Your application may need to provide instructions that an affected customer can share with their Workspace administrator.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;org_internal&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This error can appear when the OAuth application's audience is restricted to accounts associated with a particular Google Cloud organization.&lt;/p&gt;

&lt;p&gt;If outside users need access, review how the application's audience and OAuth configuration are defined.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;invalid_scope&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This generally means the requested scope is invalid, unknown, malformed, or inappropriate for the request.&lt;/p&gt;

&lt;p&gt;Instead of copying large lists of scopes from another implementation, define the exact Google APIs your product uses and verify the current scope identifiers for those APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Better OAuth Troubleshooting Process
&lt;/h3&gt;

&lt;p&gt;When Google OAuth errors appear in production, debug them systematically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the exact OAuth stage that failed.&lt;/li&gt;
&lt;li&gt;Record the Google error code without logging credentials.&lt;/li&gt;
&lt;li&gt;Confirm the OAuth client ID being used.&lt;/li&gt;
&lt;li&gt;Verify the redirect URI character for character.&lt;/li&gt;
&lt;li&gt;Compare the requested scopes with the intended product capability.&lt;/li&gt;
&lt;li&gt;Check whether the user belongs to a managed Google Workspace environment.&lt;/li&gt;
&lt;li&gt;Confirm whether an existing refresh token is expired or revoked.&lt;/li&gt;
&lt;li&gt;Review recent OAuth configuration or deployment changes.&lt;/li&gt;
&lt;li&gt;Require reconnection only when the existing authorization can no longer be recovered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Observability is valuable, but OAuth logs should contain metadata rather than secrets. Record tenant identifiers, provider names, error codes, request stages, and timestamps instead of access tokens, refresh tokens, client secrets, or authorization codes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Firebase Authentication vs Google Cloud Identity Platform: Choosing the Right Authentication Setup
&lt;/h2&gt;

&lt;p&gt;Firebase Authentication, Google Cloud Identity Platform, and direct Google OAuth implementation solve overlapping identity problems, but they are not identical choices.&lt;/p&gt;

&lt;p&gt;The right option depends on whether you are primarily authenticating users into your application or building a broader identity architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Firebase Authentication
&lt;/h3&gt;

&lt;p&gt;Firebase Authentication is well suited to applications that want a straightforward way to support user authentication across web and mobile experiences.&lt;/p&gt;

&lt;p&gt;It provides SDK-based support for common authentication methods and integrates naturally with the wider Firebase ecosystem.&lt;/p&gt;

&lt;p&gt;It is often a practical choice when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are building a consumer application.&lt;/li&gt;
&lt;li&gt;Your application already relies heavily on Firebase.&lt;/li&gt;
&lt;li&gt;You want common sign-in methods without building your own identity backend.&lt;/li&gt;
&lt;li&gt;You do not require advanced enterprise identity capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Google Cloud Identity Platform
&lt;/h3&gt;

&lt;p&gt;Identity Platform builds on the same underlying identity technology while adding capabilities designed for more complex and enterprise-oriented applications.&lt;/p&gt;

&lt;p&gt;Google currently lists additional Identity Platform capabilities such as multi-factor authentication, blocking functions, SAML, OpenID Connect, multi-tenancy, Identity-Aware Proxy integration, and an enterprise uptime SLA.&lt;/p&gt;

&lt;p&gt;It becomes more relevant when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are operating a multi-tenant SaaS product.&lt;/li&gt;
&lt;li&gt;Enterprise customers require SAML or OIDC identity providers.&lt;/li&gt;
&lt;li&gt;Authentication workflows need additional controls.&lt;/li&gt;
&lt;li&gt;Identity infrastructure needs to fit more deeply into Google Cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google describes Firebase Authentication as being aimed primarily at consumer applications while Identity Platform is positioned toward enterprise-focused SaaS applications and more advanced identity requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Direct Google OAuth
&lt;/h3&gt;

&lt;p&gt;There is another important distinction.&lt;/p&gt;

&lt;p&gt;Neither Firebase Authentication nor Identity Platform automatically replaces Google OAuth authorization when your application needs to act on a user's Google data.&lt;/p&gt;

&lt;p&gt;Signing a user into your application is different from receiving permission to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read their Google Calendar&lt;/li&gt;
&lt;li&gt;Send Gmail messages&lt;/li&gt;
&lt;li&gt;Access Google Drive&lt;/li&gt;
&lt;li&gt;Modify Google Sheets&lt;/li&gt;
&lt;li&gt;Call other protected Google APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the product needs those capabilities, you still need to design the appropriate authorization flow and obtain access tokens with the necessary scopes.&lt;/p&gt;

&lt;p&gt;A useful way to make the decision is therefore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Need user identity:&lt;/strong&gt; Consider Sign In With Google, Firebase Authentication, or Identity Platform depending on the broader authentication architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need access to Google APIs:&lt;/strong&gt; Implement OAuth authorization with the appropriate scopes and token lifecycle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need both:&lt;/strong&gt; Separate authentication from authorization so users understand when they are signing into your application and when they are granting access to their Google data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building Google OAuth for Production
&lt;/h2&gt;

&lt;p&gt;Google OAuth implementation is not difficult because of the redirect to Google itself. The real engineering work is everything around that redirect: scope design, callback security, credential storage, token refresh, account isolation, error recovery, and protecting sensitive operations after authorization succeeds.&lt;/p&gt;

&lt;p&gt;Start with the smallest permissions your application needs. Keep sensitive credentials on trusted infrastructure. Separate Sign In With Google from Google API authorization. Expect tokens to expire and permissions to change. Most importantly, design reconnect and troubleshooting paths before users encounter failures in production.&lt;/p&gt;

&lt;p&gt;If your application needs to connect Google APIs alongside other services, &lt;a href="https://corsair.dev/" rel="noopener noreferrer"&gt;Corsair&lt;/a&gt; provides an open-source integration layer for handling application integrations, OAuth, credentials, token refresh, and multi-tenant connections.&lt;/p&gt;

&lt;p&gt;Instead of rebuilding the same authentication infrastructure for every provider, developers can use a common integration model while keeping credentials within their application infrastructure.&lt;/p&gt;

&lt;p&gt;That becomes increasingly useful as a product expands from one Google integration to multiple Google services and third-party APIs.&lt;/p&gt;

&lt;p&gt;The goal is not to hide OAuth, but to reduce the repeated infrastructure required to operate it safely at production scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What Is the Difference Between Google Sign-In and Google OAuth 2.0?
&lt;/h3&gt;

&lt;p&gt;Google Sign-In primarily authenticates the user and tells your application who they are. Google OAuth authorization allows your application to request permission to access Google APIs on the user's behalf.&lt;/p&gt;

&lt;p&gt;Modern Google Identity Services deliberately separates these authentication and authorization flows.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Why Am I Getting &lt;code&gt;redirect_uri_mismatch&lt;/code&gt; in Google OAuth?
&lt;/h3&gt;

&lt;p&gt;The redirect URI sent by your application does not exactly match one registered for the OAuth client.&lt;/p&gt;

&lt;p&gt;Check the protocol, hostname, port, callback path, capitalization, and trailing slash. Even a small difference can cause the request to fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Where Should Google OAuth Refresh Tokens Be Stored?
&lt;/h3&gt;

&lt;p&gt;Refresh tokens should generally be stored in secure server-side storage rather than frontend JavaScript or browser-accessible storage.&lt;/p&gt;

&lt;p&gt;Protect them with encryption at rest, restrict application access, prevent them from entering logs, and isolate credentials between users or tenants.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Should an Application Request All Google OAuth Scopes During Initial Sign-In?
&lt;/h3&gt;

&lt;p&gt;Usually no. Google recommends incremental authorization so applications can request additional scopes when users access features that actually require them.&lt;/p&gt;

&lt;p&gt;This supports least privilege and gives users clearer context for each permission request.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. What Should an Application Do When a Google OAuth Refresh Token Stops Working?
&lt;/h3&gt;

&lt;p&gt;First determine why the token became invalid rather than immediately restarting OAuth.&lt;/p&gt;

&lt;p&gt;The user may have revoked access, the token may have expired or become invalid, or the application may be using the wrong credential. If the authorization can no longer be refreshed, ask the user to reconnect their Google account and create a new valid authorization.&lt;/p&gt;

</description>
      <category>oauth</category>
    </item>
    <item>
      <title>Corsair vs Composio: Why Corsair Is Better for Production AI Agent Integrations</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Fri, 04 Sep 2026 15:23:05 +0000</pubDate>
      <link>https://dev.to/corsairdev/corsair-vs-composio-why-corsair-is-better-for-production-ai-agent-integrations-c2b</link>
      <guid>https://dev.to/corsairdev/corsair-vs-composio-why-corsair-is-better-for-production-ai-agent-integrations-c2b</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjmg8z877du21qd4zqcqv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjmg8z877du21qd4zqcqv.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;Giving an AI agent access to Gmail, Slack, GitHub, Notion, Salesforce, or hundreds of other applications is relatively easy in a prototype. Making those integrations reliable enough for a production product is a different problem.&lt;/p&gt;

&lt;p&gt;Once real customers are involved, developers have to think beyond whether an agent can successfully call a tool. They need to decide where OAuth credentials live, how customer data is isolated, what happens when external data changes, which actions require approval, how integrations are used outside the agent, and how execution costs behave when autonomous agents start making thousands of calls.&lt;/p&gt;

&lt;p&gt;That makes the &lt;strong&gt;Corsair vs Composio&lt;/strong&gt; decision less about who has the longest integration catalog and more about the architecture behind those integrations. Composio provides a large managed ecosystem for discovering, authenticating, and executing tools. Corsair takes a different approach: integrations run as part of your application, credentials and synced data remain under your control, and the same integration layer can serve agents, backend services, workflows, and customer facing product features.&lt;/p&gt;

&lt;p&gt;For teams evaluating a &lt;strong&gt;Composio alternative&lt;/strong&gt; for &lt;strong&gt;production AI agent integrations&lt;/strong&gt;, these architectural differences become increasingly important as an application moves from experimentation to serving real users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Integration Logic vs Managed Execution Infrastructure
&lt;/h2&gt;

&lt;p&gt;Open source can mean different things in an &lt;strong&gt;AI agent integration platform&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Composio's SDK is itself open source under the MIT license, and its TypeScript package is intentionally inspectable. Composio also publishes provider adapters for frameworks such as OpenAI, Anthropic, Vercel AI SDK, LangChain, and others. So describing the entire Composio platform as closed source would be inaccurate.&lt;/p&gt;

&lt;p&gt;The more meaningful difference is where the actual integration implementation and execution responsibility sit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Corsair:&lt;/strong&gt; Integration plugins are open TypeScript packages that developers can inspect and modify. Corsair runs inside the developer's own application, allowing teams to understand how an API operation, authentication flow, webhook handler, or data synchronization process works rather than treating the integration layer purely as an external service. Corsair also allows developers to extend missing integrations rather than waiting exclusively on a vendor roadmap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Composio:&lt;/strong&gt; The SDK is open source, but its standard architecture relies heavily on Composio managed services for connected accounts, tool execution, sessions, triggers, and its remote sandbox. Tool execution is generally routed through Composio's infrastructure rather than running entirely as application owned integration code.&lt;/p&gt;

&lt;p&gt;That distinction matters when debugging production failures.&lt;/p&gt;

&lt;p&gt;If a provider changes an endpoint, returns an unexpected payload, or introduces a new authentication requirement, having access to the integration implementation can make it easier to inspect exactly what happened and adapt the behavior.&lt;/p&gt;

&lt;p&gt;Open source integration logic also reduces a different kind of dependency. Instead of asking whether a vendor currently supports a required endpoint, a development team can ask whether it has enough control to implement the endpoint itself.&lt;/p&gt;

&lt;p&gt;For organizations that consider code ownership part of their infrastructure strategy, Corsair's approach to &lt;strong&gt;open source AI integrations&lt;/strong&gt; can therefore be more attractive than relying primarily on a managed execution layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customer Controlled Credentials and Data vs Third Party Hosted Integration State
&lt;/h2&gt;

&lt;p&gt;Credentials are one of the most important architectural decisions in an agent system.&lt;/p&gt;

&lt;p&gt;An AI agent might eventually connect to email accounts, CRMs, internal documents, payment providers, support systems, calendars, and developer infrastructure. The OAuth tokens behind those connections can provide significant access to a customer's business.&lt;/p&gt;

&lt;p&gt;Corsair is designed around keeping those credentials inside the customer's infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Corsair:&lt;/strong&gt; OAuth tokens are stored in the application's own database and encrypted using the application's Key Encryption Key. Corsair Hub can assist with OAuth callbacks and token refresh, but Corsair states that access and refresh tokens are stored within customer infrastructure rather than retained by Hub. API calls are made from the customer's application to the underlying provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Composio:&lt;/strong&gt; Its standard connected account model stores user credentials against a Composio user ID and manages token refresh for those accounts. Composio supports customer supplied OAuth applications and other authentication configurations, but connected accounts remain part of the Composio platform's credential lifecycle.&lt;/p&gt;

&lt;p&gt;Neither model automatically makes an application secure. Developers still need proper encryption, access controls, infrastructure security, scope management, auditing, and credential rotation.&lt;/p&gt;

&lt;p&gt;The difference is ownership.&lt;/p&gt;

&lt;p&gt;With Corsair, your application remains the primary location for integration credentials and synchronized data. This can be important for companies with strict requirements around data residency, security reviews, customer isolation, or minimizing the number of systems that hold sensitive integration credentials.&lt;/p&gt;

&lt;p&gt;This model also extends beyond tokens.&lt;/p&gt;

&lt;p&gt;Corsair can persist data returned through API calls and webhook events in the application's own database. That means external integration data can become part of the same data architecture that already powers the rest of the product.&lt;/p&gt;

&lt;p&gt;For a production AI product, that changes the question from:&lt;/p&gt;

&lt;p&gt;"Which service stores my integration?"&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;"How does this integration become part of my application's own infrastructure?"&lt;/p&gt;

&lt;h2&gt;
  
  
  A Unified Integration SDK vs Framework Specific Integration Packages
&lt;/h2&gt;

&lt;p&gt;AI products rarely remain pure chat interfaces.&lt;/p&gt;

&lt;p&gt;An integration that starts as an agent tool often needs to appear elsewhere in the product.&lt;/p&gt;

&lt;p&gt;A support agent might read Zendesk tickets, while the support dashboard displays the same ticket information.&lt;/p&gt;

&lt;p&gt;A sales agent might create CRM records, while a scheduled backend process synchronizes those accounts every night.&lt;/p&gt;

&lt;p&gt;A calendar agent might schedule meetings, while the application's normal interface needs to display upcoming events.&lt;/p&gt;

&lt;p&gt;This is where an integration layer needs to serve the entire product rather than only the model.&lt;/p&gt;

&lt;p&gt;Corsair's core design allows integrations to be called directly from application code while also being exposed to agents through adapters. The &lt;a href="https://docs.corsair.dev/introduction" rel="noopener noreferrer"&gt;Corsair documentation&lt;/a&gt; describes the SDK as an integration layer for both apps and agents, with OAuth, token refresh, webhooks, rate limits, and provider operations handled through a consistent syntax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Corsair:&lt;/strong&gt; The same underlying integration client can support application logic, backend jobs, customer interfaces, database reads, workflows, and agent execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Composio:&lt;/strong&gt; Composio provides a core SDK plus provider adapters that convert Composio tools into formats expected by different agent frameworks. Its open source repository includes separate integrations for OpenAI, Anthropic, Vercel AI SDK, LangChain, LlamaIndex, and other environments.&lt;/p&gt;

&lt;p&gt;Both approaches can work.&lt;/p&gt;

&lt;p&gt;The advantage Corsair emphasizes is that agents do not have to become the center of the integration architecture. The underlying integration remains normal application infrastructure that an agent can use when necessary.&lt;/p&gt;

&lt;p&gt;This becomes particularly valuable when the product evolves.&lt;/p&gt;

&lt;p&gt;You might start by giving an agent the ability to search Slack. Later, you may want the same Slack integration to populate a dashboard, trigger a workflow, run from a scheduled backend job, or support a normal "Send to Slack" button.&lt;/p&gt;

&lt;p&gt;With an application centric integration layer, those use cases can continue using the same integration infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persistent Syncs, Webhooks, and Workflows Beyond One Off Tool Execution
&lt;/h2&gt;

&lt;p&gt;Modern agent integrations cannot depend entirely on live API calls.&lt;/p&gt;

&lt;p&gt;Imagine an agent that needs to answer:&lt;/p&gt;

&lt;p&gt;"Which customer issues appeared in Slack, GitHub, and HubSpot during the last month?"&lt;/p&gt;

&lt;p&gt;Calling every provider API during the reasoning loop would increase latency, consume API quotas, and require the model to repeatedly process large responses.&lt;/p&gt;

&lt;p&gt;Persistent integration data provides another approach.&lt;/p&gt;

&lt;p&gt;Corsair can store API responses and incoming webhook data in the application's database. Its database abstraction allows product code to query synchronized entities locally instead of making another provider request every time the data is needed. Corsair documents that API calls and webhook events can update the same local entity data used by the application.&lt;/p&gt;

&lt;p&gt;This creates two complementary access patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live API access:&lt;/strong&gt; Use the provider API when the application needs current data or wants to create, update, or delete something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local synchronized access:&lt;/strong&gt; Use the application's database when the product repeatedly needs previously synchronized information.&lt;/p&gt;

&lt;p&gt;Composio also supports triggers. Its trigger system can receive events from connected applications through webhooks or provider polling and forward structured events to an application's webhook endpoint. It would therefore be inaccurate to say Composio has no webhook support.&lt;/p&gt;

&lt;p&gt;The architectural difference is that Corsair connects these events directly with an application owned persistence model.&lt;/p&gt;

&lt;p&gt;Corsair is also expanding this model into durable workflows. &lt;a href="https://docs.corsair.dev/workflows/overview" rel="noopener noreferrer"&gt;Corsair Workflows&lt;/a&gt; can chain integration operations across multiple services, pause between steps, react to webhook events, and resume after retries while execution occurs inside the customer's application. The workflow system is currently documented as beta.&lt;/p&gt;

&lt;p&gt;For example, a production workflow could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Receive a new CRM opportunity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve information about the account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a task in Linear.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Notify the relevant Slack channel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for another event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continue when new customer information arrives.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent may initiate or participate in that workflow, but it does not have to personally orchestrate every infrastructure operation through repeated reasoning steps.&lt;/p&gt;

&lt;p&gt;That separation becomes increasingly useful as AI products become more autonomous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built In Multi Tenant Isolation for Customer Facing AI Products
&lt;/h2&gt;

&lt;p&gt;A single user prototype can get away with one Slack token and one Gmail connection.&lt;/p&gt;

&lt;p&gt;A SaaS product cannot.&lt;/p&gt;

&lt;p&gt;Once hundreds or thousands of customers connect their applications, every operation needs to resolve the correct credentials, data, webhooks, permissions, and account context.&lt;/p&gt;

&lt;p&gt;Corsair makes tenant context explicit.&lt;/p&gt;

&lt;p&gt;When multi tenant mode is enabled, operations are scoped through &lt;code&gt;withTenant()&lt;/code&gt;. Corsair's documentation states that API operations, database queries, credentials, and incoming webhook data are scoped using that tenant context. Direct plugin access is prevented when multi tenant mode is active, which helps make forgotten tenant scoping visible during development.&lt;/p&gt;

&lt;p&gt;For example, when an application runs an operation for Customer A, the integration layer must ensure that it cannot accidentally resolve Customer B's credentials.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but autonomous agents increase the number of places where this boundary needs to hold.&lt;/p&gt;

&lt;p&gt;An agent may:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Receive a user instruction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search stored integration data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select a tool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve credentials.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute an external API request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Process a webhook later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resume a workflow hours later.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tenant context needs to survive every one of those stages.&lt;/p&gt;

&lt;p&gt;Composio also provides multi user isolation. Sessions are created for a &lt;code&gt;userID&lt;/code&gt;, connected accounts are associated with users, and private connections are restricted to their owners by default. Composio additionally supports shared connections with access control lists.&lt;/p&gt;

&lt;p&gt;The distinction is therefore not that Composio lacks multi user support.&lt;/p&gt;

&lt;p&gt;Corsair's advantage is the way tenant scoping is incorporated into its local application and database architecture. The same tenant context governs credentials, locally stored entities, API operations, approvals, and webhooks.&lt;/p&gt;

&lt;p&gt;For customer facing &lt;strong&gt;production AI agent integrations&lt;/strong&gt;, that consistency can simplify the security model developers need to reason about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human Approval and Permission Gates for High Risk Agent Actions
&lt;/h2&gt;

&lt;p&gt;Authentication answers one question:&lt;/p&gt;

&lt;p&gt;"Can this user access Gmail?"&lt;/p&gt;

&lt;p&gt;Authorization needs to answer another:&lt;/p&gt;

&lt;p&gt;"Should this agent be allowed to send this particular email right now?"&lt;/p&gt;

&lt;p&gt;That difference becomes crucial when agents move from reading information to taking action.&lt;/p&gt;

&lt;p&gt;Reading a calendar event is not equivalent to deleting one.&lt;/p&gt;

&lt;p&gt;Searching a CRM is not equivalent to removing a customer record.&lt;/p&gt;

&lt;p&gt;Drafting an email is not equivalent to sending it.&lt;/p&gt;

&lt;p&gt;Production agents therefore need permission controls closer to the actual tool execution layer.&lt;/p&gt;

&lt;p&gt;Corsair gives integrations risk aware permission modes. Endpoints can be classified around read, write, and destructive behavior, while policies determine whether an operation is allowed, denied, or requires approval.&lt;/p&gt;

&lt;p&gt;When approval is required, Corsair can create a pending permission record and block execution until the action is approved. Approved actions are single use, and Corsair Hub can provide an approval URL to the user. The &lt;a href="https://docs.corsair.dev/concepts/permissions" rel="noopener noreferrer"&gt;Corsair permissions documentation&lt;/a&gt; also supports per endpoint overrides for more granular policies.&lt;/p&gt;

&lt;p&gt;This enables a practical pattern:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read:&lt;/strong&gt; Execute automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normal write:&lt;/strong&gt; Execute automatically or require approval depending on policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sensitive write:&lt;/strong&gt; Ask for approval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Destructive action:&lt;/strong&gt; Require approval or block completely.&lt;/p&gt;

&lt;p&gt;Composio also provides important safety controls. Sessions can restrict enabled toolkits, exact tool slugs, and behavioral tags such as destructive actions. These restrictions are enforced during execution. Developers can also create approval behavior using execution modifiers or supported framework hooks.&lt;/p&gt;

&lt;p&gt;The distinction is that Corsair provides the approval lifecycle as a first class part of its integration layer, including stored permission requests, approval states, tenant context, expiry behavior, and hosted or custom review flows.&lt;/p&gt;

&lt;p&gt;For agents performing consequential actions, this gives developers a clear separation between what an agent wants to do and what the system ultimately permits it to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Predictable Integration Costs as Agent Tool Usage Scales
&lt;/h2&gt;

&lt;p&gt;Agent usage patterns are different from traditional SaaS API usage.&lt;/p&gt;

&lt;p&gt;A human may click one button and generate one request.&lt;/p&gt;

&lt;p&gt;An agent may perform tool discovery, inspect several resources, retrieve more context, execute an action, validate the result, and continue reasoning.&lt;/p&gt;

&lt;p&gt;A single user instruction can therefore generate many integration operations.&lt;/p&gt;

&lt;p&gt;That makes per call pricing an architectural consideration rather than simply a procurement detail.&lt;/p&gt;

&lt;p&gt;Corsair's current pricing lists unlimited tool calls across its plans. The free Hobby plan currently includes up to 50 connections and 100,000 webhook events, while the Pro plan lists unlimited tool calls, connections, and webhooks.&lt;/p&gt;

&lt;p&gt;Composio's current pricing includes 100,000 monthly tool calls on its free plan. Its published overage rate for tool calls is currently $0.0003 per call, with additional usage rates applying to certain features and execution paths.&lt;/p&gt;

&lt;p&gt;That does not automatically mean one platform will always cost less.&lt;/p&gt;

&lt;p&gt;A team should evaluate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent behavior:&lt;/strong&gt; How many integration calls does a normal user request generate?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User growth:&lt;/strong&gt; How quickly will connected accounts increase?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trigger volume:&lt;/strong&gt; How many incoming events does the application process?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execution architecture:&lt;/strong&gt; Which operations run through an external platform versus inside the application?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage variability:&lt;/strong&gt; Can autonomous loops unexpectedly multiply execution volume?&lt;/p&gt;

&lt;p&gt;For a product where tool execution becomes extremely frequent, unlimited tool calls can make costs easier to forecast. This is particularly relevant when agentic workflows execute repeatedly without a human manually initiating each action.&lt;/p&gt;

&lt;p&gt;Pricing can change, so teams should always evaluate current plans before making a purchasing decision. The larger architectural question is whether the pricing model scales in the same direction as the product's expected agent behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, Is Corsair Better Than Composio for Production AI Agent Integrations?
&lt;/h2&gt;

&lt;p&gt;There is no universal answer for every AI application.&lt;/p&gt;

&lt;p&gt;Composio offers a large toolkit catalog, managed authentication, agent sessions, triggers, tool discovery, remote sandbox execution, and integrations with many popular agent frameworks. For teams that prioritize managed infrastructure and rapid access to a broad tool ecosystem, that can be attractive.&lt;/p&gt;

&lt;p&gt;Corsair becomes especially compelling when the integration layer needs to become a permanent part of the product's architecture.&lt;/p&gt;

&lt;p&gt;Choose Corsair when you value:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code ownership:&lt;/strong&gt; Integration implementations are open and extensible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure control:&lt;/strong&gt; Integrations execute within your application environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credential ownership:&lt;/strong&gt; User credentials remain within your database architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persistent data:&lt;/strong&gt; API responses and webhook events can become locally queryable application data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product reuse:&lt;/strong&gt; The same integrations can support agents, UI features, backend jobs, and workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tenant isolation:&lt;/strong&gt; Credentials, database records, webhooks, and operations remain scoped to the appropriate customer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent safety:&lt;/strong&gt; Sensitive operations can be gated behind explicit permission policies and approval flows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Predictable execution economics:&lt;/strong&gt; Tool calls are not metered individually under Corsair's current plans.&lt;/p&gt;

&lt;p&gt;The larger lesson from the Corsair vs Composio comparison is that choosing an &lt;strong&gt;AI agent integration platform&lt;/strong&gt; should not stop at counting connectors. The platform becomes part of your authentication architecture, security boundary, application data model, and eventually your product infrastructure.&lt;/p&gt;

&lt;p&gt;As agents gain more autonomy, developers need integration infrastructure that remains understandable and controllable even when the model itself is making more decisions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://corsair.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Corsair&lt;/strong&gt;&lt;/a&gt; is built around that idea: open source integrations that run alongside your application rather than turning your entire integration layer into an external black box. It gives developers one foundation for connecting agents, backend systems, customer facing features, synchronized data, permissions, and workflows. For teams moving from experiments to production AI products, that architecture can provide more control over how credentials, data, and actions flow through the system. Explore Corsair to see how an application owned integration layer can simplify the path from the first connected tool to a full production integration stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. What is the main difference between Corsair and Composio?
&lt;/h3&gt;

&lt;p&gt;The biggest difference is architectural. Composio provides a managed platform for authentication, tool discovery, connected accounts, sessions, and execution. Corsair runs its integration SDK within your application and is designed to keep credentials and synchronized integration data under your control. Both can connect AI agents to external applications, but Corsair places greater emphasis on application owned integration infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Is Corsair a Composio alternative for production AI agents?
&lt;/h3&gt;

&lt;p&gt;Yes. Corsair can serve as a &lt;strong&gt;Composio alternative&lt;/strong&gt; for developers building production agents that need OAuth management, API integrations, persistent data, webhooks, workflows, multi tenant isolation, and permission controls. It can also power non agent product features using the same integration layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Is Composio closed source?
&lt;/h3&gt;

&lt;p&gt;Not entirely. Composio's SDK and provider adapters are open source under the MIT license. However, many of its standard capabilities depend on Composio managed infrastructure for connected accounts, sessions, tool execution, triggers, and remote sandbox functionality. Corsair differs by making its integration implementations open source while running the SDK and integration execution inside the developer's application.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How does Corsair protect sensitive AI agent actions?
&lt;/h3&gt;

&lt;p&gt;Corsair can classify integration operations by risk and apply permission policies that allow, deny, or require approval before execution. Sensitive actions can generate a review request, while developers can configure individual operation overrides. This allows an agent to perform safe reads automatically while placing additional controls around destructive or consequential actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Which platform is better for multi tenant AI applications?
&lt;/h3&gt;

&lt;p&gt;Both platforms support multiple users and isolated connections. Composio scopes connected accounts and sessions using user identities, while Corsair can enable multi tenant mode and require operations to run through a tenant scoped client. Corsair's model is particularly useful when developers want tenant isolation to extend across credentials, API calls, locally synchronized data, webhooks, permissions, and other application infrastructure.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>integration</category>
      <category>corsair</category>
    </item>
    <item>
      <title>Google Cloud Authentication for AI Agents: ADC, Workload Identity Federation, and Secure Identity Patterns</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Fri, 04 Sep 2026 15:15:58 +0000</pubDate>
      <link>https://dev.to/corsairdev/google-cloud-authentication-for-ai-agents-adc-workload-identity-federation-and-secure-identity-38me</link>
      <guid>https://dev.to/corsairdev/google-cloud-authentication-for-ai-agents-adc-workload-identity-federation-and-secure-identity-38me</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyqteeltl56o8sfsfja4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyqteeltl56o8sfsfja4n.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;An AI agent that reads a spreadsheet, updates a BigQuery table, or triggers a Cloud Run job needs to prove who it is before Google Cloud lets it do any of that. For a person, proving identity means a login screen. For an agent running unattended, sometimes on a laptop, sometimes inside a container, sometimes on infrastructure that isn't Google Cloud at all, there's no screen and no one around to type a password when a token expires.&lt;/p&gt;

&lt;p&gt;Google Cloud already has a mature answer to this problem. It was built for backend services long before agents existed, and most of it applies directly: Application Default Credentials discover the right identity automatically based on where code is running, Workload Identity Federation lets systems outside Google Cloud authenticate without a static key, and service account impersonation hands out short-lived, narrowly scoped tokens instead of long-lived secrets.&lt;/p&gt;

&lt;p&gt;The pieces exist. What's less obvious is how to combine them correctly for a system that acts autonomously, chains tool calls together, and processes untrusted input as part of its job.&lt;/p&gt;

&lt;p&gt;This guide walks through how Google Cloud authentication for AI agents actually works in practice: how Google Cloud ADC resolves credentials across local, cloud, and hybrid environments, how Workload Identity Federation and service account impersonation remove static keys from the picture, and how to design access that stays least privilege even when the one asking for it is an agent instead of a person.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Google Cloud Authentication Works for AI Agents Across Local, Cloud, and Hybrid Environments
&lt;/h2&gt;

&lt;p&gt;An AI agent that calls a Google Cloud API is, from Google's point of view, just another caller that needs to prove its identity before every request. What makes agents different from a typical backend service is that they run in more places, act with less direct supervision, and often chain many calls together in a single task.&lt;/p&gt;

&lt;p&gt;Google Cloud authentication for AI agents is built on the same primitives used for any workload: OAuth 2.0 access tokens, service accounts, Application Default Credentials for discovery, and Workload Identity Federation for anything running outside Google Cloud.&lt;/p&gt;

&lt;p&gt;An agent isn't locked into one method. Its authentication resolves differently depending on where it happens to be running.&lt;/p&gt;

&lt;p&gt;Three environments account for most of the pattern differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local development:&lt;/strong&gt; The agent runs on a developer's machine, and Google Cloud auth typically falls back to user credentials issued through the Google Cloud CLI, scoped to whatever that developer's own Google Account can access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-native:&lt;/strong&gt; The agent runs inside Compute Engine, Cloud Run, GKE, or Cloud Functions, and Google Cloud auth resolves an attached service account automatically from the environment's metadata server, with no key files anywhere in the deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid or multi-cloud:&lt;/strong&gt; The agent runs on AWS, Azure, on-premises infrastructure, or inside a third-party runtime, and Google Cloud auth uses Workload Identity Federation to exchange an external identity token for a short-lived Google credential, without ever creating a static key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The authentication method should follow the deployment target, not the other way around. Hardcoding a service account key into an agent so it "just works everywhere" is exactly the pattern the rest of this guide argues against.&lt;/p&gt;

&lt;p&gt;It matters more for agents than for ordinary services, since an agent that acts autonomously, retries failed calls, and processes untrusted input needs a credential surface that stays small and predictable.&lt;/p&gt;

&lt;p&gt;Frameworks that connect agents to third-party services increasingly treat this as infrastructure rather than a one-off implementation detail, similar to how an integration layer that &lt;a href="https://docs.corsair.dev/concepts/auth" rel="noopener noreferrer"&gt;handles OAuth, API keys, and bot tokens automatically&lt;/a&gt; keeps credential logic consistent across every provider an agent talks to, not just Google Cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Application Default Credentials: Credential Discovery, Precedence, and Deployment Behavior
&lt;/h2&gt;

&lt;p&gt;Application Default Credentials, often shortened to Google Cloud ADC, is the strategy Google's client libraries use to find credentials automatically based on the environment, so the same application code can run in development and production without conditional authentication logic.&lt;/p&gt;

&lt;p&gt;Rather than a credential type of its own, ADC is a lookup process, and understanding its precedence matters more than most teams assume.&lt;/p&gt;

&lt;p&gt;ADC checks for credentials in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt; environment variable, which points to a credential file. That file can be a service account key, an external account configuration for Workload Identity Federation or Workforce Identity Federation, or an authorized user file.&lt;/li&gt;
&lt;li&gt;A credential file created locally by running the Google Cloud CLI's application default login command, stored at a fixed path that depends on the operating system.&lt;/li&gt;
&lt;li&gt;The attached service account returned by the environment's metadata server, when the code runs on Compute Engine, Cloud Run, GKE, Cloud Functions, or App Engine's flexible environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Google's own documentation is explicit that this order is a lookup sequence, not a ranking of trust or preference.&lt;/p&gt;

&lt;p&gt;That distinction matters in practice: a stray &lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt; variable left behind from local testing will silently take precedence in a production container, causing an agent to authenticate as the wrong identity without any error being thrown.&lt;/p&gt;

&lt;p&gt;It's worth explicitly checking for that variable during deployment rather than assuming ADC will resolve to the "obvious" identity.&lt;/p&gt;

&lt;p&gt;Deployment behavior follows from this precedence. In local development, ADC usually resolves broad user credentials, often wider in scope than what the agent should have once it's live.&lt;/p&gt;

&lt;p&gt;On Compute Engine, Cloud Run, and GKE, ADC resolves the attached service account with no files or environment variables to manage, and Google rotates that credential automatically behind the scenes.&lt;/p&gt;

&lt;p&gt;In CI/CD pipelines or on other clouds, ADC resolves through &lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt; pointing at a Workload Identity Federation configuration file, which is the pattern covered next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workload Identity Federation for Keyless Authentication Across Multi-Cloud and On-Premises Agents
&lt;/h2&gt;

&lt;p&gt;Workload Identity Federation lets Google Cloud trust credentials issued by an external identity provider—AWS, Azure, on-premises Active Directory, or any OpenID Connect or SAML-compliant identity provider—and exchange them for short-lived Google credentials.&lt;/p&gt;

&lt;p&gt;No service account key ever needs to be created or stored for this to work.&lt;/p&gt;

&lt;p&gt;Two building blocks make it up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;workload identity pool&lt;/strong&gt;, which is a container for external identities.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;workload identity pool provider&lt;/strong&gt;, which defines the trust relationship with a specific identity provider through its issuer, audience, and attribute mappings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From there, teams generally choose between two access patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct resource access:&lt;/strong&gt; IAM roles are granted straight to the federated principal, so the external identity calls Google Cloud resources under its own identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service account impersonation:&lt;/strong&gt; The federated identity is granted the Workload Identity User role and uses it to impersonate a Google service account, inheriting that service account's permissions instead of holding its own broad grants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most agent frameworks lean toward the impersonation pattern, since it keeps the permission model centralized on a small number of service accounts rather than sprawling across many external principals.&lt;/p&gt;

&lt;p&gt;It is also the pattern with the fewest surprises when a Google Cloud API has limitations around directly federated tokens.&lt;/p&gt;

&lt;p&gt;This matters for AI agents specifically because agents frequently run somewhere other than Google Cloud: built on infrastructure from another provider, invoked from inside a CI pipeline, or triggered from a workflow tool that has nothing to do with Google.&lt;/p&gt;

&lt;p&gt;Workload Identity Federation removes the temptation to paste a downloaded JSON key into a config file, where it would sit valid indefinitely until someone remembered to rotate it. External tokens exchanged through federation typically live minutes to hours instead.&lt;/p&gt;

&lt;p&gt;Google Kubernetes Engine has its own variant of this pattern, Workload Identity Federation for GKE, which is covered in more detail in the containers section below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Service Account Impersonation and Short-Lived Credentials for Safer Agent Access
&lt;/h2&gt;

&lt;p&gt;Service account impersonation lets one identity—a person, a CI system, or another service account—request a temporary credential for a target service account without ever holding that target account's long-lived key.&lt;/p&gt;

&lt;p&gt;It's the mechanism underneath both Workload Identity Federation and a lot of everyday local development.&lt;/p&gt;

&lt;p&gt;The mechanics are straightforward: the calling identity needs the Service Account Token Creator role on the target service account, then calls the IAM Service Account Credentials API's &lt;code&gt;generateAccessToken&lt;/code&gt; method to receive a working OAuth 2.0 access token.&lt;/p&gt;

&lt;p&gt;A few details are worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lifetime:&lt;/strong&gt; Tokens default to 3,600 seconds, or one hour, and can be extended up to 43,200 seconds, or twelve hours, for workloads that genuinely need a longer window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No refresh token:&lt;/strong&gt; Unlike a typical OAuth flow, an expired impersonated token can't be refreshed. The caller has to repeat the impersonation request. That's a deliberate design choice: it forces every credential to be reissued against current IAM policy instead of persisting unchecked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delegation chains:&lt;/strong&gt; Impersonation can be chained across multiple service accounts, where each hop needs the Token Creator role granted on the account ahead of it. This is useful for separating an agent's everyday identity from a higher-privilege identity it's only occasionally allowed to assume.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an agent, this means its baseline identity can stay low privilege for routine tool calls, and step up to a more privileged service account only for specific, auditable operations.&lt;/p&gt;

&lt;p&gt;Each impersonation call shows up as its own entry in Cloud Audit Logs tied to both identities involved, which is a far clearer trail than a single static credential reused for everything an agent does.&lt;/p&gt;

&lt;p&gt;Most agent frameworks need an equivalent pattern for every provider they connect to, not only Google Cloud: somewhere to &lt;a href="https://docs.corsair.dev/guides/plugin-credentials" rel="noopener noreferrer"&gt;store the specific credentials each integration requires&lt;/a&gt; without handing them to the agent directly, which is close to how a dedicated integration layer keeps plugin credentials scoped and rotated behind the API surface an agent actually calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing Least Privilege and Zero Trust Access for Autonomous AI Agents
&lt;/h2&gt;

&lt;p&gt;Least privilege is harder to enforce for agents than for people, since agents don't usually request access when they hit something new. They just attempt the call.&lt;/p&gt;

&lt;p&gt;That means overprovisioning tends to stay invisible until something goes wrong.&lt;/p&gt;

&lt;p&gt;A few approaches hold up well in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Split service accounts by capability, not by agent:&lt;/strong&gt; Separate identities for read-heavy work, such as querying BigQuery or reading from Cloud Storage, from anything that writes, mutates, or deletes, so a compromised read-only path can't escalate into a write path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use IAM Conditions to narrow access further:&lt;/strong&gt; Time-bound bindings, resource-tag-based bindings, or request attribute checks can scope a role tighter than the role definition alone would allow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer custom roles over broad predefined roles for agent service accounts:&lt;/strong&gt; An agent rarely needs Editor or Owner. It needs the three or four permissions its specific tool calls actually use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat any agent action beyond a simple read as something that deserves a policy check:&lt;/strong&gt; A valid token should not automatically mean unrestricted execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero trust, applied to agents, means not trusting an identity just because it authenticated successfully.&lt;/p&gt;

&lt;p&gt;What it's asking to do still needs to be checked against policy at call time, which is the real difference between "can this identity obtain a token" and "should this identity be allowed to run this specific action right now."&lt;/p&gt;

&lt;p&gt;One pattern worth building in directly is a human approval step for sensitive or destructive calls, where the agent's request is queued for a person to approve or deny before it executes, rather than relying on authentication alone as the only gate.&lt;/p&gt;

&lt;p&gt;This is the same reasoning behind letting teams &lt;a href="https://docs.corsair.dev/concepts/permissions" rel="noopener noreferrer"&gt;gate sensitive actions behind human approval before they execute&lt;/a&gt; for any connected integration, not just Google Cloud resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Securing Agent Credentials Against Prompt Injection, Token Theft, and Credential Exfiltration
&lt;/h2&gt;

&lt;p&gt;Agents carry a risk that ordinary backend services don't: their inputs—a document they read, a page they fetch, an email they process—can contain instructions crafted to make the agent take an action it shouldn't, including leaking its own credentials.&lt;/p&gt;

&lt;p&gt;A few concrete risks are worth naming directly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection:&lt;/strong&gt; An attacker convinces an agent to print its own environment variables or configuration. If &lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt; points at a key file, that file's contents can end up in an agent's output or in a log a bad actor later reads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token theft through logs or traces:&lt;/strong&gt; Access tokens, even short-lived ones, can end up captured by verbose debug logging, observability tooling, or crash reports. If the token is still valid when it's read, it can be replayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential exfiltration through chained tool calls:&lt;/strong&gt; An agent tricked into passing a token or key as a parameter to an external tool can leak it straight outside the intended trust boundary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mitigations aren't prompt-level fixes. They're architectural.&lt;/p&gt;

&lt;p&gt;Avoiding long-lived keys in the first place, through ADC, Workload Identity Federation, and impersonation, means there's nothing durable to steal, and a leaked short-lived token has a far smaller blast radius since it expires within the hour.&lt;/p&gt;

&lt;p&gt;Credential resolution should also sit outside the agent's own reasoning loop entirely. The code path that fetches and applies a token shouldn't be something the agent's generated output can influence, which is an architecture decision more than a prompting one.&lt;/p&gt;

&lt;p&gt;Tokens should be scoped tightly per call rather than reused broadly across a session, and Cloud Audit Logs are worth monitoring specifically for unusual impersonation events, since that audit trail is something a short-lived token gives you that a static key never does.&lt;/p&gt;

&lt;p&gt;This is also the reasoning behind keeping raw credentials out of an agent's context entirely: an integration layer that resolves credentials at call time so an agent only ever sees method names and results is a more defensible boundary than trusting the agent to handle a token responsibly, which is the same principle behind a hosted relay that &lt;a href="https://docs.corsair.dev/hub/overview" rel="noopener noreferrer"&gt;stores none of your credentials&lt;/a&gt; in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right Authentication Pattern for Containers, Kubernetes, and Air-Gapped Systems
&lt;/h2&gt;

&lt;p&gt;The right pattern depends heavily on where the agent's runtime actually sits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Containers on Compute Engine or Cloud Run:&lt;/strong&gt; ADC resolves the attached service account automatically from the metadata server. This is the simplest case. Nothing needs to be explicitly configured inside the container image itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GKE:&lt;/strong&gt; Use Workload Identity Federation for GKE rather than mounting service account key files as Kubernetes secrets. It binds a Kubernetes ServiceAccount to a Google identity so a pod authenticates automatically, and on Autopilot clusters it's enabled by default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-managed Kubernetes outside Google Cloud, on-premises, or on another provider:&lt;/strong&gt; Use Workload Identity Federation with the cluster's own OIDC issuer as the identity provider. This is the same underlying pattern used for AWS or Azure, just pointed at the cluster's own token issuer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Air-gapped or fully disconnected systems:&lt;/strong&gt; This is the honest edge case. Workload Identity Federation and impersonation both depend on reaching Google's token exchange and IAM Credentials endpoints over the network, so an agent with no outbound connectivity to Google Cloud can't use either.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For air-gapped systems, options narrow to private connectivity, a VPN or Interconnect combined with Private Google Access, so the disconnected network can still reach Google's APIs privately, or accepting that a fully offline agent needs a proxy or relay component with real connectivity to broker those calls on its behalf.&lt;/p&gt;

&lt;p&gt;The practical way to decide is to sort by connectivity first, privilege second.&lt;/p&gt;

&lt;p&gt;If the runtime can reach Google Cloud's APIs at all, prefer ADC with an attached service account, or Workload Identity Federation, over anything involving a static key.&lt;/p&gt;

&lt;p&gt;If it genuinely can't reach them, a relay or gateway component becomes necessary, and that component now holds the credential the agent doesn't, which deserves its own security review.&lt;/p&gt;

&lt;p&gt;Google Cloud gives AI agents a strong foundation for identity, but most agents don't only talk to Google Cloud. They also need Slack, Notion, GitHub, Stripe, and dozens of other services, each with its own auth quirks and token lifecycles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://corsair.dev/" rel="noopener noreferrer"&gt;Corsair&lt;/a&gt; is an open-source integration layer built for exactly this problem: it handles OAuth, API keys, and credential rotation across hundreds of plugins so agents authenticate consistently everywhere, not only inside Google Cloud.&lt;/p&gt;

&lt;p&gt;Teams can self-host it for free or run it through Corsair's hosted Hub, which never stores customer credentials. The same principles that apply to designing least-privilege, short-lived access for Google Cloud apply to every other integration an agent touches too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between Application Default Credentials and a service account key?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ADC is a discovery strategy that looks for credentials in a fixed order: an environment variable, a local credential file from the Google Cloud CLI, or the attached service account from the metadata server. It isn't a credential type by itself.&lt;/p&gt;

&lt;p&gt;A service account key is one specific, long-lived credential type that ADC can pick up if &lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt; points at it. Google recommends avoiding key files where possible, since an attached service account or Workload Identity Federation can usually provide the same access without a static file to protect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do AI agents need Workload Identity Federation if they already run inside Google Cloud?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not for the parts of an agent that run natively on Compute Engine, Cloud Run, or GKE, since ADC already resolves the attached service account automatically there.&lt;/p&gt;

&lt;p&gt;Workload Identity Federation becomes relevant the moment part of the agent's workflow runs outside Google Cloud, such as a CI pipeline, another cloud provider, or an on-premises system that still needs to call a Google Cloud API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long do impersonated service account credentials last?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By default, an access token generated through service account impersonation lasts 3,600 seconds, or one hour, and can be configured up to 43,200 seconds, or twelve hours, for workloads that need a longer window.&lt;/p&gt;

&lt;p&gt;There's no refresh token involved. Once it expires, the caller has to request a new one, which keeps every credential reissued against current IAM policy rather than persisting unchecked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an AI agent be tricked into leaking its own Google Cloud credentials through prompt injection?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a real risk if the agent's runtime holds a long-lived key and its reasoning loop has any path to reading environment variables, configuration files, or verbose logs.&lt;/p&gt;

&lt;p&gt;The fix isn't a prompt-level patch. It's architectural: keep credential resolution in trusted application code outside the agent's context, and prefer short-lived tokens over static keys so even a successful leak has a small, time-limited blast radius.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the simplest way to authenticate an AI agent running in a container on Google Cloud?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the container runs on Compute Engine, Cloud Run, or GKE, attach a dedicated service account with only the permissions the agent needs and let ADC resolve it automatically from the metadata server, with no key files or environment variables to manage.&lt;/p&gt;

&lt;p&gt;On GKE specifically, use Workload Identity Federation for GKE to bind the pod's Kubernetes ServiceAccount to that Google identity.&lt;/p&gt;

</description>
      <category>googlecloud</category>
    </item>
    <item>
      <title>What Is Corsair? A Complete Guide to the Integration Platform for Apps and AI Agents</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:15:24 +0000</pubDate>
      <link>https://dev.to/corsairdev/what-is-corsair-a-complete-guide-to-the-integration-platform-for-apps-and-ai-agents-3mba</link>
      <guid>https://dev.to/corsairdev/what-is-corsair-a-complete-guide-to-the-integration-platform-for-apps-and-ai-agents-3mba</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Facaghsgb9g1pyn2plu25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Facaghsgb9g1pyn2plu25.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building an app or AI agent is one thing. Connecting it to all the tools people actually use is another.&lt;/p&gt;

&lt;p&gt;Gmail, Slack, HubSpot, GitHub, Notion, Stripe, and hundreds of other services each come with their own APIs, authentication, permissions, and integration requirements. &lt;strong&gt;Corsair brings those connections into one open-source integration layer, giving developers a simpler way to connect apps and AI agents to real-world tools.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But what exactly is Corsair, and where does it fit in a modern application stack?&lt;/p&gt;

&lt;p&gt;This guide explores the &lt;strong&gt;Corsair platform from end to end&lt;/strong&gt;: what Corsair is and does, the apps, APIs, tools, and MCP integrations it supports, how the platform works, who it is built for, its pricing and plans, and what developers can build with it across real-world teams and industries.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Corsair?
&lt;/h2&gt;

&lt;p&gt;Corsair is an open-source integration layer for apps and AI agents. It connects to 200+ third-party services—things like Slack, Gmail, GitHub, Google Calendar, Notion, HubSpot, Stripe, and Airtable—through one consistent, typed syntax instead of a different SDK and auth flow for every provider.&lt;/p&gt;

&lt;p&gt;Rather than asking a team to hand-build OAuth screens, token refresh logic, and rate-limit handling for each app it needs to reach, &lt;a href="https://corsair.dev/" rel="noopener noreferrer"&gt;Corsair&lt;/a&gt; takes on that repetitive plumbing so developers can focus on the part of the integration that is actually specific to their product.&lt;/p&gt;

&lt;p&gt;The project is Y Combinator backed and released under the Apache 2.0 license, so the full SDK, including its permission system and multi-tenant credential storage, can be self-hosted for free. A hosted version, Corsair Hub, is also available for teams that would rather not run that infrastructure themselves.&lt;/p&gt;

&lt;p&gt;Either way, Corsair positions itself as a genuine AI agent integration platform rather than a thin wrapper around a single protocol, which is why it works equally well for an autonomous agent, a backend service, or a customer-facing dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does Corsair Do? From App Connections to Secure Tool Execution
&lt;/h2&gt;

&lt;p&gt;At its core, Corsair does the unglamorous work that every integration needs and almost nobody wants to write twice. It manages OAuth and API key-based authentication for each connected service, encrypts stored credentials, and refreshes access tokens automatically before they expire.&lt;/p&gt;

&lt;p&gt;It normalizes the very different auth flows, schemas, and error handling that every provider ships on its own terms into one predictable, typed interface.&lt;/p&gt;

&lt;p&gt;It also keeps data current. Incoming updates arrive through webhooks and scheduled polling, landing in a local database partitioned per tenant, so a repeated read does not have to hit the third-party API and burn through a rate limit every single time.&lt;/p&gt;

&lt;p&gt;Security is built into execution itself, not bolted on afterward. You can set a permission mode per integration, so a read-only lookup runs freely while a destructive or sensitive action—sending an email, deleting a record—requires explicit approval before it executes.&lt;/p&gt;

&lt;p&gt;Credentials are resolved internally at the moment a call runs, which means an agent only ever sees the method it invoked and the result that came back, never a raw API key or token. That is what turns a list of AI agent tools into something you can actually put in front of real customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can You Connect With Corsair? Apps, APIs, Tools, and MCP
&lt;/h2&gt;

&lt;p&gt;Corsair ships 200+ integrations as installable plugin packages, each covering a different category of work: communication tools like Slack and Discord, productivity apps like Notion, Google Calendar, and Google Sheets, CRM and sales tools like HubSpot, support platforms like Zendesk, payments through Stripe, operational data in Airtable, and analytics through PostHog, with new plugins added regularly.&lt;/p&gt;

&lt;p&gt;Every plugin follows the same shape once installed: typed API calls, optional webhook support, and, where it makes sense, a locally synced database layer for that provider's data.&lt;/p&gt;

&lt;p&gt;For AI agent tools specifically, Corsair supports MCP integrations directly, so any MCP-compatible agent, including Claude, can call these same plugins as tools without extra glue code.&lt;/p&gt;

&lt;p&gt;It also ships adapters for popular agent frameworks, so teams already building on the Claude Agent SDK, OpenAI's Agents SDK, the Vercel AI SDK, or Mastra can wire Corsair in without switching stacks. Because the underlying layer is a REST API rather than an MCP-only implementation, the exact same integration also works from a plain backend route or a button in a customer dashboard, not only from inside an agent loop.&lt;/p&gt;

&lt;p&gt;If a service you need is not covered yet, the open-source model means you are not stuck waiting on a roadmap. You can scaffold a new plugin, open a pull request, or fork the project and build exactly what you need, all covered in the &lt;a href="https://docs.corsair.dev/introduction" rel="noopener noreferrer"&gt;Corsair documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of Corsair
&lt;/h2&gt;

&lt;p&gt;Corsair's value shows up most clearly once a product has more than one or two integrations to maintain. As a developer integration platform, it is built to keep that maintenance flat as you add more connections rather than letting it grow with every new app.&lt;/p&gt;

&lt;p&gt;Here is what makes Corsair AI agent integrations dependable once a product is live, not just in a demo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-source core:&lt;/strong&gt; The full SDK, including every plugin and the permission system, is released under Apache 2.0 on &lt;a href="https://github.com/corsairdev/corsair" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, so you can inspect, fork, or extend it rather than trust a closed black box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-host for free:&lt;/strong&gt; Run Corsair on your own infrastructure at no cost, with no per-seat pricing and no markup on the API calls you are already paying for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-tenant OAuth:&lt;/strong&gt; Turn on multi-tenancy and every call is automatically scoped to the right tenant's credentials, built for products that serve many customers who each connect their own accounts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission modes by default:&lt;/strong&gt; Assign a permission level per integration so sensitive or destructive actions pause for explicit approval instead of executing silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic token refresh and caching:&lt;/strong&gt; Expiring tokens are renewed quietly in the background, and repeated reads come from a synced local database instead of hitting the third-party API every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP-native, not MCP-only:&lt;/strong&gt; A constant, small set of MCP tools covers setup, discovery, and execution no matter how many plugins are installed, keeping an agent's context lean as your integration list grows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typed developer experience:&lt;/strong&gt; Every call is a typed method with editor autocomplete, not a hand-assembled HTTP request.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Getting from zero to a working integration follows a short, repeatable pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install the packages you need.&lt;/strong&gt; Add the core &lt;code&gt;corsair&lt;/code&gt; package plus the plugin for each service, for example Slack or GitHub, through npm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure one Corsair instance.&lt;/strong&gt; Pass in your plugins, a database connection, and an encryption key that protects stored credentials at rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call it directly, or hand it to an agent.&lt;/strong&gt; Use it as a typed SDK in your own backend code, or expose it as an MCP server so an agent can call it as a tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let the agent discover what is available.&lt;/strong&gt; When Corsair acts as MCP for AI agents, it exposes four tools regardless of plugin count: one to check what is connected and request missing credentials, two to discover available operations and inspect their parameters, and one to actually run the call. That footprint stays the same whether five integrations are connected or two hundred.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data stays fresh underneath.&lt;/strong&gt; Webhooks and polling keep a tenant-partitioned database in sync, so reads are fast and writes still reach the live service immediately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A minimal setup looks roughly like this:&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;createCorsair&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="s1"&gt;corsair&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;slack&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="s1"&gt;@corsair-dev/slack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;github&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="s1"&gt;@corsair-dev/github&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;corsair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createCorsair&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;slack&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nf"&gt;github&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;kek&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CORSAIR_KEK&lt;/span&gt;&lt;span class="o"&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;From there, calls like &lt;code&gt;corsair.slack.api.messages.post(...)&lt;/code&gt; or &lt;code&gt;corsair.github.api.issues.create(...)&lt;/code&gt; behave like any other typed function in your codebase, with framework-specific guides available for Next.js, Node, Express, Hono, SvelteKit, Remix, and Astro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Is Corsair For?
&lt;/h2&gt;

&lt;p&gt;Corsair fits anywhere a product needs to reach outside its own walls reliably, but it tends to show up most in a few recurring situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teams building AI agents that need to act, not just answer.&lt;/strong&gt; If an assistant is meant to actually send the email or update the ticket rather than describe what someone else should do, it needs the kind of AI agent infrastructure Corsair provides underneath it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SaaS companies offering their own customers a "connect your apps" experience.&lt;/strong&gt; Multi-tenant OAuth and per-tenant credential isolation are built in, so you are not designing that system from scratch for every new integration you support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal tools and operations teams&lt;/strong&gt; automating repetitive cross-app work such as sales call prep, order lookups, support triage, or team notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solo developers and small teams&lt;/strong&gt; prototyping on the free Hobby tier, scaling up to production teams on Pro, and enterprises with custom compliance or volume needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone maintaining hand-rolled integrations today&lt;/strong&gt; who is tired of chasing token refreshes, provider deprecations, and schema changes across a dozen separate codebases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Can You Build With Corsair? Real-World Use Cases Across Teams and Industries
&lt;/h2&gt;

&lt;p&gt;Because Corsair connects the same way whether it is called by an agent, a script, or a UI button, the use cases span far beyond a single team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sales:&lt;/strong&gt; An assistant that checks a rep's calendar, drafts and sends a meeting invite, and pulls together a short call brief from CRM notes before a call starts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operations:&lt;/strong&gt; Pulling every unshipped order out of Airtable or a spreadsheet, flagging exceptions, and keeping that view synced without a manual export each morning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer support:&lt;/strong&gt; A helpdesk-connected agent that triages incoming tickets and drafts replies, with sensitive responses held for approval before they send.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engineering:&lt;/strong&gt; Filing a GitHub issue, updating a Linear ticket, and posting a Slack summary automatically the moment a build fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-team visibility:&lt;/strong&gt; Alerting a channel the instant a file lands in a shared drive or a deal changes stage, instead of relying on someone to notice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product-led growth:&lt;/strong&gt; A vertical SaaS company embedding its own "connect your tools" dashboard so customers can link Slack, HubSpot, or a calendar without the vendor building a bespoke integration for each request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Across industries, the pattern repeats: wherever a team already relies on a handful of SaaS tools, there is a use case for letting an agent or a workflow reach into them safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corsair for Developers: Typed Integrations, Authentication, Permissions, Triggers, and Real-Time Tool Calling
&lt;/h2&gt;

&lt;p&gt;This is the section developers tend to care about most, so it is worth breaking down each piece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typed integrations:&lt;/strong&gt; Every plugin ships as a typed client, so your editor autocompletes available methods and parameters instead of you guessing at field names from someone else's API docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; OAuth and API key flows are handled per plugin, credentials are encrypted with your own key, and in multi-tenant setups a call like &lt;code&gt;corsair.withTenant(teamId)&lt;/code&gt; scopes everything to that tenant's credentials automatically, which is the backbone of doing API integrations for AI agents at scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions:&lt;/strong&gt; Assign a permission mode per integration so low-risk reads run freely while destructive or sensitive actions pause for a human approval link before they execute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triggers:&lt;/strong&gt; Webhook hooks on incoming provider events let your product react the moment something changes—a new ticket, an upload, a status change—instead of polling on a fixed schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time tool calling:&lt;/strong&gt; Because reads come from a locally synced, per-tenant database and writes execute immediately against the live service, an agent can look something up and act on it inside a single reasoning step rather than waiting for the next scheduled sync.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Framework support extends beyond agents too. Adapters exist for the Claude Agent SDK, OpenAI's Agents SDK, the Vercel AI SDK, and Mastra, alongside standard web frameworks like Next.js, Node, Express, Hono, SvelteKit, Remix, and Astro, so Corsair fits into a stack you already have rather than requiring a rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corsair Pricing: Plans, Features, and What You Get at Each Tier
&lt;/h2&gt;

&lt;p&gt;Corsair pricing is built around how much of the integration layer you want Corsair to run for you, and no plan requires a credit card to start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hobby — $0 per month:&lt;/strong&gt; Built for small and side projects. Includes unlimited tool calls, up to 50 connections, 100,000 webhook events, unlimited managed permission and auth pages, up to 3 team members, a Corsair-branded consent screen, and community support through Discord.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro — $200 per month:&lt;/strong&gt; Built for teams running in production and currently the most popular plan. Includes unlimited tool calls, connections, webhooks, permission pages, and team members, a custom-branded consent screen, direct support through Slack, and custom integrations built by the Corsair team when you need one that does not exist yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise — Custom pricing:&lt;/strong&gt; Built for organizations with specific scale, compliance, or support requirements. Everything in Pro, with connections, webhooks, team size, branding, support, and custom integration work tailored to the account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the core SDK is open source, self-hosting remains free at any scale for teams that would rather run Corsair on their own infrastructure than pay for the hosted option. Full details, including what counts toward each limit, are on the &lt;a href="https://corsair.dev/#pricing" rel="noopener noreferrer"&gt;Corsair pricing page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Corsair AI agent integrations exist to remove the part of building with AI that has nothing to do with your actual product: the OAuth screens, the token refresh jobs, and the permission checks that every team ends up writing anyway.&lt;/p&gt;

&lt;p&gt;Whether you are shipping a single internal automation or a multi-tenant platform used by thousands of customers, the underlying problem is the same, and it has already been solved once, openly, so you do not have to solve it again from scratch.&lt;/p&gt;

&lt;p&gt;The project is open source, self-hosting is free, and a hosted option is ready the moment you would rather not run that infrastructure yourself. Explore &lt;a href="https://corsair.dev/" rel="noopener noreferrer"&gt;Corsair&lt;/a&gt; and connect your first integration in minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Corsair open source?
&lt;/h3&gt;

&lt;p&gt;Yes. The core SDK and its plugins are released under the Apache 2.0 license, so you can self-host the entire platform, including the permission system and multi-tenant credential storage, on your own infrastructure at no cost. A hosted version, Corsair Hub, runs the same codebase if you would rather not manage that infrastructure yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Corsair support MCP for AI agents?
&lt;/h3&gt;

&lt;p&gt;Yes. Corsair exposes a small, constant set of MCP tools covering setup, discovery, schema inspection, and execution, no matter how many plugins are connected, so an agent's context does not grow just because more integrations are added. Adapters for popular agent frameworks are also available alongside raw MCP support.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Corsair without an AI agent?
&lt;/h3&gt;

&lt;p&gt;Yes. Every integration is also a typed library you can call directly from your own backend, for example wiring a create-calendar-invite button or a scheduled sync-from-Airtable job. An AI agent is one way to use Corsair, not a requirement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does my agent ever see raw API keys or tokens?
&lt;/h3&gt;

&lt;p&gt;No. Corsair resolves credentials internally at the moment a call executes, so an agent only ever sees the method it called and the result that came back, never the underlying token or key.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Is the Difference Between Self-Hosting Corsair and Using Corsair Hub?
&lt;/h3&gt;

&lt;p&gt;Self-hosting runs the full open-source SDK, including every plugin, the permission system, and multi-tenant storage, on your own infrastructure for free. Corsair Hub is the hosted version of that same codebase, managing OAuth callbacks, connect pages, and webhook infrastructure for you, which is useful if you would rather not run that part yourself.&lt;/p&gt;

</description>
      <category>corsair</category>
    </item>
    <item>
      <title>How to Build Durable Long Running AI Agent Tasks Across External APIs</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Sat, 29 Aug 2026 13:14:53 +0000</pubDate>
      <link>https://dev.to/corsairdev/how-to-build-durable-long-running-ai-agent-tasks-across-external-apis-1n2g</link>
      <guid>https://dev.to/corsairdev/how-to-build-durable-long-running-ai-agent-tasks-across-external-apis-1n2g</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn7c4m7fpl7yfb24dnkaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn7c4m7fpl7yfb24dnkaj.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;Most AI agent demos run inside a single request and response cycle: ask a question, get an answer, done. Production agents rarely work that way. They kick off tasks that can span minutes, hours, or days, call a dozen external APIs along the way, wait on a human decision, and need to survive a server restart without losing their place.&lt;/p&gt;

&lt;p&gt;That gap between a demo and a durable AI agent workflow is where most teams building long-running AI agents get stuck, since the very things that make agents useful—chaining tools, calling real APIs, acting over time—are exactly what expose gaps in reliability.&lt;/p&gt;

&lt;p&gt;This guide covers the architecture choices, state design, and failure handling behind real AI agent task orchestration: picking between durable workflows and asynchronous queues, keeping execution state separate from agent reasoning, making external API integration calls safe to retry, pausing tasks without holding a worker open, gating risky actions behind durable approval, and watching for the quieter failure modes that only show up once an agent is running in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right Architecture for Long-Running AI Agent Tasks: Durable Workflows vs Asynchronous Queues
&lt;/h2&gt;

&lt;p&gt;The first decision in AI agent task orchestration is what actually runs the task once it leaves the initial request. Two patterns cover most cases: a durable workflow engine, or a simpler asynchronous queue.&lt;/p&gt;

&lt;p&gt;A durable workflow engine checkpoints progress at every step. If the process crashes or a deployment restarts it, the workflow replays from the last completed step instead of starting over, and it can hold a "sleep" for days or weeks without any external scheduler or cron job watching it. Temporal, Inngest, Trigger.dev, and Hatchet all work this way.&lt;/p&gt;

&lt;p&gt;An asynchronous queue simply moves work off the request path so a job runs later. That is enough for a lot of tasks, but a queue does not give you checkpointing, replay, or durable timers for free. You end up building that layer yourself on top of it.&lt;/p&gt;

&lt;p&gt;A few points help decide which one fits a given task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An asynchronous queue is usually enough when the task is a single-hop, fire-and-forget action, when it does not need to survive a wait of more than a few minutes, and when you are comfortable owning your own retry logic.&lt;/li&gt;
&lt;li&gt;A durable workflow is worth adopting when the task spans multiple steps that must survive a crash or restart, when it needs to pause for hours or days without keeping a worker open, or when you want checkpointing and durable timers built in rather than hand-rolled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Corsair does not try to replace either option; it plugs into whichever one a team already runs. Its Temporal guide shows how to &lt;a href="https://docs.corsair.dev/guides/temporal" rel="noopener noreferrer"&gt;start a Temporal workflow directly from a Corsair webhook event&lt;/a&gt;, so Corsair handles the integration auth and webhook plumbing while Temporal owns durability, retries, and the long-running execution itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decoupling Agent Reasoning From Execution State So Tasks Can Survive Crashes and Restarts
&lt;/h2&gt;

&lt;p&gt;The reasoning loop, meaning the model call that decides what happens next, and the execution state, meaning which steps have already run and what they returned, are conceptually different things. Plenty of early agent builds blur them together and keep both in the memory of a single process.&lt;/p&gt;

&lt;p&gt;That works fine until the process crashes, gets redeployed, or scales down. When it does, both the reasoning context and the record of what already happened disappear together, forcing the task to restart from scratch. Restarting is not just slow; it risks duplicating real-world side effects: sending the same email twice, filing the same ticket twice, charging a card twice.&lt;/p&gt;

&lt;p&gt;The fix is to persist execution state independently of the reasoning process. Every completed step, every tool result, and every decision the agent made gets written somewhere durable before the agent moves on, so a fresh process can resume by reading that state rather than by rerunning the reasoning from the beginning.&lt;/p&gt;

&lt;p&gt;This is why solid AI agent task orchestration tends to look more like an event log or state machine, with a task ID, current step, inputs, outputs, and status, rather than a single long-lived function call holding everything in variables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making External API and Tool Calls Durable With Idempotency, Timeouts, Retries, and Circuit Breakers
&lt;/h2&gt;

&lt;p&gt;Every external API call an agent makes is a point of failure outside your control, and durability at the task level does not help if the calls themselves are fragile. A few practices cover most of the risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idempotency&lt;/strong&gt; keeps retries safe. If a step might run more than once, an idempotency key or an existence check ensures a repeated "create invoice" call is recognized as the same operation instead of producing a second invoice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeouts&lt;/strong&gt; stop a hanging provider from stalling an entire task indefinitely. Every external call needs a bound, paired with a defined fallback for what happens when that bound is hit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retries&lt;/strong&gt; need judgment, not just a loop. Backoff with jitter avoids hammering a struggling API, a retry cap avoids burning budget on something that will never succeed, and distinguishing retryable errors like rate limits and timeouts from permanent ones like invalid auth or a bad request keeps the agent from repeating a call that was never going to work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circuit breakers&lt;/strong&gt; protect the rest of the system. When one external API keeps failing, cutting off calls to it for a cooldown window, rather than retrying endlessly, protects other steps and other tenants sharing the same integration.&lt;/p&gt;

&lt;p&gt;This is exactly the kind of plumbing worth pushing into the integration layer instead of rewriting per provider. Corsair routes every failure through a &lt;a href="https://docs.corsair.dev/concepts/error-handling" rel="noopener noreferrer"&gt;hierarchical error handling system with configurable retry strategies like exponential backoff with jitter&lt;/a&gt;, checked at the plugin level first, then a root-level handler, then sensible defaults, so a rate-limited call to one service does not need custom retry code written from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Agent Continuations to Pause and Resume Tasks Without Keeping Workers Running
&lt;/h2&gt;

&lt;p&gt;Some steps in an agent task have to wait on something external: a long-running batch job, an incoming webhook, or a human decision. Keeping a process, and its whole reasoning context, alive in memory for the entire wait is wasteful and fragile, especially when that wait stretches into hours or days.&lt;/p&gt;

&lt;p&gt;A continuation pattern solves this differently. Instead of blocking, a step returns immediately, its execution state gets persisted, and the worker is freed to do other work or shut down entirely.&lt;/p&gt;

&lt;p&gt;When the awaited event finally arrives, whether that is a webhook, a timer, or an approval, the task resumes from exactly that point, rehydrating only the state it needs rather than replaying the entire reasoning history from the start.&lt;/p&gt;

&lt;p&gt;This is a meaningfully different shape from polling in a loop, which still ties up a process checking again and again. A true continuation releases the resource completely and gets woken back up by the event itself, which is what lets a task span days without a single worker sitting idle the whole time footing the bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Durable Human-in-the-Loop Checkpoints for High-Risk Agent Actions
&lt;/h2&gt;

&lt;p&gt;Some actions carry enough risk that no amount of confidence in the agent's reasoning should skip a human sign-off: deleting a production resource, emailing a large customer list, or moving money. The question is how to make that checkpoint durable rather than just a dialog box that disappears if anything crashes.&lt;/p&gt;

&lt;p&gt;A durable checkpoint needs a few properties. The pending action and its exact arguments get frozen in storage at the moment the checkpoint is created, not just described in a chat transcript, so approval executes precisely what was reviewed rather than a fresh reconstruction of it.&lt;/p&gt;

&lt;p&gt;The approval itself needs an expiry, so a stale request cannot be approved long after the surrounding context has changed. And the checkpoint needs to survive a crash or restart the same way the rest of the task's execution state does, or a server hiccup could quietly drop a pending high-risk action.&lt;/p&gt;

&lt;p&gt;Whether that checkpoint blocks synchronously or resolves asynchronously depends on the situation: synchronous works well when a person is already watching a live review screen, while asynchronous fits background tasks better, since the agent can surface a review link, keep working on anything else that is safe, and pick the blocked action back up once it is approved.&lt;/p&gt;

&lt;p&gt;Corsair's permission layer builds this in directly, mapping each action to a &lt;a href="https://docs.corsair.dev/concepts/permissions" rel="noopener noreferrer"&gt;read, write, or destructive risk tier with a policy per tier, plus single-use approvals and configurable timeouts&lt;/a&gt;, so a high-risk action cannot execute, or accidentally replay, without a durable, reviewable record behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Production Observability to Detect Tool Failures, Agent Loops, and Semantic Degradation
&lt;/h2&gt;

&lt;p&gt;Durable execution solves the crash problem, but it does not automatically tell you when something is quietly going wrong. An agent can get stuck retrying the same failing tool call, a tool can return a technically valid but semantically wrong result, and a task can finish with no error at all while still producing an outcome nobody actually wanted.&lt;/p&gt;

&lt;p&gt;Real AI agent reliability depends on catching all three.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool-level logging&lt;/strong&gt; is the foundation: capture every call, its arguments, its latency, and its result, so a failure is visible immediately instead of three steps later when the task has already gone sideways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loop detection&lt;/strong&gt; catches the second failure mode. Tracking repeated identical calls or repeated task states within a single run, and flagging or halting once a threshold is crossed, stops an agent from silently burning through budget on a call that is never going to succeed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semantic monitoring&lt;/strong&gt; catches the third and hardest one. Sampling completed tasks and checking whether the final state actually matches the intended outcome surfaces the cases where an agent technically finished the job but did the wrong thing, which no amount of retry logic will ever flag on its own.&lt;/p&gt;

&lt;p&gt;Corsair's hooks make the first layer straightforward to add without touching core agent logic. &lt;a href="https://docs.corsair.dev/concepts/hooks" rel="noopener noreferrer"&gt;Before and after hooks wrap every API call and every webhook event&lt;/a&gt;, so logging, auditing, or alerting can sit alongside the integration itself instead of scattered through application code.&lt;/p&gt;

&lt;p&gt;Durability, retries, checkpoints, and human approval rarely show up in a demo, but they decide whether an agent survives contact with real users and real APIs.&lt;/p&gt;

&lt;p&gt;Corsair handles a good share of that plumbing directly: hierarchical retry and error handling per integration, permission gating for high-risk actions, hooks for logging and observability, and native adapters for Temporal, Inngest, Trigger.dev, and Hatchet so a long-running task can pause and resume without holding a worker open the whole time.&lt;/p&gt;

&lt;p&gt;If reliability is the part of your agent stack you would rather not rebuild from scratch, &lt;a href="https://corsair.dev/" rel="noopener noreferrer"&gt;corsair.dev&lt;/a&gt; is worth exploring before your next integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between a durable workflow engine and a simple task queue for AI agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A task queue moves a job off the request path and runs it later, which is enough for short single-step actions, but it does not automatically give a running task checkpoints, replay, or durable timers. A durable workflow engine persists progress at each step, so a task can pause for hours or days and resume exactly where it left off after a crash or restart, without an engineer bolting checkpoint logic on top of the queue by hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you avoid duplicate side effects when a long-running agent task retries a step?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most reliable approach is idempotency: attach a unique key to the operation, such as an invoice ID or a request hash, so a retried step is recognized as the same operation rather than a new one. Combined with clear rules for which errors are safe to retry, like rate limits and timeouts, versus which are not, like invalid input or expired auth, idempotency keeps retries safe instead of turning a single failure into duplicated real-world actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do AI agents get stuck in loops, and how can that be detected in production?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Loops usually happen when an agent repeats a tool call expecting a different result, often because the underlying error was never surfaced clearly, or because its plan does not account for a tool that keeps failing. Catching this in production means tracking repeated identical calls or repeated task states within a single run and flagging or halting once a threshold is crossed, rather than letting the task consume budget indefinitely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes a human-in-the-loop checkpoint durable rather than just a confirmation dialog?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A durable checkpoint freezes the exact pending action and its arguments in storage rather than just describing it in a chat transcript, so approval executes precisely what was reviewed. It also needs an expiry so a stale request cannot be approved long after the surrounding context changed, and it needs to survive a crash or restart the same way the rest of the task's execution state does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is asynchronous consent always better than blocking synchronously for agent tasks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not always. Synchronous blocking works well when a person is already watching a live review screen and wants the agent to continue the moment they approve something. Asynchronous handling fits background tasks better, letting the agent surface a review link, move on to other safe work in the meantime, and resume the blocked action later without tying up a worker the whole time.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why OAuth Gets Complicated When AI Agents Act on Behalf of Users</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Sat, 29 Aug 2026 13:00:01 +0000</pubDate>
      <link>https://dev.to/corsairdev/why-oauth-gets-complicated-when-ai-agents-act-on-behalf-of-users-bhi</link>
      <guid>https://dev.to/corsairdev/why-oauth-gets-complicated-when-ai-agents-act-on-behalf-of-users-bhi</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm3136h4h3tsxwotqbsjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm3136h4h3tsxwotqbsjl.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
OAuth has quietly handled delegated access across the internet for almost two decades, and the model has held up well: a user clicks allow once, an application receives a scoped token, and everyone moves on with reasonable confidence about what that application can and cannot do. AI agents are quietly breaking that assumption in ways most teams only notice once something is already in production.&lt;/p&gt;

&lt;p&gt;An agent does not use a token once for one predictable job. It decides in real time what to do next, often chaining several services together with no human reviewing each step. That shift is forcing a rethink of AI agent authentication, AI agent authorization, and what delegated authorization even means once the party holding the token is capable of making its own decisions.&lt;/p&gt;

&lt;p&gt;This guide walks through where traditional OAuth delegation breaks down for autonomous agents, why scopes alone fall short of real AI agent permissions, and what it actually takes to manage identity, tokens, and consent once an agent, not a person, is the one acting on a user's behalf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Traditional OAuth Delegation Breaks Down for Autonomous AI Agents
&lt;/h2&gt;

&lt;p&gt;OAuth 2.0 was built for a specific kind of delegation: a human clicks allow once, a specific application receives a token scoped to a specific job, and that application behaves in a fairly predictable, bounded way. A photo backup tool reads a photo library. A calendar app reads and writes events. The consent screen describes the job well enough because the job does not change on its own.&lt;/p&gt;

&lt;p&gt;AI agents do not fit that pattern. An agent is not a static integration waiting for one instruction; it is a decision maker that plans its own next step, often across several tools and services without a human checking each call. OAuth delegation authorizes a category of access, not a plan of action, and that mismatch is the root of most complications around OAuth for AI agents.&lt;/p&gt;

&lt;p&gt;Consider a simple case: a user connects a scheduling agent to their calendar so it can find a good time for a team sync. The token grants calendar access, but the agent might reasonably decide to also email attendees, reschedule a conflicting meeting, or pull in a second service to check someone's availability. None of that was described on the original consent screen, yet all of it happens under the same authorized token. Traditional AI agent authentication and AI agent authorization models were never designed to account for a client that improvises.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dual Identity Problem: How Do You Track Both the User and the Agent Acting on Their Behalf?
&lt;/h2&gt;

&lt;p&gt;Classic delegated authorization keeps the identity model simple: a resource owner grants access, a client receives a token, and a resource server checks that token before responding. There is one identity that matters: the user who consented.&lt;/p&gt;

&lt;p&gt;Agents add a second identity that has to be tracked separately: the specific agent instance, run, or subagent actually making the call right now. A single user might have several agents, or several concurrent runs of the same agent, acting under credentials tied to their account. When something goes wrong, "the user authorized this" is not enough information. You also need to know which agent, which task, and which tool call actually performed the action.&lt;/p&gt;

&lt;p&gt;This becomes sharper in multi-tenant systems, where one platform runs agents on behalf of many different users, each of whom connected their own Slack, Gmail, or CRM account. If credentials are not cleanly isolated per user, one tenant's token or data can end up reachable from another tenant's context, and a permissions bug turns into a data breach.&lt;/p&gt;

&lt;p&gt;Corsair handles this by &lt;a href="https://docs.corsair.dev/concepts/multi-tenancy" rel="noopener noreferrer"&gt;scoping every connection, and every database read or write, to its own tenant&lt;/a&gt; automatically, so a user's credentials can never be reached outside their own context, even when many agents run at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why OAuth Scopes Aren't Granular Enough for AI Agent Permissions
&lt;/h2&gt;

&lt;p&gt;OAuth scopes were designed for human-level decisions: read email, send email, access calendar, manage repositories. That granularity works when a person decides once whether to trust an application with a whole category of data.&lt;/p&gt;

&lt;p&gt;An autonomous agent needs a finer question answered: within that category, which specific operations are safe to run without asking anyone first? Reading a message is very different from deleting one. Drafting a reply is very different from sending it to a customer. A scope that says "manage repositories" does not distinguish between opening an issue and deleting the repository itself, yet those two actions carry very different risk.&lt;/p&gt;

&lt;p&gt;This is why AI agent permissions need to sit on top of OAuth scopes rather than replace them. The scope still decides which data class an agent can reach. A separate permission layer then decides which operations inside that scope run automatically and which require a human to approve first.&lt;/p&gt;

&lt;p&gt;A workable pattern here is mapping every endpoint to a risk tier: read, write, or destructive, then setting a policy per tier: allow, deny, or require approval. Corsair's &lt;a href="https://docs.corsair.dev/concepts/permissions" rel="noopener noreferrer"&gt;permission modes map each of those risk tiers to a policy per integration&lt;/a&gt;, so a broad OAuth scope does not automatically mean unrestricted autonomous action.&lt;/p&gt;

&lt;h2&gt;
  
  
  From User Intent to Agent Intent: Why Static OAuth Tokens Struggle With Dynamic Agent Actions
&lt;/h2&gt;

&lt;p&gt;A static access token does not know anything about the plan currently running against it. It is a blunt credential: either it is valid and in scope, or it is not. It has no concept of the task an agent is midway through, or how far that task has drifted from what the user actually asked for.&lt;/p&gt;

&lt;p&gt;That gap between user intent and agent intent is where most surprises happen. A user who asks an agent to clean up their inbox has a loose mental picture in mind, not a list of every archive, label, and delete operation the agent might decide to run to get there. The token authorizes the agent to touch the inbox at all, but it says nothing about which of those specific actions the user would actually be comfortable with.&lt;/p&gt;

&lt;p&gt;Because of this, teams building serious agent products are moving toward task-scoped or session-scoped credentials rather than one long-lived token reused across everything an agent ever does. Constraints get attached to the task itself: this vendor only, this record only, this time window only, rather than relying on a scope string to carry all of that nuance.&lt;/p&gt;

&lt;p&gt;Delegated authorization for agents increasingly needs to describe a bounded plan, not just a bucket of allowed data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing Token Expiry, Refresh Rotation, and Long-Running AI Agent Tasks
&lt;/h2&gt;

&lt;p&gt;OAuth access tokens are intentionally short-lived, often around an hour, with a refresh token used behind the scenes to mint a new one. That design works well for a typical web request that finishes in milliseconds. It gets much harder for an agent running a workflow that spans hours or days: watching an inbox, waiting on a webhook, or pausing for a human approval before continuing.&lt;/p&gt;

&lt;p&gt;If refresh handling is not automatic, an agent can fail silently partway through a task, or worse, keep retrying with an expired token until the provider rate limits or locks the account.&lt;/p&gt;

&lt;p&gt;Refresh token rotation, where a provider issues a brand-new refresh token on every use and immediately invalidates the old one, adds a second failure mode: any system that does not persist the new token instantly, or that triggers two refreshes at once, can permanently lock itself out of a user's connected account.&lt;/p&gt;

&lt;p&gt;This is plumbing that should not be rewritten for every integration a product adds. Corsair &lt;a href="https://docs.corsair.dev/concepts/oauth" rel="noopener noreferrer"&gt;checks token expiry before every API call and refreshes automatically using the stored refresh token&lt;/a&gt;, so a long-running agent task does not need its own retry and refresh logic bolted on for each service it touches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solving the Asynchronous Consent Gap When AI Agents Need New Permissions Mid-Task
&lt;/h2&gt;

&lt;p&gt;Classic OAuth consent happens once, up front, before an application does anything at all. Agents routinely break that assumption by discovering, midway through a task, that they need a permission nobody granted yet. A user asks an agent to find and cancel their old subscriptions, and the agent finds one running through a service it was never connected to in the first place.&lt;/p&gt;

&lt;p&gt;Nobody is sitting there watching every tool call, so pausing the entire task for a synchronous popup does not match how agents actually run. What works better is asynchronous consent: the agent pauses only the one action that needs approval, surfaces a request through a review link, a Slack message, or an email, and continues anything else it can safely do while it waits.&lt;/p&gt;

&lt;p&gt;Once approved, it resumes that specific action instead of restarting the whole run from scratch.&lt;/p&gt;

&lt;p&gt;This is a meaningfully different shape than a redirect-based OAuth consent screen. It looks more like a queued approval system sitting next to OAuth. Corsair's Hub, for example, &lt;a href="https://docs.corsair.dev/hub/overview" rel="noopener noreferrer"&gt;hosts an approve or deny page for gated permissions&lt;/a&gt;, so a blocked action can be reviewed and released without the agent losing the context of the task it was already working through.&lt;/p&gt;

&lt;p&gt;None of this means OAuth is the wrong foundation for AI agents. It just means the layer sitting on top of it now has to do considerably more work: tracking dual identities, enforcing permissions finer than a scope string, refreshing tokens reliably through long-running tasks, and handling consent as an ongoing conversation rather than a one-time screen.&lt;/p&gt;

&lt;p&gt;Corsair was built to carry that weight so individual teams are not rebuilding the same plumbing for every new integration. It wraps OAuth, multi-tenant credential storage, automatic token refresh, and permission gating into a single open-source layer that plugs into an existing app. Anyone building an agent that needs to act across Gmail, Slack, GitHub, or any of the hundreds of other services people rely on can see how it fits together at &lt;a href="https://corsair.dev/" rel="noopener noreferrer"&gt;corsair.dev&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between AI agent authentication and AI agent authorization?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authentication confirms an agent, or the backend running it, is who it claims to be, usually through an API key or a signed token issued to your application. Authorization is the separate question of what that authenticated agent is allowed to do on a specific user's behalf: which services it can reach and which operations inside those services are permitted. An agent can be fully authenticated and still be authorized for almost nothing, which is exactly the separation OAuth delegation is meant to enforce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can one OAuth token be shared safely across multiple AI agents or subagents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generally not without careful scoping. Sharing a single token across several agents removes the ability to tell which agent instance performed which action, which makes auditing and revocation much harder later. A cleaner pattern is retrieving credentials per tenant and per task, so each agent run operates in its own traceable context even when several agents work on behalf of the same user at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How should a system handle an AI agent that needs a permission it was not originally granted?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The safer pattern blocks only the one action that needs approval rather than the entire task, and routes it through an explicit review step: a hosted approval link, a Slack message, or an email. Once approved, the system resumes that specific action instead of restarting the whole workflow. This asynchronous consent gap is one of the clearest differences between human-facing OAuth flows and agent-facing ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do AI agents need shorter-lived OAuth tokens than typical web apps?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not necessarily shorter, since token lifetime is usually set by the provider rather than the application. What matters more for agents is refresh reliability, since their tasks can run far longer than a typical web session. A token expiring midway through a multi-hour workflow should never cause a silent failure if refresh and rotation are handled automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it safe to give an AI agent full OAuth scopes just to avoid permission errors mid-task?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a common shortcut, and it carries real risk, since a scope grants access to an entire category of data or actions rather than the specific operations an agent actually needs. A safer approach layers finer-grained AI agent permissions on top of the scope itself: reads can be allowed freely while writes and destructive actions get gated behind human approval, so a broad scope never quietly becomes unrestricted autonomous access.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building Multi-Tenant Tool Access for AI Agents</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Sat, 29 Aug 2026 12:47:21 +0000</pubDate>
      <link>https://dev.to/corsairdev/building-multi-tenant-tool-access-for-ai-agents-1md</link>
      <guid>https://dev.to/corsairdev/building-multi-tenant-tool-access-for-ai-agents-1md</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw5vo7oy3lh2gscwfxone.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw5vo7oy3lh2gscwfxone.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
An agent that flawlessly handles one Slack workspace and one Gmail inbox in a demo tells you almost nothing about whether it can serve a thousand different customers safely. The moment a product moves from a single test account to real tenants, the question stops being whether the agent can reach a tool, and becomes whether it reaches the right tool, with the right credentials, scoped to the right tenant, without ever touching data that belongs to someone else.&lt;/p&gt;

&lt;p&gt;Multi-tenant AI agents raise a specific version of a problem that multi-tenant software has dealt with for years, made harder by the fact that agents decide at runtime which tools to call and in what order. That runtime decision making means tenant boundaries have to hold at every call an agent might make, not just the handful an engineer thought to test. &lt;/p&gt;

&lt;p&gt;This guide walks through building that access layer deliberately: how to design agent identity and delegated authentication, how to build authorization and policy enforcement granular enough to matter, how a centralized MCP registry keeps tool discovery and credentials manageable as your integration count grows, how tenant isolation needs to be enforced at the database level, and how to sandbox agent code execution safely once agents start writing and running their own code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Multi-Tenant Tool Access Gets Harder When AI Agents Move From Prototype to Production
&lt;/h3&gt;

&lt;p&gt;Most AI agent prototypes start with one set of credentials. A single Slack bot token, one Google account, one API key sitting in an environment variable. That setup works fine for a demo because there is only one tenant in the room: whoever is running the test. The moment a product signs its second customer, that assumption breaks, and it keeps breaking in ways that are easy to miss until they show up as a support ticket or a security incident.&lt;/p&gt;

&lt;p&gt;The core problem is that AI agents behave differently from the applications multi-tenant architecture was originally designed around. A traditional web app calls a small, fixed set of endpoints in a predictable order, so tenant scoping can be checked at a handful of well understood boundaries. An agent decides at runtime which tool to call and sometimes chains several calls together to complete one request. Every one of those decisions is a new place where AI agent tool access needs to be scoped correctly for the tenant making the request, not just the paths a developer happened to test.&lt;/p&gt;

&lt;p&gt;Add multiple tenants into that picture and the failure modes multiply. A calendar invite gets drafted using the wrong customer's Gmail account. An agent retrieves a document scoped to the wrong workspace because the underlying tool call never checked which workspace it was supposed to run against. None of this requires malicious intent. It is simply what happens when tool access is not designed for more than one tenant from the start. Getting this right is a matter of AI agent security as much as it is architecture, and it only gets more expensive to fix the longer it waits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing Agent Identity, Delegated Authentication, and Tenant Isolation for Secure Tool Access
&lt;/h2&gt;

&lt;p&gt;An agent is not the same identity as the end user it is acting for, and it is not the same identity as the developer's own backend service either. Treating all three as one identity is where a lot of AI agent authentication problems start. The end user has an account with your product. The tenant is the organization or workspace that user belongs to. The agent is a separate actor that needs permission to act on behalf of that user, inside that tenant, for a specific set of tools, and nothing more.&lt;/p&gt;

&lt;p&gt;Delegated authentication is the mechanism that keeps those three layers connected without collapsing them into one. Instead of an agent holding its own broad credentials for Gmail or Slack, it receives a token issued on behalf of a specific tenant, scoped to specific actions, tied to an authorization the user actually granted. When the agent calls a tool, the system resolves which tenant's credentials apply at that moment, rather than trusting the agent to keep track of whose data it is currently touching. This is the same pattern behind standard OAuth delegation, applied consistently across every tool an agent might call instead of one integration at a time. Corsair's &lt;a href="https://docs.corsair.dev/concepts/auth" rel="noopener noreferrer"&gt;authentication documentation&lt;/a&gt; shows this pattern applied directly: an agent operates through a tenant scoped call, and the underlying OAuth token, API key, or bot token is resolved and refreshed automatically behind it, without the agent ever handling the raw credential itself.&lt;/p&gt;

&lt;p&gt;Tenant isolation follows naturally once identity is designed this way. If every credential lookup is keyed by tenant, and the agent never sees a raw token, only a resolved capability to call a method, there is no code path where one tenant's session can accidentally reach another tenant's account. That guarantee has to live below the agent's reasoning, in the layer that actually executes tool calls, because an agent's own judgment is not a security boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Granular Authorization and Policy Enforcement for Every Agent, Tool, Function, and Action
&lt;/h2&gt;

&lt;p&gt;Authentication answers who is calling. Authorization answers what they are allowed to do once they are in, and for AI agents that question needs an answer at four separate levels: the agent itself, the tool it is calling, the specific function within that tool, and the individual action that function is about to take. Collapsing these into a single yes or no permission check is how agents end up either blocked from harmless reads or, worse, cleared to run destructive writes they were never meant to touch.&lt;/p&gt;

&lt;p&gt;A practical AI agent authorization model starts with scoping access per integration and per tenant, so a workspace that only ever needed read access to a CRM cannot suddenly write to it just because the underlying plugin technically supports writes. From there, functions within a tool get their own scope. Reading a calendar and creating an event are different permissions even though both live inside the same integration. Individual actions with real world consequences, particularly sending an email or deleting a record, deserve a policy check of their own, often one that requires a human to approve before the call executes rather than trusting the agent's confidence that it made the right call.&lt;/p&gt;

&lt;p&gt;Where this policy enforcement actually lives matters as much as how granular it is. It cannot sit inside the model's reasoning, because a language model can be persuaded, confused, or simply wrong about whether an action is safe. It has to sit in the layer between the agent's decision and the actual API call, so the same check runs regardless of how the agent arrived at that decision, and regardless of whether the agent reaches the tool through MCP, a direct SDK call, or a hosted API. Corsair's &lt;a href="https://docs.corsair.dev/concepts/permissions" rel="noopener noreferrer"&gt;permissions documentation&lt;/a&gt; shows one way to implement this: every endpoint carries a risk level of read, write, or destructive, and a permission mode maps each level to an outcome of allow, deny, or require approval, so a destructive call can sit blocked until a human signs off before it ever reaches the provider's API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing a Centralized MCP Registry for Dynamic Tool Discovery, Credentials, and Reliability
&lt;/h2&gt;

&lt;p&gt;Once an agent needs more than a handful of tools, wiring up separate MCP servers for each one starts to show its limits fast. Every new server means another OAuth flow to configure, another set of credentials to store, and another schema competing for space in the agent's context window. Teams that go this route often discover the problem only after the fact: an agent given direct access to forty tool schemas at once starts hallucinating which tool to call, simply because there is too much to reason over in a single request.&lt;/p&gt;

&lt;p&gt;A centralized MCP registry solves this from the opposite direction. Instead of every tool being wired in individually, tools are registered once in a catalog the agent queries dynamically. Rather than injecting every available schema upfront, the registry surfaces only the tools relevant to the current request, which keeps AI agent tool access fast and keeps the context window from filling up with methods the agent will never call in that session. Credentials are resolved behind that same layer, scoped to whichever tenant is making the request, so the agent only ever sees method names and results, never a raw token. This is also the point where MCP tool access gets monitored and rate limited consistently, instead of that logic being reimplemented differently inside each individual tool call.&lt;/p&gt;

&lt;p&gt;Reliability is the other half of what a registry buys you. Rate limits, retries, and the quiet API changes that break integrations without warning all get handled once, centrally, instead of being reimplemented inside every tool call an agent makes. Corsair's MCP adapters work this way in practice: an agent calls a small, fixed set of meta tools, list operations, get schema, run script, and every registered plugin becomes reachable through those same calls, with no additional wiring needed as new tools are added to the catalog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enforcing Database Level Tenant Isolation, Data Residency, and Zero Retention Data Flows
&lt;/h2&gt;

&lt;p&gt;Application level checks are necessary but not sufficient. If a query can technically reach another tenant's row and the only thing stopping it is a conditional in your application code, one missed check away from a data leak is closer than it feels. Database level tenant isolation, through row level security, per tenant schemas, or partitioned tables keyed by tenant ID, means the database itself refuses the query rather than relying on every code path remembering to filter correctly.&lt;/p&gt;

&lt;p&gt;Credentials deserve the same treatment as data. Encrypting each tenant's stored tokens with its own data encryption key, rather than one shared secret for the whole system, means a compromise of one tenant's credentials never cascades into every other tenant's accounts. This is worth getting right early, since retrofitting per tenant encryption after credentials are already stored under a shared key is considerably more painful than designing for it from the start. Corsair's &lt;a href="https://docs.corsair.dev/concepts/multi-tenancy" rel="noopener noreferrer"&gt;multi-tenancy documentation&lt;/a&gt; shows what this looks like at the query level: every insert is tagged with a tenant ID automatically, every read is scoped with a matching where clause, and there is no code path in the normal API that can accidentally cross that boundary.&lt;/p&gt;

&lt;p&gt;Data residency adds another layer for teams selling into regulated industries or specific geographies, where a customer's data needs to physically stay within a jurisdiction rather than simply being logically separated from other tenants. Zero retention data flows matter for what happens after a tool call completes. An agent that resolves a credential, makes a call, and returns a result should not be leaving a copy of the raw payload sitting in a log file or a prompt cache longer than it needs to. Syncing data through webhooks and refreshing it on demand, rather than storing full copies indefinitely, keeps the surface area of what could leak proportional to what the agent actually needs at any given moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Securing Agent Code Execution With Runtime Sandboxing, Isolation Boundaries, and Progressive Trust
&lt;/h2&gt;

&lt;p&gt;Tool calls are one category of risk. Letting an agent write and execute its own code is a different one, because at that point you are handing over compute, not just an API method. Runtime sandboxing exists for exactly this reason: an isolated environment where agent generated code runs without reaching the host filesystem, the network beyond what is explicitly allowed, or another tenant's session running alongside it.&lt;/p&gt;

&lt;p&gt;The isolation boundaries that matter here are the same ones that matter in any multi-tenant compute environment, just applied to a much less predictable caller. Filesystem access should be scoped to a workspace the sandbox owns and nothing outside it. Network access should default to blocked and get opened only for the specific destinations a task requires. Resource limits on memory and CPU keep one runaway agent loop from degrading the environment every other tenant's agent is also running in. Every sandbox should be ephemeral by default, torn down after use rather than left running and accumulating state nobody is actively reviewing.&lt;/p&gt;

&lt;p&gt;Progressive trust is the piece that often gets skipped in a rush to ship. A new agent, or an agent operating in a context it has not proven itself in yet, should start in the most restrictive sandbox available: no network, minimal filesystem, tight resource caps. Trust should expand only as the agent demonstrates reliable behavior over real usage, the same way you would extend more access to a new hire once their judgment has actually been tested, not on day one. Treating sandbox permissions as something that only ever loosens, and rarely gets revisited once granted, is how a reasonable initial setup quietly turns into an oversized attack surface a year later.&lt;/p&gt;

&lt;p&gt;Corsair handles most of what this guide covers as infrastructure rather than something your team builds from scratch: multi-tenant credential isolation, scoped authorization per tool and per action, a centralized registry for MCP tool access, and encrypted storage keyed per tenant. It is open source and can be self-hosted, so you can inspect exactly how tenant isolation and delegated authentication are implemented rather than trusting a closed system with your users' credentials. If you are building an agent that needs to serve more than one customer safely, corsair.dev is worth a look before you build this layer yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does multi-tenant tool access mean for AI agents?&lt;/strong&gt;&lt;br&gt;
It means an agent can call the same set of tools, like Gmail, Slack, or a CRM, on behalf of many different customers, while guaranteeing that each customer's credentials, data, and permissions stay completely separate from every other customer's. The tools themselves are shared. The access to them is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is AI agent authentication different from regular user authentication?&lt;/strong&gt;&lt;br&gt;
Regular user authentication verifies a person logging into a product. AI agent authentication verifies an autonomous process acting on behalf of that person or their organization, usually through a delegated token scoped to specific tools and actions rather than a full login session. The agent's identity, the user's identity, and the tenant it belongs to are tracked as three separate things, not folded into one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between AI agent authentication and AI agent authorization?&lt;/strong&gt;&lt;br&gt;
Authentication confirms which agent, tenant, or user is making a request. Authorization determines what that verified identity is actually allowed to do once inside, down to the level of individual tools, functions, and actions. An agent can be correctly authenticated and still be authorized for almost nothing, which is usually the safer default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why use a centralized MCP registry instead of separate MCP servers per tool?&lt;/strong&gt;&lt;br&gt;
Wiring up a separate MCP server for every tool means repeating OAuth setup, credential storage, and schema maintenance for each one, and it floods the agent's context with every available method whether it needs them or not. A centralized registry handles credential resolution and tool discovery in one place, surfacing only relevant tools per request and keeping MCP tool access consistent as the tool catalog grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you stop one tenant's data from reaching another tenant's agent session?&lt;/strong&gt;&lt;br&gt;
Isolation has to exist at more than one layer: scoped credentials resolved per tenant at call time, database level checks like row level security that reject cross tenant queries outright, and per tenant encryption keys so a single compromised credential cannot expose other tenants. Relying on application code alone to remember the tenant filter on every query is the most common way this isolation quietly fails.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Open for Business: How Suppliers Can Sell Into Construction Projects</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Tue, 19 May 2026 13:07:10 +0000</pubDate>
      <link>https://dev.to/corsairdev/open-for-business-how-suppliers-can-sell-into-construction-projects-507e</link>
      <guid>https://dev.to/corsairdev/open-for-business-how-suppliers-can-sell-into-construction-projects-507e</guid>
      <description>&lt;p&gt;Construction is full of suppliers.&lt;br&gt;
Material companies, fabricators, equipment providers, logistics firms, installation companies, and regional manufacturers all want access to better projects.&lt;br&gt;
But selling into construction is difficult.&lt;br&gt;
Many suppliers still rely on relationships, cold calls, email lists, estimator contacts, and chance opportunities. If they are not already known by a GC or trade contractor, it can be hard to get included in the right conversations.&lt;br&gt;
The problem is not that suppliers lack value.&lt;br&gt;
The problem is that construction does not have a clear route to market.&lt;br&gt;
Merlin Merchant is built around that gap.&lt;br&gt;
Construction Is Not One Market&lt;br&gt;
Construction is not a single, organized marketplace.&lt;br&gt;
It is thousands of individual projects. Each project has its own team, budget, schedule, scopes, and purchasing needs.&lt;br&gt;
For suppliers, this creates a major challenge.&lt;br&gt;
Even if a supplier has the right product or service, they still need to reach the right project at the right time. They need to be visible when RFQs are issued. They need to price scopes quickly. They need to fit into the project’s procurement workflow.&lt;br&gt;
That is hard to do through cold outreach alone.&lt;br&gt;
Suppliers need to be present inside the places where construction buying decisions are already happening.&lt;br&gt;
Why Traditional Sales Channels Are Limited&lt;br&gt;
Many suppliers depend on personal relationships.&lt;br&gt;
That works when the supplier already has strong local connections. But it limits growth.&lt;br&gt;
A regional manufacturer may want to enter a new market. A fabricator may want more project exposure. A logistics provider may want to work with more contractors. A new building product company may want to get specified and purchased.&lt;br&gt;
But without access to active project workflows, these companies are often stuck outside the buying process.&lt;br&gt;
They may send emails that never get answered. They may call estimators at the wrong time. They may not know which projects need their products.&lt;br&gt;
The result is missed opportunity.&lt;br&gt;
What Merlin Merchant Does&lt;br&gt;
Merlin Merchant gives suppliers a way to connect with real construction purchasing workflows.&lt;br&gt;
It is not traditional e-commerce. It is not Amazon for construction. It is not just advertising.&lt;br&gt;
It is a way for suppliers to be visible inside project buying activity.&lt;br&gt;
Suppliers can list products, receive RFQs, price scopes, sell into live projects, and participate in procurement workflows.&lt;br&gt;
That is important because construction buying is not only about browsing products. It is about matching the right supplier to the right project need at the right time.&lt;br&gt;
Merlin Merchant helps make that connection easier.&lt;br&gt;
Who Merlin Merchant Is For&lt;br&gt;
Merlin Merchant is designed for:&lt;br&gt;
Material suppliers&lt;br&gt;
 Fabricators&lt;br&gt;
 Equipment suppliers&lt;br&gt;
 Logistics providers&lt;br&gt;
 Installation companies&lt;br&gt;
 Regional manufacturers&lt;br&gt;
 Building product companies&lt;br&gt;
 Importers and distributors&lt;br&gt;
 Specialty subcontractors&lt;br&gt;
 Service providers&lt;br&gt;
 New products entering the construction market&lt;br&gt;
These companies need better access to projects and customers.&lt;br&gt;
They do not only need a website. They need a way to be found when projects are actually buying.&lt;br&gt;
Why This Matters for Suppliers&lt;br&gt;
The construction sales process is often slow and relationship-heavy.&lt;br&gt;
That will not disappear. Relationships still matter.&lt;br&gt;
But suppliers also need better visibility. They need access to project demand. They need to respond to scopes, RFQs, and purchasing needs in a more structured way.&lt;br&gt;
Merlin Merchant helps suppliers move from waiting for opportunities to participating in active project workflows.&lt;br&gt;
This can help suppliers build stronger project relationships, win more relevant work, and expand into new markets.&lt;br&gt;
The Future of Construction Procurement&lt;br&gt;
Construction procurement is becoming more connected.&lt;br&gt;
Projects need better supplier access. Suppliers need better project visibility. Trades need faster pricing. Owners need more reliable supply chains.&lt;br&gt;
Merlin Merchant sits at that connection point.&lt;br&gt;
It helps construction projects buy materials and services while helping suppliers get closer to real demand.&lt;br&gt;
For suppliers, that means a clearer route into construction projects.&lt;br&gt;
For project teams, it means better access to the companies that can help them deliver.&lt;br&gt;
Call to action:&lt;br&gt;
 Learn how Merlin Merchant helps suppliers sell into construction projects at &lt;a href="https://www.merlinai.co/" rel="noopener noreferrer"&gt;https://www.merlinai.co/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From Construction to Production: Why Contractors Need a New Operating System</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Tue, 19 May 2026 13:04:30 +0000</pubDate>
      <link>https://dev.to/corsairdev/from-construction-to-production-why-contractors-need-a-new-operating-system-2d6g</link>
      <guid>https://dev.to/corsairdev/from-construction-to-production-why-contractors-need-a-new-operating-system-2d6g</guid>
      <description>&lt;p&gt;Construction is changing.&lt;br&gt;
Many trades and contractors are no longer doing all their work on the jobsite. Mechanical contractors are building prefab racks. Electrical contractors are assembling conduit off-site. Framing companies are building panelized walls. General contractors are starting self-perform divisions. Many companies are opening warehouses, kitting operations, and production shops.&lt;br&gt;
This is not traditional construction anymore.&lt;br&gt;
It is production.&lt;br&gt;
But most contractors are still trying to manage this new type of work with tools made for jobsite coordination. They use spreadsheets, whiteboards, WhatsApp, emails, and disconnected project management platforms. These tools may help with communication, but they do not run production.&lt;br&gt;
That is the gap Merlin EOS is built to solve.&lt;br&gt;
Construction Companies Are Becoming Production Companies&lt;br&gt;
When work moves from the jobsite into a shop, the business changes.&lt;br&gt;
A prefab shop needs inventory control. A warehouse needs material tracking. A kitting operation needs work orders. A self-perform division needs labor planning, cost control, and production workflows.&lt;br&gt;
These are not just project management problems.&lt;br&gt;
They are operational problems.&lt;br&gt;
A contractor may still be in the construction industry, but part of the company now behaves like a manufacturing business. It needs repeatable workflows, clear processes, and live visibility into what is being built, what materials are available, and what needs to move next.&lt;br&gt;
This is where many contractors struggle.&lt;br&gt;
Their accounting software does not manage production. Their project management software does not manage shop workflows. Their estimating software does not manage inventory. So teams fill the gaps with spreadsheets and manual updates.&lt;br&gt;
That works for a while.&lt;br&gt;
Then the business grows, and the chaos grows with it.&lt;br&gt;
Why Existing Tools Fall Short&lt;br&gt;
Most construction software assumes the jobsite is the center of the business.&lt;br&gt;
But for many modern contractors, important work happens before the jobsite.&lt;br&gt;
Materials are ordered, staged, assembled, packed, shipped, and installed. If that process is not managed well, the jobsite suffers. Crews wait. Materials go missing. Work gets delayed. Costs rise.&lt;br&gt;
The problem is not lack of effort.&lt;br&gt;
The problem is lack of operational coordination.&lt;br&gt;
A contractor running prefab or self-perform work needs more than a documentation platform. They need a system that connects inventory, work orders, production planning, purchasing, cost tracking, logistics, and shop activity.&lt;br&gt;
How Merlin EOS Helps&lt;br&gt;
Merlin EOS is designed for the production side of construction businesses.&lt;br&gt;
It helps contractors manage the work that happens before the jobsite. That includes prefab shops, assembly lines, warehouses, kitting operations, self-perform divisions, service teams, and manufacturing units serving construction.&lt;br&gt;
Instead of forcing production teams into a traditional project management system, Merlin EOS gives them a workflow built around how production actually works.&lt;br&gt;
It helps teams answer practical questions:&lt;br&gt;
What materials are available?&lt;br&gt;
What needs to be assembled?&lt;br&gt;
Which work orders are active?&lt;br&gt;
What is ready for delivery?&lt;br&gt;
Where is cost moving?&lt;br&gt;
What is blocking production?&lt;br&gt;
What needs attention today?&lt;br&gt;
These questions matter because production delays quickly become project delays.&lt;br&gt;
Who Merlin EOS Is For&lt;br&gt;
Merlin EOS is especially useful for:&lt;br&gt;
Mechanical contractors building prefab assemblies&lt;br&gt;
 Electrical contractors doing off-site assembly&lt;br&gt;
 Framing companies building panels&lt;br&gt;
 Drywall companies pre-cutting and kitting&lt;br&gt;
 GCs starting self-perform divisions&lt;br&gt;
 Contractors opening warehouses&lt;br&gt;
 Modular builders&lt;br&gt;
 Millwork and cabinet suppliers&lt;br&gt;
 Any trade moving work off-site&lt;br&gt;
These companies are not just managing projects. They are building repeatable production systems inside construction.&lt;br&gt;
The Future of Contracting Is Industrialized&lt;br&gt;
The next generation of successful contractors will not only be good at field execution. They will also be good at production planning, inventory control, logistics, and repeatable delivery.&lt;br&gt;
Construction is becoming more industrialized.&lt;br&gt;
Contractors that understand this shift early will have an advantage. They will reduce waste, improve predictability, and make better use of labor and materials.&lt;br&gt;
Merlin EOS supports that shift.&lt;br&gt;
It helps contractors move from construction chaos to production control.&lt;br&gt;
Call to action:&lt;br&gt;
 Learn how Merlin EOS helps contractors run production operations at &lt;a href="https://www.merlinai.co/" rel="noopener noreferrer"&gt;https://www.merlinai.co/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Construction Procurement Is Not Amazon for Building Materials</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Tue, 12 May 2026 11:01:55 +0000</pubDate>
      <link>https://dev.to/corsairdev/why-construction-procurement-is-not-amazon-for-building-materials-5ejj</link>
      <guid>https://dev.to/corsairdev/why-construction-procurement-is-not-amazon-for-building-materials-5ejj</guid>
      <description>&lt;p&gt;It is easy to describe construction procurement as e-commerce.&lt;br&gt;
But that comparison is too simple.&lt;br&gt;
Construction buying does not work like buying a product from an online store.&lt;br&gt;
A project team cannot just add materials to a cart and move on. Every purchase is connected to scope, schedule, drawings, approvals, delivery windows, trades, site conditions, and cost risk.&lt;br&gt;
That is why construction procurement needs a different model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Construction purchases carry project risk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a construction team buys a material or service, the decision affects the project.&lt;br&gt;
The wrong product can delay installation.&lt;br&gt;
 A late delivery can block a trade.&lt;br&gt;
 A missing approval can slow procurement.&lt;br&gt;
 A poor substitution can create rework.&lt;br&gt;
 A supplier issue can affect the schedule.&lt;br&gt;
 A logistics problem can create site congestion.&lt;br&gt;
This is why construction buying is more complex than normal e-commerce.&lt;br&gt;
A product page alone does not solve the problem.&lt;br&gt;
Project teams need suppliers that can respond to real scopes, real timing, and real constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suppliers need more than a listing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many suppliers think visibility means having a website, product catalog, or sales rep.&lt;br&gt;
Those are important, but they are not enough.&lt;br&gt;
To win work, suppliers need to be present when buying decisions are happening.&lt;br&gt;
That means being visible when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RFQs are issued&lt;/li&gt;
&lt;li&gt;Scopes are priced&lt;/li&gt;
&lt;li&gt;Materials are compared&lt;/li&gt;
&lt;li&gt;Substitutions are considered&lt;/li&gt;
&lt;li&gt;Project teams need alternatives&lt;/li&gt;
&lt;li&gt;Contractors need reliable vendors&lt;/li&gt;
&lt;li&gt;Delivery timing matters&lt;/li&gt;
&lt;li&gt;Procurement decisions affect schedule
This is workflow-based selling.
It is different from passive advertising.
**
Project teams need better supplier access**&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is not only on the supplier side.&lt;br&gt;
Project teams also need better access to suppliers.&lt;br&gt;
A contractor may need a fabricator quickly.&lt;br&gt;
 A trade may need alternate pricing.&lt;br&gt;
 A project manager may need a logistics provider.&lt;br&gt;
 An owner may want better visibility into purchasing options.&lt;br&gt;
 A procurement team may need more reliable vendor participation.&lt;br&gt;
If supplier discovery depends only on old relationships, the project may miss better options.&lt;br&gt;
That creates risk for cost, schedule, and quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where Merlin Merchant fits&lt;/strong&gt;&lt;br&gt;
Merlin Merchant is designed for suppliers that want to sell into real construction projects.&lt;br&gt;
It helps suppliers list products and services, receive RFQs, price scopes, and become visible inside project purchasing workflows.&lt;br&gt;
It is not trying to copy consumer e-commerce.&lt;br&gt;
It is focused on construction buying as it actually works: project-based, scope-based, and workflow-driven.&lt;br&gt;
That makes it useful for suppliers such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Material providers&lt;/li&gt;
&lt;li&gt;Fabricators&lt;/li&gt;
&lt;li&gt;Equipment suppliers&lt;/li&gt;
&lt;li&gt;Logistics companies&lt;/li&gt;
&lt;li&gt;Installation companies&lt;/li&gt;
&lt;li&gt;Regional manufacturers&lt;/li&gt;
&lt;li&gt;Specialty subcontractors&lt;/li&gt;
&lt;li&gt;Building product companies&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The future is project-based commerce&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Construction does not need another generic catalog.&lt;br&gt;
It needs better connection between project demand and supplier capacity.&lt;br&gt;
That is the opportunity.&lt;br&gt;
Suppliers want access to projects.&lt;br&gt;
 Projects need reliable suppliers.&lt;br&gt;
 Trades need pricing and delivery clarity.&lt;br&gt;
 Owners need better procurement outcomes.&lt;br&gt;
A workflow-based marketplace can bring these sides closer together.&lt;br&gt;
That is the idea behind Merlin Merchant.&lt;br&gt;
It gives suppliers a clearer way to become visible inside real construction purchasing activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final thought&lt;/strong&gt;&lt;br&gt;
Construction procurement is not Amazon for building materials.&lt;br&gt;
It is more complex, more connected, and more dependent on timing.&lt;br&gt;
The suppliers that win will be the ones that show up at the right moment, inside the right project workflow.&lt;br&gt;
That is what “Open for Business” means in construction.&lt;/p&gt;

&lt;p&gt;Learn more about Merlin AI: &lt;a href="https://www.merlinai.co/" rel="noopener noreferrer"&gt;https://www.merlinai.co/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Construction Suppliers Need a Better Route to Market</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Tue, 12 May 2026 10:59:26 +0000</pubDate>
      <link>https://dev.to/corsairdev/construction-suppliers-need-a-better-route-to-market-2c8o</link>
      <guid>https://dev.to/corsairdev/construction-suppliers-need-a-better-route-to-market-2c8o</guid>
      <description>&lt;p&gt;Selling into construction is hard.&lt;br&gt;
Not because suppliers lack good products.&lt;br&gt;
 Not because fabricators lack skill.&lt;br&gt;
 Not because manufacturers lack capacity.&lt;br&gt;
 Not because logistics providers cannot solve real problems.&lt;br&gt;
The bigger issue is access.&lt;br&gt;
Construction is not one simple market. It is thousands of individual projects, each with its own teams, scopes, timelines, budgets, relationships, and procurement workflows.&lt;br&gt;
That makes it difficult for suppliers to show up at the right time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The old route to market is inconsistent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most suppliers still rely on traditional methods to win construction work.&lt;br&gt;
They use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cold calls&lt;/li&gt;
&lt;li&gt;Estimator lists&lt;/li&gt;
&lt;li&gt;Email RFQs&lt;/li&gt;
&lt;li&gt;Trade shows&lt;/li&gt;
&lt;li&gt;Local relationships&lt;/li&gt;
&lt;li&gt;Referrals&lt;/li&gt;
&lt;li&gt;Being known by the right GC
These channels can still work.
But they are inconsistent.
A supplier may have the right material and still never be invited to price.
A fabricator may have available capacity and still miss the project.
A building product company may solve a real problem and still struggle to enter the buying process.
A logistics provider may be useful but never get visibility early enough.
The issue is not only marketing.
It is market access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Construction buying is workflow-based&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Construction procurement is not simple e-commerce.&lt;br&gt;
A construction purchase is connected to many factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scope&lt;/li&gt;
&lt;li&gt;Drawings&lt;/li&gt;
&lt;li&gt;Specifications&lt;/li&gt;
&lt;li&gt;Approvals&lt;/li&gt;
&lt;li&gt;Lead times&lt;/li&gt;
&lt;li&gt;Substitutions&lt;/li&gt;
&lt;li&gt;Delivery windows&lt;/li&gt;
&lt;li&gt;Installation sequence&lt;/li&gt;
&lt;li&gt;Budget constraints&lt;/li&gt;
&lt;li&gt;Trade coordination&lt;/li&gt;
&lt;li&gt;Site conditions
That means suppliers do not just need a product listing.
They need to be visible inside real project workflows.
A supplier needs to show up when a project is pricing work.
A fabricator needs to respond when a real scope is open.
A manufacturer needs to be seen when a team is comparing options.
A logistics provider needs to be included before delivery becomes a bottleneck.
This is why supplier visibility must move closer to the project.
**
Where Merlin Merchant fits**&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Merlin Merchant is built around a simple idea:&lt;br&gt;
Suppliers should be present where construction projects are already buying.&lt;br&gt;
It is not generic e-commerce. It is not just advertising. It is not a passive directory.&lt;br&gt;
It is a way for suppliers to participate in project purchasing workflows.&lt;br&gt;
That means suppliers can be visible to project teams, receive RFQs, price scopes, and sell into live construction projects.&lt;br&gt;
This matters for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Material suppliers&lt;/li&gt;
&lt;li&gt;Fabricators&lt;/li&gt;
&lt;li&gt;Equipment suppliers&lt;/li&gt;
&lt;li&gt;Logistics providers&lt;/li&gt;
&lt;li&gt;Installation companies&lt;/li&gt;
&lt;li&gt;Regional manufacturers&lt;/li&gt;
&lt;li&gt;Building product companies&lt;/li&gt;
&lt;li&gt;Specialty subcontractors&lt;/li&gt;
&lt;li&gt;New products entering the construction market&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why suppliers need project access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Brand awareness is useful, but it is not enough.&lt;br&gt;
In construction, timing matters.&lt;br&gt;
A project may need a supplier before a certain procurement deadline.&lt;br&gt;
 A trade may need pricing before committing to a scope.&lt;br&gt;
 An owner may need alternative products before a cost issue grows.&lt;br&gt;
 A contractor may need a new vendor because the existing supply chain is overloaded.&lt;br&gt;
If a supplier is not visible during that window, the opportunity may disappear.&lt;br&gt;
That is why project access matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open for Business&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea behind Merchant is “Open for Business.”&lt;br&gt;
It means suppliers should not wait outside the project hoping to be found.&lt;br&gt;
They should be visible where buying is already happening.&lt;br&gt;
Construction is not one market. It is many active projects.&lt;br&gt;
Suppliers that want to grow need a clearer path into those projects.&lt;br&gt;
Merlin Merchant gives them that path.&lt;br&gt;
Learn more about Merlin AI and construction procurement workflows: &lt;a href="https://www.merlinai.co/" rel="noopener noreferrer"&gt;https://www.merlinai.co/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Repeatable Buildings Need Repeatable Delivery Systems</title>
      <dc:creator>Corsair</dc:creator>
      <pubDate>Tue, 12 May 2026 10:56:31 +0000</pubDate>
      <link>https://dev.to/corsairdev/repeatable-buildings-need-repeatable-delivery-systems-55fd</link>
      <guid>https://dev.to/corsairdev/repeatable-buildings-need-repeatable-delivery-systems-55fd</guid>
      <description>&lt;p&gt;Many developers are no longer building one-off projects.&lt;br&gt;
They are building repeatable assets.&lt;br&gt;
Build-to-rent communities.&lt;br&gt;
 Student housing.&lt;br&gt;
 Hotels.&lt;br&gt;
 Multifamily housing.&lt;br&gt;
 Public housing programs.&lt;br&gt;
 Healthcare facilities.&lt;br&gt;
 Long-term capital projects.&lt;br&gt;
When the building type repeats, the delivery process should improve.&lt;br&gt;
But in many cases, it does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why repeat projects still feel new every time&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A developer may build the same kind of project across multiple locations, but each project still feels like starting from zero.&lt;br&gt;
New project team.&lt;br&gt;
 New suppliers.&lt;br&gt;
 New coordination issues.&lt;br&gt;
 New procurement risks.&lt;br&gt;
 New trade handoffs.&lt;br&gt;
 New documentation problems.&lt;br&gt;
 New schedule delays.&lt;br&gt;
The asset may be repeatable, but the delivery system is not.&lt;br&gt;
That creates waste.&lt;br&gt;
The team solves the same problems again and again instead of improving the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem is not only construction. It is coordination.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most repeat developers understand their product.&lt;br&gt;
They know the building type. They know the market. They know the target customer. They know the return model.&lt;br&gt;
But delivery still depends on many independent companies working together.&lt;br&gt;
That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trades&lt;/li&gt;
&lt;li&gt;Suppliers&lt;/li&gt;
&lt;li&gt;Fabricators&lt;/li&gt;
&lt;li&gt;Installers&lt;/li&gt;
&lt;li&gt;Logistics teams&lt;/li&gt;
&lt;li&gt;Consultants&lt;/li&gt;
&lt;li&gt;Manufacturers&lt;/li&gt;
&lt;li&gt;Project managers
If the coordination layer is weak, repeatability breaks.
The same asset type can still face new delays, new cost issues, and new workflow problems on every project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A repeatable asset needs a repeatable operating model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a developer is building multiple versions of the same asset, the goal should not be to run every project as a custom process.&lt;br&gt;
The goal should be to create a delivery model that improves over time.&lt;br&gt;
That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clearer procurement workflows&lt;/li&gt;
&lt;li&gt;Better supplier coordination&lt;/li&gt;
&lt;li&gt;More consistent trade communication&lt;/li&gt;
&lt;li&gt;Reusable project processes&lt;/li&gt;
&lt;li&gt;Better material tracking&lt;/li&gt;
&lt;li&gt;Stronger accountability&lt;/li&gt;
&lt;li&gt;Better documentation&lt;/li&gt;
&lt;li&gt;More predictable handoffs
This is where developers can create a serious advantage.
They can stop treating every project like a fresh problem.
They can start building delivery infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where Merlin PI fits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Merlin PI is designed for owners and developers that want better project outcomes by improving supply chain coordination.&lt;br&gt;
It helps the companies involved in the project work together more clearly.&lt;br&gt;
This is important because the owner does not deliver the project alone. The supply chain delivers the project.&lt;br&gt;
Merlin PI gives that supply chain a coordination layer.&lt;br&gt;
It helps connect materials, trades, scopes, procurement, communication, accountability, and workflows.&lt;br&gt;
For repeat developers, this creates a better path to consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better delivery compounds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a developer improves one project, the benefit is useful.&lt;br&gt;
When a developer improves the delivery system, the benefit can compound across many projects.&lt;br&gt;
A lesson from one project can improve the next.&lt;br&gt;
 A procurement workflow can become reusable.&lt;br&gt;
 A supplier relationship can become more productive.&lt;br&gt;
 A trade coordination process can become more predictable.&lt;br&gt;
 A documentation pattern can become standard.&lt;br&gt;
This is how repeat developers move from project-by-project execution to portfolio-level delivery.&lt;br&gt;
**&lt;br&gt;
The future of development is system-led**&lt;/p&gt;

&lt;p&gt;Construction will always involve change.&lt;br&gt;
But not every project has to feel like chaos.&lt;br&gt;
Developers and owners that build repeat assets need more than reports and meetings. They need systems that help their supply chains perform better.&lt;br&gt;
Repeatable buildings need repeatable delivery systems.&lt;br&gt;
That is the core idea behind Merlin PI.&lt;/p&gt;

&lt;p&gt;Learn more about project delivery and operational intelligence: &lt;a href="https://www.merlinai.co/" rel="noopener noreferrer"&gt;https://www.merlinai.co/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
