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.
Files changed (71) hide show
  1. package/dist/McpClient/McpClient.node.js +333 -0
  2. package/dist/McpClient/McpClient.node.js.map +1 -0
  3. package/dist/McpClient/listSearch.js +58 -0
  4. package/dist/McpClient/listSearch.js.map +1 -0
  5. package/dist/McpClient/resourceMapping.js +61 -0
  6. package/dist/McpClient/resourceMapping.js.map +1 -0
  7. package/dist/McpClient/utils.js +248 -0
  8. package/dist/McpClient/utils.js.map +1 -0
  9. package/dist/McpClientTool/McpClientTool.node.js +417 -0
  10. package/dist/McpClientTool/McpClientTool.node.js.map +1 -0
  11. package/dist/McpClientTool/loadOptions.js +61 -0
  12. package/dist/McpClientTool/loadOptions.js.map +1 -0
  13. package/dist/McpClientTool/types.js +17 -0
  14. package/dist/McpClientTool/types.js.map +1 -0
  15. package/dist/McpClientTool/utils.js +120 -0
  16. package/dist/McpClientTool/utils.js.map +1 -0
  17. package/dist/McpTrigger/FlushingTransport.js +61 -0
  18. package/dist/McpTrigger/FlushingTransport.js.map +1 -0
  19. package/dist/McpTrigger/McpServer.js +246 -0
  20. package/dist/McpTrigger/McpServer.js.map +1 -0
  21. package/dist/McpTrigger/McpTrigger.node.js +196 -0
  22. package/dist/McpTrigger/McpTrigger.node.js.map +1 -0
  23. package/dist/shared/descriptions.js +89 -0
  24. package/dist/shared/descriptions.js.map +1 -0
  25. package/dist/shared/helpers.js +47 -0
  26. package/dist/shared/helpers.js.map +1 -0
  27. package/dist/shared/httpProxyAgent.js +31 -0
  28. package/dist/shared/httpProxyAgent.js.map +1 -0
  29. package/dist/shared/logWrapper.js +31 -0
  30. package/dist/shared/logWrapper.js.map +1 -0
  31. package/dist/shared/schemaParsing.js +32 -0
  32. package/dist/shared/schemaParsing.js.map +1 -0
  33. package/dist/shared/sharedFields.js +41 -0
  34. package/dist/shared/sharedFields.js.map +1 -0
  35. package/dist/shared/types.js +17 -0
  36. package/dist/shared/types.js.map +1 -0
  37. package/dist/shared/utils.js +231 -0
  38. package/dist/shared/utils.js.map +1 -0
  39. package/jest.config.js +24 -0
  40. package/nodes/McpClient/McpClient.node.ts +327 -0
  41. package/nodes/McpClient/__test__/McpClient.node.test.ts +221 -0
  42. package/nodes/McpClient/__test__/utils.test.ts +302 -0
  43. package/nodes/McpClient/listSearch.ts +48 -0
  44. package/nodes/McpClient/resourceMapping.ts +48 -0
  45. package/nodes/McpClient/utils.ts +281 -0
  46. package/nodes/McpClientTool/McpClientTool.node.ts +468 -0
  47. package/nodes/McpClientTool/__test__/McpClientTool.node.test.ts +730 -0
  48. package/nodes/McpClientTool/loadOptions.ts +45 -0
  49. package/nodes/McpClientTool/types.ts +1 -0
  50. package/nodes/McpClientTool/utils.ts +116 -0
  51. package/nodes/McpTrigger/FlushingTransport.ts +61 -0
  52. package/nodes/McpTrigger/McpServer.ts +317 -0
  53. package/nodes/McpTrigger/McpTrigger.node.ts +204 -0
  54. package/nodes/McpTrigger/__test__/FlushingTransport.test.ts +102 -0
  55. package/nodes/McpTrigger/__test__/McpServer.test.ts +532 -0
  56. package/nodes/McpTrigger/__test__/McpTrigger.node.test.ts +171 -0
  57. package/nodes/mcp.dark.svg +7 -0
  58. package/nodes/mcp.svg +7 -0
  59. package/nodes/shared/__test__/utils.test.ts +318 -0
  60. package/nodes/shared/descriptions.ts +65 -0
  61. package/nodes/shared/helpers.ts +31 -0
  62. package/nodes/shared/httpProxyAgent.ts +11 -0
  63. package/nodes/shared/logWrapper.ts +13 -0
  64. package/nodes/shared/schemaParsing.ts +9 -0
  65. package/nodes/shared/sharedFields.ts +20 -0
  66. package/nodes/shared/types.ts +12 -0
  67. package/nodes/shared/utils.ts +296 -0
  68. package/officail/package.json +255 -0
  69. package/package.json +46 -0
  70. package/tsconfig.json +32 -0
  71. 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
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'tsup';
2
+
3
+ export default defineConfig({
4
+ entry: ['nodes/**/*.ts', '!nodes/**/*.test.ts', '!nodes/**/__test__/**'],
5
+ format: ['cjs'],
6
+ clean: true,
7
+ dts: false,
8
+ bundle: false,
9
+ sourcemap: true,
10
+ silent: true,
11
+ });