From 1a60d4eaa325ff13a956f62471137c47b550e4db Mon Sep 17 00:00:00 2001 From: Thomas des Francs Date: Sat, 4 Jul 2026 16:38:59 +0200 Subject: [PATCH] Add MCP setup screen (#22468) ## Summary - Add a first-tab MCP setup experience under MCP & APIs with quick install cards, manual configuration, client logos, and HTTPS gating for Claude install links. - Rename API/Webhooks settings surfaces to MCP & APIs and update related icons, permissions, breadcrumbs, and command menu entries. - Add the Tabler sparkle-2 icon wrapper and MCP setup visual assets. ## Screenshots | Before | After | | --- | --- | | ![Before: APIs & Webhooks MCP tab](https://gist.githubusercontent.com/Bonapara/f8a97d31fbc3cab2771d18cbacd53d4c/raw/5838d123bc3aae3df0d37507b3e69135bec86444/before-mcp-settings.png) | image | Review in cubic --------- Co-authored-by: Charles Bochet --- .../modules/app/components/SettingsRoutes.tsx | 82 ++++++- ...dPermissionSummaryFromRoleManifest.test.ts | 2 +- .../buildPermissionSummaryFromRoleManifest.ts | 6 +- .../components/SettingsEditableTitle.tsx | 2 + .../SettingsDevelopersWebhookForm.tsx | 20 +- .../developers/hooks/useWebhookForm.ts | 14 +- .../hooks/useSettingsNavigationItems.tsx | 8 +- .../assets/cover-dark.png | Bin .../assets/cover-light.png | Bin .../assets/mcp-clients/amazon-q.svg | 12 ++ .../assets/mcp-clients/augment-code.svg | 10 + .../mcp-and-apis/assets/mcp-clients/cline.svg | 1 + .../assets/mcp-clients/cursor.svg | 1 + .../assets/mcp-clients/gemini-cli.svg | 12 ++ .../mcp-and-apis/assets/mcp-clients/goose.svg | 4 + .../assets/mcp-clients/jetbrains.svg | 1 + .../assets/mcp-clients/librechat.svg | 32 +++ .../assets/mcp-clients/lm-studio.svg | 1 + .../assets/mcp-clients/raycast.svg | 1 + .../assets/mcp-clients/replit.svg | 1 + .../assets/mcp-clients/vs-code.svg | 41 ++++ .../mcp-and-apis/assets/mcp-clients/warp.svg | 1 + .../assets/mcp-clients/windsurf.svg | 1 + .../mcp-and-apis/assets/mcp-clients/zed.svg | 1 + .../mcp-and-apis/assets/mcp-cover-dark.png | Bin 0 -> 122043 bytes .../mcp-and-apis/assets/mcp-cover-light.png | Bin 0 -> 63857 bytes .../assets/model-context-protocol-logo.svg | 0 .../components/GraphQLPlayground.tsx | 6 +- .../mcp-and-apis/components/McpClientLogo.tsx | 44 ++++ .../components/PlaygroundSetupForm.tsx | 8 +- .../components/RestPlayground.tsx | 6 +- .../RestPlaygroundSchemaFetchEffect.tsx | 2 +- .../components/SettingsMcpSetup.tsx | 117 ++++++++++ .../components/SettingsMcpSetupCard.tsx | 169 +++++++++++++++ .../__stories__/GraphQLPlayground.stories.tsx | 4 +- .../PlaygroundSetupForm.stories.tsx | 2 +- .../__stories__/RestPlayground.stories.tsx | 6 +- .../__stories__/SettingsMcpSetup.stories.tsx | 24 +++ .../mcp-and-apis/constants/McpSetup.ts | 30 +++ ...ttingsPlaygroundFormSchemaSelectOptions.ts | 2 +- .../hooks/useOpenPlayground.ts | 6 +- .../states/openAPIReference.ts | 0 .../states/playgroundApiKeyState.ts | 0 .../settings/mcp-and-apis/types/McpSetup.ts | 20 ++ .../types/PlaygroundSchemas.ts | 0 .../types/PlaygroundTypes.ts | 0 .../utils/__tests__/mcpSetup.test.ts | 154 +++++++++++++ .../utils/buildMcpSetupCategories.tsx | 202 ++++++++++++++++++ .../settings/mcp-and-apis/utils/mcpSetup.ts | 113 ++++++++++ .../utils/setupGraphiqlMonacoWorkers.ts | 0 .../components/SettingsMcpSetup.tsx | 75 ------- .../useSettingsRolePermissionFlagConfig.ts | 8 +- .../ai/components/SettingsAiOverviewTab.tsx | 9 +- .../api-webhooks/SettingsApiWebhooks.tsx | 70 +++--- .../SettingsGraphQLPlayground.stories.tsx | 2 +- .../SettingsRestPlayground.stories.tsx | 2 +- .../SettingsDevelopersApiKeyDetail.tsx | 18 +- .../api-keys/SettingsDevelopersApiKeysNew.tsx | 18 +- .../playground/SettingsGraphQLPlayground.tsx | 22 +- .../playground/SettingsRestPlayground.tsx | 30 ++- .../twenty-front/src/utils/title-utils.ts | 2 +- ...rd-permission-flag-definitions.constant.ts | 6 +- .../standard-command-menu-item.constant.ts | 8 +- .../twenty-shared/src/types/SettingsPath.ts | 10 +- .../src/icon/components/IconSparkle2.tsx | 32 +++ packages/twenty-ui/src/icon/index.ts | 1 + 66 files changed, 1304 insertions(+), 178 deletions(-) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/assets/cover-dark.png (100%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/assets/cover-light.png (100%) create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/amazon-q.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/augment-code.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/cline.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/cursor.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/gemini-cli.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/goose.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/jetbrains.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/librechat.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/lm-studio.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/raycast.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/replit.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/vs-code.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/warp.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/windsurf.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/zed.svg create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-cover-dark.png create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-cover-light.png rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/assets/model-context-protocol-logo.svg (100%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/components/GraphQLPlayground.tsx (89%) create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/components/McpClientLogo.tsx rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/components/PlaygroundSetupForm.tsx (89%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/components/RestPlayground.tsx (92%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/components/RestPlaygroundSchemaFetchEffect.tsx (92%) create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/components/SettingsMcpSetup.tsx create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/components/SettingsMcpSetupCard.tsx rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/components/__stories__/GraphQLPlayground.stories.tsx (88%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/components/__stories__/PlaygroundSetupForm.stories.tsx (89%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/components/__stories__/RestPlayground.stories.tsx (92%) create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/SettingsMcpSetup.stories.tsx create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/constants/McpSetup.ts rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/constants/SettingsPlaygroundFormSchemaSelectOptions.ts (81%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/hooks/useOpenPlayground.ts (89%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/states/openAPIReference.ts (100%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/states/playgroundApiKeyState.ts (100%) create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/types/McpSetup.ts rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/types/PlaygroundSchemas.ts (100%) rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/types/PlaygroundTypes.ts (100%) create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/utils/__tests__/mcpSetup.test.ts create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/utils/buildMcpSetupCategories.tsx create mode 100644 packages/twenty-front/src/modules/settings/mcp-and-apis/utils/mcpSetup.ts rename packages/twenty-front/src/modules/settings/{playground => mcp-and-apis}/utils/setupGraphiqlMonacoWorkers.ts (100%) delete mode 100644 packages/twenty-front/src/modules/settings/playground/components/SettingsMcpSetup.tsx create mode 100644 packages/twenty-ui/src/icon/components/IconSparkle2.tsx diff --git a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx index 7b86286a23..fe62db2515 100644 --- a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx +++ b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx @@ -1,5 +1,12 @@ import { lazy, Suspense } from 'react'; -import { Navigate, Route, Routes } from 'react-router-dom'; +import { + Navigate, + type Params, + Route, + Routes, + useLocation, + useParams, +} from 'react-router-dom'; import { SettingsProtectedRouteWrapper } from '@/settings/components/SettingsProtectedRouteWrapper'; import { SettingsSkeletonLoader } from '@/settings/components/SettingsSkeletonLoader'; @@ -24,6 +31,55 @@ const SettingsRestPlayground = lazy(() => ), ); +// TODO: remove these legacy /api-webhooks redirects after 2026-08-04, once +// users have had time to update their bookmarks to the new API settings routes. +const LEGACY_API_WEBHOOKS_SETTINGS_PATHS = { + ApiWebhooks: 'api-webhooks', + NewApiKey: 'api-webhooks/apis/new', + ApiKeyDetail: 'api-webhooks/apis/:apiKeyId', + NewWebhook: 'api-webhooks/webhooks/new', + WebhookDetail: 'api-webhooks/webhooks/:webhookId', +} as const; + +type LegacySettingsPathRedirectProps = { + to: + | SettingsPath.ApiWebhooks + | SettingsPath.NewApiKey + | SettingsPath.ApiKeyDetail + | SettingsPath.NewWebhook + | SettingsPath.WebhookDetail; +}; + +const getLegacySettingsPathRedirectPathname = ( + to: LegacySettingsPathRedirectProps['to'], + params: Readonly>, +) => { + switch (to) { + case SettingsPath.ApiKeyDetail: + return getSettingsPath(SettingsPath.ApiKeyDetail, { + apiKeyId: params.apiKeyId ?? null, + }); + case SettingsPath.WebhookDetail: + return getSettingsPath(SettingsPath.WebhookDetail, { + webhookId: params.webhookId ?? null, + }); + case SettingsPath.ApiWebhooks: + case SettingsPath.NewApiKey: + case SettingsPath.NewWebhook: + return getSettingsPath(to); + } +}; + +function LegacySettingsPathRedirect({ to }: LegacySettingsPathRedirectProps) { + const location = useLocation(); + const params = useParams(); + const pathname = getLegacySettingsPathRedirectPathname(to, params); + + return ( + + ); +} + const SettingsAccountsConfiguration = lazy(() => import('~/pages/settings/accounts/SettingsAccountsConfiguration').then( (module) => ({ @@ -832,6 +888,30 @@ export const SettingsRoutes = ({ isAdminPageEnabled }: SettingsRoutesProps) => ( /> } > + } + /> + } + /> + + } + /> + } + /> + + } + /> } diff --git a/packages/twenty-front/src/modules/marketplace/utils/__tests__/buildPermissionSummaryFromRoleManifest.test.ts b/packages/twenty-front/src/modules/marketplace/utils/__tests__/buildPermissionSummaryFromRoleManifest.test.ts index 0d13aaf8bf..10a96e263c 100644 --- a/packages/twenty-front/src/modules/marketplace/utils/__tests__/buildPermissionSummaryFromRoleManifest.test.ts +++ b/packages/twenty-front/src/modules/marketplace/utils/__tests__/buildPermissionSummaryFromRoleManifest.test.ts @@ -231,7 +231,7 @@ describe('buildPermissionSummaryFromRoleManifest', () => { const result = buildPermissionSummaryFromRoleManifest(role); expect(result).toHaveLength(1); - expect(result[0].label).toBe('Manage API keys and webhooks'); + expect(result[0].label).toBe('Manage MCP, API keys, and webhooks'); }); it('should ignore unknown permission flags', () => { diff --git a/packages/twenty-front/src/modules/marketplace/utils/buildPermissionSummaryFromRoleManifest.ts b/packages/twenty-front/src/modules/marketplace/utils/buildPermissionSummaryFromRoleManifest.ts index c46cdde52a..3a80f101c9 100644 --- a/packages/twenty-front/src/modules/marketplace/utils/buildPermissionSummaryFromRoleManifest.ts +++ b/packages/twenty-front/src/modules/marketplace/utils/buildPermissionSummaryFromRoleManifest.ts @@ -1,12 +1,12 @@ import { type RoleManifest } from 'twenty-shared/application'; import { isDefined } from 'twenty-shared/utils'; import { - IconCode, type IconComponent, IconCurrencyDollar, IconDatabase, IconHierarchy, IconKey, + IconPlug, IconSettings, IconSettingsAutomation, IconSparkles, @@ -112,8 +112,8 @@ export const buildPermissionSummaryFromRoleManifest = ( Icon: IconCurrencyDollar, }, [SystemPermissionFlag.API_KEYS_AND_WEBHOOKS]: { - label: 'Manage API keys and webhooks', - Icon: IconCode, + label: 'Manage MCP, API keys, and webhooks', + Icon: IconPlug, }, [SystemPermissionFlag.AI]: { label: 'Run AI agents', diff --git a/packages/twenty-front/src/modules/settings/components/SettingsEditableTitle.tsx b/packages/twenty-front/src/modules/settings/components/SettingsEditableTitle.tsx index 2daeb46840..defb1e97f5 100644 --- a/packages/twenty-front/src/modules/settings/components/SettingsEditableTitle.tsx +++ b/packages/twenty-front/src/modules/settings/components/SettingsEditableTitle.tsx @@ -3,6 +3,7 @@ import { type TitleInputProps, } from '@/ui/input/components/TitleInput'; import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledTitleInputContainer = styled.div` max-width: 420px; @@ -18,6 +19,7 @@ export const SettingsEditableTitle = (props: SettingsEditableTitleProps) => ( // oxlint-disable-next-line react/jsx-props-no-spreading {...props} sizeVariant={props.sizeVariant ?? 'sm'} + textColor={props.textColor ?? themeCssVariables.font.color.primary} /> ); diff --git a/packages/twenty-front/src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx b/packages/twenty-front/src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx index ea6a08b212..5c4daa4664 100644 --- a/packages/twenty-front/src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx +++ b/packages/twenty-front/src/modules/settings/developers/components/SettingsDevelopersWebhookForm.tsx @@ -23,6 +23,7 @@ import { H2Title } from 'twenty-ui/typography'; import { Button } from 'twenty-ui/input'; import { Section } from 'twenty-ui/layout'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { SETTINGS_API_WEBHOOKS_TABS } from '~/pages/settings/api-webhooks/constants/SettingsApiWebhooksTabs'; import { SettingsDatabaseEventsForm } from '@/settings/components/SettingsDatabaseEventsForm'; const DELETE_WEBHOOK_MODAL_ID = 'delete-webhook-modal'; @@ -81,8 +82,13 @@ export const SettingsDevelopersWebhookForm = ({ href: getSettingsPath(SettingsPath.General), }, { - children: t`APIs & Webhooks`, - href: getSettingsPath(SettingsPath.ApiWebhooks), + children: t`MCP & APIs`, + href: getSettingsPath( + SettingsPath.ApiWebhooks, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.WEBHOOKS, + ), }, { children: isCreationMode ? t`New` : getTitle() }, ]} @@ -90,7 +96,15 @@ export const SettingsDevelopersWebhookForm = ({ navigate(SettingsPath.ApiWebhooks)} + onCancel={() => + navigate( + SettingsPath.ApiWebhooks, + undefined, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.WEBHOOKS, + ) + } onSave={formConfig.handleSubmit(handleSave)} /> } diff --git a/packages/twenty-front/src/modules/settings/developers/hooks/useWebhookForm.ts b/packages/twenty-front/src/modules/settings/developers/hooks/useWebhookForm.ts index 95f3239bc0..ec3d9bcf50 100644 --- a/packages/twenty-front/src/modules/settings/developers/hooks/useWebhookForm.ts +++ b/packages/twenty-front/src/modules/settings/developers/hooks/useWebhookForm.ts @@ -26,6 +26,7 @@ import { UpdateWebhookDocument, } from '~/generated-metadata/graphql'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { SETTINGS_API_WEBHOOKS_TABS } from '~/pages/settings/api-webhooks/constants/SettingsApiWebhooksTabs'; type UseWebhookFormProps = { webhookId?: string; @@ -109,6 +110,11 @@ export const useWebhookForm = ({ webhookId, mode }: UseWebhookFormProps) => { navigate( createdWebhook ? SettingsPath.WebhookDetail : SettingsPath.ApiWebhooks, createdWebhook ? { webhookId: createdWebhook.id } : undefined, + undefined, + undefined, + createdWebhook + ? undefined + : SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.WEBHOOKS, ); } catch (error) { enqueueErrorSnackBar({ @@ -197,7 +203,13 @@ export const useWebhookForm = ({ webhookId, mode }: UseWebhookFormProps) => { message: t`Webhook deleted successfully`, }); - navigate(SettingsPath.ApiWebhooks); + navigate( + SettingsPath.ApiWebhooks, + undefined, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.WEBHOOKS, + ); } catch (error) { enqueueErrorSnackBar({ apolloError: CombinedGraphQLErrors.is(error) ? error : undefined, diff --git a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx index 5243b1893f..4a795f4bd3 100644 --- a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx +++ b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx @@ -16,7 +16,7 @@ import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { t } from '@lingui/core/macro'; import { isNonEmptyString } from '@sniptt/guards'; import { - IconApi, + IconApps, IconAt, IconCalendarEvent, IconColorSwatch, @@ -148,9 +148,9 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => { !isBillingEnabled || !permissionMap[PermissionFlagType.WORKSPACE], }, { - label: t`APIs & Webhooks`, + label: t`MCP & APIs`, path: SettingsPath.ApiWebhooks, - Icon: IconApi, + Icon: IconPlug, isHidden: !permissionMap[PermissionFlagType.API_KEYS_AND_WEBHOOKS], }, // TODO: Re-enable when integrations page is ready @@ -163,7 +163,7 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => { { label: t`Apps`, path: SettingsPath.Applications, - Icon: IconPlug, + Icon: IconApps, isHidden: !permissionMap[PermissionFlagType.APPLICATIONS], }, { diff --git a/packages/twenty-front/src/modules/settings/playground/assets/cover-dark.png b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/cover-dark.png similarity index 100% rename from packages/twenty-front/src/modules/settings/playground/assets/cover-dark.png rename to packages/twenty-front/src/modules/settings/mcp-and-apis/assets/cover-dark.png diff --git a/packages/twenty-front/src/modules/settings/playground/assets/cover-light.png b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/cover-light.png similarity index 100% rename from packages/twenty-front/src/modules/settings/playground/assets/cover-light.png rename to packages/twenty-front/src/modules/settings/mcp-and-apis/assets/cover-light.png diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/amazon-q.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/amazon-q.svg new file mode 100644 index 0000000000..927d49cfa4 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/amazon-q.svg @@ -0,0 +1,12 @@ + + + Icon-Architecture/64/Arch_Amazon-Q_64 + + + + + + + + + \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/augment-code.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/augment-code.svg new file mode 100644 index 0000000000..2438545ea4 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/augment-code.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/cline.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/cline.svg new file mode 100644 index 0000000000..8dcc05786c --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/cline.svg @@ -0,0 +1 @@ +Cline \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/cursor.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/cursor.svg new file mode 100644 index 0000000000..14085aac89 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/cursor.svg @@ -0,0 +1 @@ +Cursor \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/gemini-cli.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/gemini-cli.svg new file mode 100644 index 0000000000..dffc66158b --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/gemini-cli.svg @@ -0,0 +1,12 @@ + + Gemini CLI + + + + + + + + + + diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/goose.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/goose.svg new file mode 100644 index 0000000000..3088c697a3 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/goose.svg @@ -0,0 +1,4 @@ + + Goose + + diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/jetbrains.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/jetbrains.svg new file mode 100644 index 0000000000..f3fa841b6d --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/jetbrains.svg @@ -0,0 +1 @@ +JetBrains \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/librechat.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/librechat.svg new file mode 100644 index 0000000000..36a536d654 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/librechat.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/lm-studio.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/lm-studio.svg new file mode 100644 index 0000000000..a2a179f7c0 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/lm-studio.svg @@ -0,0 +1 @@ +LM Studio \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/raycast.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/raycast.svg new file mode 100644 index 0000000000..2ce034a0c5 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/raycast.svg @@ -0,0 +1 @@ +Raycast \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/replit.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/replit.svg new file mode 100644 index 0000000000..8689f42df6 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/replit.svg @@ -0,0 +1 @@ +Replit \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/vs-code.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/vs-code.svg new file mode 100644 index 0000000000..c453e633f3 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/vs-code.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/warp.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/warp.svg new file mode 100644 index 0000000000..8b12c83411 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/warp.svg @@ -0,0 +1 @@ +Warp \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/windsurf.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/windsurf.svg new file mode 100644 index 0000000000..e794f0c18e --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/windsurf.svg @@ -0,0 +1 @@ +Windsurf \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/zed.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/zed.svg new file mode 100644 index 0000000000..44d35f7db0 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-clients/zed.svg @@ -0,0 +1 @@ +Zed Industries \ No newline at end of file diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-cover-dark.png b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-cover-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..abd258797a1c34a28188bf8d738beff911f46771 GIT binary patch literal 122043 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 z z$RomWkSG7CJZ@6RHJIb7V2y8eDw~?Hx zwBQ2C$!{z0R|%?5cc>xH z0khuy&vr>Tg)nmKBU)3vtbOrypH8R=ooM1Aez(ySL2JWFVLW-um) z0~m_ElQxjtQnz6TXX+;Do2N-uu&qx|pv&(zE)1SOt}BK)uY5IN((vlio7s@`#OYe> ziEb%&Ex+oUgOIT3MGrx9(8B^X)~7gTL%E`GpY$O=2RtJ9Raocr@!8h~>hI1p$2D%p z4S#y9jJO%={7G}(3fNfh+a&t8+2|9%I3;#sGslc{tbnz|T&&?DQHa`!_pG%so7T`wk_*-&d{}-e&B~h#Q?bB%uA|@MeGJ7o zADeodCcEW|E_piDLmR)Wqh+q&OM~W|Sv=n_rX|u35+;XnlAt-bs06uz@f7|f*Hah2 ziwUoZ>;`)3|AzZ)&v+%?+a;++3y5G-SDR@rGN|~BFmYQo51yGr?OxYXVGOxB1IANp z$g-P&>vW*Moyq172TNMaeSaH!G$o@xXFTEgh`)-tQt;DBE0r;dn@w%&xKBSmgLoxgKyoCC%xRy

(_j5QqZ)8%>#z2gDWW+`r?)tBSAAKM7-GfO!LG!-iEEnfmMaVe3K(PKys*; z&mw>#2G9`k6@ewo$x{@)s|^c@1z1m4SI{C~`G9Ag0jxUtfIj@mV%cls>6GWxLk?8G zZHPQghBIuc5s4F@)|y^6WJKtNXylO5-KURF%uSWiU|Y>|hr0^u$Aj-i=F!J#F?-h~ z&+=K#GdtR8Puti=ENtVne7t&UJt24z7ssp4Y?B)g@pUZVzveQp{7$#I!*6g?*DRXC z#`WBGY3Q>CPqdI;huV1JS<6rOyP?(^PQzALzIT*^t1Wd|F~(!$5cqIJte01)l$1r% zVR|gjUYE@EZ?M8eUCU9cDPJDw_dL3wChipr<+H>)Gh_v0zUTLo;$Owa?>QAoN0=ht zkVg<${iBe>hO)4zr2#982qi{-OM(fi#(jE5hjB`^EJHH8yc*M@JiY$BqSJn-V?i8< z8vFwb`SStn1@Xto_(&y`SEPF!`pgFc+eo<)eZ^bl|aj#fkAa+c)A07}) z7B=vMRp%8kUwQIl>rD*+K8cTAA@rKMN^;1tH!f&qJWWp63R{-pz})@KIN~;PW*cPq zF%5q&5s~Q96BToI_T8cPuapKVO{2W0N*du$CIf-Xv;L>G)S)&~_x5Q20Y&?t;4G!? z_Xh~Q-(eyf)?tOMt~N61&UGm>BREueRE!I`$~C zOJYe{uZGDwI4({C&C+7w8<0F|ncCymHvqeZi;etLq_ecqLGHgp6Ue-Tz!b z?Tc-D*Tb89>mj{8{V0$mM7u=gg1J{8YVWVEok?{G__b#u*;T88wE5%3e+_7A1#+*T ze9h)Ec3*DKWMPJG_v(1(B5vpp!HJi3@0w7wylpc!7B%cY-_-FbU@-aQ?%Gtyqx@x6 z`ty|5>Mm`R!H!ZQyUCM_@I?M+w{e=FaYzbtsDEWC;} z_hz`}S-h%A*7jF#wT9M(MGe4>oa|%Ki$=rrje{6IU79(c#q}YYW8=+ zI0$7(>)DmhnGKZDjDNQ^luagvUP#GPmpbIu<&zi?$9C$;so+v~uZcu9ZO@InDU-Xi_yt)(0=Lf*>9$G`I9Aj_=695&qxlgksLc1iL<&4Sl_;B>gxw=Gv4QX|YHTDE;pOUa{wBt7Y;&f!^BVSC+I);n<0e0T zbRc{gxI|JykMF&w7526@Kr;MVsu1wXbPMcfdobg7`#i5nXQZ7i7D-hJ zkM|TmXeVElOgKq_VboOqqC;s<9U9u^p69MOG^U*8+rWyUn9_IT#AO0~6A{Io;E`Yc ze{bC$7Q<>_!%~P9Gh;gTc*BF@<*s;(YHS) z?*rw^UJ4LKTAsI-oMem8rjNw)go@7a{Nbb>vtj6exu8{K0FKQ78^~rFamvx37X^C% zT~&z5W5nJapDAzL(jL~jO#PTQEC>PzB1o~|*Ot1uEqJM}?;G3;ntGaol1leN?gxjO zsFrs^YDybFs)aHtTe*-=r)wd;OH(}*n9ARrokaM;T26pZQBV^Xeec6y9D08zF!OkE zXl&b)yWnSiFUC@*N|y9F@f2S7yzI%b@of4BG&>W$K1iv7UAY(cNgyF6DTe1U1q zAdDWneorg@lu#1=NQ<(bia`lRFwh6#3FnxwmKL8ZcBs*AAH9Y}Z@dxYUq)`EZ+Kw* z1w5~!cp1SncF?QaL|mLy{BhxN$@W)qxAy^#T9?7*H_xC`7hk1gf(?|;6{!~*uriY4 za^rm(3r-OlLtoDumOxU!g4MW6o9AKca}Ty6W0g-9f5Yo4G7a&Jqs37KOw-BZiNqO(D0z_0N}Y#kU%gu&svDA?3?_BZ0M( zk}9xb)z7Cv6OgO|WNtf`KRw)eHlgrw9@&~oya#P=V}F43iJ zRbL=V&`usM&k@2VoTQI1K4Gr*UUz}gmmgl>$S7h|Sv}|ry42v3DCkZaZXbTz4drDO z8e1Ir?A3x3#`a}-!E8jF4a5O6IYI=Ah6dwLt{AnK9a%!wI{jx=!$d_`8do}vW^9{+ zOEtP29N^DZQW8Thi+~O5nK0fAH6)$-HtuwSCgXx?g!k^UciEOp{E8muPk_AZFc+BO zJXtn2EaM{SE<0M(TajZSD*sxjHbvY@(;H2I7Fqmbnyk>WHnr~TE6)vK!W<3Sr{fYU zqRgc^JG-bwRKX>%B*?Cc!r-Nr1aTD*$V#cTt$o~}q1VdvA=*tBURKe@dJZ_-8+#Zt zqjEwTQvP8|akJT{?)xy$j2KU=7-|@7cwEGPH7l6>NG*fM5QIrQd)1D+6?D|b{|Woi z)rn%Fj`0bNXGm9m9T6LleD%0*HSI6Ar+D#N%uL_SiC?&{@i(sCP5EG49o?k*YZ2lm z$LG9_Hz;8DJxNnVJZn|C6Y?h$ucxoQ#0u>3`>=RE^=oaxkrV(1)mHiCu~&8sA>sT| zSOLqcCrb0h0_xHYMK8@IeH(Ry%&YnH)#oGXz3d#_LSN+}k|BXRS$Zy_7v~q6pQPhG zla1XB^v^qYL?;|nG*(VGyeQVJ_U_H-W*%rc$}dCjJ{d5{L>N5oUDnxZGtxM@-I_JF z{XskB6EnqlIcE*9)zX5GrmeRZ_C0ak12QrdXi(HzPnZL{KB{3zz`m z%{hOA+q7HC`$Ao%!-nf7Ne+L134JSo!jLF@luA+TtaJhDh?fCm51}ha2&PaA|Fipt zk#h!P%*LKAcK@cgZAoy*F zlug%NNM&4sj|E}9xa$|%j(CI zVrO%P8jQ(`rZgWCw%octWARJ9Tb$50)Z&-c9RD>YalJUGoT3+)8OM_nv6P4}^e?&~ z!OKy#AY1c59Bg104N4!LwxB0b-q}|TDyf+cm+zwFkJ5vaHbRq)HBou?d%!s1fNB`bY0b1*g{Ra%gT(S^w|Ms`nSd-<*BBE&>R{s6~xnrzBZjh^2Yms zdIV@hwO+QcPsLIEz_3S+M#S%4V5LBj-%@3yaOH9L>WqtT_yMIkJz-Tn4B|!N>+f72 zcrZ_t9^^vox+j0UjI$YQyL%Inx$|57ji=fu4K!p88DHz(m>A&8<-?zseXF;3h%K5* z)&`C7=?eK*C54A^e8g!B>fbayUrIwX#Jc6`O=EIBdveAq!fdxy=DPboj2||k!c*c` zzyc{wkLc%IUyYquXsOkJ#r*w2*qz!pF1WqvK(CQbB7fKrLnqD-9?&`Ym= z_79RAh^4_#Uf--Ew*e!A`hU?8x>ItkIYp!TE>L*lAKv&>E@-?e81lRmLT z#l?-dhr9`4pH#VW!l+QQxm2^VLgK239^mN;YON|Jc_k{p6X2VQI`DqED68&cuX|SBhp^EprK@SXG1d!}FV>y)9BpUrLTW zta=nk6DRMwRG-=CL1UbM*{20*xGxG0=+8BCXpxU`uu>cLul-}47y46x1pA5wY*v~9 z3)h6L4ccfpqq+fiw+Wc<(A^ZblCZE!-Phw7!3hh2uCeip`DcBj<`XO&i?3wy;LFfz z(;y??fpcV47TMjpR_G{886mDrlV1-Jc>%Ny`*$eEG0Qk6b^&ED6P8-oa*(6iVk6)D z>w>GThOze&+zkzWZDQpiR}MQ`P~aAvnfO+ zT>4~5JK<~>)q_2}i)BTyiC3t+Ec9>Xpx?k4U$WS?i}F!oxhrrJ{cBoyub1}Gw0Y~R zls!ZQv(~rWX@kBt&rURZroD3IkIVy911z_6x=>{GRP6(^o7ccHN__ZNo9*==muWE}=VeyE>^TPp#zuDX+W^3CNI&eG6yTYB zxhP(GBi_^kC+k@64(y}6MO1##>_kZ~AqHRM>izp^4ppt)kfZ>k;?4Ow2i_S=^V$|l zbQ0>c8pLZDUAW1Fxp#{-qPPIEL`Ql=m%9@^Xw-J)ZgQc@DACu?+&egLl@=oiVyX_AL}H=_zB7sE*5 z#py50)n!o9SbOOS*Ny>rj|+0 zzIS(ka`M(r$>;o3#eS1eb}Z@VV$No;V~;5)TYG2s&yE#*Zd7fnaKz+5OvIWrcYJ<4 zr(g{t(1Si1xun(TyIh@E??xzHmg2Z`;h*cH9y-vi&L2xYs5rdz%D64%`)bboI9-&1 zmxdr zk-P1754mwF@xz$h>VnNWW9VsX__s*U`xX8Ug4x07=4IFGl*o1kMjQHMTcJnU5OfpQ z$JaGc>|18;QBs#6a@rk}FSd7`(-@YlkJ76anU32w+8GR1UK!d2WBRw=eh}Q8JX8oT zE}F&4LYo#;ZOrO#kxRpy;;-p_GA<5mB(!tYmEBDrAU6^who4xDS7S(~GEyL(+I}gJ zLe%Eh*#B5VGub?Zj{4WI{<*;hRz3Ndn&fE{y~bdx=vo^@dn#Qk0}rtSw2ax-^BujV z;ciHn-QobCq_Kj61g|wL=<0D2xsE?LDCwsiK97K6CvN{^Yt8CN8&}Rg{d~4r?&7mK zVYu+Pk+W|6?EswUt&4h(PA<0vw!EZF9}|=E6M_Uj7phJmZtObJJ3C!%-)6$^npd6@ z7l0-l)d7DyvuKn`#%Ccf$fafEdMru`Rwo;noFXEdng$@KLeoBVw~!1Ld;C{hgi=bJ zrc!)Sw{2k9`!Q-M^9FLEVnAKrB56E5yJ|@-E!FJ4ln=>3RwVgV zsv*O<^^I3*;#IrrP>-o!8^L-+rEk|nETJBGB5T631tEcnp88^g-0xsR({<#uVoE$I z@(Zw?yZk}-z5IfVpby;&BE>|q>=8Aw3X%^^6yzK?6VWa2jwiLgJ6#%LaWZ+#8P2FT zmKWR6%gi`Nsk(fc47J(S|2XVzTnPzJsDBdqoo;C-ZLjvyXJZ;At-s?k_d!K6OS*gs zjQhFx^uRU5$4y2~^KRNO$h{i6S=4n6Q)UQc`-m{)c<)|Woo6jKeD^x4hxUaGCqebtJ>1) z-Qo?3^lP4dz2cY6t^CnkP4PxJ04!ZUU6OCSQpLiFek2oE+P~15la-ND0ayjjlmY{PD&yX8&WwSK+wIu^7DKug@g5O3O zVw-hPy8At-MTKs#8*4aIFsn2xr9Wf0(}Wtc+Dea09(qE@`boHo4#%eIN`%LU|Bzv? z6lm5~xnS@*cXQFJkk2$}c<6-*DdoOVRTx933sfT2MyAPyk$mq0kFU-Y-)W2otkR`y z$MCM5k`OY|h!7jtQesX1ANl~;p|0YbitVvC3V4GzyoAD40I5oKVBA50x1PgU(uoQ- zJVXfjWE~gN_L1nD@9-_;K@xpu8g>NC4PhF_leddr zeZAmg{yZ}%p8UUr`D;VddO6qJ-7_Z1GW54FX+M$~l2HBo?2xT>uc319tUYdnMyGxx zU@8J4Ez&Sl6jbVqba!|6rXrx!q`J#JE&A2sN7b1c zr>N#+=H6sPFFDb0eTq3H{!JeL??lp5E|b5Wb79kO%qP=H>SBVz#1Hu&pc=f^6*YFs zZD&HTk)%=~Nh_=0GG1>P-C{@HCa0PbNF0#{-_LsMf zMGh(>Q#w@d9DE6Ftqe?>W;5~Hki^ZTMD4`Oe%Y&uh+%+6h~|C?h@JW_?zo1irH3VE z3axkh(n<*|-X^NL-t8wSpD?LOoZgJRk}lz?*t8sD2Be9ODYt5Q-vq4RwO1J5Ut`}0 zA;va1x7#Q5`Jr?r>A`&l_P^88kwkTP@1ArXaw5&hv_Q5$enxkww+^Nk!8W1#6GbvRhAugfwJv)gr}L5}nnIe$ zY~#;c>if(OQt1~R^?V2aBGl_#-goqn{1#yT0fyZK4<0GM(ztkjPyp-s=a#1g&yD+++n!r>CF7IfhyPg?0=a>f7sydkIj*s;IH9d<# zQlvQjc+N|~LRL*#zCPPs3X6mx5oQ`~vDBD)pwnXJR0_OsWqK2;`UBIx|b|IHRR-#{Sv_-}ns@zc{)!%0ay8+|pe!(yw(yXjBbl@By z-P&jO73jQ$nYc?=gP$*n<(JuPBOu2fz^6AOlkOFIXV4tsFPdgf_(5XO|5P11mJ?&s z8#b#aowxsN0!Gv{Enc2#W;?S$s~onqaL=-7G-=ks4+l(QZU$9}#tFt>X|i*;N;_SuDBi`Z8g;_l@HRHC#38 z`{e=d3yjZ(T{UdP-aiFb{xPOLip_Y&vdnW?be)|jq@%|EJ?dq3)1c_$i~d0n>s?}B zaXqZ|V=BI1IB4lim8 zQjM#DE*z16v@ynCDW{FBXQ=+U6vjH$qT`GzQ}-u7qy0Ah^`;*)*+&@n4M#nZFNyB;SzEK;N?6q{@TEe1*Oi=qb*;jjX_XZ(^`^ULRBxh%5CB~G(7djo64oKwKW^_Zm->3F#yNJzET z{t&Pz`r6wF8zS&vl8zE^D@eRHwqU0;jZ8T|_~Mz+;B3&XN2z*|%&E}=x$LIlM}Jz+ z4b4W2?>kgIAL0)DZ<8PHG)_%s$}JbwQ2{0Do{NO>DJ>oILXdSJJbltys7Vs`vtd%} zfRDy1)XVAKTfqZjuu)68eE(*aMk-N!hW*=U=!uwB9T9`;&QU5dhE_R~{TWrWTWUg_ z$*+Kj@s=<5oSZ^!MFY2y|FH!RURV%-DOz}k) zcqzwFC#vDlXfGT3>Ru@`zR>;26@{k3i@yK%9-U`TG{(K4xJ9#f?B5aM_9?$u=`PCT zMt0`$(id~%4@R)hPi1M!U{i|}czXd=d?R4tlFY>r=1;=+Yv**f;x(!AZTjgKQ=t--vMvk zGk1?2x*tWvaEBX-M@GE9L|1FlrTJF*W<*Tk^fvDTKi>+n=hs>ss>_7d^Rfk8s?v6mv;0^Pzusmm)*P_tK;2#Gq|@ zMM&XGd`thj6Y?ojr!eIK$=gdl?|yvA6a?{9Eg-L#4r;rcX? z^vGS*Svk~xF7F6ZySMV=^cBcwYiro0ZiU00eo7M(>mI*qtzdGLi%Z>|bC}bJe;nyOqVcJd zvt7zL;mONvDUHNfagDhOvAuG@ReF+JBa+z4oHXJ{tAI5Gm(-`Wbp3QV5G*}6p}Lky z-zvGP4>CI(6K1$$GvXVZ#oP(R!qvo}M|7~sQ!5ptD|(^;4RRCxOY;7U+I68^sI9^* z97(+Q#|^xklT@iYK#g-G#u7gsRNtJ?R!5dQD}T3k*k7qceYG}nKIKjXoYlCOgUg{F zJ12xOn@HcP2RRqEIPMx@UKc+O0Z?n`E0(NH7d#f-NyA9n+^d-g{yGJ9hSTbAQ`GF8 zm(DFm0rTT;)a5Rqs0}-=bDV7^)_s}}&6zo-O^+V0CouiMI7nTwwIHgx)B0h~#U?11 z>eJmV3@+NzynPv6YhUDV$|njQp{wMRH|Sx7$|uXhN`fl`y`IZM!;Y*--^ebHPXhqo z#(!TDkmk646)SgWc6&!)0-aUo?LXIfIe2iLMh90&H(q(sJoVq%Ieo!$D;pcpTjsvb zp=$j)54m3xuH|LDPRwp_=Q@^Oo9NvbiPgC4Yrx4+a03?OJ7&|YJ~fj49!@f~mF%bZ z@;|m$K5PL09=jf_aW-S)`JwAV&7ZL^Z?0u1x;U+tdiFAY%dqJC#nId~$skxGqoYDt zik&fAbI~WoX}^j`H)Z@fwpBVWrn|sz3ihdx@V=VcL)8;EL(T@>p8mKnFNFS~aNPuW z)ze=SLem0p{iBLmUv~DF73Z8$HhRYUJM8?>`U8O2K2Usi90&dxZlp2+5b<&YaRRI? zrjEC^&<@kna!nMC?UjTYtBYsNzn(dHaPg@p3+%ygrEL7OCdzbvOnu`Ql6izA!2Oh5 zvGaD`cdm0rZm({7cExJ$zD^9o#>&MSUOY>1yOmt4{_SG(p)oyXv07o) zm-d}Mq{g}cI2Hk+Z!c>v@mDrk_sSjJ8wUQ2_MgX_7L;_vb~1;=KV|G3ww$I)!++8F zWMIo+2xWcaU!zs6QPea?##fKXdwYYQphfN@(sNS1$SsQrjqHC>0(ZE;OSygYw^@5N z)hL@G1Nc!0PpHJ6eXB|*y6UkL(x?V(4Fk^}FZ{pG3j zJ&AL&?g+ItPz#nl-U7PQw2XJ7%v$q{^qI-%&b1F?Hha}JHp(vtWd_Zgp6BkbIFASo zzAW%fs#g{@{d*#PR78|kMoXD&XH)2iwG$$+?r#ly%=G+_)@a7geNg-iJDns1!72{M zpoIr79>NeDl94ut{ftMpiht<&5MZUB5dp0uVyP+q0$CTlwT|u-0*E<7By@MUKo!3C zVY3;Bwtg?HZWaHE=gO}+*}f=kOJi$4*&I{jDy-B1zkGEXMvO|tkgkbLT+@YBi(!c_ z^^?bAnMR$zNg?ef^hIbFkKf8hTwjr>1@jhUF-hfC2XuZsu3Lv6VakkitXS6%=oXWT znLL9Y`Pic;CEeI*!z=*h!MBda>)%+CNf4p(Gyh}ZFR&YdA;Nz~dBFc8_`nZT8c|gu zK3dax|9q>1psJIRU)S!{P?5FpBSLrneX4GaMCqh6bJja^7JDgkh}*1|2{bAp;o7N- zl-bjd@Ge%Pi4^x~s~z799ih*|D!_oZ=ha$f(WNOBC)+{tU!Jd?CU zUr!_YZhJ2GvgWb7g6253=Yir^uq*-U<;us;TN7~|`-k}D^rmRWpx^TunY>~0PVvLwCkpr)m(wQ{wX+%AHe=yj=lk_|WvWEu`;XqBCoLJk~BIW8GM}JsINUiMW!LB&lKp z=RB%bJRV$tmOgWPV=8r(QOMi#=TfH6HrXyZ~WG-?k zeTiUgL`5|8d~cGUz%+cGd-IL;csQDr${eWA6yB2c7{Ct>@f82?}zshb&4%e zNi5ezL30$waV>u=;iP(#lS!9-S{ZAyJBNpS{X)A@Q2%93v6tlt67dOfF+*zZ9pHJ< zO*~6tcU$A;l|(!^GBK!?lzH=U&N zx3ae{W`5PX24D1)CCyM`^nz=c8=Y+u^Lbl4GSm*f z%M2A&2KC>?a?+27Pfdp#LTb0-h&Ce)Lf(^X$xVH+e!H7=C*-WB=I;C{wBOUrdJGXGL?(RzWj zpDh(LZZ6AL)b{9NUo1#IZjC#z*ByUI2RCzB!AAG;hu35x1$B*3gVIv0Lp4C0H75xnT?3dlSKR*Kc$@&pGd{p1 zfVcZpM-EoNnWkcsC*jh5eG^u9AqGvPCqIWs*te0fjhl1Uq z)x7iq^cOppBw>5-=NWE}@xy~y^ab2d&c*Ubc8OW_(V#M0(O}#7q zfQxC~m&8CHMn)cmm7O|}vVBLjKpA{>3eN4}=hG9>bzHw)iCtTgd#9vUK9aWi&vIC$ z1WIF{lXyE3f)HAq7OC6Pz<+_y?Aa)rX{2cl_oZB=Pf+Z4QfbeT&5&wM5FE_rm1j>Y zZ#cZP=atBK+7})pR14OWt5KN%Ycg{cgblkyH9#uZX4}mbKej*6S+maOldPuyLG$Sh zZ8)C}q<|e0e>@j!0!PM)uv_s6_4f9qa+Oal?IZg+%7-rObII!%ArB@~qh*%p@4d0% zP02T4uR~@A#a-oyTm*_r84%h_hw?d-v@iLNayK2hZi)HCKt@!0A+l9x zCVSn~{wNuS46V3s{#4Bsf>&HD@pttLI; zhUyZrmnX#98zb`9>#BLqLa5nObv5dwlx$`rKm+0lDyTxrl&o`!s@tTdoFL(@H7!Gu zS8V3doessFqg-)pS2rhi7OuLZfzI&dIvk#UYSk$b8EhhdL2k%TtML2x;`_av$0a zJ1VD7^ERViI-6GW{?L_@>LN7Oea~LE-s-F|Ym#La171C;v3;t;vO2^(${4GnFK^{hMcMz_40nRp)0 zj(rKQP~|kK5t0rLtGdlGUhVS$n3ld)`KrJN{s7}TkT>?(&UsRObePItz4mN>=Yx#k zNaw0_g-O&*D@3C=SE-_jEIukyC($=wazse9wR^xp3(S`R(vf=X0HYfNCm}ym5w-)l zQ{i-Vp0LceFeaZ3=H$>>nR3HVEz68DkZx}Y)$4I^E%pnFok0R}65|JW=kIw9={(@A z4cWz}%Lu0Vm(!ii_*f_in-hhuU}Kb4v`cpf5p%}u?fW-BtR7c{@Z0b2;@y945Jz`k z)oAWV@82Gn!Xi?xjiw7QCWvqW);69_2(4%jB3)@LUrrUq%$#HYDysdNdeK{J!vf;;^_ShdrK)e-Q=_ZS1opMxTd_ zH4Z*`y4uQ?DK{h5{xV69F_|B=8%0qG4VRyl$;I?jZ$D50G%cDwf70W<;hW)gMf7ZV zxQ*k4q5C64)HfbQy}l!W-FZIdEA$cyZ=-iQjGkLhd=mOit6KGLXM=SmqWE&9-xrV4 z2Eg7QWTsi`mnT&=0^Tx~TGMayb>EXbw{7xXf<us?%S5#q4R`S(M)@l% zL)iS~xDyTPgZae1-$#fBk~ye=Xp^4|M>tPg*Y~|)B>a9!JM5IZveJt~r{?x0o``ZH zoTQ1El*;1R8xk*y@?|t`Kz?BoG?<@IB@3GpWcNIXD38}?d3tng2deK*!(qS=He->i zi~k?XFN%`))4Xl+zLu5q>a;aXR;*dN9E_Fr;! zwa8eq#kfR%mJd{NqM3qJ=D88FFRT8kl0N>z8JWYtlk6WVEwh*&=p5OwkNuJV!5Qm0 z%Xv1N&5%1tt@OPYS zYTZBFczyzbQaJ zc%15Fva3SQ5oCxDQ{Oo ze=mHxofiEqT1|xg@vJ<@?;Z`KuUt99SqGHn6R-5=){bM5+2hiVwIn=!64T>@P|l$X zn`0$^6-+Ise<+2F{4?1Wg+9?4W_&aYgOIa$l+lxl6xlw@ZYuKpaFf$nf8ZpOC!DWx z!0bq!KUYPof*GgvDc-W5eDF zc+k;r*tlGM#K8Ux?Z$=2!yB7hwhGV>MC{vtKpinpj{ezOt{97&h8!g@kBB~>;<#0i zaewpmQ-~OGc+-Bl4`>RWzC-H(8d)ayjU{brm-=t?FNUm(40^~yII7-*ZQ9H-N3RAP~f`*Mkmcq?j zbzqc`2}O^&0%#hEeuo1yPC9=_(@|9sxJNIaTo`(k)Wlgm_vG2He&wz3zn3*ikJ;1M znP5qm$w2vR|G@*mWzs)psCnYgseyYpEeuS$(K)H2;_cAa;$FKzvvZJlnGM&LyTkZH zSi2Ms*BHA~?&8CPt7*@7zeR7OKfIAv(b0Nq^v8Q9>2CYwa)vOFXk;zf>GA^7cm~hl zq<{mKEg6@ZZ(BpqIr9}A^gLNktd?r~41G2L!z^F-1+8gXXGfD|(!-`~^{Kjb!W@T< z^_Er3*-O>i2f4YUS`SU9Qk;TseJ^=@$NEz8xwfAh-34v`>WHx2Se&>Zs+cxpW^BLo zyqE$gFjpq*irhV^u-o>VU&THxI^ZWTQ71ZT=LZ#3s^HaLu^)mUb22pm!jE7qxCgjr z@ugsJ)v~=pWIE%@U2UC$TS$t73VG|O@G#1;C^DF+-;q1>8MT9ej&}!HTJ0(tjFw9^ z@CCv=w8(FR2fr_xWxG|xEt6X6Xd-9rnIlSxS6D{k-~RIE@O}(@T9&|=I#?VgWf0mjQ zUGkLECF-32?=nh8n1i!89ILJDX`df4d-=VR1x%`45X@#tdG@cXQ{Q3t@>@+Wz_^(K z(PHM|x}VARkdCN@uXa64;luE`enZ^y4^_l|z@l3xXqkqR$_D+hKCVp&<$hP=i+|2# zVV~m5pcjZz-8>67)HadLA?S55(#qJiYntP$cryOz_7#Rn?Rb>u+4I#8kl-RzDZw4s zf+267WY(_gY5Bh-D(qluWy6(*G-;K3RUAqVFSVG{`w%Fq-IVTP7jLK%IPp^KIlJP{^eH4*Dryw6G-o%snv7vxh+0zT4WIPb>4tMqe!9rET3>tNXNH}kQQ zyC1x~;Tx}pW~L%x>tyBR6x1`s7NINU8PNXkC#_ui#+kHj&i3Qn5$;gc)SVUm!s0K7 zKa_|tayGW~Dynfu+HamFWQ}%8F;QsF6n$@8`pZC$G4q2!|=4`zEq07b!xieKL0&ciMs!UZ#B>YxAt(&01 z$asZJeQ|MDRMlVA)#7sEV`HI&r{N1b3c%vX)nFdw(I=Z^SXgH55Y@LLZD+u{7*jbi zrnHL!l~IhzTWzUts92LaP=;;jWZgV17bWplw@0&$uQ+@RHBBSzZg)y}1gAJVv+x!D zdt^CU6}I-t7-TE;Mp^0oGf6lw4U>IuV22HUErdlk_3riw6NZhqY@_UAo#KHkajt>D z-SxB1l~qTOxYwMb9h5%u6y>g)_;aLGSb_^SjPJ{n01J@)w{f)B@ia8;$H5P+)x5AT z-}gpVufd*g7nu9!8uz25y2|6ChULVqg3Up7rC5bfWq^=S>>{3tI7j_kyHrEEB|p!!tF!b#K5fs8p}IQuT>s)Rx8$; zj)M5!skpV4!ap1}Mt@65pgI1{|{S^DRVABmO%r79ZxNdWzJ)!Nb8!Cmc$0RwO#8;yl-HF)Y%kUcJKs;PKQkOQ zO!a^D;rQynHcVu#a^z`aU%G1WJC@_Nxb>g@NS(OE-dx;st98b`&g-|SL6oPmUN;jv zS*V6$E{AQc$(z}=-S&i^N<_$~*sMjGjTS``JO`N3&x3iYJy*%8}^WC&J@bWx_!j|-=Du;dOuoQLf+Dfj=CQT@kkoHdN#I*9F zeb;dkyp|?1ym(tfV-yewgDS}8d6!bP4o}73HgeM@LCwu23(L-i7~ScyK{zNvrJ!80>`kv^lAhsW0HTc3u>hp%7p9Xo<%TayIJTLgrH8X zjY_#oHt%ox0JW&t){ul%L%@3IYW&cIWvg^>K4t)H*qg0!nrF9qu-uIE2R_Q((Mly7 zfn+(C6`J@Esax`HZiB)t%`FOR&#iM*d??S+S_<{76hQwin*=YP+JF4K@&iMJId9=23E2<^rw7)O9c`>z0>?(ALKit>x!1 zzfi=sNT;*mLP;#y%kRfxCjuYBs*QIWkYSPuMkLjB9JE-t;KsHF=qn+Cvm)XrwZP$oYi5+w5L6yg5x(M2ZC$r)ZKDy^_6oOXqw9^Tk30SmbZFk8e7)%L z)0Kn5&eyP-0}c^Uh+l=qz^~ToTp@A6Dq3+~-oM9G-y|e)5Em~`Fv!<8uHPmHqQr>Y z1_fGpA6av9n@l0^S|Dm5W@4R;$oXh&B|WqC$@i!mF>{(vUX@x^tvVkWd=h*nHzM=` zV2A-J?`7}nylbhC;*Xvvhb!`4<1ZC@+NvAbhK-+CuddyC2ueBX({?di z^OjkzdsivFHLtGUb+baG9cs4JR6SE z0h{O#FHaQ(pnH%R_>Q5p1K(eo?>eppWL&j$@g2%JOOk^{#oH;q*xcTgfzS03hP zyuHo;)LM{jVzSG0+BRWdnT=(A#uX~yQM7fQc&fkauLJv|U2EQ`7L>;T%m-;tz z)_4KH{bPJ<*3u&W&(e=YD#YF`?{Md2WwWiUZaCG$s`9?RZg4|-K{0R$)h<5M`!1h) z6|@_&N&Ad95SfLg8E<*ViEJ9w>Krr4?1^)Pz!nsXsVHA{h2ohpSDFT3iu;dlAYtzS zsgtU0QxL}@-Xj1U+Tk$@jY@-rrS-SRh^HnX5tYz=Xw6*qD z-&zvDUP@Qc{VbO;r`=&`1+anx-7!5BX&D?>MfQPf0~qd{tY+ONCRqU^PD`Bo)VDhJIk#82IuFZ*kOtQ87kYfn_kI5B-Q;#TySHBf765r z+joJh#8(vX2BtelWS0+M+B;*-bU2lA~b;62A7Hiv^>}*Ju;%W>Izc5Z%o$n{rB_(KxTj zLBV-@a+_jG#5;eT(bYu$CWx@=9csE~Cc#Z-%HdbRwzRLR4_uzcJvWuUn-=npY;J7| zC-R1-YBvc9!5d^#wAvbFlH_$;6gTu+n}gcmw5!euF|$FM!I4z&lJ1Xq;%HMq-)p}C zjisjFxh_q#rZ7QOP;=MzqvftvHRlT--T#X~{l%#zTwJ?!=SntKU&7ep&d&>V{fL3n zCWl>x#q#wPBvzv{N5$g{4*#sly-?v&qxSvts0~+U)J>Vty0wY#etUQv&fcPYVv)UW zvYu6tMK+($v5Dxp@s5;V74R9#bfO6jJw>qfB^-WdW}!|6F1FFM@Wemh)w=4z23bV^ z_HDc|TxW8vAVn`c(cKul-4f6W0Qu&Uby~^;e5}pvEA$h$kJ9Uzm9q3hm)3FzrJW(} zpNCWo-MQyVb#GEbL6!>a+E5#CP+L1NbY_LgR<)mVd8J5Jl^p2^_dAg~J zsdto6+9#sY4ja5OsMGLZ_1w&JD~8nhsB6x`L0%oYB;{{pEtTcaiBr`@*t#n!&01Ku zNT!xIng;ocGGI`E7&1jhY%N<)DNLtA*{aaN3z|oO&@}I)oIqi!0c|E?Q(=@oZfm7* zu*pHf_66}*yW8GuGR}J!Qkwv-lJL;qcn$xq1Jw`gO)QrYd?#yZRqvj?m$hobj7moLd?49kf~7uc-v#bb*mBNAG6;+Mf@Bi!@tQ3h-e%&{3a)JG z?i?hDoCM39LlXKr-NH6tuhG_Ip=|uGhwwZtU@d&5U`VJ5!%}6^8P7n%W4~{*(5k%$ zJJV1WYX4>KelE>4V-c%>|{31Gt5Gq6WoKZq98c&7o>n=ES+v0Ir~1Vu7>% zSs%U=HrYl}#T(Vfb5%i@7&gl6@<|qTvEq$MX{z${ryZnVZ337#z}tcz8taUQ4Ga`?pEk zHa84;iY*Leo{b3bieje6i)4j(t1_Ac<&_`iJ!&H>ug1k2OE=;<_T=*-Bl4C3p%x2i z68i8*on{L)biI2|d$jQ^ee=OkMFZwTlp_N{s3oI_n@p6lH(l+XBPEK+Xe2zTP^%zFI!oYgjQHkIus8=TJuHKX=RO-;nd8# zZ>{wqX^~B`a(#O&;CO3}!iNOEym0NF8{+{~Z~KbsF|Ug_v+dIXp0Rdwzw z<3h?ZT_CWFdoM)WBs6)DZM1km2!TA33eJ&vq$&j1H9gc?jW@I2?AGpZ*+mAd zQmpq-$tjk{szIOfx`h>ZBp@w6UGEHdj>g~lHvT<0`7w|DdOsUmk|ztxDvmWXW5LRv z-|O{hW{6?3)0vycpayk^eHF5=jR@{}@z})8vh5SYpFVDjF4JOkOa1M|%_a`EV;`E*KdLZ@u_*(;-2}I{N+IrilCk*sD0=^}aqWSlQju z4Xm&28XjBjdR;e5|FLtB@M+1kKtCGJwS0{ak*hrT?gaiQx+uh33FByJZrouFu$?@u(Y@sYW=n#ipip%45! zXUX$NHLxH+w^0FNkpH`8jZE+m0LGdN6>mZZQ@>0yx~!Vd4VA75gO04H4D07t?yT46 zte<@XXJj8VH^{EjTxq64XT!BgX#_kRL1WtftD0P9ET0tNab^m=J-hT9cJyqD`N*+0 z^GI&P=oH_NfUGb2t8FjA`y+*_=1?!SX(p&q)du9-jP?8~1AZM6&Ct)Cv@9E0{8uK1 zrBp4%{7*1h`?<3!H?;AyKqvRJa_qP1KELgDH${Dq;A<4;@IfG{>%FhBqk9}OiQuKh z#$8XaD|JZEFGW8+o7u?~fouB*C$A1il&is<*Y#6sS7OzHj7QrW~D%JRwIEE3!d__7QP8kHFNgOpi1h+}1p zc0JtkySZQ2fSJ6O-m9NS3@tm9=z;zHZ(p3_)C!&5SEQm)>MYt>7&}A#aWJzUVMxyx zKF%$PC78ceX)e8N;k=kmn3t~uw5i;UdeQl)g!X5!q}v>Roz7LR*8&ObMT4g3U+nt zk!glMDZQ$Q+OiLzHk0z*OndMvnS+_vU`kITOw>$Mo6*xtiXp;l~+pVh}M3%0)#Gn7HJNvC;BIa6c^;>S9>70cDN& z6V`z9(D`ZiH^LvN-K?fiMeL7~58`y_w6rSi=yh)3YkS1-qZ~LjxF9(wmr99Lh6qw(Wp#5i{66~Swf+ADKXnWynffu zF$l~Y(AFnt5AIDtTzP}B1)d5oB3)G%xr265vWs>5x~Iu~MC9sKyiZzyZuqATHKKx_ zyE|0qu5jk*($t4vLbe%!wnM)WXS(Vy z*1E-pmbL1Bfq-#^)r)&Y>*WD55Fat^`>(aR_AS{u1dyR59wz&@owx#e>gkeXP^dVY z&h#?bui+x$?t*Yz1emQ&+sfbLlp(a4Sn9OAqc>x4%nQSLZ^^%FY1qjHLksLu{4RUq zC~0c0@JjpAqCKnPu&1+NjWK z?54`2LZ77C4Yft*s?g+k)%94MWA-aT*=0|R@)yUHW!fa0<7Dfp)^|U|#xp3Z#uVW+ z+f!b(2-@z?^wN4k(Slh6EwJuWXWkT|Qhb<*n|rqhGiBKE-plv@R@tUg^o5P!%)&9+ zsiEimhkYJ-dd2NdgeY!w%oTWAUzh1tF>Ff=0w>-{H8hfWtohGT`hzWQyA)mb7u1-{L&A8Khg*sc zEzLUkoIBbrj#$-E`dXG`KyA6AxY3tYdSRs5DeoR&{=d_0$qMWU`Eigds<`iCm>~L1 z4CU{Mmh4w=4qEEcLqY%?G!7Pzp_Vli`$hzXZu%{|GTjtjVkw%uk6Z>@7MsNaf1UhI zw_l!K@v|C`1{qfPbVPi%4X*+Vkqen`Qi)a_-^eE?U-6-oW}3lU^xxUi!`-@G0T`@1 zqDOU4et0i$P~?bzs`E?m4@*!i?Pure;(cSa38;vLP^8=F>KL0}v&RVsJxaXsR;C%D znxxxkxE=9XdQAEt(N$aNDWa{LJ`-)!yqHATC5W3EI;V~XFIy+$X^&yShpmxXcuf_f zsnTiV=$nm&n|b)V*L1JZURTAI%?enQ@Bybdg>vbpW!$<@Po&ExO!4BQNYA8N8p{%N z`NnM3Ounu!)P4EKCjku?-NQ>O{%~y8zI!b!qO%Y#AgU8O{}()WF|$tG=&ch6tt9?5 zmkM*))JzH@;qB#V)`-p@0GA3jBfyJ0yLVhnp-7%CNz>qN_)g}irKudmce!Zm`j!2v z^&+XqZXv8LTw6(m-%#A5a9XAKLTq`>f9>tCH!$;pA(g3fX<`l5`bjlRf^6lboR2*O z-;zv#%LRum>OHas%0dMS@SCtQ&8p`u&2lEML*9jSDR_<3g%u@(Rr^8PsfSZpW;iA% zQ;xxX734koMiv4nzLMbH%1GPcBUY`XqgbfCG2Eidr_ZMZR{>`VQ}+;r6;|IHrk$y_ zrpV$Wo;MU{`7)hdV{R$Hw7LbujMf6nQTo1JS%KHK=N22R7nvlU?mhv0WGNKrJovpY zwsB3n2CJO!#&&1@&VFm8|7<{7#5>tE>r(ZS!xkCB3InOIZzgb13F?oz4RiC=6r$JP zLR3?&fcQrp^m7o|Z-v|)DWCYteFovXNht%AmG|NdCgv$V__<2wGJ^bF?H%EKO{>%F zQSlO8g!B{>4`zdI<=BDyq}rcIq$;&F&lX4KkyJNb@Ii6DWfBoddi(l1cI0&LVF*e) z-^MDiu_sWOkJ45zLMhmnMkv_+u8cj+;HxhV5LQHV?zxW7|LsHFt&{dHQ2bC0UE zE|K7qMb-xi+mUNvZ(^i|?cMl1?;90Gt{w`BmbTXR5eIAamGi5F3oP^gRK;JL&&Ntm zfepPEfS3>9^!ZVZ9ZX4-Z=uJ1Rcc_9*+eUtvU@DBAD^I4mImN38+t806wa9^hy+iq zQ@VBV1i7Ji@?RPW%&(d}sK6Ht(pK~VZnurES0~k$(v(`C#D*`gu#U3qWDciY>>sip zz|b|qasNHtDP=_P3;n86iyq1gKa>*Z+y+hQ=ial(%0Y4JU5j#%98n}+zw6PmF%t^e?qeE~5b6ICG6(al91duwX zzf?YXQ6Jvw{}E5y0_PaZ`hd2-W1X!HD|iLAgt!bj4EP@1eJmJP5ScywA-vmv7zrxQ z%b{!MUW+_x@PebT#L_tgRe+4k%GD43cvfLoK%&K(!1i@F{`*~HEdPSk&1m{U+jltz zD|`N8$(^~&;K+Zu@0$-=5}mD}!G3Pi`ck++t%1Q-&aUg{Twv$R=VI%5(epHIkxTC6i4_e zr1ssRw#YVe2A&unDQLXQ|1T^R?t}{V^B$?u0RgvZZfhDuW76HF~|Aq%P+5yw? zCH7@EU%OW77@@V`k^ub)8X7*d;owZP)8gg3iu}h=r+6I=p6>YdBN8d5ijrVMZU57J>~EDX$039F(~POR%&^$QS{+BF<$}QPI&kAt zED6l5f1=yc)e;|m#_86Qs^1#Q918d|nvSByP4exUWnl&)IOo5pqJvIofLt1BrV}bZ zkUPt%6&*GcDt;pvukr4cPok0)GV?tcTfT33UgIgh z#D;o0>T79CUY7FshHnK;@6SnlJ=3oU-n1NCEi#hlS~16wDW#lu4>S;$kdlIQ7&9v~ z0*SW^j|*~#?>%4TwL(MVYFZzgZyhrUked{X<$dAAj)`@jfrvKuprd!%o^*?*Tu`gv zzd`MU;GRqNW*fm&5wfZ_=0!o!Gy$8w=O4@yxYtp}@Fpf)tIRdAvd!<;{RY)R2E*_W zl%*XZ&)YbS zGSyPAl9p14KeKTQRZ$ae=PN|zB}@)2@Ks}!`&vz6%e}<~litDXl;rzB#fLRkY)aAb z!r=c#Pshex^Ty4%PhVA%)BH=CN+-m$DXM79l<{aFNN_I3EyiHY2L>BO(C!X%OApk@>QBtf!0 zaC=2)Nr+sm@-}pG_LX_*H5sZ>`;$g}kYAFbsO-TbW??3^kOH3~x2pZqCJg9oqIuAl z?c!Q@%Qf0gHX(F)+jP*fNmaNrOBWp^W4qV8@!Wib1T+V~an7ZG3I#b9 zf*083IJl>CZoc%jUWG!0gfhFSyF*EQ!`jPPvVIY#v`^$KsT70#9 zs9+^N7fA(=^JmE&F2!!>d4vz%o}5^LmUFe!ysS2CxzfSfl|k)U69aUA%?^K{tMF0T zYvePH*P;$I*`T&bRzz$%Z0+oW^%>_E)Xg`6i83lD4AMFX!cQ)pXC8S@`Nl4axArMX zfU@NMIuc4FW%MT`etPA2w3YYYpT-NN6N!7nkZ>&Uk}tii`0EFiNW86@(2#aeu(s(X z{(zwNR2I?X^4R1ibrGuad-)2%6t3`T>v!)dA`JHQ>p+#_r|rq!qg~*t0{$H)bs#7Y z_)B&5OPEm_lfZQ$E}rUrJqb-7D8*m-VojF%cOgOq~)lJLH-0W zBzjRvHE0)BvY46LtSfJUvj9vR+WIQOwocGMYZZ;3HP`IDz&Xqpl2kVwfIy5SEyw+6 z9$|)d)KZ8{@Jx>#1qk%E^qoO`|67l%M_NEm_(Jso@9_U4=}jDx%-;9^X_|6sO5c;2 z<;F~lrj}-g8w%63mqmIp@Bw`*mH%JLuK$^q2P3;he3!;ZHtR%~!xJgDQz$PX4VBs@3Z@ z^JojV6s1{h#+?#L>;D%*i%tNPjCJi9Lat*auM5NX;6)l$9)j*NQh84FL- z$Y7E7Sp4&#<0~E3Gl2`3sJ{m>dD+Wuf1=Q-s%bTyY1`t7?Y*YVwFH~Zm4K}@%Qw6uNo|P3+jBKtv zF;qQrTXK9Ek}6x0@Im`dF;`Yh`#I5gO^S8M^t+mrGs8Hdn?vB6Ql)$mKO`R9oJnJl zxbq)P1}SsbOfHp#ou_>mpCRsL3{8A)Zr{H74GC%keKT#y3C=bJ_Pce;!Vi9Vju?y+X` zxr^z2?KtL)OPlG7Ap*3$!Jax__eZ_c!g^{sfZtvfT zE(nGord6vu|8ZhM=?&pmhP4rkPF6Q1en_5fmBX2^=K27&E>ic&Ga7gL)+_=WDVW>$4~>yXEx{F z`}Dnv*^jR?MOCaC&kz<}zW@_I09hbK^<2`H3TU?rUt(lqoFTr`y!=g5l9KoQ(h1t# z>#9pT9;D23H{$GH^*wd{n|E+rVN*W0M8rRMcJi>wVt9HE+FRwp>K``E z8gJvfuGX?3)9tOLV$p>xF~TP__VhsiG%53%*&UPz% z?&H0y~HBOWXSE%{u zN#0q+xe0o8hJRIc1CN!9lkS?3{xcSvW-Mma~Of)X*S< zyQrKl-)$d#JgN0*|GPEbrTk^}y^_#N?tmx$0b@`zZ`MQ{Cahf4k>vXG-jV@C{p&D| zDDrTFD5bg6)C%9KxK0rjshO}<{(=oe9BaP)hU<`fy8=fQ2btLCWJe6l-AZwOJeeyE z4Ew&dKLj8}iU031cY7Of&s@RGr4_#z?M89qtnyO@`uQjk_{r>N9_@Z88>Si&y2q}o zGI4Ak9WHQIb+TJ_>AfO;#Levq&`84WVGD*br2N46p3}f`+d^|)MsjtD&N;@WSe1JMgGN$W;sqft zU$FN}x(%s+h5e-5?_N9#T#Mw|$yuMYFq#W7rX7{=zR06A(%hTFfZi_}szV+I;7lou4vNG;tfRA#MO0gtyfU5AI#@!RQ6;J_*8Z z0nd-07&Jwvfn;NKSoXOO%u<*~jY0PQW@Um~i?IC`dqjp^lzkPAchn#iPr(=^p_;j# zFO9d2pucIpR2Nq!X$>Lqf6_}}tB#`a&z9}`LrlJs8}G12R~O^fiF^066IJk}#$X{D zRgI5T=A^_O=vv)!GNf$DGqMD*o!5)%iF&%+w@y4w3HBBzT*(}y02)3t^lm8kqk#X~ zXFx~VS4Bk=(o&8lX60b;7gb;6GeRAGc4f`cIP`x62N);_Q^`(X%#y5Wh!$h&OveEMInn2#~ ze-AzUUC;c5TztIGUp7Pm>hWKdS8+!7nl6lg(Ol!ZIH9vA{PH|t?RVR+iB|4$*&Trt z<1+4MI!85qD}C_=S)g)?iaGK zL0fX((eG~@Z`rM#(3((@5HZoLjc?@MJ&&FYY5Le9tjl`o(c7ykM3uYeNnzR!M_sO3 zqGomu)>~)P*ZXHC1YMNHyYK2^f5gr;C-8rwEH~k=QP~!Q2Zq|jzCP<3oNrbBFR-nW z>y0vphmnYYY9=2(tErX%TbVfSGw-uyK01-+KA!ZO=Tp@^9sl8+z9e))2j0Y*Tpk0$ z;bp7ucAk&wN>XR3t0kta$FEfA(xheEYVV)S^#^^`!huQwD16e5jW0FEx&@f}`jDO% zH_f>f;Xd!Wx~PwL&#MZF!Rw|w?FJYZzJ|3rEGsJaQYZ8bTxd?~cS3>=AJDL%;gR0%Ma7MF6tay zcBb7)*Es5zJ30Rs&$}~7`0B+h_I7@4Il~lwB5Pqhy?PuPzMUs?GofYr+T4J(> zK6$_&N5)8aVG0uJt5(99{<#4w>dsjDbqy|nL_1 zrd&;Pm&r;&#|oUE&Y#|?`dgr1o6F#KmV#}B=qpVh?dpr}B{mFnk8RjR4_9wcp_f(PyQrO2+sNXph#ju~&>uH0)E1(K?_l#ivx`OB1~taQeC4%u?EMKeV?yk@uCrV`TQx; z{-`ndABDSz=@s2KI?n+OMQkIm!8|>FZ0`<;twayqe)~G}C+vId7*Wdq%RF$npW3Tl z>*(2?BINCSTUT8pRLJ^Wdf~b5&=b^Lk<{%M;Z?L@qkCIk;m&8{;Lz3CX3h?(tg^7GZ4BIm)>Bvjc< z-N9q4DLUxey$J{|pqjO1SC$s_shoHSAaMzKL0nl9YVen>%|uBODug-|axN*^zsvlA z{@|qIN}lSd49B0%Fy8+8u4r0p8O#wAERkgv+hsU*P(^1^3dRH~55ONIgv4J(%k;@G zKgrMs)gTi^`p&=He=jefcT`{p%glm}L4AKd)>`dG9GFu0tq>+!K3uJxdV%qRY2uik zg2MIxrl8{g*XPKbPv4gNl@N_R`rPMnh4Hmx`VRjlM}eUV7q@bG8k49WlR|U$$=SNT zrg%d8Z18!yFpu+5XIgHzZ-7J2G$OpYu$q~Cjb#S}fITOvQm{Xg5n=C=6=jDn88fwQ zg^kVlIL#jFu%8OJh-pl;cX61i-c;{gX2Uk!=B_r$%J<{-U{keW!CU`B5eI=xBb#2e zbpq~(*{wiJL|;;alz*7x#vCp5SUjpB#Ns}{IK)<1l0MkDG#LG^b3RdGpYldWj48L= z#4c*Yufc4P%|?4mj{FirC_zJF3>q|Bx&|{^_3}putVG|~=!NSOb#>aRR&rfe!k<(W zNAsDRZJfmd!eptE(TYV16(%o9Z&oJ_m@ei-+*maJQJO{T0~C|mt|?`&QE|Y@p?R?z zE+@MmKjWqsidiYvU0KqROyVztc1t@3nn~h`Kc5k%hB^Kz0BMQ%Xhn_zop~Of3cZ2E z)z6!trLu2|he$C2U6Zfk!u)aJ=f9tro-5TdJ#Tof+1n4^!iC#jo#z$|m*oy~aES6d z_`uWTFm`htm@K`cxx%f6K99`F$ZB#pYOZi!#nYHe(mH}Xk}0=Yt|oIE+>1e)WY!t; zvlQ_5vg+PLZ`XJm#d_)K#V}F9mMiDr?z^p&?8YwDT3Iz8J{1?7;RzcdZqh4Dnx=CC zHm&Mn&8!0IM99l(Zg`f3|-AY;9%WyScJ#y!c6^K4d9PN1a0Dpc)*G+#b#q5*HiWexvGgo>oM!f6W%phPkxE#)b00 z|8e`Iv0u!!zK>>Veh*8*eC^TR)A0&Zeaz+^+g-*X=M3)mkk8r&*=*fML!(_*&qLFc z7sDBT{RN~j?eRGJYq*bX#nGDzMeoR+-+s9a%zgwVWG(#Bmxm5LtM11Eu^iIl*#)eN; zR(zk!>oNwf;@oy9Y~c5u#niT=Nlvs@ZI;H7yt%YeN6oy)iTDF#7k1Nark~m4CP=&G zqJ|AYJJOSYt?H*DW%GVyhlTQ4i#|hD^8-QS<3nalaI*5a^LI)qy>`{bAjt zOnYUHLC`oaug8Feds1{VsQj!N;g#?HbzbLS2(;cOR06p~qN(BVa{ z@iVUn{^nb4!i?2H!J$GIyREG7xy<>j3^G?*F&nlE&Jt55$?4XpEgJcvCM$*7#dDP& zfwZRG|3Qmzwqi^F6p-d~zoVKbfGEi@U9x$<1?hcw-?}Er?upMa1iu9Hz}ZaOdwBT7 z^?`B9yF&7`b-SKzH|@9L)Oa1aKGU6V$Nxhfv4&q(Xt0?7tgEnpsGcG`2gIp82zta( zhv=N>mrCiI6CL_sgN^j?0hbDq5;|zLWSLGmiNMmW;Ig%Ww1S}|6J)Qu%aB9+=an9N ze{A5X;Y)+(ZfK&%m1cd*d5f??E3pcJ#MWnA_COBoLhXERf-A_*M&RTu zhI}xtukusjM!rE5h({bj6uksGWyyLgY)=2Hj>J)J_w78W9e*X{ehFIsxq5R9fjfJ@ z_MN#ct5yWPpS3^U|KP-ZG@6YEo^FHZseBSp6}458LsM;!Avh$hX3%; z=g0$8i+Ow2`&9bZ%GKP-?qxVj2?aEr7H0nH6%Y#T&ugqk3kn^cpHT8|2&167M zH7w>i>|&h4tiH~r1)n&T-k|ScS^M`d`o|fq7yV3~v$I>B&{=-8)=v>p4aJ3C*|(MWcXJyzu;ya#(Y#bir`+({^u|`V=**g4YdCn+-Z+Md zgNddCF1w$WqW80uFR>X}Yn_yg&@ z7xuCw)BDb=%?k&Cmg`5a2@LaaDmJJzwLzGGlV3EH4k7ZX_V$r4jr9}ie^-h;>pzeRcPb?%TyaL?j@o&{kh8H z?Mt#?p9kLe3hw2HO;lEb-EWRsHH>P6z((_KiCQJ<5Hhq>N=M}DaQew|nyhTMc#mGs zK^cG-9(C?%kiCMDr>XI)!{Hv<3gh=9YuB^`pFQ*rOjP<`f%+%hqw#avyFYLtk>5@z z-{`#KGu~OupI6(gJW4W@Dvn0bTEb&~#(WBJI3+%G3$-xSP9KXu1oRptX-1|jAJ5ko zaz(+vhR1Z!@Tp8c)t=_nj`N+?Cc{dvV+H15eYZ0(+U^NJ=jLG&2-NImAY>(k^bIG{ za(s4vWhir9B|J9T-RJ$}$xGzM$WAsI#Fwl$gsU+|-mpW0G?VV?QtHXh7r1#OGrK@< zvpDnuCIs<%95j?3sI!nOEzcCh+IHm*p=o$ddbV?o%LgpZLGnjZH?ol0V`#X_o*bA- z#rCqiB*&dQ@zDgX+~Qp2)4u8y&|!c)G+pVGPD7cfsPR4%QjinZa&@>%vqch~cTxkk z`e7}aa6p1x*B=e84jhFG;zGlVpsmeXW`_x7j|b?FJYk{irzRtcn>drit&#b&u))+& z)-k^cHKT^7z@$@U*a){H=^&sPJCY~0%5_bh9q&+|nQ}k7S#oy!J?O%RI3tbUC2#+n zGmr8v_pZ!=D*Q6QGZ??{cJcp1Jq+v z>U$P`t#mdwiyBzgK6oAJR_V%R^cC(LS-RsX3-!d|e&jqFDz|#+A7XRW4jj$RrN0F1 zQyg@RvM=zwGgGWSOQ({pKPd_rT~bbf1iv!Z?1PfScUX)Blr*;2QaPS;W-Rw!3pctTou9PcljXMIp;v$Hy4D5C+qcaJKa&3~3&%hFSp6c@ zvj6!dx&7Jle}GTao*1k;)kyhkw)x}5nwj|`%o|kX+`7jYYz_sz{OeFo+`gszyME|n zh3vO+DJj=jS)w^AB&_gsn}NK9_s3xIU3x35O9vl&%DnS=-^|uszNT2)_pQoQsc}^) z{`ku3q|K4E$F-DpVlZut^P^Bs?mvnr-)MG%uLVn^#{<91!XZK;yD4nI#7-3%6;zR6 zV4P^0zDUcL7weP72m@QL>_G?Di5Ay3l5c6=;1@0B$JE<9{dMtYhJU0Y)Vxt0u4C)J*{C4Y z8gCgQEHGX|?^9kt( zlS$$!_A9}D0}|~h7&Q!(d{Pr;uf_%s-sFH7afBRZnCrGT!q#SVieuHhyz#bh|12|* zqEisL`LZT!v(Tvx^%=$$SIJp6lRYdwOLV=dcCzJB1JS6WLjdK?nu#57JN%vZ^NM%k zfI8`{FLC>bN5RnZVW3w)FnMlG{;Bjj=P0`;FzC=9M>Pqf4}Fx0uE(rHzbPta-?<}N z#W~N-O*R*?=fn=7IXRJeLkTruk1f-)Sg!KB<#`%!wLs1R5YXV5JrrCY8-ZBx``Wx8 z&>Vgx<0T{amAHJK74X${RGOK+)P6QmFDV5nYB9A5RYI7^;|C*<{dRa$VnaRc?%QT^ zZ^51ev&7~MF@Mh788iwN7^8)5oL{%DHm;jOVO>)@eqz!DD)N1x&dg6#)75zwo#hX# z&7TX+&Cbx-UgELx?0ZeukgJnv*NUB`vyWS%?;rFzH_oIleugZZoxPy%mE+%#<`7Y^t<@WP?2APE-p$mh*^ z(0l4rHQB%MeNYinDUzE6*}`FONiN&i(BRISP~JFAZa-O0k^|%ht31!`NQ73@tM+>rvPq(k(1?^#9r2YGvv@ULjWdFD|$=%Bsh= zFMIyuZSviMdp)z3YJ!`i*g)(z8=a=;oIP^*1gExbbSd&un(74ALRTJ?lLqS2wk8}te4qcM?`tB?p%eG1s< zE5E6-{iJO@#kWTEWcWGu{l-481zXRyg8;mYD8BuL11h$uV5Aq)0XrT;6gVmmCDOE7%njgjYBB(cp3$y{~kRmXPq-+4)`>8;Al zdb7+h3Y*APSIyZ^k`8Mjc!UtKnKxYStVqqX_~seQD&+z%bom;){mtZ@hWO-*U}%{Y zCz?I0r%00*Lx}y*y{%my9pL}@=;G;9_a4yZPO#L^D;new|H|H|G3`nsmxJ;3bD0L& z+twn8!hY1iq|?N^w}lTAEJ9rof!`D`c|n&=R|DHtc!_>srsQ6VZF6<3PAaB8Sff}Al;?MOF)Jx5_SNf^I|O-j!NPtdQu*7~^%B1vw(01j4pN2& zOeArS=xr#G`+?L!_iVam1(1evc8uJV#iTqMZ9cU>VYwlX4dS`FI!NG=X72jA^0t0m zbSWfWkw3&;d+HMqbhKKCSYOsia2BiL)5a<_w^MO(H`b#cUkK!e)apE- z{^bvCs^M5-j;k6=bYynfm}Lh?K?9p1CM`;Wx=4-mUSLHj#jP-C45{Fe zj=Hdv=g9I0gbbKOSa%EZhtFL0+0401Yr1y(knKYYNK@2s?uOBtK|?6)$VXE*<*CmE z)XO&%?Q*;Ig+EF^4XeCTqIn%X3hO#Yghe+?jmrDYwVoS=YDhrue#gvss!8CgiJGla zkt(v&03PjxIBu^$tcBVL&7mQ@u+>&TmY$Lgoi22W{j6sr)5-gn@YOaJ zsFFM+qO0(ZpY&+EE^oKyas$sN4L?V9!udIFzw-5mZHB@d=E-Q29BI4FUEEO2IMlx= z;oUk6#P`YY9|Du{8QAY+zhO`QV#h#TDaMAl&eds%1MIoOrc1v3>i*Iq7rUmfqazDI z3i<_51<(b8TV0crOu&L(a;i&mC2!eOZ5aO~&zof-=5^&_XIL|Tubk>W(|i{;g&+co zQNv8&ahWe8XQi}$KKP2>ELWQdq`($}wv;^ZBp(Je30QcxGI;dXi<*2vaDPgpQroq4 zzbD>dHix(4ZD2puJ!LN!?`oI(L&H8!dQr2UQ?pc;ydEe|QZCska;|#S^Mx9Z3>SHdb`vO}>^?uQ?6skN=bVV!ObG6&`@- zY2Nf)e-T9C$5P|WInM>QlZeKnXO;rxud;8k>oFb}7 z>h~q~PUGm2ZX+vz7m<`R@{TGNGnuRDr+c`eLxuN(`v6r}k(lt5keV3`E~h64*>Dxc zT7I80tnd3Q)RLqmfV@*CWH<-!Q;f@_HH&*^4o%RMSCad{ne*2g;#`0GapLT1t*O}g zUkkTMo`GBed9AP`Nza@pq`^|)ZnTKk)9bH80(|*Xs%xtC)n)vFxd8aeK303T>MsiP zk^?Yh2_hhdiQ=<_8JFV2fpwp>aj7*fU@r$wJK{3zeJrl5WU`5Y zdZOA@1&M~Zxc*>JioY*t`%aHQfMSCLYEo)?GXBt43zyhMst({t>Z9Ti5~Cf;9=$w$ z@sRw`+e0!Xlxf@&sJqzMVfgk<(foQ>r)IVeiGB^h&Jv#hS9lvmQ|--x6T>awHk&%Tmi1eiN=}TXHR@u@J;FpD-Z8XdvT9Eq7md{Te zthAKbO=>tM4e;r;NePmd*pf=ayL1GG+qj!(j||Z2g||3&RbOf$ZH+J%bW+(*1@mD` z%e`-Ne@*>T%9(1qQEj~RXx(HRb$!&;dXwXG$QgN2q$L(K9LK9Wqxi&N`WJj`S-$)q zy7ijwuJ6n0t6s~lB_g7vEa= zdw1y&imFRZQ4+2CqPtg?f;~F7I$e@QiBhpK)HNwqQu=qTx*_S7XjSR_qC>d@xMxr+ zc0VOV>qIf4hsu8jguugY$DZDt>Fb1Kt?_V(3f55oZWGunxN5a9xpJtNG&ig%QD9XO zgs8m!*tq!s>c=ok+2O=(Ka&N3Qd47Oao2yD`0Y6BAdqkr#Y>fqg%70XVLOtUkRV#M z;ij6#_!c0)EB+H&rZJd7ThNlYx)gU8vTQOXZ!Qb(u`80 z(>3aW7{rpZ=~CP-gackg@aH$zqO3mrwg3Y}OyDb~x5!8kR$|-u`~=_!Z#37;>tbmF zgHr^O1lCh;I#b7&Xu?Q!f9Q5-xPLOspGqbCpgMCaKU+GJQdPz+q?5ZNn;Pv$9}t$P3ACl<`FBrpG#lb2}3H2!{!~!#z>;ZgDi|2iMPrZ-ajaSKPk}ATXisQ{pd9!Jlnaxf&&P({Mi9w+)#waycW3>*i*&4I(#D zt5o5`g-SH*V}P@a%UT*Ly~+NavTnnBa;R5!zkA%c<$Fs(zB*%b`RCQ;diL;flLwI| zjpu)=2M4O8!Q|_d)lg^cZ38|-!8b6S)s0q$ipm4|Kjr=vgPFhA5*q%vXIQ zxHf9`_!iR49;N<_V15Yr(BDJm=^^WU4+XimzHfu=>Wk8MD!ca^_J(9U7y~!$2QKi| zs2enJC66+sFA+_-6K7ktJ4x!iv9bOSO?-<^Fy0^x6@gtcN~~82T}S#E&aDyG@2~Uq zcj>Lv)2K7y^w0?1E)8*|Z%J&iKL32+9*D~?5oh(PCxB?CI!viAXv3|{_5)&cPVlmg z?xfK*Q&-vD)XDi4v+o8OF>^9yeR7kb$qxWLT^BiLb{BV2EB186K~qNJ(&~@0Txy*DI*(1<)H^2@IN8I(P1hZpTj;Gt zZ7^KGv@dbfPirbZyU~Ce! zvvEvQ%{O(7y5X<+!84VmwiL3BPxhCUAgL7vxzvuE&ZrZf4-EO4J5brJkI&n}moVfd z#s_WuyWr0ZDdELu22nM}gX2`GDsVcfFMlpoEJ)cUjL}@h+5{!LroTjNTu22{QnS@x zH|upTO*$x+rm=+wFbHB@7Adl^t|6rd~`$xJCs>9Sc&}4CHY{ z>a0{yBB2Cp)7x2Ee-I$cmI>>#-Up_JG^hj!Q8l-V%p%!NVXjtpUUzFhKzAB9OCR$-w|8+Yx~|1KRJ$o|ORqu; zFN?0Sigdc4m5R;H)?Nhz`=HVd-(FgD2hT1s@AGRLH z%4s&0)P=1{+mgn`@G-juVp}7thBN}XMmrC(#)MW7UVx%*GgnK319=vr7_p}3-Ghu| z)vafn4UO~V>OlPvX7666y7|Q2vDis*KdcP zg^Ew*co@#WI4WJ*fxAU{wuD9G1>VQB4!a2jKcVqpQ1!tgq*xo`?ZOF>4%V147KuIf z#8)bm9Kbg_NQrTYl;+R-MCj6Z)?|_R;B_kDD~VmQfjc1~NvY%oS+RB|=*z2Q2L-eZ z<U$FOys>%FXw5WCoQ6oLr#q zF7S@-ehLkPOY4G3L*q$P(zRcb;6jAigOc&1lH3mwq0kv8p_)`&)NX#Lv$AiUB*_oF zxZt6BDBZVvA#>;XX$Jrg1F}?x}vumWV4V!U!tfe%zEx#H~4br`pA;`9{r@&9joUa z@t196xWTRN74MeUB3v%mx!OZZtBaLZgG=`;_pWvZ9r2hG3yyHzXno~Yy5IJSHc9V@Em#^!uyAsQ)hc+yIBbY z+{00pl;|OdTjb?GxvtanG?)!z_e$eLa~k8f4+Lt-mQg8>&Q2b!-#j}tS?`KYMVEbu z^U%7ZYZ>(6+Dfg!Rw2XwzZ^K1QKiFWekR>73Y)rtenC+4IOW$T4WK~a;5bVi@YBxK z`_Vynz<+(c`bgk*ib{G zTT8iNS$lQaMM~`Tt1~_&W!{K>Nrm-kRFIO`aA_L+haB~)`>BxPYL^xuW=Y*sBiD!? zB=MAV`1J#m&F28*eV{i+SFvqN0OS3}NL~rVjj9U@^=~`X zj<-qQ^{uRs^DuQcH6Oi@Y5=l#R5A$Fbp1bsOH67M(iLkCHBx^1_`8hy@W}x8xQX{g z9pkU8E-MU32>_+;UP0<7FF(t?JLs+_&k>@E{e5Q{KRIn5`4miDu7VaDf4(^eXzEUm z$kwa)2C=o*2+x#U;9;0XWRvw#mGIl?T}a%#58GkM7G!hDFiodg4a}Nj2fwla+jWAs z`qkhA!dLS)YfRHdm~WfvU$2I;9Au5@_8*#m1~ft}MeQT@HBcR4p*UDL)9`JYINaYS zo0o;*w#nAGG-haYB1{wVv@5)lP61!j*;n0Zzrwo7$s`aaWOm#B9$Vb zThV0owTMBJ@31-BChH#UCQBHL=7RD0Ys{DgZ|E1;gZiP`P#5eNwUDt;7bw9l8Iw=h zFdbB7m5q45+N1Wr-R0&A5q$fTp`phl#%^7S-A}5}$fm47_`*F9WedA&jSl0RP*;|DEX=>_8(M8`i{Y$u~VNFcGoC0ERyh~q$&-vio=gLtL6 zFjD6i-z1NMU~A0SpAH{K-e}#Y@vnx@b5BppqAdI)=GiZOcBM{2*dy?6wX^;S%vaG{ zDaR4Q^!UQ1kSzjS?R;+SyhgYGJz1GR{X|H1;5+DDm1y#$mE6(lq2rMXJ`U(_HG;v> zz$NU`#JfWbUqVCk7tUT{PZjUQ2#>l9lqFec>}KHZtZR6Z?5R0NkhA%1fJZS+i|#Uc zi>p>$qyBKkt+EL@sbTc!R(nLNj@=^aF+jXGiaYl#MQR$Ens3YNZtF}M07RmKUiiuJ z+(^?Y7Lc8_#HK%rTiSRE&s7+OarAe-Y++niO`BiZ|2}>^>vQ_~_8MvRS(5BOJRRK7m>F!G z{gRiI&xcXDv6;4>m#mBN_+#@zYrg{%%R*FfibViuWHQ+q64*`h- zjXQatUBy9u)8KaVg@7GtYJwx-8n2a}0{59}$!a55(R{*XB-jlN%ld(xbz5PLG-g zIFoi*$HjK1ChNT;Vu1CVbJ~%vTTZ^$9%Cj3$4AD~Fo&jpst}It|C}hNwW{?7lA0Xx z8uD=(Crv+gMCASOY$0g9FS&{l z7v1d9)zFC2lmjK1Khv-7RpbLzW!()?tz)NUtimLS1*K5%)@+b zI%_5FhZkZ!OzH82 zZJeQG6c+Lk1G}Qm^G%dm zV~~<%^X0<4IIvPk0nTdn;yE#Kem${C^%OQSOi>b!Nd7QJcXgr{%n4w91ByV25QST+ zU&$w8B<5z)@D@=-gv6g|vmCwtouAw1ASN&b00C$<&BLL))!rJ*NBHmW z?^A^3ZP}kXXT9a*i90qFg=lc?63^kUB5=X`fDnYu`nui~A>@nd<%tQ`D}(#nw?~C^ zd8?9^bKr9lJma%B@fwa_{*m!-_`37Y4;W@FxHl*}%A4JS zgI~>Bb(~W8SJkp641ow<{kk`~##2gLKd@3vSNq3I{N(M6;g~0fe!D2a^p;^OvgZe_ z^fj10e4ezS+8)enVAUZo*Oe^^<3L*8bHjz(;pDJ@uT2?~Ed(nIY6Hr&By@QMJ!~O4 z4kW!-yMkZc*w1B=O_O&&wwVl6#<|PudTQHt{n-J$=*_KXw!#>-Ex+&nfZ9(!BP6!3 zs-3Slw@t_DahK1D5fv8!&3dQ))&4^ghu(kSe%oW4y*CXOkQMS0S6?LnvDlTUI{!H2 zN{9m|A*-z%yFr+@m_51e3V}BVQE;AO?MNM{rd+^<+;-Osb~fZ))$EIKAqv&L6kK9V zafSF`z~Jv_1>kYsS=cK!dc@7~^FTqs6ZpGv&Eu$OV(?j_@;~6vW3FEBA2+5vF4S0Q zgNOr~!8gA2z;)-;yXd3_$);)L|k{} zXL{U1uiDD$o`4L5KX(e6rDk!t+Q#W$7TkiE{&9f%%^!e%depSCNSeZLY4r;(nc_uQT3b$PDQzzY51^FK>IgLK0QO{^xmVnj zTYK0C>TVdwBL0Q!t9EAj{SLpZ6`m{Gj4Eh;|EbgXEwnAZ$^tDf?dgy+fhOU^Z1pP& z^v-#k6ief`t0d7ueK=;UoE(NfA?69|=hnJHh1dQN7{ZYYfu=aBFmzq~3y^eMKHDX@ z`GTG9*Q|!iGg5l*Ynh1o8OETG`gkJSGdak;$3cA}tcE082`0*LlZJ|Eqg~yKPuA9# ztt!+@=wCLki+A3upU^7uzSuuj7rNS57u;OFTHs-b&Gn53IKvTlj2c}#-&b6Iysj}vpnQ3|V&)BA%y;y%A z+L>~W5&H$)T*^ow)#sMavBB0ejerqG^6tMd2 z``rE|Q)69gT)&9^{rg(bMe7Xv2Aj2kZw`A9@W;WnS^4JBj-oJaRpJX^EAufa0{hgg zk=0J`E5t=)p-p%@BWv~GWt_yH+|wPpTJXF!SVod9A;i@q#jH_4qaMPCx!+xo&eGs& zlataBhahvaN_w7Qr(x~vD}*`hh{-uW-#|;_T0#2zqr?hK;po}h=f16s1VN3m{UmXd zhlCc;1PH{BV&SWjz2(){euEv1K)Q2w4d{JAv&<{QA2uh2^khVwKjUU{wvu5YrgFr1 zf@ErYS>6V*UHKiNN>PQwL2`cBSwdHmyx360yHpbokRNJUiiBZe(ZBkGFCc5YV7fHz z5~m1 zZ0411M`@f!B0m)4k-4Dw>oQWldos$X9lvy~^-mUrEhnZ4>DlVJ(o-bh%7Wd<+(>Pt z*$k08qR5>+1h1QN9F8B*g{1Ym0$CB`IaFlAXgh%h!w&y@5QM_)3<~Mexc)ri^m)z~ z)jfh4ZC9So8}ZD`UN@Aw`$D<9bk~NgTG)QcYrN6E!R5(VKXaF5sm+pAkff}YB#63J z9Q#&&A^4+3P0A$QM3N#N_^`IfuEHOem8Lf8q-p#|NJPaGY6`brgczYG zPmVV!1D(1rS+bJh$_8ofhx<48Op*FmcxX`$S8aA{EJ1TpDyBz1!R0{6ekMmSZs#L$ z%*KAayO<&kuoxe0->t$Tr&b2+Ctz;1eNvZFn&DA!$lsj-vXCghi;a?834J!ZKb9$d z5o>@TvpY-9%--j0|6*f*>jCyFshCNsGr$L#-A79VL_nObJ9w2uFC37@9H(69=pFSs!mT==Ji(k~vd z$?7z2lJ7`|52BMN8M9P@h&bFhiyjA3Kyk?~aWA9;RP834RjKV^hsgWr@E0-Xc8AT0 z@*kp!$jr7+tbHEW5_F(OTB`kbe@4^Dvab$*T#*NcK-9pJKug|VZPj=Hoom_n@5~( zXD*xY|4O#9;PKtt||jYEm&uY?BIa`rM zc(;l2c}g-ZF{=qNI3c`4OuoNjjISZghZ$oqbDsC?wdW6bp68tFKF@vMzx(&Q?-qPV zV0h}Fou~cPB!4#U;O=xTk!f+53m-w*+}=qceGW*Qp&@C3^U}7C{t-1XU~#TgfwT$= z%%#26EDsJ65}@Wz}s5 zN#s?7Q8*763H=!;JWtRBwvSHbGBN|aUG?rsa$*T+?j~_}9PAZGkvb!?t)cc;*!!Rc4cmFBSlCAjH8c!`-Ul z$@%CjLb`k`ET@$he%w0V7>l~q)mQP`n!7(0*vK(8EQ743gr6F`Sl+)vNXb3V>+cXA zl)eqN^C<=%s@_QFLmuRxdUM7vA}8OSu$;G8JCb{Y-r)J%Z#;$$pg-28z8ONW5d z_ki+Wo+V}N!7Y#H51K^=uE;ax!s&04u^f$Ohqx{Fn8bF+|iWKM1jEx~mk&esEbf3DBbq_5XRGd@hg46;Ef~QT zUi^6k9wT967!abdo3+nnYRo#9+sBoLn#$_ZankJ2QfLFRhv^+dK6k(irw zVKh$@evXSUgg>lUVoe}UQ;qYoaio|1a_RV&B0wHW!J&U?Of^dE5kF_N8t^?O1MjvZPRrcP64`&d@<%^W{2w40_6%UCaZL3 ziLof90?NP|9qB+%)IXK2Hg%ka#3(6uiB${l0F+T|0!WzKK~Ko;PXD(RJAxC}cdA8q zyD=BHxUu@Kn8E0jd=ZY{?)5Apf?ZCi_Mjcw{&sr18_z%|+z}SM?XzI1AC(%fHBNewtEBX-${*A5&}6XTDqbx#L$D0x(%Vbydr&uzb&KdU!A;&^{wl}Nzp@E= zn91bk94%1qr*=+{sKEnNu=d2s7=QKfT*$gWCL0x|J~vy=39E9vy|`BdnF?Q2)J=px zB-JBD3iAe(S_Yu)X!hE{(hkhgNoAu^Xp4Ve;xca__h{B)P*S&Uv+4O09qqi;zSZXF z9_v#cYoMh?jMXadhbrVxZi$H)+7?+WZ2!5!QXMh0m@X-gsnZ7^CRAxi z*1rR>5}!Mh>s!!`0)0SD180_~1Cou)pKs=T&eluUkJ}k@Ul?-SuR}7FQ~1t;w0}6M z@a9v!wCK^V$lv`$GP@f=V}Dt;Ym_Rdv7fq!c=;+qhYws?wH!Cs$2vxE2F?uA(k`Pt z=xKh!2=3;~y(fw>;t%dt4TMAObZ}LT*;oiaYZ27|&c2dN`g`NdT@0zODDvDfs5Q4) zg7xu<+4@W-sI7U%`3%TZE(cRGk7qMzQ_w~Y$t~E^JardH^l4F$HOR|)q?j6DPG1gQ z+#vo%ld3?9zJlXHqDxAZdcIU^4F3GKV$n+YDJtm7#E4q>;*!vq&6xq#7>_{Zx9BYQ zP@1Sg5De(6z{Ff;FSn@5y{6f*3al_H#aRha1a(44V_&Se@wjd5yPO$GN-QCFUn-9- z@aj6!u-V%|8g~5Mg=mkkg+7R%Jt&@-I+2=UCr zyX^zEHZLU69|wraE`_(+zb+RAa|!^42B&B;WSA#ufVzOqI5h=cUBrMudEk=Ud!}>@ zaRin~gq*}oSUC2cpKW`zoro3}{Hvmrt}Xoed+rWmwPcJIHg8K~i^)#Y!Abi_9`Tvs zQgwzVGo(0i#b-rOAd7yDB6=tuigGIFA@BYHRs>p@a<$NqM>%B9$67Lt} zSR%xnR*=u3jq?O?Hp{Dq|2V_cZGNWu9=r2vkvV4$4J$!pQoj!l(x;eAWOI?9Zc7Q= znkHqUuy6jz^jiwD0BYN1P3#Q)GhuQ}YG$n(eVLwJw zYKy~6uusBXnxX(C!5GC<$AJFh&a2dT@DJCv^T5Ct-@6jeyl?;Y#-Un#Vyly_&PUp9 zLMGmEUYI*Z;;%2Ty%~7TYd%6>mU@i`Sne6Z&ZrwObaj%+EevVXHVL%e6prt|kc+&r()NEsXwzf@K^EEkT9w3ji7*abx~J!hR>ipY_NOt8Q?1Q2mH^ z^7I;Vn>=S*=JLBw50(w4TISK!P4+|Ud&gnM&=CoJK6d@h7ICCJ3hxr3suX$0ytnou zFOgMQa;$iQI~5Q}?~RlG4uv0Zb0|U0RxL$HN_x!o*|3`RzyP~;Uxk|bdo!y-=|ISD zGFv^Q;gyf~@+%xDGn_bZTs5)^IUBO*N)T6{fs3uu2h#jptuXV}?TQJ>J$Wf=7OjI` zb!<%|`e_H%{xwB5Erzwv0Rh{cszoaQJ}qYE7!tM=`yWT?3?ROS2pS-u4v^3F+7RLj z{P0l`gn^Z}UU7BneUAK2sa^rK8X8O1}lx+p{=-C`NX~7%zm(OcC35LUB{-f za=AWOvx_<>+zKdj6V@8&GBE%R$kSewrJ>TkWS$&&E4d;-0RrYihxRiVVa!bkl7Lqp zRgLHXVzjAt;ghw7t|&>v&K0h~ul52il^2T0gzc41Xu6Dq#s})jh}-Qf?oSN&#`Fif z4gctFPoB5l;=4iBm9Tu|zY%@yXC^uZ*!dWo@oh^YHOLUAs(NrfRNAHh5V1_)W6by& zu1wk-5w5+hrbIDKz~3eVoGdlels0VdXi%!fShRG_%&@fvNEI9uUa(k0WI!tbhzy1y u5oy>}1&IJ=A0pt~iZ*~(%l=IOY~CEV^h~_*(V2DFbM_4Rbm^%d?*1Ps`zF%> literal 0 HcmV?d00001 diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-cover-light.png b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/mcp-cover-light.png new file mode 100644 index 0000000000000000000000000000000000000000..28ab830959b6bcda700b45c308d2a9a91ce6f83a GIT binary patch literal 63857 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�k&AOZVMnNiWEZL?kw`wY*gN; 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 SvDSZRA3ZH2%}Nd1kpBl1j3ZtE literal 0 HcmV?d00001 diff --git a/packages/twenty-front/src/modules/settings/playground/assets/model-context-protocol-logo.svg b/packages/twenty-front/src/modules/settings/mcp-and-apis/assets/model-context-protocol-logo.svg similarity index 100% rename from packages/twenty-front/src/modules/settings/playground/assets/model-context-protocol-logo.svg rename to packages/twenty-front/src/modules/settings/mcp-and-apis/assets/model-context-protocol-logo.svg diff --git a/packages/twenty-front/src/modules/settings/playground/components/GraphQLPlayground.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/GraphQLPlayground.tsx similarity index 89% rename from packages/twenty-front/src/modules/settings/playground/components/GraphQLPlayground.tsx rename to packages/twenty-front/src/modules/settings/mcp-and-apis/components/GraphQLPlayground.tsx index 06bbca026f..7fea4751a1 100644 --- a/packages/twenty-front/src/modules/settings/playground/components/GraphQLPlayground.tsx +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/GraphQLPlayground.tsx @@ -1,9 +1,9 @@ -import '@/settings/playground/utils/setupGraphiqlMonacoWorkers'; +import '@/settings/mcp-and-apis/utils/setupGraphiqlMonacoWorkers'; import { isPlaygroundApiKeyFresh, playgroundApiKeyState, -} from '@/settings/playground/states/playgroundApiKeyState'; -import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; +} from '@/settings/mcp-and-apis/states/playgroundApiKeyState'; +import { PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; import { styled } from '@linaria/react'; import { explorerPlugin } from '@graphiql/plugin-explorer'; diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/components/McpClientLogo.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/McpClientLogo.tsx new file mode 100644 index 0000000000..e109a4346a --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/McpClientLogo.tsx @@ -0,0 +1,44 @@ +import { styled } from '@linaria/react'; + +import { IconModelClaude, IconProviderOpenai } from 'twenty-ui/icon'; +import { useTheme, useThemeColorScheme } from 'twenty-ui/theme-constants'; + +const StyledLogoImage = styled.img<{ isInverted: boolean }>` + display: block; + filter: ${({ isInverted }) => (isInverted ? 'invert(1)' : 'none')}; + height: 100%; + object-fit: contain; + width: 100%; +`; + +type McpClientLogoProps = { + invertInDarkMode?: boolean; + src: string; +}; + +export const McpClientLogo = ({ + invertInDarkMode = false, + src, +}: McpClientLogoProps) => { + const colorScheme = useThemeColorScheme(); + + return ( + + ); +}; + +export const McpClaudeLogo = () => { + const theme = useTheme(); + + return ; +}; + +export const McpOpenAiLogo = () => { + const theme = useTheme(); + + return ; +}; diff --git a/packages/twenty-front/src/modules/settings/playground/components/PlaygroundSetupForm.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/PlaygroundSetupForm.tsx similarity index 89% rename from packages/twenty-front/src/modules/settings/playground/components/PlaygroundSetupForm.tsx rename to packages/twenty-front/src/modules/settings/mcp-and-apis/components/PlaygroundSetupForm.tsx index 0770913274..d2249e95e4 100644 --- a/packages/twenty-front/src/modules/settings/playground/components/PlaygroundSetupForm.tsx +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/PlaygroundSetupForm.tsx @@ -1,7 +1,7 @@ -import { useOpenPlayground } from '@/settings/playground/hooks/useOpenPlayground'; -import { SETTINGS_PLAYGROUND_FORM_SCHEMA_SELECT_OPTIONS } from '@/settings/playground/constants/SettingsPlaygroundFormSchemaSelectOptions'; -import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; -import { PlaygroundTypes } from '@/settings/playground/types/PlaygroundTypes'; +import { useOpenPlayground } from '@/settings/mcp-and-apis/hooks/useOpenPlayground'; +import { SETTINGS_PLAYGROUND_FORM_SCHEMA_SELECT_OPTIONS } from '@/settings/mcp-and-apis/constants/SettingsPlaygroundFormSchemaSelectOptions'; +import { PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; +import { PlaygroundTypes } from '@/settings/mcp-and-apis/types/PlaygroundTypes'; import { Select } from '@/ui/input/components/Select'; import { styled } from '@linaria/react'; import { zodResolver } from '@hookform/resolvers/zod'; diff --git a/packages/twenty-front/src/modules/settings/playground/components/RestPlayground.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/RestPlayground.tsx similarity index 92% rename from packages/twenty-front/src/modules/settings/playground/components/RestPlayground.tsx rename to packages/twenty-front/src/modules/settings/mcp-and-apis/components/RestPlayground.tsx index ac93178c04..997d15614f 100644 --- a/packages/twenty-front/src/modules/settings/playground/components/RestPlayground.tsx +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/RestPlayground.tsx @@ -1,9 +1,9 @@ -import { RestPlaygroundSchemaFetchEffect } from '@/settings/playground/components/RestPlaygroundSchemaFetchEffect'; +import { RestPlaygroundSchemaFetchEffect } from '@/settings/mcp-and-apis/components/RestPlaygroundSchemaFetchEffect'; import { isPlaygroundApiKeyFresh, playgroundApiKeyState, -} from '@/settings/playground/states/playgroundApiKeyState'; -import { type PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; +} from '@/settings/mcp-and-apis/states/playgroundApiKeyState'; +import { type PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; import { useContext, useState, lazy, Suspense } from 'react'; import { styled } from '@linaria/react'; diff --git a/packages/twenty-front/src/modules/settings/playground/components/RestPlaygroundSchemaFetchEffect.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/RestPlaygroundSchemaFetchEffect.tsx similarity index 92% rename from packages/twenty-front/src/modules/settings/playground/components/RestPlaygroundSchemaFetchEffect.tsx rename to packages/twenty-front/src/modules/settings/mcp-and-apis/components/RestPlaygroundSchemaFetchEffect.tsx index 4231ab7b90..79ebc3d5f2 100644 --- a/packages/twenty-front/src/modules/settings/playground/components/RestPlaygroundSchemaFetchEffect.tsx +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/RestPlaygroundSchemaFetchEffect.tsx @@ -1,4 +1,4 @@ -import { type PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; +import { type PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; import { useEffect } from 'react'; import { REACT_APP_SERVER_BASE_URL } from '~/config'; diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/components/SettingsMcpSetup.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/SettingsMcpSetup.tsx new file mode 100644 index 0000000000..7e6552d148 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/SettingsMcpSetup.tsx @@ -0,0 +1,117 @@ +import { styled } from '@linaria/react'; +import { t } from '@lingui/core/macro'; +import { Fragment } from 'react'; + +import { LightCopyIconButton } from '@/object-record/record-field/ui/components/LightCopyIconButton'; +import ModelContextProtocolLogo from '@/settings/mcp-and-apis/assets/model-context-protocol-logo.svg?react'; +import { SettingsMcpSetupCard } from '@/settings/mcp-and-apis/components/SettingsMcpSetupCard'; +import { buildMcpSetupCategories } from '@/settings/mcp-and-apis/utils/buildMcpSetupCategories'; +import { + buildMcpConfig, + buildMcpServerUrl, + isHttpsUrl, +} from '@/settings/mcp-and-apis/utils/mcpSetup'; +import { CodeEditor, CoreEditorHeader } from 'twenty-ui/input'; +import { Section } from 'twenty-ui/layout'; +import { MOBILE_VIEWPORT, themeCssVariables } from 'twenty-ui/theme-constants'; +import { H2Title } from 'twenty-ui/typography'; +import { REACT_APP_SERVER_BASE_URL } from '~/config'; + +const StyledMcpEditorHeaderTitle = styled.div` + align-items: center; + display: flex; + gap: ${themeCssVariables.spacing[2]}; +`; + +const StyledMcpIcon = styled(ModelContextProtocolLogo)` + color: inherit; + flex-shrink: 0; + height: calc(${themeCssVariables.icon.size.md} * 1px); + width: calc(${themeCssVariables.icon.size.md} * 1px); +`; + +const StyledMcpSetupContainer = styled.div` + display: flex; + flex-direction: column; + gap: ${themeCssVariables.spacing[10]}; +`; + +const StyledCardsGrid = styled.div` + display: grid; + gap: ${themeCssVariables.spacing[3]}; + grid-template-columns: repeat(2, minmax(0, 1fr)); + + @media (max-width: ${MOBILE_VIEWPORT}px) { + grid-template-columns: 1fr; + } +`; + +export const SettingsMcpSetup = () => { + const mcpServerUrl = buildMcpServerUrl(REACT_APP_SERVER_BASE_URL); + const mcpConfig = buildMcpConfig(mcpServerUrl); + const categories = buildMcpSetupCategories({ + isHttpsInstallLinkEnabled: isHttpsUrl(mcpServerUrl), + mcpServerUrl, + }); + + return ( + + {categories.map((category) => ( + +

+ + + {category.cards.map((card) => ( + + ))} + +
+ + {category.showManualConfigurationAfter && ( +
+ + + + {t`MCP client configuration`} + , + ]} + rightNodes={[ + , + ]} + /> + +
+ )} + + ))} + + ); +}; diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/components/SettingsMcpSetupCard.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/SettingsMcpSetupCard.tsx new file mode 100644 index 0000000000..6f669819de --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/SettingsMcpSetupCard.tsx @@ -0,0 +1,169 @@ +import { styled } from '@linaria/react'; +import { isDefined } from 'twenty-shared/utils'; + +import { type McpSetupCard } from '@/settings/mcp-and-apis/types/McpSetup'; +import { Pill } from 'twenty-ui/data-display'; +import { IconExternalLink } from 'twenty-ui/icon'; +import { + AppTooltip, + Card, + CardContent, + TooltipDelay, +} from 'twenty-ui/surfaces'; +import { themeCssVariables, useTheme } from 'twenty-ui/theme-constants'; + +const StyledCardContent = styled(CardContent)` + align-items: center; + display: flex; + gap: ${themeCssVariables.spacing[4]}; + min-height: ${themeCssVariables.spacing[25]}; + min-width: 0; + padding: ${themeCssVariables.spacing[3]}; + padding-left: ${themeCssVariables.spacing[4]}; +`; + +const StyledLogo = styled.div` + align-items: center; + color: ${themeCssVariables.font.color.primary}; + display: flex; + flex: 0 0 ${themeCssVariables.spacing[8]}; + height: ${themeCssVariables.spacing[8]}; + justify-content: center; + width: ${themeCssVariables.spacing[8]}; +`; + +const StyledBody = styled.div` + display: flex; + flex: 1 1 0; + flex-direction: column; + gap: ${themeCssVariables.spacing[2]}; + min-width: 0; +`; + +const StyledHeader = styled.div` + align-items: center; + display: flex; + gap: ${themeCssVariables.spacing[2]}; + min-width: 0; +`; + +const StyledTitle = styled.div` + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.md}; + font-weight: ${themeCssVariables.font.weight.medium}; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +const StyledActionSlot = styled.div` + display: flex; + flex: 0 0 auto; + margin-left: auto; +`; + +const StyledDescription = styled.div` + color: ${themeCssVariables.font.color.secondary}; + font-size: ${themeCssVariables.font.size.sm}; +`; + +// Install links use custom URI schemes (goose://, vscode:, lmstudio://) that +// twenty-ui Button/RawLink/RoundedLink strip through react-router or getSafeUrl, +// so the call to action has to stay a raw anchor with the untouched href. +const StyledInstallAction = styled.a` + align-items: center; + background: ${themeCssVariables.background.transparent.lighter}; + border: 1px solid ${themeCssVariables.background.transparent.medium}; + border-radius: ${themeCssVariables.border.radius.sm}; + box-sizing: border-box; + color: ${themeCssVariables.font.color.secondary}; + display: flex; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.medium}; + gap: ${themeCssVariables.spacing[1]}; + height: ${themeCssVariables.spacing[6]}; + padding: 0 ${themeCssVariables.spacing[2]}; + text-decoration: none; + white-space: nowrap; + + &:hover { + background: ${themeCssVariables.background.transparent.light}; + } + + &[aria-disabled='true'] { + color: ${themeCssVariables.font.color.light}; + cursor: not-allowed; + } +`; + +type SettingsMcpSetupCardActionProps = { + card: McpSetupCard; +}; + +const SettingsMcpSetupCardAction = ({ + card, +}: SettingsMcpSetupCardActionProps) => { + const theme = useTheme(); + + if (card.isDisabled === true) { + return ( + <> + + + {card.ctaLabel} + + {isDefined(card.disabledTooltip) && isDefined(card.tooltipId) && ( + + )} + + ); + } + + if (!isDefined(card.href)) { + return null; + } + + return ( + + + {card.ctaLabel} + + ); +}; + +type SettingsMcpSetupCardProps = { + card: McpSetupCard; +}; + +export const SettingsMcpSetupCard = ({ card }: SettingsMcpSetupCardProps) => ( + + + {card.logo} + + + {card.title} + + + + + + {card.description} + + + +); diff --git a/packages/twenty-front/src/modules/settings/playground/components/__stories__/GraphQLPlayground.stories.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/GraphQLPlayground.stories.tsx similarity index 88% rename from packages/twenty-front/src/modules/settings/playground/components/__stories__/GraphQLPlayground.stories.tsx rename to packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/GraphQLPlayground.stories.tsx index 47e997d5f5..4b705e8f06 100644 --- a/packages/twenty-front/src/modules/settings/playground/components/__stories__/GraphQLPlayground.stories.tsx +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/GraphQLPlayground.stories.tsx @@ -1,5 +1,5 @@ -import { GraphQLPlayground } from '@/settings/playground/components/GraphQLPlayground'; -import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState'; +import { GraphQLPlayground } from '@/settings/mcp-and-apis/components/GraphQLPlayground'; +import { playgroundApiKeyState } from '@/settings/mcp-and-apis/states/playgroundApiKeyState'; import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; import { type Meta, type StoryObj } from '@storybook/react-vite'; import { useEffect } from 'react'; diff --git a/packages/twenty-front/src/modules/settings/playground/components/__stories__/PlaygroundSetupForm.stories.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/PlaygroundSetupForm.stories.tsx similarity index 89% rename from packages/twenty-front/src/modules/settings/playground/components/__stories__/PlaygroundSetupForm.stories.tsx rename to packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/PlaygroundSetupForm.stories.tsx index aacfbd9d99..9838e32db2 100644 --- a/packages/twenty-front/src/modules/settings/playground/components/__stories__/PlaygroundSetupForm.stories.tsx +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/PlaygroundSetupForm.stories.tsx @@ -1,4 +1,4 @@ -import { PlaygroundSetupForm } from '@/settings/playground/components/PlaygroundSetupForm'; +import { PlaygroundSetupForm } from '@/settings/mcp-and-apis/components/PlaygroundSetupForm'; import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; import { type Meta, type StoryObj } from '@storybook/react-vite'; import { ComponentDecorator, RouterDecorator } from 'twenty-ui/testing'; diff --git a/packages/twenty-front/src/modules/settings/playground/components/__stories__/RestPlayground.stories.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/RestPlayground.stories.tsx similarity index 92% rename from packages/twenty-front/src/modules/settings/playground/components/__stories__/RestPlayground.stories.tsx rename to packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/RestPlayground.stories.tsx index 3ede3a59dd..54664b2b39 100644 --- a/packages/twenty-front/src/modules/settings/playground/components/__stories__/RestPlayground.stories.tsx +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/RestPlayground.stories.tsx @@ -1,6 +1,6 @@ -import { RestPlayground } from '@/settings/playground/components/RestPlayground'; -import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState'; -import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; +import { RestPlayground } from '@/settings/mcp-and-apis/components/RestPlayground'; +import { playgroundApiKeyState } from '@/settings/mcp-and-apis/states/playgroundApiKeyState'; +import { PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; import { type Meta, type StoryObj } from '@storybook/react-vite'; import { HttpResponse, http } from 'msw'; diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/SettingsMcpSetup.stories.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/SettingsMcpSetup.stories.tsx new file mode 100644 index 0000000000..4ec4a0f7c4 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/components/__stories__/SettingsMcpSetup.stories.tsx @@ -0,0 +1,24 @@ +import { SettingsMcpSetup } from '@/settings/mcp-and-apis/components/SettingsMcpSetup'; +import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator'; +import { type Meta, type StoryObj } from '@storybook/react-vite'; +import { ComponentDecorator } from 'twenty-ui/testing'; + +const meta: Meta = { + title: 'Modules/Settings/Playground/SettingsMcpSetup', + component: SettingsMcpSetup, + decorators: [ComponentDecorator, SnackBarDecorator], + parameters: { + docs: { + description: { + component: + 'SettingsMcpSetup lists the MCP clients that can connect to the workspace, with quick-install and manual configuration options.', + }, + }, + }, +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/constants/McpSetup.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/constants/McpSetup.ts new file mode 100644 index 0000000000..d136be64cf --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/constants/McpSetup.ts @@ -0,0 +1,30 @@ +export const MCP_SETUP = { + chatGptTwentyAppUrl: + 'https://chatgpt.com/apps/twenty/asdk_app_6a0ac8d7e28c8191a58ea65bb0ca3d5c', + tooltipIds: { + claudeInstallDisabled: 'mcp-claude-install-disabled', + replitInstallDisabled: 'mcp-replit-install-disabled', + }, + authorizationHeader: { + key: 'Authorization', + value: 'Bearer ', + }, + server: { + name: 'twenty', + displayName: 'Twenty', + }, + clientDocsUrls: { + augment: 'https://docs.augmentcode.com/setup-augment/mcp', + amazonQ: + 'https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/qdev-mcp.html', + cline: 'https://docs.cline.bot/mcp/mcp-overview', + geminiCli: 'https://geminicli.com/docs/tools/mcp-server/', + jetbrains: 'https://www.jetbrains.com/help/ai-assistant/mcp.html', + libreChat: 'https://www.librechat.ai/docs/features/mcp', + lmStudio: 'https://lmstudio.ai/docs/app/mcp', + raycast: 'https://manual.raycast.com/ai/model-context-protocol', + warp: 'https://docs.warp.dev/agent-platform/capabilities/mcp/', + windsurf: 'https://docs.devin.ai/desktop/cascade/mcp', + zed: 'https://zed.dev/docs/ai/mcp', + }, +} as const; diff --git a/packages/twenty-front/src/modules/settings/playground/constants/SettingsPlaygroundFormSchemaSelectOptions.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/constants/SettingsPlaygroundFormSchemaSelectOptions.ts similarity index 81% rename from packages/twenty-front/src/modules/settings/playground/constants/SettingsPlaygroundFormSchemaSelectOptions.ts rename to packages/twenty-front/src/modules/settings/mcp-and-apis/constants/SettingsPlaygroundFormSchemaSelectOptions.ts index 7e2a5755ba..2e083f58c6 100644 --- a/packages/twenty-front/src/modules/settings/playground/constants/SettingsPlaygroundFormSchemaSelectOptions.ts +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/constants/SettingsPlaygroundFormSchemaSelectOptions.ts @@ -1,4 +1,4 @@ -import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; +import { PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; import { msg } from '@lingui/core/macro'; import { IconBracketsAngle, IconFolderRoot } from 'twenty-ui/icon'; export const SETTINGS_PLAYGROUND_FORM_SCHEMA_SELECT_OPTIONS = [ diff --git a/packages/twenty-front/src/modules/settings/playground/hooks/useOpenPlayground.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/hooks/useOpenPlayground.ts similarity index 89% rename from packages/twenty-front/src/modules/settings/playground/hooks/useOpenPlayground.ts rename to packages/twenty-front/src/modules/settings/mcp-and-apis/hooks/useOpenPlayground.ts index fdfa87243c..d48c3baaed 100644 --- a/packages/twenty-front/src/modules/settings/playground/hooks/useOpenPlayground.ts +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/hooks/useOpenPlayground.ts @@ -7,9 +7,9 @@ import { isDefined } from 'twenty-shared/utils'; import { isPlaygroundApiKeyFresh, playgroundApiKeyState, -} from '@/settings/playground/states/playgroundApiKeyState'; -import { type PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; -import { PlaygroundTypes } from '@/settings/playground/types/PlaygroundTypes'; +} from '@/settings/mcp-and-apis/states/playgroundApiKeyState'; +import { type PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; +import { PlaygroundTypes } from '@/settings/mcp-and-apis/types/PlaygroundTypes'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useAtomState } from '@/ui/utilities/state/jotai/hooks/useAtomState'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; diff --git a/packages/twenty-front/src/modules/settings/playground/states/openAPIReference.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/states/openAPIReference.ts similarity index 100% rename from packages/twenty-front/src/modules/settings/playground/states/openAPIReference.ts rename to packages/twenty-front/src/modules/settings/mcp-and-apis/states/openAPIReference.ts diff --git a/packages/twenty-front/src/modules/settings/playground/states/playgroundApiKeyState.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/states/playgroundApiKeyState.ts similarity index 100% rename from packages/twenty-front/src/modules/settings/playground/states/playgroundApiKeyState.ts rename to packages/twenty-front/src/modules/settings/mcp-and-apis/states/playgroundApiKeyState.ts diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/types/McpSetup.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/types/McpSetup.ts new file mode 100644 index 0000000000..60a7ade322 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/types/McpSetup.ts @@ -0,0 +1,20 @@ +import { type ReactNode } from 'react'; + +export type McpSetupCard = { + badge: string; + ctaLabel: string; + description: string; + disabledTooltip?: string; + href?: string; + isDisabled?: boolean; + logo: ReactNode; + title: string; + tooltipId?: string; +}; + +export type McpSetupCategory = { + cards: McpSetupCard[]; + description: string; + showManualConfigurationAfter?: boolean; + title: string; +}; diff --git a/packages/twenty-front/src/modules/settings/playground/types/PlaygroundSchemas.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/types/PlaygroundSchemas.ts similarity index 100% rename from packages/twenty-front/src/modules/settings/playground/types/PlaygroundSchemas.ts rename to packages/twenty-front/src/modules/settings/mcp-and-apis/types/PlaygroundSchemas.ts diff --git a/packages/twenty-front/src/modules/settings/playground/types/PlaygroundTypes.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/types/PlaygroundTypes.ts similarity index 100% rename from packages/twenty-front/src/modules/settings/playground/types/PlaygroundTypes.ts rename to packages/twenty-front/src/modules/settings/mcp-and-apis/types/PlaygroundTypes.ts diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/__tests__/mcpSetup.test.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/__tests__/mcpSetup.test.ts new file mode 100644 index 0000000000..fd176d48a8 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/__tests__/mcpSetup.test.ts @@ -0,0 +1,154 @@ +import { + buildClaudeInstallLink, + buildCursorInstallLink, + buildGooseInstallLink, + buildLmStudioInstallLink, + buildMcpConfig, + buildMcpServerUrl, + buildReplitInstallLink, + buildRemoteMcpServerConfig, + buildVsCodeInstallLink, + isHttpsUrl, +} from '@/settings/mcp-and-apis/utils/mcpSetup'; + +const mcpServerUrl = 'https://api.twenty.com/mcp'; + +const decodeBase64JsonParam = (link: string, paramName: string) => { + const params = new URLSearchParams(link.split('?')[1]); + const encodedValue = params.get(paramName); + + if (encodedValue === null) { + throw new Error(`Missing ${paramName} param`); + } + + return JSON.parse(Buffer.from(encodedValue, 'base64').toString('utf-8')); +}; + +describe('buildMcpServerUrl', () => { + it('appends /mcp after trimming trailing slashes', () => { + expect(buildMcpServerUrl('https://api.twenty.com///')).toBe(mcpServerUrl); + }); +}); + +describe('isHttpsUrl', () => { + it('returns true only for valid HTTPS urls', () => { + expect(isHttpsUrl(mcpServerUrl)).toBe(true); + expect(isHttpsUrl('http://api.twenty.com/mcp')).toBe(false); + expect(isHttpsUrl('not a url')).toBe(false); + }); +}); + +describe('buildMcpConfig', () => { + it('builds the remote MCP JSON config', () => { + expect(JSON.parse(buildMcpConfig(mcpServerUrl))).toEqual({ + mcpServers: { + twenty: { + url: mcpServerUrl, + headers: { + Authorization: 'Bearer ', + }, + }, + }, + }); + }); +}); + +describe('buildRemoteMcpServerConfig', () => { + it('builds the common remote server config', () => { + expect(buildRemoteMcpServerConfig(mcpServerUrl)).toEqual({ + url: mcpServerUrl, + headers: { + Authorization: 'Bearer ', + }, + }); + }); +}); + +describe('buildClaudeInstallLink', () => { + it('builds a Claude custom connector link', () => { + const link = buildClaudeInstallLink(mcpServerUrl); + const params = new URL(link).searchParams; + + expect(link.startsWith('https://claude.ai/customize/connectors?')).toBe( + true, + ); + expect(params.get('modal')).toBe('add-custom-connector'); + expect(params.get('connectorName')).toBe('Twenty'); + expect(params.get('connectorUrl')).toBe(mcpServerUrl); + }); +}); + +describe('buildCursorInstallLink', () => { + it('base64-encodes the remote MCP config', () => { + const link = buildCursorInstallLink(mcpServerUrl); + + expect(link.startsWith('https://cursor.com/en/install-mcp?')).toBe(true); + expect(new URLSearchParams(link.split('?')[1]).get('name')).toBe('twenty'); + expect(decodeBase64JsonParam(link, 'config')).toEqual( + buildRemoteMcpServerConfig(mcpServerUrl), + ); + }); +}); + +describe('buildVsCodeInstallLink', () => { + it('URI-encodes the VS Code MCP install payload', () => { + const payload = JSON.parse( + decodeURIComponent( + buildVsCodeInstallLink(mcpServerUrl).replace('vscode:mcp/install?', ''), + ), + ); + + expect(payload).toEqual({ + name: 'twenty', + type: 'http', + url: mcpServerUrl, + headers: { + Authorization: 'Bearer ', + }, + }); + }); +}); + +describe('buildGooseInstallLink', () => { + it('builds a Goose streamable HTTP extension link', () => { + const link = buildGooseInstallLink(mcpServerUrl); + const params = new URLSearchParams(link.split('?')[1]); + + expect(link.startsWith('goose://extension?')).toBe(true); + expect(params.get('type')).toBe('streamable_http'); + expect(params.get('id')).toBe('twenty'); + expect(params.get('name')).toBe('Twenty'); + expect(params.get('url')).toBe(mcpServerUrl); + expect(params.get('header')).toBe('Authorization=Bearer '); + }); +}); + +describe('buildReplitInstallLink', () => { + it('base64-encodes the Replit MCP payload', () => { + const link = buildReplitInstallLink(mcpServerUrl); + + expect(link.startsWith('https://replit.com/integrations?')).toBe(true); + expect(decodeBase64JsonParam(link, 'mcp')).toEqual({ + displayName: 'Twenty', + baseUrl: mcpServerUrl, + headers: [ + { + key: 'Authorization', + value: 'Bearer ', + }, + ], + }); + }); +}); + +describe('buildLmStudioInstallLink', () => { + it('base64-encodes the remote MCP config', () => { + const link = buildLmStudioInstallLink(mcpServerUrl); + + expect(link.startsWith('lmstudio://add_mcp?')).toBe(true); + expect(new URLSearchParams(link.split('?')[1]).get('name')).toBe('twenty'); + expect(decodeBase64JsonParam(link, 'config')).toEqual( + buildRemoteMcpServerConfig(mcpServerUrl), + ); + }); +}); diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/buildMcpSetupCategories.tsx b/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/buildMcpSetupCategories.tsx new file mode 100644 index 0000000000..065f5944fa --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/buildMcpSetupCategories.tsx @@ -0,0 +1,202 @@ +import { t } from '@lingui/core/macro'; + +import AmazonQLogo from '@/settings/mcp-and-apis/assets/mcp-clients/amazon-q.svg'; +import AugmentCodeLogo from '@/settings/mcp-and-apis/assets/mcp-clients/augment-code.svg'; +import ClineLogo from '@/settings/mcp-and-apis/assets/mcp-clients/cline.svg'; +import CursorLogo from '@/settings/mcp-and-apis/assets/mcp-clients/cursor.svg'; +import GeminiCliLogo from '@/settings/mcp-and-apis/assets/mcp-clients/gemini-cli.svg'; +import GooseLogo from '@/settings/mcp-and-apis/assets/mcp-clients/goose.svg'; +import JetBrainsLogo from '@/settings/mcp-and-apis/assets/mcp-clients/jetbrains.svg'; +import LibreChatLogo from '@/settings/mcp-and-apis/assets/mcp-clients/librechat.svg'; +import LmStudioLogo from '@/settings/mcp-and-apis/assets/mcp-clients/lm-studio.svg'; +import RaycastLogo from '@/settings/mcp-and-apis/assets/mcp-clients/raycast.svg'; +import ReplitLogo from '@/settings/mcp-and-apis/assets/mcp-clients/replit.svg'; +import VsCodeLogo from '@/settings/mcp-and-apis/assets/mcp-clients/vs-code.svg'; +import WarpLogo from '@/settings/mcp-and-apis/assets/mcp-clients/warp.svg'; +import WindsurfLogo from '@/settings/mcp-and-apis/assets/mcp-clients/windsurf.svg'; +import ZedLogo from '@/settings/mcp-and-apis/assets/mcp-clients/zed.svg'; +import { + McpClaudeLogo, + McpClientLogo, + McpOpenAiLogo, +} from '@/settings/mcp-and-apis/components/McpClientLogo'; +import { MCP_SETUP } from '@/settings/mcp-and-apis/constants/McpSetup'; +import { type McpSetupCategory } from '@/settings/mcp-and-apis/types/McpSetup'; +import { + buildClaudeInstallLink, + buildCursorInstallLink, + buildGooseInstallLink, + buildLmStudioInstallLink, + buildReplitInstallLink, + buildVsCodeInstallLink, +} from '@/settings/mcp-and-apis/utils/mcpSetup'; + +type BuildMcpSetupCategoriesParams = { + isHttpsInstallLinkEnabled: boolean; + mcpServerUrl: string; +}; + +export const buildMcpSetupCategories = ({ + isHttpsInstallLinkEnabled, + mcpServerUrl, +}: BuildMcpSetupCategoriesParams): McpSetupCategory[] => [ + { + title: t`Quick install`, + description: t`Open a maintained integration or prefill clients that accept MCP install links.`, + showManualConfigurationAfter: true, + cards: [ + { + title: t`ChatGPT`, + badge: t`Official app`, + description: t`Open Twenty's official ChatGPT integration for your workspace.`, + ctaLabel: t`Open`, + href: MCP_SETUP.chatGptTwentyAppUrl, + logo: , + }, + { + title: t`Claude`, + badge: t`Preset link`, + description: t`Open Claude with the Twenty connector name and MCP URL prefilled.`, + ctaLabel: t`Install`, + disabledTooltip: t`Claude install links require an HTTPS MCP URL.`, + href: isHttpsInstallLinkEnabled + ? buildClaudeInstallLink(mcpServerUrl) + : undefined, + isDisabled: !isHttpsInstallLinkEnabled, + logo: , + tooltipId: MCP_SETUP.tooltipIds.claudeInstallDisabled, + }, + { + title: t`Cursor`, + badge: t`Install link`, + description: t`Open Cursor's MCP installer with the Twenty remote server config.`, + ctaLabel: t`Install`, + href: buildCursorInstallLink(mcpServerUrl), + logo: , + }, + { + title: t`VS Code`, + badge: t`Install link`, + description: t`Install the remote MCP server into a VS Code profile.`, + ctaLabel: t`Install`, + href: buildVsCodeInstallLink(mcpServerUrl), + logo: , + }, + { + title: t`Goose`, + badge: t`Install link`, + description: t`Add Twenty as a Streamable HTTP extension in Goose.`, + ctaLabel: t`Install`, + href: buildGooseInstallLink(mcpServerUrl), + logo: , + }, + { + title: t`Replit Agent`, + badge: t`Install link`, + description: t`Open Replit with the Twenty remote server config.`, + ctaLabel: t`Install`, + disabledTooltip: t`Replit install links require an HTTPS MCP URL.`, + href: isHttpsInstallLinkEnabled + ? buildReplitInstallLink(mcpServerUrl) + : undefined, + isDisabled: !isHttpsInstallLinkEnabled, + logo: , + tooltipId: MCP_SETUP.tooltipIds.replitInstallDisabled, + }, + { + title: t`LM Studio`, + badge: t`Install link`, + description: t`Add the Twenty remote server with LM Studio's install link.`, + ctaLabel: t`Install`, + href: buildLmStudioInstallLink(mcpServerUrl), + logo: , + }, + ], + }, + { + title: t`Other manual clients`, + description: t`Follow client docs to connect your MCP manually.`, + cards: [ + { + title: t`Cline`, + badge: t`Manual`, + description: t`Configure the Twenty MCP server manually in Cline.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.cline, + logo: , + }, + { + title: t`Zed`, + badge: t`Manual`, + description: t`Add the Twenty MCP server as a remote context server in Zed.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.zed, + logo: , + }, + { + title: t`Windsurf / Cascade`, + badge: t`Manual`, + description: t`Configure the Twenty MCP server manually in Cascade.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.windsurf, + logo: , + }, + { + title: t`Raycast`, + badge: t`Settings`, + description: t`Add the Twenty MCP server from Raycast's MCP commands or settings.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.raycast, + logo: , + }, + { + title: t`Warp`, + badge: t`Settings`, + description: t`Configure the remote MCP server through Warp's agent settings.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.warp, + logo: , + }, + { + title: t`JetBrains AI / Junie`, + badge: t`Settings`, + description: t`Import or add the MCP configuration from JetBrains settings.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.jetbrains, + logo: , + }, + { + title: t`Gemini CLI`, + badge: t`CLI config`, + description: t`Add the Twenty MCP server in Gemini CLI settings.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.geminiCli, + logo: , + }, + { + title: t`Amazon Q Developer CLI`, + badge: t`CLI config`, + description: t`Configure the remote server in Amazon Q Developer's MCP settings.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.amazonQ, + logo: , + }, + { + title: t`LibreChat`, + badge: t`YAML config`, + description: t`Add the Twenty MCP server to your LibreChat configuration file.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.libreChat, + logo: , + }, + { + title: t`Augment Code`, + badge: t`Settings`, + description: t`Add the Twenty MCP server from Augment Code settings.`, + ctaLabel: t`Docs`, + href: MCP_SETUP.clientDocsUrls.augment, + logo: , + }, + ], + }, +]; diff --git a/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/mcpSetup.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/mcpSetup.ts new file mode 100644 index 0000000000..deb05d56d6 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/mcpSetup.ts @@ -0,0 +1,113 @@ +import { MCP_SETUP } from '@/settings/mcp-and-apis/constants/McpSetup'; + +export const buildMcpServerUrl = (serverBaseUrl: string) => + `${serverBaseUrl.replace(/\/+$/, '')}/mcp`; + +export const isHttpsUrl = (url: string) => { + try { + return new URL(url).protocol === 'https:'; + } catch { + return false; + } +}; + +export const buildMcpAuthorizationHeaders = () => ({ + [MCP_SETUP.authorizationHeader.key]: MCP_SETUP.authorizationHeader.value, +}); + +export const buildRemoteMcpServerConfig = (mcpServerUrl: string) => ({ + url: mcpServerUrl, + headers: buildMcpAuthorizationHeaders(), +}); + +export const buildMcpConfig = (mcpServerUrl: string) => + JSON.stringify( + { + mcpServers: { + [MCP_SETUP.server.name]: buildRemoteMcpServerConfig(mcpServerUrl), + }, + }, + null, + 2, + ); + +export const buildClaudeInstallLink = (mcpServerUrl: string) => { + const params = new URLSearchParams({ + modal: 'add-custom-connector', + connectorName: MCP_SETUP.server.displayName, + connectorUrl: mcpServerUrl, + }); + + return `https://claude.ai/customize/connectors?${params.toString()}`; +}; + +export const buildCursorInstallLink = (mcpServerUrl: string) => { + const config = btoa(JSON.stringify(buildRemoteMcpServerConfig(mcpServerUrl))); + + const params = new URLSearchParams({ + name: MCP_SETUP.server.name, + config, + }); + + return `https://cursor.com/en/install-mcp?${params.toString()}`; +}; + +export const buildVsCodeInstallLink = (mcpServerUrl: string) => + `vscode:mcp/install?${encodeURIComponent( + JSON.stringify({ + name: MCP_SETUP.server.name, + type: 'http', + url: mcpServerUrl, + headers: buildMcpAuthorizationHeaders(), + }), + )}`; + +export const buildGooseInstallLink = (mcpServerUrl: string) => { + const params = new URLSearchParams({ + url: mcpServerUrl, + type: 'streamable_http', + timeout: '300', + id: MCP_SETUP.server.name, + name: MCP_SETUP.server.displayName, + description: 'Access your Twenty workspace through MCP', + }); + + params.append( + 'header', + `${MCP_SETUP.authorizationHeader.key}=${MCP_SETUP.authorizationHeader.value}`, + ); + + return `goose://extension?${params.toString()}`; +}; + +export const buildReplitInstallLink = (mcpServerUrl: string) => { + const payload = btoa( + JSON.stringify({ + displayName: MCP_SETUP.server.displayName, + baseUrl: mcpServerUrl, + headers: [ + { + key: MCP_SETUP.authorizationHeader.key, + value: MCP_SETUP.authorizationHeader.value, + }, + ], + }), + ); + + const params = new URLSearchParams({ + mcp: payload, + }); + + return `https://replit.com/integrations?${params.toString()}`; +}; + +export const buildLmStudioInstallLink = (mcpServerUrl: string) => { + const config = btoa(JSON.stringify(buildRemoteMcpServerConfig(mcpServerUrl))); + + const params = new URLSearchParams({ + name: MCP_SETUP.server.name, + config, + }); + + return `lmstudio://add_mcp?${params.toString()}`; +}; diff --git a/packages/twenty-front/src/modules/settings/playground/utils/setupGraphiqlMonacoWorkers.ts b/packages/twenty-front/src/modules/settings/mcp-and-apis/utils/setupGraphiqlMonacoWorkers.ts similarity index 100% rename from packages/twenty-front/src/modules/settings/playground/utils/setupGraphiqlMonacoWorkers.ts rename to packages/twenty-front/src/modules/settings/mcp-and-apis/utils/setupGraphiqlMonacoWorkers.ts diff --git a/packages/twenty-front/src/modules/settings/playground/components/SettingsMcpSetup.tsx b/packages/twenty-front/src/modules/settings/playground/components/SettingsMcpSetup.tsx deleted file mode 100644 index 35a62d37c0..0000000000 --- a/packages/twenty-front/src/modules/settings/playground/components/SettingsMcpSetup.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { styled } from '@linaria/react'; -import { useLingui } from '@lingui/react/macro'; -import { LightCopyIconButton } from '@/object-record/record-field/ui/components/LightCopyIconButton'; -import ModelContextProtocolLogo from '@/settings/playground/assets/model-context-protocol-logo.svg?react'; -import { H2Title } from 'twenty-ui/typography'; -import { CodeEditor, CoreEditorHeader } from 'twenty-ui/input'; -import { Section } from 'twenty-ui/layout'; -import { themeCssVariables } from 'twenty-ui/theme-constants'; -import { REACT_APP_SERVER_BASE_URL } from '~/config'; - -const StyledMcpEditorHeaderTitle = styled.div` - align-items: center; - display: flex; - gap: ${themeCssVariables.spacing[2]}; -`; - -const StyledMcpIcon = styled(ModelContextProtocolLogo)` - color: inherit; - flex-shrink: 0; - height: calc(${themeCssVariables.icon.size.md} * 1px); - width: calc(${themeCssVariables.icon.size.md} * 1px); -`; - -const buildMcpConfig = (serverUrl: string) => - `{ - "mcpServers": { - "twenty": { - "url": "${serverUrl}/mcp", - "headers": { - "Authorization": "Bearer " - } - } - } -}`; - -export const SettingsMcpSetup = () => { - const { t } = useLingui(); - const mcpConfig = buildMcpConfig(REACT_APP_SERVER_BASE_URL); - - return ( -
- - - - {t`MCP client configuration`} - , - ]} - rightNodes={[]} - /> - -
- ); -}; diff --git a/packages/twenty-front/src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts b/packages/twenty-front/src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts index ddd26339c5..ce14cea0c3 100644 --- a/packages/twenty-front/src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts +++ b/packages/twenty-front/src/modules/settings/roles/role-permissions/permission-flags/hooks/useSettingsRolePermissionFlagConfig.ts @@ -3,12 +3,12 @@ import { t } from '@lingui/core/macro'; import { useMemo } from 'react'; import { IconApps, - IconCode, IconCreditCard, IconHierarchy, IconKey, IconLayoutSidebarRightCollapse, IconLockOpen, + IconPlug, IconSettings, IconSettingsAutomation, IconShield, @@ -41,9 +41,9 @@ export const useSettingsRolePermissionFlagConfig = ({ const allPermissions: SettingsRolePermissionsSettingPermission[] = [ { key: PermissionFlagType.API_KEYS_AND_WEBHOOKS, - name: t`API Keys & Webhooks`, - description: t`Manage API keys and webhooks`, - Icon: IconCode, + name: t`MCP & APIs`, + description: t`Manage MCP, API keys, and webhooks`, + Icon: IconPlug, isRelevantForAgents: true, isRelevantForApiKeys: true, isRelevantForUsers: true, diff --git a/packages/twenty-front/src/pages/settings/ai/components/SettingsAiOverviewTab.tsx b/packages/twenty-front/src/pages/settings/ai/components/SettingsAiOverviewTab.tsx index f9c828dd6c..f7a1cf8912 100644 --- a/packages/twenty-front/src/pages/settings/ai/components/SettingsAiOverviewTab.tsx +++ b/packages/twenty-front/src/pages/settings/ai/components/SettingsAiOverviewTab.tsx @@ -9,7 +9,12 @@ import { useMutation, useQuery } from '@apollo/client/react'; import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; import { Fragment, useContext, useState } from 'react'; -import { IconMessage, IconRobot, IconSparkles, IconTool } from 'twenty-ui/icon'; +import { + IconMessage, + IconSparkle2, + IconSparkles, + IconTool, +} from 'twenty-ui/icon'; import { H2Title } from 'twenty-ui/typography'; import { Section } from 'twenty-ui/layout'; import { UndecoratedLink } from 'twenty-ui/navigation'; @@ -116,7 +121,7 @@ export const SettingsAiOverviewTab = () => { /> } + Icon={} title={t`Set up MCP`} /> diff --git a/packages/twenty-front/src/pages/settings/api-webhooks/SettingsApiWebhooks.tsx b/packages/twenty-front/src/pages/settings/api-webhooks/SettingsApiWebhooks.tsx index 8db5e44fb0..510fc78a5c 100644 --- a/packages/twenty-front/src/pages/settings/api-webhooks/SettingsApiWebhooks.tsx +++ b/packages/twenty-front/src/pages/settings/api-webhooks/SettingsApiWebhooks.tsx @@ -2,11 +2,13 @@ import { SettingsDiscoveryHeroCard } from '@/settings/components/SettingsDiscove import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { SettingsApiKeysTable } from '@/settings/developers/components/SettingsApiKeysTable'; import { SettingsWebhooksTable } from '@/settings/developers/components/SettingsWebhooksTable'; -import { PlaygroundSetupForm } from '@/settings/playground/components/PlaygroundSetupForm'; -import { SettingsMcpSetup } from '@/settings/playground/components/SettingsMcpSetup'; +import { PlaygroundSetupForm } from '@/settings/mcp-and-apis/components/PlaygroundSetupForm'; +import { SettingsMcpSetup } from '@/settings/mcp-and-apis/components/SettingsMcpSetup'; +import McpCoverDark from '@/settings/mcp-and-apis/assets/mcp-cover-dark.png'; +import McpCoverLight from '@/settings/mcp-and-apis/assets/mcp-cover-light.png'; import { SettingsPageLayout } from '@/settings/components/layout/SettingsPageLayout'; -import PlaygroundCoverDark from '@/settings/playground/assets/cover-dark.png'; -import PlaygroundCoverLight from '@/settings/playground/assets/cover-light.png'; +import PlaygroundCoverDark from '@/settings/mcp-and-apis/assets/cover-dark.png'; +import PlaygroundCoverLight from '@/settings/mcp-and-apis/assets/cover-light.png'; import { SettingsTabBar } from '@/settings/components/layout/SettingsTabBar'; import { useSettingsActiveTabId } from '@/settings/components/layout/useSettingsActiveTabId'; import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile'; @@ -16,9 +18,9 @@ import { SettingsPath } from 'twenty-shared/types'; import { getSettingsPath } from 'twenty-shared/utils'; import { IconBrandGraphql, - IconCode, IconPlus, - IconRobot, + IconPlug, + IconSparkle2, IconWebhook, } from 'twenty-ui/icon'; import { H2Title } from 'twenty-ui/typography'; @@ -60,15 +62,15 @@ export const SettingsApiWebhooks = () => { const { t } = useLingui(); const tabs = [ - { - id: SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, - title: t`API`, - Icon: IconCode, - }, { id: SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.MCP, title: t`MCP`, - Icon: IconRobot, + Icon: IconSparkle2, + }, + { + id: SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + title: t`API`, + Icon: IconPlug, }, { id: SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.WEBHOOKS, @@ -81,11 +83,13 @@ export const SettingsApiWebhooks = () => { (useSettingsActiveTabId( SETTINGS_API_WEBHOOKS_TABS.COMPONENT_INSTANCE_ID, tabs.map((tab) => tab.id), - ) as TabKey) ?? SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API; + ) as TabKey) ?? SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.MCP; + + const isMcpTab = activeTab === SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.MCP; return ( { children: t`Workspace`, href: getSettingsPath(SettingsPath.General), }, - { children: t`APIs & Webhooks` }, + { children: t`MCP & APIs` }, ]} >
diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsGraphQLPlayground.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsGraphQLPlayground.stories.tsx index be026dfde4..b7c81b8470 100644 --- a/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsGraphQLPlayground.stories.tsx +++ b/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsGraphQLPlayground.stories.tsx @@ -1,4 +1,4 @@ -import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState'; +import { playgroundApiKeyState } from '@/settings/mcp-and-apis/states/playgroundApiKeyState'; import { jotaiStore } from '@/ui/utilities/state/jotai/jotaiStore'; import { type Meta, type StoryObj } from '@storybook/react-vite'; import { action } from 'storybook/actions'; diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsRestPlayground.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsRestPlayground.stories.tsx index 137474c094..8341a14a11 100644 --- a/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsRestPlayground.stories.tsx +++ b/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsRestPlayground.stories.tsx @@ -1,4 +1,4 @@ -import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState'; +import { playgroundApiKeyState } from '@/settings/mcp-and-apis/states/playgroundApiKeyState'; import { jotaiStore } from '@/ui/utilities/state/jotai/jotaiStore'; import { type Meta, type StoryObj } from '@storybook/react-vite'; import { action } from 'storybook/actions'; diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx index 83103b6006..778c0f5f8f 100644 --- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx +++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx @@ -36,6 +36,7 @@ import { RevokeApiKeyDocument, } from '~/generated-metadata/graphql'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { SETTINGS_API_WEBHOOKS_TABS } from '~/pages/settings/api-webhooks/constants/SettingsApiWebhooksTabs'; const StyledInfo = styled.span` color: ${themeCssVariables.font.color.light}; @@ -145,7 +146,13 @@ export const SettingsDevelopersApiKeyDetail = () => { }, }); if (redirect) { - navigate(SettingsPath.ApiWebhooks); + navigate( + SettingsPath.ApiWebhooks, + undefined, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ); } } catch { enqueueErrorSnackBar({ message: t`Error deleting api key.` }); @@ -249,8 +256,13 @@ export const SettingsDevelopersApiKeyDetail = () => { href: getSettingsPath(SettingsPath.General), }, { - children: t`APIs & Webhooks`, - href: getSettingsPath(SettingsPath.ApiWebhooks), + children: t`MCP & APIs`, + href: getSettingsPath( + SettingsPath.ApiWebhooks, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ), }, { children: apiKey.name || t`Unnamed API Key` }, ]} diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx index ed074f6aef..9496890b14 100644 --- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx +++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx @@ -25,6 +25,7 @@ import { GetRolesDocument, } from '~/generated-metadata/graphql'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { SETTINGS_API_WEBHOOKS_TABS } from '~/pages/settings/api-webhooks/constants/SettingsApiWebhooksTabs'; export const SettingsDevelopersApiKeysNew = () => { const { t } = useLingui(); @@ -136,8 +137,13 @@ export const SettingsDevelopersApiKeysNew = () => { href: getSettingsPath(SettingsPath.General), }, { - children: t`APIs & Webhooks`, - href: getSettingsPath(SettingsPath.ApiWebhooks), + children: t`MCP & APIs`, + href: getSettingsPath( + SettingsPath.ApiWebhooks, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ), }, { children: t`New Key` }, ]} @@ -145,7 +151,13 @@ export const SettingsDevelopersApiKeysNew = () => { { - navigateSettings(SettingsPath.ApiWebhooks); + navigateSettings( + SettingsPath.ApiWebhooks, + undefined, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ); }} onSave={handleSave} /> diff --git a/packages/twenty-front/src/pages/settings/developers/playground/SettingsGraphQLPlayground.tsx b/packages/twenty-front/src/pages/settings/developers/playground/SettingsGraphQLPlayground.tsx index d8e05d060c..dc1e047409 100644 --- a/packages/twenty-front/src/pages/settings/developers/playground/SettingsGraphQLPlayground.tsx +++ b/packages/twenty-front/src/pages/settings/developers/playground/SettingsGraphQLPlayground.tsx @@ -1,5 +1,5 @@ -import { GraphQLPlayground } from '@/settings/playground/components/GraphQLPlayground'; -import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; +import { GraphQLPlayground } from '@/settings/mcp-and-apis/components/GraphQLPlayground'; +import { PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; import { SettingsPath } from 'twenty-shared/types'; import { FullScreenContainer } from '@/ui/layout/fullscreen/components/FullScreenContainer'; @@ -7,6 +7,7 @@ import { Trans } from '@lingui/react/macro'; import { useParams } from 'react-router-dom'; import { getSettingsPath } from 'twenty-shared/utils'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { SETTINGS_API_WEBHOOKS_TABS } from '~/pages/settings/api-webhooks/constants/SettingsApiWebhooksTabs'; export const SettingsGraphQLPlayground = () => { const navigateSettings = useNavigateSettings(); @@ -19,7 +20,13 @@ export const SettingsGraphQLPlayground = () => { : PlaygroundSchemas.CORE; const handleExitFullScreen = () => { - navigateSettings(SettingsPath.ApiWebhooks); + navigateSettings( + SettingsPath.ApiWebhooks, + undefined, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ); }; const handleOnError = () => { @@ -35,8 +42,13 @@ export const SettingsGraphQLPlayground = () => { href: getSettingsPath(SettingsPath.General), }, { - children: APIs & Webhooks, - href: getSettingsPath(SettingsPath.ApiWebhooks), + children: MCP & APIs, + href: getSettingsPath( + SettingsPath.ApiWebhooks, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ), }, { children: GraphQL API Playground }, ]} diff --git a/packages/twenty-front/src/pages/settings/developers/playground/SettingsRestPlayground.tsx b/packages/twenty-front/src/pages/settings/developers/playground/SettingsRestPlayground.tsx index f52c7695b0..81a9cca57b 100644 --- a/packages/twenty-front/src/pages/settings/developers/playground/SettingsRestPlayground.tsx +++ b/packages/twenty-front/src/pages/settings/developers/playground/SettingsRestPlayground.tsx @@ -1,5 +1,5 @@ -import { RestPlayground } from '@/settings/playground/components/RestPlayground'; -import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas'; +import { RestPlayground } from '@/settings/mcp-and-apis/components/RestPlayground'; +import { PlaygroundSchemas } from '@/settings/mcp-and-apis/types/PlaygroundSchemas'; import { FullScreenContainer } from '@/ui/layout/fullscreen/components/FullScreenContainer'; import { Trans } from '@lingui/react/macro'; import { useCallback } from 'react'; @@ -7,6 +7,7 @@ import { useParams } from 'react-router-dom'; import { SettingsPath } from 'twenty-shared/types'; import { getSettingsPath } from 'twenty-shared/utils'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; +import { SETTINGS_API_WEBHOOKS_TABS } from '~/pages/settings/api-webhooks/constants/SettingsApiWebhooksTabs'; export const SettingsRestPlayground = () => { const navigateSettings = useNavigateSettings(); @@ -15,11 +16,23 @@ export const SettingsRestPlayground = () => { }>(); const handleExitFullScreen = () => { - navigateSettings(SettingsPath.ApiWebhooks); + navigateSettings( + SettingsPath.ApiWebhooks, + undefined, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ); }; const handleError = useCallback(() => { - navigateSettings(SettingsPath.ApiWebhooks); + navigateSettings( + SettingsPath.ApiWebhooks, + undefined, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ); }, [navigateSettings]); return ( @@ -31,8 +44,13 @@ export const SettingsRestPlayground = () => { href: getSettingsPath(SettingsPath.General), }, { - children: APIs & Webhooks, - href: getSettingsPath(SettingsPath.ApiWebhooks), + children: MCP & APIs, + href: getSettingsPath( + SettingsPath.ApiWebhooks, + undefined, + undefined, + SETTINGS_API_WEBHOOKS_TABS.TABS_IDS.API, + ), }, { children: REST }, ]} diff --git a/packages/twenty-front/src/utils/title-utils.ts b/packages/twenty-front/src/utils/title-utils.ts index 14e614f1d4..7f014ed868 100644 --- a/packages/twenty-front/src/utils/title-utils.ts +++ b/packages/twenty-front/src/utils/title-utils.ts @@ -50,7 +50,7 @@ export const getPageTitleFromPath = (pathname: string): string => { case SettingsPathPrefixes.Objects: return t`Data model - Settings`; case SettingsPathPrefixes.ApiWebhooks: - return t`API Keys - Settings`; + return t`MCP & APIs - Settings`; case SettingsPathPrefixes.LogicFunctions: return t`Functions - Settings`; case SettingsPathPrefixes.Integration: diff --git a/packages/twenty-server/src/engine/metadata-modules/permission-flag/constants/standard-permission-flag-definitions.constant.ts b/packages/twenty-server/src/engine/metadata-modules/permission-flag/constants/standard-permission-flag-definitions.constant.ts index 8fb2aff1d0..94e62a00a0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/permission-flag/constants/standard-permission-flag-definitions.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/permission-flag/constants/standard-permission-flag-definitions.constant.ts @@ -25,9 +25,9 @@ const STANDARD_PERMISSION_FLAG_METADATA: Record< StandardPermissionFlagMetadata > = { [PermissionFlagType.API_KEYS_AND_WEBHOOKS]: { - label: 'API Keys & Webhooks', - description: 'Manage API keys and webhooks', - icon: 'IconCode', + label: 'MCP & APIs', + description: 'Manage MCP, API keys, and webhooks', + icon: 'IconPlug', }, [PermissionFlagType.WORKSPACE]: { label: 'Workspace', diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-command-menu-item.constant.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-command-menu-item.constant.ts index 5194ef4038..dbe8886c8b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-command-menu-item.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/constants/standard-command-menu-item.constant.ts @@ -906,11 +906,11 @@ export const STANDARD_COMMAND_MENU_ITEMS = { }, goToSettingsApiWebhooks: { universalIdentifier: 'ed2c2fde-1e7a-4a42-ba63-221eaa7c9759', - label: 'Go to APIs & Webhooks Settings', - icon: 'IconApi', + label: 'Go to MCP & APIs Settings', + icon: 'IconPlug', isPinned: false, position: 58, - shortLabel: 'APIs & Webhooks', + shortLabel: 'MCP & APIs', availabilityType: CommandMenuItemAvailabilityType.GLOBAL, conditionalAvailabilityExpression: 'permissionFlags.API_KEYS_AND_WEBHOOKS', availabilityObjectMetadataUniversalIdentifier: null, @@ -922,7 +922,7 @@ export const STANDARD_COMMAND_MENU_ITEMS = { goToSettingsApplications: { universalIdentifier: '44db6d7a-79ac-485e-b3da-da8776bd7777', label: 'Go to Apps Settings', - icon: 'IconPlug', + icon: 'IconApps', isPinned: false, position: 59, shortLabel: 'Apps', diff --git a/packages/twenty-shared/src/types/SettingsPath.ts b/packages/twenty-shared/src/types/SettingsPath.ts index f88e4e4ab4..048a5edf5c 100644 --- a/packages/twenty-shared/src/types/SettingsPath.ts +++ b/packages/twenty-shared/src/types/SettingsPath.ts @@ -58,13 +58,13 @@ export enum SettingsPath { LogicFunctions = 'functions', NewLogicFunction = 'functions/new', LogicFunctionDetail = 'functions/:logicFunctionId', - ApiWebhooks = 'api-webhooks', + ApiWebhooks = 'mcp-apis', RestPlayground = 'playground/rest/:schema', GraphQLPlayground = 'playground/graphql/:schema', - NewApiKey = 'api-webhooks/apis/new', - ApiKeyDetail = 'api-webhooks/apis/:apiKeyId', - NewWebhook = 'api-webhooks/webhooks/new', - WebhookDetail = 'api-webhooks/webhooks/:webhookId', + NewApiKey = 'mcp-apis/apis/new', + ApiKeyDetail = 'mcp-apis/apis/:apiKeyId', + NewWebhook = 'mcp-apis/webhooks/new', + WebhookDetail = 'mcp-apis/webhooks/:webhookId', Integrations = 'integrations', Security = 'general#security', Logs = 'general#logs', diff --git a/packages/twenty-ui/src/icon/components/IconSparkle2.tsx b/packages/twenty-ui/src/icon/components/IconSparkle2.tsx new file mode 100644 index 0000000000..ce20f0f98c --- /dev/null +++ b/packages/twenty-ui/src/icon/components/IconSparkle2.tsx @@ -0,0 +1,32 @@ +import { type IconComponentProps } from '@ui/icon/types/IconComponent'; + +type IconSparkle2Props = Pick< + IconComponentProps, + 'aria-hidden' | 'className' | 'color' | 'size' | 'stroke' +>; + +export const IconSparkle2 = ({ + className, + color = 'currentColor', + size = 24, + stroke = 2, + 'aria-hidden': ariaHidden, +}: IconSparkle2Props) => ( + + + +); diff --git a/packages/twenty-ui/src/icon/index.ts b/packages/twenty-ui/src/icon/index.ts index 1aaef6f3e4..fe71a601ad 100644 --- a/packages/twenty-ui/src/icon/index.ts +++ b/packages/twenty-ui/src/icon/index.ts @@ -26,6 +26,7 @@ export { IconMicrosoftOutlook } from './components/IconMicrosoftOutlook'; export { IconModelClaude } from './components/IconModelClaude'; export { IconProviderOpenai } from './components/IconProviderOpenai'; export { IconRelationManyToOne } from './components/IconRelationManyToOne'; +export { IconSparkle2 } from './components/IconSparkle2'; export { IconTrashXOff } from './components/IconTrashXOff'; export { IconTwentyStar } from './components/IconTwentyStar'; export { IconTwentyStarFilled } from './components/IconTwentyStarFilled';