feat: management API and an MCP tool per SEO admin operation

- /_seo/api/v1 routes for the effective SEO of a URL with sources and
  owner, URL rules, redirects (loops refused with redirect_loop), the
  404 log actions, robots.txt and its tester, settings and history
- the CMS-data issue report: missing and duplicate titles and
  descriptions, rules over records, redirect chains, canonicals to
  noindex or redirected addresses, noindex addresses robots.txt blocks
- 24 MCP tools on those routes (backend guard, golem15.seo.manage)
- AdminOperations maps every admin operation to its tool;
  TestEveryAdminOperationHasTool and TestMCPReadToolsAreGET guard drift
- robots.txt writes go through classes.SaveRobots from the admin too
This commit is contained in:
2026-10-27 12:17:36 +01:00
parent cadf6ad805
commit aa0c3bcacf
22 changed files with 2723 additions and 46 deletions

View File

@@ -169,6 +169,7 @@ history:
what_redirect: Redirect “:url”
what_robots: robots.txt
what_settings: SEO settings
what_notfound: 404 log entry “:url”
change_cell:
one: ':field: :before → :after'
other: ':count fields changed'
@@ -294,3 +295,6 @@ api:
field_unknown: This is not an SEO field.
keyphrase_record_only: A focus keyphrase belongs to a record; a URL rule has none.
canonical_invalid: The canonical URL must be a path starting with / or an absolute http(s) URL.
bot_unknown: This is not an AI bot of the robots.txt screen.
value_invalid: This value is not valid here.
type_unknown: No content type with this key is registered.

View File

@@ -173,6 +173,7 @@ history:
what_redirect: Przekierowanie „:url”
what_robots: robots.txt
what_settings: Ustawienia SEO
what_notfound: Wpis dziennika 404 „:url”
change_cell:
one: ':field: :before → :after'
few: Zmieniono :count pola
@@ -304,3 +305,6 @@ api:
field_unknown: To nie jest pole SEO.
keyphrase_record_only: Fraza kluczowa należy do rekordu; reguła adresu jej nie ma.
canonical_invalid: Adres kanoniczny musi być ścieżką zaczynającą się od / lub pełnym adresem http(s).
bot_unknown: To nie jest bot AI z ekranu robots.txt.
value_invalid: Ta wartość jest tu nieprawidłowa.
type_unknown: Nie zarejestrowano typu treści o tym kluczu.