@raindrop-ai/wizard 0.0.12 → 0.0.13
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/src/docs/opencode.mdx +75 -0
- package/dist/src/lib/mcp.js +13 -11
- package/dist/src/lib/mcp.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: OpenCode (Beta)
|
|
3
|
+
description: >-
|
|
4
|
+
Reference for integrating Raindrop with OpenCode.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
The `@raindrop-ai/opencode-plugin` plugin instruments
|
|
8
|
+
[OpenCode](https://opencode.ai) coding sessions. Every session, message, tool
|
|
9
|
+
call, and LLM response is automatically captured in Raindrop — no per-call
|
|
10
|
+
instrumentation needed.
|
|
11
|
+
|
|
12
|
+
<Note>
|
|
13
|
+
User tracking is not currently supported in beta. This integration assumes one
|
|
14
|
+
user per session.
|
|
15
|
+
</Note>
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
Add the plugin to your OpenCode configuration (`opencode.json` or
|
|
20
|
+
`~/.config/opencode/opencode.json`).
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"plugin": ["@raindrop-ai/opencode-plugin"]
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
If your project dynamically generates an `opencode.json` (for example, using
|
|
29
|
+
`createOpencodeDotJson` or a similar method) because each user receives their
|
|
30
|
+
own sandbox, make sure to include `@raindrop-ai/opencode-plugin` in the `plugin`
|
|
31
|
+
array of the generated configuration. This ensures the Raindrop plugin is
|
|
32
|
+
enabled for every sandbox.
|
|
33
|
+
|
|
34
|
+
## Quick Start
|
|
35
|
+
|
|
36
|
+
1. Add the plugin to your OpenCode config (above).
|
|
37
|
+
2. Set your write key:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
export RAINDROP_WRITE_KEY="your-write-key"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
3. Start OpenCode — sessions are now automatically traced to Raindrop.
|
|
44
|
+
|
|
45
|
+
Every session you start will appear in your Raindrop dashboard with turn-by-turn
|
|
46
|
+
input/output, tool spans, and LLM metadata.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Configuration
|
|
51
|
+
|
|
52
|
+
### Environment Variables
|
|
53
|
+
|
|
54
|
+
Export your Raindrop write key:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
export RAINDROP_WRITE_KEY="your-write-key"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Troubleshooting
|
|
63
|
+
|
|
64
|
+
### Sessions not appearing in dashboard
|
|
65
|
+
|
|
66
|
+
1. **Check your write key** — Ensure `RAINDROP_WRITE_KEY` is set in the
|
|
67
|
+
environment where OpenCode runs
|
|
68
|
+
2. **Confirm the plugin loaded** — Check OpenCode's logs for
|
|
69
|
+
`Raindrop tracing enabled` or a `RAINDROP_WRITE_KEY not set` warning
|
|
70
|
+
3. **Enable debug logging** — Run with `RAINDROP_DEBUG=true` to see what's being
|
|
71
|
+
shipped
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
Use the Raindrop dashboard to verify events and traces after your first session.
|
package/dist/src/lib/mcp.js
CHANGED
|
@@ -17,22 +17,24 @@ const DOCS_FILE_BY_INTEGRATION_TYPE = {
|
|
|
17
17
|
'vercel-ai-sdk': 'vercel-ai-sdk.mdx',
|
|
18
18
|
browser: 'browser.mdx',
|
|
19
19
|
'claude-agent-sdk': 'claude-agent-sdk.mdx',
|
|
20
|
-
'opencode-
|
|
20
|
+
'opencode-plugin': 'opencode.mdx',
|
|
21
21
|
};
|
|
22
22
|
const INTEGRATION_TYPE_ALIASES = {
|
|
23
23
|
'typescript sdk': 'typescript',
|
|
24
|
-
|
|
24
|
+
typescript_sdk: 'typescript',
|
|
25
25
|
'browser sdk': 'browser',
|
|
26
|
-
|
|
26
|
+
browser_sdk: 'browser',
|
|
27
27
|
'edge runtime': 'browser',
|
|
28
28
|
'edge-runtime': 'browser',
|
|
29
29
|
'vercel ai sdk': 'vercel-ai-sdk',
|
|
30
|
-
|
|
30
|
+
vercel_ai_sdk: 'vercel-ai-sdk',
|
|
31
31
|
'claude agent sdk': 'claude-agent-sdk',
|
|
32
|
-
|
|
33
|
-
'opencode sdk': 'opencode-
|
|
34
|
-
'opencode ai sdk': 'opencode-
|
|
35
|
-
|
|
32
|
+
claude_agent_sdk: 'claude-agent-sdk',
|
|
33
|
+
'opencode sdk': 'opencode-plugin',
|
|
34
|
+
'opencode ai sdk': 'opencode-plugin',
|
|
35
|
+
opencode_ai_sdk: 'opencode-plugin',
|
|
36
|
+
opencode_plugin: 'opencode-plugin',
|
|
37
|
+
'opencode-sdk': 'opencode-plugin',
|
|
36
38
|
};
|
|
37
39
|
const SUPPORTED_INTEGRATION_TYPES = Object.keys(DOCS_FILE_BY_INTEGRATION_TYPE);
|
|
38
40
|
function normalizeIntegrationType(integrationType) {
|
|
@@ -64,7 +66,7 @@ export function createMcpServer(hasCompletedWorkRef, sessionContext) {
|
|
|
64
66
|
integrationType: z
|
|
65
67
|
.string()
|
|
66
68
|
.optional()
|
|
67
|
-
.describe('The integration type to load docs for: python, typescript, vercel-ai-sdk, browser, claude-agent-sdk, or opencode-
|
|
69
|
+
.describe('The integration type to load docs for: python, typescript, vercel-ai-sdk, browser, claude-agent-sdk, or opencode-plugin'),
|
|
68
70
|
interactionType: z
|
|
69
71
|
.string()
|
|
70
72
|
.optional()
|
|
@@ -104,7 +106,7 @@ export function createMcpServer(hasCompletedWorkRef, sessionContext) {
|
|
|
104
106
|
integrationType: z
|
|
105
107
|
.string()
|
|
106
108
|
.optional()
|
|
107
|
-
.describe('The detected integration type: python, typescript, vercel-ai-sdk, browser, claude-agent-sdk, or opencode-
|
|
109
|
+
.describe('The detected integration type: python, typescript, vercel-ai-sdk, browser, claude-agent-sdk, or opencode-plugin'),
|
|
108
110
|
interactionType: z
|
|
109
111
|
.string()
|
|
110
112
|
.optional()
|
|
@@ -125,7 +127,7 @@ export function createMcpServer(hasCompletedWorkRef, sessionContext) {
|
|
|
125
127
|
normalizedIntegrationType === 'vercel-ai-sdk' ||
|
|
126
128
|
normalizedIntegrationType === 'browser' ||
|
|
127
129
|
normalizedIntegrationType === 'claude-agent-sdk' ||
|
|
128
|
-
normalizedIntegrationType === 'opencode-
|
|
130
|
+
normalizedIntegrationType === 'opencode-plugin') {
|
|
129
131
|
details = await collectTypeScriptSetupDetails(sessionContext.installDir);
|
|
130
132
|
}
|
|
131
133
|
else {
|
package/dist/src/lib/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/lib/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP server utilities for the Claude agent\n */\n\nimport { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { z } from 'zod';\nimport { logToFile } from '../utils/debug.js';\nimport { sendSessionInit } from '../utils/session.js';\nimport {\n collectPythonSetupDetails,\n collectTypeScriptSetupDetails,\n type SetupDetail,\n} from './config.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst DOCS_FILE_BY_INTEGRATION_TYPE = {\n python: 'python.mdx',\n typescript: 'typescript.mdx',\n 'vercel-ai-sdk': 'vercel-ai-sdk.mdx',\n browser: 'browser.mdx',\n 'claude-agent-sdk': 'claude-agent-sdk.mdx',\n 'opencode-sdk': 'opencode-sdk.mdx',\n} as const;\n\ntype SupportedIntegrationType = keyof typeof DOCS_FILE_BY_INTEGRATION_TYPE;\n\nconst INTEGRATION_TYPE_ALIASES: Record<string, SupportedIntegrationType> = {\n 'typescript sdk': 'typescript',\n 'typescript_sdk': 'typescript',\n 'browser sdk': 'browser',\n 'browser_sdk': 'browser',\n 'edge runtime': 'browser',\n 'edge-runtime': 'browser',\n 'vercel ai sdk': 'vercel-ai-sdk',\n 'vercel_ai_sdk': 'vercel-ai-sdk',\n 'claude agent sdk': 'claude-agent-sdk',\n 'claude_agent_sdk': 'claude-agent-sdk',\n 'opencode sdk': 'opencode-sdk',\n 'opencode ai sdk': 'opencode-sdk',\n 'opencode_ai_sdk': 'opencode-sdk',\n};\n\nconst SUPPORTED_INTEGRATION_TYPES = Object.keys(\n DOCS_FILE_BY_INTEGRATION_TYPE,\n) as SupportedIntegrationType[];\n\nfunction normalizeIntegrationType(\n integrationType: string,\n): SupportedIntegrationType | null {\n const normalized = integrationType.trim().toLowerCase();\n if (normalized in DOCS_FILE_BY_INTEGRATION_TYPE) {\n return normalized as SupportedIntegrationType;\n }\n return INTEGRATION_TYPE_ALIASES[normalized] ?? null;\n}\n\n/**\n * Create an in-process MCP server with the CompleteIntegration tool\n */\nexport function createMcpServer(\n hasCompletedWorkRef: {\n value: boolean;\n },\n sessionContext: {\n sessionId: string;\n accessToken: string;\n orgId: string;\n installDir: string;\n },\n): any {\n const completionTool = tool(\n 'CompleteIntegration',\n 'Signals that the Raindrop integration is complete. Call this tool ONLY after you have confirmed that: 1) the Raindrop package is successfully installed, 2) Raindrop is integrated into user-facing AI features, and 3) Verified the project builds/runs without errors.',\n {}, // No input parameters\n (_args: Record<string, never>, _extra: unknown): any => {\n logToFile(\n 'Agent called CompleteIntegration tool - integration is complete',\n );\n\n // Set the completion flag\n hasCompletedWorkRef.value = true;\n\n return {\n content: [\n {\n type: 'text',\n text: 'Integration completion acknowledged. Transitioning to testing phase...',\n },\n ],\n };\n },\n );\n\n const loadDocumentationTool = tool(\n 'LoadDocumentation',\n 'Load Raindrop documentation for a specific integration type',\n {\n integrationType: z\n .string()\n .optional()\n .describe(\n 'The integration type to load docs for: python, typescript, vercel-ai-sdk, browser, claude-agent-sdk, or opencode-sdk',\n ),\n interactionType: z\n .string()\n .optional()\n .describe('Alias for integrationType for backward compatibility'),\n },\n async (\n args: { integrationType?: string; interactionType?: string },\n _extra: unknown,\n ): Promise<any> => {\n const requestedIntegrationType =\n args.integrationType || args.interactionType;\n if (!requestedIntegrationType) {\n return {\n content: [\n {\n type: 'text',\n text: `Missing integration type. Supported values: ${SUPPORTED_INTEGRATION_TYPES.join(\n ', ',\n )}`,\n },\n ],\n };\n }\n\n const normalizedIntegrationType = normalizeIntegrationType(\n requestedIntegrationType,\n );\n if (!normalizedIntegrationType) {\n return {\n content: [\n {\n type: 'text',\n text: `Unsupported integration type: ${requestedIntegrationType}. Supported values: ${SUPPORTED_INTEGRATION_TYPES.join(\n ', ',\n )}`,\n },\n ],\n };\n }\n\n const docsPath = path.resolve(\n __dirname,\n '../../src/docs',\n DOCS_FILE_BY_INTEGRATION_TYPE[normalizedIntegrationType],\n );\n logToFile(`Loading ${normalizedIntegrationType} docs from: ${docsPath}`);\n const docs = await fs.promises.readFile(docsPath, 'utf-8');\n const processedDocs = docs.replace(\n /__WIZARD_SESSION_UUID__/g,\n sessionContext.sessionId,\n );\n return {\n content: [{ type: 'text', text: processedDocs }],\n };\n },\n );\n\n const initializeSessionTool = tool(\n 'InitializeSession',\n 'Initialize session context for the integration. Call this immediately after confirming the integration type with the user and BEFORE loading documentation.',\n {\n integrationType: z\n .string()\n .optional()\n .describe(\n 'The detected integration type: python, typescript, vercel-ai-sdk, browser, claude-agent-sdk, or opencode-sdk',\n ),\n interactionType: z\n .string()\n .optional()\n .describe('Alias for integrationType for backward compatibility'),\n },\n async (\n args: { integrationType?: string; interactionType?: string },\n _extra: unknown,\n ): Promise<any> => {\n const requestedIntegrationType =\n args.integrationType || args.interactionType;\n logToFile(\n `InitializeSession called with integrationType: ${requestedIntegrationType}`,\n );\n\n try {\n // Collect setup details based on integration type\n let details: SetupDetail[] = [];\n const normalizedIntegrationType = requestedIntegrationType\n ? normalizeIntegrationType(requestedIntegrationType)\n : null;\n\n if (normalizedIntegrationType === 'python') {\n details = await collectPythonSetupDetails(sessionContext.installDir);\n } else if (\n normalizedIntegrationType === 'typescript' ||\n normalizedIntegrationType === 'vercel-ai-sdk' ||\n normalizedIntegrationType === 'browser' ||\n normalizedIntegrationType === 'claude-agent-sdk' ||\n normalizedIntegrationType === 'opencode-sdk'\n ) {\n details = await collectTypeScriptSetupDetails(\n sessionContext.installDir,\n );\n } else {\n logToFile(\n `Unknown or missing integration type: ${requestedIntegrationType}, defaulting to TypeScript setup details`,\n );\n details = await collectTypeScriptSetupDetails(\n sessionContext.installDir,\n );\n }\n\n // Format setup details into the expected string format\n const compiledSetup = details\n .map((d) => `=== ${d.filename} ===\\n${d.content}`)\n .join('\\n\\n');\n\n logToFile(\n `Collected ${details.length} setup details, total length: ${compiledSetup.length}`,\n );\n\n // Send session init with the setup details\n sendSessionInit(\n sessionContext.sessionId,\n compiledSetup,\n sessionContext.accessToken,\n sessionContext.orgId,\n );\n\n logToFile('InitializeSession completed successfully');\n\n return {\n content: [\n {\n type: 'text',\n text: 'Session initialized successfully. You may now proceed to load documentation.',\n },\n ],\n };\n } catch (error) {\n // Log error but still return success to allow wizard to continue\n logToFile('Error in InitializeSession:', error);\n\n // Still send session init with minimal details\n sendSessionInit(\n sessionContext.sessionId,\n '',\n sessionContext.accessToken,\n sessionContext.orgId,\n );\n\n return {\n content: [\n {\n type: 'text',\n text: 'Session initialized with partial details. You may proceed to load documentation.',\n },\n ],\n };\n }\n },\n );\n\n return createSdkMcpServer({\n name: 'raindrop-wizard',\n version: '1.0.0',\n tools: [completionTool, loadDocumentationTool, initializeSessionTool],\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/lib/mcp.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP server utilities for the Claude agent\n */\n\nimport { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { z } from 'zod';\nimport { logToFile } from '../utils/debug.js';\nimport { sendSessionInit } from '../utils/session.js';\nimport {\n collectPythonSetupDetails,\n collectTypeScriptSetupDetails,\n type SetupDetail,\n} from './config.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst DOCS_FILE_BY_INTEGRATION_TYPE = {\n python: 'python.mdx',\n typescript: 'typescript.mdx',\n 'vercel-ai-sdk': 'vercel-ai-sdk.mdx',\n browser: 'browser.mdx',\n 'claude-agent-sdk': 'claude-agent-sdk.mdx',\n 'opencode-plugin': 'opencode.mdx',\n} as const;\n\ntype SupportedIntegrationType = keyof typeof DOCS_FILE_BY_INTEGRATION_TYPE;\n\nconst INTEGRATION_TYPE_ALIASES: Record<string, SupportedIntegrationType> = {\n 'typescript sdk': 'typescript',\n typescript_sdk: 'typescript',\n 'browser sdk': 'browser',\n browser_sdk: 'browser',\n 'edge runtime': 'browser',\n 'edge-runtime': 'browser',\n 'vercel ai sdk': 'vercel-ai-sdk',\n vercel_ai_sdk: 'vercel-ai-sdk',\n 'claude agent sdk': 'claude-agent-sdk',\n claude_agent_sdk: 'claude-agent-sdk',\n 'opencode sdk': 'opencode-plugin',\n 'opencode ai sdk': 'opencode-plugin',\n opencode_ai_sdk: 'opencode-plugin',\n opencode_plugin: 'opencode-plugin',\n 'opencode-sdk': 'opencode-plugin',\n};\n\nconst SUPPORTED_INTEGRATION_TYPES = Object.keys(\n DOCS_FILE_BY_INTEGRATION_TYPE,\n) as SupportedIntegrationType[];\n\nfunction normalizeIntegrationType(\n integrationType: string,\n): SupportedIntegrationType | null {\n const normalized = integrationType.trim().toLowerCase();\n if (normalized in DOCS_FILE_BY_INTEGRATION_TYPE) {\n return normalized as SupportedIntegrationType;\n }\n return INTEGRATION_TYPE_ALIASES[normalized] ?? null;\n}\n\n/**\n * Create an in-process MCP server with the CompleteIntegration tool\n */\nexport function createMcpServer(\n hasCompletedWorkRef: {\n value: boolean;\n },\n sessionContext: {\n sessionId: string;\n accessToken: string;\n orgId: string;\n installDir: string;\n },\n): any {\n const completionTool = tool(\n 'CompleteIntegration',\n 'Signals that the Raindrop integration is complete. Call this tool ONLY after you have confirmed that: 1) the Raindrop package is successfully installed, 2) Raindrop is integrated into user-facing AI features, and 3) Verified the project builds/runs without errors.',\n {}, // No input parameters\n (_args: Record<string, never>, _extra: unknown): any => {\n logToFile(\n 'Agent called CompleteIntegration tool - integration is complete',\n );\n\n // Set the completion flag\n hasCompletedWorkRef.value = true;\n\n return {\n content: [\n {\n type: 'text',\n text: 'Integration completion acknowledged. Transitioning to testing phase...',\n },\n ],\n };\n },\n );\n\n const loadDocumentationTool = tool(\n 'LoadDocumentation',\n 'Load Raindrop documentation for a specific integration type',\n {\n integrationType: z\n .string()\n .optional()\n .describe(\n 'The integration type to load docs for: python, typescript, vercel-ai-sdk, browser, claude-agent-sdk, or opencode-plugin',\n ),\n interactionType: z\n .string()\n .optional()\n .describe('Alias for integrationType for backward compatibility'),\n },\n async (\n args: { integrationType?: string; interactionType?: string },\n _extra: unknown,\n ): Promise<any> => {\n const requestedIntegrationType =\n args.integrationType || args.interactionType;\n if (!requestedIntegrationType) {\n return {\n content: [\n {\n type: 'text',\n text: `Missing integration type. Supported values: ${SUPPORTED_INTEGRATION_TYPES.join(\n ', ',\n )}`,\n },\n ],\n };\n }\n\n const normalizedIntegrationType = normalizeIntegrationType(\n requestedIntegrationType,\n );\n if (!normalizedIntegrationType) {\n return {\n content: [\n {\n type: 'text',\n text: `Unsupported integration type: ${requestedIntegrationType}. Supported values: ${SUPPORTED_INTEGRATION_TYPES.join(\n ', ',\n )}`,\n },\n ],\n };\n }\n\n const docsPath = path.resolve(\n __dirname,\n '../../src/docs',\n DOCS_FILE_BY_INTEGRATION_TYPE[normalizedIntegrationType],\n );\n logToFile(`Loading ${normalizedIntegrationType} docs from: ${docsPath}`);\n const docs = await fs.promises.readFile(docsPath, 'utf-8');\n const processedDocs = docs.replace(\n /__WIZARD_SESSION_UUID__/g,\n sessionContext.sessionId,\n );\n return {\n content: [{ type: 'text', text: processedDocs }],\n };\n },\n );\n\n const initializeSessionTool = tool(\n 'InitializeSession',\n 'Initialize session context for the integration. Call this immediately after confirming the integration type with the user and BEFORE loading documentation.',\n {\n integrationType: z\n .string()\n .optional()\n .describe(\n 'The detected integration type: python, typescript, vercel-ai-sdk, browser, claude-agent-sdk, or opencode-plugin',\n ),\n interactionType: z\n .string()\n .optional()\n .describe('Alias for integrationType for backward compatibility'),\n },\n async (\n args: { integrationType?: string; interactionType?: string },\n _extra: unknown,\n ): Promise<any> => {\n const requestedIntegrationType =\n args.integrationType || args.interactionType;\n logToFile(\n `InitializeSession called with integrationType: ${requestedIntegrationType}`,\n );\n\n try {\n // Collect setup details based on integration type\n let details: SetupDetail[] = [];\n const normalizedIntegrationType = requestedIntegrationType\n ? normalizeIntegrationType(requestedIntegrationType)\n : null;\n\n if (normalizedIntegrationType === 'python') {\n details = await collectPythonSetupDetails(sessionContext.installDir);\n } else if (\n normalizedIntegrationType === 'typescript' ||\n normalizedIntegrationType === 'vercel-ai-sdk' ||\n normalizedIntegrationType === 'browser' ||\n normalizedIntegrationType === 'claude-agent-sdk' ||\n normalizedIntegrationType === 'opencode-plugin'\n ) {\n details = await collectTypeScriptSetupDetails(\n sessionContext.installDir,\n );\n } else {\n logToFile(\n `Unknown or missing integration type: ${requestedIntegrationType}, defaulting to TypeScript setup details`,\n );\n details = await collectTypeScriptSetupDetails(\n sessionContext.installDir,\n );\n }\n\n // Format setup details into the expected string format\n const compiledSetup = details\n .map((d) => `=== ${d.filename} ===\\n${d.content}`)\n .join('\\n\\n');\n\n logToFile(\n `Collected ${details.length} setup details, total length: ${compiledSetup.length}`,\n );\n\n // Send session init with the setup details\n sendSessionInit(\n sessionContext.sessionId,\n compiledSetup,\n sessionContext.accessToken,\n sessionContext.orgId,\n );\n\n logToFile('InitializeSession completed successfully');\n\n return {\n content: [\n {\n type: 'text',\n text: 'Session initialized successfully. You may now proceed to load documentation.',\n },\n ],\n };\n } catch (error) {\n // Log error but still return success to allow wizard to continue\n logToFile('Error in InitializeSession:', error);\n\n // Still send session init with minimal details\n sendSessionInit(\n sessionContext.sessionId,\n '',\n sessionContext.accessToken,\n sessionContext.orgId,\n );\n\n return {\n content: [\n {\n type: 'text',\n text: 'Session initialized with partial details. You may proceed to load documentation.',\n },\n ],\n };\n }\n },\n );\n\n return createSdkMcpServer({\n name: 'raindrop-wizard',\n version: '1.0.0',\n tools: [completionTool, loadDocumentationTool, initializeSessionTool],\n });\n}\n"]}
|