ornold-mcp 1.2.1 → 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.
- package/dist/cli.js +86 -74
- package/package.json +1 -2
package/dist/cli.js
CHANGED
|
@@ -2055,7 +2055,8 @@ function getOptionalString(argNames, envNames) {
|
|
|
2055
2055
|
return value === "" ? void 0 : value;
|
|
2056
2056
|
}
|
|
2057
2057
|
var TOKEN = getArg("token") || process.env.ORNOLD_TOKEN || "";
|
|
2058
|
-
var SERVER_URL = getArg("server") || process.env.ORNOLD_SERVER || "wss://
|
|
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");
|
|
@@ -2079,7 +2080,7 @@ function getPackageVersion() {
|
|
|
2079
2080
|
var CLIENT_VERSION = getPackageVersion();
|
|
2080
2081
|
if (!TOKEN) {
|
|
2081
2082
|
console.error("Usage: npx ornold-mcp --token <your_token>");
|
|
2082
|
-
console.error("Get your token at https://
|
|
2083
|
+
console.error("Get your token at https://mcp.ornold.com");
|
|
2083
2084
|
process.exit(1);
|
|
2084
2085
|
}
|
|
2085
2086
|
var ws = null;
|
|
@@ -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
|
|
2880
|
-
|
|
2881
|
-
|
|
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
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
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
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
fields
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
|
|
2948
|
-
|
|
2949
|
-
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
|
|
2959
|
-
|
|
2960
|
-
|
|
2961
|
-
|
|
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.
|
|
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",
|