adoptai-mcp 1.0.0

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 (174) hide show
  1. package/README.md +70 -0
  2. package/bin/adoptai-mcp.js +2 -0
  3. package/dist/apps/canva.js +1 -0
  4. package/dist/apps/figma.js +1 -0
  5. package/dist/apps/github.js +2 -0
  6. package/dist/apps/notion.js +1 -0
  7. package/dist/apps/registry.js +20 -0
  8. package/dist/apps/salesforce.js +1 -0
  9. package/dist/cli/add.js +532 -0
  10. package/dist/cli/index.js +39 -0
  11. package/dist/cli/list.js +19 -0
  12. package/dist/cli/remove.js +37 -0
  13. package/dist/cli/serve.js +27 -0
  14. package/dist/cli/status.js +24 -0
  15. package/dist/config/clients.js +118 -0
  16. package/dist/config/credentials.js +34 -0
  17. package/dist/core/auth-manager.js +237 -0
  18. package/dist/core/config-writer.js +161 -0
  19. package/dist/core/doctor.js +199 -0
  20. package/dist/core/package.json +3 -0
  21. package/dist/core/server-base.js +81 -0
  22. package/dist/integrations/canva/.env +3 -0
  23. package/dist/integrations/canva/auth.js +287 -0
  24. package/dist/integrations/canva/env.js +9 -0
  25. package/dist/integrations/canva/index.js +12 -0
  26. package/dist/integrations/canva/package.json +31 -0
  27. package/dist/integrations/canva/publish-to-adoptai.js +365 -0
  28. package/dist/integrations/canva/setup.js +90 -0
  29. package/dist/integrations/canva/tools.js +1315 -0
  30. package/dist/integrations/canva/tools.original.js +1315 -0
  31. package/dist/integrations/figma/auth.js +48 -0
  32. package/dist/integrations/figma/index.js +11 -0
  33. package/dist/integrations/figma/package.json +27 -0
  34. package/dist/integrations/figma/publish-to-adoptai.js +384 -0
  35. package/dist/integrations/figma/setup.js +90 -0
  36. package/dist/integrations/figma/tools.js +1137 -0
  37. package/dist/integrations/github/auth.js +53 -0
  38. package/dist/integrations/github/index.js +11 -0
  39. package/dist/integrations/github/package.json +28 -0
  40. package/dist/integrations/github/publish-to-adoptai.js +240 -0
  41. package/dist/integrations/github/setup.js +103 -0
  42. package/dist/integrations/github/tools.js +78 -0
  43. package/dist/integrations/github-actions/auth.js +53 -0
  44. package/dist/integrations/github-actions/index.js +11 -0
  45. package/dist/integrations/github-actions/package.json +27 -0
  46. package/dist/integrations/github-actions/setup.js +103 -0
  47. package/dist/integrations/github-actions/tools.js +5642 -0
  48. package/dist/integrations/github-activity/auth.js +53 -0
  49. package/dist/integrations/github-activity/index.js +11 -0
  50. package/dist/integrations/github-activity/package.json +27 -0
  51. package/dist/integrations/github-activity/setup.js +103 -0
  52. package/dist/integrations/github-activity/tools.js +925 -0
  53. package/dist/integrations/github-apps/auth.js +53 -0
  54. package/dist/integrations/github-apps/index.js +11 -0
  55. package/dist/integrations/github-apps/package.json +27 -0
  56. package/dist/integrations/github-apps/setup.js +103 -0
  57. package/dist/integrations/github-apps/tools.js +791 -0
  58. package/dist/integrations/github-billing/auth.js +53 -0
  59. package/dist/integrations/github-billing/index.js +11 -0
  60. package/dist/integrations/github-billing/package.json +27 -0
  61. package/dist/integrations/github-billing/setup.js +103 -0
  62. package/dist/integrations/github-billing/tools.js +438 -0
  63. package/dist/integrations/github-checks/auth.js +53 -0
  64. package/dist/integrations/github-checks/index.js +11 -0
  65. package/dist/integrations/github-checks/package.json +27 -0
  66. package/dist/integrations/github-checks/setup.js +103 -0
  67. package/dist/integrations/github-checks/tools.js +607 -0
  68. package/dist/integrations/github-code-scanning/auth.js +53 -0
  69. package/dist/integrations/github-code-scanning/index.js +11 -0
  70. package/dist/integrations/github-code-scanning/package.json +27 -0
  71. package/dist/integrations/github-code-scanning/setup.js +103 -0
  72. package/dist/integrations/github-code-scanning/tools.js +987 -0
  73. package/dist/integrations/github-dependabot/auth.js +53 -0
  74. package/dist/integrations/github-dependabot/index.js +11 -0
  75. package/dist/integrations/github-dependabot/package.json +27 -0
  76. package/dist/integrations/github-dependabot/setup.js +103 -0
  77. package/dist/integrations/github-dependabot/tools.js +915 -0
  78. package/dist/integrations/github-gists/auth.js +53 -0
  79. package/dist/integrations/github-gists/index.js +11 -0
  80. package/dist/integrations/github-gists/package.json +27 -0
  81. package/dist/integrations/github-gists/setup.js +103 -0
  82. package/dist/integrations/github-gists/tools.js +545 -0
  83. package/dist/integrations/github-git/auth.js +53 -0
  84. package/dist/integrations/github-git/index.js +11 -0
  85. package/dist/integrations/github-git/package.json +27 -0
  86. package/dist/integrations/github-git/setup.js +103 -0
  87. package/dist/integrations/github-git/tools.js +513 -0
  88. package/dist/integrations/github-issues/auth.js +53 -0
  89. package/dist/integrations/github-issues/index.js +11 -0
  90. package/dist/integrations/github-issues/package.json +27 -0
  91. package/dist/integrations/github-issues/setup.js +103 -0
  92. package/dist/integrations/github-issues/tools.js +2232 -0
  93. package/dist/integrations/github-orgs/auth.js +53 -0
  94. package/dist/integrations/github-orgs/index.js +11 -0
  95. package/dist/integrations/github-orgs/package.json +27 -0
  96. package/dist/integrations/github-orgs/setup.js +103 -0
  97. package/dist/integrations/github-orgs/tools.js +3512 -0
  98. package/dist/integrations/github-packages/auth.js +53 -0
  99. package/dist/integrations/github-packages/index.js +11 -0
  100. package/dist/integrations/github-packages/package.json +27 -0
  101. package/dist/integrations/github-packages/setup.js +103 -0
  102. package/dist/integrations/github-packages/tools.js +1088 -0
  103. package/dist/integrations/github-pulls/auth.js +53 -0
  104. package/dist/integrations/github-pulls/index.js +11 -0
  105. package/dist/integrations/github-pulls/package.json +27 -0
  106. package/dist/integrations/github-pulls/setup.js +103 -0
  107. package/dist/integrations/github-pulls/tools.js +1252 -0
  108. package/dist/integrations/github-reactions/auth.js +53 -0
  109. package/dist/integrations/github-reactions/index.js +11 -0
  110. package/dist/integrations/github-reactions/package.json +27 -0
  111. package/dist/integrations/github-reactions/setup.js +103 -0
  112. package/dist/integrations/github-reactions/tools.js +706 -0
  113. package/dist/integrations/github-repos/auth.js +53 -0
  114. package/dist/integrations/github-repos/index.js +11 -0
  115. package/dist/integrations/github-repos/package.json +27 -0
  116. package/dist/integrations/github-repos/setup.js +103 -0
  117. package/dist/integrations/github-repos/tools.js +7286 -0
  118. package/dist/integrations/github-search/auth.js +53 -0
  119. package/dist/integrations/github-search/index.js +11 -0
  120. package/dist/integrations/github-search/package.json +27 -0
  121. package/dist/integrations/github-search/setup.js +103 -0
  122. package/dist/integrations/github-search/tools.js +370 -0
  123. package/dist/integrations/github-teams/auth.js +53 -0
  124. package/dist/integrations/github-teams/index.js +11 -0
  125. package/dist/integrations/github-teams/package.json +27 -0
  126. package/dist/integrations/github-teams/setup.js +103 -0
  127. package/dist/integrations/github-teams/tools.js +633 -0
  128. package/dist/integrations/github-users/auth.js +53 -0
  129. package/dist/integrations/github-users/index.js +11 -0
  130. package/dist/integrations/github-users/package.json +27 -0
  131. package/dist/integrations/github-users/setup.js +103 -0
  132. package/dist/integrations/github-users/tools.js +1118 -0
  133. package/dist/integrations/notion/api.js +108 -0
  134. package/dist/integrations/notion/auth.js +59 -0
  135. package/dist/integrations/notion/endpoints.json +630 -0
  136. package/dist/integrations/notion/index.js +11 -0
  137. package/dist/integrations/notion/package.json +33 -0
  138. package/dist/integrations/notion/publish-to-adoptai.js +271 -0
  139. package/dist/integrations/notion/scripts/generate-endpoints.mjs +306 -0
  140. package/dist/integrations/notion/setup.js +89 -0
  141. package/dist/integrations/notion/tools.js +586 -0
  142. package/dist/integrations/notion/tools.original.js +568 -0
  143. package/dist/integrations/salesforce/.env +8 -0
  144. package/dist/integrations/salesforce/.env.example +15 -0
  145. package/dist/integrations/salesforce/auth.js +311 -0
  146. package/dist/integrations/salesforce/endpoints.json +1359 -0
  147. package/dist/integrations/salesforce/env.js +9 -0
  148. package/dist/integrations/salesforce/index.js +12 -0
  149. package/dist/integrations/salesforce/package.json +42 -0
  150. package/dist/integrations/salesforce/publish-smart-specs.js +890 -0
  151. package/dist/integrations/salesforce/publish-to-adoptai.js +386 -0
  152. package/dist/integrations/salesforce/scripts/extract-postman.mjs +222 -0
  153. package/dist/integrations/salesforce/setup.js +112 -0
  154. package/dist/integrations/salesforce/tools.js +4544 -0
  155. package/dist/integrations/salesforce/tools.original.js +4487 -0
  156. package/dist/server/mcp-server.js +50 -0
  157. package/dist/server/tool-loader.js +47 -0
  158. package/dist/specs/figma-api.json +13621 -0
  159. package/dist/specs/split/salesforce-auth.json +3931 -0
  160. package/dist/specs/split/salesforce-bulk-v1.json +1489 -0
  161. package/dist/specs/split/salesforce-bulk-v2.json +1951 -0
  162. package/dist/specs/split/salesforce-composite.json +1246 -0
  163. package/dist/specs/split/salesforce-connect.json +11639 -0
  164. package/dist/specs/split/salesforce-einstein-prediction-service.json +576 -0
  165. package/dist/specs/split/salesforce-event-platform.json +2682 -0
  166. package/dist/specs/split/salesforce-graphql.json +1754 -0
  167. package/dist/specs/split/salesforce-industries.json +4115 -0
  168. package/dist/specs/split/salesforce-metadata.json +555 -0
  169. package/dist/specs/split/salesforce-rest.json +4798 -0
  170. package/dist/specs/split/salesforce-soap.json +210 -0
  171. package/dist/specs/split/salesforce-subscription-management.json +1299 -0
  172. package/dist/specs/split/salesforce-tooling.json +2026 -0
  173. package/dist/specs/split/salesforce-ui.json +7426 -0
  174. package/package.json +47 -0
@@ -0,0 +1,987 @@
1
+ import axios from 'axios';
2
+ import { buildAuthHeaders } from './auth.js';
3
+
4
+ const BASE_URL = 'https://api.github.com';
5
+ const APP_ID = 'github-code-scanning';
6
+
7
+ function handleError(err) {
8
+ const status = err.response?.status;
9
+ const msg = err.response?.data?.message || err.response?.data?.error || err.message;
10
+ if (status === 401) throw new Error(`Token invalid.\nRun: npx adoptai-${APP_ID}-mcp --client cursor`);
11
+ if (status === 403) throw new Error('Insufficient permissions. Check your API key scopes.');
12
+ if (status === 404) throw new Error('Resource not found. Check your parameters.');
13
+ if (status === 429) throw new Error('Rate limit exceeded. Please wait and try again.');
14
+ throw new Error(msg || 'API request failed');
15
+ }
16
+
17
+ async function apiRequest(method, pathTemplate, params = {}, opts = {}) {
18
+ const { deleteSendsJsonBody = false } = opts;
19
+ const headers = buildAuthHeaders();
20
+ let url = BASE_URL + pathTemplate;
21
+ const pathKeys = [...pathTemplate.matchAll(/\{([^}]+)\}/g)].map((m) => m[1]);
22
+ for (const key of pathKeys) {
23
+ const value = params[key];
24
+ if (value !== undefined && value !== null) url = url.replace(`{${key}}`, encodeURIComponent(String(value)));
25
+ }
26
+ const rest = { ...params };
27
+ for (const key of pathKeys) delete rest[key];
28
+ const m = method.toUpperCase();
29
+ const useQuery = m === 'GET' || (m === 'DELETE' && !deleteSendsJsonBody);
30
+ const queryParams = {};
31
+ const bodyParams = {};
32
+ for (const [key, value] of Object.entries(rest)) {
33
+ if (value === undefined) continue;
34
+ if (useQuery) queryParams[key] = value; else bodyParams[key] = value;
35
+ }
36
+ try {
37
+ const res = await axios({
38
+ method: m,
39
+ url,
40
+ headers: { 'Content-Type': 'application/json', ...headers },
41
+ params: Object.keys(queryParams).length ? queryParams : undefined,
42
+ data: Object.keys(bodyParams).length ? bodyParams : undefined,
43
+ timeout: 30000,
44
+ });
45
+ if (res.status === 204 || res.data === '' || res.data === undefined) return { ok: true, status: res.status };
46
+ return res.data;
47
+ } catch (err) {
48
+ handleError(err);
49
+ }
50
+ }
51
+
52
+ const ENDPOINTS = [
53
+ {
54
+ "name": "code_scanning_list_alerts_for_org",
55
+ "description": "List code scanning alerts for an organization",
56
+ "method": "GET",
57
+ "path": "/orgs/{org}/code-scanning/alerts",
58
+ "deleteSendsJsonBody": false,
59
+ "inputSchema": {
60
+ "type": "object",
61
+ "properties": {
62
+ "org": {
63
+ "type": "string",
64
+ "description": "The organization name. The name is not case sensitive."
65
+ },
66
+ "tool_name": {
67
+ "type": "string",
68
+ "description": "The name of a code scanning tool. Only results by this tool will be listed. You can specify the tool by using either `tool_name` or `tool_guid`, but not both."
69
+ },
70
+ "tool_guid": {
71
+ "type": "string",
72
+ "description": "The GUID of a code scanning tool. Only results by this tool will be listed. Note that some code scanning tools may not include a GUID in their analysis data. You can specify the tool by using either `tool_guid` or `tool_name`, but not both."
73
+ },
74
+ "before": {
75
+ "type": "string",
76
+ "description": "A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
77
+ },
78
+ "after": {
79
+ "type": "string",
80
+ "description": "A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
81
+ },
82
+ "page": {
83
+ "type": "number",
84
+ "description": "The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
85
+ },
86
+ "per_page": {
87
+ "type": "number",
88
+ "description": "The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
89
+ },
90
+ "direction": {
91
+ "type": "string",
92
+ "description": "The direction to sort the results by.",
93
+ "enum": [
94
+ "asc",
95
+ "desc"
96
+ ]
97
+ },
98
+ "state": {
99
+ "type": "string",
100
+ "description": "If specified, only code scanning alerts with this state will be returned.",
101
+ "enum": [
102
+ "open",
103
+ "closed",
104
+ "dismissed",
105
+ "fixed"
106
+ ]
107
+ },
108
+ "sort": {
109
+ "type": "string",
110
+ "description": "The property by which to sort the results.",
111
+ "enum": [
112
+ "created",
113
+ "updated"
114
+ ]
115
+ },
116
+ "severity": {
117
+ "type": "string",
118
+ "description": "If specified, only code scanning alerts with this severity will be returned.",
119
+ "enum": [
120
+ "critical",
121
+ "high",
122
+ "medium",
123
+ "low",
124
+ "warning",
125
+ "note",
126
+ "error"
127
+ ]
128
+ },
129
+ "assignees": {
130
+ "type": "string",
131
+ "description": "Filter alerts by assignees. Provide a comma-separated list of user handles (e.g., `octocat` or `octocat,hubot`).\nUse `*` to list alerts with at least one assignee or `none` to list alerts with no assignees.\n"
132
+ }
133
+ },
134
+ "required": [
135
+ "org"
136
+ ]
137
+ }
138
+ },
139
+ {
140
+ "name": "code_scanning_list_alerts_for_repo",
141
+ "description": "List code scanning alerts for a repository",
142
+ "method": "GET",
143
+ "path": "/repos/{owner}/{repo}/code-scanning/alerts",
144
+ "deleteSendsJsonBody": false,
145
+ "inputSchema": {
146
+ "type": "object",
147
+ "properties": {
148
+ "owner": {
149
+ "type": "string",
150
+ "description": "The account owner of the repository. The name is not case sensitive."
151
+ },
152
+ "repo": {
153
+ "type": "string",
154
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
155
+ },
156
+ "tool_name": {
157
+ "type": "string",
158
+ "description": "The name of a code scanning tool. Only results by this tool will be listed. You can specify the tool by using either `tool_name` or `tool_guid`, but not both."
159
+ },
160
+ "tool_guid": {
161
+ "type": "string",
162
+ "description": "The GUID of a code scanning tool. Only results by this tool will be listed. Note that some code scanning tools may not include a GUID in their analysis data. You can specify the tool by using either `tool_guid` or `tool_name`, but not both."
163
+ },
164
+ "page": {
165
+ "type": "number",
166
+ "description": "The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
167
+ },
168
+ "per_page": {
169
+ "type": "number",
170
+ "description": "The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
171
+ },
172
+ "ref": {
173
+ "type": "string",
174
+ "description": "The Git reference for the results you want to list. The `ref` for a branch can be formatted either as `refs/heads/<branch name>` or simply `<branch name>`. To reference a pull request use `refs/pull/<number>/merge`."
175
+ },
176
+ "pr": {
177
+ "type": "number",
178
+ "description": "The number of the pull request for the results you want to list."
179
+ },
180
+ "direction": {
181
+ "type": "string",
182
+ "description": "The direction to sort the results by.",
183
+ "enum": [
184
+ "asc",
185
+ "desc"
186
+ ]
187
+ },
188
+ "before": {
189
+ "type": "string",
190
+ "description": "A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
191
+ },
192
+ "after": {
193
+ "type": "string",
194
+ "description": "A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
195
+ },
196
+ "sort": {
197
+ "type": "string",
198
+ "description": "The property by which to sort the results.",
199
+ "enum": [
200
+ "created",
201
+ "updated"
202
+ ]
203
+ },
204
+ "state": {
205
+ "type": "string",
206
+ "description": "If specified, only code scanning alerts with this state will be returned.",
207
+ "enum": [
208
+ "open",
209
+ "closed",
210
+ "dismissed",
211
+ "fixed"
212
+ ]
213
+ },
214
+ "severity": {
215
+ "type": "string",
216
+ "description": "If specified, only code scanning alerts with this severity will be returned.",
217
+ "enum": [
218
+ "critical",
219
+ "high",
220
+ "medium",
221
+ "low",
222
+ "warning",
223
+ "note",
224
+ "error"
225
+ ]
226
+ },
227
+ "assignees": {
228
+ "type": "string",
229
+ "description": "Filter alerts by assignees. Provide a comma-separated list of user handles (e.g., `octocat` or `octocat,hubot`).\nUse `*` to list alerts with at least one assignee or `none` to list alerts with no assignees.\n"
230
+ }
231
+ },
232
+ "required": [
233
+ "owner",
234
+ "repo"
235
+ ]
236
+ }
237
+ },
238
+ {
239
+ "name": "code_scanning_get_alert",
240
+ "description": "Get a code scanning alert",
241
+ "method": "GET",
242
+ "path": "/repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",
243
+ "deleteSendsJsonBody": false,
244
+ "inputSchema": {
245
+ "type": "object",
246
+ "properties": {
247
+ "owner": {
248
+ "type": "string",
249
+ "description": "The account owner of the repository. The name is not case sensitive."
250
+ },
251
+ "repo": {
252
+ "type": "string",
253
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
254
+ },
255
+ "alert_number": {
256
+ "type": "number",
257
+ "description": "The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation."
258
+ }
259
+ },
260
+ "required": [
261
+ "owner",
262
+ "repo",
263
+ "alert_number"
264
+ ]
265
+ }
266
+ },
267
+ {
268
+ "name": "code_scanning_update_alert",
269
+ "description": "Update a code scanning alert",
270
+ "method": "PATCH",
271
+ "path": "/repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",
272
+ "deleteSendsJsonBody": false,
273
+ "inputSchema": {
274
+ "type": "object",
275
+ "properties": {
276
+ "owner": {
277
+ "type": "string",
278
+ "description": "The account owner of the repository. The name is not case sensitive."
279
+ },
280
+ "repo": {
281
+ "type": "string",
282
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
283
+ },
284
+ "alert_number": {
285
+ "type": "number",
286
+ "description": "The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation."
287
+ },
288
+ "state": {
289
+ "type": "string",
290
+ "description": "Sets the state of the code scanning alert. You must provide `dismissed_reason` when you set the state to `dismissed`.",
291
+ "enum": [
292
+ "open",
293
+ "dismissed"
294
+ ]
295
+ },
296
+ "dismissed_reason": {
297
+ "type": "string",
298
+ "description": "**Required when the state is dismissed.** The reason for dismissing or closing the alert.",
299
+ "enum": [
300
+ "false positive",
301
+ "won't fix",
302
+ "used in tests",
303
+ null
304
+ ]
305
+ },
306
+ "dismissed_comment": {
307
+ "type": "string",
308
+ "description": "The dismissal comment associated with the dismissal of the alert."
309
+ },
310
+ "create_request": {
311
+ "type": "boolean",
312
+ "description": "If `true`, attempt to create an alert dismissal request."
313
+ },
314
+ "assignees": {
315
+ "type": "array",
316
+ "description": "The list of users to assign to the code scanning alert. An empty array unassigns all previous assignees from the alert."
317
+ }
318
+ },
319
+ "required": [
320
+ "owner",
321
+ "repo",
322
+ "alert_number"
323
+ ]
324
+ }
325
+ },
326
+ {
327
+ "name": "code_scanning_get_autofix",
328
+ "description": "Get the status of an autofix for a code scanning alert",
329
+ "method": "GET",
330
+ "path": "/repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix",
331
+ "deleteSendsJsonBody": false,
332
+ "inputSchema": {
333
+ "type": "object",
334
+ "properties": {
335
+ "owner": {
336
+ "type": "string",
337
+ "description": "The account owner of the repository. The name is not case sensitive."
338
+ },
339
+ "repo": {
340
+ "type": "string",
341
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
342
+ },
343
+ "alert_number": {
344
+ "type": "number",
345
+ "description": "The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation."
346
+ }
347
+ },
348
+ "required": [
349
+ "owner",
350
+ "repo",
351
+ "alert_number"
352
+ ]
353
+ }
354
+ },
355
+ {
356
+ "name": "code_scanning_create_autofix",
357
+ "description": "Create an autofix for a code scanning alert",
358
+ "method": "POST",
359
+ "path": "/repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix",
360
+ "deleteSendsJsonBody": false,
361
+ "inputSchema": {
362
+ "type": "object",
363
+ "properties": {
364
+ "owner": {
365
+ "type": "string",
366
+ "description": "The account owner of the repository. The name is not case sensitive."
367
+ },
368
+ "repo": {
369
+ "type": "string",
370
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
371
+ },
372
+ "alert_number": {
373
+ "type": "number",
374
+ "description": "The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation."
375
+ }
376
+ },
377
+ "required": [
378
+ "owner",
379
+ "repo",
380
+ "alert_number"
381
+ ]
382
+ }
383
+ },
384
+ {
385
+ "name": "code_scanning_commit_autofix",
386
+ "description": "Commit an autofix for a code scanning alert",
387
+ "method": "POST",
388
+ "path": "/repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits",
389
+ "deleteSendsJsonBody": false,
390
+ "inputSchema": {
391
+ "type": "object",
392
+ "properties": {
393
+ "owner": {
394
+ "type": "string",
395
+ "description": "The account owner of the repository. The name is not case sensitive."
396
+ },
397
+ "repo": {
398
+ "type": "string",
399
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
400
+ },
401
+ "alert_number": {
402
+ "type": "number",
403
+ "description": "The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation."
404
+ },
405
+ "target_ref": {
406
+ "type": "string",
407
+ "description": "The Git reference of target branch for the commit. Branch needs to already exist. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation."
408
+ },
409
+ "message": {
410
+ "type": "string",
411
+ "description": "Commit message to be used."
412
+ }
413
+ },
414
+ "required": [
415
+ "owner",
416
+ "repo",
417
+ "alert_number"
418
+ ]
419
+ }
420
+ },
421
+ {
422
+ "name": "code_scanning_list_alert_instances",
423
+ "description": "List instances of a code scanning alert",
424
+ "method": "GET",
425
+ "path": "/repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",
426
+ "deleteSendsJsonBody": false,
427
+ "inputSchema": {
428
+ "type": "object",
429
+ "properties": {
430
+ "owner": {
431
+ "type": "string",
432
+ "description": "The account owner of the repository. The name is not case sensitive."
433
+ },
434
+ "repo": {
435
+ "type": "string",
436
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
437
+ },
438
+ "alert_number": {
439
+ "type": "number",
440
+ "description": "The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation."
441
+ },
442
+ "page": {
443
+ "type": "number",
444
+ "description": "The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
445
+ },
446
+ "per_page": {
447
+ "type": "number",
448
+ "description": "The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
449
+ },
450
+ "ref": {
451
+ "type": "string",
452
+ "description": "The Git reference for the results you want to list. The `ref` for a branch can be formatted either as `refs/heads/<branch name>` or simply `<branch name>`. To reference a pull request use `refs/pull/<number>/merge`."
453
+ },
454
+ "pr": {
455
+ "type": "number",
456
+ "description": "The number of the pull request for the results you want to list."
457
+ }
458
+ },
459
+ "required": [
460
+ "owner",
461
+ "repo",
462
+ "alert_number"
463
+ ]
464
+ }
465
+ },
466
+ {
467
+ "name": "code_scanning_list_recent_analyses",
468
+ "description": "List code scanning analyses for a repository",
469
+ "method": "GET",
470
+ "path": "/repos/{owner}/{repo}/code-scanning/analyses",
471
+ "deleteSendsJsonBody": false,
472
+ "inputSchema": {
473
+ "type": "object",
474
+ "properties": {
475
+ "owner": {
476
+ "type": "string",
477
+ "description": "The account owner of the repository. The name is not case sensitive."
478
+ },
479
+ "repo": {
480
+ "type": "string",
481
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
482
+ },
483
+ "tool_name": {
484
+ "type": "string",
485
+ "description": "The name of a code scanning tool. Only results by this tool will be listed. You can specify the tool by using either `tool_name` or `tool_guid`, but not both."
486
+ },
487
+ "tool_guid": {
488
+ "type": "string",
489
+ "description": "The GUID of a code scanning tool. Only results by this tool will be listed. Note that some code scanning tools may not include a GUID in their analysis data. You can specify the tool by using either `tool_guid` or `tool_name`, but not both."
490
+ },
491
+ "page": {
492
+ "type": "number",
493
+ "description": "The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
494
+ },
495
+ "per_page": {
496
+ "type": "number",
497
+ "description": "The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\""
498
+ },
499
+ "pr": {
500
+ "type": "number",
501
+ "description": "The number of the pull request for the results you want to list."
502
+ },
503
+ "ref": {
504
+ "type": "string",
505
+ "description": "The Git reference for the analyses you want to list. The `ref` for a branch can be formatted either as `refs/heads/<branch name>` or simply `<branch name>`. To reference a pull request use `refs/pull/<number>/merge`."
506
+ },
507
+ "sarif_id": {
508
+ "type": "string",
509
+ "description": "Filter analyses belonging to the same SARIF upload."
510
+ },
511
+ "direction": {
512
+ "type": "string",
513
+ "description": "The direction to sort the results by.",
514
+ "enum": [
515
+ "asc",
516
+ "desc"
517
+ ]
518
+ },
519
+ "sort": {
520
+ "type": "string",
521
+ "description": "The property by which to sort the results.",
522
+ "enum": [
523
+ "created"
524
+ ]
525
+ }
526
+ },
527
+ "required": [
528
+ "owner",
529
+ "repo"
530
+ ]
531
+ }
532
+ },
533
+ {
534
+ "name": "code_scanning_get_analysis",
535
+ "description": "Get a code scanning analysis for a repository",
536
+ "method": "GET",
537
+ "path": "/repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}",
538
+ "deleteSendsJsonBody": false,
539
+ "inputSchema": {
540
+ "type": "object",
541
+ "properties": {
542
+ "owner": {
543
+ "type": "string",
544
+ "description": "The account owner of the repository. The name is not case sensitive."
545
+ },
546
+ "repo": {
547
+ "type": "string",
548
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
549
+ },
550
+ "analysis_id": {
551
+ "type": "number",
552
+ "description": "The ID of the analysis, as returned from the `GET /repos/{owner}/{repo}/code-scanning/analyses` operation."
553
+ }
554
+ },
555
+ "required": [
556
+ "owner",
557
+ "repo",
558
+ "analysis_id"
559
+ ]
560
+ }
561
+ },
562
+ {
563
+ "name": "code_scanning_delete_analysis",
564
+ "description": "Delete a code scanning analysis from a repository",
565
+ "method": "DELETE",
566
+ "path": "/repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}",
567
+ "deleteSendsJsonBody": false,
568
+ "inputSchema": {
569
+ "type": "object",
570
+ "properties": {
571
+ "owner": {
572
+ "type": "string",
573
+ "description": "The account owner of the repository. The name is not case sensitive."
574
+ },
575
+ "repo": {
576
+ "type": "string",
577
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
578
+ },
579
+ "analysis_id": {
580
+ "type": "number",
581
+ "description": "The ID of the analysis, as returned from the `GET /repos/{owner}/{repo}/code-scanning/analyses` operation."
582
+ },
583
+ "confirm_delete": {
584
+ "type": "string",
585
+ "description": "Allow deletion if the specified analysis is the last in a set. If you attempt to delete the final analysis in a set without setting this parameter to `true`, you'll get a 400 response with the message: `Analysis is last of its type and deletion may result in the loss of historical alert data. Please specify confirm_delete.`"
586
+ }
587
+ },
588
+ "required": [
589
+ "owner",
590
+ "repo",
591
+ "analysis_id"
592
+ ]
593
+ }
594
+ },
595
+ {
596
+ "name": "code_scanning_list_codeql_databases",
597
+ "description": "List CodeQL databases for a repository",
598
+ "method": "GET",
599
+ "path": "/repos/{owner}/{repo}/code-scanning/codeql/databases",
600
+ "deleteSendsJsonBody": false,
601
+ "inputSchema": {
602
+ "type": "object",
603
+ "properties": {
604
+ "owner": {
605
+ "type": "string",
606
+ "description": "The account owner of the repository. The name is not case sensitive."
607
+ },
608
+ "repo": {
609
+ "type": "string",
610
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
611
+ }
612
+ },
613
+ "required": [
614
+ "owner",
615
+ "repo"
616
+ ]
617
+ }
618
+ },
619
+ {
620
+ "name": "code_scanning_get_codeql_database",
621
+ "description": "Get a CodeQL database for a repository",
622
+ "method": "GET",
623
+ "path": "/repos/{owner}/{repo}/code-scanning/codeql/databases/{language}",
624
+ "deleteSendsJsonBody": false,
625
+ "inputSchema": {
626
+ "type": "object",
627
+ "properties": {
628
+ "owner": {
629
+ "type": "string",
630
+ "description": "The account owner of the repository. The name is not case sensitive."
631
+ },
632
+ "repo": {
633
+ "type": "string",
634
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
635
+ },
636
+ "language": {
637
+ "type": "string",
638
+ "description": "The language of the CodeQL database."
639
+ }
640
+ },
641
+ "required": [
642
+ "owner",
643
+ "repo",
644
+ "language"
645
+ ]
646
+ }
647
+ },
648
+ {
649
+ "name": "code_scanning_delete_codeql_database",
650
+ "description": "Delete a CodeQL database",
651
+ "method": "DELETE",
652
+ "path": "/repos/{owner}/{repo}/code-scanning/codeql/databases/{language}",
653
+ "deleteSendsJsonBody": false,
654
+ "inputSchema": {
655
+ "type": "object",
656
+ "properties": {
657
+ "owner": {
658
+ "type": "string",
659
+ "description": "The account owner of the repository. The name is not case sensitive."
660
+ },
661
+ "repo": {
662
+ "type": "string",
663
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
664
+ },
665
+ "language": {
666
+ "type": "string",
667
+ "description": "The language of the CodeQL database."
668
+ }
669
+ },
670
+ "required": [
671
+ "owner",
672
+ "repo",
673
+ "language"
674
+ ]
675
+ }
676
+ },
677
+ {
678
+ "name": "code_scanning_create_variant_analysis",
679
+ "description": "Create a CodeQL variant analysis",
680
+ "method": "POST",
681
+ "path": "/repos/{owner}/{repo}/code-scanning/codeql/variant-analyses",
682
+ "deleteSendsJsonBody": false,
683
+ "inputSchema": {
684
+ "type": "object",
685
+ "properties": {
686
+ "owner": {
687
+ "type": "string",
688
+ "description": "The account owner of the repository. The name is not case sensitive."
689
+ },
690
+ "repo": {
691
+ "type": "string",
692
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
693
+ },
694
+ "language": {
695
+ "type": "string",
696
+ "description": "The language targeted by the CodeQL query",
697
+ "enum": [
698
+ "actions",
699
+ "cpp",
700
+ "csharp",
701
+ "go",
702
+ "java",
703
+ "javascript",
704
+ "python",
705
+ "ruby",
706
+ "rust",
707
+ "swift"
708
+ ]
709
+ },
710
+ "query_pack": {
711
+ "type": "string",
712
+ "description": "A Base64-encoded tarball containing a CodeQL query and all its dependencies"
713
+ },
714
+ "repositories": {
715
+ "type": "array",
716
+ "description": "List of repository names (in the form `owner/repo-name`) to run the query against. Precisely one property from `repositories`, `repository_lists` and `repository_owners` is required."
717
+ },
718
+ "repository_lists": {
719
+ "type": "array",
720
+ "description": "List of repository lists to run the query against. Precisely one property from `repositories`, `repository_lists` and `repository_owners` is required."
721
+ },
722
+ "repository_owners": {
723
+ "type": "array",
724
+ "description": "List of organization or user names whose repositories the query should be run against. Precisely one property from `repositories`, `repository_lists` and `repository_owners` is required."
725
+ }
726
+ },
727
+ "required": [
728
+ "owner",
729
+ "repo",
730
+ "language",
731
+ "query_pack"
732
+ ]
733
+ }
734
+ },
735
+ {
736
+ "name": "code_scanning_get_variant_analysis",
737
+ "description": "Get the summary of a CodeQL variant analysis",
738
+ "method": "GET",
739
+ "path": "/repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}",
740
+ "deleteSendsJsonBody": false,
741
+ "inputSchema": {
742
+ "type": "object",
743
+ "properties": {
744
+ "owner": {
745
+ "type": "string",
746
+ "description": "The account owner of the repository. The name is not case sensitive."
747
+ },
748
+ "repo": {
749
+ "type": "string",
750
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
751
+ },
752
+ "codeql_variant_analysis_id": {
753
+ "type": "number",
754
+ "description": "The unique identifier of the variant analysis."
755
+ }
756
+ },
757
+ "required": [
758
+ "owner",
759
+ "repo",
760
+ "codeql_variant_analysis_id"
761
+ ]
762
+ }
763
+ },
764
+ {
765
+ "name": "code_scanning_get_variant_analysis_repo_task",
766
+ "description": "Get the analysis status of a repository in a CodeQL variant analysis",
767
+ "method": "GET",
768
+ "path": "/repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}",
769
+ "deleteSendsJsonBody": false,
770
+ "inputSchema": {
771
+ "type": "object",
772
+ "properties": {
773
+ "owner": {
774
+ "type": "string",
775
+ "description": "The account owner of the repository. The name is not case sensitive."
776
+ },
777
+ "repo": {
778
+ "type": "string",
779
+ "description": "The name of the controller repository."
780
+ },
781
+ "codeql_variant_analysis_id": {
782
+ "type": "number",
783
+ "description": "The ID of the variant analysis."
784
+ },
785
+ "repo_owner": {
786
+ "type": "string",
787
+ "description": "The account owner of the variant analysis repository. The name is not case sensitive."
788
+ },
789
+ "repo_name": {
790
+ "type": "string",
791
+ "description": "The name of the variant analysis repository."
792
+ }
793
+ },
794
+ "required": [
795
+ "owner",
796
+ "repo",
797
+ "codeql_variant_analysis_id",
798
+ "repo_owner",
799
+ "repo_name"
800
+ ]
801
+ }
802
+ },
803
+ {
804
+ "name": "code_scanning_get_default_setup",
805
+ "description": "Get a code scanning default setup configuration",
806
+ "method": "GET",
807
+ "path": "/repos/{owner}/{repo}/code-scanning/default-setup",
808
+ "deleteSendsJsonBody": false,
809
+ "inputSchema": {
810
+ "type": "object",
811
+ "properties": {
812
+ "owner": {
813
+ "type": "string",
814
+ "description": "The account owner of the repository. The name is not case sensitive."
815
+ },
816
+ "repo": {
817
+ "type": "string",
818
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
819
+ }
820
+ },
821
+ "required": [
822
+ "owner",
823
+ "repo"
824
+ ]
825
+ }
826
+ },
827
+ {
828
+ "name": "code_scanning_update_default_setup",
829
+ "description": "Update a code scanning default setup configuration",
830
+ "method": "PATCH",
831
+ "path": "/repos/{owner}/{repo}/code-scanning/default-setup",
832
+ "deleteSendsJsonBody": false,
833
+ "inputSchema": {
834
+ "type": "object",
835
+ "properties": {
836
+ "owner": {
837
+ "type": "string",
838
+ "description": "The account owner of the repository. The name is not case sensitive."
839
+ },
840
+ "repo": {
841
+ "type": "string",
842
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
843
+ },
844
+ "state": {
845
+ "type": "string",
846
+ "description": "The desired state of code scanning default setup.",
847
+ "enum": [
848
+ "configured",
849
+ "not-configured"
850
+ ]
851
+ },
852
+ "runner_type": {
853
+ "type": "string",
854
+ "description": "Runner type to be used.",
855
+ "enum": [
856
+ "standard",
857
+ "labeled"
858
+ ]
859
+ },
860
+ "runner_label": {
861
+ "type": "string",
862
+ "description": "Runner label to be used if the runner type is labeled."
863
+ },
864
+ "query_suite": {
865
+ "type": "string",
866
+ "description": "CodeQL query suite to be used.",
867
+ "enum": [
868
+ "default",
869
+ "extended"
870
+ ]
871
+ },
872
+ "threat_model": {
873
+ "type": "string",
874
+ "description": "Threat model to be used for code scanning analysis. Use `remote` to analyze only network sources and `remote_and_local` to include local sources like filesystem access, command-line arguments, database reads, environment variable and standard input.",
875
+ "enum": [
876
+ "remote",
877
+ "remote_and_local"
878
+ ]
879
+ },
880
+ "languages": {
881
+ "type": "array",
882
+ "description": "CodeQL languages to be analyzed."
883
+ }
884
+ },
885
+ "required": [
886
+ "owner",
887
+ "repo"
888
+ ]
889
+ }
890
+ },
891
+ {
892
+ "name": "code_scanning_upload_sarif",
893
+ "description": "Upload an analysis as SARIF data",
894
+ "method": "POST",
895
+ "path": "/repos/{owner}/{repo}/code-scanning/sarifs",
896
+ "deleteSendsJsonBody": false,
897
+ "inputSchema": {
898
+ "type": "object",
899
+ "properties": {
900
+ "owner": {
901
+ "type": "string",
902
+ "description": "The account owner of the repository. The name is not case sensitive."
903
+ },
904
+ "repo": {
905
+ "type": "string",
906
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
907
+ },
908
+ "commit_sha": {
909
+ "type": "string",
910
+ "description": "The SHA of the commit to which the analysis you are uploading relates."
911
+ },
912
+ "ref": {
913
+ "type": "string",
914
+ "description": "The full Git reference, formatted as `refs/heads/<branch name>`,\n`refs/tags/<tag>`, `refs/pull/<number>/merge`, or `refs/pull/<number>/head`."
915
+ },
916
+ "sarif": {
917
+ "type": "string",
918
+ "description": "A Base64 string representing the SARIF file to upload. You must first compress your SARIF file using [`gzip`](http://www.gnu.org/software/gzip/manual/gzip.html) and then translate the contents of the file into a Base64 encoding string. For more information, see \"[SARIF support for code scanning](https://docs.github.com/code-security/secure-coding/sarif-support-for-code-scanning).\""
919
+ },
920
+ "checkout_uri": {
921
+ "type": "string",
922
+ "description": "The base directory used in the analysis, as it appears in the SARIF file.\nThis property is used to convert file paths from absolute to relative, so that alerts can be mapped to their correct location in the repository."
923
+ },
924
+ "started_at": {
925
+ "type": "string",
926
+ "description": "The time that the analysis run began. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`."
927
+ },
928
+ "tool_name": {
929
+ "type": "string",
930
+ "description": "The name of the tool used to generate the code scanning analysis. If this parameter is not used, the tool name defaults to \"API\". If the uploaded SARIF contains a tool GUID, this will be available for filtering using the `tool_guid` parameter of operations such as `GET /repos/{owner}/{repo}/code-scanning/alerts`."
931
+ },
932
+ "validate": {
933
+ "type": "boolean",
934
+ "description": "Whether the SARIF file will be validated according to the code scanning specifications.\nThis parameter is intended to help integrators ensure that the uploaded SARIF files are correctly rendered by code scanning."
935
+ }
936
+ },
937
+ "required": [
938
+ "owner",
939
+ "repo",
940
+ "commit_sha",
941
+ "ref",
942
+ "sarif"
943
+ ]
944
+ }
945
+ },
946
+ {
947
+ "name": "code_scanning_get_sarif",
948
+ "description": "Get information about a SARIF upload",
949
+ "method": "GET",
950
+ "path": "/repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}",
951
+ "deleteSendsJsonBody": false,
952
+ "inputSchema": {
953
+ "type": "object",
954
+ "properties": {
955
+ "owner": {
956
+ "type": "string",
957
+ "description": "The account owner of the repository. The name is not case sensitive."
958
+ },
959
+ "repo": {
960
+ "type": "string",
961
+ "description": "The name of the repository without the `.git` extension. The name is not case sensitive."
962
+ },
963
+ "sarif_id": {
964
+ "type": "string",
965
+ "description": "The SARIF ID obtained after uploading."
966
+ }
967
+ },
968
+ "required": [
969
+ "owner",
970
+ "repo",
971
+ "sarif_id"
972
+ ]
973
+ }
974
+ }
975
+ ];
976
+
977
+ export const tools = ENDPOINTS.map((e) => ({
978
+ name: e.name,
979
+ description: e.description,
980
+ method: e.method,
981
+ path: e.path,
982
+ deleteSendsJsonBody: Boolean(e.deleteSendsJsonBody),
983
+ inputSchema: e.inputSchema,
984
+ handler: async (params) => ({
985
+ content: [{ type: 'text', text: JSON.stringify(await apiRequest(e.method, e.path, params, { deleteSendsJsonBody: e.deleteSendsJsonBody }), null, 2) }],
986
+ }),
987
+ }));