@zenalexa/unicli 0.208.0 → 0.209.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +6 -6
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +6 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +82 -2
  8. package/dist/commands/agents.js.map +1 -1
  9. package/dist/commands/generate.d.ts.map +1 -1
  10. package/dist/commands/generate.js +20 -1
  11. package/dist/commands/generate.js.map +1 -1
  12. package/dist/commands/hub.d.ts +13 -0
  13. package/dist/commands/hub.d.ts.map +1 -0
  14. package/dist/commands/hub.js +232 -0
  15. package/dist/commands/hub.js.map +1 -0
  16. package/dist/commands/research.d.ts +17 -0
  17. package/dist/commands/research.d.ts.map +1 -0
  18. package/dist/commands/research.js +257 -0
  19. package/dist/commands/research.js.map +1 -0
  20. package/dist/commands/test-gen.d.ts +10 -0
  21. package/dist/commands/test-gen.d.ts.map +1 -0
  22. package/dist/commands/test-gen.js +124 -0
  23. package/dist/commands/test-gen.js.map +1 -0
  24. package/dist/discovery/loader.d.ts.map +1 -1
  25. package/dist/discovery/loader.js +3 -0
  26. package/dist/discovery/loader.js.map +1 -1
  27. package/dist/engine/capability.d.ts +40 -0
  28. package/dist/engine/capability.d.ts.map +1 -0
  29. package/dist/engine/capability.js +191 -0
  30. package/dist/engine/capability.js.map +1 -0
  31. package/dist/engine/endpoint.d.ts +47 -0
  32. package/dist/engine/endpoint.d.ts.map +1 -0
  33. package/dist/engine/endpoint.js +295 -0
  34. package/dist/engine/endpoint.js.map +1 -0
  35. package/dist/engine/framework.d.ts +28 -0
  36. package/dist/engine/framework.d.ts.map +1 -0
  37. package/dist/engine/framework.js +66 -0
  38. package/dist/engine/framework.js.map +1 -0
  39. package/dist/engine/probe.d.ts +19 -0
  40. package/dist/engine/probe.d.ts.map +1 -0
  41. package/dist/engine/probe.js +85 -0
  42. package/dist/engine/probe.js.map +1 -0
  43. package/dist/engine/research.d.ts +38 -0
  44. package/dist/engine/research.d.ts.map +1 -0
  45. package/dist/engine/research.js +414 -0
  46. package/dist/engine/research.js.map +1 -0
  47. package/dist/engine/yaml-runner.d.ts.map +1 -1
  48. package/dist/engine/yaml-runner.js +80 -5
  49. package/dist/engine/yaml-runner.js.map +1 -1
  50. package/dist/manifest.json +403 -1
  51. package/dist/mcp/server.js +59 -1
  52. package/dist/mcp/server.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/adapters/cnn/top.yaml +21 -0
  55. package/src/adapters/cocoapods/search.yaml +16 -0
  56. package/src/adapters/crates-io/search.yaml +27 -0
  57. package/src/adapters/docker-hub/search.yaml +26 -0
  58. package/src/adapters/eastmoney/hot.yaml +23 -0
  59. package/src/adapters/eastmoney/search.yaml +25 -0
  60. package/src/adapters/exchangerate/convert.yaml +19 -0
  61. package/src/adapters/feishu/calendar.yaml +24 -0
  62. package/src/adapters/feishu/docs.yaml +17 -0
  63. package/src/adapters/feishu/send.yaml +29 -0
  64. package/src/adapters/feishu/tasks.yaml +24 -0
  65. package/src/adapters/gitee/search.yaml +25 -0
  66. package/src/adapters/gitee/trending.yaml +22 -0
  67. package/src/adapters/gitlab/search.yaml +24 -0
  68. package/src/adapters/gitlab/trending.yaml +22 -0
  69. package/src/adapters/homebrew/info.yaml +15 -0
  70. package/src/adapters/huggingface-papers/daily.yaml +21 -0
  71. package/src/adapters/infoq/articles.yaml +29 -0
  72. package/src/adapters/ip-info/lookup.yaml +15 -0
  73. package/src/adapters/itch-io/popular.yaml +22 -0
  74. package/src/adapters/ithome/news.yaml +21 -0
  75. package/src/adapters/mastodon/search.yaml +29 -0
  76. package/src/adapters/mastodon/trending.yaml +27 -0
  77. package/src/adapters/meituan/search.yaml +30 -0
  78. package/src/adapters/minimax/chat.yaml +33 -0
  79. package/src/adapters/minimax/models.yaml +18 -0
  80. package/src/adapters/minimax/tts.yaml +33 -0
  81. package/src/adapters/netease-music/hot.yaml +24 -0
  82. package/src/adapters/netease-music/search.yaml +29 -0
  83. package/src/adapters/npm-trends/compare.yaml +19 -0
  84. package/src/adapters/nytimes/top.yaml +26 -0
  85. package/src/adapters/openrouter/models.yaml +22 -0
  86. package/src/adapters/pexels/search.yaml +28 -0
  87. package/src/adapters/pinduoduo/hot.yaml +20 -0
  88. package/src/adapters/pypi/info.yaml +16 -0
  89. package/src/adapters/qweather/now.yaml +16 -0
  90. package/src/adapters/replicate/search.yaml +25 -0
  91. package/src/adapters/replicate/trending.yaml +22 -0
  92. package/src/adapters/sspai/hot.yaml +21 -0
  93. package/src/adapters/sspai/latest.yaml +22 -0
  94. package/src/adapters/techcrunch/latest.yaml +22 -0
  95. package/src/adapters/theverge/latest.yaml +21 -0
  96. package/src/adapters/twitch/top.yaml +26 -0
  97. package/src/adapters/unsplash/search.yaml +28 -0
  98. package/src/adapters/ycombinator/launches.yaml +20 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.208.0",
2
+ "version": "0.209.0",
3
3
  "sites": {
4
4
  "1688": {
5
5
  "commands": [
@@ -763,6 +763,26 @@
763
763
  }
764
764
  ]
765
765
  },
766
+ "cnn": {
767
+ "commands": [
768
+ {
769
+ "name": "top",
770
+ "description": "CNN top stories via RSS",
771
+ "strategy": "public",
772
+ "type": "web-api"
773
+ }
774
+ ]
775
+ },
776
+ "cocoapods": {
777
+ "commands": [
778
+ {
779
+ "name": "search",
780
+ "description": "Search CocoaPods iOS/macOS libraries",
781
+ "strategy": "public",
782
+ "type": "web-api"
783
+ }
784
+ ]
785
+ },
766
786
  "codex": {
767
787
  "commands": [
768
788
  {
@@ -827,6 +847,16 @@
827
847
  }
828
848
  ]
829
849
  },
850
+ "crates-io": {
851
+ "commands": [
852
+ {
853
+ "name": "search",
854
+ "description": "Search Rust crates on crates.io",
855
+ "strategy": "public",
856
+ "type": "web-api"
857
+ }
858
+ ]
859
+ },
830
860
  "ctrip": {
831
861
  "commands": [
832
862
  {
@@ -961,6 +991,16 @@
961
991
  }
962
992
  ]
963
993
  },
994
+ "docker-hub": {
995
+ "commands": [
996
+ {
997
+ "name": "search",
998
+ "description": "Search Docker Hub images",
999
+ "strategy": "public",
1000
+ "type": "web-api"
1001
+ }
1002
+ ]
1003
+ },
964
1004
  "doctl": {
965
1005
  "commands": [
966
1006
  {
@@ -1179,6 +1219,32 @@
1179
1219
  }
1180
1220
  ]
1181
1221
  },
1222
+ "eastmoney": {
1223
+ "commands": [
1224
+ {
1225
+ "name": "hot",
1226
+ "description": "Eastmoney hot stocks (A-share volume leaders)",
1227
+ "strategy": "public",
1228
+ "type": "web-api"
1229
+ },
1230
+ {
1231
+ "name": "search",
1232
+ "description": "Search stocks on Eastmoney",
1233
+ "strategy": "public",
1234
+ "type": "web-api"
1235
+ }
1236
+ ]
1237
+ },
1238
+ "exchangerate": {
1239
+ "commands": [
1240
+ {
1241
+ "name": "convert",
1242
+ "description": "Get exchange rates (free API, no key needed)",
1243
+ "strategy": "public",
1244
+ "type": "web-api"
1245
+ }
1246
+ ]
1247
+ },
1182
1248
  "facebook": {
1183
1249
  "commands": [
1184
1250
  {
@@ -1243,6 +1309,34 @@
1243
1309
  }
1244
1310
  ]
1245
1311
  },
1312
+ "feishu": {
1313
+ "commands": [
1314
+ {
1315
+ "name": "calendar",
1316
+ "description": "List upcoming Feishu/Lark calendar events",
1317
+ "strategy": "public",
1318
+ "type": "bridge"
1319
+ },
1320
+ {
1321
+ "name": "docs",
1322
+ "description": "List recent Feishu/Lark documents",
1323
+ "strategy": "public",
1324
+ "type": "bridge"
1325
+ },
1326
+ {
1327
+ "name": "send",
1328
+ "description": "Send a message via Feishu/Lark CLI",
1329
+ "strategy": "public",
1330
+ "type": "bridge"
1331
+ },
1332
+ {
1333
+ "name": "tasks",
1334
+ "description": "List Feishu/Lark tasks",
1335
+ "strategy": "public",
1336
+ "type": "bridge"
1337
+ }
1338
+ ]
1339
+ },
1246
1340
  "ffmpeg": {
1247
1341
  "commands": [
1248
1342
  {
@@ -1571,6 +1665,22 @@
1571
1665
  }
1572
1666
  ]
1573
1667
  },
1668
+ "gitee": {
1669
+ "commands": [
1670
+ {
1671
+ "name": "search",
1672
+ "description": "Search repositories on Gitee",
1673
+ "strategy": "public",
1674
+ "type": "web-api"
1675
+ },
1676
+ {
1677
+ "name": "trending",
1678
+ "description": "Trending repositories on Gitee",
1679
+ "strategy": "public",
1680
+ "type": "web-api"
1681
+ }
1682
+ ]
1683
+ },
1574
1684
  "github-trending": {
1575
1685
  "commands": [
1576
1686
  {
@@ -1581,6 +1691,22 @@
1581
1691
  }
1582
1692
  ]
1583
1693
  },
1694
+ "gitlab": {
1695
+ "commands": [
1696
+ {
1697
+ "name": "search",
1698
+ "description": "Search GitLab projects",
1699
+ "strategy": "public",
1700
+ "type": "web-api"
1701
+ },
1702
+ {
1703
+ "name": "trending",
1704
+ "description": "Trending/popular GitLab projects",
1705
+ "strategy": "public",
1706
+ "type": "web-api"
1707
+ }
1708
+ ]
1709
+ },
1584
1710
  "godot": {
1585
1711
  "commands": [
1586
1712
  {
@@ -1725,6 +1851,26 @@
1725
1851
  }
1726
1852
  ]
1727
1853
  },
1854
+ "homebrew": {
1855
+ "commands": [
1856
+ {
1857
+ "name": "info",
1858
+ "description": "Get Homebrew formula details",
1859
+ "strategy": "public",
1860
+ "type": "web-api"
1861
+ }
1862
+ ]
1863
+ },
1864
+ "huggingface-papers": {
1865
+ "commands": [
1866
+ {
1867
+ "name": "daily",
1868
+ "description": "Daily trending papers on Hugging Face",
1869
+ "strategy": "public",
1870
+ "type": "web-api"
1871
+ }
1872
+ ]
1873
+ },
1728
1874
  "hupu": {
1729
1875
  "commands": [
1730
1876
  {
@@ -1851,6 +1997,16 @@
1851
1997
  }
1852
1998
  ]
1853
1999
  },
2000
+ "infoq": {
2001
+ "commands": [
2002
+ {
2003
+ "name": "articles",
2004
+ "description": "Latest InfoQ articles (Chinese edition)",
2005
+ "strategy": "public",
2006
+ "type": "web-api"
2007
+ }
2008
+ ]
2009
+ },
1854
2010
  "inkscape": {
1855
2011
  "commands": [
1856
2012
  {
@@ -1991,6 +2147,36 @@
1991
2147
  }
1992
2148
  ]
1993
2149
  },
2150
+ "ip-info": {
2151
+ "commands": [
2152
+ {
2153
+ "name": "lookup",
2154
+ "description": "IP geolocation lookup (free, no key)",
2155
+ "strategy": "public",
2156
+ "type": "web-api"
2157
+ }
2158
+ ]
2159
+ },
2160
+ "itch-io": {
2161
+ "commands": [
2162
+ {
2163
+ "name": "popular",
2164
+ "description": "Popular games on itch.io",
2165
+ "strategy": "public",
2166
+ "type": "web-api"
2167
+ }
2168
+ ]
2169
+ },
2170
+ "ithome": {
2171
+ "commands": [
2172
+ {
2173
+ "name": "news",
2174
+ "description": "IT Home (IT之家) latest tech news via RSS",
2175
+ "strategy": "public",
2176
+ "type": "web-api"
2177
+ }
2178
+ ]
2179
+ },
1994
2180
  "jd": {
1995
2181
  "commands": [
1996
2182
  {
@@ -2405,6 +2591,22 @@
2405
2591
  }
2406
2592
  ]
2407
2593
  },
2594
+ "mastodon": {
2595
+ "commands": [
2596
+ {
2597
+ "name": "search",
2598
+ "description": "Search posts on a Mastodon instance",
2599
+ "strategy": "public",
2600
+ "type": "web-api"
2601
+ },
2602
+ {
2603
+ "name": "trending",
2604
+ "description": "Trending posts on a Mastodon instance (default mastodon.social)",
2605
+ "strategy": "public",
2606
+ "type": "web-api"
2607
+ }
2608
+ ]
2609
+ },
2408
2610
  "medium": {
2409
2611
  "commands": [
2410
2612
  {
@@ -2427,6 +2629,16 @@
2427
2629
  }
2428
2630
  ]
2429
2631
  },
2632
+ "meituan": {
2633
+ "commands": [
2634
+ {
2635
+ "name": "search",
2636
+ "description": "Search restaurants/shops on Meituan",
2637
+ "strategy": "cookie",
2638
+ "type": "web-api"
2639
+ }
2640
+ ]
2641
+ },
2430
2642
  "mermaid": {
2431
2643
  "commands": [
2432
2644
  {
@@ -2437,6 +2649,28 @@
2437
2649
  }
2438
2650
  ]
2439
2651
  },
2652
+ "minimax": {
2653
+ "commands": [
2654
+ {
2655
+ "name": "chat",
2656
+ "description": "MiniMax M2 chat completion (OpenAI-compatible API)",
2657
+ "strategy": "header",
2658
+ "type": "web-api"
2659
+ },
2660
+ {
2661
+ "name": "models",
2662
+ "description": "List available MiniMax models",
2663
+ "strategy": "header",
2664
+ "type": "web-api"
2665
+ },
2666
+ {
2667
+ "name": "tts",
2668
+ "description": "MiniMax text-to-speech generation",
2669
+ "strategy": "header",
2670
+ "type": "web-api"
2671
+ }
2672
+ ]
2673
+ },
2440
2674
  "motion-studio": {
2441
2675
  "commands": [
2442
2676
  {
@@ -2491,6 +2725,22 @@
2491
2725
  }
2492
2726
  ]
2493
2727
  },
2728
+ "netease-music": {
2729
+ "commands": [
2730
+ {
2731
+ "name": "hot",
2732
+ "description": "NetEase Cloud Music hot/trending songs",
2733
+ "strategy": "public",
2734
+ "type": "web-api"
2735
+ },
2736
+ {
2737
+ "name": "search",
2738
+ "description": "Search songs on NetEase Cloud Music",
2739
+ "strategy": "public",
2740
+ "type": "web-api"
2741
+ }
2742
+ ]
2743
+ },
2494
2744
  "netlify": {
2495
2745
  "commands": [
2496
2746
  {
@@ -2627,6 +2877,26 @@
2627
2877
  }
2628
2878
  ]
2629
2879
  },
2880
+ "npm-trends": {
2881
+ "commands": [
2882
+ {
2883
+ "name": "compare",
2884
+ "description": "Compare npm package download counts",
2885
+ "strategy": "public",
2886
+ "type": "web-api"
2887
+ }
2888
+ ]
2889
+ },
2890
+ "nytimes": {
2891
+ "commands": [
2892
+ {
2893
+ "name": "top",
2894
+ "description": "New York Times top stories via RSS",
2895
+ "strategy": "public",
2896
+ "type": "web-api"
2897
+ }
2898
+ ]
2899
+ },
2630
2900
  "obs": {
2631
2901
  "commands": [
2632
2902
  {
@@ -2785,6 +3055,16 @@
2785
3055
  }
2786
3056
  ]
2787
3057
  },
3058
+ "openrouter": {
3059
+ "commands": [
3060
+ {
3061
+ "name": "models",
3062
+ "description": "List all available AI models on OpenRouter",
3063
+ "strategy": "public",
3064
+ "type": "web-api"
3065
+ }
3066
+ ]
3067
+ },
2788
3068
  "pandoc": {
2789
3069
  "commands": [
2790
3070
  {
@@ -2817,6 +3097,26 @@
2817
3097
  }
2818
3098
  ]
2819
3099
  },
3100
+ "pexels": {
3101
+ "commands": [
3102
+ {
3103
+ "name": "search",
3104
+ "description": "Search free stock photos on Pexels",
3105
+ "strategy": "header",
3106
+ "type": "web-api"
3107
+ }
3108
+ ]
3109
+ },
3110
+ "pinduoduo": {
3111
+ "commands": [
3112
+ {
3113
+ "name": "hot",
3114
+ "description": "Pinduoduo hot/trending products",
3115
+ "strategy": "cookie",
3116
+ "type": "web-api"
3117
+ }
3118
+ ]
3119
+ },
2820
3120
  "pixiv": {
2821
3121
  "commands": [
2822
3122
  {
@@ -2895,6 +3195,26 @@
2895
3195
  }
2896
3196
  ]
2897
3197
  },
3198
+ "pypi": {
3199
+ "commands": [
3200
+ {
3201
+ "name": "info",
3202
+ "description": "Get PyPI package details",
3203
+ "strategy": "public",
3204
+ "type": "web-api"
3205
+ }
3206
+ ]
3207
+ },
3208
+ "qweather": {
3209
+ "commands": [
3210
+ {
3211
+ "name": "now",
3212
+ "description": "Current weather from QWeather (和风天气, free tier)",
3213
+ "strategy": "public",
3214
+ "type": "web-api"
3215
+ }
3216
+ ]
3217
+ },
2898
3218
  "railway": {
2899
3219
  "commands": [
2900
3220
  {
@@ -3021,6 +3341,22 @@
3021
3341
  }
3022
3342
  ]
3023
3343
  },
3344
+ "replicate": {
3345
+ "commands": [
3346
+ {
3347
+ "name": "search",
3348
+ "description": "Search AI models on Replicate",
3349
+ "strategy": "public",
3350
+ "type": "web-api"
3351
+ },
3352
+ {
3353
+ "name": "trending",
3354
+ "description": "Trending AI models on Replicate",
3355
+ "strategy": "public",
3356
+ "type": "web-api"
3357
+ }
3358
+ ]
3359
+ },
3024
3360
  "reuters": {
3025
3361
  "commands": [
3026
3362
  {
@@ -3243,6 +3579,22 @@
3243
3579
  }
3244
3580
  ]
3245
3581
  },
3582
+ "sspai": {
3583
+ "commands": [
3584
+ {
3585
+ "name": "hot",
3586
+ "description": "Hot/trending articles on Sspai (少数派)",
3587
+ "strategy": "public",
3588
+ "type": "web-api"
3589
+ },
3590
+ {
3591
+ "name": "latest",
3592
+ "description": "Latest articles on Sspai (少数派)",
3593
+ "strategy": "public",
3594
+ "type": "web-api"
3595
+ }
3596
+ ]
3597
+ },
3246
3598
  "stackoverflow": {
3247
3599
  "commands": [
3248
3600
  {
@@ -3323,6 +3675,26 @@
3323
3675
  }
3324
3676
  ]
3325
3677
  },
3678
+ "techcrunch": {
3679
+ "commands": [
3680
+ {
3681
+ "name": "latest",
3682
+ "description": "Latest TechCrunch articles via RSS",
3683
+ "strategy": "public",
3684
+ "type": "web-api"
3685
+ }
3686
+ ]
3687
+ },
3688
+ "theverge": {
3689
+ "commands": [
3690
+ {
3691
+ "name": "latest",
3692
+ "description": "Latest The Verge articles via RSS",
3693
+ "strategy": "public",
3694
+ "type": "web-api"
3695
+ }
3696
+ ]
3697
+ },
3326
3698
  "tieba": {
3327
3699
  "commands": [
3328
3700
  {
@@ -3445,6 +3817,16 @@
3445
3817
  }
3446
3818
  ]
3447
3819
  },
3820
+ "twitch": {
3821
+ "commands": [
3822
+ {
3823
+ "name": "top",
3824
+ "description": "Top live streams on Twitch via GQL public endpoint",
3825
+ "strategy": "public",
3826
+ "type": "web-api"
3827
+ }
3828
+ ]
3829
+ },
3448
3830
  "twitter": {
3449
3831
  "commands": [
3450
3832
  {
@@ -3599,6 +3981,16 @@
3599
3981
  }
3600
3982
  ]
3601
3983
  },
3984
+ "unsplash": {
3985
+ "commands": [
3986
+ {
3987
+ "name": "search",
3988
+ "description": "Search free photos on Unsplash",
3989
+ "strategy": "public",
3990
+ "type": "web-api"
3991
+ }
3992
+ ]
3993
+ },
3602
3994
  "v2ex": {
3603
3995
  "commands": [
3604
3996
  {
@@ -4123,6 +4515,16 @@
4123
4515
  }
4124
4516
  ]
4125
4517
  },
4518
+ "ycombinator": {
4519
+ "commands": [
4520
+ {
4521
+ "name": "launches",
4522
+ "description": "Latest YC company launches",
4523
+ "strategy": "public",
4524
+ "type": "web-api"
4525
+ }
4526
+ ]
4527
+ },
4126
4528
  "yollomi": {
4127
4529
  "commands": [
4128
4530
  {
@@ -213,6 +213,22 @@ function buildExpandedTools() {
213
213
  });
214
214
  }
215
215
  }
216
+ // Add unicli_discover tool — expose explore+synthesize+generate as MCP tool
217
+ tools.push({
218
+ name: "unicli_discover",
219
+ description: "Auto-discover CLI capabilities for any website URL. Navigates the page, captures API endpoints, and optionally generates YAML adapters.",
220
+ inputSchema: {
221
+ type: "object",
222
+ properties: {
223
+ url: { type: "string", description: "Website URL to explore" },
224
+ goal: {
225
+ type: "string",
226
+ description: "Optional: capability to find (e.g. 'search', 'hot', 'feed')",
227
+ },
228
+ },
229
+ required: ["url"],
230
+ },
231
+ });
216
232
  return tools;
217
233
  }
218
234
  // ── Tool Handlers ───────────────────────────────────────────────────────────
@@ -450,6 +466,48 @@ function buildHandler(tools) {
450
466
  id,
451
467
  result,
452
468
  }));
469
+ case "unicli_discover": {
470
+ const discoverUrl = toolArgs.url;
471
+ const discoverGoal = toolArgs.goal;
472
+ if (!discoverUrl) {
473
+ return {
474
+ jsonrpc: "2.0",
475
+ id,
476
+ error: {
477
+ code: -32602,
478
+ message: "Missing required parameter: url",
479
+ },
480
+ };
481
+ }
482
+ return import("node:child_process").then(({ execFile: ef }) => import("node:util").then(({ promisify: prom }) => {
483
+ const execFileP = prom(ef);
484
+ const discoverArgs = ["generate", discoverUrl, "--json"];
485
+ if (discoverGoal)
486
+ discoverArgs.push("--goal", discoverGoal);
487
+ return execFileP("unicli", discoverArgs, {
488
+ timeout: 120_000,
489
+ encoding: "utf-8",
490
+ }).then(({ stdout }) => ({
491
+ jsonrpc: "2.0",
492
+ id,
493
+ result: { content: [{ type: "text", text: stdout }] },
494
+ }), (err) => ({
495
+ jsonrpc: "2.0",
496
+ id,
497
+ result: {
498
+ content: [
499
+ {
500
+ type: "text",
501
+ text: JSON.stringify({
502
+ error: err instanceof Error ? err.message : String(err),
503
+ }),
504
+ },
505
+ ],
506
+ isError: true,
507
+ },
508
+ }));
509
+ }));
510
+ }
453
511
  default:
454
512
  return handleExpandedTool(params.name, toolArgs).then((result) => {
455
513
  if (result)
@@ -590,7 +648,7 @@ async function startHttp(handler, port, toolCount) {
590
648
  });
591
649
  await new Promise((resolve, reject) => {
592
650
  server.once("error", reject);
593
- server.listen(port, () => {
651
+ server.listen(port, "127.0.0.1", () => {
594
652
  server.off("error", reject);
595
653
  resolve();
596
654
  });