@arbium/enterprise-agent-connect 0.0.0-stage → 0.1.1

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 (137) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +117 -2
  3. package/dist/connectors/dell-techdirect/connector.json +39 -0
  4. package/dist/connectors/dell-techdirect/index.js +7 -0
  5. package/dist/connectors/dell-techdirect/index.js.map +1 -0
  6. package/dist/connectors/dell-techdirect/tools.js +49 -0
  7. package/dist/connectors/dell-techdirect/tools.js.map +1 -0
  8. package/dist/connectors/dell-techdirect/vendor.js +57 -0
  9. package/dist/connectors/dell-techdirect/vendor.js.map +1 -0
  10. package/dist/connectors/entra/connector.json +85 -0
  11. package/dist/connectors/entra/index.js +4 -0
  12. package/dist/connectors/entra/index.js.map +1 -0
  13. package/dist/connectors/entra/tools.js +262 -0
  14. package/dist/connectors/entra/tools.js.map +1 -0
  15. package/dist/connectors/fedex/connector.json +118 -0
  16. package/dist/connectors/fedex/index.js +7 -0
  17. package/dist/connectors/fedex/index.js.map +1 -0
  18. package/dist/connectors/fedex/tools.js +152 -0
  19. package/dist/connectors/fedex/tools.js.map +1 -0
  20. package/dist/connectors/fedex/vendor.js +98 -0
  21. package/dist/connectors/fedex/vendor.js.map +1 -0
  22. package/dist/connectors/http/index.js +235 -0
  23. package/dist/connectors/http/index.js.map +1 -0
  24. package/dist/connectors/intune/connector.json +106 -0
  25. package/dist/connectors/intune/index.js +4 -0
  26. package/dist/connectors/intune/index.js.map +1 -0
  27. package/dist/connectors/intune/tools.js +416 -0
  28. package/dist/connectors/intune/tools.js.map +1 -0
  29. package/dist/connectors/jira/connector.json +129 -0
  30. package/dist/connectors/jira/index.js +7 -0
  31. package/dist/connectors/jira/index.js.map +1 -0
  32. package/dist/connectors/jira/jql.js +67 -0
  33. package/dist/connectors/jira/jql.js.map +1 -0
  34. package/dist/connectors/jira/tools.js +464 -0
  35. package/dist/connectors/jira/tools.js.map +1 -0
  36. package/dist/connectors/jira/vendor.js +94 -0
  37. package/dist/connectors/jira/vendor.js.map +1 -0
  38. package/dist/connectors/microsoft/client.js +434 -0
  39. package/dist/connectors/microsoft/client.js.map +1 -0
  40. package/dist/connectors/microsoft/provider.json +118 -0
  41. package/dist/connectors/outlook-calendar/connector.json +136 -0
  42. package/dist/connectors/outlook-calendar/index.js +4 -0
  43. package/dist/connectors/outlook-calendar/index.js.map +1 -0
  44. package/dist/connectors/outlook-calendar/tools.js +398 -0
  45. package/dist/connectors/outlook-calendar/tools.js.map +1 -0
  46. package/dist/connectors/outlook-mail/connector.json +154 -0
  47. package/dist/connectors/outlook-mail/index.js +4 -0
  48. package/dist/connectors/outlook-mail/index.js.map +1 -0
  49. package/dist/connectors/outlook-mail/tools.js +236 -0
  50. package/dist/connectors/outlook-mail/tools.js.map +1 -0
  51. package/dist/connectors/salesforce/connector.json +122 -0
  52. package/dist/connectors/salesforce/index.js +7 -0
  53. package/dist/connectors/salesforce/index.js.map +1 -0
  54. package/dist/connectors/salesforce/soql.js +60 -0
  55. package/dist/connectors/salesforce/soql.js.map +1 -0
  56. package/dist/connectors/salesforce/tools.js +234 -0
  57. package/dist/connectors/salesforce/tools.js.map +1 -0
  58. package/dist/connectors/salesforce/vendor.js +107 -0
  59. package/dist/connectors/salesforce/vendor.js.map +1 -0
  60. package/dist/connectors/sharepoint-files/connector.json +194 -0
  61. package/dist/connectors/sharepoint-files/excel.js +300 -0
  62. package/dist/connectors/sharepoint-files/excel.js.map +1 -0
  63. package/dist/connectors/sharepoint-files/index.js +12 -0
  64. package/dist/connectors/sharepoint-files/index.js.map +1 -0
  65. package/dist/connectors/sharepoint-files/tools.js +365 -0
  66. package/dist/connectors/sharepoint-files/tools.js.map +1 -0
  67. package/dist/connectors/sharepoint-files/vendor.js +167 -0
  68. package/dist/connectors/sharepoint-files/vendor.js.map +1 -0
  69. package/dist/connectors/teams/connector.json +298 -0
  70. package/dist/connectors/teams/index.js +5 -0
  71. package/dist/connectors/teams/index.js.map +1 -0
  72. package/dist/connectors/teams/tools.js +391 -0
  73. package/dist/connectors/teams/tools.js.map +1 -0
  74. package/dist/packages/connector-kit/src/branding.js +102 -0
  75. package/dist/packages/connector-kit/src/branding.js.map +1 -0
  76. package/dist/packages/connector-kit/src/certificate.js +84 -0
  77. package/dist/packages/connector-kit/src/certificate.js.map +1 -0
  78. package/dist/packages/connector-kit/src/common.js +107 -0
  79. package/dist/packages/connector-kit/src/common.js.map +1 -0
  80. package/dist/packages/connector-kit/src/connector.js +492 -0
  81. package/dist/packages/connector-kit/src/connector.js.map +1 -0
  82. package/dist/packages/connector-kit/src/oauth.js +79 -0
  83. package/dist/packages/connector-kit/src/oauth.js.map +1 -0
  84. package/dist/packages/connector-kit/src/types.js +20 -0
  85. package/dist/packages/connector-kit/src/types.js.map +1 -0
  86. package/dist/packages/server/migrations/0001_tables.sql +268 -0
  87. package/dist/packages/server/migrations/0002_organizations.sql +72 -0
  88. package/dist/packages/server/migrations/0003_drop_unused.sql +3 -0
  89. package/dist/packages/server/migrations/0004_trigger_runners.sql +15 -0
  90. package/dist/packages/server/migrations/0005_run_runner.sql +3 -0
  91. package/dist/packages/server/migrations/0006_approvals.sql +36 -0
  92. package/dist/packages/server/migrations/rollback/to-legacy.sql +87 -0
  93. package/dist/packages/server/src/api.js +684 -0
  94. package/dist/packages/server/src/api.js.map +1 -0
  95. package/dist/packages/server/src/app.js +444 -0
  96. package/dist/packages/server/src/app.js.map +1 -0
  97. package/dist/packages/server/src/builtin.js +24 -0
  98. package/dist/packages/server/src/builtin.js.map +1 -0
  99. package/dist/packages/server/src/consent.js +36 -0
  100. package/dist/packages/server/src/consent.js.map +1 -0
  101. package/dist/packages/server/src/index.js +129 -0
  102. package/dist/packages/server/src/index.js.map +1 -0
  103. package/dist/packages/server/src/migrate.js +134 -0
  104. package/dist/packages/server/src/migrate.js.map +1 -0
  105. package/dist/packages/server/src/openapi.js +101 -0
  106. package/dist/packages/server/src/openapi.js.map +1 -0
  107. package/dist/packages/server/src/secrets.js +76 -0
  108. package/dist/packages/server/src/secrets.js.map +1 -0
  109. package/dist/packages/server/src/server.js +69 -0
  110. package/dist/packages/server/src/server.js.map +1 -0
  111. package/dist/packages/server/src/service.js +908 -0
  112. package/dist/packages/server/src/service.js.map +1 -0
  113. package/dist/packages/server/src/store.js +411 -0
  114. package/dist/packages/server/src/store.js.map +1 -0
  115. package/dist/packages/server/src/teams/activity.js +187 -0
  116. package/dist/packages/server/src/teams/activity.js.map +1 -0
  117. package/dist/packages/server/src/teams/admin.js +699 -0
  118. package/dist/packages/server/src/teams/admin.js.map +1 -0
  119. package/dist/packages/server/src/teams/approval.js +118 -0
  120. package/dist/packages/server/src/teams/approval.js.map +1 -0
  121. package/dist/packages/server/src/teams/bot.js +124 -0
  122. package/dist/packages/server/src/teams/bot.js.map +1 -0
  123. package/dist/packages/server/src/teams/claude.js +165 -0
  124. package/dist/packages/server/src/teams/claude.js.map +1 -0
  125. package/dist/packages/server/src/teams/jwt.js +121 -0
  126. package/dist/packages/server/src/teams/jwt.js.map +1 -0
  127. package/dist/packages/server/src/teams/package.js +319 -0
  128. package/dist/packages/server/src/teams/package.js.map +1 -0
  129. package/dist/packages/server/src/teams/provision.js +505 -0
  130. package/dist/packages/server/src/teams/provision.js.map +1 -0
  131. package/dist/packages/server/src/teams/runner.js +143 -0
  132. package/dist/packages/server/src/teams/runner.js.map +1 -0
  133. package/dist/packages/server/src/teams/runtime.js +701 -0
  134. package/dist/packages/server/src/teams/runtime.js.map +1 -0
  135. package/dist/packages/server/src/teams/store.js +507 -0
  136. package/dist/packages/server/src/teams/store.js.map +1 -0
  137. package/package.json +42 -4
@@ -0,0 +1,262 @@
1
+ import { z } from "zod";
2
+ import { audited, Denied, json, listLimit, VendorFailed, } from "../../packages/connector-kit/src/common.js";
3
+ import { cursorArg, nextCursor, ok, pageQuery } from "../sharepoint-files/tools.js";
4
+ // People and groups in Microsoft Entra ID, read-only. A key's `groups` and `units` limits
5
+ // (group and administrative unit ids) keep it to the people and groups inside them, checked on
6
+ // every call, lookups by id included, with checkMemberObjects (transitive). Request shapes:
7
+ // learn.microsoft.com/graph/api/user-get, user-list, user-list-transitivememberof,
8
+ // user-list-directreports, group-list, group-list-members, subscribedsku-list and
9
+ // directoryobject-checkmemberobjects.
10
+ const GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
11
+ const UPN = /^[^\s/\\?#%'"]+@[^\s/\\?#%'"]+$/;
12
+ // checkMemberObjects takes at most 20 ids.
13
+ export const MAX_SCOPE_IDS = 20;
14
+ const PERSON_FIELDS = "id,displayName,userPrincipalName,mail,jobTitle,department,officeLocation,accountEnabled";
15
+ const BRIEF_FIELDS = "id,displayName,userPrincipalName,mail,jobTitle,department";
16
+ const GROUP_FIELDS = "id,displayName,mail,description,securityEnabled,groupTypes";
17
+ const MEMBER_FIELDS = [...new Set(`${BRIEF_FIELDS},${GROUP_FIELDS}`.split(","))].join(",");
18
+ // Directory searches and casts need this header (and $count).
19
+ const EVENTUAL = { consistencylevel: "eventual" };
20
+ /** The key's group and administrative unit ids, lowercased; null when it has neither. */
21
+ export function directoryScope(ctx) {
22
+ const groups = (listLimit(ctx.limits, "groups") ?? []).map((g) => g.toLowerCase());
23
+ const units = (listLimit(ctx.limits, "units") ?? []).map((u) => u.toLowerCase());
24
+ if (!groups.length && !units.length)
25
+ return null;
26
+ if (groups.length + units.length > MAX_SCOPE_IDS)
27
+ throw new Denied(`This key names more than ${MAX_SCOPE_IDS} groups and administrative units. Ask an administrator to narrow it.`);
28
+ return { groups, units, all: [...groups, ...units] };
29
+ }
30
+ /** Which of `ids` the user or group is in, directly or through other groups. */
31
+ export async function memberOf(ctx, mark, kind, id, ids) {
32
+ const data = await ok(ctx, mark, {
33
+ method: "POST",
34
+ path: `/v1.0/${kind}/${encodeURIComponent(id)}/checkMemberObjects`,
35
+ body: { ids },
36
+ });
37
+ return (data?.value ?? []).map((v) => v.toLowerCase());
38
+ }
39
+ async function personAllowed(ctx, mark, scope, id) {
40
+ return !scope || (await memberOf(ctx, mark, "users", id, scope.all)).length > 0;
41
+ }
42
+ // "all": the group, and so everyone in it, is inside the key's groups. "checked": it is only
43
+ // in one of the key's administrative units, so each member is checked on its own.
44
+ async function groupAccess(ctx, mark, scope, id) {
45
+ if (!scope || scope.groups.includes(id.toLowerCase()))
46
+ return "all";
47
+ const hits = await memberOf(ctx, mark, "groups", id, scope.all);
48
+ if (hits.some((h) => scope.groups.includes(h)))
49
+ return "all";
50
+ return hits.length ? "checked" : null;
51
+ }
52
+ const kindOf = (o) => o["@odata.type"] === "#microsoft.graph.user"
53
+ ? "users"
54
+ : o["@odata.type"] === "#microsoft.graph.group"
55
+ ? "groups"
56
+ : null;
57
+ const brief = (u) => ({
58
+ id: u.id,
59
+ name: u.displayName ?? null,
60
+ email: u.mail ?? u.userPrincipalName ?? null,
61
+ title: u.jobTitle ?? null,
62
+ department: u.department ?? null,
63
+ });
64
+ const groupBrief = (g) => ({
65
+ id: g.id,
66
+ name: g.displayName ?? null,
67
+ email: g.mail ?? null,
68
+ description: g.description ?? null,
69
+ kind: g.groupTypes?.includes("Unified")
70
+ ? "Microsoft 365"
71
+ : g.securityEnabled
72
+ ? "security"
73
+ : "distribution",
74
+ });
75
+ /** A person given as an object id or a sign-in name, as a Graph path segment. */
76
+ function personRef(raw) {
77
+ const value = raw.trim();
78
+ if (!GUID.test(value) && !UPN.test(value))
79
+ throw new Denied("Give a person's id or sign-in name, such as ada@contoso.com");
80
+ return encodeURIComponent(value);
81
+ }
82
+ const searchWords = (raw) => {
83
+ const words = raw.replace(/["\\]/g, "").trim();
84
+ if (!words)
85
+ throw new Denied("Give a few letters of a name to search for");
86
+ return words;
87
+ };
88
+ /** The person, read and checked against the key's limits. */
89
+ async function openPerson(ctx, mark, raw, query) {
90
+ const scope = directoryScope(ctx);
91
+ const denied = new Denied("This agent may not look up that person");
92
+ let person;
93
+ try {
94
+ person = await ok(ctx, mark, { method: "GET", path: `/v1.0/users/${personRef(raw)}?${query}` });
95
+ }
96
+ catch (error) {
97
+ // A kept key must not learn which sign-in names exist outside its groups.
98
+ if (scope && error instanceof VendorFailed && error.status === 404)
99
+ throw denied;
100
+ throw error;
101
+ }
102
+ if (!(await personAllowed(ctx, mark, scope, person.id)))
103
+ throw denied;
104
+ return person;
105
+ }
106
+ const page = z.number().int().min(1);
107
+ // Under limits, filtering follows Graph's paging, so one page can keep nothing. A kept
108
+ // listing reads on, at most this many pages, until it has `max` or the listing ends.
109
+ export const MAX_SCOPED_PAGES = 5;
110
+ /** A listing page kept to what `keep` allows; `next` continues after the last page read. */
111
+ async function keptPage(ctx, mark, path, max, cursor, scoped, keep) {
112
+ const kept = [];
113
+ let next = cursor;
114
+ for (let read = 0; read < (scoped ? MAX_SCOPED_PAGES : 1); read++) {
115
+ const data = await ok(ctx, mark, { method: "GET", path: path(next), headers: EVENTUAL });
116
+ for (const item of await Promise.all(data.value.map(keep)))
117
+ if (item !== null)
118
+ kept.push(item);
119
+ next = nextCursor(data) ?? undefined;
120
+ if (!next || kept.length >= max)
121
+ break;
122
+ }
123
+ return { kept, more: Boolean(next), next: next ?? null };
124
+ }
125
+ export const entraTools = {
126
+ names: [
127
+ "entra_get_person",
128
+ "entra_search_people",
129
+ "entra_person_groups",
130
+ "entra_group_members",
131
+ "entra_search_groups",
132
+ ],
133
+ register(server, ctx, allowed) {
134
+ const readOnly = { readOnlyHint: true, openWorldHint: true };
135
+ const person = z
136
+ .string()
137
+ .max(320)
138
+ .describe("A person's id or sign-in name, such as ada@contoso.com.");
139
+ const groupId = z.string().max(36).describe("A group's id, from entra_search_groups.");
140
+ if (allowed.has("entra_get_person"))
141
+ server.registerTool("entra_get_person", {
142
+ description: "Look up one person: name, sign-in name, email, job title, department, office, whether the account is on, manager, direct reports and licenses (by product name).",
143
+ inputSchema: z.object({ person }),
144
+ annotations: readOnly,
145
+ }, ({ person: p }) => audited(ctx, "entra_get_person", p, async (mark) => {
146
+ const scope = directoryScope(ctx);
147
+ const u = await openPerson(ctx, mark, p, `$select=${PERSON_FIELDS},assignedLicenses&$expand=manager($select=${BRIEF_FIELDS})`);
148
+ const reports = await ok(ctx, mark, {
149
+ method: "GET",
150
+ path: `/v1.0/users/${encodeURIComponent(u.id)}/directReports/microsoft.graph.user?$select=${BRIEF_FIELDS}&$top=100&$count=true`,
151
+ headers: EVENTUAL,
152
+ });
153
+ const shown = [];
154
+ for (const r of reports.value)
155
+ if (await personAllowed(ctx, mark, scope, r.id))
156
+ shown.push(brief(r));
157
+ const manager = u.manager;
158
+ const skuIds = (u.assignedLicenses ?? []).map((l) => l.skuId);
159
+ let licenses = [];
160
+ if (skuIds.length) {
161
+ const skus = await ok(ctx, mark, {
162
+ method: "GET",
163
+ path: "/v1.0/subscribedSkus?$select=skuId,skuPartNumber",
164
+ });
165
+ const names = new Map(skus.value.map((s) => [
166
+ s.skuId,
167
+ s.skuPartNumber,
168
+ ]));
169
+ licenses = skuIds.map((id) => names.get(id) ?? id);
170
+ }
171
+ return json({
172
+ ...brief(u),
173
+ sign_in_name: u.userPrincipalName ?? null,
174
+ office: u.officeLocation ?? null,
175
+ account_enabled: u.accountEnabled ?? null,
176
+ manager: manager?.id && (await personAllowed(ctx, mark, scope, manager.id))
177
+ ? brief(manager)
178
+ : null,
179
+ direct_reports: shown,
180
+ more_direct_reports: Boolean(reports["@odata.nextLink"]),
181
+ licenses,
182
+ });
183
+ }));
184
+ if (allowed.has("entra_search_people"))
185
+ server.registerTool("entra_search_people", {
186
+ description: "Find people by part of their name or email. When `more` is true, call again with `cursor` set to `next`.",
187
+ inputSchema: z.object({
188
+ query: z.string().max(100),
189
+ max_results: page.max(50).default(25),
190
+ cursor: cursorArg,
191
+ }),
192
+ annotations: readOnly,
193
+ }, ({ query, max_results, cursor }) => audited(ctx, "entra_search_people", query, async (mark) => {
194
+ const words = searchWords(query);
195
+ const scope = directoryScope(ctx);
196
+ const search = encodeURIComponent(`"displayName:${words}" OR "mail:${words}"`);
197
+ const { kept, more, next } = await keptPage(ctx, mark, (c) => `/v1.0/users?$search=${search}&$select=${BRIEF_FIELDS}&$count=true&${pageQuery(max_results, c)}`, max_results, cursor, Boolean(scope), async (u) => ((await personAllowed(ctx, mark, scope, u.id)) ? brief(u) : null));
198
+ return json({ people: kept, more, next });
199
+ }));
200
+ if (allowed.has("entra_person_groups"))
201
+ server.registerTool("entra_person_groups", {
202
+ description: "List the groups a person is in, directly or through other groups. When `more` is true, call again with `cursor` set to `next`.",
203
+ inputSchema: z.object({
204
+ person,
205
+ max_results: page.max(100).default(50),
206
+ cursor: cursorArg,
207
+ }),
208
+ annotations: readOnly,
209
+ }, ({ person: p, max_results, cursor }) => audited(ctx, "entra_person_groups", p, async (mark) => {
210
+ const scope = directoryScope(ctx);
211
+ const u = await openPerson(ctx, mark, p, "$select=id");
212
+ const { kept, more, next } = await keptPage(ctx, mark, (c) => `/v1.0/users/${encodeURIComponent(u.id)}/transitiveMemberOf/microsoft.graph.group?$select=${GROUP_FIELDS}&$count=true&${pageQuery(max_results, c)}`, max_results, cursor, Boolean(scope), async (g) => ((await groupAccess(ctx, mark, scope, g.id)) ? groupBrief(g) : null));
213
+ return json({ groups: kept, more, next });
214
+ }));
215
+ if (allowed.has("entra_group_members"))
216
+ server.registerTool("entra_group_members", {
217
+ description: "List a group's direct members: people and groups inside it. When `more` is true, call again with `cursor` set to `next`.",
218
+ inputSchema: z.object({
219
+ group_id: groupId,
220
+ max_results: page.max(100).default(50),
221
+ cursor: cursorArg,
222
+ }),
223
+ annotations: readOnly,
224
+ }, ({ group_id, max_results, cursor }) => audited(ctx, "entra_group_members", group_id, async (mark) => {
225
+ if (!GUID.test(group_id))
226
+ throw new Denied("Give a group id from entra_search_groups");
227
+ const scope = directoryScope(ctx);
228
+ const access = await groupAccess(ctx, mark, scope, group_id);
229
+ if (!access)
230
+ throw new Denied("This agent may not read that group");
231
+ const { kept, more, next } = await keptPage(ctx, mark, (c) => `/v1.0/groups/${group_id}/members?$select=${MEMBER_FIELDS}&$count=true&${pageQuery(max_results, c)}`, max_results, cursor, access === "checked", async (m) => {
232
+ const kind = kindOf(m);
233
+ if (!kind)
234
+ return null;
235
+ if (access === "checked" &&
236
+ !(await memberOf(ctx, mark, kind, m.id, scope.all)).length)
237
+ return null;
238
+ return kind === "users"
239
+ ? { type: "person", ...brief(m) }
240
+ : { type: "group", ...groupBrief(m) };
241
+ });
242
+ return json({ members: kept, more, next });
243
+ }));
244
+ if (allowed.has("entra_search_groups"))
245
+ server.registerTool("entra_search_groups", {
246
+ description: "Find groups by part of their name. When `more` is true, call again with `cursor` set to `next`.",
247
+ inputSchema: z.object({
248
+ query: z.string().max(100),
249
+ max_results: page.max(50).default(25),
250
+ cursor: cursorArg,
251
+ }),
252
+ annotations: readOnly,
253
+ }, ({ query, max_results, cursor }) => audited(ctx, "entra_search_groups", query, async (mark) => {
254
+ const words = searchWords(query);
255
+ const scope = directoryScope(ctx);
256
+ const search = encodeURIComponent(`"displayName:${words}"`);
257
+ const { kept, more, next } = await keptPage(ctx, mark, (c) => `/v1.0/groups?$search=${search}&$select=${GROUP_FIELDS}&$count=true&${pageQuery(max_results, c)}`, max_results, cursor, Boolean(scope), async (g) => ((await groupAccess(ctx, mark, scope, g.id)) ? groupBrief(g) : null));
258
+ return json({ groups: kept, more, next });
259
+ }));
260
+ },
261
+ };
262
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../connectors/entra/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ {
2
+ "id": "fedex",
3
+ "name": "FedEx",
4
+ "description": "Let agents track shipments, compare rates and, if you allow it, create and cancel shipments on the FedEx accounts you choose.",
5
+ "logo": "/brand/registry/fedex.svg",
6
+ "identity": "A FedEx Developer Portal project named \"{brand.microsoft.appName}\", using the FedEx account numbers you enter here.",
7
+ "accountKey": "project",
8
+ "connectionKind": "guided",
9
+ "setup": [
10
+ {
11
+ "title": "Create a FedEx developer project",
12
+ "body": "Sign in to the FedEx Developer Portal with the FedEx user ID that manages your shipping accounts, open My Projects, and create an API project named \"{brand.microsoft.appName}\".",
13
+ "link": {
14
+ "label": "FedEx Developer Portal",
15
+ "href": "https://developer.fedex.com/api/en-us/home.html"
16
+ }
17
+ },
18
+ {
19
+ "title": "Choose its APIs",
20
+ "body": "Select these APIs for the project:",
21
+ "copy": ["{scope}"]
22
+ },
23
+ {
24
+ "title": "Add your account numbers",
25
+ "body": "Add the FedEx account numbers agents may rate and ship on to the project. You can narrow each agent to some of them here later."
26
+ },
27
+ {
28
+ "title": "Copy the keys",
29
+ "body": "Open the project's overview and copy its API key and secret key. Test keys work only with Sandbox; production keys appear once FedEx moves the project to production."
30
+ }
31
+ ],
32
+ "afterConnect": [],
33
+ "fields": [
34
+ {
35
+ "id": "environment",
36
+ "label": "Environment",
37
+ "secret": false,
38
+ "options": [
39
+ {
40
+ "value": "sandbox",
41
+ "label": "Sandbox",
42
+ "description": "FedEx's test system, with the project's test keys. Nothing is really shipped or charged."
43
+ },
44
+ {
45
+ "value": "production",
46
+ "label": "Production",
47
+ "description": "Real tracking, rates and shipments, with the project's production keys. Shipments are charged to your account."
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ "id": "api_key",
53
+ "label": "API key",
54
+ "secret": false
55
+ },
56
+ {
57
+ "id": "secret_key",
58
+ "label": "Secret key",
59
+ "secret": true
60
+ },
61
+ {
62
+ "id": "account_numbers",
63
+ "label": "Account numbers",
64
+ "help": "The FedEx account numbers agents may use, separated by commas. Agents can never rate or ship on another.",
65
+ "placeholder": "123456789",
66
+ "secret": false
67
+ }
68
+ ],
69
+ "capabilities": [
70
+ {
71
+ "id": "track",
72
+ "label": "Track shipments",
73
+ "description": "Look up the status and scan history of shipments by tracking number.",
74
+ "required": true,
75
+ "scopes": ["Track API"],
76
+ "permissions": [],
77
+ "tools": ["fedex_track_shipments"]
78
+ },
79
+ {
80
+ "id": "rate",
81
+ "label": "Get rates",
82
+ "description": "Quote rates and transit times on your account numbers. Nothing is shipped.",
83
+ "scopes": ["Rates and Transit Times API"],
84
+ "permissions": [],
85
+ "tools": ["fedex_get_rates"]
86
+ },
87
+ {
88
+ "id": "ship",
89
+ "label": "Create and cancel shipments",
90
+ "description": "Create shipments and their labels, and cancel them. Each shipment is charged to your FedEx account unless it is cancelled.",
91
+ "destructive": true,
92
+ "costs": true,
93
+ "note": "Agents with this can spend money on your FedEx account. Keep each agent to the account numbers it needs.",
94
+ "scopes": ["Ship API"],
95
+ "permissions": [],
96
+ "tools": ["fedex_create_shipment", "fedex_cancel_shipment"]
97
+ }
98
+ ],
99
+ "limits": [
100
+ {
101
+ "id": "accounts",
102
+ "label": "Account numbers",
103
+ "help": "Leave empty to allow every account number connected here.",
104
+ "kind": "list",
105
+ "required": false,
106
+ "pattern": "^[0-9]{9,12}$"
107
+ }
108
+ ],
109
+ "verify": {
110
+ "label": "Track API reached",
111
+ "check": "track"
112
+ },
113
+ "discover": {
114
+ "label": "Account numbers",
115
+ "check": "accounts"
116
+ },
117
+ "revoke": "In the FedEx Developer Portal, open My Projects, then {brand.microsoft.appName}, and delete the project or regenerate its secret key."
118
+ }
@@ -0,0 +1,7 @@
1
+ import { fedexTools } from "./tools.js";
2
+ import { fedexVendor } from "./vendor.js";
3
+ export default {
4
+ id: "fedex",
5
+ create: () => ({ vendor: fedexVendor(), toolset: fedexTools }),
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../connectors/fedex/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,eAAe;IACb,EAAE,EAAE,OAAO;IACX,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;CACrC,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { z } from "zod";
2
+ import { vendorError } from "../../packages/connector-kit/src/oauth.js";
3
+ import { connectedAccounts } from "./vendor.js";
4
+ import { audited, Denied, json, listLimit, VendorFailed, } from "../../packages/connector-kit/src/common.js";
5
+ // FedEx Track, Rate and Ship (developer.fedex.com OpenAPI files: /track/v1/trackingnumbers,
6
+ // /rate/v1/rates/quotes, /ship/v1/shipments, PUT /ship/v1/shipments/cancel).
7
+ const TRACKING_NUMBER = /^[A-Za-z0-9]{8,40}$/;
8
+ async function ok(ctx, mark, req) {
9
+ const res = await ctx.call(req);
10
+ mark(res.status);
11
+ if (res.status < 200 || res.status >= 300) {
12
+ const detail = vendorError(res.data);
13
+ throw new VendorFailed(res.status, `FedEx answered ${res.status}${detail ? `: ${detail}` : ""}`);
14
+ }
15
+ return res.data;
16
+ }
17
+ // The account numbers this key may bill or quote on: the key's limit, and never one the
18
+ // connection was not set up with.
19
+ function allowedAccounts(ctx) {
20
+ const connected = connectedAccounts(ctx.config);
21
+ const limit = listLimit(ctx.limits, "accounts");
22
+ return new Set(limit ? connected.filter((a) => limit.includes(a)) : connected);
23
+ }
24
+ // Every account number anywhere in the request (the shipper's, a payor's for shipping or
25
+ // duties, a third party's, a freight account) must be one this key may use. FedEx names them
26
+ // accountNumber or ...AccountNumber, as { value } or a plain string.
27
+ export function checkAccounts(ctx, body) {
28
+ const allowed = allowedAccounts(ctx);
29
+ const walk = (node) => {
30
+ if (Array.isArray(node))
31
+ return node.forEach(walk);
32
+ if (!node || typeof node !== "object")
33
+ return;
34
+ for (const [key, value] of Object.entries(node)) {
35
+ if (key.toLowerCase().endsWith("accountnumber")) {
36
+ const number = typeof value === "string"
37
+ ? value
38
+ : value &&
39
+ typeof value === "object" &&
40
+ typeof value.value === "string"
41
+ ? value.value
42
+ : null;
43
+ if (number === null)
44
+ throw new Denied('Give each account number as { "value": "<account number>" }');
45
+ if (!allowed.has(number))
46
+ throw new Denied(`This agent is not allowed to use FedEx account ${number}`);
47
+ }
48
+ walk(value);
49
+ }
50
+ };
51
+ walk(body);
52
+ }
53
+ const accountNumber = z.string().describe("A FedEx account number this agent may use.");
54
+ const shipment = z
55
+ .record(z.string(), z.unknown())
56
+ .describe("FedEx requestedShipment object, as in FedEx's API (shipper, recipient(s), pickupType, serviceType, packagingType, requestedPackageLineItems, and for shipments shippingChargesPayment and labelSpecification).");
57
+ export const fedexTools = {
58
+ names: [
59
+ "fedex_track_shipments",
60
+ "fedex_get_rates",
61
+ "fedex_create_shipment",
62
+ "fedex_cancel_shipment",
63
+ ],
64
+ register(server, ctx, allowed) {
65
+ const readOnly = { readOnlyHint: true, openWorldHint: true };
66
+ if (allowed.has("fedex_track_shipments"))
67
+ server.registerTool("fedex_track_shipments", {
68
+ description: "Track up to 30 FedEx shipments by tracking number.",
69
+ inputSchema: z.object({
70
+ tracking_numbers: z.array(z.string()).min(1).max(30),
71
+ include_detailed_scans: z
72
+ .boolean()
73
+ .default(false)
74
+ .describe("Every scan event, not only the latest status."),
75
+ }),
76
+ annotations: readOnly,
77
+ }, ({ tracking_numbers, include_detailed_scans }) => audited(ctx, "fedex_track_shipments", tracking_numbers.join(","), async (mark) => {
78
+ const bad = tracking_numbers.find((t) => !TRACKING_NUMBER.test(t));
79
+ if (bad)
80
+ throw new Denied(`${bad} is not a FedEx tracking number`);
81
+ const data = await ok(ctx, mark, {
82
+ method: "POST",
83
+ path: "/track/v1/trackingnumbers",
84
+ body: {
85
+ includeDetailedScans: include_detailed_scans,
86
+ trackingInfo: tracking_numbers.map((trackingNumber) => ({
87
+ trackingNumberInfo: { trackingNumber },
88
+ })),
89
+ },
90
+ });
91
+ return json(data);
92
+ }));
93
+ if (allowed.has("fedex_get_rates"))
94
+ server.registerTool("fedex_get_rates", {
95
+ description: "Get FedEx rates and transit times for a shipment, billed to an account this agent may use. Nothing is shipped.",
96
+ inputSchema: z.object({ account_number: accountNumber, requested_shipment: shipment }),
97
+ annotations: readOnly,
98
+ }, ({ account_number, requested_shipment }) => audited(ctx, "fedex_get_rates", account_number, async (mark) => {
99
+ const body = {
100
+ accountNumber: { value: account_number },
101
+ requestedShipment: requested_shipment,
102
+ };
103
+ checkAccounts(ctx, body);
104
+ const data = await ok(ctx, mark, {
105
+ method: "POST",
106
+ path: "/rate/v1/rates/quotes",
107
+ body,
108
+ });
109
+ return json(data);
110
+ }));
111
+ if (allowed.has("fedex_create_shipment"))
112
+ server.registerTool("fedex_create_shipment", {
113
+ description: "Create a FedEx shipment and its label, billed to an account this agent may use. This buys the label: charges apply unless it is cancelled. Returns the tracking number and a label link valid for 12 hours.",
114
+ inputSchema: z.object({ account_number: accountNumber, requested_shipment: shipment }),
115
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
116
+ }, ({ account_number, requested_shipment }) => audited(ctx, "fedex_create_shipment", account_number, async (mark, retarget) => {
117
+ const body = {
118
+ accountNumber: { value: account_number },
119
+ labelResponseOptions: "URL_ONLY",
120
+ requestedShipment: requested_shipment,
121
+ };
122
+ checkAccounts(ctx, body);
123
+ const data = await ok(ctx, mark, { method: "POST", path: "/ship/v1/shipments", body });
124
+ const shipments = data.output?.transactionShipments;
125
+ const tracking = shipments?.map((s) => s.masterTrackingNumber).filter(Boolean) ?? [];
126
+ retarget(`${account_number}:${tracking.join(",") || "no tracking number"}`);
127
+ return json(data);
128
+ }));
129
+ if (allowed.has("fedex_cancel_shipment"))
130
+ server.registerTool("fedex_cancel_shipment", {
131
+ description: "Cancel a FedEx shipment (all of its packages) created on an account this agent may use.",
132
+ inputSchema: z.object({ account_number: accountNumber, tracking_number: z.string() }),
133
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
134
+ }, ({ account_number, tracking_number }) => audited(ctx, "fedex_cancel_shipment", `${account_number}:${tracking_number}`, async (mark) => {
135
+ if (!TRACKING_NUMBER.test(tracking_number))
136
+ throw new Denied(`${tracking_number} is not a FedEx tracking number`);
137
+ const body = {
138
+ accountNumber: { value: account_number },
139
+ trackingNumber: tracking_number,
140
+ deletionControl: "DELETE_ALL_PACKAGES",
141
+ };
142
+ checkAccounts(ctx, body);
143
+ const data = await ok(ctx, mark, {
144
+ method: "PUT",
145
+ path: "/ship/v1/shipments/cancel",
146
+ body,
147
+ });
148
+ return json(data);
149
+ }));
150
+ },
151
+ };
152
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../connectors/fedex/tools.ts"],"names":[],"mappings":"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"}