@elastic.io/mcp 1.0.0 → 1.0.1-beta

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 (118) hide show
  1. package/README.md +128 -126
  2. package/README.npm.md +173 -0
  3. package/dist/api/client.d.ts.map +1 -1
  4. package/dist/api/client.js +8 -3
  5. package/dist/api/client.js.map +1 -1
  6. package/dist/api/jsonapi.d.ts +2 -9
  7. package/dist/api/jsonapi.d.ts.map +1 -1
  8. package/dist/api/jsonapi.js +1 -14
  9. package/dist/api/jsonapi.js.map +1 -1
  10. package/dist/api/logger.d.ts +0 -1
  11. package/dist/api/logger.d.ts.map +1 -1
  12. package/dist/api/logger.js +2 -5
  13. package/dist/api/logger.js.map +1 -1
  14. package/dist/api/samples.d.ts +0 -6
  15. package/dist/api/samples.d.ts.map +1 -1
  16. package/dist/api/samples.js +8 -8
  17. package/dist/api/samples.js.map +1 -1
  18. package/dist/api/verification.d.ts +6 -0
  19. package/dist/api/verification.d.ts.map +1 -0
  20. package/dist/api/verification.js +71 -0
  21. package/dist/api/verification.js.map +1 -0
  22. package/dist/cli.d.ts +3 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +9 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/config.d.ts +0 -1
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +0 -5
  29. package/dist/config.js.map +1 -1
  30. package/dist/index.js +11 -10
  31. package/dist/index.js.map +1 -1
  32. package/dist/paths.d.ts +0 -1
  33. package/dist/paths.d.ts.map +1 -1
  34. package/dist/paths.js +1 -1
  35. package/dist/paths.js.map +1 -1
  36. package/dist/server.d.ts.map +1 -1
  37. package/dist/server.js +24 -0
  38. package/dist/server.js.map +1 -1
  39. package/dist/setup.d.ts +3 -0
  40. package/dist/setup.d.ts.map +1 -0
  41. package/dist/setup.js +338 -0
  42. package/dist/setup.js.map +1 -0
  43. package/dist/tools/confirmation.d.ts +0 -4
  44. package/dist/tools/confirmation.d.ts.map +1 -1
  45. package/dist/tools/confirmation.js +1 -1
  46. package/dist/tools/confirmation.js.map +1 -1
  47. package/dist/tools/constants.d.ts +6 -9
  48. package/dist/tools/constants.d.ts.map +1 -1
  49. package/dist/tools/constants.js +48 -41
  50. package/dist/tools/constants.js.map +1 -1
  51. package/dist/tools/definitions.d.ts.map +1 -1
  52. package/dist/tools/definitions.js +37 -5
  53. package/dist/tools/definitions.js.map +1 -1
  54. package/dist/tools/flow-build.d.ts +18 -0
  55. package/dist/tools/flow-build.d.ts.map +1 -0
  56. package/dist/tools/flow-build.js +295 -0
  57. package/dist/tools/flow-build.js.map +1 -0
  58. package/dist/tools/flow-evidence.d.ts +62 -0
  59. package/dist/tools/flow-evidence.d.ts.map +1 -0
  60. package/dist/tools/flow-evidence.js +128 -0
  61. package/dist/tools/flow-evidence.js.map +1 -0
  62. package/dist/tools/flow-state-machine.d.ts +69 -0
  63. package/dist/tools/flow-state-machine.d.ts.map +1 -0
  64. package/dist/tools/flow-state-machine.js +292 -0
  65. package/dist/tools/flow-state-machine.js.map +1 -0
  66. package/dist/tools/handlers/auth.d.ts.map +1 -1
  67. package/dist/tools/handlers/auth.js +18 -148
  68. package/dist/tools/handlers/auth.js.map +1 -1
  69. package/dist/tools/handlers/component.d.ts.map +1 -1
  70. package/dist/tools/handlers/component.js +28 -8
  71. package/dist/tools/handlers/component.js.map +1 -1
  72. package/dist/tools/handlers/data-sample.d.ts.map +1 -1
  73. package/dist/tools/handlers/data-sample.js +37 -5
  74. package/dist/tools/handlers/data-sample.js.map +1 -1
  75. package/dist/tools/handlers/dynamic.d.ts.map +1 -1
  76. package/dist/tools/handlers/dynamic.js +43 -14
  77. package/dist/tools/handlers/dynamic.js.map +1 -1
  78. package/dist/tools/handlers/flow.d.ts.map +1 -1
  79. package/dist/tools/handlers/flow.js +147 -619
  80. package/dist/tools/handlers/flow.js.map +1 -1
  81. package/dist/tools/handlers/log.d.ts.map +1 -1
  82. package/dist/tools/handlers/log.js +31 -0
  83. package/dist/tools/handlers/log.js.map +1 -1
  84. package/dist/tools/handlers/raw.d.ts.map +1 -1
  85. package/dist/tools/handlers/raw.js +5 -2
  86. package/dist/tools/handlers/raw.js.map +1 -1
  87. package/dist/tools/handlers/search.d.ts.map +1 -1
  88. package/dist/tools/handlers/search.js +67 -44
  89. package/dist/tools/handlers/search.js.map +1 -1
  90. package/dist/tools/handlers/session.d.ts.map +1 -1
  91. package/dist/tools/handlers/session.js +8 -1
  92. package/dist/tools/handlers/session.js.map +1 -1
  93. package/dist/tools/handlers.d.ts.map +1 -1
  94. package/dist/tools/handlers.js +7 -2
  95. package/dist/tools/handlers.js.map +1 -1
  96. package/dist/tools/helpers.d.ts +0 -1
  97. package/dist/tools/helpers.d.ts.map +1 -1
  98. package/dist/tools/helpers.js +2 -2
  99. package/dist/tools/helpers.js.map +1 -1
  100. package/dist/tools/types.d.ts +8 -1
  101. package/dist/tools/types.d.ts.map +1 -1
  102. package/dist/tools/validation.d.ts +16 -5
  103. package/dist/tools/validation.d.ts.map +1 -1
  104. package/dist/tools/validation.js +220 -168
  105. package/dist/tools/validation.js.map +1 -1
  106. package/dist/vectorstore/qdrant.js +1 -1
  107. package/dist/vectorstore/qdrant.js.map +1 -1
  108. package/package.json +22 -7
  109. package/resources/docs/flow-building-guide.md +18 -2
  110. package/resources/docs/rest-api-pagination.md +58 -0
  111. package/resources/docs/system-instructions.md +35 -5
  112. package/resources/docs/component-test-scenarios.md +0 -2468
  113. package/resources/docs/credential-validation-gaps.md +0 -35
  114. package/resources/docs/debug-issues.md +0 -71
  115. package/resources/docs/deployment-and-scaling.md +0 -136
  116. package/resources/docs/packaging-plan.md +0 -84
  117. package/resources/docs/unique-components.md +0 -60
  118. package/resources/docs/verified-creds-flow-ids.md +0 -193
@@ -1,35 +0,0 @@
1
- # Credential Validation Gaps
2
-
3
- ## Problem
4
- When building or updating a flow, the MCP server does not validate whether credentials/secrets are actually functional before allowing them to be used. This leads to flows being created with broken credentials that fail at runtime.
5
-
6
- ## Discovered on flow `6aaa5f922fbba1001240ee87`
7
- - Step 7: Azure Data Lake Storage (`makeRawRequest`)
8
- - Secret used: `68655543cb48720012860817` ("My New Azure Data Lake Storage component Credential") — state `ready` but account `sparrow1test` does not exist (DNS failure)
9
- - Second secret: `6842d77f5758c500127a90b1` ("QA") — state `error`, OAuth refresh_token expired since July 2025
10
-
11
- ## Fix applied (partial)
12
- Changed `discoveryState.secrets` from `Set<string>` to `Map<string, string>` (id → state) so that `checkDiscoveryState()` can reject secrets in `error` state **before** submitting to the API.
13
-
14
- ### Files changed
15
- - `src/tools/types.ts` — `secrets` type changed to `Map<string, string>`
16
- - `src/tools/handlers.ts` — initialization updated
17
- - `src/tools/handlers/auth.ts` — `list_secrets` now stores state
18
- - `src/tools/validation.ts` — `checkDiscoveryState()` rejects non-ready secrets
19
- - `src/tools/__tests__/handlers.test.ts` — updated to use Map
20
-
21
- ## Additional fix: verification tracking and pre-submission blocking
22
-
23
- Added `credentialVerifications: Map<string, { ok: boolean; error?: string }>` to `DiscoveryState`.
24
-
25
- ### Changes
26
- - `src/tools/types.ts` — added `credentialVerifications` field
27
- - `src/tools/handlers.ts` — initialization updated
28
- - `src/tools/handlers/auth.ts` — `init_verify_credentials` now polls verification result internally and stores it in `discoveryState.credentialVerifications`. Returns final result instead of pending executionId.
29
- - `src/tools/validation.ts` — `checkDiscoveryState()` checks verification results for all nodes and blocks credentials/secrets that failed verification
30
- - `src/tools/__tests__/handlers.test.ts` — 6 new tests + 4 updated existing tests
31
-
32
- ### What this covers
33
- 1. **Secret in `ready` state but actually broken** — caught if `init_verify_credentials` was called (verification result stored and checked pre-submission)
34
- 2. **Plain credentials** — same mechanism via `credentialVerifications` Map
35
- 3. **Test coverage** — secret state check + verification result check for both secrets and plain credentials
@@ -1,71 +0,0 @@
1
- # Debug Issues — Component Testing
2
-
3
- Issues discovered during debug_flow_step testing on flow `6aad4e79acd7d1001240041f`.
4
-
5
- ---
6
-
7
- ## Apptivo — Invalid API endpoint
8
-
9
- - **Component**: `PS_component_testing/apptivo-component` (`689b49481890650012d6e5b9`)
10
- - **Action**: `makeRawRequest`
11
- - **Credential**: `QA_test` (`689b54ef1890650012d72e17`) — verifies OK
12
- - **Problem**: All `makeRawRequest` calls return `500 Internal Server Error` with `{"status_code":"1503","status_reason":"Invalid API end point","status":"failure"}`
13
- - **Tried URLs**:
14
- - `/contacts?a=getAllContacts&countPerPage=1`
15
- - `/contacts?a=getContactById&contactId=1`
16
- - `contacts?a=getAllContacts&countPerPage=1` (without leading slash)
17
- - **Base URL**: Component docs say base is `https://app.apptivo.com/app/dao/v6`, so the raw request URL should be relative to that. None of the tried paths worked.
18
- - **Status**: Unresolved. Needs investigation of correct Apptivo API v6 URL format.
19
-
20
- ---
21
-
22
- ## Square — URL requires no `/v2` prefix
23
-
24
- - **Component**: `PS_component_testing/square-component` (`667be8681ed49100120a1197`)
25
- - **Action**: `makeRawRequest`
26
- - **Credential**: `QA` (`68babd3faa954a00120aabbf`) — verifies OK
27
- - **Problem**: `/v2/locations` returns 404 (`INVALID_REQUEST_ERROR / NOT_FOUND`), but `/locations` works fine (200 with location data).
28
- - **Root cause**: The component's base URL already includes `/v2`, so raw request paths should NOT include the `/v2` prefix. This is not obvious from the component descriptor.
29
- - **Status**: Resolved. Use paths without `/v2` prefix (e.g. `/locations` instead of `/v2/locations`).
30
-
31
- ---
32
-
33
- ## Phantom data sample / dynamic_metadata deletion
34
-
35
- - **Flow**: `6aad4e79acd7d1001240041f`
36
- - **Problem**: After building 18 steps with debug samples, UI showed "Failed to load the samples" for all steps. Investigation found 4 missing resources (404):
37
- - `6ab260c7adc8720012aacb24` — `dynamic_metadata` on step_8 (AWS S3)
38
- - `6ab2771aab80c900126621e0` — `dynamic_metadata` on step_13 (Gemini)
39
- - `6ab2771badc8720012adf2dc` — `dynamic_metadata` on step_14 (Grok)
40
- - `6ab28333ab80c9001267dd0a` — `selected_data_samples` on step_18 (Stripe)
41
- - **UI behavior**: `src/frontend/src/modules/store/actions/data-samples.js:70-75` uses `Promise.all` to load all samples; if any returns 404, the entire load fails with "Failed to load the samples".
42
- - **What dynamic_metadata actually is**: Stored in MongoDB collection `DynamicMetadata` (`src/commons/lib/models/dynamic_metadata.js`), NOT in `DataSample`. Created by `/v2/components/{id}/versions/{ver}/dynamic-metadata`. The `dynamic_metadata` field on a node references a DynamicMetadata record, not a data sample — so a 404 on these should NOT cause data sample loading to fail (unless the UI tries to load them as data samples).
43
- - **No TTL/GC exists**: Neither `DataSample` nor `DynamicMetadata` models have `expireAfterSeconds` indexes. Wiper does not clean them. Both are only deleted on workspace deletion or recipe re-export.
44
- - **Root cause**: Unknown. The records disappeared without any known cleanup mechanism. Possible causes:
45
- - Manual deletion via API or DB
46
- - Debug process resetting the draft and orphaning/deleting associated records
47
- - Race condition during concurrent draft modifications (UI + API)
48
- - **Fix applied**: Removed broken `dynamic_metadata` references from step_8/13/14, re-debugged Stripe to create new data sample `6ab2851cadc8720012b015e0`.
49
- - **Status**: Fixed but root cause unknown. Needs investigation of what deletes data samples and dynamic metadata records outside of workspace deletion.
50
-
51
- ---
52
-
53
- ## SAP Business One — Debug timeout (30s)
54
-
55
- - **Component**: `PS_component_testing/sap-business-one-component` (`676e7cb9d6b1100012f5e9be`)
56
- - **Action**: `makeRawRequest`
57
- - **Credential**: (`676ea7e5d6b1100012f6d05b`)
58
- - **Input**: `{"method": "GET", "url": "BusinessPartners?$top=1"}`
59
- - **Problem**: `debug_flow_step` times out after 30s. On-premise SAP system too slow to respond within the debug timeout window.
60
- - **Status**: Unresolved. Synthetic data sample used instead. Live retrieval not possible with current 30s timeout.
61
-
62
- ---
63
-
64
- ## MS Dynamics CRM V2 — DNS resolution failure
65
-
66
- - **Component**: `PS_component_testing/microsoft-dynamics-crm-v2` (`64592579991bbb00128be3e4`)
67
- - **Action**: `makeRawRequest`
68
- - **Secret**: (`686fc9f14109aa0012d32f07`)
69
- - **Input**: `{"method": "GET", "url": "accounts?$top=1"}`
70
- - **Problem**: `500 Internal Server Error` — `getaddrinfo ENOTFOUND org15005212.crm4.dynamics.com`. The Dynamics CRM instance hostname cannot be resolved (instance may be decommissioned or offline).
71
- - **Status**: Unresolved. Synthetic data sample used instead. Credential/instance needs verification.
@@ -1,136 +0,0 @@
1
- # Deployment and Scaling Guide (SSE Mode)
2
-
3
- This guide documents the architecture, horizontal scaling requirements, and security controls for deploying the elastic.io MCP server in multi-tenant cloud environments.
4
-
5
- ---
6
-
7
- ## 1. The Stateful Nature of SSE Mode
8
-
9
- When running in Server-Sent Events (SSE) mode, the server operates on a hybrid architecture:
10
- 1. **Persistent SSE Stream (GET /sse)**: Keeps an open, persistent HTTP response channel to push events from the server to the client.
11
- 2. **Client-to-Server Messages (POST /sse or POST /messages)**: Short-lived HTTP requests sent by the client to invoke tools or send notifications.
12
-
13
- Under the hood, each user session creates a live Node.js `McpServer` object and an active REST client tied to the user's platform credentials. **This connection state and session memory exist solely in the RAM of the specific Node.js process/container that initialized it.**
14
-
15
- ---
16
-
17
- ## 2. Horizontal Scaling & Clustering (Sticky Sessions)
18
-
19
- Because the session manager is in-memory, horizontal scaling across multiple container instances (e.g. behind AWS ALB, Kubernetes NGINX Ingress, or GCP Cloud Load Balancing) requires **Sticky Sessions (Session Affinity)**.
20
-
21
- Without Sticky Sessions:
22
- * **The Issue**: A client connects to `GET /sse` and routes to *Instance A* (creating the session in memory). The client's subsequent tool call `POST /messages` gets routed by the load balancer to *Instance B*. *Instance B* does not have this session ID in its memory, returning a `404 Session not found` error.
23
- * **The Solution**: The load balancer must bind a client's session to the same backend container instance for the duration of the session.
24
-
25
- ### Load Balancer Configuration Patterns
26
-
27
- Below are configuration patterns for major cloud providers:
28
-
29
- #### A. AWS Application Load Balancer (ALB)
30
- Configure **Duration-Based Stickiness** or **Application-Controlled Stickiness** on your Target Group:
31
- * **Stickiness Type**: `lb_cookie` (Load Balancer Generated Cookie)
32
- * **Cookie Duration**: Match your session idle timeout (e.g., `1800 seconds` / 30 minutes).
33
- * **Terraform Example**:
34
- ```hcl
35
- resource "aws_lb_target_group" "mcp_server" {
36
- name = "mcp-server-tg"
37
- port = 3000
38
- protocol = "HTTP"
39
- vpc_id = var.vpc_id
40
-
41
- stickiness {
42
- type = "lb_cookie"
43
- cookie_duration = 1800
44
- enabled = true
45
- }
46
- }
47
- ```
48
-
49
- #### B. Kubernetes NGINX Ingress Controller
50
- Add the session affinity annotations to your Ingress resource. NGINX will automatically inject a cookie (default: `INGRESSCOOKIE`) to route subsequent requests:
51
- * **Ingress YAML Example**:
52
- ```yaml
53
- apiVersion: networking.k8s.io/v1
54
- kind: Ingress
55
- metadata:
56
- name: mcp-server-ingress
57
- annotations:
58
- nginx.ingress.kubernetes.io/affinity: "cookie"
59
- nginx.ingress.kubernetes.io/session-cookie-name: "route"
60
- nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
61
- nginx.ingress.kubernetes.io/session-cookie-expires: "1800"
62
- nginx.ingress.kubernetes.io/session-cookie-max-age: "1800"
63
- spec:
64
- rules:
65
- - host: mcp.yourdomain.com
66
- http:
67
- paths:
68
- - path: /
69
- pathType: Prefix
70
- backend:
71
- service:
72
- name: mcp-server-service
73
- port:
74
- number: 3000
75
- ```
76
-
77
- #### C. Google Cloud Platform (GCP) HTTP(S) Load Balancing
78
- Set the backend service's session affinity to `GENERATED_COOKIE`:
79
- * **gcloud Command**:
80
- ```bash
81
- gcloud compute backend-services update mcp-server-backend-service \
82
- --session-affinity=GENERATED_COOKIE \
83
- --affinity-cookie-ttl=1800 \
84
- --global
85
- ```
86
-
87
- ---
88
-
89
- ## 3. Production Resource & Rate Limit Considerations
90
-
91
- ### Redis-Backed Rate Limiting
92
- The default rate limiter (`sseRateLimiter` in `src/index.ts`) records IP connections in an in-memory Map.
93
- * **Limitation**: In a cluster, each container rate-limits independently. An attacker could bypass rate limits by hitting different containers.
94
- * **Production Fix**: Replace the custom rate limiter with `express-rate-limit` using the `rate-limit-redis` store:
95
- ```typescript
96
- import rateLimit from 'express-rate-limit';
97
- import RedisStore from 'rate-limit-redis';
98
- import Redis from 'ioredis';
99
-
100
- const redisClient = new Redis(config.redisUrl);
101
-
102
- const limiter = rateLimit({
103
- windowMs: 60 * 1000, // 1 minute
104
- max: 10, // Limit each IP to 10 connections per window
105
- standardHeaders: true,
106
- legacyHeaders: false,
107
- store: new RedisStore({
108
- sendCommand: (...args: string[]) => redisClient.call(args[0], ...args.slice(1)),
109
- }),
110
- });
111
- ```
112
-
113
- ---
114
-
115
- ## 4. Architectural Alternatives: Transitioning to Mature Solutions
116
-
117
- The custom Node.js Express/SSE wrapper (`SessionManager`) acts as an in-memory multiplexer, which introduces maintenance overhead (writing custom reapers, session state checks, and sticky load balancer affinity).
118
-
119
- For enterprise production setups, you are highly encouraged to move the session, transport, and process management out of the application codebase using one of two mature alternatives:
120
-
121
- ### Alternative A: Third-Party MCP Gateway (Protocol Bridging)
122
- Deploy this repository strictly as a stateless `stdio` (stdin/stdout) service (which is already implemented in the code), and wrap it using a production-ready, off-the-shelf gateway:
123
- * **ContextForge Gateway**: An open-source gateway designed to act as a centralized, multi-tenant proxy that handles credentials, logging, and exposes a unified SSE/REST interface.
124
- * **Supergateway**: A lightweight CLI/Docker wrapper that exposes any `stdio` server over SSE with zero custom code:
125
- ```bash
126
- supergateway --port 3000 --stdio "node dist/index.js"
127
- ```
128
- * **Apache APISIX (`mcp-bridge` plugin)**: Bridges standard stdio processes and scales them dynamically as SSE streams, managing routing, rate-limiting, and credentials centrally.
129
-
130
- ### Alternative B: Infrastructure-Level Multi-Tenancy (Micro-Containers)
131
- Achieve strict security and process-level isolation by delegating execution lifecycles to cloud infrastructure:
132
- 1. **Stateless Stdio Container**: Package the MCP server strictly in `stdio` mode inside a Docker image.
133
- 2. **On-Demand Orchestration**: Spin up isolated, single-tenant container instances (or micro-VMs) on-demand for active users (using AWS ECS, GCP Cloud Run, or Fly.io).
134
- 3. **Gateway Routing**: An API Gateway authenticates the user, spins up their dedicated container task, and proxies the connection.
135
- 4. **Benefits**: Wipes out custom session reapers, memory leak risks, and session state serialization logic from the application repository.
136
-
@@ -1,84 +0,0 @@
1
- # MCP Server — Packaging Plan
2
-
3
- Plan for publishing `elasticio-mcp-server` as a standalone npm package.
4
-
5
- ## Current State
6
-
7
- - TypeScript with `outDir: ./dist`, ESM (`"type": "module"`)
8
- - `"main": "dist/index.js"` already set
9
- - Two transport modes: stdio (CLI) and SSE (HTTP server)
10
- - `"private": true` — blocks npm publish
11
- - Qdrant + Google GenAI are required dependencies (crash on startup without credentials)
12
-
13
- ## Changes Required
14
-
15
- ### 1. `package.json`
16
-
17
- - Remove `"private": true`
18
- - Add `bin` entry:
19
- ```json
20
- "bin": {
21
- "elasticio-mcp": "./dist/index.js"
22
- }
23
- ```
24
- - Add `files` to control what gets published:
25
- ```json
26
- "files": ["dist", "resources"]
27
- ```
28
- - Exclude `.env`, `settings.json`, test files, scripts from the package
29
-
30
- ### 2. Shebang
31
-
32
- Add `#!/usr/bin/env node` to the top of `src/index.ts` so the CLI entry point works when installed globally.
33
-
34
- ### 3. Make Vector Search Optional
35
-
36
- Qdrant and embedding dependencies are only used by 3 tools:
37
- - `search_documentation`
38
- - `search_flow_samples`
39
- - `search_flow_steps`
40
-
41
- The remaining ~20 tools (CRUD for flows, components, credentials, etc.) work purely via the elastic.io REST API.
42
-
43
- **Approach**: If `VECTOR_STORE_URL` is not set, skip registration of search tools or return a "Vector search not configured" message. Do not crash on startup.
44
-
45
- ### 4. Share Qdrant as Read-Only (Default Search)
46
-
47
- Create a **read-only API key** in Qdrant Cloud and hardcode it as the default `VECTOR_STORE_URL` / `VECTOR_STORE_API_KEY`. This way users get search over the pre-indexed flow examples and documentation out of the box.
48
-
49
- Qdrant Cloud supports granular API keys — grant only `search` permission, no `write`.
50
-
51
- **Behavior**:
52
- - No env vars set → uses built-in read-only Qdrant endpoint (search works out of the box)
53
- - User provides own `VECTOR_STORE_URL` → connects to their instance instead
54
- - `EMBEDDING_PROVIDER_API_KEY` still required for embeddings (Google GenAI) — make this optional too, or document that users need their own key
55
-
56
- ### 5. Make `validateConfigOnStartup()` Graceful
57
-
58
- Currently crashes if `EMBEDDING_PROVIDER_API_KEY` or `VECTOR_STORE_URL` are missing. For the packaged version:
59
- - Only require `ELASTICIO_API_EMAIL` + `ELASTICIO_API_KEY` for stdio mode
60
- - All other config should be optional with sensible defaults or disabled features
61
-
62
- ### 6. Handle Missing `resources/` Gracefully
63
-
64
- `resources/elasticio.github.io/content` (used by `view_documentation` and `ingest_docs.ts`) may not exist in all installations. Add existence checks to avoid crashes.
65
-
66
- ### 7. Potential Dependency Optimization
67
-
68
- `@google/genai` and `@qdrant/js-client-rest` are heavy dependencies that are only needed for vector search. Consider:
69
- - Moving them to `optionalDependencies` or `peerDependencies`
70
- - Lazy-loading them only when search tools are invoked
71
-
72
- ## Publish Checklist
73
-
74
- - [ ] Remove `"private": true`
75
- - [ ] Add `bin`, `files` fields
76
- - [ ] Add shebang to entry point
77
- - [ ] Make Qdrant/embeddings optional
78
- - [ ] Create read-only Qdrant API key and set as default
79
- - [ ] Graceful startup without vector store credentials
80
- - [ ] Graceful handling of missing `resources/elasticio.github.io/`
81
- - [ ] Add `.npmignore` or verify `files` field excludes dev artifacts
82
- - [ ] Test `npm pack` and inspect tarball contents
83
- - [ ] Test `npx elasticio-mcp` works end-to-end
84
- - [ ] Choose package scope: `elasticio-mcp-server` or `@elasticio/mcp-server`
@@ -1,60 +0,0 @@
1
- # Unique Components from Verified Credentials Tests
2
-
3
- Workspace: `59d341e9037f7200184a408b`
4
-
5
- | # | Component | Example Scenario | Flow ID |
6
- |---|---|---|---|
7
- | 1 | REST API V2 | VC-A4: No Auth POST | `6a9ac39ea6268100125ee352` |
8
- | 2 | PostgreSQL | VC-B1: SELECT | `6a9ac415a6268100125ef145` |
9
- | 3 | MSSQL | VC-B5: SELECT | `6a9ac449a6268100125ef5bd` |
10
- | 4 | MongoDB | VC-B8: Lookup by ID | `6a9ac699a6268100125f2260` |
11
- | 5 | JDBC | VC-B12: MySQL Query | `6a9ac6e8a6268100125f29c7` |
12
- | 7 | SFTP | VC-D1: Poll New Files | `6a9ac4df03c95f0012cf9fba` |
13
- | 11 | ChatGPT | VC-E1: Text Generation | `6a9ac51f03c95f0012cfa355` |
14
- | 12 | Claude AI | VC-E4: Text Generation | `6a9ad08a03c95f0012d0ac56` |
15
- | 13 | Gemini | VC-E6: Text Generation | `6a9ad0e303c95f0012d0b2f3` |
16
- | 14 | Grok | VC-E8: Text Generation | `6a9ad10b03c95f0012d0b5b0` |
17
- | 15 | HubSpot | VC-F1: Poll Contacts | `6a9ad12ba6268100126020dd` |
18
- | 16 | Zoho CRM | VC-F4: Poll Leads | `6a9ad179a62681001260263e` |
19
- | 20 | Apptivo | VC-F12: Raw Request Contacts | `6a9ad6d403c95f0012d10cef` |
20
- | 21 | Square | VC-F13: Poll Payments | `6a9ad77403c95f0012d1196e` |
21
- | 22 | Stripe | VC-F15: Lookup Charges | `6a9ad795a62681001260884a` |
22
- | 23 | Klaviyo | VC-F17: Poll Profiles | `6a9ad85a03c95f0012d1286c` |
23
- | 24 | MailChimp | VC-F19: Subscribe Contact | `6a9ad88c03c95f0012d12c0e` |
24
- | 25 | Marketo | VC-F21: Poll Leads | `6a9ad89403c95f0012d12cdc` |
25
- | 26 | Magento 2 | VC-G1: Poll Orders | `6a9ad8f903c95f0012d13401` |
26
- | 27 | Shopify Admin V1 | VC-G5: Poll Products | `6a9ad93ea62681001260a50a` |
27
- | 28 | Shopify Admin V2 | VC-G6: Poll Orders | `6a9ad942a62681001260a57c` |
28
- | 29 | VTEX | VC-G9: Poll Customers | `6a9ad966a62681001260a90d` |
29
- | 30 | Amazon SP | VC-G12: Poll Orders | `6a9ad971a62681001260aa9f` |
30
- | 31 | SAP Business One | VC-H5: Poll Partners | `6a9ad9fc03c95f0012d146d4` |
31
- | 32 | SAP ByDesign | VC-H6: Poll Orders | `6a9ada0003c95f0012d14784` |
32
- | 33 | MS Dynamics CRM V2 | VC-H7: Poll Accounts | `6a9ada0fa62681001260b4a3` |
33
- | 34 | MS Dynamics BC OnPrem | VC-H10: Poll Items | `6a9ada4f03c95f0012d14c69` |
34
- | 35 | Custom MS Dynamics BC | VC-H11: Poll Records | `6a9ada6703c95f0012d14d2d` |
35
- | 36 | AFAS | VC-H12: Poll Records | `6a9ada6ca62681001260bdb1` |
36
- | 37 | Tableau Cloud | VC-H16: Poll Objects | `6a9ada7703c95f0012d14fc3` |
37
- | 38 | Slack | VC-I1: Send Message | `6a9adad503c95f0012d15767` |
38
- | 41 | Email (SMTP) | VC-I6: Send via SMTP | `6a9adae0a62681001260c5bf` |
39
- | 42 | ClickSend SMS | VC-I8: Send | `6a9adae2a62681001260c631` |
40
- | 43 | Google Sheets V2 | VC-J1: Read Rows | `6a9adc95a62681001260dca3` |
41
- | 44 | Gmail | VC-J4: Poll New Emails | `6a9adcf1a62681001260e5b8` |
42
- | 45 | Google Analytics | VC-J6: Run Report | `6a9add1503c95f0012d17ece` |
43
- | 47 | Google Pub/Sub | VC-J10: Publish Message | `6a9add47a62681001260ec1b` |
44
- | 48 | Outlook | VC-K1: Poll New Emails | `6a9add7ca62681001260f010` |
45
- | 49 | Monday | VC-K3: Webhook New Items | `6a9addb803c95f0012d18b9f` |
46
- | 50 | AMQP | VC-L1: Publish Message | `6a9adde1a62681001260f745` |
47
- | 51 | AWS SQS | VC-L4: Send Message | `6a9ade05a62681001260fa6e` |
48
- | 52 | iLovePDF | VC-M1: Merge PDFs | `6a9ade26a62681001260fc98` |
49
- | 53 | Picsart | VC-M3: Remove Background | `6a9ade4c03c95f0012d198e0` |
50
- | 54 | Bynder | VC-M4: Poll Assets | `6a9adeb3a6268100126106ae` |
51
- | 55 | PandaDoc | VC-M6: Poll Documents | `6a9adee703c95f0012d1a26b` |
52
- | 56 | WordPress | VC-M8: Poll Posts | `6a9adefd03c95f0012d1a548` |
53
- | 57 | Twitter | VC-N1: Post Tweet | `6a9adf36a626810012610c58` |
54
- | 58 | Pinterest | VC-N2: Create Pin (Sandbox) | `6a9adf64a626810012610e8b` |
55
- | 59 | Kit | VC-N3: Poll Subscribers | `6a9adf7ea6268100126110ff` |
56
- | 60 | DeepL | VC-O3: Translate Text | `6a9adffc03c95f0012d1bbce` |
57
- | 61 | SmartyStreets | VC-O5: Validate Address | `6a9ae02403c95f0012d1be2a` |
58
- | 62 | SOAP | VC-O7: Call Service | `6a9ae03403c95f0012d1c056` |
59
- | 63 | Git Protocol | VC-O8: Read File | `6a9ae060a626810012611cde` |
60
- | 64 | Basecamp | VC-O9: Webhook To-dos | `6a9ae0a2a626810012611fe5` |
@@ -1,193 +0,0 @@
1
- # Verified Credentials Test Flow IDs
2
-
3
- Workspace: `59d341e9037f7200184a408b`
4
-
5
- All flows created for testing components with verified credentials.
6
- Delete all these flows after testing is complete.
7
-
8
- ## Flow IDs
9
-
10
- | Scenario | Flow ID | Name | Status |
11
- |---|---|---|---|
12
- | VC-A4 | `6a9ac39ea6268100125ee352` | REST API V2 — No Auth POST | created |
13
- | VC-A2 | `6a9ac3aba6268100125ee48e` | REST API V2 — Basic Auth POST | created |
14
- | VC-A3 | `6a9ac3b6a6268100125ee5fa` | REST API V2 — API Key GET | created |
15
- | VC-A6 | `6a9ac3c3a6268100125ee859` | REST API V2 — Rebound on 5xx | created |
16
- | VC-A7 | `6a9ac3d103c95f0012cf8c12` | REST API V2 — Emit Error as Message | created |
17
- | VC-A8 | `6a9ac3dd03c95f0012cf8ca2` | REST API V2 — Download as Attachment | created |
18
- | VC-A9 | `6a9ac3e8a6268100125eec9e` | REST API V2 — Custom Headers + Timeout | created |
19
- | VC-A10 | `6a9ac3f3a6268100125eee21` | REST API V2 — Follow Redirects | created |
20
- | VC-B1 | `6a9ac415a6268100125ef145` | PostgreSQL SELECT | created |
21
- | VC-B2 | `6a9ac421a6268100125ef203` | PostgreSQL INSERT from Webhook | created |
22
- | VC-B5 | `6a9ac449a6268100125ef5bd` | MSSQL SELECT | created |
23
- | VC-C1 | `6a9ac47fa6268100125efc47` | Salesforce V2 Poll Accounts | created |
24
- | VC-C7 | `6a9ac48fa6268100125efdd4` | Salesforce V2 Raw Request | created |
25
- | VC-D1 | `6a9ac4df03c95f0012cf9fba` | SFTP Poll New Files | created |
26
- | VC-E1 | `6a9ac51f03c95f0012cfa355` | ChatGPT Text Generation | created |
27
- | VC-A5 | `6a9ac55b03c95f0012cfa725` | REST API V2 — All HTTP Methods Chain | created |
28
- | VC-B3 | `6a9ac628a6268100125f181b` | PostgreSQL UPDATE with Condition | created |
29
- | VC-B4 | `6a9ac63803c95f0012cfb5c6` | PostgreSQL DELETE Record | created |
30
- | VC-B6 | `6a9ac65503c95f0012cfb6cf` | MSSQL INSERT from Webhook | created |
31
- | VC-B7 | `6a9ac678a6268100125f20a8` | MSSQL Stored Procedure | created |
32
- | VC-B8 | `6a9ac699a6268100125f2260` | MongoDB Lookup by ID | created |
33
- | VC-B9 | `6a9ac6a303c95f0012cfbc00` | MongoDB Upsert Document | created |
34
- | VC-B10 | `6a9ac6b1a6268100125f253b` | MongoDB Aggregate Pipeline | created |
35
- | VC-B11 | `6a9ac6baa6268100125f26a4` | MongoDB Delete by Criteria | created |
36
- | VC-B12 | `6a9ac6e8a6268100125f29c7` | JDBC MySQL Query | created |
37
- | VC-B13 | `6a9ac719a6268100125f2ae8` | JDBC PostgreSQL Query | created |
38
- | VC-B14 | `6a9ac72403c95f0012cfc5d6` | JDBC MSSQL Query | created |
39
- | VC-B16 | `6a9ac738a6268100125f2c9e` | JDBC Cross-DB Compare | created |
40
- | VC-B17 | `6a9ac75da6268100125f2ecd` | PS/PostgreSQL SELECT | created |
41
- | VC-B18 | `6a9ac77a03c95f0012cfcd74` | PS/MongoDB Lookup | created |
42
- | VC-B19 | `6a9ac79aa6268100125f340e` | PS/JDBC Multi-DB Test | created |
43
- | VC-C2 | `6a9ac7c303c95f0012cfd165` | Salesforce V2 SOQL Query | created |
44
- | VC-C3 | `6a9ac7d0a6268100125f37f0` | Salesforce V2 Lookup Contact | created |
45
- | VC-C4 | `6a9ac7e2a6268100125f39ad` | Salesforce V2 Create Lead | created |
46
- | VC-C5 | `6a9ac7eca6268100125f3a03` | Salesforce V2 Upsert Contact | created |
47
- | VC-C6 | `6a9ac7f403c95f0012cfd6fe` | Salesforce V2 Delete Lead | created |
48
- | VC-C8 | `6a9ac7ffa6268100125f3b74` | Salesforce V2 Lookup Objects | created |
49
- | VC-C9 | `6a9ac80903c95f0012cfd8ed` | Salesforce V2 Bulk Query | created |
50
- | VC-C10 | `6a9acd3aa6268100125fda9f` | Salesforce V2 Subscribe PubSub | created |
51
- | VC-C11 | `6a9acd5403c95f0012d06df4` | PS/Salesforce V2 Query | created |
52
- | VC-D2 | `6a9ace39a6268100125fe983` | SFTP Upload File | created |
53
- | VC-D3 | `6a9ace84a6268100125fee63` | SFTP Poll CSV Parse Split | created |
54
- | VC-D4 | `6a9ace98a6268100125fef63` | SFTP Move File After Processing | created |
55
- | VC-D5 | `6a9acee403c95f0012d08b72` | PS/SFTP Poll Files | created |
56
- | VC-D6 | `6a9acf5a03c95f0012d0956c` | PS/SFTP Upload Private Key Auth | created |
57
- | VC-D7 | `6a9acf7ca6268100126002ca` | AWS S3 Poll New Objects | created |
58
- | VC-D8 | `6a9acf8a03c95f0012d0985f` | AWS S3 Upload Object | created |
59
- | VC-D9 | `6a9acf98a62681001260062e` | AWS S3 Download to SFTP Upload | created |
60
- | VC-D10 | `6a9acfb2a626810012600962` | Azure Data Lake Read | created |
61
- | VC-D11 | `6a9acfc2a626810012600b1d` | Azure Data Lake Write | created |
62
- | VC-D12 | `6a9ad004a626810012600f53` | Google Drive Upload File | created |
63
- | VC-D13 | `6a9ad00ea626810012600fe9` | Google Drive Download File | created |
64
- | VC-E2 | `6a9ad05603c95f0012d0a7c0` | ChatGPT Data Extraction | created |
65
- | VC-E3 | `6a9ad060a62681001260139d` | ChatGPT Summarization | created |
66
- | VC-E4 | `6a9ad08a03c95f0012d0ac56` | Claude AI Text Generation | created |
67
- | VC-E5 | `6a9ad0a303c95f0012d0af04` | Claude AI Code Review | created |
68
- | VC-E6 | `6a9ad0e303c95f0012d0b2f3` | Gemini Text Generation | created |
69
- | VC-E7 | `6a9ad0ed03c95f0012d0b39f` | Gemini Classification | created |
70
- | VC-E8 | `6a9ad10b03c95f0012d0b5b0` | Grok Text Generation | created |
71
- | VC-F1 | `6a9ad12ba6268100126020dd` | HubSpot Poll Contacts | created |
72
- | VC-F2 | `6a9ad138a626810012602268` | HubSpot Create Deal | created |
73
- | VC-F3 | `6a9ad153a626810012602456` | HubSpot Lookup Company | created |
74
- | VC-F4 | `6a9ad179a62681001260263e` | Zoho CRM Poll Leads | created |
75
- | VC-F5 | `6a9ad18da6268100126028c1` | Zoho CRM Create Contact | created |
76
- | VC-F6 | `6a9ad2af03c95f0012d0d137` | Close CRM Poll Leads | created |
77
- | VC-F7 | `6a9ad30ca626810012604269` | Close CRM Create Lead | created |
78
- | VC-F8 | `6a9ad6a403c95f0012d10892` | Odoo Poll Partners | created |
79
- | VC-F10 | `6a9ad6c1a626810012607c62` | Freshworks Poll Contacts | created |
80
- | VC-F12 | `6a9ad6d403c95f0012d10cef` | Apptivo Raw Request Contacts | created |
81
- | VC-F13 | `6a9ad77403c95f0012d1196e` | Square Poll Payments | created |
82
- | VC-F14 | `6a9ad790a6268100126087ba` | Square Create Customer | created |
83
- | VC-F15 | `6a9ad795a62681001260884a` | Stripe Lookup Charges | created |
84
- | VC-F16 | `6a9ad798a6268100126088fb` | Stripe Create Customer | created |
85
- | VC-F17 | `6a9ad85a03c95f0012d1286c` | Klaviyo Poll Profiles | created |
86
- | VC-F18 | `6a9ad85d03c95f0012d128d0` | Klaviyo Create Profile | created |
87
- | VC-F19 | `6a9ad88c03c95f0012d12c0e` | MailChimp Subscribe Contact | created |
88
- | VC-F21 | `6a9ad89403c95f0012d12cdc` | Marketo Poll Leads | created |
89
- | VC-F22 | `6a9ad8a103c95f0012d12f25` | Marketo Upsert Lead | created |
90
- | VC-G1 | `6a9ad8f903c95f0012d13401` | Magento 2 Poll Orders | created |
91
- | VC-G2 | `6a9ad914a62681001260a136` | Magento 2 Upsert Product | created |
92
- | VC-G3 | `6a9ad919a62681001260a1f6` | Magento 2 Lookup Customer | created |
93
- | VC-G4 | `6a9ad90603c95f0012d13621` | PS/Magento 2 Poll Orders | created |
94
- | VC-G5 | `6a9ad93ea62681001260a50a` | Shopify Admin V1 Poll Products | created |
95
- | VC-G6 | `6a9ad942a62681001260a57c` | Shopify Admin V2 Poll Orders | created |
96
- | VC-G9 | `6a9ad966a62681001260a90d` | VTEX Poll Customers | created |
97
- | VC-G12 | `6a9ad971a62681001260aa9f` | Amazon SP Poll Orders | created |
98
- | VC-H5 | `6a9ad9fc03c95f0012d146d4` | SAP Business One Poll Partners | created |
99
- | VC-H6 | `6a9ada0003c95f0012d14784` | SAP ByDesign Poll Orders | created |
100
- | VC-H7 | `6a9ada0fa62681001260b4a3` | MS Dynamics CRM V2 Poll Accounts | created |
101
- | VC-H8 | `6a9ada1fa62681001260b5f6` | MS Dynamics CRM V2 Upsert Contact | created |
102
- | VC-H9 | `6a9ada27a62681001260b6b8` | MS Dynamics CRM V2 Lookup | created |
103
- | VC-H10 | `6a9ada4f03c95f0012d14c69` | MS Dynamics BC OnPrem Poll Items | created |
104
- | VC-H11 | `6a9ada6703c95f0012d14d2d` | Custom MS Dynamics BC Poll Records | created |
105
- | VC-H12 | `6a9ada6ca62681001260bdb1` | AFAS Poll Records | created |
106
- | VC-H13 | `6a9ada7203c95f0012d14f1e` | AFAS Create Record | created |
107
- | VC-H16 | `6a9ada7703c95f0012d14fc3` | Tableau Cloud Poll Objects | created |
108
- | VC-I1 | `6a9adad503c95f0012d15767` | Slack Send Message | created |
109
- | VC-I3 | `6a9adad7a62681001260c3b4` | Telegram Send Message | created |
110
- | VC-I5 | `6a9adadea62681001260c557` | WhatsApp Send Message | created |
111
- | VC-I6 | `6a9adae0a62681001260c5bf` | Email Send via SMTP | created |
112
- | VC-I8 | `6a9adae2a62681001260c631` | ClickSend SMS Send | created |
113
- | VC-J1 | `6a9adc95a62681001260dca3` | Google Sheets V2 — Read Rows | created |
114
- | VC-J2 | `6a9adca103c95f0012d17845` | Google Sheets V2 — Append Row | created |
115
- | VC-J3 | `6a9adcb3a62681001260e066` | Google Sheets V2 — Update Row | created |
116
- | VC-J4 | `6a9adcf1a62681001260e5b8` | Gmail — Poll New Emails | created |
117
- | VC-J5 | `6a9adcfd03c95f0012d17cde` | Gmail — Send Email | created |
118
- | VC-J6 | `6a9add1503c95f0012d17ece` | Google Analytics — Run Report | created |
119
- | VC-J7 | `6a9add32a62681001260eb2b` | Google Translate — Translate Text | created |
120
- | VC-J10 | `6a9add47a62681001260ec1b` | Google Pub/Sub — Publish Message | created |
121
- | VC-J11 | `6a9add5403c95f0012d1830c` | Google Pub/Sub — Subscribe and Process | created |
122
- | VC-K1 | `6a9add7ca62681001260f010` | Outlook — Poll New Emails | created |
123
- | VC-K2 | `6a9add92a62681001260f1a3` | Outlook — Send Email | created |
124
- | VC-K3 | `6a9addb803c95f0012d18b9f` | Monday — Webhook New Items | created |
125
- | VC-K4 | `6a9addcb03c95f0012d18dd1` | Monday — Create Item | created |
126
- | VC-L1 | `6a9adde1a62681001260f745` | AMQP — Publish Message | created |
127
- | VC-L2 | `6a9addef03c95f0012d1903a` | AMQP — Consume Messages | created |
128
- | VC-L4 | `6a9ade05a62681001260fa6e` | AWS SQS — Send Message | created |
129
- | VC-L5 | `6a9ade0fa62681001260facd` | AWS SQS — Receive Messages | created |
130
- | VC-M1 | `6a9ade26a62681001260fc98` | iLovePDF — Merge PDFs | created |
131
- | VC-M2 | `6a9ade3103c95f0012d1964d` | iLovePDF — Compress PDF | created |
132
- | VC-M3 | `6a9ade4c03c95f0012d198e0` | Picsart — Remove Background | created |
133
- | VC-M4 | `6a9adeb3a6268100126106ae` | Bynder — Poll Assets | created |
134
- | VC-M6 | `6a9adee703c95f0012d1a26b` | PandaDoc — Poll Documents | created |
135
- | VC-M8 | `6a9adefd03c95f0012d1a548` | WordPress — Poll Posts | created |
136
- | VC-M9 | `6a9adf0ba626810012610a30` | WordPress — Create Post | created |
137
- | VC-N1 | `6a9adf36a626810012610c58` | Twitter — Post Tweet | created |
138
- | VC-N2 | `6a9adf64a626810012610e8b` | Pinterest — Create Pin (Sandbox) | created |
139
- | VC-N3 | `6a9adf7ea6268100126110ff` | Kit — Poll Subscribers | created |
140
- | VC-N4 | `6a9adf8e03c95f0012d1b1f3` | Kit — Create Subscriber | created |
141
- | VC-O3 | `6a9adffc03c95f0012d1bbce` | DeepL — Translate Text | created |
142
- | VC-O5 | `6a9ae02403c95f0012d1be2a` | SmartyStreets — Validate Address | created |
143
- | VC-O7 | `6a9ae03403c95f0012d1c056` | SOAP — Call Service | created |
144
- | VC-O8 | `6a9ae060a626810012611cde` | Git Protocol — Read File | created |
145
- | VC-O9 | `6a9ae0a2a626810012611fe5` | Basecamp — Webhook To-dos | created |
146
- | VC-O11 | `6a9ae0daa6268100126125a7` | Code with Creds — Basic Auth | created |
147
- | VC-O12 | `6a9ae0e3a626810012612601` | Code with Creds — API Key | created |
148
- | VC-O13 | `6a9ae0eca62681001261266a` | Code with Creds — OAuth2 | created |
149
- | VC-O14 | `6a9ae0f8a6268100126127f9` | Code with Creds — No Auth | created |
150
- | VC-P1 | `6a9ae12da626810012612bee` | PS/Webhook — No Auth | created |
151
- | VC-P2 | `6a9ae13703c95f0012d1d287` | PS/Webhook — Basic Auth | created |
152
- | VC-P3 | `6a9ae28503c95f0012d1e6a6` | PS/Webhook API Key Auth | created |
153
- | VC-P4 | `6a9ae292a626810012614230` | PS/Webhook HMAC 256 Auth | created |
154
- | VC-P5 | `6a9ae29c03c95f0012d1e8f4` | PS/Webhook HMAC 512 Auth | created |
155
- | VC-Q1 | `6a9d8a07a62681001289bc30` | CRM to eCommerce Sync | created |
156
- | VC-Q3 | `6a9d8a6ca62681001289c32a` | Multi-CRM Lead Sync | created |
157
- | VC-Q5 | `6a9d8ac503c95f0012f9ab1b` | AI-Enriched Contact Pipeline | created |
158
- | VC-Q6 | `6a9d8afda62681001289ce23` | Multi-Database ETL | created |
159
- | VC-Q10 | `6a9d8b2203c95f0012f9b05f` | Social Media Content Pipeline | created |
160
- | VC-Q12 | `6a9d8b3803c95f0012f9b22c` | Customer Onboarding Pipeline | created |
161
- | VC-Q13 | `6a9d8b6803c95f0012f9b5c2` | Order Notification Multi-Channel | created |
162
- | VC-Q16 | `6a9d8c8603c95f0012f9cbae` | AI Support Ticket Triage | created |
163
- | VC-Q18 | `6a9d8b86a62681001289d93c` | Webhook Full Audit Trail | created |
164
- | VC-Q19 | `6a9d8c9ea62681001289f1d8` | Queue-Driven Processing | created |
165
- | VC-Q20 | `6a9d8b9603c95f0012f9ba25` | Email Monitoring Pipeline | created |
166
- | VC-Q21 | `6a9d8baba62681001289dc26` | Multi-Step Data Enrichment | created |
167
- | VC-Q25 | `6a9d8bbda62681001289dd71` | Dynamics CRM to Salesforce Migration | created |
168
- | VC-Q26 | `6a9d8bcf03c95f0012f9bf91` | Real-Time Webhook Router with Logging | created |
169
- | VC-Q27 | `6a9ac533a6268100125f0962` | Scheduled Health Check | created |
170
- | VC-Q30 | `6a9d8beda62681001289e329` | Full eCommerce Order Lifecycle | created |
171
- | VC-Q34 | `6a9d8c0203c95f0012f9c21a` | Lead Scoring Pipeline | created |
172
- | VC-Q39 | `6a9d8c1f03c95f0012f9c562` | Multi-Step Approval Pipeline | created |
173
- | VC-Q40 | `6a9d8c3903c95f0012f9c799` | IoT Data Pipeline Simulation | created |
174
- | VC-Q2 | `6a9d949703c95f0012fa3f0e` | eCommerce to ERP Order Sync | created |
175
- | VC-Q4 | `6a9d95ab03c95f0012fa51b1` | File Processing Pipeline | created |
176
- | VC-Q7 | `6a9d943fa6268100128a69cf` | Document Generation Pipeline | created |
177
- | VC-Q8 | `6a9d94ea03c95f0012fa456d` | Address Validation + CRM Update | created |
178
- | VC-Q9 | `6a9d95cba6268100128a803d` | Inventory Cross-Platform Sync | created |
179
- | VC-Q11 | `6a9d9555a6268100128a7b16` | Translation Pipeline Multi-Engine | created |
180
- | VC-Q14 | `6a9d963403c95f0012fa5a63` | Database Backup to Cloud | created |
181
- | VC-Q15 | `6a9d983da6268100128aada4` | ERP Sync SAP to NetSuite | created |
182
- | VC-Q17 | `6a9d96e903c95f0012fa663d` | Google Sheets to Multi-DB Sync | created |
183
- | VC-Q22 | `6a9d972903c95f0012fa6a88` | File Sync SFTP to S3 to Drive | created |
184
- | VC-Q23 | `6a9d97c903c95f0012fa74d9` | eCommerce to Analytics Pipeline | created |
185
- | VC-Q24 | `6a9d986103c95f0012fa7f52` | Payment Reconciliation | created |
186
- | VC-Q28 | `6a9d97e803c95f0012fa76d2` | CSV Import with Validation | created |
187
- | VC-Q29 | `6a9d9896a6268100128ab38e` | AI Content Generation Pipeline | created |
188
- | VC-Q31 | `6a9d98b3a6268100128ab755` | Multi-Messenger Customer Service | created |
189
- | VC-Q32 | `6a9d98d3a6268100128ab96e` | DAM to eCommerce Asset Pipeline | created |
190
- | VC-Q33 | `6a9d98f5a6268100128abb98` | Financial Reporting Pipeline | created |
191
- | VC-Q36 | `6a9d992103c95f0012fa8cd9` | Airtable to Multi-Platform Publish | created |
192
- | VC-Q37 | `6a9d9805a6268100128aa950` | SFTP to DB to Notification Chain | created |
193
- | VC-Q38 | `6a9d982403c95f0012fa7a34` | Real-time CRM Enrichment | created |