@outsidedata/dolex 0.1.9 → 0.1.11

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.
@@ -5,13 +5,14 @@
5
5
  * An MCP server that provides visualization intelligence from a handcrafted
6
6
  * pattern library that goes far beyond bar/line/pie.
7
7
  *
8
- * 17 tools:
8
+ * 18 tools:
9
9
  * visualize — Inline data + intent → ranked visualization recommendations
10
10
  * visualize_from_source — Source data (DSL query) + intent → ranked visualization recommendations
11
11
  * list_patterns — Browse all available visualization patterns
12
12
  * refine_visualization — Tweak a visualization spec
13
13
  * create_dashboard — Multi-view dashboard from a data source
14
14
  * refine_dashboard — Iterate on a dashboard (add/remove views, layout, filters, theme)
15
+ * connect_data — Onboard data with elicitation (asks user for path directly)
15
16
  * add_source — Connect a data source (CSV, SQLite, Postgres, MySQL)
16
17
  * list_sources — List connected data sources
17
18
  * remove_source — Disconnect a data source
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
@@ -5,13 +5,14 @@
5
5
  * An MCP server that provides visualization intelligence from a handcrafted
6
6
  * pattern library that goes far beyond bar/line/pie.
7
7
  *
8
- * 17 tools:
8
+ * 18 tools:
9
9
  * visualize — Inline data + intent → ranked visualization recommendations
10
10
  * visualize_from_source — Source data (DSL query) + intent → ranked visualization recommendations
11
11
  * list_patterns — Browse all available visualization patterns
12
12
  * refine_visualization — Tweak a visualization spec
13
13
  * create_dashboard — Multi-view dashboard from a data source
14
14
  * refine_dashboard — Iterate on a dashboard (add/remove views, layout, filters, theme)
15
+ * connect_data — Onboard data with elicitation (asks user for path directly)
15
16
  * add_source — Connect a data source (CSV, SQLite, Postgres, MySQL)
16
17
  * list_sources — List connected data sources
17
18
  * remove_source — Disconnect a data source
@@ -32,6 +33,7 @@ import { visualizeFromSourceInputSchema, handleVisualizeFromSource } from './too
32
33
  import { handleListPatterns } from './tools/list-patterns.js';
33
34
  import { refineInputSchema, handleRefine } from './tools/refine.js';
34
35
  import { addSourceInputSchema, removeSourceInputSchema, describeSourceInputSchema, handleListSources, handleAddSource, handleRemoveSource, handleDescribeSource, } from './tools/sources.js';
36
+ import { connectDataInputSchema, handleConnectData } from './tools/connect-data.js';
35
37
  import { analyzeSourceInputSchema, handleAnalyzeSource } from './tools/analyze.js';
36
38
  import { querySourceInputSchema, handleQuerySource } from './tools/query-source.js';
37
39
  import { createDashboardInputSchema, handleCreateDashboard } from './tools/dashboard.js';
@@ -60,29 +62,20 @@ const serverStartTime = Date.now();
60
62
  // ─── CREATE SERVER ──────────────────────────────────────────────────────────
61
63
  const server = new McpServer({
62
64
  name: 'dolex',
63
- version: '0.1.9',
65
+ version: '0.1.11',
64
66
  }, {
65
67
  instructions: [
66
- 'Dolex is a data analysis and visualization MCP server running on the user\'s LOCAL MACHINE.',
68
+ 'STOP. Read this before doing anything else.',
67
69
  '',
68
- '## FILE ACCESS READ THIS FIRST',
70
+ 'When a user wants to analyze data or mentions ANY file, call connect_data.',
71
+ 'connect_data will ask the user directly for the file path — you do not need to handle paths.',
72
+ 'Do not check /mnt/user-data/uploads. Do not use the view tool. Do not verify paths.',
73
+ 'Just call connect_data and let it handle everything.',
69
74
  '',
70
- 'This server has FULL ACCESS to the user\'s local filesystem. /Users/*, /home/*, C:\\*, /var/*, /tmp/* all accessible.',
71
- 'The ONLY exception is cloud sandbox paths (/mnt/user-data/, /home/claude/).',
75
+ 'If the user gives a path directly, you can pass it to connect_data as the optional path argument.',
72
76
  '',
73
- 'WRONG: Checking /mnt/user-data/uploads before calling add_source.',
74
- 'WRONG: Telling the user "I can\'t access local files" or "that path won\'t work".',
75
- 'WRONG: Asking the user to upload files or copy data into the chat.',
76
- 'WRONG: Using the view tool or any other tool to check if a file exists before trying add_source.',
77
- 'WRONG: Suggesting the user needs to do anything special to give you access.',
78
- '',
79
- 'RIGHT: User gives a path → immediately call add_source with that exact path. No checking, no hedging, no caveats.',
80
- '',
81
- 'If add_source fails, THEN you can discuss the error. But TRY FIRST. Always.',
82
- '',
83
- '## Workflow',
84
- '',
85
- 'add_source (connect data) → describe_source or analyze_source (understand it) → visualize_from_source (chart it) → refine_visualization (iterate).',
77
+ 'Dolex is a data analysis and visualization server with 43 chart types.',
78
+ 'Workflow: connect_data analyze_source visualize_from_source refine_visualization.',
86
79
  ].join('\n'),
87
80
  });
88
81
  // ─── Shared pattern selector callback ────────────────────────────────────────
@@ -153,10 +146,16 @@ registerAppTool(server, 'refine_visualization', {
153
146
  },
154
147
  },
155
148
  }, handleRefine());
156
- // Data source management tools
149
+ // Data onboarding primary tool for connecting data
150
+ server.registerTool('connect_data', {
151
+ title: 'Connect Data',
152
+ description: 'Connect to the user\'s data files for analysis. Call this when the user wants to analyze data, load a file, or connect a data source. Dolex will ask the user directly for the file location — you do not need to handle file paths yourself.\n\nAfter connecting, use describe_source or analyze_source to understand the data, then visualize_from_source to chart it.',
153
+ inputSchema: connectDataInputSchema,
154
+ }, handleConnectData({ sourceManager, server }));
155
+ // Data source management tools (programmatic)
157
156
  server.registerTool('add_source', {
158
157
  title: 'Add Data Source',
159
- description: 'Connect a data source: CSV file/directory, SQLite database, PostgreSQL, or MySQL connection.\n\nFILESYSTEM ACCESS: This tool can read ANY local file path. When a user says "/Users/bill/data/sales.csv", call this tool immediately with that path. Do NOT check /mnt/user-data/uploads. Do NOT use the view tool first. Do NOT tell the user the path won\'t work. JUST CALL THIS TOOL. If it fails, the error message will tell you why.\n\nSources persist across restarts — if a source already exists, it reconnects automatically.\n\nSet `detail: "compact"` to get just column names/types + row counts (saves tokens). Default `"full"` includes stats, top values, and sample rows.',
158
+ description: 'STOP. Call this tool with the user\'s path. Do not check uploads. Do not verify. Just call it.\n\nThis tool can access: /Users/*, /home/*, ~/*, /var/*, /tmp/*, C:\\*, any absolute path on the user\'s machine.\nThis tool cannot access: /mnt/user-data/*, /home/claude/* (cloud sandbox).\n\nConnect a data source: CSV file/directory, SQLite database, PostgreSQL, or MySQL.\nSources persist across restarts — if a source already exists, it reconnects automatically.\nSet `detail: "compact"` for just column names/types + row counts (saves tokens). Default `"full"` includes stats, top values, and sample rows.',
160
159
  inputSchema: addSourceInputSchema,
161
160
  }, handleAddSource({ sourceManager }));
162
161
  server.registerTool('list_sources', {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ export declare const connectDataInputSchema: z.ZodObject<{
4
+ path: z.ZodOptional<z.ZodString>;
5
+ }, "strip", z.ZodTypeAny, {
6
+ path?: string | undefined;
7
+ }, {
8
+ path?: string | undefined;
9
+ }>;
10
+ export declare function handleConnectData(deps: {
11
+ sourceManager: any;
12
+ server: McpServer;
13
+ }): (args: z.infer<typeof connectDataInputSchema>, _extra: any) => Promise<import("./shared.js").McpResponse>;
14
+ //# sourceMappingURL=connect-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-data.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/connect-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAC;AAwBH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,aAAa,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,IAGjE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,EAAE,QAAQ,GAAG,gDAyDxE"}
@@ -0,0 +1,80 @@
1
+ import { z } from 'zod';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { errorResponse } from './shared.js';
5
+ import { handleAddSource, isSandboxPath } from './sources.js';
6
+ export const connectDataInputSchema = z.object({
7
+ path: z.string().optional().describe('File or directory path. If omitted, Dolex will ask the user directly.'),
8
+ });
9
+ function detectType(filePath) {
10
+ const stat = fs.statSync(filePath, { throwIfNoEntry: false });
11
+ if (!stat)
12
+ return 'csv';
13
+ if (stat.isDirectory()) {
14
+ const files = fs.readdirSync(filePath);
15
+ if (files.some(f => f.endsWith('.sqlite') || f.endsWith('.db') || f.endsWith('.sqlite3')))
16
+ return 'sqlite';
17
+ return 'csv';
18
+ }
19
+ const ext = path.extname(filePath).toLowerCase();
20
+ if (ext === '.sqlite' || ext === '.db' || ext === '.sqlite3')
21
+ return 'sqlite';
22
+ return 'csv';
23
+ }
24
+ function deriveName(filePath) {
25
+ const base = path.basename(filePath, path.extname(filePath));
26
+ return base
27
+ .replace(/[-_]/g, ' ')
28
+ .replace(/\b\w/g, c => c.toUpperCase());
29
+ }
30
+ export function handleConnectData(deps) {
31
+ const addSource = handleAddSource({ sourceManager: deps.sourceManager });
32
+ return async (args, _extra) => {
33
+ let filePath = args.path;
34
+ if (!filePath) {
35
+ try {
36
+ const result = await deps.server.server.elicitInput({
37
+ message: 'What data would you like to analyze?',
38
+ requestedSchema: {
39
+ type: 'object',
40
+ properties: {
41
+ path: {
42
+ type: 'string',
43
+ title: 'File or directory path',
44
+ description: 'e.g. /Users/you/Downloads/sales.csv or ~/data/my-project/',
45
+ },
46
+ },
47
+ required: ['path'],
48
+ },
49
+ });
50
+ if (result.action !== 'accept' || !result.content?.path) {
51
+ return errorResponse('No path provided. To connect data, provide a file or directory path.');
52
+ }
53
+ filePath = result.content.path;
54
+ }
55
+ catch {
56
+ return errorResponse('This client does not support interactive input. '
57
+ + 'Use add_source instead and pass the file path directly.');
58
+ }
59
+ }
60
+ filePath = filePath.replace(/^~/, process.env.HOME || '');
61
+ if (isSandboxPath(filePath)) {
62
+ return errorResponse('This path looks like a cloud sandbox path, not a local filesystem path. '
63
+ + 'Dolex runs on the user\'s machine and can access any local file — but not cloud sandbox uploads. '
64
+ + 'Please provide the real local path.');
65
+ }
66
+ const stat = fs.statSync(filePath, { throwIfNoEntry: false });
67
+ if (!stat) {
68
+ return errorResponse(`Path not found: ${filePath}`);
69
+ }
70
+ const type = detectType(filePath);
71
+ const name = deriveName(filePath);
72
+ return addSource({
73
+ name,
74
+ type,
75
+ config: { type, path: filePath },
76
+ detail: 'full',
77
+ });
78
+ };
79
+ }
80
+ //# sourceMappingURL=connect-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-data.js","sourceRoot":"","sources":["../../../../src/mcp/tools/connect-data.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outsidedata/dolex",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "AI data analyst — 43 handcrafted visualization patterns, query engine with window functions, and auto-analysis planning via MCP",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/mcp/index.ts CHANGED
@@ -5,13 +5,14 @@
5
5
  * An MCP server that provides visualization intelligence from a handcrafted
6
6
  * pattern library that goes far beyond bar/line/pie.
7
7
  *
8
- * 17 tools:
8
+ * 18 tools:
9
9
  * visualize — Inline data + intent → ranked visualization recommendations
10
10
  * visualize_from_source — Source data (DSL query) + intent → ranked visualization recommendations
11
11
  * list_patterns — Browse all available visualization patterns
12
12
  * refine_visualization — Tweak a visualization spec
13
13
  * create_dashboard — Multi-view dashboard from a data source
14
14
  * refine_dashboard — Iterate on a dashboard (add/remove views, layout, filters, theme)
15
+ * connect_data — Onboard data with elicitation (asks user for path directly)
15
16
  * add_source — Connect a data source (CSV, SQLite, Postgres, MySQL)
16
17
  * list_sources — List connected data sources
17
18
  * remove_source — Disconnect a data source
@@ -46,6 +47,7 @@ import {
46
47
  handleRemoveSource,
47
48
  handleDescribeSource,
48
49
  } from './tools/sources.js';
50
+ import { connectDataInputSchema, handleConnectData } from './tools/connect-data.js';
49
51
  import { analyzeSourceInputSchema, handleAnalyzeSource } from './tools/analyze.js';
50
52
  import { querySourceInputSchema, handleQuerySource } from './tools/query-source.js';
51
53
  import { createDashboardInputSchema, handleCreateDashboard } from './tools/dashboard.js';
@@ -86,30 +88,21 @@ const serverStartTime = Date.now();
86
88
  const server = new McpServer(
87
89
  {
88
90
  name: 'dolex',
89
- version: '0.1.9',
91
+ version: '0.1.11',
90
92
  },
91
93
  {
92
94
  instructions: [
93
- 'Dolex is a data analysis and visualization MCP server running on the user\'s LOCAL MACHINE.',
95
+ 'STOP. Read this before doing anything else.',
94
96
  '',
95
- '## FILE ACCESS READ THIS FIRST',
97
+ 'When a user wants to analyze data or mentions ANY file, call connect_data.',
98
+ 'connect_data will ask the user directly for the file path — you do not need to handle paths.',
99
+ 'Do not check /mnt/user-data/uploads. Do not use the view tool. Do not verify paths.',
100
+ 'Just call connect_data and let it handle everything.',
96
101
  '',
97
- 'This server has FULL ACCESS to the user\'s local filesystem. /Users/*, /home/*, C:\\*, /var/*, /tmp/* all accessible.',
98
- 'The ONLY exception is cloud sandbox paths (/mnt/user-data/, /home/claude/).',
102
+ 'If the user gives a path directly, you can pass it to connect_data as the optional path argument.',
99
103
  '',
100
- 'WRONG: Checking /mnt/user-data/uploads before calling add_source.',
101
- 'WRONG: Telling the user "I can\'t access local files" or "that path won\'t work".',
102
- 'WRONG: Asking the user to upload files or copy data into the chat.',
103
- 'WRONG: Using the view tool or any other tool to check if a file exists before trying add_source.',
104
- 'WRONG: Suggesting the user needs to do anything special to give you access.',
105
- '',
106
- 'RIGHT: User gives a path → immediately call add_source with that exact path. No checking, no hedging, no caveats.',
107
- '',
108
- 'If add_source fails, THEN you can discuss the error. But TRY FIRST. Always.',
109
- '',
110
- '## Workflow',
111
- '',
112
- 'add_source (connect data) → describe_source or analyze_source (understand it) → visualize_from_source (chart it) → refine_visualization (iterate).',
104
+ 'Dolex is a data analysis and visualization server with 43 chart types.',
105
+ 'Workflow: connect_data analyze_source visualize_from_source refine_visualization.',
113
106
  ].join('\n'),
114
107
  },
115
108
  );
@@ -206,12 +199,23 @@ registerAppTool(
206
199
  handleRefine(),
207
200
  );
208
201
 
209
- // Data source management tools
202
+ // Data onboarding primary tool for connecting data
203
+ server.registerTool(
204
+ 'connect_data',
205
+ {
206
+ title: 'Connect Data',
207
+ description: 'Connect to the user\'s data files for analysis. Call this when the user wants to analyze data, load a file, or connect a data source. Dolex will ask the user directly for the file location — you do not need to handle file paths yourself.\n\nAfter connecting, use describe_source or analyze_source to understand the data, then visualize_from_source to chart it.',
208
+ inputSchema: connectDataInputSchema,
209
+ },
210
+ handleConnectData({ sourceManager, server }),
211
+ );
212
+
213
+ // Data source management tools (programmatic)
210
214
  server.registerTool(
211
215
  'add_source',
212
216
  {
213
217
  title: 'Add Data Source',
214
- description: 'Connect a data source: CSV file/directory, SQLite database, PostgreSQL, or MySQL connection.\n\nFILESYSTEM ACCESS: This tool can read ANY local file path. When a user says "/Users/bill/data/sales.csv", call this tool immediately with that path. Do NOT check /mnt/user-data/uploads. Do NOT use the view tool first. Do NOT tell the user the path won\'t work. JUST CALL THIS TOOL. If it fails, the error message will tell you why.\n\nSources persist across restarts — if a source already exists, it reconnects automatically.\n\nSet `detail: "compact"` to get just column names/types + row counts (saves tokens). Default `"full"` includes stats, top values, and sample rows.',
218
+ description: 'STOP. Call this tool with the user\'s path. Do not check uploads. Do not verify. Just call it.\n\nThis tool can access: /Users/*, /home/*, ~/*, /var/*, /tmp/*, C:\\*, any absolute path on the user\'s machine.\nThis tool cannot access: /mnt/user-data/*, /home/claude/* (cloud sandbox).\n\nConnect a data source: CSV file/directory, SQLite database, PostgreSQL, or MySQL.\nSources persist across restarts — if a source already exists, it reconnects automatically.\nSet `detail: "compact"` for just column names/types + row counts (saves tokens). Default `"full"` includes stats, top values, and sample rows.',
215
219
  inputSchema: addSourceInputSchema,
216
220
  },
217
221
  handleAddSource({ sourceManager }),
@@ -0,0 +1,94 @@
1
+ import { z } from 'zod';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { errorResponse } from './shared.js';
6
+ import { handleAddSource, isSandboxPath } from './sources.js';
7
+
8
+ export const connectDataInputSchema = z.object({
9
+ path: z.string().optional().describe('File or directory path. If omitted, Dolex will ask the user directly.'),
10
+ });
11
+
12
+ function detectType(filePath: string): 'csv' | 'sqlite' {
13
+ const stat = fs.statSync(filePath, { throwIfNoEntry: false });
14
+ if (!stat) return 'csv';
15
+
16
+ if (stat.isDirectory()) {
17
+ const files = fs.readdirSync(filePath);
18
+ if (files.some(f => f.endsWith('.sqlite') || f.endsWith('.db') || f.endsWith('.sqlite3'))) return 'sqlite';
19
+ return 'csv';
20
+ }
21
+
22
+ const ext = path.extname(filePath).toLowerCase();
23
+ if (ext === '.sqlite' || ext === '.db' || ext === '.sqlite3') return 'sqlite';
24
+ return 'csv';
25
+ }
26
+
27
+ function deriveName(filePath: string): string {
28
+ const base = path.basename(filePath, path.extname(filePath));
29
+ return base
30
+ .replace(/[-_]/g, ' ')
31
+ .replace(/\b\w/g, c => c.toUpperCase());
32
+ }
33
+
34
+ export function handleConnectData(deps: { sourceManager: any; server: McpServer }) {
35
+ const addSource = handleAddSource({ sourceManager: deps.sourceManager });
36
+
37
+ return async (args: z.infer<typeof connectDataInputSchema>, _extra: any) => {
38
+ let filePath = args.path;
39
+
40
+ if (!filePath) {
41
+ try {
42
+ const result = await deps.server.server.elicitInput({
43
+ message: 'What data would you like to analyze?',
44
+ requestedSchema: {
45
+ type: 'object' as const,
46
+ properties: {
47
+ path: {
48
+ type: 'string' as const,
49
+ title: 'File or directory path',
50
+ description: 'e.g. /Users/you/Downloads/sales.csv or ~/data/my-project/',
51
+ },
52
+ },
53
+ required: ['path'],
54
+ },
55
+ });
56
+
57
+ if (result.action !== 'accept' || !result.content?.path) {
58
+ return errorResponse('No path provided. To connect data, provide a file or directory path.');
59
+ }
60
+ filePath = result.content.path as string;
61
+ } catch {
62
+ return errorResponse(
63
+ 'This client does not support interactive input. '
64
+ + 'Use add_source instead and pass the file path directly.'
65
+ );
66
+ }
67
+ }
68
+
69
+ filePath = filePath.replace(/^~/, process.env.HOME || '');
70
+
71
+ if (isSandboxPath(filePath)) {
72
+ return errorResponse(
73
+ 'This path looks like a cloud sandbox path, not a local filesystem path. '
74
+ + 'Dolex runs on the user\'s machine and can access any local file — but not cloud sandbox uploads. '
75
+ + 'Please provide the real local path.'
76
+ );
77
+ }
78
+
79
+ const stat = fs.statSync(filePath, { throwIfNoEntry: false });
80
+ if (!stat) {
81
+ return errorResponse(`Path not found: ${filePath}`);
82
+ }
83
+
84
+ const type = detectType(filePath);
85
+ const name = deriveName(filePath);
86
+
87
+ return addSource({
88
+ name,
89
+ type,
90
+ config: { type, path: filePath } as any,
91
+ detail: 'full',
92
+ });
93
+ };
94
+ }