@every-app/sdk 0.3.0-rc.1 → 0.3.0-rc.10

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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/dist/cloudflare/catalogSettings.generated.d.ts +81 -0
  4. package/dist/cloudflare/catalogSettings.generated.d.ts.map +1 -0
  5. package/dist/cloudflare/catalogSettings.generated.js +174 -0
  6. package/dist/cloudflare/index.d.ts +3 -2
  7. package/dist/cloudflare/index.d.ts.map +1 -1
  8. package/dist/cloudflare/index.js +4 -1
  9. package/dist/cloudflare/sentinel.d.ts +60 -2
  10. package/dist/cloudflare/sentinel.d.ts.map +1 -1
  11. package/dist/cloudflare/sentinel.js +37 -2
  12. package/dist/cloudflare/worker.d.ts +357 -63
  13. package/dist/cloudflare/worker.d.ts.map +1 -1
  14. package/dist/cloudflare/worker.js +363 -104
  15. package/dist/dev/index.d.ts +1 -1
  16. package/dist/dev/index.d.ts.map +1 -1
  17. package/dist/dev/index.js +1 -1
  18. package/dist/dev/keypair.d.ts +2 -0
  19. package/dist/dev/keypair.d.ts.map +1 -1
  20. package/dist/dev/keypair.js +2 -0
  21. package/dist/index.d.ts +6 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +5 -0
  24. package/dist/internal/aiDefault.d.ts +204 -0
  25. package/dist/internal/aiDefault.d.ts.map +1 -0
  26. package/dist/internal/aiDefault.js +334 -0
  27. package/dist/internal/aiProviders.d.ts +7 -2
  28. package/dist/internal/aiProviders.d.ts.map +1 -1
  29. package/dist/internal/aiProviders.js +17 -4
  30. package/dist/internal/appSettings.d.ts +82 -4
  31. package/dist/internal/appSettings.d.ts.map +1 -1
  32. package/dist/internal/appSettings.js +204 -29
  33. package/dist/internal/audit.d.ts +108 -0
  34. package/dist/internal/audit.d.ts.map +1 -0
  35. package/dist/internal/audit.js +235 -0
  36. package/dist/internal/capabilities.d.ts +2268 -438
  37. package/dist/internal/capabilities.d.ts.map +1 -1
  38. package/dist/internal/capabilities.js +128 -539
  39. package/dist/internal/catalog/commerce.d.ts +394 -0
  40. package/dist/internal/catalog/commerce.d.ts.map +1 -0
  41. package/dist/internal/catalog/commerce.js +477 -0
  42. package/dist/internal/catalog/comms.d.ts +375 -0
  43. package/dist/internal/catalog/comms.d.ts.map +1 -0
  44. package/dist/internal/catalog/comms.js +520 -0
  45. package/dist/internal/catalog/index.d.ts +1973 -0
  46. package/dist/internal/catalog/index.d.ts.map +1 -0
  47. package/dist/internal/catalog/index.js +19 -0
  48. package/dist/internal/catalog/inference.d.ts +393 -0
  49. package/dist/internal/catalog/inference.d.ts.map +1 -0
  50. package/dist/internal/catalog/inference.js +460 -0
  51. package/dist/internal/catalog/infra.d.ts +423 -0
  52. package/dist/internal/catalog/infra.d.ts.map +1 -0
  53. package/dist/internal/catalog/infra.js +543 -0
  54. package/dist/internal/catalog/search.d.ts +400 -0
  55. package/dist/internal/catalog/search.d.ts.map +1 -0
  56. package/dist/internal/catalog/search.js +463 -0
  57. package/dist/internal/devProviders.d.ts +2 -2
  58. package/dist/internal/devProviders.d.ts.map +1 -1
  59. package/dist/internal/devProviders.js +19 -1
  60. package/dist/internal/events.d.ts +13 -2
  61. package/dist/internal/events.d.ts.map +1 -1
  62. package/dist/internal/events.js +47 -4
  63. package/dist/internal/gatewaySettings.d.ts +3 -2
  64. package/dist/internal/gatewaySettings.d.ts.map +1 -1
  65. package/dist/internal/gatewaySettings.js +12 -6
  66. package/dist/internal/identity.d.ts +41 -4
  67. package/dist/internal/identity.d.ts.map +1 -1
  68. package/dist/internal/identity.js +48 -10
  69. package/dist/internal/index.d.ts +6 -1
  70. package/dist/internal/index.d.ts.map +1 -1
  71. package/dist/internal/index.js +6 -1
  72. package/dist/internal/members.d.ts +3 -2
  73. package/dist/internal/members.d.ts.map +1 -1
  74. package/dist/internal/oauthClient.d.ts +10 -12
  75. package/dist/internal/oauthClient.d.ts.map +1 -1
  76. package/dist/internal/oauthClient.js +20 -81
  77. package/dist/internal/oauthPresets.d.ts +33 -0
  78. package/dist/internal/oauthPresets.d.ts.map +1 -0
  79. package/dist/internal/oauthPresets.js +1064 -0
  80. package/dist/internal/oauthScopes.d.ts +56 -1
  81. package/dist/internal/oauthScopes.d.ts.map +1 -1
  82. package/dist/internal/oauthScopes.js +98 -4
  83. package/dist/internal/oauthSpec.d.ts +102 -0
  84. package/dist/internal/oauthSpec.d.ts.map +1 -0
  85. package/dist/internal/oauthSpec.js +789 -0
  86. package/dist/internal/protocol.d.ts +64 -1
  87. package/dist/internal/protocol.d.ts.map +1 -1
  88. package/dist/internal/protocol.js +51 -1
  89. package/dist/internal/providerRegistry.d.ts +77 -6
  90. package/dist/internal/providerRegistry.d.ts.map +1 -1
  91. package/dist/internal/providerRegistry.js +178 -8
  92. package/dist/internal/providerSpec.d.ts +18 -7
  93. package/dist/internal/providerSpec.d.ts.map +1 -1
  94. package/dist/internal/providerSpec.js +442 -34
  95. package/dist/internal/signInProviders.d.ts +104 -0
  96. package/dist/internal/signInProviders.d.ts.map +1 -0
  97. package/dist/internal/signInProviders.js +245 -0
  98. package/dist/manifest.d.ts +238 -0
  99. package/dist/manifest.d.ts.map +1 -0
  100. package/dist/manifest.js +30 -0
  101. package/dist/server/ai.d.ts +111 -0
  102. package/dist/server/ai.d.ts.map +1 -0
  103. package/dist/server/ai.js +145 -0
  104. package/dist/server/aiBinding.d.ts +68 -0
  105. package/dist/server/aiBinding.d.ts.map +1 -0
  106. package/dist/server/aiBinding.js +294 -0
  107. package/dist/server/attribution.d.ts +9 -5
  108. package/dist/server/attribution.d.ts.map +1 -1
  109. package/dist/server/attribution.js +12 -4
  110. package/dist/server/authorizeUrl.d.ts +1 -1
  111. package/dist/server/authorizeUrl.d.ts.map +1 -1
  112. package/dist/server/authorizeUrl.js +2 -6
  113. package/dist/server/connectUrl.d.ts +21 -0
  114. package/dist/server/connectUrl.d.ts.map +1 -0
  115. package/dist/server/connectUrl.js +37 -0
  116. package/dist/server/context.d.ts +68 -0
  117. package/dist/server/context.d.ts.map +1 -0
  118. package/dist/server/context.js +117 -0
  119. package/dist/server/emailBinding.d.ts +72 -0
  120. package/dist/server/emailBinding.d.ts.map +1 -0
  121. package/dist/server/emailBinding.js +124 -0
  122. package/dist/server/emit.d.ts +1 -1
  123. package/dist/server/emit.d.ts.map +1 -1
  124. package/dist/server/emit.js +7 -7
  125. package/dist/server/env.d.ts +44 -0
  126. package/dist/server/env.d.ts.map +1 -0
  127. package/dist/server/env.js +1 -0
  128. package/dist/server/everyApp.d.ts +27 -7
  129. package/dist/server/everyApp.d.ts.map +1 -1
  130. package/dist/server/everyApp.js +106 -5
  131. package/dist/server/fromMcpTools.d.ts +89 -0
  132. package/dist/server/fromMcpTools.d.ts.map +1 -0
  133. package/dist/server/fromMcpTools.js +192 -0
  134. package/dist/server/gatewayFetch.d.ts +42 -18
  135. package/dist/server/gatewayFetch.d.ts.map +1 -1
  136. package/dist/server/gatewayFetch.js +138 -19
  137. package/dist/server/gatewayUrl.d.ts +13 -0
  138. package/dist/server/gatewayUrl.d.ts.map +1 -0
  139. package/dist/server/gatewayUrl.js +34 -0
  140. package/dist/server/index.d.ts +15 -4
  141. package/dist/server/index.d.ts.map +1 -1
  142. package/dist/server/index.js +12 -2
  143. package/dist/server/integrationFetch.d.ts +70 -39
  144. package/dist/server/integrationFetch.d.ts.map +1 -1
  145. package/dist/server/integrationFetch.js +244 -82
  146. package/dist/server/listMembers.d.ts +1 -1
  147. package/dist/server/listMembers.d.ts.map +1 -1
  148. package/dist/server/listMembers.js +8 -11
  149. package/dist/server/refusal.d.ts +55 -0
  150. package/dist/server/refusal.d.ts.map +1 -0
  151. package/dist/server/refusal.js +193 -0
  152. package/dist/server/sendEmail.d.ts +1 -1
  153. package/dist/server/sendEmail.d.ts.map +1 -1
  154. package/dist/server/sendEmail.js +7 -7
  155. package/dist/server/toolsEndpoint.d.ts.map +1 -1
  156. package/dist/server/toolsEndpoint.js +11 -5
  157. package/dist/tanstack-start/index.d.ts +9 -0
  158. package/dist/tanstack-start/index.d.ts.map +1 -0
  159. package/dist/tanstack-start/index.js +29 -0
  160. package/dist/testing/index.d.ts +93 -0
  161. package/dist/testing/index.d.ts.map +1 -0
  162. package/dist/testing/index.js +156 -0
  163. package/package.json +35 -14
@@ -0,0 +1,520 @@
1
+ export const COMMS = {
2
+ postmark: {
3
+ mode: "api_key",
4
+ label: "Postmark",
5
+ description: "Transactional email: single, batch and templated messages from one Postmark server.",
6
+ auth: {
7
+ kind: "header",
8
+ secret: "POSTMARK_API_TOKEN",
9
+ header: "X-Postmark-Server-Token",
10
+ },
11
+ docs: "https://postmarkapp.com/support/article/1008-what-are-the-account-and-server-api-tokens",
12
+ api: "https://postmarkapp.com/developer/api/overview",
13
+ hosts: ["api.postmarkapp.com"],
14
+ data: "account",
15
+ access: ["write"],
16
+ readMethods: [],
17
+ writeMethods: ["POST"],
18
+ accountWidePaths: [
19
+ ["server"],
20
+ ["servers"],
21
+ ["domains"],
22
+ ["senders"],
23
+ ["webhooks"],
24
+ ["message-streams"],
25
+ ["triggers"],
26
+ ["data-removals"],
27
+ ],
28
+ hint: "A Server API token from the API Tokens tab of the Postmark server the app sends from; the Gateway sends it in the X-Postmark-Server-Token header.",
29
+ secrets: [
30
+ {
31
+ name: "POSTMARK_API_TOKEN",
32
+ hint: "A Server API token from the server's API Tokens tab, never the Account API token.",
33
+ },
34
+ ],
35
+ smoke: {
36
+ method: "GET",
37
+ path: "/server",
38
+ expect: [200],
39
+ free: true,
40
+ note: "Returns the server's settings; account-wide, so run it from a terminal.",
41
+ },
42
+ example: "send a password reset email",
43
+ verified: {
44
+ on: "2026-10-25",
45
+ how: "docs",
46
+ },
47
+ tags: ["email", "transactional"],
48
+ },
49
+ sendgrid: {
50
+ mode: "api_key",
51
+ label: "SendGrid",
52
+ description: "Twilio SendGrid email: send transactional and marketing mail through the v3 Mail Send API.",
53
+ auth: {
54
+ kind: "bearer",
55
+ secret: "SENDGRID_API_KEY",
56
+ },
57
+ docs: "https://app.sendgrid.com/settings/api_keys",
58
+ api: "https://www.twilio.com/docs/sendgrid/api-reference",
59
+ hosts: ["api.sendgrid.com", "api.eu.sendgrid.com"],
60
+ data: "account",
61
+ access: ["write"],
62
+ readMethods: [],
63
+ writeMethods: ["POST"],
64
+ accountWidePaths: [
65
+ ["api_keys"],
66
+ ["scopes"],
67
+ ["user"],
68
+ ["subusers"],
69
+ ["teammates"],
70
+ ["sso"],
71
+ ["access_settings"],
72
+ ["whitelabel"],
73
+ ["ips"],
74
+ ["send_ips"],
75
+ ["partners"],
76
+ ["partner_settings"],
77
+ ["alerts"],
78
+ ["mail_settings"],
79
+ ["tracking_settings"],
80
+ ["verified_senders"],
81
+ ["senders"],
82
+ ["marketing", "integrations"],
83
+ ["recipients", "erasejob"],
84
+ ],
85
+ hint: "An API key from Settings > API Keys in SendGrid, sent as a bearer token; Custom Access with Mail Send alone is enough to send. EU regional subusers call api.eu.sendgrid.com.",
86
+ secrets: [
87
+ {
88
+ name: "SENDGRID_API_KEY",
89
+ hint: "A Custom Access key with Mail Send only, never a Full Access key.",
90
+ },
91
+ ],
92
+ smoke: {
93
+ method: "GET",
94
+ path: "/v3/scopes",
95
+ expect: [200],
96
+ free: true,
97
+ note: "Lists the key's own scopes (the docs don't say whether a Mail-Send-only key may call it); account-wide, so run it from a terminal.",
98
+ },
99
+ rate: {
100
+ note: "Each endpoint has its own limit; answers carry X-RateLimit-Limit, -Remaining and -Reset.",
101
+ },
102
+ example: "send an order confirmation email",
103
+ verified: {
104
+ on: "2026-10-25",
105
+ how: "docs",
106
+ },
107
+ tags: ["email", "transactional", "marketing"],
108
+ },
109
+ // A Standard or Restricted API key (SID as the Basic username, its secret as the password), never the Auth Token: with it a write grant could close the account.
110
+ twilio: {
111
+ mode: "api_key",
112
+ label: "Twilio",
113
+ description: "SMS, MMS and voice: send text messages and place calls from your Twilio numbers.",
114
+ auth: {
115
+ kind: "basic",
116
+ secret: "TWILIO_API_SECRET",
117
+ as: "password",
118
+ user: {
119
+ secret: "TWILIO_API_KEY",
120
+ },
121
+ },
122
+ docs: "https://www.twilio.com/docs/iam/api-keys/keys-in-console",
123
+ api: "https://www.twilio.com/docs/usage/requests-to-twilio",
124
+ hosts: ["api.twilio.com"],
125
+ data: "account",
126
+ access: ["write"],
127
+ readMethods: [],
128
+ writeMethods: ["POST"],
129
+ accountWidePaths: [
130
+ ["keys"],
131
+ ["signingkeys"],
132
+ ["incomingphonenumbers"],
133
+ ["outgoingcallerids"],
134
+ ["applications"],
135
+ ["connectapps"],
136
+ ["authorizedconnectapps"],
137
+ ["addresses"],
138
+ ["sip"],
139
+ ["usage"],
140
+ ["balance"],
141
+ ],
142
+ hint: "A Standard or Restricted API key from Account settings > API keys & auth tokens in the Twilio Console, sent as HTTP Basic (the key's SID and secret); a Standard key can't reach the Accounts or Keys resources. Every path names the account, so the app puts its Account SID in it: /2010-04-01/Accounts/<Account SID>/Messages.json, with a form-encoded body.",
143
+ secrets: [
144
+ {
145
+ name: "TWILIO_API_SECRET",
146
+ hint: "The API key's secret, shown once when the key is created.",
147
+ },
148
+ {
149
+ name: "TWILIO_API_KEY",
150
+ hint: "The SID of a Standard or Restricted API key, never a Main key or the Auth Token.",
151
+ },
152
+ ],
153
+ example: "text a reminder to a customer's phone number",
154
+ verified: {
155
+ on: "2026-10-25",
156
+ how: "docs",
157
+ },
158
+ tags: ["sms", "voice", "messaging"],
159
+ },
160
+ intercom: {
161
+ mode: "api_key",
162
+ label: "Intercom",
163
+ description: "Customer messaging: contacts, companies, conversations, tickets and help center articles.",
164
+ auth: {
165
+ kind: "bearer",
166
+ secret: "INTERCOM_API_TOKEN",
167
+ },
168
+ docs: "https://app.intercom.com/a/apps/_/developer-hub",
169
+ api: "https://developers.intercom.com/docs/build-an-integration/learn-more/rest-apis",
170
+ hosts: ["api.intercom.io", "api.eu.intercom.io", "api.au.intercom.io"],
171
+ data: "account",
172
+ access: ["read", "write"],
173
+ readMethods: ["GET", "HEAD"],
174
+ writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
175
+ accountWidePaths: [
176
+ ["me"],
177
+ ["admins"],
178
+ ["teams"],
179
+ ["export"],
180
+ ["download"],
181
+ ["ip_allowlist"],
182
+ ],
183
+ hint: "The Access Token of a private app in your workspace's Developer Hub, sent as a bearer token. Searching contacts, conversations or tickets is a POST, so an app that searches asks for write.",
184
+ secrets: [
185
+ {
186
+ name: "INTERCOM_API_TOKEN",
187
+ hint: "The Access Token on your private app's Configure > Authentication page in the Developer Hub.",
188
+ },
189
+ ],
190
+ smoke: {
191
+ method: "GET",
192
+ path: "/me",
193
+ expect: [200],
194
+ free: true,
195
+ note: "Returns the admin behind the token; account-wide, so run it from a terminal.",
196
+ },
197
+ rate: {
198
+ perMinute: 10000,
199
+ note: "Per workspace, shared by its private apps; 25,000 a minute across all apps; counted in 10-second windows.",
200
+ },
201
+ example: "list the latest open conversations",
202
+ verified: {
203
+ on: "2026-10-25",
204
+ how: "docs",
205
+ },
206
+ tags: ["support", "crm", "messaging"],
207
+ },
208
+ crisp: {
209
+ mode: "api_key",
210
+ label: "Crisp",
211
+ description: "Customer chat: conversations, messages, people and visitors of one Crisp workspace.",
212
+ auth: {
213
+ kind: "basic",
214
+ secret: "CRISP_API_KEY",
215
+ as: "password",
216
+ user: {
217
+ secret: "CRISP_API_IDENTIFIER",
218
+ },
219
+ },
220
+ docs: "https://docs.crisp.chat/guides/rest-api/authentication/website-token/",
221
+ api: "https://docs.crisp.chat/references/rest-api/v1/",
222
+ hosts: ["api.crisp.chat"],
223
+ data: "account",
224
+ access: ["read", "write"],
225
+ readMethods: ["GET", "HEAD"],
226
+ writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
227
+ accountWidePaths: [
228
+ ["operators"],
229
+ ["operator"],
230
+ ["teams"],
231
+ ["team"],
232
+ ["settings"],
233
+ ["verify"],
234
+ ["audit"],
235
+ ["plans"],
236
+ ["plugins"],
237
+ ["plugin"],
238
+ ["connect"],
239
+ ],
240
+ hint: "A website token, which the workspace owner generates under Settings > Workspace Settings > Advanced configuration > API Token. The Gateway sends the identifier and key as HTTP Basic; the app sends X-Crisp-Tier: website on every call.",
241
+ secrets: [
242
+ {
243
+ name: "CRISP_API_KEY",
244
+ hint: "The token's key, shown once when the workspace owner generates it.",
245
+ },
246
+ {
247
+ name: "CRISP_API_IDENTIFIER",
248
+ hint: "The token's identifier, shown beside the key.",
249
+ },
250
+ ],
251
+ rate: {
252
+ perDay: 10000,
253
+ note: "The website token's daily quota.",
254
+ },
255
+ example: "list the latest chat conversations on my website",
256
+ verified: {
257
+ on: "2026-10-25",
258
+ how: "docs",
259
+ },
260
+ tags: ["support", "chat", "messaging"],
261
+ },
262
+ // Added 2026-10-30 from docs.granola.ai and its OpenAPI spec. Granola's
263
+ // hosted MCP server (mcp.granola.ai/mcp) is OAuth only, which the Gateway
264
+ // can't sign in to yet; this is its API-key REST API.
265
+ granola: {
266
+ mode: "api_key",
267
+ label: "Granola",
268
+ description: "Meeting notes: list, search and read notes with their AI summaries, transcripts, folders and spaces.",
269
+ auth: { kind: "bearer", secret: "GRANOLA_API_KEY" },
270
+ docs: "https://docs.granola.ai/help-center/sharing/integrations/granola-api",
271
+ api: "https://docs.granola.ai/introduction",
272
+ hosts: ["public-api.granola.ai"],
273
+ data: "account",
274
+ access: ["read"],
275
+ // Searching notes is a POST that reads; with the paths below refused,
276
+ // it is the only POST an app can reach.
277
+ readMethods: ["GET", "POST"],
278
+ // Workspace administration: the audit log, webhook endpoints (which
279
+ // would send every note to a URL of the app's choosing) and legal holds.
280
+ accountWidePaths: [["audit"], ["webhook-endpoints"], ["legal-holds"]],
281
+ hint: "An API key (grn_...) from the Granola desktop app's Settings > Connectors > API keys, on a Business or Enterprise plan; the Gateway sends it as a bearer token. It reads only the notes its scopes allow.",
282
+ secrets: [
283
+ {
284
+ name: "GRANOLA_API_KEY",
285
+ hint: "A personal or workspace API key (grn_...), with only the note scopes the apps need.",
286
+ },
287
+ ],
288
+ rate: {
289
+ perSecond: 5,
290
+ note: "Bursts of 25 requests in 5 seconds; per user or per workspace, by the key's scope.",
291
+ },
292
+ smoke: {
293
+ method: "GET",
294
+ path: "/v1/notes?page_size=1",
295
+ expect: [200],
296
+ free: true,
297
+ },
298
+ example: "summarize what we decided in this week's customer calls",
299
+ verified: {
300
+ on: "2026-10-30",
301
+ how: "docs",
302
+ },
303
+ tags: ["meetings", "notes", "transcripts"],
304
+ },
305
+ linear: {
306
+ mode: "api_key",
307
+ label: "Linear",
308
+ description: "Issue tracking over GraphQL: issues, projects, cycles, comments and teams.",
309
+ auth: {
310
+ kind: "header",
311
+ secret: "LINEAR_API_KEY",
312
+ header: "Authorization",
313
+ },
314
+ docs: "https://linear.app/settings/account/security",
315
+ api: "https://linear.app/developers/graphql",
316
+ hosts: ["api.linear.app"],
317
+ data: "account",
318
+ access: ["write"],
319
+ readMethods: [],
320
+ writeMethods: ["POST"],
321
+ accountWidePaths: [],
322
+ hint: "A personal API key from Settings > Account > Security & access; the Gateway sends it as the Authorization header with no Bearer word. Every call is a POST to /graphql, queries included, so the app asks for write.",
323
+ secrets: [
324
+ {
325
+ name: "LINEAR_API_KEY",
326
+ hint: "A personal API key, restricted to the permissions and teams the app needs.",
327
+ },
328
+ ],
329
+ rate: {
330
+ note: "2,500 requests and 3,000,000 complexity points an hour per API key.",
331
+ },
332
+ example: "create an issue for this bug in the Engineering team",
333
+ verified: {
334
+ on: "2026-10-25",
335
+ how: "docs",
336
+ },
337
+ tags: ["issues", "project-management", "graphql"],
338
+ },
339
+ github: {
340
+ mode: "api_key",
341
+ label: "GitHub",
342
+ description: "Code hosting: repositories, issues, pull requests, Actions and releases through the REST API.",
343
+ auth: {
344
+ kind: "bearer",
345
+ secret: "GITHUB_API_TOKEN",
346
+ },
347
+ docs: "https://github.com/settings/personal-access-tokens/new",
348
+ api: "https://docs.github.com/en/rest",
349
+ hosts: ["api.github.com"],
350
+ data: "account",
351
+ access: ["read", "write"],
352
+ readMethods: ["GET", "HEAD"],
353
+ writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
354
+ accountWidePaths: [
355
+ ["user", "email"],
356
+ ["user", "emails"],
357
+ ["user", "public_emails"],
358
+ ["user", "gpg_keys"],
359
+ ["user", "ssh_signing_keys"],
360
+ ["user", "social_accounts"],
361
+ ["keys"],
362
+ ["hooks"],
363
+ ["secrets"],
364
+ ["members"],
365
+ ["memberships"],
366
+ ["invitations"],
367
+ ["failed_invitations"],
368
+ ["collaborators"],
369
+ ["outside_collaborators"],
370
+ ["blocks"],
371
+ ["installations"],
372
+ ["personal-access-tokens"],
373
+ ["personal-access-token-requests"],
374
+ ["credential-authorizations"],
375
+ ["audit-log"],
376
+ ["billing"],
377
+ ],
378
+ hint: "A fine-grained personal access token from Settings > Developer settings, limited to one owner, the repositories the app needs and the least permissions; sent as a bearer token. GraphQL is a POST to /graphql, so it needs write.",
379
+ secrets: [
380
+ {
381
+ name: "GITHUB_API_TOKEN",
382
+ hint: "A fine-grained personal access token limited to the repositories and permissions the app needs.",
383
+ },
384
+ ],
385
+ smoke: {
386
+ method: "GET",
387
+ path: "/user",
388
+ expect: [200],
389
+ free: true,
390
+ note: "Returns the token's owner; 401 means the token is wrong.",
391
+ },
392
+ rate: {
393
+ note: "5,000 requests an hour per token; at most 100 concurrent requests and 900 points a minute across REST endpoints.",
394
+ },
395
+ example: "list the open pull requests in my repository",
396
+ verified: {
397
+ on: "2026-10-25",
398
+ how: "docs",
399
+ },
400
+ tags: ["code", "git", "issues"],
401
+ },
402
+ gitlab: {
403
+ mode: "api_key",
404
+ label: "GitLab",
405
+ description: "Code hosting on GitLab.com: projects, issues, merge requests, pipelines and releases.",
406
+ auth: {
407
+ kind: "header",
408
+ secret: "GITLAB_API_TOKEN",
409
+ header: "PRIVATE-TOKEN",
410
+ },
411
+ docs: "https://gitlab.com/-/user_settings/personal_access_tokens",
412
+ api: "https://docs.gitlab.com/api/rest/",
413
+ hosts: ["gitlab.com"],
414
+ data: "account",
415
+ access: ["read", "write"],
416
+ readMethods: ["GET", "HEAD"],
417
+ writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
418
+ accountWidePaths: [
419
+ ["user"],
420
+ ["personal_access_tokens"],
421
+ ["access_tokens"],
422
+ ["deploy_tokens"],
423
+ ["deploy_keys"],
424
+ ["project_deploy_keys"],
425
+ ["hooks"],
426
+ ["members"],
427
+ ["pending_members"],
428
+ ["billable_members"],
429
+ ["invitations"],
430
+ ["variables"],
431
+ ["audit_events"],
432
+ ],
433
+ hint: "A personal, project or group access token from GitLab.com, sent in the PRIVATE-TOKEN header; read_api is enough to read. Paths start with /api/v4. A self-managed GitLab needs its own registered provider.",
434
+ secrets: [
435
+ {
436
+ name: "GITLAB_API_TOKEN",
437
+ hint: "A personal, project or group access token with read_api, or api when the app writes.",
438
+ },
439
+ ],
440
+ smoke: {
441
+ method: "GET",
442
+ path: "/api/v4/personal_access_tokens/self",
443
+ expect: [200],
444
+ free: true,
445
+ note: "Describes a personal access token itself (401 when it is wrong or revoked); account-wide, so run it from a terminal.",
446
+ },
447
+ rate: {
448
+ perMinute: 2000,
449
+ note: "Authenticated API traffic per user on GitLab.com.",
450
+ },
451
+ example: "list the open merge requests in my project",
452
+ verified: {
453
+ on: "2026-10-25",
454
+ how: "docs",
455
+ },
456
+ tags: ["code", "git", "ci"],
457
+ },
458
+ vercel: {
459
+ mode: "api_key",
460
+ label: "Vercel",
461
+ description: "Frontend hosting: projects, deployments, domains and logs through the Vercel REST API.",
462
+ auth: {
463
+ kind: "bearer",
464
+ secret: "VERCEL_API_TOKEN",
465
+ },
466
+ docs: "https://vercel.com/account/tokens",
467
+ api: "https://vercel.com/docs/rest-api",
468
+ hosts: ["api.vercel.com"],
469
+ data: "account",
470
+ access: ["read", "write"],
471
+ readMethods: ["GET", "HEAD"],
472
+ writeMethods: ["POST", "PUT", "PATCH", "DELETE"],
473
+ accountWidePaths: [
474
+ ["user"],
475
+ ["teams"],
476
+ ["members"],
477
+ ["organizations"],
478
+ ["access-groups"],
479
+ ["billing"],
480
+ ["webhooks"],
481
+ ["drains"],
482
+ ["env"],
483
+ ["v3", "events"],
484
+ ["v1", "events"],
485
+ ["v1", "integrations"],
486
+ ["installations"],
487
+ ["connect"],
488
+ ["kms"],
489
+ ["api-keys"],
490
+ ["ai-gateway"],
491
+ ["token"],
492
+ ["tokens"],
493
+ ["registrar"],
494
+ ["transfer-request"],
495
+ ],
496
+ hint: "An access token from your account's Tokens page, sent as a bearer token; scope it to one team or one project. A team- or project-scoped token needs no teamId parameter.",
497
+ secrets: [
498
+ {
499
+ name: "VERCEL_API_TOKEN",
500
+ hint: "An access token scoped to one team or one project, never Full Account.",
501
+ },
502
+ ],
503
+ smoke: {
504
+ method: "GET",
505
+ path: "/v10/projects",
506
+ expect: [200],
507
+ free: true,
508
+ note: "Lists the projects the token can reach.",
509
+ },
510
+ rate: {
511
+ note: "Limits are per action (deployments, domains, teams), listed on Vercel's limits page.",
512
+ },
513
+ example: "list the latest deployments of my project",
514
+ verified: {
515
+ on: "2026-10-25",
516
+ how: "docs",
517
+ },
518
+ tags: ["hosting", "deploy", "frontend"],
519
+ },
520
+ };