@openhands/extensions 0.0.1-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/MIGRATION.md +62 -0
  3. package/README.md +160 -0
  4. package/automations/README.md +15 -0
  5. package/automations/catalog/github-pr-reviewer.json +13 -0
  6. package/automations/catalog/github-repo-monitor.json +11 -0
  7. package/automations/catalog/incident-retrospective-drafter.json +15 -0
  8. package/automations/catalog/linear-triage-assistant.json +13 -0
  9. package/automations/catalog/research-brief-writer.json +14 -0
  10. package/automations/catalog/slack-channel-monitor.json +11 -0
  11. package/automations/catalog/slack-standup-digest.json +13 -0
  12. package/automations/index.d.ts +14 -0
  13. package/automations/index.js +18 -0
  14. package/index.d.ts +17 -0
  15. package/index.js +2 -0
  16. package/integrations/README.md +39 -0
  17. package/integrations/catalog/airtable.json +44 -0
  18. package/integrations/catalog/apify.json +43 -0
  19. package/integrations/catalog/atlassian.json +31 -0
  20. package/integrations/catalog/brave-search.json +43 -0
  21. package/integrations/catalog/browser-mcp.json +34 -0
  22. package/integrations/catalog/clickhouse.json +56 -0
  23. package/integrations/catalog/cloudflare-bindings.json +32 -0
  24. package/integrations/catalog/cloudflare-browser-rendering.json +30 -0
  25. package/integrations/catalog/cloudflare-builds.json +31 -0
  26. package/integrations/catalog/cloudflare-docs.json +30 -0
  27. package/integrations/catalog/cloudflare-observability.json +31 -0
  28. package/integrations/catalog/deepwiki.json +32 -0
  29. package/integrations/catalog/elevenlabs.json +42 -0
  30. package/integrations/catalog/everything.json +32 -0
  31. package/integrations/catalog/exa.json +43 -0
  32. package/integrations/catalog/fetch.json +32 -0
  33. package/integrations/catalog/figma.json +44 -0
  34. package/integrations/catalog/filesystem.json +44 -0
  35. package/integrations/catalog/firecrawl.json +43 -0
  36. package/integrations/catalog/git.json +45 -0
  37. package/integrations/catalog/github.json +51 -0
  38. package/integrations/catalog/huggingface.json +32 -0
  39. package/integrations/catalog/kagi.json +42 -0
  40. package/integrations/catalog/linear.json +32 -0
  41. package/integrations/catalog/memory.json +33 -0
  42. package/integrations/catalog/mongodb.json +43 -0
  43. package/integrations/catalog/neon.json +44 -0
  44. package/integrations/catalog/notion.json +46 -0
  45. package/integrations/catalog/obsidian.json +43 -0
  46. package/integrations/catalog/paypal.json +29 -0
  47. package/integrations/catalog/playwright.json +34 -0
  48. package/integrations/catalog/redis.json +46 -0
  49. package/integrations/catalog/resend.json +49 -0
  50. package/integrations/catalog/sentry.json +30 -0
  51. package/integrations/catalog/sequential-thinking.json +32 -0
  52. package/integrations/catalog/slack.json +52 -0
  53. package/integrations/catalog/stripe.json +30 -0
  54. package/integrations/catalog/supabase.json +43 -0
  55. package/integrations/catalog/tavily.json +46 -0
  56. package/integrations/catalog/time.json +31 -0
  57. package/integrations/index.d.ts +167 -0
  58. package/integrations/index.js +212 -0
  59. package/integrations/logos.d.ts +5 -0
  60. package/integrations/logos.js +94 -0
  61. package/integrations/oauth-provider-catalog.js +553 -0
  62. package/integrations/oauth-provider-registration-defaults.js +610 -0
  63. package/package.json +56 -0
@@ -0,0 +1,46 @@
1
+ {
2
+ "id": "tavily",
3
+ "name": "Tavily",
4
+ "description": "Production-grade web search optimized for LLM agents. Free tier available.",
5
+ "docsUrl": "https://github.com/tavily-ai/tavily-mcp",
6
+ "iconBg": "#2563EB",
7
+ "keywords": [
8
+ "search",
9
+ "web",
10
+ "browsing",
11
+ "research"
12
+ ],
13
+ "popularityRank": 90,
14
+ "installHint": "Paste your Tavily API key - the official tavily-mcp package runs via npx.",
15
+ "kind": "mcp",
16
+ "defaultConnectionOptionId": "api",
17
+ "connectionOptions": [
18
+ {
19
+ "id": "api",
20
+ "provider": "mcp",
21
+ "transport": {
22
+ "kind": "stdio",
23
+ "serverName": "tavily",
24
+ "command": "npx",
25
+ "args": [
26
+ "-y",
27
+ "tavily-mcp"
28
+ ],
29
+ "envFields": [
30
+ {
31
+ "key": "TAVILY_API_KEY",
32
+ "label": "Tavily API key",
33
+ "type": "password",
34
+ "placeholder": "tvly-...",
35
+ "required": true,
36
+ "helperText": "API key from your Tavily dashboard.",
37
+ "helperLink": "https://app.tavily.com/home?tab=keys"
38
+ }
39
+ ]
40
+ },
41
+ "auth": {
42
+ "strategy": "api_key"
43
+ }
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "id": "time",
3
+ "name": "Time",
4
+ "description": "Timezone-aware current time, conversions, and timestamp formatting.",
5
+ "docsUrl": "https://github.com/modelcontextprotocol/servers/tree/main/src/time",
6
+ "iconBg": "var(--oh-surface)",
7
+ "keywords": [
8
+ "clock",
9
+ "timezone",
10
+ "date"
11
+ ],
12
+ "kind": "mcp",
13
+ "defaultConnectionOptionId": "none",
14
+ "connectionOptions": [
15
+ {
16
+ "id": "none",
17
+ "provider": "mcp",
18
+ "transport": {
19
+ "kind": "stdio",
20
+ "serverName": "time",
21
+ "command": "uvx",
22
+ "args": [
23
+ "mcp-server-time"
24
+ ]
25
+ },
26
+ "auth": {
27
+ "strategy": "none"
28
+ }
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,167 @@
1
+ export type MarketplaceFieldType = "text" | "password";
2
+
3
+ export interface MarketplaceField {
4
+ key: string;
5
+ label: string;
6
+ type?: MarketplaceFieldType;
7
+ placeholder?: string;
8
+ helperText?: string;
9
+ helperLink?: string;
10
+ required?: boolean;
11
+ }
12
+
13
+ export type IntegrationTransport =
14
+ | {
15
+ kind: "shttp";
16
+ url: string;
17
+ apiKeyOptional?: boolean;
18
+ }
19
+ | {
20
+ kind: "sse";
21
+ url: string;
22
+ apiKeyOptional?: boolean;
23
+ }
24
+ | {
25
+ kind: "stdio";
26
+ serverName: string;
27
+ command: string;
28
+ args: string[];
29
+ envFields?: MarketplaceField[];
30
+ argFields?: MarketplaceField[];
31
+ };
32
+
33
+ export type IntegrationAuthStrategy =
34
+ | "none"
35
+ | "api_key"
36
+ | "bearer"
37
+ | "basic"
38
+ | "oauth2";
39
+
40
+ export type IntegrationProvider = "mcp" | "http";
41
+
42
+ export interface IntegrationOAuthConfig {
43
+ authorizationUrl?: string;
44
+ tokenUrl?: string;
45
+ scopes?: string[];
46
+ optionalScopes?: string[];
47
+ toolScopes?: string[];
48
+ scopeSeparator?: "space" | "comma";
49
+ pkce?: boolean;
50
+ clientAuthentication?: "basic" | "body" | "none";
51
+ registrationUrl?: string;
52
+ additionalAuthorizationParams?: Record<string, string>;
53
+ additionalTokenParams?: Record<string, string>;
54
+ }
55
+
56
+ export interface IntegrationAuthConfig {
57
+ strategy: IntegrationAuthStrategy;
58
+ authModes?: IntegrationAuthStrategy[];
59
+ credentialLabel?: string;
60
+ credentialPlaceholder?: string;
61
+ credentialHelp?: string;
62
+ apiKeyHeaderName?: string;
63
+ apiKeyOptional?: boolean;
64
+ oauth?: IntegrationOAuthConfig;
65
+ }
66
+
67
+ export interface IntegrationHttpDefaultTool {
68
+ name: string;
69
+ description?: string;
70
+ method?: string;
71
+ path?: string;
72
+ scopes?: string[];
73
+ }
74
+
75
+ export interface IntegrationHttpConfig {
76
+ apiBaseUrl?: string;
77
+ openApiUrl?: string;
78
+ defaultTool?: IntegrationHttpDefaultTool;
79
+ }
80
+
81
+ export interface IntegrationConnectionOption {
82
+ id: "oauth" | "api" | "none" | string;
83
+ provider: IntegrationProvider;
84
+ transport?: IntegrationTransport;
85
+ http?: IntegrationHttpConfig;
86
+ auth: IntegrationAuthConfig;
87
+ }
88
+
89
+ export interface OAuthProviderRegistrationDefaults {
90
+ provider?: IntegrationProvider;
91
+ authModes?: IntegrationAuthStrategy[];
92
+ authStrategy?: IntegrationAuthStrategy;
93
+ credentialLabel?: string;
94
+ credentialPlaceholder?: string;
95
+ credentialHelp?: string;
96
+ apiKeyHeaderName?: string;
97
+ apiBaseUrl?: string;
98
+ serverUrl?: string;
99
+ openApiUrl?: string;
100
+ authorizationUrl?: string;
101
+ tokenUrl?: string;
102
+ scopes?: string[];
103
+ optionalScopes?: string[];
104
+ toolScopes?: string[];
105
+ scopeSeparator?: "space" | "comma";
106
+ pkce?: boolean;
107
+ clientAuthentication?: "basic" | "body" | "none";
108
+ registrationUrl?: string;
109
+ additionalAuthorizationParams?: Record<string, string>;
110
+ additionalTokenParams?: Record<string, string>;
111
+ toolName?: string;
112
+ toolDescription?: string;
113
+ requestMethod?: string;
114
+ requestPath?: string;
115
+ }
116
+
117
+ export interface OAuthProviderCatalogOption {
118
+ slug: string;
119
+ name: string;
120
+ description: string;
121
+ categories: string[];
122
+ authStrategy: IntegrationAuthStrategy;
123
+ availability: "oauth_ready" | "manual_token" | "planned";
124
+ managedConnectorSlug?: string;
125
+ appUrl?: string;
126
+ docsUrl?: string;
127
+ notes: string;
128
+ popularityRank: number;
129
+ registrationDefaults?: OAuthProviderRegistrationDefaults;
130
+ }
131
+
132
+ export interface IntegrationCatalogEntry {
133
+ id: string;
134
+ kind: IntegrationProvider;
135
+ name: string;
136
+ description: string;
137
+ categories?: string[];
138
+ appUrl?: string;
139
+ docsUrl?: string;
140
+ notes?: string;
141
+ iconBg?: string;
142
+ iconColor?: string;
143
+ keywords?: string[];
144
+ popularityRank?: number;
145
+ runtimeAvailability?: "all" | "local";
146
+ catalogStatus?: "oauth_ready" | "manual_token" | "planned";
147
+ managedConnectorSlug?: string;
148
+ authStrategy?: IntegrationAuthStrategy;
149
+ installHint?: string;
150
+ defaultConnectionOptionId?: string;
151
+ connectionOptions: IntegrationConnectionOption[];
152
+ registrationDefaults?: OAuthProviderRegistrationDefaults;
153
+ }
154
+
155
+ export const INTEGRATION_CATALOG: IntegrationCatalogEntry[];
156
+ export function listOAuthProviderCatalog(): OAuthProviderCatalogOption[];
157
+ export function getOAuthProviderRegistrationDefaults(
158
+ slug: string,
159
+ ): OAuthProviderRegistrationDefaults | undefined;
160
+
161
+ export const hubspotMcpServerUrl: string;
162
+ export const hubspotMcpAuthorizationUrl: string;
163
+ export const hubspotMcpTokenUrl: string;
164
+ export const hubspotRequiredScopes: readonly string[];
165
+ export const hubspotOptionalScopes: readonly string[];
166
+
167
+ export default INTEGRATION_CATALOG;
@@ -0,0 +1,212 @@
1
+ import airtable from "./catalog/airtable.json" with { type: "json" };
2
+ import apify from "./catalog/apify.json" with { type: "json" };
3
+ import atlassian from "./catalog/atlassian.json" with { type: "json" };
4
+ import brave_search from "./catalog/brave-search.json" with { type: "json" };
5
+ import browser_mcp from "./catalog/browser-mcp.json" with { type: "json" };
6
+ import clickhouse from "./catalog/clickhouse.json" with { type: "json" };
7
+ import cloudflare_bindings from "./catalog/cloudflare-bindings.json" with { type: "json" };
8
+ import cloudflare_browser_rendering from "./catalog/cloudflare-browser-rendering.json" with { type: "json" };
9
+ import cloudflare_builds from "./catalog/cloudflare-builds.json" with { type: "json" };
10
+ import cloudflare_docs from "./catalog/cloudflare-docs.json" with { type: "json" };
11
+ import cloudflare_observability from "./catalog/cloudflare-observability.json" with { type: "json" };
12
+ import deepwiki from "./catalog/deepwiki.json" with { type: "json" };
13
+ import elevenlabs from "./catalog/elevenlabs.json" with { type: "json" };
14
+ import everything from "./catalog/everything.json" with { type: "json" };
15
+ import exa from "./catalog/exa.json" with { type: "json" };
16
+ import fetch from "./catalog/fetch.json" with { type: "json" };
17
+ import figma from "./catalog/figma.json" with { type: "json" };
18
+ import filesystem from "./catalog/filesystem.json" with { type: "json" };
19
+ import firecrawl from "./catalog/firecrawl.json" with { type: "json" };
20
+ import git from "./catalog/git.json" with { type: "json" };
21
+ import github from "./catalog/github.json" with { type: "json" };
22
+ import huggingface from "./catalog/huggingface.json" with { type: "json" };
23
+ import kagi from "./catalog/kagi.json" with { type: "json" };
24
+ import linear from "./catalog/linear.json" with { type: "json" };
25
+ import memory from "./catalog/memory.json" with { type: "json" };
26
+ import mongodb from "./catalog/mongodb.json" with { type: "json" };
27
+ import neon from "./catalog/neon.json" with { type: "json" };
28
+ import notion from "./catalog/notion.json" with { type: "json" };
29
+ import obsidian from "./catalog/obsidian.json" with { type: "json" };
30
+ import paypal from "./catalog/paypal.json" with { type: "json" };
31
+ import playwright from "./catalog/playwright.json" with { type: "json" };
32
+ import redis from "./catalog/redis.json" with { type: "json" };
33
+ import resend from "./catalog/resend.json" with { type: "json" };
34
+ import sentry from "./catalog/sentry.json" with { type: "json" };
35
+ import sequential_thinking from "./catalog/sequential-thinking.json" with { type: "json" };
36
+ import slack from "./catalog/slack.json" with { type: "json" };
37
+ import stripe from "./catalog/stripe.json" with { type: "json" };
38
+ import supabase from "./catalog/supabase.json" with { type: "json" };
39
+ import tavily from "./catalog/tavily.json" with { type: "json" };
40
+ import time from "./catalog/time.json" with { type: "json" };
41
+ import { listOAuthProviderCatalog } from "./oauth-provider-catalog.js";
42
+ export { listOAuthProviderCatalog } from "./oauth-provider-catalog.js";
43
+ export {
44
+ getOAuthProviderRegistrationDefaults,
45
+ hubspotMcpAuthorizationUrl,
46
+ hubspotMcpServerUrl,
47
+ hubspotMcpTokenUrl,
48
+ hubspotOptionalScopes,
49
+ hubspotRequiredScopes,
50
+ } from "./oauth-provider-registration-defaults.js";
51
+
52
+ const DIRECT_INTEGRATIONS = [
53
+ airtable,
54
+ apify,
55
+ atlassian,
56
+ brave_search,
57
+ browser_mcp,
58
+ clickhouse,
59
+ cloudflare_bindings,
60
+ cloudflare_browser_rendering,
61
+ cloudflare_builds,
62
+ cloudflare_docs,
63
+ cloudflare_observability,
64
+ deepwiki,
65
+ elevenlabs,
66
+ everything,
67
+ exa,
68
+ fetch,
69
+ figma,
70
+ filesystem,
71
+ firecrawl,
72
+ git,
73
+ github,
74
+ huggingface,
75
+ kagi,
76
+ linear,
77
+ memory,
78
+ mongodb,
79
+ neon,
80
+ notion,
81
+ obsidian,
82
+ paypal,
83
+ playwright,
84
+ redis,
85
+ resend,
86
+ sentry,
87
+ sequential_thinking,
88
+ slack,
89
+ stripe,
90
+ supabase,
91
+ tavily,
92
+ time,
93
+ ];
94
+
95
+ const optionIdForDefaults = (defaults) => {
96
+ const strategy = defaults?.authStrategy ?? (defaults?.authorizationUrl || defaults?.tokenUrl ? "oauth2" : "oauth2");
97
+ if (strategy === "oauth2") return "oauth";
98
+ if (strategy === "none") return "none";
99
+ return "api";
100
+ };
101
+
102
+ const providerConnectionOption = (provider) => {
103
+ const defaults = provider.registrationDefaults;
104
+ if (!defaults) return null;
105
+ const option = {
106
+ id: optionIdForDefaults(defaults),
107
+ provider: defaults.provider ?? (defaults.serverUrl ? "mcp" : "http"),
108
+ auth: {
109
+ strategy: defaults.authStrategy ?? provider.authStrategy ?? "oauth2",
110
+ authModes: defaults.authModes,
111
+ credentialLabel: defaults.credentialLabel,
112
+ credentialPlaceholder: defaults.credentialPlaceholder,
113
+ credentialHelp: defaults.credentialHelp,
114
+ apiKeyHeaderName: defaults.apiKeyHeaderName,
115
+ oauth: defaults.authorizationUrl || defaults.tokenUrl ? {
116
+ authorizationUrl: defaults.authorizationUrl,
117
+ tokenUrl: defaults.tokenUrl,
118
+ scopes: defaults.scopes ?? [],
119
+ optionalScopes: defaults.optionalScopes,
120
+ toolScopes: defaults.toolScopes,
121
+ scopeSeparator: defaults.scopeSeparator,
122
+ pkce: defaults.pkce,
123
+ clientAuthentication: defaults.clientAuthentication,
124
+ registrationUrl: defaults.registrationUrl,
125
+ additionalAuthorizationParams: defaults.additionalAuthorizationParams,
126
+ additionalTokenParams: defaults.additionalTokenParams,
127
+ } : undefined,
128
+ },
129
+ };
130
+
131
+ if (option.provider === "mcp") {
132
+ option.transport = { kind: "shttp", url: defaults.serverUrl };
133
+ } else {
134
+ option.http = {
135
+ apiBaseUrl: defaults.apiBaseUrl,
136
+ openApiUrl: defaults.openApiUrl,
137
+ defaultTool: defaults.toolName ? {
138
+ name: defaults.toolName,
139
+ description: defaults.toolDescription,
140
+ method: defaults.requestMethod,
141
+ path: defaults.requestPath,
142
+ scopes: defaults.toolScopes,
143
+ } : undefined,
144
+ };
145
+ }
146
+
147
+ return option;
148
+ };
149
+
150
+ const providerIntegration = (provider) => {
151
+ const option = providerConnectionOption(provider);
152
+ return {
153
+ id: provider.slug,
154
+ kind: option?.provider ?? "http",
155
+ name: provider.name,
156
+ description: provider.description,
157
+ categories: provider.categories,
158
+ appUrl: provider.appUrl,
159
+ docsUrl: provider.docsUrl,
160
+ notes: provider.notes,
161
+ catalogStatus: provider.availability,
162
+ managedConnectorSlug: provider.managedConnectorSlug,
163
+ authStrategy: provider.authStrategy,
164
+ popularityRank: provider.popularityRank,
165
+ registrationDefaults: provider.registrationDefaults,
166
+ ...(option ? { defaultConnectionOptionId: option.id, connectionOptions: [option] } : { connectionOptions: [] }),
167
+ };
168
+ };
169
+
170
+ const mergeOptions = (left = [], right = []) => {
171
+ const options = new Map();
172
+ for (const option of left) options.set(option.id, option);
173
+ for (const option of right) {
174
+ if (!options.has(option.id)) options.set(option.id, option);
175
+ }
176
+ return [...options.values()];
177
+ };
178
+
179
+ const mergeIntegration = (base, override) => {
180
+ const connectionOptions = mergeOptions(base.connectionOptions, override.connectionOptions);
181
+ return {
182
+ ...base,
183
+ ...override,
184
+ catalogStatus: base.catalogStatus ?? override.catalogStatus,
185
+ managedConnectorSlug: base.managedConnectorSlug ?? override.managedConnectorSlug,
186
+ authStrategy: base.authStrategy ?? override.authStrategy,
187
+ registrationDefaults: base.registrationDefaults ?? override.registrationDefaults,
188
+ connectionOptions,
189
+ defaultConnectionOptionId:
190
+ base.defaultConnectionOptionId ?? override.defaultConnectionOptionId ?? connectionOptions[0]?.id,
191
+ };
192
+ };
193
+
194
+ const entriesById = new Map();
195
+ for (const provider of listOAuthProviderCatalog().map(providerIntegration)) {
196
+ entriesById.set(provider.id, provider);
197
+ }
198
+ for (const direct of DIRECT_INTEGRATIONS) {
199
+ entriesById.set(
200
+ direct.id,
201
+ entriesById.has(direct.id)
202
+ ? mergeIntegration(entriesById.get(direct.id), direct)
203
+ : direct,
204
+ );
205
+ }
206
+
207
+ export const INTEGRATION_CATALOG = [...entriesById.values()].sort((a, b) => {
208
+ const rankDelta = (b.popularityRank ?? 0) - (a.popularityRank ?? 0);
209
+ return rankDelta || a.name.localeCompare(b.name);
210
+ });
211
+
212
+ export default INTEGRATION_CATALOG;
@@ -0,0 +1,5 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ export const INTEGRATION_FALLBACK_LOGO: ReactNode;
4
+ export const INTEGRATION_LOGOS: Record<string, ReactNode>;
5
+ export const INTEGRATION_LOGO_IDS: Set<string>;
@@ -0,0 +1,94 @@
1
+ import { createElement } from "react";
2
+ import {
3
+ BookOpen,
4
+ Bot,
5
+ Brain,
6
+ Clock,
7
+ Database,
8
+ Flame,
9
+ Folder,
10
+ GitBranch,
11
+ Globe,
12
+ ListTree,
13
+ MousePointerClick,
14
+ Search,
15
+ Sparkles,
16
+ Telescope,
17
+ TestTube,
18
+ } from "lucide-react";
19
+ import {
20
+ SiAirtable,
21
+ SiAtlassian,
22
+ SiBrave,
23
+ SiClickhouse,
24
+ SiCloudflare,
25
+ SiElevenlabs,
26
+ SiFigma,
27
+ SiGithub,
28
+ SiHuggingface,
29
+ SiKagi,
30
+ SiLinear,
31
+ SiMongodb,
32
+ SiNotion,
33
+ SiObsidian,
34
+ SiPaypal,
35
+ SiRedis,
36
+ SiResend,
37
+ SiSentry,
38
+ SiSlack,
39
+ SiStripe,
40
+ SiSupabase,
41
+ } from "react-icons/si";
42
+
43
+ const LOGO = "h-5 w-5";
44
+
45
+ const simpleIcon = (Icon) => createElement(Icon, { className: LOGO });
46
+ const lucideIcon = (Icon) =>
47
+ createElement(Icon, { className: LOGO, strokeWidth: 2.25 });
48
+
49
+ export const INTEGRATION_FALLBACK_LOGO = lucideIcon(Bot);
50
+
51
+ export const INTEGRATION_LOGOS = {
52
+ github: simpleIcon(SiGithub),
53
+ slack: simpleIcon(SiSlack),
54
+ tavily: createElement(Search, { className: LOGO, strokeWidth: 2.5 }),
55
+ linear: simpleIcon(SiLinear),
56
+ notion: simpleIcon(SiNotion),
57
+ atlassian: simpleIcon(SiAtlassian),
58
+ sentry: simpleIcon(SiSentry),
59
+ stripe: simpleIcon(SiStripe),
60
+ paypal: simpleIcon(SiPaypal),
61
+ "cloudflare-docs": simpleIcon(SiCloudflare),
62
+ "cloudflare-bindings": simpleIcon(SiCloudflare),
63
+ "cloudflare-observability": simpleIcon(SiCloudflare),
64
+ huggingface: simpleIcon(SiHuggingface),
65
+ deepwiki: simpleIcon(BookOpen),
66
+ git: lucideIcon(GitBranch),
67
+ "brave-search": simpleIcon(SiBrave),
68
+ exa: lucideIcon(Telescope),
69
+ firecrawl: lucideIcon(Flame),
70
+ apify: lucideIcon(Bot),
71
+ fetch: lucideIcon(Globe),
72
+ "browser-mcp": lucideIcon(MousePointerClick),
73
+ playwright: lucideIcon(TestTube),
74
+ supabase: simpleIcon(SiSupabase),
75
+ neon: lucideIcon(Database),
76
+ mongodb: simpleIcon(SiMongodb),
77
+ redis: simpleIcon(SiRedis),
78
+ filesystem: lucideIcon(Folder),
79
+ memory: lucideIcon(Brain),
80
+ "sequential-thinking": lucideIcon(ListTree),
81
+ time: lucideIcon(Clock),
82
+ everything: lucideIcon(Sparkles),
83
+ figma: simpleIcon(SiFigma),
84
+ airtable: simpleIcon(SiAirtable),
85
+ obsidian: simpleIcon(SiObsidian),
86
+ elevenlabs: simpleIcon(SiElevenlabs),
87
+ resend: simpleIcon(SiResend),
88
+ "cloudflare-builds": simpleIcon(SiCloudflare),
89
+ "cloudflare-browser-rendering": simpleIcon(SiCloudflare),
90
+ kagi: simpleIcon(SiKagi),
91
+ clickhouse: simpleIcon(SiClickhouse),
92
+ };
93
+
94
+ export const INTEGRATION_LOGO_IDS = new Set(Object.keys(INTEGRATION_LOGOS));