ornold-mcp 1.2.2 → 1.3.1

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 (2) hide show
  1. package/dist/cli.js +84 -72
  2. package/package.json +1 -2
package/dist/cli.js CHANGED
@@ -2056,6 +2056,7 @@ function getOptionalString(argNames, envNames) {
2056
2056
  }
2057
2057
  var TOKEN = getArg("token") || process.env.ORNOLD_TOKEN || "";
2058
2058
  var SERVER_URL = getArg("server") || process.env.ORNOLD_SERVER || "wss://mcp.ornold.com/bridge";
2059
+ var BROWSER_MODE = getArg("mode") || process.env.ORNOLD_MODE || "dom";
2059
2060
  var LINKEN_PORT = getOptionalPort("linken-port", "LINKEN_PORT");
2060
2061
  var WADEX_PORT = getOptionalPort("wadex-port", "WADEX_PORT");
2061
2062
  var DOLPHIN_PORT = getOptionalPort("dolphin-port", "DOLPHIN_PORT");
@@ -2865,6 +2866,16 @@ var browserTargetArgs = {
2865
2866
  _scope: browserScopeArg
2866
2867
  };
2867
2868
  function createServer() {
2869
+ const modeInstructions = BROWSER_MODE === "vision" ? `## Interaction mode: VISION
2870
+ - Use browser_parallel_vision_analyze_grouped to analyze page content via AI vision.
2871
+ - Use browser_parallel_click_normalized_box to click elements by coordinates.
2872
+ - Use browser_parallel_screenshot to see the page.
2873
+ - Do NOT use browser_parallel_snapshot (DOM mode is disabled).` : BROWSER_MODE === "both" ? `## Interaction modes: DOM + VISION
2874
+ - Prefer DOM mode (browser_parallel_snapshot \u2192 ref-based clicks) \u2014 it's faster and free.
2875
+ - Use Vision mode (browser_parallel_vision_analyze_grouped) only when DOM doesn't work (canvas, complex iframes, dynamic content).` : `## Interaction mode: DOM
2876
+ - Use browser_parallel_snapshot to get page content with [ref=N] markers.
2877
+ - Use ref parameter for clicking/filling elements from snapshot.
2878
+ - Always call snapshot BEFORE clicking/filling \u2014 refs go stale after navigation.`;
2868
2879
  const server = new McpServer({
2869
2880
  name: "ornold-browser",
2870
2881
  version: CLIENT_VERSION,
@@ -2876,9 +2887,9 @@ ${LINKEN_PORT !== void 0 ? "- Linken Sphere (linken_* tools)" : ""}${WADEX_PORT
2876
2887
  ## Core workflow
2877
2888
  1. Start a browser profile: linken_start_instances / dolphin_start_profile
2878
2889
  2. Browser auto-connects via CDP. Use browser_list to see connected browsers.
2879
- 3. Use browser_parallel_* tools to interact (navigate, click, fill, snapshot, etc.)
2880
- 4. Always call browser_parallel_snapshot BEFORE clicking/filling \u2014 it returns [ref=N] markers.
2881
- 5. Use ref parameter (not selector) for clicking/filling elements from snapshot.
2890
+ 3. Use browser_parallel_* tools to interact with pages.
2891
+
2892
+ ${modeInstructions}
2882
2893
 
2883
2894
  ## Anti-detection rules
2884
2895
  - Navigate via Google search, not direct URLs (except same-domain links).
@@ -2886,12 +2897,9 @@ ${LINKEN_PORT !== void 0 ? "- Linken Sphere (linken_* tools)" : ""}${WADEX_PORT
2886
2897
  - Use browser_parallel_type (not fill) for short human-like inputs.
2887
2898
  - Never modify fingerprints via JavaScript or navigate to chrome:// URLs.
2888
2899
 
2889
- ## Flow execution (AI-powered automation)
2890
- Flows delegate multi-step tasks to a cheaper model on the server.
2891
2900
  ## Captcha solving
2892
2901
  - browser_detect_captcha \u2192 browser_solve_captcha (reCAPTCHA/hCaptcha via 2captcha)
2893
- - browser_detect_press_hold \u2192 browser_solve_press_hold (PerimeterX)
2894
- - browser_captcha_balance to check remaining balance`
2902
+ - browser_detect_press_hold \u2192 browser_solve_press_hold (PerimeterX)`
2895
2903
  });
2896
2904
  server.tool("browser_list", "List connected browsers", {}, () => toolHandler("browser_list", {}));
2897
2905
  server.tool("browser_status", "Check browser sync and responsiveness", {
@@ -2905,11 +2913,29 @@ Flows delegate multi-step tasks to a cheaper model on the server.
2905
2913
  browserIds: browserIdsArg,
2906
2914
  _scope: browserScopeArg
2907
2915
  }, (args2) => toolHandler("browser_parallel_tabs", args2));
2908
- server.tool("browser_parallel_snapshot", "Get page snapshot with [ref=N] markers", {
2909
- compact: z.boolean().optional(),
2910
- browserIds: browserIdsArg,
2911
- _scope: browserScopeArg
2912
- }, (args2) => toolHandler("browser_parallel_snapshot", args2));
2916
+ if (BROWSER_MODE === "dom" || BROWSER_MODE === "both") {
2917
+ server.tool("browser_parallel_snapshot", "Get page snapshot with [ref=N] markers", {
2918
+ compact: z.boolean().optional(),
2919
+ browserIds: browserIdsArg,
2920
+ _scope: browserScopeArg
2921
+ }, (args2) => toolHandler("browser_parallel_snapshot", args2));
2922
+ }
2923
+ if (BROWSER_MODE === "vision" || BROWSER_MODE === "both") {
2924
+ server.tool("browser_parallel_screenshot", "Take a screenshot of the page", {
2925
+ browserIds: browserIdsArg,
2926
+ _scope: browserScopeArg
2927
+ }, (args2) => toolHandler("browser_parallel_screenshot", args2));
2928
+ server.tool("browser_parallel_vision_analyze_grouped", "Analyze grouped browser screenshots with OmniParser via Ornold server", {
2929
+ similarityThreshold: z.number().optional(),
2930
+ browserIds: browserIdsArg,
2931
+ _scope: browserScopeArg
2932
+ }, (args2) => toolHandler("browser_parallel_vision_analyze_grouped", args2));
2933
+ server.tool("browser_parallel_click_normalized_box", "Click normalized viewport box center", {
2934
+ box: z.tuple([z.number(), z.number(), z.number(), z.number()]),
2935
+ browserIds: browserIdsArg,
2936
+ _scope: browserScopeArg
2937
+ }, (args2) => toolHandler("browser_parallel_click_normalized_box", args2));
2938
+ }
2913
2939
  server.tool("browser_parallel_navigate", "Navigate to URL", {
2914
2940
  url: z.string(),
2915
2941
  browserIds: browserIdsArg,
@@ -2922,52 +2948,57 @@ Flows delegate multi-step tasks to a cheaper model on the server.
2922
2948
  })),
2923
2949
  _scope: browserScopeArg
2924
2950
  }, (args2) => toolHandler("browser_parallel_navigate_multi", args2));
2925
- server.tool("browser_parallel_click", "Click element", {
2926
- ...browserTargetArgs
2927
- }, (args2) => toolHandler("browser_parallel_click", args2));
2928
- server.tool("browser_parallel_type", "Type text into element", {
2929
- ...browserTargetArgs,
2930
- text: z.string()
2931
- }, (args2) => toolHandler("browser_parallel_type", args2));
2932
- server.tool("browser_parallel_fill", "Fill input (clear + type)", {
2933
- ...browserTargetArgs,
2934
- text: z.string().optional(),
2935
- texts: z.record(z.string()).optional()
2936
- }, (args2) => toolHandler("browser_parallel_fill", args2));
2937
- server.tool("browser_parallel_fill_multi", "Fill input with per-browser values", {
2938
- ...browserTargetArgs,
2939
- texts: z.record(z.string())
2940
- }, (args2) => toolHandler("browser_parallel_fill_multi", args2));
2941
- server.tool("browser_parallel_fill_form", "Fill multiple form fields sequentially", {
2942
- fields: z.array(z.object({
2943
- element: z.string().optional(),
2944
- ref: browserRefArg,
2945
- selector: z.string().optional(),
2946
- value: z.string(),
2947
- type: z.enum(["textbox", "checkbox", "radio", "combobox"]).optional()
2948
- })),
2949
- browserIds: browserIdsArg,
2950
- _scope: browserScopeArg
2951
- }, (args2) => toolHandler("browser_parallel_fill_form", args2));
2952
- server.tool("browser_parallel_drag", "Drag from one element to another", {
2953
- startElement: z.string().optional(),
2954
- startRef: browserRefArg,
2955
- startSelector: z.string().optional(),
2956
- endElement: z.string().optional(),
2957
- endRef: browserRefArg,
2958
- endSelector: z.string().optional(),
2959
- browserIds: browserIdsArg,
2960
- _scope: browserScopeArg
2961
- }, (args2) => toolHandler("browser_parallel_drag", args2));
2951
+ if (BROWSER_MODE === "dom" || BROWSER_MODE === "both") {
2952
+ server.tool("browser_parallel_click", "Click element", {
2953
+ ...browserTargetArgs
2954
+ }, (args2) => toolHandler("browser_parallel_click", args2));
2955
+ server.tool("browser_parallel_type", "Type text into element", {
2956
+ ...browserTargetArgs,
2957
+ text: z.string()
2958
+ }, (args2) => toolHandler("browser_parallel_type", args2));
2959
+ server.tool("browser_parallel_fill", "Fill input (clear + type)", {
2960
+ ...browserTargetArgs,
2961
+ text: z.string().optional(),
2962
+ texts: z.record(z.string()).optional()
2963
+ }, (args2) => toolHandler("browser_parallel_fill", args2));
2964
+ server.tool("browser_parallel_fill_multi", "Fill input with per-browser values", {
2965
+ ...browserTargetArgs,
2966
+ texts: z.record(z.string())
2967
+ }, (args2) => toolHandler("browser_parallel_fill_multi", args2));
2968
+ server.tool("browser_parallel_fill_form", "Fill multiple form fields sequentially", {
2969
+ fields: z.array(z.object({
2970
+ element: z.string().optional(),
2971
+ ref: browserRefArg,
2972
+ selector: z.string().optional(),
2973
+ value: z.string(),
2974
+ type: z.enum(["textbox", "checkbox", "radio", "combobox"]).optional()
2975
+ })),
2976
+ browserIds: browserIdsArg,
2977
+ _scope: browserScopeArg
2978
+ }, (args2) => toolHandler("browser_parallel_fill_form", args2));
2979
+ server.tool("browser_parallel_drag", "Drag from one element to another", {
2980
+ startElement: z.string().optional(),
2981
+ startRef: browserRefArg,
2982
+ startSelector: z.string().optional(),
2983
+ endElement: z.string().optional(),
2984
+ endRef: browserRefArg,
2985
+ endSelector: z.string().optional(),
2986
+ browserIds: browserIdsArg,
2987
+ _scope: browserScopeArg
2988
+ }, (args2) => toolHandler("browser_parallel_drag", args2));
2989
+ server.tool("browser_parallel_select_option", "Select dropdown option", {
2990
+ ...browserTargetArgs,
2991
+ values: z.array(z.string())
2992
+ }, (args2) => toolHandler("browser_parallel_select_option", args2));
2993
+ server.tool("browser_parallel_hover", "Hover over element", {
2994
+ ...browserTargetArgs
2995
+ }, (args2) => toolHandler("browser_parallel_hover", args2));
2996
+ }
2962
2997
  server.tool("browser_parallel_press_key", "Press keyboard key", {
2963
2998
  key: z.string(),
2964
2999
  browserIds: browserIdsArg,
2965
3000
  _scope: browserScopeArg
2966
3001
  }, (args2) => toolHandler("browser_parallel_press_key", args2));
2967
- server.tool("browser_parallel_select_option", "Select dropdown option", {
2968
- ...browserTargetArgs,
2969
- values: z.array(z.string())
2970
- }, (args2) => toolHandler("browser_parallel_select_option", args2));
2971
3002
  server.tool("browser_parallel_wait_for", "Wait for condition", {
2972
3003
  time: z.number().optional(),
2973
3004
  text: z.string().optional(),
@@ -2977,11 +3008,6 @@ Flows delegate multi-step tasks to a cheaper model on the server.
2977
3008
  browserIds: browserIdsArg,
2978
3009
  _scope: browserScopeArg
2979
3010
  }, (args2) => toolHandler("browser_parallel_wait_for", args2));
2980
- server.tool("browser_parallel_screenshot", "Take screenshot", {
2981
- fullPage: z.boolean().optional(),
2982
- browserIds: browserIdsArg,
2983
- _scope: browserScopeArg
2984
- }, (args2) => toolHandler("browser_parallel_screenshot", args2));
2985
3011
  server.tool("browser_parallel_evaluate", "Run JavaScript in page", {
2986
3012
  script: z.string(),
2987
3013
  browserIds: browserIdsArg,
@@ -2997,9 +3023,6 @@ Flows delegate multi-step tasks to a cheaper model on the server.
2997
3023
  variables: z.record(z.record(z.string())),
2998
3024
  _scope: browserScopeArg
2999
3025
  }, (args2) => toolHandler("browser_parallel_run_code_with_vars", args2));
3000
- server.tool("browser_parallel_hover", "Hover over element", {
3001
- ...browserTargetArgs
3002
- }, (args2) => toolHandler("browser_parallel_hover", args2));
3003
3026
  server.tool("browser_parallel_go_back", "Go back", {
3004
3027
  browserIds: browserIdsArg,
3005
3028
  _scope: browserScopeArg
@@ -3027,16 +3050,6 @@ Flows delegate multi-step tasks to a cheaper model on the server.
3027
3050
  browserIds: browserIdsArg,
3028
3051
  _scope: browserScopeArg
3029
3052
  }, (args2) => toolHandler("browser_parallel_network_requests", args2));
3030
- server.tool("browser_parallel_vision_analyze_grouped", "Analyze grouped browser screenshots with OmniParser via Ornold server", {
3031
- similarityThreshold: z.number().optional(),
3032
- browserIds: browserIdsArg,
3033
- _scope: browserScopeArg
3034
- }, (args2) => toolHandler("browser_parallel_vision_analyze_grouped", args2));
3035
- server.tool("browser_parallel_click_normalized_box", "Click normalized viewport box center", {
3036
- box: z.tuple([z.number(), z.number(), z.number(), z.number()]),
3037
- browserIds: browserIdsArg,
3038
- _scope: browserScopeArg
3039
- }, (args2) => toolHandler("browser_parallel_click_normalized_box", args2));
3040
3053
  server.tool("browser_setup_downloads", "Enable browser downloads to project files directory", {
3041
3054
  browserIds: browserIdsArg,
3042
3055
  _scope: browserScopeArg
@@ -3083,7 +3096,6 @@ Flows delegate multi-step tasks to a cheaper model on the server.
3083
3096
  autoSubmit: z.boolean().optional(),
3084
3097
  _scope: browserScopeArg
3085
3098
  }, (args2) => toolHandler("browser_solve_captcha", args2));
3086
- server.tool("browser_captcha_balance", "Check 2captcha balance", {}, () => toolHandler("browser_captcha_balance", {}));
3087
3099
  server.tool("captcha_detect", "Detect captcha on page", {
3088
3100
  browserIds: browserIdsArg
3089
3101
  }, (args2) => toolHandler("captcha_detect", args2));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ornold-mcp",
3
- "version": "1.2.2",
3
+ "version": "1.3.1",
4
4
  "type": "module",
5
5
  "main": "./dist/cli.js",
6
6
  "files": [
@@ -19,7 +19,6 @@
19
19
  "client": "tsx client/index.ts"
20
20
  },
21
21
  "dependencies": {
22
- "@anthropic-ai/sdk": "^0.88.0",
23
22
  "@modelcontextprotocol/sdk": "^1.12.0",
24
23
  "@supabase/supabase-js": "^2.103.0",
25
24
  "express": "^4.21.2",