@vespermcp/mcp-server 1.2.7 → 1.2.9

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/build/index.js CHANGED
@@ -1585,7 +1585,7 @@ async function main() {
1585
1585
  const isFuse = args.includes("fuse");
1586
1586
  const isDiscover = args.includes("discover");
1587
1587
  const isDownload = args.includes("download");
1588
- const isConfig = args.includes("config");
1588
+ const isConfig = args.includes("config") || args.includes("configure");
1589
1589
  const isSetup = args.includes("--setup") || args.includes("setup");
1590
1590
  const isSilent = args.includes("--silent");
1591
1591
  if (process.stdin.isTTY && !isSilent) {
@@ -1627,7 +1627,9 @@ async function runConfigCli(args) {
1627
1627
  const isKaggle = args.includes("kaggle");
1628
1628
  if (!(isKeys || isKaggle) || args.includes("--help")) {
1629
1629
  console.log("Usage: vespermcp config keys");
1630
+ console.log(" vespermcp configure keys");
1630
1631
  console.log(" vespermcp config kaggle --username <name> --key <api_key>");
1632
+ console.log(" vespermcp configure kaggle --username <name> --key <api_key>");
1631
1633
  console.log("Core Vesper tools work with zero API keys.");
1632
1634
  return;
1633
1635
  }
@@ -60,6 +60,46 @@ class AssetDownloader:
60
60
  if asyncio.iscoroutine(maybe):
61
61
  await maybe
62
62
 
63
+ @staticmethod
64
+ def _hydrate_kaggle_credentials() -> None:
65
+ username = os.getenv("KAGGLE_USERNAME")
66
+ key = os.getenv("KAGGLE_KEY")
67
+
68
+ if not username or not key:
69
+ try:
70
+ from config import get_all # type: ignore
71
+ keys = get_all() or {}
72
+ except Exception:
73
+ keys = {}
74
+
75
+ username = username or keys.get("kaggle_username")
76
+ key = key or keys.get("kaggle_key")
77
+
78
+ if username:
79
+ os.environ["KAGGLE_USERNAME"] = str(username)
80
+ if key:
81
+ os.environ["KAGGLE_KEY"] = str(key)
82
+
83
+ username = os.getenv("KAGGLE_USERNAME")
84
+ key = os.getenv("KAGGLE_KEY")
85
+ if not username or not key:
86
+ return
87
+
88
+ kaggle_dir = Path.home() / ".kaggle"
89
+ kaggle_file = kaggle_dir / "kaggle.json"
90
+ try:
91
+ kaggle_dir.mkdir(parents=True, exist_ok=True)
92
+ kaggle_file.write_text(
93
+ json.dumps({"username": username, "key": key}, ensure_ascii=False),
94
+ encoding="utf-8",
95
+ )
96
+ try:
97
+ os.chmod(kaggle_file, 0o600)
98
+ except Exception:
99
+ pass
100
+ except Exception:
101
+ pass
102
+
63
103
  @staticmethod
64
104
  def find_image_column(dataset: Any) -> Optional[str]:
65
105
  features = getattr(dataset, "features", None)
@@ -240,8 +280,17 @@ class AssetDownloader:
240
280
 
241
281
  await self._emit("start", {"source": "kaggle", "dataset": kaggle_ref})
242
282
 
283
+ self._hydrate_kaggle_credentials()
284
+
243
285
  api = KaggleApi()
244
- api.authenticate()
286
+ try:
287
+ api.authenticate()
288
+ except Exception as e:
289
+ raise RuntimeError(
290
+ "Kaggle authentication failed. Run 'configure_kaggle' or 'configure_keys' with "
291
+ "kaggle_username and kaggle_key, then retry. "
292
+ f"Details: {e}"
293
+ )
245
294
 
246
295
  tmp_dir = Path(tempfile.mkdtemp(prefix="vesper_kaggle_assets_"))
247
296
  downloaded = 0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vespermcp/mcp-server",
3
- "version": "1.2.7",
3
+ "version": "1.2.9",
4
4
  "description": "AI-powered dataset discovery, quality analysis, and preparation MCP server with multimodal support (text, image, audio, video)",
5
5
  "type": "module",
6
6
  "main": "build/index.js",
@@ -60,6 +60,46 @@ class AssetDownloader:
60
60
  if asyncio.iscoroutine(maybe):
61
61
  await maybe
62
62
 
63
+ @staticmethod
64
+ def _hydrate_kaggle_credentials() -> None:
65
+ username = os.getenv("KAGGLE_USERNAME")
66
+ key = os.getenv("KAGGLE_KEY")
67
+
68
+ if not username or not key:
69
+ try:
70
+ from config import get_all # type: ignore
71
+ keys = get_all() or {}
72
+ except Exception:
73
+ keys = {}
74
+
75
+ username = username or keys.get("kaggle_username")
76
+ key = key or keys.get("kaggle_key")
77
+
78
+ if username:
79
+ os.environ["KAGGLE_USERNAME"] = str(username)
80
+ if key:
81
+ os.environ["KAGGLE_KEY"] = str(key)
82
+
83
+ username = os.getenv("KAGGLE_USERNAME")
84
+ key = os.getenv("KAGGLE_KEY")
85
+ if not username or not key:
86
+ return
87
+
88
+ kaggle_dir = Path.home() / ".kaggle"
89
+ kaggle_file = kaggle_dir / "kaggle.json"
90
+ try:
91
+ kaggle_dir.mkdir(parents=True, exist_ok=True)
92
+ kaggle_file.write_text(
93
+ json.dumps({"username": username, "key": key}, ensure_ascii=False),
94
+ encoding="utf-8",
95
+ )
96
+ try:
97
+ os.chmod(kaggle_file, 0o600)
98
+ except Exception:
99
+ pass
100
+ except Exception:
101
+ pass
102
+
63
103
  @staticmethod
64
104
  def find_image_column(dataset: Any) -> Optional[str]:
65
105
  features = getattr(dataset, "features", None)
@@ -240,8 +280,17 @@ class AssetDownloader:
240
280
 
241
281
  await self._emit("start", {"source": "kaggle", "dataset": kaggle_ref})
242
282
 
283
+ self._hydrate_kaggle_credentials()
284
+
243
285
  api = KaggleApi()
244
- api.authenticate()
286
+ try:
287
+ api.authenticate()
288
+ except Exception as e:
289
+ raise RuntimeError(
290
+ "Kaggle authentication failed. Run 'configure_kaggle' or 'configure_keys' with "
291
+ "kaggle_username and kaggle_key, then retry. "
292
+ f"Details: {e}"
293
+ )
245
294
 
246
295
  tmp_dir = Path(tempfile.mkdtemp(prefix="vesper_kaggle_assets_"))
247
296
  downloaded = 0