@arbium/enterprise-agent-connect 0.2.0 → 0.2.1-dev.7b4e802

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 (68) hide show
  1. package/README.md +10 -3
  2. package/dist/connectors/adestra/connector.json +336 -0
  3. package/dist/connectors/adobe-admin-console/connector.json +212 -0
  4. package/dist/connectors/argo-cd/connector.json +210 -0
  5. package/dist/connectors/automox/connector.json +376 -0
  6. package/dist/connectors/churnzero/connector.json +238 -0
  7. package/dist/connectors/confluence/connector.json +168 -0
  8. package/dist/connectors/cvent/connector.json +287 -0
  9. package/dist/connectors/datadog/connector.json +188 -0
  10. package/dist/connectors/drata/connector.json +447 -0
  11. package/dist/connectors/druva/connector.json +258 -0
  12. package/dist/connectors/forsta-decipher/connector.json +164 -0
  13. package/dist/connectors/gitlab/connector.json +263 -0
  14. package/dist/connectors/grafana/connector.json +162 -0
  15. package/dist/connectors/http/index.d.ts +5 -1
  16. package/dist/connectors/http/index.js +62 -8
  17. package/dist/connectors/http/index.js.map +1 -1
  18. package/dist/connectors/http/openapi.d.ts +62 -0
  19. package/dist/connectors/http/openapi.js +342 -0
  20. package/dist/connectors/http/openapi.js.map +1 -0
  21. package/dist/connectors/intercom/connector.json +249 -0
  22. package/dist/connectors/lusha/connector.json +59 -0
  23. package/dist/connectors/lusha/index.d.ts +8 -0
  24. package/dist/connectors/lusha/index.js +7 -0
  25. package/dist/connectors/lusha/index.js.map +1 -0
  26. package/dist/connectors/lusha/tools.d.ts +2 -0
  27. package/dist/connectors/lusha/tools.js +113 -0
  28. package/dist/connectors/lusha/tools.js.map +1 -0
  29. package/dist/connectors/lusha/vendor.d.ts +4 -0
  30. package/dist/connectors/lusha/vendor.js +72 -0
  31. package/dist/connectors/lusha/vendor.js.map +1 -0
  32. package/dist/connectors/odata/index.js +12 -5
  33. package/dist/connectors/odata/index.js.map +1 -1
  34. package/dist/connectors/pagerduty/connector.json +247 -0
  35. package/dist/connectors/qualys/connector.json +271 -0
  36. package/dist/connectors/safebase/connector.json +221 -0
  37. package/dist/connectors/soap/index.js +4 -3
  38. package/dist/connectors/soap/index.js.map +1 -1
  39. package/dist/connectors/sonarqube/connector.json +165 -0
  40. package/dist/connectors/sprout-social/connector.json +158 -0
  41. package/dist/connectors/synthesia/connector.json +113 -0
  42. package/dist/connectors/wordpress/connector.json +203 -0
  43. package/dist/connectors/zephyr/connector.json +192 -0
  44. package/dist/packages/connector-kit/src/connector.d.ts +45 -7
  45. package/dist/packages/connector-kit/src/connector.js +113 -10
  46. package/dist/packages/connector-kit/src/connector.js.map +1 -1
  47. package/dist/packages/connector-kit/src/oauth.d.ts +2 -0
  48. package/dist/packages/connector-kit/src/oauth.js +12 -4
  49. package/dist/packages/connector-kit/src/oauth.js.map +1 -1
  50. package/dist/packages/server/migrations/0008_internal_apps.sql +16 -0
  51. package/dist/packages/server/migrations/rollback/to-legacy.sql +2 -0
  52. package/dist/packages/server/src/api.d.ts +2490 -277
  53. package/dist/packages/server/src/api.js +82 -1
  54. package/dist/packages/server/src/api.js.map +1 -1
  55. package/dist/packages/server/src/app.js +26 -1
  56. package/dist/packages/server/src/app.js.map +1 -1
  57. package/dist/packages/server/src/builtin.d.ts +3 -0
  58. package/dist/packages/server/src/builtin.js +32 -0
  59. package/dist/packages/server/src/builtin.js.map +1 -1
  60. package/dist/packages/server/src/index.js +27 -18
  61. package/dist/packages/server/src/index.js.map +1 -1
  62. package/dist/packages/server/src/service.d.ts +1113 -0
  63. package/dist/packages/server/src/service.js +257 -19
  64. package/dist/packages/server/src/service.js.map +1 -1
  65. package/dist/packages/server/src/store.d.ts +41 -1
  66. package/dist/packages/server/src/store.js +79 -0
  67. package/dist/packages/server/src/store.js.map +1 -1
  68. package/package.json +1 -1
package/README.md CHANGED
@@ -6,7 +6,8 @@ agent's grants and written to an audit log. Agents never hold the apps' credenti
6
6
 
7
7
  - **Built-in apps:** Jira, Microsoft 365 (Outlook mail and calendar, SharePoint files and Excel,
8
8
  Teams, Entra ID, Intune, Dynamics 365), Jamf Pro, Okta, Slack, Salesforce, Gong, SAP S/4HANA,
9
- Oracle NetSuite, ServiceNow, Workday, FedEx, Dell TechDirect.
9
+ Oracle NetSuite, ServiceNow, Workday, FedEx, Dell TechDirect, GitLab, Argo CD, SonarQube,
10
+ Datadog, PagerDuty, Grafana, Zephyr Scale, Confluence.
10
11
  - **Your own apps without code:** describe an internal REST API or a SaaS app's in one
11
12
  `connector.json`, or draft one from its OpenAPI spec
12
13
  ([docs/http-connector.md](docs/http-connector.md)); a SOAP service
@@ -185,6 +186,10 @@ const orders: ConnectorJson = {
185
186
  };
186
187
  ```
187
188
 
189
+ **Your own app, per organization.** Each organization can add its own apps through the admin
190
+ API, as many as it wants, without a restart: see [Add internal apps through the admin
191
+ API](docs/http-connector.md#add-internal-apps-through-the-admin-api).
192
+
188
193
  **Your own app, as code.** Build a `ConnectorModule` on the connector kit and give it its
189
194
  definition as `connector` ([docs/connectors.md](docs/connectors.md)). `create` gets a
190
195
  `ConnectorContext`, `{ connector }`: the definition parsed, with the branding filled in.
@@ -244,12 +249,14 @@ authority signed, name a ConfigMap or Secret holding its bundle in `caBundle`
244
249
  migrations) and its tests
245
250
  - `packages/connector-kit`: what a connector builds on (schemas, tool helpers, vendor types)
246
251
  - `packages/client`: typed admin API client
247
- - `connectors/<app>`: one folder per app: `connector.json`, `index.ts`, `tools.ts`, `vendor.ts`
252
+ - `connectors/<app>`: one folder per app: `connector.json`, and for apps with code `index.ts`,
253
+ `tools.ts`, `vendor.ts`
248
254
  - `connectors/http`, `connectors/soap`, `connectors/odata`, `connectors/sql`: run any app
249
255
  described only in its `connector.json` (docs/http-connector.md, docs/soap-connector.md,
250
256
  docs/odata-connector.md, docs/sql-connector.md)
251
257
  - `examples/internal-app`: a small internal API and its connector, for the quick start
252
- - `scripts/openapi-to-connector.ts`: drafts an http connector from an OpenAPI 3.x spec
258
+ - `scripts/openapi-to-connector.ts`: drafts an http connector from an OpenAPI 3.x spec (the
259
+ drafting itself is `connectors/http/openapi.ts`, also behind the admin API's internal app drafts)
253
260
  - `examples/legacy-apps`: a SOAP and an SAP OData connector, described only in JSON
254
261
  - `scripts/wsdl-to-connector.ts`, `scripts/odata-to-connector.ts`: draft a connector from a WSDL
255
262
  or an OData `$metadata`
@@ -0,0 +1,336 @@
1
+ {
2
+ "id": "adestra",
3
+ "name": "Adestra",
4
+ "description": "Let agents draft email campaigns in Adestra: find projects and campaigns, write the subject line and content, and send the campaign to your approvers. Agents never launch a campaign to a list. For staging campaigns and invitations for people to review.",
5
+ "logo": "/brand/registry/adestra.svg",
6
+ "identity": "An Adestra API token. It acts as the Adestra user who created it, with that user's workspaces and access rights, so make a user for agents with only the workspaces they need.",
7
+ "accountKey": "host",
8
+ "connectionKind": "guided",
9
+ "setup": [
10
+ {
11
+ "title": "Make a user for agents",
12
+ "body": "An API token acts as the user who creates it. Make a separate Adestra user for agents, give it read and write API access and only the workspaces agents should draft in. Ask Adestra support to turn on API access for the user if the option is missing.",
13
+ "link": {
14
+ "label": "Adestra: API access and tokens",
15
+ "href": "https://app.adestra.com/doc/page/current/index/api"
16
+ }
17
+ },
18
+ {
19
+ "title": "Create an API token",
20
+ "body": "Sign in to Adestra as the agents' user. You can test the token with the command below: it shows the user the token belongs to and changes nothing.",
21
+ "click": [
22
+ "Select your user icon in the title bar to open your user panel.",
23
+ "Select Manage API tokens.",
24
+ "Press Create new API token, enter a name such as Agents and, if you like, a description.",
25
+ "Press Create and copy the new token."
26
+ ],
27
+ "copy": [
28
+ "curl -s -H \"Authorization: TOKEN $ADESTRA_TOKEN\" https://app.adestra.com/api/rest/1/users/self"
29
+ ],
30
+ "shell": "bash"
31
+ }
32
+ ],
33
+ "afterConnect": [],
34
+ "fields": [{ "id": "api_token", "label": "API token", "secret": true }],
35
+ "capabilities": [
36
+ {
37
+ "id": "read_campaigns",
38
+ "label": "Read campaigns",
39
+ "description": "Find projects and campaigns, and read a campaign's details, options such as the subject line and sender, and its HTML or text content.",
40
+ "required": true,
41
+ "note": "Reaches every project and campaign the agents' user can see, unless you keep a key to chosen projects under API keys. Read-only.",
42
+ "scopes": [],
43
+ "permissions": [],
44
+ "tools": [
45
+ "adestra_list_projects",
46
+ "adestra_search_campaigns",
47
+ "adestra_get_campaign",
48
+ "adestra_get_campaign_options",
49
+ "adestra_get_message"
50
+ ]
51
+ },
52
+ {
53
+ "id": "draft_campaigns",
54
+ "label": "Draft campaigns",
55
+ "description": "Create campaigns, rename them or change their list, set options such as the subject line and sender, and write their HTML or text content.",
56
+ "note": "Can change any campaign the agents' user can edit, including ones people wrote. Nothing here launches a campaign.",
57
+ "scopes": [],
58
+ "permissions": [],
59
+ "tools": [
60
+ "adestra_create_campaign",
61
+ "adestra_update_campaign",
62
+ "adestra_set_campaign_option",
63
+ "adestra_set_message"
64
+ ]
65
+ },
66
+ {
67
+ "id": "request_approval",
68
+ "label": "Ask for approval",
69
+ "description": "Send a campaign to one of your Adestra approval groups for review.",
70
+ "note": "Approvers decide whether it is launched. Agents cannot ask for it to be launched once approved.",
71
+ "scopes": [],
72
+ "permissions": [],
73
+ "tools": ["adestra_request_approval"]
74
+ },
75
+ {
76
+ "id": "send_tests",
77
+ "label": "Send test emails",
78
+ "description": "Email a test of a campaign to chosen addresses.",
79
+ "destructive": true,
80
+ "note": "A test is a real email. Keep a key to your own team's addresses under API keys.",
81
+ "scopes": [],
82
+ "permissions": [],
83
+ "tools": ["adestra_send_test"]
84
+ }
85
+ ],
86
+ "limits": [
87
+ {
88
+ "id": "projects",
89
+ "label": "Projects",
90
+ "help": "Optional: only these Adestra projects (their ids) when finding and creating campaigns and reading a campaign's details. A campaign's options and content, and changes to a campaign by its id, are not checked against this. Leave empty for every project.",
91
+ "kind": "list",
92
+ "required": false,
93
+ "pattern": "^\\d{1,12}$"
94
+ },
95
+ {
96
+ "id": "test_addresses",
97
+ "label": "Test email addresses",
98
+ "help": "Optional: the only addresses tests may be sent to. Leave empty for any address.",
99
+ "kind": "list",
100
+ "required": false,
101
+ "pattern": "^[^@\\s]+@[^@\\s]+$"
102
+ }
103
+ ],
104
+ "verify": {
105
+ "method": "GET",
106
+ "path": "/users/self",
107
+ "label": "Adestra user",
108
+ "show": "email"
109
+ },
110
+ "discover": {
111
+ "method": "GET",
112
+ "path": "/projects",
113
+ "label": "Projects",
114
+ "show": "projects[].id",
115
+ "name": "projects[].name"
116
+ },
117
+ "revoke": "In Adestra, open the agents' user panel, select Manage API tokens and delete the token. Agents lose access to Adestra at once.",
118
+ "http": {
119
+ "baseUrl": "https://app.adestra.com/api/rest/1",
120
+ "auth": { "type": "header", "header": "Authorization", "prefix": "TOKEN ", "value": "api_token" },
121
+ "tools": [
122
+ {
123
+ "name": "adestra_list_projects",
124
+ "description": "List Adestra projects (which hold campaigns), or only those in one workspace or with a name.",
125
+ "method": "GET",
126
+ "path": "/projects",
127
+ "params": {
128
+ "workspace_id": {
129
+ "type": "integer",
130
+ "description": "Only projects in this workspace",
131
+ "in": "query",
132
+ "name": "search:workspace_id",
133
+ "required": false
134
+ },
135
+ "name": {
136
+ "type": "string",
137
+ "description": "Only projects with exactly this name",
138
+ "in": "query",
139
+ "name": "search:name",
140
+ "required": false
141
+ },
142
+ "page": {
143
+ "type": "integer",
144
+ "description": "Page of results, from 1 (250 per page)",
145
+ "in": "query",
146
+ "name": "paging:page",
147
+ "required": false
148
+ }
149
+ },
150
+ "result": { "items": "projects", "fields": ["id", "name", "description", "workspace_id"] }
151
+ },
152
+ {
153
+ "name": "adestra_search_campaigns",
154
+ "description": "Find campaigns in a project, by name, or by whether they were launched.",
155
+ "method": "GET",
156
+ "path": "/campaigns",
157
+ "params": {
158
+ "project_id": {
159
+ "type": "integer",
160
+ "description": "Only campaigns in this project",
161
+ "in": "query",
162
+ "name": "search:project_id",
163
+ "required": false,
164
+ "limit": "projects"
165
+ },
166
+ "name": {
167
+ "type": "string",
168
+ "description": "Only campaigns with exactly this name",
169
+ "in": "query",
170
+ "name": "search:name",
171
+ "required": false
172
+ },
173
+ "launched": {
174
+ "type": "boolean",
175
+ "description": "Only launched (true) or not yet launched (false) campaigns",
176
+ "in": "query",
177
+ "name": "search:launched",
178
+ "required": false
179
+ },
180
+ "page": {
181
+ "type": "integer",
182
+ "description": "Page of results, from 1",
183
+ "in": "query",
184
+ "name": "paging:page",
185
+ "required": false
186
+ },
187
+ "page_size": {
188
+ "type": "integer",
189
+ "description": "Results per page, up to 250",
190
+ "in": "query",
191
+ "name": "paging:page_size",
192
+ "default": 50
193
+ }
194
+ },
195
+ "result": {
196
+ "items": "campaigns",
197
+ "fields": ["id", "name", "description", "project_id", "list_id", "subject_line", "published", "launched", "edited_date"]
198
+ }
199
+ },
200
+ {
201
+ "name": "adestra_get_campaign",
202
+ "description": "Read one campaign: name, project, list, subject line and whether it was published or launched.",
203
+ "method": "GET",
204
+ "path": "/campaigns/{campaign_id}",
205
+ "params": {
206
+ "campaign_id": { "type": "integer", "description": "The campaign id", "in": "path" }
207
+ },
208
+ "answerLimits": [{ "field": "project_id", "limit": "projects" }]
209
+ },
210
+ {
211
+ "name": "adestra_get_campaign_options",
212
+ "description": "Read a campaign's options, such as subject line, sender and reply names and addresses, and unsubscribe list.",
213
+ "method": "GET",
214
+ "path": "/campaigns/{campaign_id}/options",
215
+ "params": {
216
+ "campaign_id": { "type": "integer", "description": "The campaign id", "in": "path" }
217
+ }
218
+ },
219
+ {
220
+ "name": "adestra_get_message",
221
+ "description": "Read a campaign's HTML or text content.",
222
+ "method": "GET",
223
+ "path": "/campaigns/{campaign_id}/message/{type}",
224
+ "params": {
225
+ "campaign_id": { "type": "integer", "description": "The campaign id", "in": "path" },
226
+ "type": { "type": "string", "enum": ["html", "text"], "description": "Which part: html or text", "in": "path" }
227
+ }
228
+ },
229
+ {
230
+ "name": "adestra_create_campaign",
231
+ "description": "Create a campaign in a project. It is not launched; set its options and content next.",
232
+ "method": "POST",
233
+ "path": "/campaigns",
234
+ "params": {
235
+ "name": { "type": "string", "description": "Campaign name, up to 255 bytes", "in": "body" },
236
+ "project_id": {
237
+ "type": "integer",
238
+ "description": "The project to create it in",
239
+ "in": "body",
240
+ "limit": "projects"
241
+ },
242
+ "description": { "type": "string", "description": "What the campaign is for", "in": "body", "required": false },
243
+ "list_id": { "type": "integer", "description": "The list it will go to", "in": "body", "required": false },
244
+ "apply_user_defaults": {
245
+ "type": "boolean",
246
+ "description": "Apply the user's campaign preferences and presets",
247
+ "in": "query",
248
+ "name": "options:apply_user_defaults",
249
+ "default": true
250
+ }
251
+ },
252
+ "result": { "fields": ["id", "name", "project_id", "list_id"] }
253
+ },
254
+ {
255
+ "name": "adestra_update_campaign",
256
+ "description": "Rename a campaign, change its description or the list it will go to. Values left out stay as they are.",
257
+ "method": "PUT",
258
+ "path": "/campaigns/{campaign_id}",
259
+ "params": {
260
+ "campaign_id": { "type": "integer", "description": "The campaign id", "in": "path" },
261
+ "name": { "type": "string", "description": "New name", "in": "body", "required": false },
262
+ "description": { "type": "string", "description": "New description", "in": "body", "required": false },
263
+ "list_id": { "type": "integer", "description": "New list id", "in": "body", "required": false }
264
+ },
265
+ "result": { "fields": ["id", "name", "project_id", "list_id"] }
266
+ },
267
+ {
268
+ "name": "adestra_set_campaign_option",
269
+ "description": "Set the campaign's subject line, sender name or reply name.",
270
+ "method": "PUT",
271
+ "path": "/campaigns/{campaign_id}/options",
272
+ "params": {
273
+ "campaign_id": { "type": "integer", "description": "The campaign id", "in": "path" },
274
+ "name": {
275
+ "type": "string",
276
+ "description": "Which option",
277
+ "in": "body",
278
+ "enum": ["subject_line", "from_name", "reply_name"]
279
+ },
280
+ "value": { "type": "string", "description": "Option value", "in": "body" }
281
+ }
282
+ },
283
+ {
284
+ "name": "adestra_set_message",
285
+ "description": "Write a campaign's HTML or text content, replacing what is there.",
286
+ "method": "PUT",
287
+ "path": "/campaigns/{campaign_id}/message/{type}",
288
+ "params": {
289
+ "campaign_id": { "type": "integer", "description": "The campaign id", "in": "path" },
290
+ "type": { "type": "string", "enum": ["html", "text"], "description": "Which part: html or text", "in": "path" },
291
+ "content": { "type": "string", "description": "The HTML or text content", "in": "body" }
292
+ },
293
+ "result": { "fields": ["campaign_id", "type"] }
294
+ },
295
+ {
296
+ "name": "adestra_request_approval",
297
+ "description": "Send a campaign to an approval group for review. Approvers are told when notify_approvers is true.",
298
+ "method": "POST",
299
+ "path": "/campaigns/{campaign_id}/request_approval/{approval_group_id}",
300
+ "params": {
301
+ "campaign_id": { "type": "integer", "description": "The campaign id", "in": "path" },
302
+ "approval_group_id": { "type": "integer", "description": "The approval group's id", "in": "path" },
303
+ "threshold": {
304
+ "type": "integer",
305
+ "description": "Approvals needed; left out, everyone in the group must approve",
306
+ "in": "body",
307
+ "required": false
308
+ },
309
+ "notify_approvers": {
310
+ "type": "boolean",
311
+ "description": "Email the group's members about the request",
312
+ "in": "body",
313
+ "default": true
314
+ }
315
+ }
316
+ },
317
+ {
318
+ "name": "adestra_send_test",
319
+ "description": "Email a test of a campaign to one or more addresses.",
320
+ "method": "POST",
321
+ "path": "/campaigns/{campaign_id}/send_test",
322
+ "destructive": true,
323
+ "params": {
324
+ "campaign_id": { "type": "integer", "description": "The campaign id", "in": "path" },
325
+ "emails": {
326
+ "type": "array",
327
+ "items": "string",
328
+ "description": "Addresses to send the test to",
329
+ "in": "body",
330
+ "limit": "test_addresses"
331
+ }
332
+ }
333
+ }
334
+ ]
335
+ }
336
+ }
@@ -0,0 +1,212 @@
1
+ {
2
+ "id": "adobe-admin-console",
3
+ "name": "Adobe Admin Console",
4
+ "description": "Let agents read who has which Adobe licences: your Adobe users, the product profiles and user groups they are in, and who is in a profile or group. For joiner, mover and leaver access requests.",
5
+ "logo": "/brand/registry/adobe-admin-console.svg",
6
+ "identity": "An Adobe Developer Console project with the User Management API and OAuth Server-to-Server credentials. Adobe gives these credentials full user management, so agents here only read.",
7
+ "accountKey": "organization",
8
+ "connectionKind": "guided",
9
+ "setup": [
10
+ {
11
+ "title": "Create a project with the User Management API",
12
+ "body": "You need an Adobe system administrator. Adobe gives the project's credentials full user management for your organization; this app only ever reads with them.",
13
+ "link": {
14
+ "label": "Adobe: User Management API authentication",
15
+ "href": "https://adobe-apiplatform.github.io/umapi-documentation/en/UM_Authentication.html"
16
+ },
17
+ "click": [
18
+ "In Adobe Developer Console (developer.adobe.com/console), create a new project.",
19
+ "Select Add API, choose User Management API under Adobe Services, and select Next.",
20
+ "Choose OAuth Server-to-Server, then Save configured API."
21
+ ]
22
+ },
23
+ {
24
+ "title": "Copy the credentials",
25
+ "body": "Copy the three values for the form below. Give each agent the same Organization ID under API keys too: agents name it in every call, and only that organization is allowed.",
26
+ "click": [
27
+ "In the project, open the OAuth Server-to-Server credential.",
28
+ "Copy the Client ID and, after Retrieve client secret, the Client Secret.",
29
+ "Copy the Organization ID, which ends in @AdobeOrg."
30
+ ]
31
+ }
32
+ ],
33
+ "afterConnect": [],
34
+ "fields": [
35
+ {
36
+ "id": "organization",
37
+ "label": "Organization ID",
38
+ "help": "From the OAuth Server-to-Server credential, ending in @AdobeOrg.",
39
+ "placeholder": "12345ABC67890@AdobeOrg",
40
+ "secret": false
41
+ },
42
+ {
43
+ "id": "client_id",
44
+ "label": "Client ID",
45
+ "secret": false
46
+ },
47
+ {
48
+ "id": "client_secret",
49
+ "label": "Client Secret",
50
+ "secret": true
51
+ }
52
+ ],
53
+ "capabilities": [
54
+ {
55
+ "id": "read",
56
+ "label": "Read users and licences",
57
+ "description": "Read a user by email with the product profiles and groups they are in, list users, list product profiles and user groups with their product and licence quota, and list who is in a profile or group.",
58
+ "required": true,
59
+ "note": "Reaches every user in the organization. Read-only.",
60
+ "scopes": [],
61
+ "permissions": [],
62
+ "tools": [
63
+ "adobe_get_user",
64
+ "adobe_list_users",
65
+ "adobe_list_groups",
66
+ "adobe_list_group_members"
67
+ ]
68
+ }
69
+ ],
70
+ "limits": [
71
+ {
72
+ "id": "organizations",
73
+ "label": "Organization ID",
74
+ "help": "The Adobe Organization ID from the connect form, ending in @AdobeOrg. Agents can reach only this organization.",
75
+ "kind": "list",
76
+ "required": true,
77
+ "pattern": "^[A-Za-z0-9]+@AdobeOrg$"
78
+ }
79
+ ],
80
+ "verify": {
81
+ "method": "GET",
82
+ "path": "/groups/{organization}/0",
83
+ "label": "Adobe product profiles and groups",
84
+ "show": "groups[].groupName"
85
+ },
86
+ "revoke": "In Adobe Developer Console, open the project and delete the OAuth Server-to-Server credential, or the project. Agents lose access to Adobe at once.",
87
+ "http": {
88
+ "baseUrl": "https://usermanagement.adobe.io/v2/usermanagement",
89
+ "auth": {
90
+ "type": "oauth2",
91
+ "tokenUrl": "https://ims-na1.adobelogin.com/ims/token/v3",
92
+ "clientId": "client_id",
93
+ "clientSecret": "client_secret",
94
+ "scope": "openid,AdobeID,user_management_sdk"
95
+ },
96
+ "fieldHeaders": {
97
+ "x-api-key": "client_id"
98
+ },
99
+ "tools": [
100
+ {
101
+ "name": "adobe_get_user",
102
+ "description": "Read one Adobe user by email: name, status, account type and the product profiles, user groups and admin groups they are in.",
103
+ "method": "GET",
104
+ "path": "/organizations/{org_id}/users/{email}",
105
+ "params": {
106
+ "org_id": {
107
+ "type": "string",
108
+ "description": "The Adobe Organization ID, ending in @AdobeOrg",
109
+ "in": "path",
110
+ "limit": "organizations"
111
+ },
112
+ "email": {
113
+ "type": "string",
114
+ "description": "The user's full email address",
115
+ "in": "path"
116
+ }
117
+ }
118
+ },
119
+ {
120
+ "name": "adobe_list_users",
121
+ "description": "List the organization's users a page at a time: email, name, status, account type and groups. Pages start at 0; lastPage true marks the last.",
122
+ "method": "GET",
123
+ "path": "/users/{org_id}/{page}",
124
+ "params": {
125
+ "org_id": {
126
+ "type": "string",
127
+ "description": "The Adobe Organization ID, ending in @AdobeOrg",
128
+ "in": "path",
129
+ "limit": "organizations"
130
+ },
131
+ "page": {
132
+ "type": "integer",
133
+ "description": "The page, starting at 0",
134
+ "in": "path"
135
+ }
136
+ },
137
+ "result": {
138
+ "fields": [
139
+ "lastPage",
140
+ "users.email",
141
+ "users.firstname",
142
+ "users.lastname",
143
+ "users.status",
144
+ "users.type",
145
+ "users.groups"
146
+ ]
147
+ }
148
+ },
149
+ {
150
+ "name": "adobe_list_groups",
151
+ "description": "List product profiles, user groups and admin groups a page at a time: name, type, member count, and for a product profile its product and licence quota. Pages start at 0; lastPage true marks the last.",
152
+ "method": "GET",
153
+ "path": "/groups/{org_id}/{page}",
154
+ "params": {
155
+ "org_id": {
156
+ "type": "string",
157
+ "description": "The Adobe Organization ID, ending in @AdobeOrg",
158
+ "in": "path",
159
+ "limit": "organizations"
160
+ },
161
+ "page": {
162
+ "type": "integer",
163
+ "description": "The page, starting at 0",
164
+ "in": "path"
165
+ }
166
+ }
167
+ },
168
+ {
169
+ "name": "adobe_list_group_members",
170
+ "description": "List who is in one product profile, user group or admin group, a page at a time. Pages start at 0; lastPage true marks the last.",
171
+ "method": "GET",
172
+ "path": "/users/{org_id}/{page}/{group}",
173
+ "params": {
174
+ "org_id": {
175
+ "type": "string",
176
+ "description": "The Adobe Organization ID, ending in @AdobeOrg",
177
+ "in": "path",
178
+ "limit": "organizations"
179
+ },
180
+ "page": {
181
+ "type": "integer",
182
+ "description": "The page, starting at 0",
183
+ "in": "path"
184
+ },
185
+ "group": {
186
+ "type": "string",
187
+ "description": "The product profile, user group or admin group name",
188
+ "in": "path"
189
+ },
190
+ "exclude_groups": {
191
+ "type": "boolean",
192
+ "description": "true to leave out each member's own list of groups",
193
+ "in": "query",
194
+ "name": "excludeGroups",
195
+ "default": true
196
+ }
197
+ },
198
+ "result": {
199
+ "fields": [
200
+ "lastPage",
201
+ "groupName",
202
+ "users.email",
203
+ "users.firstname",
204
+ "users.lastname",
205
+ "users.status",
206
+ "users.type"
207
+ ]
208
+ }
209
+ }
210
+ ]
211
+ }
212
+ }