n8n-nodes-browser-smart-automation 0.1.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.
- package/dist/McpClient/McpClient.node.js +333 -0
- package/dist/McpClient/McpClient.node.js.map +1 -0
- package/dist/McpClient/listSearch.js +58 -0
- package/dist/McpClient/listSearch.js.map +1 -0
- package/dist/McpClient/resourceMapping.js +61 -0
- package/dist/McpClient/resourceMapping.js.map +1 -0
- package/dist/McpClient/utils.js +248 -0
- package/dist/McpClient/utils.js.map +1 -0
- package/dist/McpClientTool/McpClientTool.node.js +417 -0
- package/dist/McpClientTool/McpClientTool.node.js.map +1 -0
- package/dist/McpClientTool/loadOptions.js +61 -0
- package/dist/McpClientTool/loadOptions.js.map +1 -0
- package/dist/McpClientTool/types.js +17 -0
- package/dist/McpClientTool/types.js.map +1 -0
- package/dist/McpClientTool/utils.js +120 -0
- package/dist/McpClientTool/utils.js.map +1 -0
- package/dist/McpTrigger/FlushingTransport.js +61 -0
- package/dist/McpTrigger/FlushingTransport.js.map +1 -0
- package/dist/McpTrigger/McpServer.js +246 -0
- package/dist/McpTrigger/McpServer.js.map +1 -0
- package/dist/McpTrigger/McpTrigger.node.js +196 -0
- package/dist/McpTrigger/McpTrigger.node.js.map +1 -0
- package/dist/shared/descriptions.js +89 -0
- package/dist/shared/descriptions.js.map +1 -0
- package/dist/shared/helpers.js +47 -0
- package/dist/shared/helpers.js.map +1 -0
- package/dist/shared/httpProxyAgent.js +31 -0
- package/dist/shared/httpProxyAgent.js.map +1 -0
- package/dist/shared/logWrapper.js +31 -0
- package/dist/shared/logWrapper.js.map +1 -0
- package/dist/shared/schemaParsing.js +32 -0
- package/dist/shared/schemaParsing.js.map +1 -0
- package/dist/shared/sharedFields.js +41 -0
- package/dist/shared/sharedFields.js.map +1 -0
- package/dist/shared/types.js +17 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/utils.js +231 -0
- package/dist/shared/utils.js.map +1 -0
- package/jest.config.js +24 -0
- package/nodes/McpClient/McpClient.node.ts +327 -0
- package/nodes/McpClient/__test__/McpClient.node.test.ts +221 -0
- package/nodes/McpClient/__test__/utils.test.ts +302 -0
- package/nodes/McpClient/listSearch.ts +48 -0
- package/nodes/McpClient/resourceMapping.ts +48 -0
- package/nodes/McpClient/utils.ts +281 -0
- package/nodes/McpClientTool/McpClientTool.node.ts +468 -0
- package/nodes/McpClientTool/__test__/McpClientTool.node.test.ts +730 -0
- package/nodes/McpClientTool/loadOptions.ts +45 -0
- package/nodes/McpClientTool/types.ts +1 -0
- package/nodes/McpClientTool/utils.ts +116 -0
- package/nodes/McpTrigger/FlushingTransport.ts +61 -0
- package/nodes/McpTrigger/McpServer.ts +317 -0
- package/nodes/McpTrigger/McpTrigger.node.ts +204 -0
- package/nodes/McpTrigger/__test__/FlushingTransport.test.ts +102 -0
- package/nodes/McpTrigger/__test__/McpServer.test.ts +532 -0
- package/nodes/McpTrigger/__test__/McpTrigger.node.test.ts +171 -0
- package/nodes/mcp.dark.svg +7 -0
- package/nodes/mcp.svg +7 -0
- package/nodes/shared/__test__/utils.test.ts +318 -0
- package/nodes/shared/descriptions.ts +65 -0
- package/nodes/shared/helpers.ts +31 -0
- package/nodes/shared/httpProxyAgent.ts +11 -0
- package/nodes/shared/logWrapper.ts +13 -0
- package/nodes/shared/schemaParsing.ts +9 -0
- package/nodes/shared/sharedFields.ts +20 -0
- package/nodes/shared/types.ts +12 -0
- package/nodes/shared/utils.ts +296 -0
- package/officail/package.json +255 -0
- package/package.json +46 -0
- package/tsconfig.json +32 -0
- package/tsup.config.ts +11 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
3
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
|
+
// import type { ClientOAuth2TokenData } from '@n8n/client-oauth2';
|
|
5
|
+
|
|
6
|
+
export interface ClientOAuth2TokenData {
|
|
7
|
+
access_token: string;
|
|
8
|
+
expires_in: number;
|
|
9
|
+
refresh_token?: string;
|
|
10
|
+
token_type: string;
|
|
11
|
+
}
|
|
12
|
+
import type {
|
|
13
|
+
IExecuteFunctions,
|
|
14
|
+
ILoadOptionsFunctions,
|
|
15
|
+
INode,
|
|
16
|
+
ISupplyDataFunctions,
|
|
17
|
+
Result,
|
|
18
|
+
} from 'n8n-workflow';
|
|
19
|
+
import { createResultError, createResultOk, NodeOperationError } from 'n8n-workflow';
|
|
20
|
+
|
|
21
|
+
import { proxyFetch } from '@utils/httpProxyAgent';
|
|
22
|
+
|
|
23
|
+
import type { McpAuthenticationOption, McpServerTransport, McpTool } from './types';
|
|
24
|
+
|
|
25
|
+
export async function getAllTools(client: Client, cursor?: string): Promise<McpTool[]> {
|
|
26
|
+
const { tools, nextCursor } = await client.listTools({ cursor });
|
|
27
|
+
|
|
28
|
+
if (nextCursor) {
|
|
29
|
+
return (tools as McpTool[]).concat(await getAllTools(client, nextCursor));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return tools as McpTool[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function safeCreateUrl(url: string, baseUrl?: string | URL): Result<URL, Error> {
|
|
36
|
+
try {
|
|
37
|
+
return createResultOk(new URL(url, baseUrl));
|
|
38
|
+
} catch (error) {
|
|
39
|
+
return createResultError(error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function normalizeAndValidateUrl(input: string): Result<URL, Error> {
|
|
44
|
+
const withProtocol = !/^https?:\/\//i.test(input) ? `https://${input}` : input;
|
|
45
|
+
const parsedUrl = safeCreateUrl(withProtocol);
|
|
46
|
+
|
|
47
|
+
if (!parsedUrl.ok) {
|
|
48
|
+
return createResultError(parsedUrl.error);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return parsedUrl;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function errorHasCode(error: unknown, code: number): boolean {
|
|
55
|
+
return (
|
|
56
|
+
!!error &&
|
|
57
|
+
typeof error === 'object' &&
|
|
58
|
+
(('code' in error && Number(error.code) === code) ||
|
|
59
|
+
('message' in error &&
|
|
60
|
+
typeof error.message === 'string' &&
|
|
61
|
+
error.message.includes(code.toString())))
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function isUnauthorizedError(error: unknown): boolean {
|
|
66
|
+
return errorHasCode(error, 401);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function isForbiddenError(error: unknown): boolean {
|
|
70
|
+
return errorHasCode(error, 403);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
type OnUnauthorizedHandler = (
|
|
74
|
+
headers?: Record<string, string>,
|
|
75
|
+
) => Promise<Record<string, string> | null>;
|
|
76
|
+
|
|
77
|
+
type ConnectMcpClientError =
|
|
78
|
+
| { type: 'invalid_url'; error: Error }
|
|
79
|
+
| { type: 'connection'; error: Error }
|
|
80
|
+
| { type: 'auth'; error: Error };
|
|
81
|
+
|
|
82
|
+
export function mapToNodeOperationError(
|
|
83
|
+
node: INode,
|
|
84
|
+
error: ConnectMcpClientError,
|
|
85
|
+
): NodeOperationError {
|
|
86
|
+
switch (error.type) {
|
|
87
|
+
case 'invalid_url':
|
|
88
|
+
return new NodeOperationError(node, error.error, {
|
|
89
|
+
message: 'Could not connect to your MCP server. The provided URL is invalid.',
|
|
90
|
+
});
|
|
91
|
+
case 'auth':
|
|
92
|
+
return new NodeOperationError(node, error.error, {
|
|
93
|
+
message: 'Could not connect to your MCP server. Authentication failed.',
|
|
94
|
+
});
|
|
95
|
+
case 'connection':
|
|
96
|
+
default:
|
|
97
|
+
return new NodeOperationError(node, error.error, {
|
|
98
|
+
message: 'Could not connect to your MCP server',
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export async function connectMcpClient({
|
|
104
|
+
headers,
|
|
105
|
+
serverTransport,
|
|
106
|
+
endpointUrl,
|
|
107
|
+
name,
|
|
108
|
+
version,
|
|
109
|
+
onUnauthorized,
|
|
110
|
+
}: {
|
|
111
|
+
serverTransport: McpServerTransport;
|
|
112
|
+
endpointUrl: string;
|
|
113
|
+
headers?: Record<string, string>;
|
|
114
|
+
name: string;
|
|
115
|
+
version: number;
|
|
116
|
+
onUnauthorized?: OnUnauthorizedHandler;
|
|
117
|
+
}): Promise<Result<Client, ConnectMcpClientError>> {
|
|
118
|
+
const endpoint = normalizeAndValidateUrl(endpointUrl);
|
|
119
|
+
|
|
120
|
+
if (!endpoint.ok) {
|
|
121
|
+
return createResultError({ type: 'invalid_url', error: endpoint.error });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const client = new Client({ name, version: version.toString() }, { capabilities: {} });
|
|
125
|
+
|
|
126
|
+
if (serverTransport === 'httpStreamable') {
|
|
127
|
+
try {
|
|
128
|
+
const transport = new StreamableHTTPClientTransport(endpoint.result, {
|
|
129
|
+
requestInit: { headers },
|
|
130
|
+
fetch: proxyFetch,
|
|
131
|
+
});
|
|
132
|
+
await client.connect(transport);
|
|
133
|
+
return createResultOk(client);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
if (onUnauthorized && isUnauthorizedError(error)) {
|
|
136
|
+
const newHeaders = await onUnauthorized(headers);
|
|
137
|
+
if (newHeaders) {
|
|
138
|
+
// Don't pass `onUnauthorized` to avoid possible infinite recursion
|
|
139
|
+
return await connectMcpClient({
|
|
140
|
+
headers: newHeaders,
|
|
141
|
+
serverTransport,
|
|
142
|
+
endpointUrl,
|
|
143
|
+
name,
|
|
144
|
+
version,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (isUnauthorizedError(error) || isForbiddenError(error)) {
|
|
150
|
+
return createResultError({ type: 'auth', error: error as Error });
|
|
151
|
+
} else {
|
|
152
|
+
return createResultError({ type: 'connection', error: error as Error });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
const sseTransport = new SSEClientTransport(endpoint.result, {
|
|
159
|
+
eventSourceInit: {
|
|
160
|
+
fetch: async (url, init) =>
|
|
161
|
+
await proxyFetch(url, {
|
|
162
|
+
...init,
|
|
163
|
+
headers: {
|
|
164
|
+
...headers,
|
|
165
|
+
Accept: 'text/event-stream',
|
|
166
|
+
},
|
|
167
|
+
}),
|
|
168
|
+
},
|
|
169
|
+
fetch: proxyFetch,
|
|
170
|
+
requestInit: { headers },
|
|
171
|
+
});
|
|
172
|
+
await client.connect(sseTransport);
|
|
173
|
+
return createResultOk(client);
|
|
174
|
+
} catch (error) {
|
|
175
|
+
if (onUnauthorized && isUnauthorizedError(error)) {
|
|
176
|
+
const newHeaders = await onUnauthorized(headers);
|
|
177
|
+
if (newHeaders) {
|
|
178
|
+
// Don't pass `onUnauthorized` to avoid possible infinite recursion
|
|
179
|
+
return await connectMcpClient({
|
|
180
|
+
headers: newHeaders,
|
|
181
|
+
serverTransport,
|
|
182
|
+
endpointUrl,
|
|
183
|
+
name,
|
|
184
|
+
version,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (isUnauthorizedError(error) || isForbiddenError(error)) {
|
|
190
|
+
return createResultError({ type: 'auth', error: error as Error });
|
|
191
|
+
} else {
|
|
192
|
+
return createResultError({ type: 'connection', error: error as Error });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export async function getAuthHeaders(
|
|
198
|
+
ctx: Pick<IExecuteFunctions, 'getCredentials'>,
|
|
199
|
+
authentication: McpAuthenticationOption,
|
|
200
|
+
): Promise<{ headers?: Record<string, string> }> {
|
|
201
|
+
switch (authentication) {
|
|
202
|
+
case 'headerAuth': {
|
|
203
|
+
const header = await ctx
|
|
204
|
+
.getCredentials<{ name: string; value: string }>('httpHeaderAuth')
|
|
205
|
+
.catch(() => null);
|
|
206
|
+
|
|
207
|
+
if (!header) return {};
|
|
208
|
+
|
|
209
|
+
return { headers: { [header.name]: header.value } };
|
|
210
|
+
}
|
|
211
|
+
case 'bearerAuth': {
|
|
212
|
+
const result = await ctx
|
|
213
|
+
.getCredentials<{ token: string }>('httpBearerAuth')
|
|
214
|
+
.catch(() => null);
|
|
215
|
+
|
|
216
|
+
if (!result) return {};
|
|
217
|
+
|
|
218
|
+
return { headers: { Authorization: `Bearer ${result.token}` } };
|
|
219
|
+
}
|
|
220
|
+
case 'mcpOAuth2Api': {
|
|
221
|
+
const result = await ctx
|
|
222
|
+
.getCredentials<{ oauthTokenData: { access_token: string } }>('mcpOAuth2Api')
|
|
223
|
+
.catch(() => null);
|
|
224
|
+
|
|
225
|
+
if (!result) return {};
|
|
226
|
+
|
|
227
|
+
return { headers: { Authorization: `Bearer ${result.oauthTokenData.access_token}` } };
|
|
228
|
+
}
|
|
229
|
+
case 'multipleHeadersAuth': {
|
|
230
|
+
const result = await ctx
|
|
231
|
+
.getCredentials<{ headers: { values: Array<{ name: string; value: string }> } }>(
|
|
232
|
+
'httpMultipleHeadersAuth',
|
|
233
|
+
)
|
|
234
|
+
.catch(() => null);
|
|
235
|
+
|
|
236
|
+
if (!result) return {};
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
headers: result.headers.values.reduce(
|
|
240
|
+
(acc, cur) => {
|
|
241
|
+
acc[cur.name] = cur.value;
|
|
242
|
+
return acc;
|
|
243
|
+
},
|
|
244
|
+
{} as Record<string, string>,
|
|
245
|
+
),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
case 'none':
|
|
249
|
+
default: {
|
|
250
|
+
return {};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Tries to refresh the OAuth2 token, storing them in the database if successful
|
|
257
|
+
* @param ctx - The execution context
|
|
258
|
+
* @param authentication - The authentication method
|
|
259
|
+
* @param headers - The headers to refresh
|
|
260
|
+
* @returns The refreshed headers or null if the authentication method is not oAuth2Api or has failed
|
|
261
|
+
*/
|
|
262
|
+
export async function tryRefreshOAuth2Token(
|
|
263
|
+
ctx: IExecuteFunctions | ISupplyDataFunctions | ILoadOptionsFunctions,
|
|
264
|
+
authentication: McpAuthenticationOption,
|
|
265
|
+
headers?: Record<string, string>,
|
|
266
|
+
) {
|
|
267
|
+
if (authentication !== 'mcpOAuth2Api') {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
let access_token: string | null = null;
|
|
272
|
+
try {
|
|
273
|
+
const result = (await ctx.helpers.refreshOAuth2Token.call(
|
|
274
|
+
ctx,
|
|
275
|
+
'mcpOAuth2Api',
|
|
276
|
+
)) as ClientOAuth2TokenData;
|
|
277
|
+
access_token = result?.access_token;
|
|
278
|
+
} catch (error) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (!access_token) {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (!headers) {
|
|
287
|
+
return {
|
|
288
|
+
Authorization: `Bearer ${access_token}`,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
...headers,
|
|
294
|
+
Authorization: `Bearer ${access_token}`,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@n8n/n8n-nodes-langchain",
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"clean": "rimraf dist .turbo",
|
|
8
|
+
"dev": "pnpm run watch",
|
|
9
|
+
"typecheck": "tsc --noEmit",
|
|
10
|
+
"copy-nodes-json": "node ../../nodes-base/scripts/copy-nodes-json.js .",
|
|
11
|
+
"copy-tokenizer-json": "node scripts/copy-tokenizer-json.js .",
|
|
12
|
+
"build": "tsup --tsconfig tsconfig.build.json && pnpm copy-nodes-json && tsc-alias -p tsconfig.build.json && pnpm copy-tokenizer-json && pnpm n8n-copy-static-files && pnpm n8n-generate-metadata",
|
|
13
|
+
"format": "biome format --write .",
|
|
14
|
+
"format:check": "biome ci .",
|
|
15
|
+
"lint": "eslint nodes credentials utils --quiet",
|
|
16
|
+
"lint:fix": "eslint nodes credentials utils --fix",
|
|
17
|
+
"watch": "tsup --watch nodes --watch credentials --watch utils --watch types --tsconfig tsconfig.build.json --onSuccess \"node ./scripts/post-build.js\"",
|
|
18
|
+
"test": "jest",
|
|
19
|
+
"test:unit": "jest",
|
|
20
|
+
"test:dev": "jest --watch"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"n8n": {
|
|
26
|
+
"n8nNodesApiVersion": 1,
|
|
27
|
+
"credentials": [
|
|
28
|
+
"dist/credentials/AnthropicApi.credentials.js",
|
|
29
|
+
"dist/credentials/AzureAiSearchApi.credentials.js",
|
|
30
|
+
"dist/credentials/AzureOpenAiApi.credentials.js",
|
|
31
|
+
"dist/credentials/AzureEntraCognitiveServicesOAuth2Api.credentials.js",
|
|
32
|
+
"dist/credentials/CohereApi.credentials.js",
|
|
33
|
+
"dist/credentials/DeepSeekApi.credentials.js",
|
|
34
|
+
"dist/credentials/GooglePalmApi.credentials.js",
|
|
35
|
+
"dist/credentials/GroqApi.credentials.js",
|
|
36
|
+
"dist/credentials/HuggingFaceApi.credentials.js",
|
|
37
|
+
"dist/credentials/McpOAuth2Api.credentials.js",
|
|
38
|
+
"dist/credentials/MotorheadApi.credentials.js",
|
|
39
|
+
"dist/credentials/MilvusApi.credentials.js",
|
|
40
|
+
"dist/credentials/MistralCloudApi.credentials.js",
|
|
41
|
+
"dist/credentials/LemonadeApi.credentials.js",
|
|
42
|
+
"dist/credentials/OllamaApi.credentials.js",
|
|
43
|
+
"dist/credentials/OpenRouterApi.credentials.js",
|
|
44
|
+
"dist/credentials/PineconeApi.credentials.js",
|
|
45
|
+
"dist/credentials/QdrantApi.credentials.js",
|
|
46
|
+
"dist/credentials/SearXngApi.credentials.js",
|
|
47
|
+
"dist/credentials/SerpApi.credentials.js",
|
|
48
|
+
"dist/credentials/VercelAiGatewayApi.credentials.js",
|
|
49
|
+
"dist/credentials/WeaviateApi.credentials.js",
|
|
50
|
+
"dist/credentials/WolframAlphaApi.credentials.js",
|
|
51
|
+
"dist/credentials/XAiApi.credentials.js",
|
|
52
|
+
"dist/credentials/XataApi.credentials.js",
|
|
53
|
+
"dist/credentials/ZepApi.credentials.js"
|
|
54
|
+
],
|
|
55
|
+
"nodes": [
|
|
56
|
+
"dist/nodes/vendors/Anthropic/Anthropic.node.js",
|
|
57
|
+
"dist/nodes/vendors/GoogleGemini/GoogleGemini.node.js",
|
|
58
|
+
"dist/nodes/vendors/Ollama/Ollama.node.js",
|
|
59
|
+
"dist/nodes/vendors/OpenAi/OpenAi.node.js",
|
|
60
|
+
"dist/nodes/agents/Agent/Agent.node.js",
|
|
61
|
+
"dist/nodes/agents/Agent/AgentTool.node.js",
|
|
62
|
+
"dist/nodes/agents/OpenAiAssistant/OpenAiAssistant.node.js",
|
|
63
|
+
"dist/nodes/chains/ChainSummarization/ChainSummarization.node.js",
|
|
64
|
+
"dist/nodes/chains/ChainLLM/ChainLlm.node.js",
|
|
65
|
+
"dist/nodes/chains/ChainRetrievalQA/ChainRetrievalQa.node.js",
|
|
66
|
+
"dist/nodes/chains/SentimentAnalysis/SentimentAnalysis.node.js",
|
|
67
|
+
"dist/nodes/chains/InformationExtractor/InformationExtractor.node.js",
|
|
68
|
+
"dist/nodes/chains/TextClassifier/TextClassifier.node.js",
|
|
69
|
+
"dist/nodes/code/Code.node.js",
|
|
70
|
+
"dist/nodes/document_loaders/DocumentDefaultDataLoader/DocumentDefaultDataLoader.node.js",
|
|
71
|
+
"dist/nodes/document_loaders/DocumentBinaryInputLoader/DocumentBinaryInputLoader.node.js",
|
|
72
|
+
"dist/nodes/document_loaders/DocumentGithubLoader/DocumentGithubLoader.node.js",
|
|
73
|
+
"dist/nodes/document_loaders/DocumentJSONInputLoader/DocumentJsonInputLoader.node.js",
|
|
74
|
+
"dist/nodes/embeddings/EmbeddingsCohere/EmbeddingsCohere.node.js",
|
|
75
|
+
"dist/nodes/embeddings/EmbeddingsAwsBedrock/EmbeddingsAwsBedrock.node.js",
|
|
76
|
+
"dist/nodes/embeddings/EmbeddingsAzureOpenAi/EmbeddingsAzureOpenAi.node.js",
|
|
77
|
+
"dist/nodes/embeddings/EmbeddingsGoogleGemini/EmbeddingsGoogleGemini.node.js",
|
|
78
|
+
"dist/nodes/embeddings/EmbeddingsGoogleVertex/EmbeddingsGoogleVertex.node.js",
|
|
79
|
+
"dist/nodes/embeddings/EmbeddingsHuggingFaceInference/EmbeddingsHuggingFaceInference.node.js",
|
|
80
|
+
"dist/nodes/embeddings/EmbeddingsMistralCloud/EmbeddingsMistralCloud.node.js",
|
|
81
|
+
"dist/nodes/embeddings/EmbeddingsOpenAI/EmbeddingsOpenAi.node.js",
|
|
82
|
+
"dist/nodes/embeddings/EmbeddingsLemonade/EmbeddingsLemonade.node.js",
|
|
83
|
+
"dist/nodes/embeddings/EmbeddingsOllama/EmbeddingsOllama.node.js",
|
|
84
|
+
"dist/nodes/llms/LMChatAnthropic/LmChatAnthropic.node.js",
|
|
85
|
+
"dist/nodes/llms/LmChatAzureOpenAi/LmChatAzureOpenAi.node.js",
|
|
86
|
+
"dist/nodes/llms/LmChatAwsBedrock/LmChatAwsBedrock.node.js",
|
|
87
|
+
"dist/nodes/llms/LmChatCohere/LmChatCohere.node.js",
|
|
88
|
+
"dist/nodes/llms/LmChatDeepSeek/LmChatDeepSeek.node.js",
|
|
89
|
+
"dist/nodes/llms/LmChatGoogleGemini/LmChatGoogleGemini.node.js",
|
|
90
|
+
"dist/nodes/llms/LmChatGoogleVertex/LmChatGoogleVertex.node.js",
|
|
91
|
+
"dist/nodes/llms/LmChatGroq/LmChatGroq.node.js",
|
|
92
|
+
"dist/nodes/llms/LmChatMistralCloud/LmChatMistralCloud.node.js",
|
|
93
|
+
"dist/nodes/llms/LMChatLemonade/LmChatLemonade.node.js",
|
|
94
|
+
"dist/nodes/llms/LMChatOllama/LmChatOllama.node.js",
|
|
95
|
+
"dist/nodes/llms/LmChatOpenRouter/LmChatOpenRouter.node.js",
|
|
96
|
+
"dist/nodes/llms/LmChatVercelAiGateway/LmChatVercelAiGateway.node.js",
|
|
97
|
+
"dist/nodes/llms/LmChatXAiGrok/LmChatXAiGrok.node.js",
|
|
98
|
+
"dist/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.js",
|
|
99
|
+
"dist/nodes/llms/LMOpenAi/LmOpenAi.node.js",
|
|
100
|
+
"dist/nodes/llms/LMCohere/LmCohere.node.js",
|
|
101
|
+
"dist/nodes/llms/LMLemonade/LmLemonade.node.js",
|
|
102
|
+
"dist/nodes/llms/LMOllama/LmOllama.node.js",
|
|
103
|
+
"dist/nodes/llms/LMOpenHuggingFaceInference/LmOpenHuggingFaceInference.node.js",
|
|
104
|
+
"dist/nodes/mcp/McpClient/McpClient.node.js",
|
|
105
|
+
"dist/nodes/mcp/McpClientTool/McpClientTool.node.js",
|
|
106
|
+
"dist/nodes/mcp/McpTrigger/McpTrigger.node.js",
|
|
107
|
+
"dist/nodes/memory/MemoryBufferWindow/MemoryBufferWindow.node.js",
|
|
108
|
+
"dist/nodes/memory/MemoryMotorhead/MemoryMotorhead.node.js",
|
|
109
|
+
"dist/nodes/memory/MemoryPostgresChat/MemoryPostgresChat.node.js",
|
|
110
|
+
"dist/nodes/memory/MemoryMongoDbChat/MemoryMongoDbChat.node.js",
|
|
111
|
+
"dist/nodes/memory/MemoryRedisChat/MemoryRedisChat.node.js",
|
|
112
|
+
"dist/nodes/memory/MemoryManager/MemoryManager.node.js",
|
|
113
|
+
"dist/nodes/memory/MemoryChatRetriever/MemoryChatRetriever.node.js",
|
|
114
|
+
"dist/nodes/memory/MemoryXata/MemoryXata.node.js",
|
|
115
|
+
"dist/nodes/memory/MemoryZep/MemoryZep.node.js",
|
|
116
|
+
"dist/nodes/output_parser/OutputParserAutofixing/OutputParserAutofixing.node.js",
|
|
117
|
+
"dist/nodes/output_parser/OutputParserItemList/OutputParserItemList.node.js",
|
|
118
|
+
"dist/nodes/output_parser/OutputParserStructured/OutputParserStructured.node.js",
|
|
119
|
+
"dist/nodes/rerankers/RerankerCohere/RerankerCohere.node.js",
|
|
120
|
+
"dist/nodes/retrievers/RetrieverContextualCompression/RetrieverContextualCompression.node.js",
|
|
121
|
+
"dist/nodes/retrievers/RetrieverVectorStore/RetrieverVectorStore.node.js",
|
|
122
|
+
"dist/nodes/retrievers/RetrieverMultiQuery/RetrieverMultiQuery.node.js",
|
|
123
|
+
"dist/nodes/retrievers/RetrieverWorkflow/RetrieverWorkflow.node.js",
|
|
124
|
+
"dist/nodes/text_splitters/TextSplitterCharacterTextSplitter/TextSplitterCharacterTextSplitter.node.js",
|
|
125
|
+
"dist/nodes/text_splitters/TextSplitterRecursiveCharacterTextSplitter/TextSplitterRecursiveCharacterTextSplitter.node.js",
|
|
126
|
+
"dist/nodes/text_splitters/TextSplitterTokenSplitter/TextSplitterTokenSplitter.node.js",
|
|
127
|
+
"dist/nodes/tools/ToolCalculator/ToolCalculator.node.js",
|
|
128
|
+
"dist/nodes/tools/ToolCode/ToolCode.node.js",
|
|
129
|
+
"dist/nodes/tools/ToolHttpRequest/ToolHttpRequest.node.js",
|
|
130
|
+
"dist/nodes/tools/ToolSearXng/ToolSearXng.node.js",
|
|
131
|
+
"dist/nodes/tools/ToolSerpApi/ToolSerpApi.node.js",
|
|
132
|
+
"dist/nodes/tools/ToolThink/ToolThink.node.js",
|
|
133
|
+
"dist/nodes/tools/ToolVectorStore/ToolVectorStore.node.js",
|
|
134
|
+
"dist/nodes/tools/ToolWikipedia/ToolWikipedia.node.js",
|
|
135
|
+
"dist/nodes/tools/ToolWolframAlpha/ToolWolframAlpha.node.js",
|
|
136
|
+
"dist/nodes/tools/ToolWorkflow/ToolWorkflow.node.js",
|
|
137
|
+
"dist/nodes/trigger/ManualChatTrigger/ManualChatTrigger.node.js",
|
|
138
|
+
"dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js",
|
|
139
|
+
"dist/nodes/trigger/ChatTrigger/Chat.node.js",
|
|
140
|
+
"dist/nodes/vector_store/VectorStoreAzureAISearch/VectorStoreAzureAISearch.node.js",
|
|
141
|
+
"dist/nodes/vector_store/VectorStoreInMemory/VectorStoreInMemory.node.js",
|
|
142
|
+
"dist/nodes/vector_store/VectorStoreInMemoryInsert/VectorStoreInMemoryInsert.node.js",
|
|
143
|
+
"dist/nodes/vector_store/VectorStoreInMemoryLoad/VectorStoreInMemoryLoad.node.js",
|
|
144
|
+
"dist/nodes/vector_store/VectorStoreMilvus/VectorStoreMilvus.node.js",
|
|
145
|
+
"dist/nodes/vector_store/VectorStoreMongoDBAtlas/VectorStoreMongoDBAtlas.node.js",
|
|
146
|
+
"dist/nodes/vector_store/VectorStorePGVector/VectorStorePGVector.node.js",
|
|
147
|
+
"dist/nodes/vector_store/VectorStorePinecone/VectorStorePinecone.node.js",
|
|
148
|
+
"dist/nodes/vector_store/VectorStorePineconeInsert/VectorStorePineconeInsert.node.js",
|
|
149
|
+
"dist/nodes/vector_store/VectorStorePineconeLoad/VectorStorePineconeLoad.node.js",
|
|
150
|
+
"dist/nodes/vector_store/VectorStoreRedis/VectorStoreRedis.node.js",
|
|
151
|
+
"dist/nodes/vector_store/VectorStoreQdrant/VectorStoreQdrant.node.js",
|
|
152
|
+
"dist/nodes/vector_store/VectorStoreSupabase/VectorStoreSupabase.node.js",
|
|
153
|
+
"dist/nodes/vector_store/VectorStoreSupabaseInsert/VectorStoreSupabaseInsert.node.js",
|
|
154
|
+
"dist/nodes/vector_store/VectorStoreSupabaseLoad/VectorStoreSupabaseLoad.node.js",
|
|
155
|
+
"dist/nodes/vector_store/VectorStoreWeaviate/VectorStoreWeaviate.node.js",
|
|
156
|
+
"dist/nodes/vector_store/VectorStoreZep/VectorStoreZep.node.js",
|
|
157
|
+
"dist/nodes/vector_store/VectorStoreZepInsert/VectorStoreZepInsert.node.js",
|
|
158
|
+
"dist/nodes/vector_store/VectorStoreZepLoad/VectorStoreZepLoad.node.js",
|
|
159
|
+
"dist/nodes/ToolExecutor/ToolExecutor.node.js",
|
|
160
|
+
"dist/nodes/ModelSelector/ModelSelector.node.js",
|
|
161
|
+
"dist/nodes/Guardrails/Guardrails.node.js"
|
|
162
|
+
]
|
|
163
|
+
},
|
|
164
|
+
"devDependencies": {
|
|
165
|
+
"@n8n/eslint-plugin-community-nodes": "workspace:*",
|
|
166
|
+
"@types/basic-auth": "catalog:",
|
|
167
|
+
"@types/cheerio": "^0.22.15",
|
|
168
|
+
"@types/html-to-text": "^9.0.1",
|
|
169
|
+
"@types/json-schema": "^7.0.15",
|
|
170
|
+
"@types/mime-types": "catalog:",
|
|
171
|
+
"@types/pg": "^8.11.6",
|
|
172
|
+
"@types/sanitize-html": "^2.11.0",
|
|
173
|
+
"@types/temp": "^0.9.1",
|
|
174
|
+
"fast-glob": "catalog:",
|
|
175
|
+
"jest-mock-extended": "^3.0.4",
|
|
176
|
+
"n8n-core": "workspace:*",
|
|
177
|
+
"tsup": "^8.5.0"
|
|
178
|
+
},
|
|
179
|
+
"dependencies": {
|
|
180
|
+
"@aws-sdk/client-sso-oidc": "3.808.0",
|
|
181
|
+
"@azure/identity": "catalog:",
|
|
182
|
+
"@azure/search-documents": "12.1.0",
|
|
183
|
+
"@getzep/zep-cloud": "1.0.6",
|
|
184
|
+
"@getzep/zep-js": "0.9.0",
|
|
185
|
+
"@google-cloud/resource-manager": "5.3.0",
|
|
186
|
+
"@google/generative-ai": "0.21.0",
|
|
187
|
+
"@google/genai": "1.19.0",
|
|
188
|
+
"@huggingface/inference": "4.0.5",
|
|
189
|
+
"@langchain/anthropic": "catalog:",
|
|
190
|
+
"@langchain/aws": "1.0.3",
|
|
191
|
+
"@langchain/cohere": "1.0.1",
|
|
192
|
+
"@langchain/community": "catalog:",
|
|
193
|
+
"@langchain/core": "catalog:",
|
|
194
|
+
"@langchain/google-genai": "2.0.0",
|
|
195
|
+
"@langchain/google-vertexai": "2.0.0",
|
|
196
|
+
"@langchain/groq": "1.0.2",
|
|
197
|
+
"@langchain/mistralai": "1.0.1",
|
|
198
|
+
"@langchain/mongodb": "1.0.1",
|
|
199
|
+
"@langchain/ollama": "1.0.2",
|
|
200
|
+
"@langchain/openai": "catalog:",
|
|
201
|
+
"@langchain/pinecone": "1.0.1",
|
|
202
|
+
"@langchain/qdrant": "1.0.1",
|
|
203
|
+
"@langchain/redis": "1.0.1",
|
|
204
|
+
"@langchain/textsplitters": "1.0.1",
|
|
205
|
+
"@langchain/weaviate": "1.0.1",
|
|
206
|
+
"@modelcontextprotocol/sdk": "1.24.0",
|
|
207
|
+
"@mozilla/readability": "0.6.0",
|
|
208
|
+
"@n8n/client-oauth2": "workspace:*",
|
|
209
|
+
"@n8n/config": "workspace:*",
|
|
210
|
+
"@n8n/di": "workspace:*",
|
|
211
|
+
"@n8n/errors": "workspace:*",
|
|
212
|
+
"@n8n/json-schema-to-zod": "workspace:*",
|
|
213
|
+
"@n8n/typeorm": "catalog:",
|
|
214
|
+
"@n8n/typescript-config": "workspace:*",
|
|
215
|
+
"@n8n/vm2": "3.9.25",
|
|
216
|
+
"@pinecone-database/pinecone": "^5.0.2",
|
|
217
|
+
"@qdrant/js-client-rest": "^1.16.2",
|
|
218
|
+
"@supabase/supabase-js": "2.49.9",
|
|
219
|
+
"@xata.io/client": "0.28.4",
|
|
220
|
+
"@zilliz/milvus2-sdk-node": "^2.5.7",
|
|
221
|
+
"basic-auth": "catalog:",
|
|
222
|
+
"cheerio": "1.0.0",
|
|
223
|
+
"cohere-ai": "7.14.0",
|
|
224
|
+
"d3-dsv": "2.0.0",
|
|
225
|
+
"epub2": "3.0.2",
|
|
226
|
+
"form-data": "catalog:",
|
|
227
|
+
"generate-schema": "2.6.0",
|
|
228
|
+
"html-to-text": "9.0.5",
|
|
229
|
+
"https-proxy-agent": "catalog:",
|
|
230
|
+
"ignore": "^5.2.0",
|
|
231
|
+
"js-tiktoken": "^1.0.12",
|
|
232
|
+
"jsdom": "23.0.1",
|
|
233
|
+
"langchain": "1.1.1",
|
|
234
|
+
"@langchain/classic": "1.0.5",
|
|
235
|
+
"lodash": "catalog:",
|
|
236
|
+
"mammoth": "1.11.0",
|
|
237
|
+
"mime-types": "catalog:",
|
|
238
|
+
"mongodb": "^6.17.0",
|
|
239
|
+
"n8n-nodes-base": "workspace:*",
|
|
240
|
+
"n8n-workflow": "workspace:*",
|
|
241
|
+
"openai": "^6.9.0",
|
|
242
|
+
"pdf-parse": "1.1.1",
|
|
243
|
+
"pg": "8.12.0",
|
|
244
|
+
"proxy-from-env": "^1.1.0",
|
|
245
|
+
"redis": "4.6.14",
|
|
246
|
+
"sanitize-html": "2.12.1",
|
|
247
|
+
"sqlite3": "5.1.7",
|
|
248
|
+
"temp": "0.9.4",
|
|
249
|
+
"tmp-promise": "3.0.3",
|
|
250
|
+
"undici": "^6.21.0",
|
|
251
|
+
"weaviate-client": "3.6.2",
|
|
252
|
+
"zod": "catalog:",
|
|
253
|
+
"zod-to-json-schema": "3.23.3"
|
|
254
|
+
}
|
|
255
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-browser-smart-automation",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "n8n nodes for Smart Browser Automation via MCP",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"n8n-community-node-package"
|
|
7
|
+
],
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"n8n": {
|
|
10
|
+
"n8nNodesApiVersion": 1,
|
|
11
|
+
"nodes": [
|
|
12
|
+
"dist/nodes/McpClient/McpClient.node.js",
|
|
13
|
+
"dist/nodes/McpClientTool/McpClientTool.node.js",
|
|
14
|
+
"dist/nodes/McpTrigger/McpTrigger.node.js"
|
|
15
|
+
],
|
|
16
|
+
"credentials": []
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"dev": "tsc --watch",
|
|
21
|
+
"lint": "eslint nodes --ext .ts",
|
|
22
|
+
"prepublishOnly": "npm run build",
|
|
23
|
+
"test": "jest"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@langchain/classic": "^1.0.7",
|
|
27
|
+
"@langchain/core": "^1.1.7",
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.1.0",
|
|
29
|
+
"n8n-workflow": "*",
|
|
30
|
+
"zod": "^3.22.4",
|
|
31
|
+
"zod-to-json-schema": "^3.25.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/jest": "^30.0.0",
|
|
35
|
+
"@types/json-schema": "^7.0.15",
|
|
36
|
+
"@types/node": "^20.10.0",
|
|
37
|
+
"@types/uuid": "^11.0.0",
|
|
38
|
+
"eslint": "^8.56.0",
|
|
39
|
+
"jest": "^30.2.0",
|
|
40
|
+
"jest-mock-extended": "^4.0.0",
|
|
41
|
+
"n8n-nodes-base": "^1.0.0",
|
|
42
|
+
"ts-jest": "^29.4.6",
|
|
43
|
+
"tsup": "^8.5.1",
|
|
44
|
+
"typescript": "^5.3.3"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2022",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": [
|
|
6
|
+
"es2022"
|
|
7
|
+
],
|
|
8
|
+
"declaration": true,
|
|
9
|
+
"outDir": "./dist",
|
|
10
|
+
"rootDir": "./nodes",
|
|
11
|
+
"strict": true,
|
|
12
|
+
"baseUrl": ".",
|
|
13
|
+
"paths": {
|
|
14
|
+
"@utils/*": [
|
|
15
|
+
"nodes/shared/*"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"types": [],
|
|
19
|
+
"esModuleInterop": true,
|
|
20
|
+
"skipLibCheck": true,
|
|
21
|
+
"forceConsistentCasingInFileNames": true
|
|
22
|
+
},
|
|
23
|
+
"include": [
|
|
24
|
+
"nodes/**/*"
|
|
25
|
+
],
|
|
26
|
+
"exclude": [
|
|
27
|
+
"node_modules",
|
|
28
|
+
"dist",
|
|
29
|
+
"**/__test__/**",
|
|
30
|
+
"**/*.test.ts"
|
|
31
|
+
]
|
|
32
|
+
}
|
package/tsup.config.ts
ADDED