@nimbus-dev/connectors 0.2.0 → 0.2.2

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 (215) hide show
  1. package/README.md +18 -4
  2. package/connectors/airflow/src/search-filter.ts +2 -15
  3. package/connectors/airflow/src/server.ts +2 -87
  4. package/connectors/airflow/src/tools.ts +74 -0
  5. package/connectors/apple/src/adapters.ts +326 -0
  6. package/connectors/apple/src/apple-mail-core.ts +4 -8
  7. package/connectors/apple/src/calendar-tools.ts +28 -8
  8. package/connectors/apple/src/server.ts +23 -512
  9. package/connectors/apple/src/tools.ts +18 -44
  10. package/connectors/argocd/src/server.ts +25 -38
  11. package/connectors/athena/src/tools.ts +15 -34
  12. package/connectors/aws/src/server.ts +2 -183
  13. package/connectors/aws/src/tools.ts +197 -0
  14. package/connectors/azure/src/server.ts +2 -131
  15. package/connectors/azure/src/tools.ts +133 -0
  16. package/connectors/bigeye/src/search-filter.ts +4 -15
  17. package/connectors/bigeye/src/server.ts +38 -38
  18. package/connectors/bigquery/src/tools.ts +1 -26
  19. package/connectors/bitbucket/src/server.ts +2 -244
  20. package/connectors/bitbucket/src/tools.ts +241 -0
  21. package/connectors/bitrise/src/server.ts +2 -79
  22. package/connectors/bitrise/src/tools.ts +76 -0
  23. package/connectors/canva/src/search-filter.ts +2 -11
  24. package/connectors/canva/src/server.ts +2 -73
  25. package/connectors/canva/src/tools.ts +66 -0
  26. package/connectors/circleci/src/server.ts +2 -176
  27. package/connectors/circleci/src/tools.ts +193 -0
  28. package/connectors/cloud-logging/src/tools.ts +14 -27
  29. package/connectors/cloudwatch/src/tools.ts +15 -34
  30. package/connectors/codemagic/src/server.ts +2 -70
  31. package/connectors/codemagic/src/tools.ts +71 -0
  32. package/connectors/confluence/src/server.ts +2 -301
  33. package/connectors/confluence/src/tools.ts +320 -0
  34. package/connectors/dagster/src/server.ts +2 -214
  35. package/connectors/dagster/src/tools.ts +187 -0
  36. package/connectors/databricks/src/search-filter.ts +7 -7
  37. package/connectors/databricks/src/server.ts +2 -77
  38. package/connectors/databricks/src/tools.ts +66 -0
  39. package/connectors/datadog/src/server.ts +2 -48
  40. package/connectors/datadog/src/tools.ts +48 -0
  41. package/connectors/dataprofile/src/profile.ts +16 -46
  42. package/connectors/dbt/src/server.ts +2 -92
  43. package/connectors/dbt/src/tools.ts +80 -0
  44. package/connectors/dependencytrack/src/server.ts +2 -76
  45. package/connectors/dependencytrack/src/tools.ts +65 -0
  46. package/connectors/discord/src/server.ts +2 -85
  47. package/connectors/discord/src/tools.ts +82 -0
  48. package/connectors/elasticsearch/src/tools.ts +7 -37
  49. package/connectors/fastmail/src/jmap-client.ts +202 -0
  50. package/connectors/fastmail/src/jmap-core.ts +8 -21
  51. package/connectors/fastmail/src/server.ts +2 -187
  52. package/connectors/fastmail/src/tools.ts +4 -23
  53. package/connectors/figma/src/search-filter.ts +2 -11
  54. package/connectors/figma/src/server.ts +2 -113
  55. package/connectors/figma/src/tools.ts +99 -0
  56. package/connectors/firebase/src/server.ts +2 -90
  57. package/connectors/firebase/src/token.ts +2 -5
  58. package/connectors/firebase/src/tools.ts +106 -0
  59. package/connectors/flagsmith/src/server.ts +2 -98
  60. package/connectors/flagsmith/src/tools.ts +95 -0
  61. package/connectors/flux/src/server.ts +52 -53
  62. package/connectors/gcp/src/server.ts +2 -132
  63. package/connectors/gcp/src/tools.ts +123 -0
  64. package/connectors/github/src/server.ts +2 -328
  65. package/connectors/github/src/tools.ts +311 -0
  66. package/connectors/github-actions/src/server.ts +2 -205
  67. package/connectors/github-actions/src/tools.ts +209 -0
  68. package/connectors/gitlab/src/server.ts +2 -384
  69. package/connectors/gitlab/src/tools.ts +392 -0
  70. package/connectors/gmail/src/server.ts +2 -270
  71. package/connectors/gmail/src/tools.ts +209 -0
  72. package/connectors/google-drive/src/server.ts +2 -524
  73. package/connectors/google-drive/src/tools.ts +529 -0
  74. package/connectors/google-meet/src/server.ts +2 -82
  75. package/connectors/google-meet/src/tools.ts +87 -0
  76. package/connectors/google-photos/src/server.ts +2 -132
  77. package/connectors/google-photos/src/tools.ts +138 -0
  78. package/connectors/grafana/src/server.ts +2 -53
  79. package/connectors/grafana/src/tools.ts +53 -0
  80. package/connectors/great-expectations/src/gx-parse.ts +14 -45
  81. package/connectors/greenhouse/src/server.ts +2 -63
  82. package/connectors/greenhouse/src/tools.ts +68 -0
  83. package/connectors/hubspot/src/server.ts +2 -77
  84. package/connectors/hubspot/src/tools.ts +70 -0
  85. package/connectors/iac/src/server.ts +2 -137
  86. package/connectors/iac/src/tools.ts +152 -0
  87. package/connectors/imap/src/imap-core.ts +29 -82
  88. package/connectors/imap/src/server.ts +33 -220
  89. package/connectors/intercom/src/server.ts +2 -61
  90. package/connectors/intercom/src/tools.ts +58 -0
  91. package/connectors/jenkins/src/jenkins-api.ts +2 -6
  92. package/connectors/jenkins/src/server.ts +2 -215
  93. package/connectors/jenkins/src/tools.ts +240 -0
  94. package/connectors/jira/src/server.ts +2 -301
  95. package/connectors/jira/src/tools.ts +325 -0
  96. package/connectors/kubernetes/src/server.ts +2 -155
  97. package/connectors/kubernetes/src/tools.ts +159 -0
  98. package/connectors/launchdarkly/src/server.ts +2 -75
  99. package/connectors/launchdarkly/src/tools.ts +72 -0
  100. package/connectors/lever/src/search-filter.ts +4 -12
  101. package/connectors/lever/src/server.ts +2 -60
  102. package/connectors/lever/src/tools.ts +61 -0
  103. package/connectors/linear/src/server.ts +2 -459
  104. package/connectors/linear/src/tools.ts +482 -0
  105. package/connectors/localdb/src/sql-scan.ts +13 -41
  106. package/connectors/localdb/src/tools.ts +1 -1
  107. package/connectors/looker/src/search-filter.ts +2 -15
  108. package/connectors/looker/src/server.ts +35 -70
  109. package/connectors/mendeley/src/server.ts +2 -55
  110. package/connectors/mendeley/src/tools.ts +54 -0
  111. package/connectors/mercury/src/server.ts +2 -57
  112. package/connectors/mercury/src/tools.ts +50 -0
  113. package/connectors/metabase/src/search-filter.ts +4 -15
  114. package/connectors/metabase/src/server.ts +2 -79
  115. package/connectors/metabase/src/tools.ts +64 -0
  116. package/connectors/miro/src/server.ts +2 -72
  117. package/connectors/miro/src/tools.ts +65 -0
  118. package/connectors/mlflow/src/search-filter.ts +3 -7
  119. package/connectors/mlflow/src/server.ts +20 -40
  120. package/connectors/monte-carlo/src/server.ts +50 -57
  121. package/connectors/netlify/src/search-filter.ts +6 -14
  122. package/connectors/netlify/src/server.ts +2 -60
  123. package/connectors/netlify/src/tools.ts +53 -0
  124. package/connectors/newrelic/src/server.ts +2 -40
  125. package/connectors/newrelic/src/tools.ts +37 -0
  126. package/connectors/notion/src/server.ts +2 -335
  127. package/connectors/notion/src/tools.ts +344 -0
  128. package/connectors/obsidian/src/server.ts +2 -425
  129. package/connectors/obsidian/src/tools.ts +466 -0
  130. package/connectors/onedrive/src/server.ts +2 -249
  131. package/connectors/onedrive/src/tools.ts +253 -0
  132. package/connectors/outlook/src/server.ts +2 -351
  133. package/connectors/outlook/src/tools.ts +357 -0
  134. package/connectors/pagerduty/src/server.ts +2 -132
  135. package/connectors/pagerduty/src/tools.ts +126 -0
  136. package/connectors/pipedrive/src/server.ts +2 -58
  137. package/connectors/pipedrive/src/tools.ts +63 -0
  138. package/connectors/powerbi/src/search-filter.ts +2 -15
  139. package/connectors/powerbi/src/server.ts +43 -68
  140. package/connectors/prefect/src/search-filter.ts +3 -16
  141. package/connectors/prefect/src/server.ts +2 -90
  142. package/connectors/prefect/src/tools.ts +83 -0
  143. package/connectors/protonmail/src/mail-core.ts +16 -75
  144. package/connectors/protonmail/src/server.ts +34 -214
  145. package/connectors/raindrop/src/server.ts +2 -103
  146. package/connectors/raindrop/src/tools.ts +103 -0
  147. package/connectors/ramp/src/server.ts +2 -105
  148. package/connectors/ramp/src/tools.ts +98 -0
  149. package/connectors/readwise/src/server.ts +2 -88
  150. package/connectors/readwise/src/tools.ts +81 -0
  151. package/connectors/sagemaker/src/tools.ts +19 -38
  152. package/connectors/salesforce/src/search-filter.ts +4 -11
  153. package/connectors/salesforce/src/server.ts +2 -90
  154. package/connectors/salesforce/src/tools.ts +75 -0
  155. package/connectors/semgrep/src/search-filter.ts +3 -10
  156. package/connectors/semgrep/src/server.ts +2 -104
  157. package/connectors/semgrep/src/tools.ts +92 -0
  158. package/connectors/sentry/src/server.ts +2 -58
  159. package/connectors/sentry/src/tools.ts +53 -0
  160. package/connectors/slack/src/server.ts +2 -352
  161. package/connectors/slack/src/tools.ts +376 -0
  162. package/connectors/snowflake/src/search-filter.ts +4 -19
  163. package/connectors/snowflake/src/server.ts +6 -25
  164. package/connectors/snyk/src/server.ts +2 -140
  165. package/connectors/snyk/src/tools.ts +136 -0
  166. package/connectors/sonarqube/src/server.ts +2 -111
  167. package/connectors/sonarqube/src/tools.ts +98 -0
  168. package/connectors/stackoverflow/src/server.ts +2 -77
  169. package/connectors/stackoverflow/src/tools.ts +66 -0
  170. package/connectors/storybook/src/storybook-parse.ts +3 -6
  171. package/connectors/stripe/src/server.ts +2 -61
  172. package/connectors/stripe/src/tools.ts +54 -0
  173. package/connectors/superset/src/search-filter.ts +4 -15
  174. package/connectors/superset/src/server.ts +2 -115
  175. package/connectors/superset/src/tools.ts +98 -0
  176. package/connectors/tableau/src/search-filter.ts +2 -15
  177. package/connectors/tableau/src/server.ts +13 -65
  178. package/connectors/teams/src/server.ts +2 -249
  179. package/connectors/teams/src/tools.ts +283 -0
  180. package/connectors/testflight/src/server.ts +2 -70
  181. package/connectors/testflight/src/tools.ts +79 -0
  182. package/connectors/vercel/src/search-filter.ts +2 -10
  183. package/connectors/vercel/src/server.ts +2 -75
  184. package/connectors/vercel/src/tools.ts +73 -0
  185. package/connectors/vertex-ai/src/tools.ts +23 -33
  186. package/connectors/wiz/src/search-filter.ts +6 -30
  187. package/connectors/wiz/src/server.ts +2 -188
  188. package/connectors/wiz/src/tools.ts +168 -0
  189. package/connectors/zendesk/src/server.ts +2 -73
  190. package/connectors/zendesk/src/tools.ts +60 -0
  191. package/connectors/zoom/src/search-filter.ts +1 -7
  192. package/connectors/zoom/src/server.ts +2 -94
  193. package/connectors/zoom/src/tools.ts +93 -0
  194. package/connectors/zotero/src/server.ts +2 -78
  195. package/connectors/zotero/src/tools.ts +67 -0
  196. package/package.json +15 -12
  197. package/shared/access-token-cache.ts +123 -0
  198. package/shared/atlassian-json-fetch.ts +6 -16
  199. package/shared/audit-chain.ts +13 -6
  200. package/shared/cli-json-kit.ts +150 -0
  201. package/shared/collection-tool-kit.ts +143 -0
  202. package/shared/connector-mode.ts +3 -2
  203. package/shared/cursor-list-tool.ts +29 -0
  204. package/shared/env-json-api.ts +209 -0
  205. package/shared/fetch-json-text.ts +27 -0
  206. package/shared/github-rest.ts +62 -0
  207. package/shared/graphql-json.ts +60 -0
  208. package/shared/imap-mail-core.ts +91 -0
  209. package/shared/imap-tool-kit.ts +57 -23
  210. package/shared/imapflow-adapter.ts +417 -0
  211. package/shared/rest-tool-kit.ts +77 -7
  212. package/shared/run-cli-json.ts +38 -16
  213. package/shared/search-filter.ts +58 -18
  214. package/shared/walk-files.ts +118 -0
  215. package/standalone/src/launcher.ts +19 -7
@@ -0,0 +1,209 @@
1
+ import { z } from "zod";
2
+ import { type ConsentServer, createWriteToolRegistrar } from "../../../shared/consent-kit.ts";
3
+ import {
4
+ emailToolSchemas,
5
+ mailSendConsent,
6
+ type OutgoingMail,
7
+ outgoingMail,
8
+ } from "../../../shared/imap-tool-kit.ts";
9
+ import { createRegisterSimpleTool, createZodToolRegistrar } from "../../../shared/mcp-tool-kit.ts";
10
+ import {
11
+ makeRestFetcher,
12
+ makeRestToolRegistrar,
13
+ makeRestWriteToolRegistrar,
14
+ } from "../../../shared/rest-tool-kit.ts";
15
+
16
+ const GMAIL_BASE = "https://gmail.googleapis.com/gmail/v1/users/me";
17
+
18
+ function gmailFetch(
19
+ token: string,
20
+ path: string,
21
+ init?: RequestInit,
22
+ ): Promise<{ ok: boolean; status: number; json: unknown; text: string }> {
23
+ return makeRestFetcher({ apiBase: GMAIL_BASE, token })(path, init);
24
+ }
25
+
26
+ function buildRfc822Message(params: OutgoingMail): string {
27
+ const lines: string[] = [
28
+ `To: ${params.to}`,
29
+ ...(params.cc !== undefined && params.cc !== "" ? [`Cc: ${params.cc}`] : []),
30
+ ...(params.bcc !== undefined && params.bcc !== "" ? [`Bcc: ${params.bcc}`] : []),
31
+ `Subject: ${params.subject}`,
32
+ "Content-Type: text/plain; charset=UTF-8",
33
+ "",
34
+ params.body,
35
+ ];
36
+ return lines.join("\r\n");
37
+ }
38
+
39
+ function toRawBase64Url(rfc822: string): string {
40
+ return Buffer.from(rfc822, "utf-8").toString("base64url");
41
+ }
42
+
43
+ /** The base64url RFC 822 message Gmail's `raw` fields take, for validated send arguments. */
44
+ function rawMessage(args: Parameters<typeof outgoingMail>[0]): string {
45
+ return toRawBase64Url(buildRfc822Message(outgoingMail(args)));
46
+ }
47
+
48
+ /** A POST carrying `body` as JSON. */
49
+ function jsonPost(body: unknown): RequestInit {
50
+ return {
51
+ method: "POST",
52
+ headers: { "Content-Type": "application/json" },
53
+ body: JSON.stringify(body),
54
+ };
55
+ }
56
+
57
+ export function registerGmailTools(
58
+ server: ConsentServer & { tool: (...args: never) => unknown },
59
+ ): void {
60
+ const reg = createZodToolRegistrar(createRegisterSimpleTool(server));
61
+
62
+ /**
63
+ * Every MUTATING gmail tool goes through here. Outside the gateway this adds the
64
+ * consent gate, the write-scope allow-list, the mutation budget and the audit record; inside
65
+ * the gateway it is a pass-through, because executor.ts (I2) is the gate there.
66
+ */
67
+ const registerWriteTool = createWriteToolRegistrar(server, {
68
+ connector: "gmail",
69
+ scopeEnv: "NIMBUS_MCP_GMAIL_WRITE_SCOPE",
70
+ scopeKinds: ["recipient", "draft"],
71
+ });
72
+
73
+ /**
74
+ * Standard Gmail tool, read or write: token → gmailFetch(buildPath[, buildInit]) →
75
+ * mcpJsonResultIfOk("Gmail API", …, 200).
76
+ */
77
+ const gmailRest = {
78
+ tokenEnv: "GOOGLE_OAUTH_ACCESS_TOKEN",
79
+ serviceLabel: "Gmail API",
80
+ fetch: gmailFetch,
81
+ snippetMax: 200,
82
+ } as const;
83
+
84
+ const registerGmailTool = makeRestToolRegistrar({ registrar: reg, ...gmailRest });
85
+ /** The write-tool equivalent of `registerGmailTool`, routed through the write registrar. */
86
+ const registerGmailWriteTool = makeRestWriteToolRegistrar({ registerWriteTool, ...gmailRest });
87
+
88
+ const gmailMessageListArgs = z.object({
89
+ maxResults: z.number().int().min(1).max(100).optional(),
90
+ pageToken: z.string().optional(),
91
+ q: z.string().max(500).optional(),
92
+ labelIds: z.array(z.string()).optional(),
93
+ includeSpamTrash: z.boolean().optional(),
94
+ });
95
+
96
+ registerGmailTool(
97
+ "gmail_message_list",
98
+ "List Gmail message ids (metadata). Optional Gmail search query `q` (same syntax as Gmail UI).",
99
+ gmailMessageListArgs,
100
+ (data) => {
101
+ const u = new URL(`${GMAIL_BASE}/messages`);
102
+ u.searchParams.set("maxResults", String(data.maxResults ?? 25));
103
+ if (data.pageToken !== undefined && data.pageToken !== "") {
104
+ u.searchParams.set("pageToken", data.pageToken);
105
+ }
106
+ if (data.q !== undefined && data.q !== "") {
107
+ u.searchParams.set("q", data.q);
108
+ }
109
+ if (data.labelIds !== undefined) {
110
+ for (const lid of data.labelIds) {
111
+ u.searchParams.append("labelIds", lid);
112
+ }
113
+ }
114
+ if (data.includeSpamTrash === true) {
115
+ u.searchParams.set("includeSpamTrash", "true");
116
+ }
117
+ return u.toString();
118
+ },
119
+ );
120
+
121
+ const gmailMessageReadArgs = z.object({
122
+ messageId: z.string().min(1),
123
+ format: z.enum(["minimal", "full", "metadata", "raw"]).optional(),
124
+ });
125
+
126
+ registerGmailTool(
127
+ "gmail_message_read",
128
+ "Read a single Gmail message (format minimal | metadata | full | raw).",
129
+ gmailMessageReadArgs,
130
+ (data) => {
131
+ const fmt = data.format ?? "metadata";
132
+ const u = new URL(`${GMAIL_BASE}/messages/${encodeURIComponent(data.messageId)}`);
133
+ u.searchParams.set("format", fmt);
134
+ if (fmt === "metadata") {
135
+ u.searchParams.append("metadataHeaders", "Subject");
136
+ u.searchParams.append("metadataHeaders", "From");
137
+ u.searchParams.append("metadataHeaders", "To");
138
+ u.searchParams.append("metadataHeaders", "Date");
139
+ }
140
+ return u.toString();
141
+ },
142
+ );
143
+
144
+ const gmailThreadReadArgs = z.object({
145
+ threadId: z.string().min(1),
146
+ format: z.enum(["minimal", "full", "metadata"]).optional(),
147
+ });
148
+
149
+ registerGmailTool(
150
+ "gmail_thread_read",
151
+ "Read a Gmail thread and its messages.",
152
+ gmailThreadReadArgs,
153
+ (data) => {
154
+ const fmt = data.format ?? "metadata";
155
+ const u = new URL(`${GMAIL_BASE}/threads/${encodeURIComponent(data.threadId)}`);
156
+ u.searchParams.set("format", fmt);
157
+ return u.toString();
158
+ },
159
+ );
160
+
161
+ const gmailLabelListArgs = z.object({});
162
+
163
+ registerGmailTool(
164
+ "gmail_label_list",
165
+ "List all Gmail labels.",
166
+ gmailLabelListArgs,
167
+ () => `${GMAIL_BASE}/labels`,
168
+ );
169
+
170
+ registerGmailWriteTool(
171
+ "gmail_draft_create",
172
+ {
173
+ mutates: "gmail.draft.create",
174
+ recoverable: true,
175
+ scopeTargetOf: (p) => ({ kind: "recipient", value: p.to }),
176
+ },
177
+ "Create a Gmail draft. Requires Gateway HITL email.draft.create.",
178
+ emailToolSchemas.sendArgs,
179
+ () => `${GMAIL_BASE}/drafts`,
180
+ (data) => jsonPost({ message: { raw: rawMessage(data) } }),
181
+ );
182
+
183
+ const gmailDraftSendArgs = z.object({
184
+ draftId: z.string().min(1),
185
+ });
186
+
187
+ registerGmailWriteTool(
188
+ "gmail_draft_send",
189
+ {
190
+ mutates: "gmail.draft.send",
191
+ recoverable: false,
192
+ capturePreState: (p) => Promise.resolve({ draftId: p.draftId }),
193
+ scopeTargetOf: (p) => ({ kind: "draft", value: p.draftId }),
194
+ },
195
+ "Send an existing Gmail draft by id. Requires Gateway HITL email.draft.send.",
196
+ gmailDraftSendArgs,
197
+ () => `${GMAIL_BASE}/drafts/send`,
198
+ (data) => jsonPost({ id: data.draftId }),
199
+ );
200
+
201
+ registerGmailWriteTool(
202
+ "gmail_message_send",
203
+ mailSendConsent("gmail.message.send"),
204
+ "Send a new Gmail message (not a draft). Requires Gateway HITL email.send.",
205
+ emailToolSchemas.sendArgs,
206
+ () => `${GMAIL_BASE}/messages/send`,
207
+ (data) => jsonPost({ raw: rawMessage(data) }),
208
+ );
209
+ }