fetchnode 0.6.2__tar.gz → 0.7.0__tar.gz
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.
- {fetchnode-0.6.2 → fetchnode-0.7.0}/CHANGELOG.md +13 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/PKG-INFO +43 -4
- {fetchnode-0.6.2 → fetchnode-0.7.0}/README.md +40 -2
- {fetchnode-0.6.2 → fetchnode-0.7.0}/pyproject.toml +3 -2
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/__init__.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/apps.py +10 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/capture.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/conf.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/demo.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/handlers.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/management/commands/fetchnode_mcp.py +2 -2
- fetchnode-0.7.0/src/fetchnode/management/commands/fetchnode_terminal.py +15 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/mcp.py +18 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/scrub.py +0 -0
- fetchnode-0.7.0/src/fetchnode/terminal.py +821 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/utils.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/version.py +1 -1
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/management/commands/fetchnode_mcp.py +2 -2
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/mcp.py +18 -0
- fetchnode-0.6.2/.gitignore +0 -65
- {fetchnode-0.6.2 → fetchnode-0.7.0}/LICENSE +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/api.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/celery.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/excepthook.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/management/__init__.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/management/commands/__init__.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/middleware.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/py.typed +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/query.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/scope.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/sender.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/__init__.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/api.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/apps.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/capture.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/celery.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/conf.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/demo.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/excepthook.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/handlers.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/management/__init__.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/management/commands/__init__.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/middleware.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/py.typed +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/query.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/scope.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/scrub.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/sender.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/utils.py +0 -0
- {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/version.py +0 -0
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# FetchNode SDK changelog
|
|
2
2
|
|
|
3
|
+
## 0.7.0 — 2026-11-13
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Opt-in remote terminal agent. It starts only when `FETCHNODE_TERMINAL=true` is set on the server. The private key stays on that server. `actions` mode runs predefined checks; `shell` mode is a separate local setting and refuses to run as root.
|
|
8
|
+
- New dependency: `cryptography`, used for the terminal agent's local Ed25519 key.
|
|
9
|
+
|
|
10
|
+
### Upgrade
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
python -m pip install --upgrade fetchnode==0.7.0
|
|
14
|
+
```
|
|
15
|
+
|
|
3
16
|
## 0.6.2 — 2026-10-27
|
|
4
17
|
|
|
5
18
|
### Added
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: fetchnode
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Official Django and Python client SDK for FetchNode monitoring
|
|
5
5
|
Project-URL: Homepage, https://fetch-node.com
|
|
6
6
|
Project-URL: Documentation, https://fetch-node.com/guide/
|
|
7
7
|
Project-URL: Repository, https://github.com/remcovanwijk040/fetchnode
|
|
8
8
|
Project-URL: Issues, https://github.com/remcovanwijk040/fetchnode/issues
|
|
9
|
-
Project-URL: Changelog, https://pypi.org/project/fetchnode/0.
|
|
9
|
+
Project-URL: Changelog, https://pypi.org/project/fetchnode/0.7.0/#sdk-changelog
|
|
10
10
|
Author-email: Remco van Wijk <remcovanwijk040@users.noreply.github.com>
|
|
11
11
|
License-Expression: MIT
|
|
12
12
|
License-File: LICENSE
|
|
@@ -30,6 +30,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
30
30
|
Classifier: Topic :: System :: Monitoring
|
|
31
31
|
Classifier: Typing :: Typed
|
|
32
32
|
Requires-Python: >=3.10
|
|
33
|
+
Requires-Dist: cryptography>=42
|
|
33
34
|
Requires-Dist: django>=4.2
|
|
34
35
|
Provides-Extra: celery
|
|
35
36
|
Requires-Dist: celery>=5.0; extra == 'celery'
|
|
@@ -61,6 +62,7 @@ FetchNode captures unhandled exceptions, error logs, slow database queries, N+1
|
|
|
61
62
|
- [Celery Job Monitoring](#celery-job-monitoring)
|
|
62
63
|
- [Logging Handler](#logging-handler)
|
|
63
64
|
- [Model Context Protocol (MCP) for AI Agents](#model-context-protocol-mcp-for-ai-agents)
|
|
65
|
+
- [Remote terminal](#remote-terminal)
|
|
64
66
|
- [Privacy & Security Defaults](#privacy--security-defaults)
|
|
65
67
|
|
|
66
68
|
- [Testing in Development](#testing-in-development)
|
|
@@ -72,7 +74,7 @@ FetchNode captures unhandled exceptions, error logs, slow database queries, N+1
|
|
|
72
74
|
|
|
73
75
|
## Installation
|
|
74
76
|
|
|
75
|
-
Version 0.
|
|
77
|
+
Version 0.7.0 adds an opt-in remote terminal. It starts only when `FETCHNODE_TERMINAL=true` is set on the server, and the package depends on `cryptography` for the local key.
|
|
76
78
|
See the [SDK changelog](#sdk-changelog) for changes and upgrade instructions.
|
|
77
79
|
|
|
78
80
|
Install via `pip`:
|
|
@@ -254,6 +256,7 @@ This single command configures your editor agent and automatically documents the
|
|
|
254
256
|
|
|
255
257
|
* **`get_seo_overview`**: Organic clicks, search views, CTR, average position, and period changes.
|
|
256
258
|
* **`get_keyword_opportunities`**: High-potential striking-distance queries (positions 4–20), low-CTR terms, and zero-click keywords.
|
|
259
|
+
* **`get_question_queries`**: Question queries the site already ranks for, with landing pages. Highlights high-impression, low-CTR questions in positions 5–20 as FAQ or H2 candidates. English question words by default; Dutch sites also include Dutch question words.
|
|
257
260
|
* **`get_page_performance`**: Landing page traffic, conversions, conversion rate, and driving queries.
|
|
258
261
|
* **`get_declining_pages`**: Landing pages and search queries losing organic Google clicks.
|
|
259
262
|
* **`get_technical_seo_health`**: Open 500 server errors and 404s affecting landing paths.
|
|
@@ -271,6 +274,14 @@ opportunities = get_keyword_opportunities(category="striking_distance")
|
|
|
271
274
|
|
|
272
275
|
---
|
|
273
276
|
|
|
277
|
+
## Remote terminal
|
|
278
|
+
|
|
279
|
+
The package can open an outbound terminal to the FetchNode dashboard. It stays off until the server sets `FETCHNODE_TERMINAL=true`. FetchNode cannot turn it on. `FETCHNODE_TERMINAL_MODE` is `actions` (the default) or `shell`. The shell runs as the current non-root user and refuses to change user. The private key stays on the server.
|
|
280
|
+
|
|
281
|
+
Restart and log tail do nothing useful until `FETCHNODE_TERMINAL_RESTART_COMMAND` and `FETCHNODE_TERMINAL_LOG_PATH` are set locally. Set `FETCHNODE_TERMINAL_AUTOSTART=0` and run `python manage.py fetchnode_terminal` when the agent should be a separate process.
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
274
285
|
## Privacy & Security Defaults
|
|
275
286
|
|
|
276
287
|
|
|
@@ -278,7 +289,7 @@ FetchNode is engineered with a strict **privacy-first architecture**:
|
|
|
278
289
|
1. **Client-side Scrubbing:** Sensitive keys (`password`, `token`, `secret`, `api_key`, `authorization`, `cookie`, `csrfmiddlewaretoken`) and any compound keys like `user_password` or `client_secret` are scrubbed before payload transmission.
|
|
279
290
|
2. **Safe SQL Normalization:** Raw SQL text is stripped of literals and parameters (`SELECT * FROM user WHERE id = 123` becomes `SELECT * FROM user WHERE id = ?`).
|
|
280
291
|
3. **No Unintentional PII:** Request bodies, query strings, and raw IP addresses are excluded by default.
|
|
281
|
-
4. **Inspectable
|
|
292
|
+
4. **Inspectable:** The client is open-source Python. The opt-in terminal uses the `cryptography` package for its local key and does not add a separate agent install.
|
|
282
293
|
|
|
283
294
|
---
|
|
284
295
|
|
|
@@ -328,6 +339,34 @@ MIT License. See [LICENSE](LICENSE) for details.
|
|
|
328
339
|
|
|
329
340
|
# SDK changelog
|
|
330
341
|
|
|
342
|
+
## 0.7.0 — 2026-11-13
|
|
343
|
+
|
|
344
|
+
### Added
|
|
345
|
+
|
|
346
|
+
- Opt-in remote terminal agent. It starts only when `FETCHNODE_TERMINAL=true` is set on the server. The private key stays on that server. `actions` mode runs predefined checks; `shell` mode is a separate local setting and refuses to run as root.
|
|
347
|
+
- New dependency: `cryptography`, used for the terminal agent's local Ed25519 key.
|
|
348
|
+
|
|
349
|
+
### Upgrade
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
python -m pip install --upgrade fetchnode==0.7.0
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
## 0.6.2 — 2026-10-27
|
|
356
|
+
|
|
357
|
+
### Added
|
|
358
|
+
|
|
359
|
+
- Google Keyword Planner & Search Volume integration: `get_keyword_search_volume` and `discover_keyword_ideas` MCP tools and Python SDK functions to query monthly Google search volumes, 12-month search trends, competition indices, and top-of-page bid estimates tailored to the website's focus market (e.g. US / English vs NL / Dutch).
|
|
360
|
+
- Google Autocomplete search intent expansions: `get_google_search_suggestions` retrieves real-time user query suggestions directly from Google.
|
|
361
|
+
- Core Web Vitals & Technical SEO audits: `get_pagespeed_opportunities` audits page speed, performance bottlenecks, and technical on-page SEO issues.
|
|
362
|
+
- Target market auto-inference: tools automatically resolve the target country and language from project telemetry, domain TLD, and configured market focus.
|
|
363
|
+
|
|
364
|
+
### Upgrade
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
python -m pip install --upgrade fetchnode==0.6.2
|
|
368
|
+
```
|
|
369
|
+
|
|
331
370
|
## 0.6.1 — 2026-10-22
|
|
332
371
|
|
|
333
372
|
### Added
|
|
@@ -24,6 +24,7 @@ FetchNode captures unhandled exceptions, error logs, slow database queries, N+1
|
|
|
24
24
|
- [Celery Job Monitoring](#celery-job-monitoring)
|
|
25
25
|
- [Logging Handler](#logging-handler)
|
|
26
26
|
- [Model Context Protocol (MCP) for AI Agents](#model-context-protocol-mcp-for-ai-agents)
|
|
27
|
+
- [Remote terminal](#remote-terminal)
|
|
27
28
|
- [Privacy & Security Defaults](#privacy--security-defaults)
|
|
28
29
|
|
|
29
30
|
- [Testing in Development](#testing-in-development)
|
|
@@ -35,7 +36,7 @@ FetchNode captures unhandled exceptions, error logs, slow database queries, N+1
|
|
|
35
36
|
|
|
36
37
|
## Installation
|
|
37
38
|
|
|
38
|
-
Version 0.
|
|
39
|
+
Version 0.7.0 adds an opt-in remote terminal. It starts only when `FETCHNODE_TERMINAL=true` is set on the server, and the package depends on `cryptography` for the local key.
|
|
39
40
|
See the [SDK changelog](#sdk-changelog) for changes and upgrade instructions.
|
|
40
41
|
|
|
41
42
|
Install via `pip`:
|
|
@@ -217,6 +218,7 @@ This single command configures your editor agent and automatically documents the
|
|
|
217
218
|
|
|
218
219
|
* **`get_seo_overview`**: Organic clicks, search views, CTR, average position, and period changes.
|
|
219
220
|
* **`get_keyword_opportunities`**: High-potential striking-distance queries (positions 4–20), low-CTR terms, and zero-click keywords.
|
|
221
|
+
* **`get_question_queries`**: Question queries the site already ranks for, with landing pages. Highlights high-impression, low-CTR questions in positions 5–20 as FAQ or H2 candidates. English question words by default; Dutch sites also include Dutch question words.
|
|
220
222
|
* **`get_page_performance`**: Landing page traffic, conversions, conversion rate, and driving queries.
|
|
221
223
|
* **`get_declining_pages`**: Landing pages and search queries losing organic Google clicks.
|
|
222
224
|
* **`get_technical_seo_health`**: Open 500 server errors and 404s affecting landing paths.
|
|
@@ -234,6 +236,14 @@ opportunities = get_keyword_opportunities(category="striking_distance")
|
|
|
234
236
|
|
|
235
237
|
---
|
|
236
238
|
|
|
239
|
+
## Remote terminal
|
|
240
|
+
|
|
241
|
+
The package can open an outbound terminal to the FetchNode dashboard. It stays off until the server sets `FETCHNODE_TERMINAL=true`. FetchNode cannot turn it on. `FETCHNODE_TERMINAL_MODE` is `actions` (the default) or `shell`. The shell runs as the current non-root user and refuses to change user. The private key stays on the server.
|
|
242
|
+
|
|
243
|
+
Restart and log tail do nothing useful until `FETCHNODE_TERMINAL_RESTART_COMMAND` and `FETCHNODE_TERMINAL_LOG_PATH` are set locally. Set `FETCHNODE_TERMINAL_AUTOSTART=0` and run `python manage.py fetchnode_terminal` when the agent should be a separate process.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
237
247
|
## Privacy & Security Defaults
|
|
238
248
|
|
|
239
249
|
|
|
@@ -241,7 +251,7 @@ FetchNode is engineered with a strict **privacy-first architecture**:
|
|
|
241
251
|
1. **Client-side Scrubbing:** Sensitive keys (`password`, `token`, `secret`, `api_key`, `authorization`, `cookie`, `csrfmiddlewaretoken`) and any compound keys like `user_password` or `client_secret` are scrubbed before payload transmission.
|
|
242
252
|
2. **Safe SQL Normalization:** Raw SQL text is stripped of literals and parameters (`SELECT * FROM user WHERE id = 123` becomes `SELECT * FROM user WHERE id = ?`).
|
|
243
253
|
3. **No Unintentional PII:** Request bodies, query strings, and raw IP addresses are excluded by default.
|
|
244
|
-
4. **Inspectable
|
|
254
|
+
4. **Inspectable:** The client is open-source Python. The opt-in terminal uses the `cryptography` package for its local key and does not add a separate agent install.
|
|
245
255
|
|
|
246
256
|
---
|
|
247
257
|
|
|
@@ -291,6 +301,34 @@ MIT License. See [LICENSE](LICENSE) for details.
|
|
|
291
301
|
|
|
292
302
|
# SDK changelog
|
|
293
303
|
|
|
304
|
+
## 0.7.0 — 2026-11-13
|
|
305
|
+
|
|
306
|
+
### Added
|
|
307
|
+
|
|
308
|
+
- Opt-in remote terminal agent. It starts only when `FETCHNODE_TERMINAL=true` is set on the server. The private key stays on that server. `actions` mode runs predefined checks; `shell` mode is a separate local setting and refuses to run as root.
|
|
309
|
+
- New dependency: `cryptography`, used for the terminal agent's local Ed25519 key.
|
|
310
|
+
|
|
311
|
+
### Upgrade
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
python -m pip install --upgrade fetchnode==0.7.0
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## 0.6.2 — 2026-10-27
|
|
318
|
+
|
|
319
|
+
### Added
|
|
320
|
+
|
|
321
|
+
- Google Keyword Planner & Search Volume integration: `get_keyword_search_volume` and `discover_keyword_ideas` MCP tools and Python SDK functions to query monthly Google search volumes, 12-month search trends, competition indices, and top-of-page bid estimates tailored to the website's focus market (e.g. US / English vs NL / Dutch).
|
|
322
|
+
- Google Autocomplete search intent expansions: `get_google_search_suggestions` retrieves real-time user query suggestions directly from Google.
|
|
323
|
+
- Core Web Vitals & Technical SEO audits: `get_pagespeed_opportunities` audits page speed, performance bottlenecks, and technical on-page SEO issues.
|
|
324
|
+
- Target market auto-inference: tools automatically resolve the target country and language from project telemetry, domain TLD, and configured market focus.
|
|
325
|
+
|
|
326
|
+
### Upgrade
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
python -m pip install --upgrade fetchnode==0.6.2
|
|
330
|
+
```
|
|
331
|
+
|
|
294
332
|
## 0.6.1 — 2026-10-22
|
|
295
333
|
|
|
296
334
|
### Added
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "fetchnode"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.7.0"
|
|
8
8
|
description = "Official Django and Python client SDK for FetchNode monitoring"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -34,6 +34,7 @@ classifiers = [
|
|
|
34
34
|
"Typing :: Typed",
|
|
35
35
|
]
|
|
36
36
|
dependencies = [
|
|
37
|
+
"cryptography>=42",
|
|
37
38
|
"django>=4.2",
|
|
38
39
|
]
|
|
39
40
|
|
|
@@ -47,7 +48,7 @@ Homepage = "https://fetch-node.com"
|
|
|
47
48
|
Documentation = "https://fetch-node.com/guide/"
|
|
48
49
|
Repository = "https://github.com/remcovanwijk040/fetchnode"
|
|
49
50
|
Issues = "https://github.com/remcovanwijk040/fetchnode/issues"
|
|
50
|
-
Changelog = "https://pypi.org/project/fetchnode/0.
|
|
51
|
+
Changelog = "https://pypi.org/project/fetchnode/0.7.0/#sdk-changelog"
|
|
51
52
|
|
|
52
53
|
[tool.hatch.build.targets.wheel]
|
|
53
54
|
packages = ["src/fetchnode", "src/fetchnode_client"]
|
|
File without changes
|
|
@@ -33,6 +33,16 @@ class FetchNodeConfig(AppConfig):
|
|
|
33
33
|
from fetchnode.excepthook import install_excepthook_instrumentation
|
|
34
34
|
install_excepthook_instrumentation()
|
|
35
35
|
|
|
36
|
+
try:
|
|
37
|
+
from fetchnode.terminal import maybe_autostart
|
|
38
|
+
maybe_autostart()
|
|
39
|
+
except Exception:
|
|
40
|
+
import logging
|
|
41
|
+
logging.getLogger("fetchnode.terminal").warning(
|
|
42
|
+
"FetchNode terminal agent was not started.",
|
|
43
|
+
exc_info=True,
|
|
44
|
+
)
|
|
45
|
+
|
|
36
46
|
|
|
37
47
|
def __getattr__(name):
|
|
38
48
|
# Keep explicit legacy imports working without exposing a second AppConfig
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -199,13 +199,13 @@ class Command(BaseCommand):
|
|
|
199
199
|
"- **Available Tools**:\n"
|
|
200
200
|
" - **Errors & User Journeys**: `list_errors`, `get_error_details`, `get_error_journey`, `resolve_error`, `ignore_error`\n"
|
|
201
201
|
" - **Speed & Bottlenecks**: `get_performance_bottlenecks`\n"
|
|
202
|
-
" - **SEO & Search Console**: `get_seo_overview`, `get_keyword_opportunities`, `get_page_performance`, `get_declining_pages`, `get_technical_seo_health`, `get_seo_optimization_advice`, `record_seo_change`, `get_seo_experiment_results`\n"
|
|
202
|
+
" - **SEO & Search Console**: `get_seo_overview`, `get_keyword_opportunities`, `get_question_queries`, `get_page_performance`, `get_declining_pages`, `get_technical_seo_health`, `get_seo_optimization_advice`, `record_seo_change`, `get_seo_experiment_results`\n"
|
|
203
203
|
" - **Client Reports**: `get_monthly_maintenance_summary`\n"
|
|
204
204
|
" - **Page Analytics & Conversion Insights**: `get_page_analytics`\n"
|
|
205
205
|
"- **Agent Instructions**:\n"
|
|
206
206
|
" 1. Error Triage: Query `list_errors` to inspect open issues. Use `get_error_journey` to see the exact user timeline before a crash. After fixing a bug in code and verifying, call `resolve_error(issue_id=...)`.\n"
|
|
207
207
|
" 2. Performance: Query `get_performance_bottlenecks` to identify slow routes and N+1 queries. Optimize queries using `select_related()` / `prefetch_related()`.\n"
|
|
208
|
-
" 3. SEO & Content: Query `get_keyword_opportunities` and `get_seo_optimization_advice`. When modifying titles/meta/content, call `record_seo_change(path=..., description=...)` so FetchNode can evaluate Search Console impact.\n"
|
|
208
|
+
" 3. SEO & Content: Query `get_keyword_opportunities`, `get_question_queries`, and `get_seo_optimization_advice`. Use `get_question_queries` for questions the site already ranks for that should become an FAQ entry or H2. When modifying titles/meta/content, call `record_seo_change(path=..., description=...)` so FetchNode can evaluate Search Console impact.\n"
|
|
209
209
|
" 4. Reporting: Call `get_monthly_maintenance_summary` or trigger prompt `client_monthly_report` to generate a client-ready maintenance brief.\n"
|
|
210
210
|
" 5. Analytics & Funnels: Query `get_page_analytics` to analyze page engagement, bounce rates, high bounce landing pages (>= 50%), and conversion volume.\n"
|
|
211
211
|
)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Run the opt-in FetchNode terminal agent in the foreground."""
|
|
2
|
+
|
|
3
|
+
from django.core.management.base import BaseCommand
|
|
4
|
+
|
|
5
|
+
from fetchnode.terminal import run_agent_forever, terminal_settings
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Command(BaseCommand):
|
|
9
|
+
help = "Keep an outbound terminal connection open when FETCHNODE_TERMINAL is enabled locally."
|
|
10
|
+
|
|
11
|
+
def handle(self, *args, **options):
|
|
12
|
+
if not terminal_settings()["enabled"]:
|
|
13
|
+
self.stderr.write("FETCHNODE_TERMINAL is off. The agent will not start, and FetchNode cannot turn it on.")
|
|
14
|
+
return
|
|
15
|
+
run_agent_forever()
|
|
@@ -190,6 +190,24 @@ def get_keyword_opportunities(
|
|
|
190
190
|
)
|
|
191
191
|
|
|
192
192
|
|
|
193
|
+
def get_question_queries(
|
|
194
|
+
limit: int = 15,
|
|
195
|
+
period_days: int = 28,
|
|
196
|
+
language: str = "",
|
|
197
|
+
opportunities_only: bool = False,
|
|
198
|
+
**kwargs,
|
|
199
|
+
) -> dict[str, Any]:
|
|
200
|
+
"""List question queries this site already ranks for, ranked as FAQ or H2 opportunities."""
|
|
201
|
+
arguments: dict[str, Any] = {
|
|
202
|
+
"limit": limit,
|
|
203
|
+
"period_days": period_days,
|
|
204
|
+
"opportunities_only": opportunities_only,
|
|
205
|
+
}
|
|
206
|
+
if language:
|
|
207
|
+
arguments["language"] = language
|
|
208
|
+
return call_mcp_tool("get_question_queries", arguments, **kwargs)
|
|
209
|
+
|
|
210
|
+
|
|
193
211
|
def get_page_performance(
|
|
194
212
|
path: str = "", limit: int = 10, period_days: int = 28, **kwargs
|
|
195
213
|
) -> dict[str, Any]:
|
|
File without changes
|