smooth-operator-mcp 2.4.5 → 2.4.7
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/.env.example +3 -0
- package/README.md +2 -0
- package/dist/smooth-operator.mjs +54 -18
- package/dist/smooth-operator.mjs.map +3 -3
- package/docs/harnesses.md +14 -0
- package/docs/mcp-server.md +54 -8
- package/package.json +3 -3
package/docs/harnesses.md
CHANGED
|
@@ -12,6 +12,20 @@ SmoothOperator speaks MCP over stdio. The `smooth-operator install <target>`
|
|
|
12
12
|
command registers that stdio server with a supported client. It uses
|
|
13
13
|
structured argument arrays and never invokes a shell.
|
|
14
14
|
|
|
15
|
+
The server also supports Streamable HTTP at `/mcp` for harnesses that cannot
|
|
16
|
+
launch local stdio processes. Its HTTP adapter accepts current MCP sessions and
|
|
17
|
+
the SDK's legacy 2025-compatible handshake, while retaining host, origin,
|
|
18
|
+
authentication, and request-size checks. For a local harness that needs an
|
|
19
|
+
explicit path, use a structured command such as:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
smooth-operator --config /absolute/path/to/config.json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The installer-created `~/.smooth-operator/config.json` is discovered
|
|
26
|
+
automatically, so an explicit `--config` argument is only needed for a separate
|
|
27
|
+
profile or an unusual home/config location.
|
|
28
|
+
|
|
15
29
|
Build or install the package first:
|
|
16
30
|
|
|
17
31
|
```sh
|
package/docs/mcp-server.md
CHANGED
|
@@ -132,14 +132,54 @@ SMOOTH_OPERATOR_HTTP_HOST=0.0.0.0 \
|
|
|
132
132
|
SMOOTH_OPERATOR_ALLOW_REMOTE_HTTP=true \
|
|
133
133
|
SMOOTH_OPERATOR_HTTP_TOKEN="$(openssl rand -hex 32)" \
|
|
134
134
|
SMOOTH_OPERATOR_ALLOWED_HOSTS=example.internal \
|
|
135
|
-
SMOOTH_OPERATOR_ALLOWED_ORIGINS=
|
|
135
|
+
SMOOTH_OPERATOR_ALLOWED_ORIGINS=example.internal \
|
|
136
136
|
smooth-operator
|
|
137
137
|
```
|
|
138
138
|
|
|
139
139
|
Remote mode is rejected unless the token is at least 32 characters. Do not
|
|
140
140
|
use a token from a shell history, checked-in file, or shared log. A reverse
|
|
141
141
|
proxy can add TLS and network access controls, but it does not replace the
|
|
142
|
-
application token, Host/Origin allowlists, or request-size limit.
|
|
142
|
+
application token, Host/Origin allowlists, or request-size limit. Allowed host
|
|
143
|
+
and origin values are hostnames without a scheme; browser preflight requests
|
|
144
|
+
are answered only after the same Host and Origin checks.
|
|
145
|
+
|
|
146
|
+
### ChatGPT and OpenAI connections
|
|
147
|
+
|
|
148
|
+
For private developer-mode use, the safest OpenAI-compatible route is Secure
|
|
149
|
+
MCP Tunnel. It keeps this server on the local machine and forwards requests
|
|
150
|
+
over an outbound connection; it can launch this server over stdio, so no public
|
|
151
|
+
HTTP listener or public browser profile is required.
|
|
152
|
+
|
|
153
|
+
Create a tunnel in OpenAI Platform, install the separately distributed
|
|
154
|
+
`tunnel-client`, and run a profile like this (replace the placeholders with
|
|
155
|
+
your tunnel identity and local executable):
|
|
156
|
+
|
|
157
|
+
```sh
|
|
158
|
+
export CONTROL_PLANE_API_KEY="sk-..."
|
|
159
|
+
|
|
160
|
+
tunnel-client init \
|
|
161
|
+
--sample sample_mcp_stdio_local \
|
|
162
|
+
--profile smooth-operator \
|
|
163
|
+
--tunnel-id tunnel_... \
|
|
164
|
+
--mcp-command "smooth-operator --transport stdio"
|
|
165
|
+
|
|
166
|
+
tunnel-client doctor --profile smooth-operator --explain
|
|
167
|
+
tunnel-client run --profile smooth-operator
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Then enable Developer mode in ChatGPT, create a developer-mode app, choose
|
|
171
|
+
`Tunnel`, and select the associated tunnel. Tunnel and ChatGPT workspace
|
|
172
|
+
permissions are separate; the tunnel must be associated with the target
|
|
173
|
+
workspace. This path is for private testing and use, not public plugin
|
|
174
|
+
submission.
|
|
175
|
+
|
|
176
|
+
For public distribution, deploy a stable HTTPS `/mcp` endpoint and put an
|
|
177
|
+
OAuth 2.1-compatible identity provider in front of authenticated tools. The
|
|
178
|
+
local bearer token is intended for this server's controlled HTTP mode; it is
|
|
179
|
+
not a substitute for a public OAuth authorization server. See the official
|
|
180
|
+
[OpenAI MCP quickstart](https://developers.openai.com/plugins/build/app-quickstart),
|
|
181
|
+
[authentication guide](https://developers.openai.com/plugins/build/auth), and
|
|
182
|
+
[Secure MCP Tunnel guide](https://developers.openai.com/api/docs/guides/secure-mcp-tunnels).
|
|
143
183
|
|
|
144
184
|
## Browser lifecycle
|
|
145
185
|
|
|
@@ -230,9 +270,12 @@ browser mode.
|
|
|
230
270
|
|
|
231
271
|
## Configuration and precedence
|
|
232
272
|
|
|
233
|
-
Configuration can come from
|
|
234
|
-
|
|
235
|
-
|
|
273
|
+
Configuration can come from the installer-created
|
|
274
|
+
`~/.smooth-operator/config.json`, an explicitly selected JSON file via `--config`
|
|
275
|
+
or `SMOOTH_OPERATOR_CONFIG`, environment variables, and a small set of
|
|
276
|
+
command-line flags. When no explicit config path is supplied, the installer
|
|
277
|
+
file is loaded automatically so its browser, security, and data-directory
|
|
278
|
+
choices apply consistently to every harness. The effective precedence is:
|
|
236
279
|
|
|
237
280
|
1. command-line values (`--config`, `--transport`, `--host`, `--port`);
|
|
238
281
|
2. environment variables;
|
|
@@ -240,9 +283,11 @@ flags. The effective precedence is:
|
|
|
240
283
|
4. documented defaults.
|
|
241
284
|
|
|
242
285
|
The file is an object with nested `http`, `browser`, and `security` sections.
|
|
243
|
-
|
|
244
|
-
the
|
|
245
|
-
|
|
286
|
+
Explicit `--config`/`SMOOTH_OPERATOR_CONFIG` files reject unknown root keys;
|
|
287
|
+
the automatically discovered installer file ignores unrelated root sections so
|
|
288
|
+
it can coexist with harness settings. Keep the file owner-readable only
|
|
289
|
+
(`chmod 600`); the loader rejects group/world-readable configuration files and
|
|
290
|
+
rejects symlinked data directories.
|
|
246
291
|
|
|
247
292
|
Example:
|
|
248
293
|
|
|
@@ -269,6 +314,7 @@ variables include:
|
|
|
269
314
|
| Setting | Default | Notes |
|
|
270
315
|
| --- | --- | --- |
|
|
271
316
|
| `SMOOTH_OPERATOR_TRANSPORT` | `stdio` | `stdio` or `http` |
|
|
317
|
+
| `SMOOTH_OPERATOR_CONFIG` | auto-discovered | Explicit JSON config path; overrides the installer default |
|
|
272
318
|
| `SMOOTH_OPERATOR_DATA_DIR` | `~/.smooth-operator` | Private data, file, and download roots |
|
|
273
319
|
| `SMOOTH_OPERATOR_BROWSER_MODE` | `managed` | `managed`, `disabled`, `connect`, or `launch` |
|
|
274
320
|
| `SMOOTH_OPERATOR_BROWSER_URL` | `http://127.0.0.1:9222` | DevTools HTTP endpoint |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "smooth-operator-mcp",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"packageManager": "npm@12.0.2",
|
|
6
6
|
"description": "A lightweight, production-grade MCP server for secure browser automation.",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"scripts": {
|
|
24
24
|
"start": "tsx src/server/main.ts",
|
|
25
25
|
"dev": "tsx watch src/server/main.ts",
|
|
26
|
-
"build": "
|
|
26
|
+
"build": "node scripts/build.mjs",
|
|
27
27
|
"postbuild": "node scripts/set-executable.mjs dist/smooth-operator.mjs",
|
|
28
28
|
"lint": "eslint .",
|
|
29
29
|
"typecheck": "tsc --noEmit",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@modelcontextprotocol/node": "^2.0.0",
|
|
48
48
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
49
|
-
"puppeteer-core": "^25.
|
|
49
|
+
"puppeteer-core": "^25.9.0",
|
|
50
50
|
"zod": "^4.4.3"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|