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.
Files changed (50) hide show
  1. {fetchnode-0.6.2 → fetchnode-0.7.0}/CHANGELOG.md +13 -0
  2. {fetchnode-0.6.2 → fetchnode-0.7.0}/PKG-INFO +43 -4
  3. {fetchnode-0.6.2 → fetchnode-0.7.0}/README.md +40 -2
  4. {fetchnode-0.6.2 → fetchnode-0.7.0}/pyproject.toml +3 -2
  5. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/__init__.py +0 -0
  6. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/apps.py +10 -0
  7. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/capture.py +0 -0
  8. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/conf.py +0 -0
  9. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/demo.py +0 -0
  10. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/handlers.py +0 -0
  11. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/management/commands/fetchnode_mcp.py +2 -2
  12. fetchnode-0.7.0/src/fetchnode/management/commands/fetchnode_terminal.py +15 -0
  13. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/mcp.py +18 -0
  14. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/scrub.py +0 -0
  15. fetchnode-0.7.0/src/fetchnode/terminal.py +821 -0
  16. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/utils.py +0 -0
  17. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/version.py +1 -1
  18. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/management/commands/fetchnode_mcp.py +2 -2
  19. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/mcp.py +18 -0
  20. fetchnode-0.6.2/.gitignore +0 -65
  21. {fetchnode-0.6.2 → fetchnode-0.7.0}/LICENSE +0 -0
  22. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/api.py +0 -0
  23. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/celery.py +0 -0
  24. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/excepthook.py +0 -0
  25. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/management/__init__.py +0 -0
  26. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/management/commands/__init__.py +0 -0
  27. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/middleware.py +0 -0
  28. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/py.typed +0 -0
  29. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/query.py +0 -0
  30. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/scope.py +0 -0
  31. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode/sender.py +0 -0
  32. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/__init__.py +0 -0
  33. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/api.py +0 -0
  34. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/apps.py +0 -0
  35. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/capture.py +0 -0
  36. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/celery.py +0 -0
  37. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/conf.py +0 -0
  38. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/demo.py +0 -0
  39. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/excepthook.py +0 -0
  40. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/handlers.py +0 -0
  41. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/management/__init__.py +0 -0
  42. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/management/commands/__init__.py +0 -0
  43. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/middleware.py +0 -0
  44. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/py.typed +0 -0
  45. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/query.py +0 -0
  46. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/scope.py +0 -0
  47. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/scrub.py +0 -0
  48. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/sender.py +0 -0
  49. {fetchnode-0.6.2 → fetchnode-0.7.0}/src/fetchnode_client/utils.py +0 -0
  50. {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.6.2
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.6.1/#sdk-changelog
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.6.2 adds Google Keyword Planner monthly search volume, search intent suggestions, PageSpeed audits, and target market auto-inference to the Model Context Protocol (MCP) server.
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 & Lightweight:** The entire client is open-source Python with zero compiled binaries and zero unnecessary dependencies.
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.6.2 adds Google Keyword Planner monthly search volume, search intent suggestions, PageSpeed audits, and target market auto-inference to the Model Context Protocol (MCP) server.
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 & Lightweight:** The entire client is open-source Python with zero compiled binaries and zero unnecessary dependencies.
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.6.2"
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.6.1/#sdk-changelog"
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"]
@@ -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
@@ -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]: