@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.
- package/LICENSE +21 -0
- package/MIGRATION.md +62 -0
- package/README.md +160 -0
- package/automations/README.md +15 -0
- package/automations/catalog/github-pr-reviewer.json +13 -0
- package/automations/catalog/github-repo-monitor.json +11 -0
- package/automations/catalog/incident-retrospective-drafter.json +15 -0
- package/automations/catalog/linear-triage-assistant.json +13 -0
- package/automations/catalog/research-brief-writer.json +14 -0
- package/automations/catalog/slack-channel-monitor.json +11 -0
- package/automations/catalog/slack-standup-digest.json +13 -0
- package/automations/index.d.ts +14 -0
- package/automations/index.js +18 -0
- package/index.d.ts +17 -0
- package/index.js +2 -0
- package/integrations/README.md +39 -0
- package/integrations/catalog/airtable.json +44 -0
- package/integrations/catalog/apify.json +43 -0
- package/integrations/catalog/atlassian.json +31 -0
- package/integrations/catalog/brave-search.json +43 -0
- package/integrations/catalog/browser-mcp.json +34 -0
- package/integrations/catalog/clickhouse.json +56 -0
- package/integrations/catalog/cloudflare-bindings.json +32 -0
- package/integrations/catalog/cloudflare-browser-rendering.json +30 -0
- package/integrations/catalog/cloudflare-builds.json +31 -0
- package/integrations/catalog/cloudflare-docs.json +30 -0
- package/integrations/catalog/cloudflare-observability.json +31 -0
- package/integrations/catalog/deepwiki.json +32 -0
- package/integrations/catalog/elevenlabs.json +42 -0
- package/integrations/catalog/everything.json +32 -0
- package/integrations/catalog/exa.json +43 -0
- package/integrations/catalog/fetch.json +32 -0
- package/integrations/catalog/figma.json +44 -0
- package/integrations/catalog/filesystem.json +44 -0
- package/integrations/catalog/firecrawl.json +43 -0
- package/integrations/catalog/git.json +45 -0
- package/integrations/catalog/github.json +51 -0
- package/integrations/catalog/huggingface.json +32 -0
- package/integrations/catalog/kagi.json +42 -0
- package/integrations/catalog/linear.json +32 -0
- package/integrations/catalog/memory.json +33 -0
- package/integrations/catalog/mongodb.json +43 -0
- package/integrations/catalog/neon.json +44 -0
- package/integrations/catalog/notion.json +46 -0
- package/integrations/catalog/obsidian.json +43 -0
- package/integrations/catalog/paypal.json +29 -0
- package/integrations/catalog/playwright.json +34 -0
- package/integrations/catalog/redis.json +46 -0
- package/integrations/catalog/resend.json +49 -0
- package/integrations/catalog/sentry.json +30 -0
- package/integrations/catalog/sequential-thinking.json +32 -0
- package/integrations/catalog/slack.json +52 -0
- package/integrations/catalog/stripe.json +30 -0
- package/integrations/catalog/supabase.json +43 -0
- package/integrations/catalog/tavily.json +46 -0
- package/integrations/catalog/time.json +31 -0
- package/integrations/index.d.ts +167 -0
- package/integrations/index.js +212 -0
- package/integrations/logos.d.ts +5 -0
- package/integrations/logos.js +94 -0
- package/integrations/oauth-provider-catalog.js +553 -0
- package/integrations/oauth-provider-registration-defaults.js +610 -0
- package/package.json +56 -0
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
const googleAuthorizationUrl = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
2
|
+
const googleTokenUrl = "https://oauth2.googleapis.com/token";
|
|
3
|
+
const microsoftAuthorizationUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
|
|
4
|
+
const microsoftTokenUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/token";
|
|
5
|
+
const atlassianAuthorizationUrl = "https://auth.atlassian.com/authorize";
|
|
6
|
+
const atlassianTokenUrl = "https://auth.atlassian.com/oauth/token";
|
|
7
|
+
|
|
8
|
+
const googleWorkspacePreset = (
|
|
9
|
+
apiBaseUrl,
|
|
10
|
+
scopes,
|
|
11
|
+
toolName,
|
|
12
|
+
toolDescription,
|
|
13
|
+
requestPath,
|
|
14
|
+
requestMethod = "GET",
|
|
15
|
+
) => ({
|
|
16
|
+
apiBaseUrl,
|
|
17
|
+
authorizationUrl: googleAuthorizationUrl,
|
|
18
|
+
tokenUrl: googleTokenUrl,
|
|
19
|
+
scopes,
|
|
20
|
+
toolName,
|
|
21
|
+
toolDescription,
|
|
22
|
+
requestMethod,
|
|
23
|
+
requestPath,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const microsoftGraphPreset = (
|
|
27
|
+
scopes,
|
|
28
|
+
toolName,
|
|
29
|
+
toolDescription,
|
|
30
|
+
requestPath,
|
|
31
|
+
) => ({
|
|
32
|
+
apiBaseUrl: "https://graph.microsoft.com/v1.0",
|
|
33
|
+
authorizationUrl: microsoftAuthorizationUrl,
|
|
34
|
+
tokenUrl: microsoftTokenUrl,
|
|
35
|
+
scopes,
|
|
36
|
+
toolName,
|
|
37
|
+
toolDescription,
|
|
38
|
+
requestMethod: "GET",
|
|
39
|
+
requestPath,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const atlassianPreset = (
|
|
43
|
+
apiBaseUrl,
|
|
44
|
+
scopes,
|
|
45
|
+
toolName,
|
|
46
|
+
toolDescription,
|
|
47
|
+
requestPath,
|
|
48
|
+
) => ({
|
|
49
|
+
apiBaseUrl,
|
|
50
|
+
authorizationUrl: atlassianAuthorizationUrl,
|
|
51
|
+
tokenUrl: atlassianTokenUrl,
|
|
52
|
+
scopes,
|
|
53
|
+
toolName,
|
|
54
|
+
toolDescription,
|
|
55
|
+
requestMethod: "GET",
|
|
56
|
+
requestPath,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
export const hubspotMcpServerUrl = "https://mcp.hubspot.com";
|
|
60
|
+
export const hubspotMcpAuthorizationUrl = `${hubspotMcpServerUrl}/oauth/authorize/user`;
|
|
61
|
+
export const hubspotMcpTokenUrl = `${hubspotMcpServerUrl}/oauth/v3/token`;
|
|
62
|
+
|
|
63
|
+
const officialManagedMcpServerUrls = {
|
|
64
|
+
github: "https://api.githubcopilot.com/mcp/",
|
|
65
|
+
hubspot: hubspotMcpServerUrl,
|
|
66
|
+
slack: "https://mcp.slack.com/mcp",
|
|
67
|
+
webflow: "https://mcp.webflow.com/mcp",
|
|
68
|
+
datadog: "https://mcp.datadoghq.com/api/unstable/mcp-server/mcp",
|
|
69
|
+
ordinal: "https://app.tryordinal.com/api/mcp",
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const hubspotRequiredScopes = [
|
|
73
|
+
"oauth",
|
|
74
|
+
"crm.objects.contacts.read",
|
|
75
|
+
];
|
|
76
|
+
|
|
77
|
+
export const hubspotOptionalScopes = [
|
|
78
|
+
"crm.objects.contacts.write",
|
|
79
|
+
"crm.objects.companies.read",
|
|
80
|
+
"crm.objects.companies.write",
|
|
81
|
+
"crm.objects.deals.read",
|
|
82
|
+
"crm.objects.deals.write",
|
|
83
|
+
"tickets",
|
|
84
|
+
"crm.objects.owners.read",
|
|
85
|
+
"crm.schemas.contacts.read",
|
|
86
|
+
"crm.schemas.companies.read",
|
|
87
|
+
"crm.schemas.deals.read",
|
|
88
|
+
];
|
|
89
|
+
|
|
90
|
+
const registrationDefaults = {
|
|
91
|
+
github: {
|
|
92
|
+
apiBaseUrl: "https://api.github.com",
|
|
93
|
+
authorizationUrl: "https://github.com/login/oauth/authorize",
|
|
94
|
+
tokenUrl: "https://github.com/login/oauth/access_token",
|
|
95
|
+
scopes: ["read:user", "repo"],
|
|
96
|
+
toolName: "get_authenticated_user",
|
|
97
|
+
toolDescription: "Fetch the authenticated GitHub user profile.",
|
|
98
|
+
requestMethod: "GET",
|
|
99
|
+
requestPath: "/user",
|
|
100
|
+
},
|
|
101
|
+
"google-docs": googleWorkspacePreset(
|
|
102
|
+
"https://docs.googleapis.com",
|
|
103
|
+
["https://www.googleapis.com/auth/documents.readonly"],
|
|
104
|
+
"get_document",
|
|
105
|
+
"Fetch a Google Docs document by ID.",
|
|
106
|
+
"/v1/documents/{documentId}",
|
|
107
|
+
),
|
|
108
|
+
slack: {
|
|
109
|
+
provider: "mcp",
|
|
110
|
+
authorizationUrl: "https://slack.com/oauth/v2_user/authorize",
|
|
111
|
+
tokenUrl: "https://slack.com/api/oauth.v2.user.access",
|
|
112
|
+
scopes: [
|
|
113
|
+
"search:read.public",
|
|
114
|
+
"search:read.private",
|
|
115
|
+
"search:read.mpim",
|
|
116
|
+
"search:read.im",
|
|
117
|
+
"search:read.files",
|
|
118
|
+
"search:read.users",
|
|
119
|
+
"chat:write",
|
|
120
|
+
"channels:history",
|
|
121
|
+
"groups:history",
|
|
122
|
+
"mpim:history",
|
|
123
|
+
"im:history",
|
|
124
|
+
"canvases:read",
|
|
125
|
+
"canvases:write",
|
|
126
|
+
"users:read",
|
|
127
|
+
"users:read.email",
|
|
128
|
+
],
|
|
129
|
+
pkce: true,
|
|
130
|
+
clientAuthentication: "body",
|
|
131
|
+
},
|
|
132
|
+
notion: {
|
|
133
|
+
provider: "http",
|
|
134
|
+
apiBaseUrl: "https://api.notion.com",
|
|
135
|
+
openApiUrl: "https://developers.notion.com/openapi.json",
|
|
136
|
+
authorizationUrl: "https://api.notion.com/v1/oauth/authorize",
|
|
137
|
+
tokenUrl: "https://api.notion.com/v1/oauth/token",
|
|
138
|
+
scopes: [],
|
|
139
|
+
toolName: "post_search",
|
|
140
|
+
toolDescription: "Search pages and databases in the connected Notion workspace.",
|
|
141
|
+
requestMethod: "POST",
|
|
142
|
+
requestPath: "/v1/search",
|
|
143
|
+
},
|
|
144
|
+
figma: {
|
|
145
|
+
apiBaseUrl: "https://api.figma.com",
|
|
146
|
+
authorizationUrl: "https://www.figma.com/oauth",
|
|
147
|
+
tokenUrl: "https://api.figma.com/v1/oauth/token",
|
|
148
|
+
scopes: [
|
|
149
|
+
"current_user:read",
|
|
150
|
+
"file_content:read",
|
|
151
|
+
"file_metadata:read",
|
|
152
|
+
"projects:read",
|
|
153
|
+
],
|
|
154
|
+
toolName: "get_file",
|
|
155
|
+
toolDescription: "Fetch a Figma file by key.",
|
|
156
|
+
requestMethod: "GET",
|
|
157
|
+
requestPath: "/v1/files/{fileKey}",
|
|
158
|
+
},
|
|
159
|
+
elevenlabs: {
|
|
160
|
+
provider: "http",
|
|
161
|
+
authModes: ["api_key"],
|
|
162
|
+
authStrategy: "api_key",
|
|
163
|
+
credentialLabel: "ElevenLabs API key",
|
|
164
|
+
credentialPlaceholder: "Paste your ElevenLabs API key",
|
|
165
|
+
credentialHelp:
|
|
166
|
+
"Personal or workspace ElevenLabs API key sent in the xi-api-key header.",
|
|
167
|
+
apiKeyHeaderName: "xi-api-key",
|
|
168
|
+
apiBaseUrl: "https://api.elevenlabs.io",
|
|
169
|
+
openApiUrl: "https://api.elevenlabs.io/openapi.json",
|
|
170
|
+
},
|
|
171
|
+
"google-drive": googleWorkspacePreset(
|
|
172
|
+
"https://www.googleapis.com/drive/v3",
|
|
173
|
+
["https://www.googleapis.com/auth/drive.metadata.readonly"],
|
|
174
|
+
"list_files",
|
|
175
|
+
"List Drive files visible to the connected user.",
|
|
176
|
+
"/files",
|
|
177
|
+
),
|
|
178
|
+
"google-sheets": googleWorkspacePreset(
|
|
179
|
+
"https://sheets.googleapis.com",
|
|
180
|
+
["https://www.googleapis.com/auth/spreadsheets.readonly"],
|
|
181
|
+
"get_spreadsheet",
|
|
182
|
+
"Fetch spreadsheet metadata and sheets by ID.",
|
|
183
|
+
"/v4/spreadsheets/{spreadsheetId}",
|
|
184
|
+
),
|
|
185
|
+
gmail: googleWorkspacePreset(
|
|
186
|
+
"https://gmail.googleapis.com",
|
|
187
|
+
["https://www.googleapis.com/auth/gmail.readonly"],
|
|
188
|
+
"list_messages",
|
|
189
|
+
"List Gmail messages for the authenticated user.",
|
|
190
|
+
"/gmail/v1/users/me/messages",
|
|
191
|
+
),
|
|
192
|
+
"google-calendar": googleWorkspacePreset(
|
|
193
|
+
"https://www.googleapis.com/calendar/v3",
|
|
194
|
+
["https://www.googleapis.com/auth/calendar.readonly"],
|
|
195
|
+
"list_events",
|
|
196
|
+
"List events from the user's primary Google Calendar.",
|
|
197
|
+
"/calendars/primary/events",
|
|
198
|
+
),
|
|
199
|
+
jira: atlassianPreset(
|
|
200
|
+
"https://api.atlassian.com/ex/jira/{cloudId}",
|
|
201
|
+
["read:jira-work"],
|
|
202
|
+
"list_projects",
|
|
203
|
+
"List Jira projects available to the connected user.",
|
|
204
|
+
"/rest/api/3/project/search",
|
|
205
|
+
),
|
|
206
|
+
confluence: atlassianPreset(
|
|
207
|
+
"https://api.atlassian.com/ex/confluence/{cloudId}",
|
|
208
|
+
["read:page:confluence"],
|
|
209
|
+
"list_spaces",
|
|
210
|
+
"List Confluence spaces available to the connected user.",
|
|
211
|
+
"/wiki/api/v2/spaces",
|
|
212
|
+
),
|
|
213
|
+
linear: {
|
|
214
|
+
apiBaseUrl: "https://api.linear.app",
|
|
215
|
+
authorizationUrl: "https://linear.app/oauth/authorize",
|
|
216
|
+
tokenUrl: "https://api.linear.app/oauth/token",
|
|
217
|
+
scopes: ["read"],
|
|
218
|
+
toolName: "list_issues",
|
|
219
|
+
toolDescription: "Query issues from Linear via GraphQL.",
|
|
220
|
+
requestMethod: "POST",
|
|
221
|
+
requestPath: "/graphql",
|
|
222
|
+
},
|
|
223
|
+
asana: {
|
|
224
|
+
apiBaseUrl: "https://app.asana.com/api/1.0",
|
|
225
|
+
authorizationUrl: "https://app.asana.com/-/oauth_authorize",
|
|
226
|
+
tokenUrl: "https://app.asana.com/-/oauth_token",
|
|
227
|
+
scopes: ["tasks:read"],
|
|
228
|
+
toolName: "list_tasks",
|
|
229
|
+
toolDescription: "List tasks visible to the connected Asana user.",
|
|
230
|
+
requestMethod: "GET",
|
|
231
|
+
requestPath: "/tasks",
|
|
232
|
+
},
|
|
233
|
+
trello: {
|
|
234
|
+
apiBaseUrl: "https://api.trello.com/1",
|
|
235
|
+
toolName: "list_boards",
|
|
236
|
+
toolDescription: "List Trello boards visible to the authenticated member.",
|
|
237
|
+
requestMethod: "GET",
|
|
238
|
+
requestPath: "/members/me/boards",
|
|
239
|
+
},
|
|
240
|
+
clickup: {
|
|
241
|
+
apiBaseUrl: "https://api.clickup.com/api/v2",
|
|
242
|
+
authorizationUrl: "https://app.clickup.com/api",
|
|
243
|
+
tokenUrl: "https://api.clickup.com/api/v2/oauth/token",
|
|
244
|
+
scopes: [],
|
|
245
|
+
toolName: "list_workspaces",
|
|
246
|
+
toolDescription: "List ClickUp workspaces available to the connected user.",
|
|
247
|
+
requestMethod: "GET",
|
|
248
|
+
requestPath: "/team",
|
|
249
|
+
},
|
|
250
|
+
monday: {
|
|
251
|
+
apiBaseUrl: "https://api.monday.com/v2",
|
|
252
|
+
authorizationUrl: "https://auth.monday.com/oauth2/authorize",
|
|
253
|
+
tokenUrl: "https://auth.monday.com/oauth2/token",
|
|
254
|
+
scopes: ["boards:read"],
|
|
255
|
+
toolName: "list_boards",
|
|
256
|
+
toolDescription: "Query boards from Monday.com.",
|
|
257
|
+
requestMethod: "POST",
|
|
258
|
+
requestPath: "/",
|
|
259
|
+
},
|
|
260
|
+
airtable: {
|
|
261
|
+
apiBaseUrl: "https://api.airtable.com/v0",
|
|
262
|
+
authorizationUrl: "https://airtable.com/oauth2/v1/authorize",
|
|
263
|
+
tokenUrl: "https://airtable.com/oauth2/v1/token",
|
|
264
|
+
scopes: ["schema.bases:read", "data.records:read"],
|
|
265
|
+
toolName: "list_bases",
|
|
266
|
+
toolDescription: "List Airtable bases the connected user granted access to.",
|
|
267
|
+
requestMethod: "GET",
|
|
268
|
+
requestPath: "/meta/bases",
|
|
269
|
+
},
|
|
270
|
+
dropbox: {
|
|
271
|
+
apiBaseUrl: "https://api.dropboxapi.com/2",
|
|
272
|
+
authorizationUrl: "https://www.dropbox.com/oauth2/authorize",
|
|
273
|
+
tokenUrl: "https://api.dropboxapi.com/oauth2/token",
|
|
274
|
+
scopes: ["files.metadata.read"],
|
|
275
|
+
toolName: "list_root_folder",
|
|
276
|
+
toolDescription: "List entries in the root Dropbox folder.",
|
|
277
|
+
requestMethod: "POST",
|
|
278
|
+
requestPath: "/files/list_folder",
|
|
279
|
+
},
|
|
280
|
+
box: {
|
|
281
|
+
apiBaseUrl: "https://api.box.com/2.0",
|
|
282
|
+
authorizationUrl: "https://account.box.com/api/oauth2/authorize",
|
|
283
|
+
tokenUrl: "https://api.box.com/oauth2/token",
|
|
284
|
+
scopes: ["root_readonly", "item_read"],
|
|
285
|
+
toolName: "list_root_items",
|
|
286
|
+
toolDescription: "List files and folders in the Box root folder.",
|
|
287
|
+
requestMethod: "GET",
|
|
288
|
+
requestPath: "/folders/0/items",
|
|
289
|
+
},
|
|
290
|
+
"microsoft-outlook": microsoftGraphPreset(
|
|
291
|
+
["Mail.Read"],
|
|
292
|
+
"list_messages",
|
|
293
|
+
"List Outlook messages for the signed-in user.",
|
|
294
|
+
"/me/messages",
|
|
295
|
+
),
|
|
296
|
+
"microsoft-teams": microsoftGraphPreset(
|
|
297
|
+
["Team.ReadBasic.All"],
|
|
298
|
+
"list_teams",
|
|
299
|
+
"List Microsoft Teams joined by the signed-in user.",
|
|
300
|
+
"/me/joinedTeams",
|
|
301
|
+
),
|
|
302
|
+
onedrive: microsoftGraphPreset(
|
|
303
|
+
["Files.Read"],
|
|
304
|
+
"list_drive_items",
|
|
305
|
+
"List OneDrive items in the root folder.",
|
|
306
|
+
"/me/drive/root/children",
|
|
307
|
+
),
|
|
308
|
+
sharepoint: microsoftGraphPreset(
|
|
309
|
+
["Sites.Read.All"],
|
|
310
|
+
"get_root_site",
|
|
311
|
+
"Fetch the SharePoint root site through Microsoft Graph.",
|
|
312
|
+
"/sites/root",
|
|
313
|
+
),
|
|
314
|
+
salesforce: {
|
|
315
|
+
apiBaseUrl: "https://{instance}.salesforce.com/services/data/v60.0",
|
|
316
|
+
authorizationUrl: "https://login.salesforce.com/services/oauth2/authorize",
|
|
317
|
+
tokenUrl: "https://login.salesforce.com/services/oauth2/token",
|
|
318
|
+
scopes: ["api"],
|
|
319
|
+
toolName: "list_accounts",
|
|
320
|
+
toolDescription: "List Salesforce accounts from the connected org.",
|
|
321
|
+
requestMethod: "GET",
|
|
322
|
+
requestPath: "/sobjects/Account",
|
|
323
|
+
},
|
|
324
|
+
hubspot: {
|
|
325
|
+
provider: "mcp",
|
|
326
|
+
authorizationUrl: hubspotMcpAuthorizationUrl,
|
|
327
|
+
tokenUrl: hubspotMcpTokenUrl,
|
|
328
|
+
clientAuthentication: "body",
|
|
329
|
+
pkce: true,
|
|
330
|
+
scopes: [],
|
|
331
|
+
credentialHelp:
|
|
332
|
+
"Use the client ID and secret from a HubSpot MCP auth app (Development → MCP Auth Apps). Standard HubSpot OAuth apps and private apps will not authenticate with mcp.hubspot.com.",
|
|
333
|
+
},
|
|
334
|
+
zendesk: {
|
|
335
|
+
apiBaseUrl: "https://{subdomain}.zendesk.com/api/v2",
|
|
336
|
+
authorizationUrl: "https://{subdomain}.zendesk.com/oauth2/authorize",
|
|
337
|
+
tokenUrl: "https://{subdomain}.zendesk.com/oauth2/token",
|
|
338
|
+
scopes: ["tickets:read"],
|
|
339
|
+
toolName: "list_tickets",
|
|
340
|
+
toolDescription: "List Zendesk tickets for the connected account.",
|
|
341
|
+
requestMethod: "GET",
|
|
342
|
+
requestPath: "/tickets",
|
|
343
|
+
},
|
|
344
|
+
intercom: {
|
|
345
|
+
apiBaseUrl: "https://api.intercom.io",
|
|
346
|
+
authorizationUrl: "https://app.intercom.com/oauth",
|
|
347
|
+
tokenUrl: "https://api.intercom.io/auth/eagle/token",
|
|
348
|
+
scopes: ["read_users", "read_conversations"],
|
|
349
|
+
toolName: "list_contacts",
|
|
350
|
+
toolDescription: "List Intercom contacts for the connected workspace.",
|
|
351
|
+
requestMethod: "GET",
|
|
352
|
+
requestPath: "/contacts",
|
|
353
|
+
},
|
|
354
|
+
stripe: {
|
|
355
|
+
apiBaseUrl: "https://api.stripe.com/v1",
|
|
356
|
+
authorizationUrl: "https://connect.stripe.com/oauth/authorize",
|
|
357
|
+
tokenUrl: "https://connect.stripe.com/oauth/token",
|
|
358
|
+
scopes: ["read_only"],
|
|
359
|
+
toolName: "list_customers",
|
|
360
|
+
toolDescription: "List Stripe customers from the connected account.",
|
|
361
|
+
requestMethod: "GET",
|
|
362
|
+
requestPath: "/customers",
|
|
363
|
+
},
|
|
364
|
+
shopify: {
|
|
365
|
+
apiBaseUrl: "https://{shop}.myshopify.com/admin/api/2025-01",
|
|
366
|
+
authorizationUrl: "https://{shop}.myshopify.com/admin/oauth/authorize",
|
|
367
|
+
tokenUrl: "https://{shop}.myshopify.com/admin/oauth/access_token",
|
|
368
|
+
scopes: ["read_products"],
|
|
369
|
+
toolName: "list_products",
|
|
370
|
+
toolDescription: "List Shopify products for the connected store.",
|
|
371
|
+
requestMethod: "GET",
|
|
372
|
+
requestPath: "/products.json",
|
|
373
|
+
},
|
|
374
|
+
discord: {
|
|
375
|
+
apiBaseUrl: "https://discord.com/api/v10",
|
|
376
|
+
authorizationUrl: "https://discord.com/oauth2/authorize",
|
|
377
|
+
tokenUrl: "https://discord.com/api/oauth2/token",
|
|
378
|
+
scopes: ["identify", "guilds"],
|
|
379
|
+
toolName: "list_guilds",
|
|
380
|
+
toolDescription: "List Discord guilds available to the connected user.",
|
|
381
|
+
requestMethod: "GET",
|
|
382
|
+
requestPath: "/users/@me/guilds",
|
|
383
|
+
},
|
|
384
|
+
zoom: {
|
|
385
|
+
apiBaseUrl: "https://api.zoom.us/v2",
|
|
386
|
+
authorizationUrl: "https://zoom.us/oauth/authorize",
|
|
387
|
+
tokenUrl: "https://zoom.us/oauth/token",
|
|
388
|
+
scopes: ["meeting:read:user"],
|
|
389
|
+
toolName: "list_meetings",
|
|
390
|
+
toolDescription: "List Zoom meetings for the connected user.",
|
|
391
|
+
requestMethod: "GET",
|
|
392
|
+
requestPath: "/users/me/meetings",
|
|
393
|
+
},
|
|
394
|
+
webflow: {
|
|
395
|
+
provider: "mcp",
|
|
396
|
+
authorizationUrl: "https://mcp.webflow.com/oauth/authorize",
|
|
397
|
+
tokenUrl: "https://mcp.webflow.com/oauth/token",
|
|
398
|
+
registrationUrl: "https://mcp.webflow.com/oauth/register",
|
|
399
|
+
clientAuthentication: "none",
|
|
400
|
+
pkce: true,
|
|
401
|
+
scopes: [],
|
|
402
|
+
},
|
|
403
|
+
miro: {
|
|
404
|
+
apiBaseUrl: "https://api.miro.com/v2",
|
|
405
|
+
authorizationUrl: "https://miro.com/oauth/authorize",
|
|
406
|
+
tokenUrl: "https://api.miro.com/v1/oauth/token",
|
|
407
|
+
scopes: ["boards:read"],
|
|
408
|
+
toolName: "list_boards",
|
|
409
|
+
toolDescription: "List Miro boards available to the connected user.",
|
|
410
|
+
requestMethod: "GET",
|
|
411
|
+
requestPath: "/boards",
|
|
412
|
+
},
|
|
413
|
+
canva: {
|
|
414
|
+
apiBaseUrl: "https://api.canva.com/rest/v1",
|
|
415
|
+
tokenUrl: "https://api.canva.com/rest/v1/oauth/token",
|
|
416
|
+
scopes: [],
|
|
417
|
+
toolName: "list_designs",
|
|
418
|
+
toolDescription: "List Canva designs available to the connected user.",
|
|
419
|
+
requestMethod: "GET",
|
|
420
|
+
requestPath: "/designs",
|
|
421
|
+
},
|
|
422
|
+
datadog: {
|
|
423
|
+
provider: "mcp",
|
|
424
|
+
authorizationUrl: "https://app.datadoghq.com/oauth2/v1/authorize",
|
|
425
|
+
tokenUrl: "https://api.datadoghq.com/oauth2/v1/token",
|
|
426
|
+
scopes: ["dashboards_read", "monitors_read"],
|
|
427
|
+
},
|
|
428
|
+
sentry: {
|
|
429
|
+
apiBaseUrl: "https://sentry.io/api/0",
|
|
430
|
+
authorizationUrl: "https://sentry.io/oauth/authorize",
|
|
431
|
+
tokenUrl: "https://sentry.io/oauth/token",
|
|
432
|
+
scopes: ["project:read", "event:read", "org:read"],
|
|
433
|
+
toolName: "list_organizations",
|
|
434
|
+
toolDescription: "List Sentry organizations available to the connected user.",
|
|
435
|
+
requestMethod: "GET",
|
|
436
|
+
requestPath: "/organizations/",
|
|
437
|
+
},
|
|
438
|
+
posthog: {
|
|
439
|
+
apiBaseUrl: "https://us.posthog.com/api",
|
|
440
|
+
authorizationUrl: "https://us.posthog.com/oauth/authorize",
|
|
441
|
+
tokenUrl: "https://us.posthog.com/oauth/token",
|
|
442
|
+
scopes: ["project:read"],
|
|
443
|
+
toolName: "list_projects",
|
|
444
|
+
toolDescription: "List PostHog projects available to the connected user.",
|
|
445
|
+
requestMethod: "GET",
|
|
446
|
+
requestPath: "/projects/",
|
|
447
|
+
},
|
|
448
|
+
supabase: {
|
|
449
|
+
apiBaseUrl: "https://api.supabase.com/v1",
|
|
450
|
+
authorizationUrl: "https://api.supabase.com/v1/oauth/authorize",
|
|
451
|
+
tokenUrl: "https://api.supabase.com/v1/oauth/token",
|
|
452
|
+
scopes: [],
|
|
453
|
+
toolName: "list_projects",
|
|
454
|
+
toolDescription: "List Supabase projects available to the connected user.",
|
|
455
|
+
requestMethod: "GET",
|
|
456
|
+
requestPath: "/projects",
|
|
457
|
+
},
|
|
458
|
+
vercel: {
|
|
459
|
+
apiBaseUrl: "https://api.vercel.com",
|
|
460
|
+
authorizationUrl: "https://vercel.com/oauth/authorize",
|
|
461
|
+
tokenUrl: "https://api.vercel.com/v2/oauth/access_token",
|
|
462
|
+
scopes: ["project:read"],
|
|
463
|
+
toolName: "list_projects",
|
|
464
|
+
toolDescription: "List Vercel projects available to the connected user.",
|
|
465
|
+
requestMethod: "GET",
|
|
466
|
+
requestPath: "/v9/projects",
|
|
467
|
+
},
|
|
468
|
+
netlify: {
|
|
469
|
+
apiBaseUrl: "https://api.netlify.com/api/v1",
|
|
470
|
+
authorizationUrl: "https://app.netlify.com/authorize",
|
|
471
|
+
tokenUrl: "https://api.netlify.com/oauth/token",
|
|
472
|
+
scopes: ["sites:read"],
|
|
473
|
+
toolName: "list_sites",
|
|
474
|
+
toolDescription: "List Netlify sites available to the connected user.",
|
|
475
|
+
requestMethod: "GET",
|
|
476
|
+
requestPath: "/sites",
|
|
477
|
+
},
|
|
478
|
+
plaid: {
|
|
479
|
+
apiBaseUrl: "https://production.plaid.com",
|
|
480
|
+
toolName: "get_accounts",
|
|
481
|
+
toolDescription: "Fetch accounts for a connected Plaid item.",
|
|
482
|
+
requestMethod: "POST",
|
|
483
|
+
requestPath: "/accounts/get",
|
|
484
|
+
},
|
|
485
|
+
|
|
486
|
+
okta: {
|
|
487
|
+
apiBaseUrl: "https://{yourOktaDomain}/api/v1",
|
|
488
|
+
authorizationUrl: "https://{yourOktaDomain}/oauth2/v1/authorize",
|
|
489
|
+
tokenUrl: "https://{yourOktaDomain}/oauth2/v1/token",
|
|
490
|
+
scopes: ["okta.users.read"],
|
|
491
|
+
toolName: "list_users",
|
|
492
|
+
toolDescription: "List Okta users for the connected org.",
|
|
493
|
+
requestMethod: "GET",
|
|
494
|
+
requestPath: "/users",
|
|
495
|
+
},
|
|
496
|
+
servicenow: {
|
|
497
|
+
apiBaseUrl: "https://{instance}.service-now.com/api/now/v1",
|
|
498
|
+
authorizationUrl: "https://{instance}.service-now.com/oauth_auth.do",
|
|
499
|
+
tokenUrl: "https://{instance}.service-now.com/oauth_token.do",
|
|
500
|
+
scopes: ["useraccount", "table.read"],
|
|
501
|
+
toolName: "list_incidents",
|
|
502
|
+
toolDescription: "List ServiceNow incidents for the connected instance.",
|
|
503
|
+
requestMethod: "GET",
|
|
504
|
+
requestPath: "/table/incident",
|
|
505
|
+
},
|
|
506
|
+
freshdesk: {
|
|
507
|
+
apiBaseUrl: "https://{domain}.freshdesk.com/api/v2",
|
|
508
|
+
authorizationUrl: "https://{domain}.freshdesk.com/oauth/authorize",
|
|
509
|
+
tokenUrl: "https://{domain}.freshdesk.com/oauth/token",
|
|
510
|
+
scopes: ["tickets_view"],
|
|
511
|
+
toolName: "list_tickets",
|
|
512
|
+
toolDescription: "List Freshdesk tickets for the connected account.",
|
|
513
|
+
requestMethod: "GET",
|
|
514
|
+
requestPath: "/tickets",
|
|
515
|
+
},
|
|
516
|
+
pipedrive: {
|
|
517
|
+
apiBaseUrl: "https://api.pipedrive.com/v1",
|
|
518
|
+
authorizationUrl: "https://oauth.pipedrive.com/oauth/authorize",
|
|
519
|
+
tokenUrl: "https://oauth.pipedrive.com/oauth/token",
|
|
520
|
+
scopes: ["deals:read", "contacts:read"],
|
|
521
|
+
toolName: "list_persons",
|
|
522
|
+
toolDescription: "List Pipedrive people visible to the connected user.",
|
|
523
|
+
requestMethod: "GET",
|
|
524
|
+
requestPath: "/persons",
|
|
525
|
+
},
|
|
526
|
+
mailchimp: {
|
|
527
|
+
apiBaseUrl: "https://{dc}.api.mailchimp.com/3.0",
|
|
528
|
+
authorizationUrl: "https://login.mailchimp.com/oauth2/authorize",
|
|
529
|
+
tokenUrl: "https://login.mailchimp.com/oauth2/token",
|
|
530
|
+
scopes: ["audiences:read"],
|
|
531
|
+
toolName: "list_audiences",
|
|
532
|
+
toolDescription: "List Mailchimp audiences for the connected account.",
|
|
533
|
+
requestMethod: "GET",
|
|
534
|
+
requestPath: "/lists",
|
|
535
|
+
},
|
|
536
|
+
quickbooks: {
|
|
537
|
+
apiBaseUrl: "https://sandbox-quickbooks.api.intuit.com/v3/company/{companyId}",
|
|
538
|
+
authorizationUrl: "https://appcenter.intuit.com/connect/oauth2",
|
|
539
|
+
tokenUrl: "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer",
|
|
540
|
+
scopes: ["com.intuit.quickbooks.accounting"],
|
|
541
|
+
toolName: "list_customers",
|
|
542
|
+
toolDescription: "Query QuickBooks customers for the connected company.",
|
|
543
|
+
requestMethod: "GET",
|
|
544
|
+
requestPath: "/query?query=SELECT%20*%20FROM%20Customer%20MAXRESULTS%2010",
|
|
545
|
+
},
|
|
546
|
+
xero: {
|
|
547
|
+
apiBaseUrl: "https://api.xero.com/api.xro/2.0",
|
|
548
|
+
authorizationUrl: "https://login.xero.com/identity/connect/authorize",
|
|
549
|
+
tokenUrl: "https://identity.xero.com/connect/token",
|
|
550
|
+
scopes: ["accounting.contacts.read"],
|
|
551
|
+
toolName: "list_contacts",
|
|
552
|
+
toolDescription: "List Xero contacts for the connected tenant.",
|
|
553
|
+
requestMethod: "GET",
|
|
554
|
+
requestPath: "/Contacts",
|
|
555
|
+
},
|
|
556
|
+
gitlab: {
|
|
557
|
+
apiBaseUrl: "https://gitlab.com/api/v4",
|
|
558
|
+
authorizationUrl: "https://gitlab.com/oauth/authorize",
|
|
559
|
+
tokenUrl: "https://gitlab.com/oauth/token",
|
|
560
|
+
scopes: ["read_api"],
|
|
561
|
+
toolName: "get_current_user",
|
|
562
|
+
toolDescription: "Fetch the authenticated GitLab user profile.",
|
|
563
|
+
requestMethod: "GET",
|
|
564
|
+
requestPath: "/user",
|
|
565
|
+
},
|
|
566
|
+
bitbucket: {
|
|
567
|
+
apiBaseUrl: "https://api.bitbucket.org/2.0",
|
|
568
|
+
authorizationUrl: "https://bitbucket.org/site/oauth2/authorize",
|
|
569
|
+
tokenUrl: "https://bitbucket.org/site/oauth2/access_token",
|
|
570
|
+
scopes: ["account", "repository"],
|
|
571
|
+
toolName: "get_current_user",
|
|
572
|
+
toolDescription: "Fetch the authenticated Bitbucket user profile.",
|
|
573
|
+
requestMethod: "GET",
|
|
574
|
+
requestPath: "/user",
|
|
575
|
+
},
|
|
576
|
+
ordinal: {
|
|
577
|
+
provider: "mcp",
|
|
578
|
+
authModes: ["bearer"],
|
|
579
|
+
authStrategy: "bearer",
|
|
580
|
+
credentialLabel: "Ordinal API key",
|
|
581
|
+
credentialPlaceholder: "Paste your Ordinal API key",
|
|
582
|
+
credentialHelp:
|
|
583
|
+
"API key from your Ordinal workspace settings, sent as a Bearer token in the Authorization header.",
|
|
584
|
+
},
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
export const getOAuthProviderRegistrationDefaults = (slug) => {
|
|
588
|
+
const defaults = registrationDefaults[slug];
|
|
589
|
+
if (!defaults) {
|
|
590
|
+
return undefined;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
const officialMcpServerUrl = officialManagedMcpServerUrls[slug];
|
|
594
|
+
const provider =
|
|
595
|
+
defaults.provider ??
|
|
596
|
+
(officialMcpServerUrl
|
|
597
|
+
? "mcp"
|
|
598
|
+
: defaults.apiBaseUrl || defaults.openApiUrl
|
|
599
|
+
? "http"
|
|
600
|
+
: undefined);
|
|
601
|
+
|
|
602
|
+
return {
|
|
603
|
+
...defaults,
|
|
604
|
+
provider,
|
|
605
|
+
serverUrl:
|
|
606
|
+
provider === "mcp"
|
|
607
|
+
? defaults.serverUrl ?? officialMcpServerUrl
|
|
608
|
+
: defaults.serverUrl,
|
|
609
|
+
};
|
|
610
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@openhands/extensions",
|
|
3
|
+
"version": "0.0.1-alpha",
|
|
4
|
+
"description": "Public OpenHands extension catalogs for skills, plugins, integrations, and automation templates.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/OpenHands/extensions"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=18.20.0"
|
|
13
|
+
},
|
|
14
|
+
"peerDependencies": {
|
|
15
|
+
"lucide-react": ">=0.400.0",
|
|
16
|
+
"react": ">=18.0.0",
|
|
17
|
+
"react-icons": ">=5.0.0"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"index.js",
|
|
24
|
+
"index.d.ts",
|
|
25
|
+
"automations",
|
|
26
|
+
"integrations",
|
|
27
|
+
"LICENSE",
|
|
28
|
+
"MIGRATION.md",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./index.d.ts",
|
|
34
|
+
"import": "./index.js",
|
|
35
|
+
"default": "./index.js"
|
|
36
|
+
},
|
|
37
|
+
"./automations": {
|
|
38
|
+
"types": "./automations/index.d.ts",
|
|
39
|
+
"import": "./automations/index.js",
|
|
40
|
+
"default": "./automations/index.js"
|
|
41
|
+
},
|
|
42
|
+
"./automations/catalog/*.json": "./automations/catalog/*.json",
|
|
43
|
+
"./integrations": {
|
|
44
|
+
"types": "./integrations/index.d.ts",
|
|
45
|
+
"import": "./integrations/index.js",
|
|
46
|
+
"default": "./integrations/index.js"
|
|
47
|
+
},
|
|
48
|
+
"./integrations/logos": {
|
|
49
|
+
"types": "./integrations/logos.d.ts",
|
|
50
|
+
"import": "./integrations/logos.js",
|
|
51
|
+
"default": "./integrations/logos.js"
|
|
52
|
+
},
|
|
53
|
+
"./integrations/catalog/*.json": "./integrations/catalog/*.json",
|
|
54
|
+
"./package.json": "./package.json"
|
|
55
|
+
}
|
|
56
|
+
}
|