Přejít na hlavní obsah
Připojení jsou pověření, která uživatel uchovává pro externí službu (Linear, GitHub, Slack, …). Vaše aplikace deklaruje, jak se tato pověření získávají — poskytovatel připojení — a za běhu je používá k provádění ověřených volání na rozhraní API třetí strany. V současnosti je podporován pouze OAuth 2.0. Budoucí typy pověření (osobní přístupové tokeny, klíče API, základní autentizace) se připojí ke stejnému rozhraní — aplikace, které již používají defineConnectionProvider({ type: 'oauth', ... }) nebudou muset migrovat.
Poskytovatel připojení popisuje OAuth handshake, který vaše aplikace potřebuje. Uživatel klikne v nastavení vaší aplikace na “Přidat připojení”, projde souhlasovou obrazovkou poskytovatele a v jeho pracovním prostoru se vytvoří řádek ConnectedAccount.Funkční nastavení vyžaduje dva soubory — poskytovatele připojení a odpovídající deklaraci serverVariables v defineApplication, která obsahuje klientská pověření OAuth.
src/connection-providers/linear-connection.ts
import { defineConnectionProvider } from 'twenty-sdk/define';

export default defineConnectionProvider({
  universalIdentifier: '9c7d1f5e-6a0b-4d44-be0c-3f8b5a9d4e6f',
  name: 'linear',
  displayName: 'Linear',
  icon: 'IconBrandLinear',
  type: 'oauth',
  oauth: {
    authorizationEndpoint: 'https://linear.app/oauth/authorize',
    tokenEndpoint: 'https://api.linear.app/oauth/token',
    scopes: ['read', 'write'],
    // These must match keys in `defineApplication.serverVariables` below.
    clientIdVariable: 'LINEAR_CLIENT_ID',
    clientSecretVariable: 'LINEAR_CLIENT_SECRET',
    // Optional: defaults to 'json'. Some providers (Linear, Slack) want
    // 'form-urlencoded' for the token request.
    tokenRequestContentType: 'form-urlencoded',
    // Optional: defaults to true. Disable only if the provider rejects PKCE.
    usePkce: false,
    // Optional: extra query params on the authorize URL.
    // authorizationParams: { prompt: 'consent' },
    // Optional: provider's RFC 7009 token revocation endpoint, called on disconnect.
    // revokeEndpoint: 'https://example.com/oauth/revoke',
  },
});
src/application.config.ts
import { defineApplication } from 'twenty-sdk/define';

export default defineApplication({
  universalIdentifier: '...',
  displayName: 'Linear',
  description: 'Connect Linear to Twenty.',
  // OAuth client credentials live on the app registration (one OAuth app per
  // Twenty server, configured by the admin) — not per-workspace. Declare them
  // as serverVariables so the admin can fill them in once for all installs.
  serverVariables: {
    LINEAR_CLIENT_ID: {
      description: 'OAuth client ID from your Linear OAuth application.',
      isSecret: false,
      isRequired: true,
    },
    LINEAR_CLIENT_SECRET: {
      description: 'OAuth client secret from your Linear OAuth application.',
      isSecret: true,
      isRequired: true,
    },
  },
});
Hlavní body:
  • name je jedinečný identifikátor (řetězec) používaný v listConnections({ providerName }) (kebab-case, musí odpovídat ^[a-z][a-z0-9-]*$).
  • displayName se zobrazuje na kartě nastavení jednotlivé aplikace a v seznamu nástrojů AI.
  • clientIdVariable / clientSecretVariable jsou názvy, ne hodnoty — musí odpovídat klíčům deklarovaným v defineApplication.serverVariables. Skutečné client_id a client_secret zadává správce serveru prostřednictvím rozhraní pro registraci aplikace, nikdy se necommitují do vašeho repozitáře.
  • Použijte serverVariables (nikoli applicationVariables) — pověření OAuth jsou celoserverová a na jeden server Twenty je jedna aplikace OAuth.
  • Dokud nejsou vyplněny obě serverVariables, karta nastavení aplikace zobrazuje nápovědu “vyžaduje správce serveru” a tlačítko “Přidat připojení” je zakázané.
  • type: 'oauth' je dnes jediná podporovaná hodnota. Rozlišovač je kompatibilní do budoucna: budoucí typy ('pat', 'api-key', …) přidají nové podbloky konfigurace vedle oauth.
URL zpětného volání OAuth, kterou musí váš poskytovatel zařadit na seznam povolených, je:
https://<your-twenty-server>/auth/apps/callback
Uvnitř handleru logické funkce vrací listConnections({ providerName }) řádky ConnectedAccount této aplikace pro daného poskytovatele s obnovenými přístupovými tokeny.
src/logic-functions/handlers/create-linear-issue-handler.ts
import { listConnections } from 'twenty-sdk/logic-function';

export const createLinearIssueHandler = async (input: {
  teamId?: string;
  title?: string;
}) => {
  if (!input.teamId || !input.title) {
    return { success: false, error: 'teamId and title are required' };
  }

  const connections = await listConnections({ providerName: 'linear' });

  // Workspace-shared credentials win when present; fall back to the first
  // user-visibility one. For HTTP-route triggers you typically pick the
  // request user's connection via event.userWorkspaceId instead.
  const connection =
    connections.find((c) => c.visibility === 'workspace') ?? connections[0];

  if (!connection) {
    return {
      success: false,
      error:
        'Linear is not connected. Open the app settings and click "Add connection".',
    };
  }

  // Use connection.accessToken to call the third-party API.
  const response = await fetch('https://api.linear.app/graphql', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${connection.accessToken}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      query: `mutation { issueCreate(input: { teamId: "${input.teamId}", title: "${input.title}" }) { success } }`,
    }),
  });

  return { success: response.ok };
};
Každé připojení má:
PolePopis
idJedinečné ID řádku; předejte do getConnection(id) pro opětovné načtení jednoho záznamu
visibility'user' (soukromé pro jednoho člena pracovního prostoru) nebo 'workspace' (sdílené se všemi členy)
scopesOprávnění OAuth udělená poskytovatelem (odlišná od visibility — ty spolu nesouvisejí)
userWorkspaceIdID userWorkspace vlastníka — užitečné pro výběr “připojení uživatele požadavku” ve spouštěčích tras HTTP
accessTokenAktuální přístupový token OAuth (v případě vypršení je automaticky obnoven)
name / handleZobrazovaný název připojení (automaticky odvozený při OAuth callbacku, uživatelem přejmenovatelný)
authFailedAtNastaveno, když poslední obnovení selhalo; uživatel se musí znovu připojit
Hlavní body:
  • Předejte { providerName } pro filtrování podle poskytovatele; vynechejte jej, chcete-li získat všechna připojení, která tato aplikace vlastní napříč všemi poskytovateli.
  • Server před vrácením výsledku transparentně obnoví přístupový token. Váš handler vždy uvidí použitelný token (nebo nastavené authFailedAt).
  • getConnection(id) je jednořádkový ekvivalent.
Když uživatel klikne na “Přidat připojení”, je vyzván k výběru viditelnosti:
  • Jen pro mě — pověření je soukromé pro připojujícího se uživatele. Jakákoli logická funkce volaná jejich jménem (spouštěč HTTP trasy s isAuthRequired: true) jej uvidí; spouštěče cron a události databáze nikoli.
  • Sdíleno v pracovním prostoru — jakýkoli člen pracovního prostoru může pověření použít. Spouštěče cron/databáze jej také uvidí, protože nemají žádného uživatele požadavku.
Pro každý handler použijte tu správnou variantu:
// HTTP-route trigger — prefer the request user's own connection.
const conn =
  connections.find((c) => c.userWorkspaceId === event.userWorkspaceId) ??
  connections.find((c) => c.visibility === 'workspace');

// Cron trigger — no request user; only shared credentials are sensible.
const conn = connections.find((c) => c.visibility === 'workspace');
Více připojení na (uživatele, poskytovatele) je povoleno, takže tentýž uživatel může mít vedle sebe “Personal Linear” a “Work Linear”.
Pro každého poskytovatele připojení musí správce serveru nejprve zaregistrovat u třetí strany aplikaci OAuth.
  1. Přejděte do vývojářského nastavení poskytovatele (např. https://linear.app/settings/api/applications/new).
  2. Nastavte Redirect URI na \<SERVER_URL>/auth/apps/callback.
  3. Zkopírujte vygenerované Client ID a Client Secret.
  4. Otevřete nainstalovanou aplikaci v Twenty jako správce serveru → nastavte hodnoty na odpovídajících serverVariables.
  5. Členové pracovního prostoru pak mohou přidávat připojení v sekci aplikace Připojení.