diff --git a/ctx.info.yml b/ctx.info.yml
index 6630a64..a10641d 100644
--- a/ctx.info.yml
+++ b/ctx.info.yml
@@ -2,7 +2,7 @@ name: CTX
 type: module
 description: Provides Drush commands that expose site context for AI agents.
 package: Development
-core_version_requirement: ^11.3
+core_version_requirement: ^11.3 || ^12
 dependencies:
   - drupal:file
   - mcp_core:mcp_core
diff --git a/src/Plugin/McpTool/User/LoginLinkTool.php b/src/Plugin/McpTool/User/LoginLinkTool.php
index 7069245..2ad8089 100644
--- a/src/Plugin/McpTool/User/LoginLinkTool.php
+++ b/src/Plugin/McpTool/User/LoginLinkTool.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\ctx\Plugin\McpTool\User;
 
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\user\OneTimeAuthentication;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\ctx\Plugin\McpServer\CtxServer;
@@ -81,7 +83,7 @@ final readonly class LoginLinkTool extends McpToolBase implements ContainerInjec
       throw new ToolCallException(\sprintf("User '%s' (uid: %s) is blocked.", $user->getAccountName(), (string) $user->id()));
     }
 
-    return \user_pass_reset_url($user);
+    return DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(OneTimeAuthentication::class)->generateOneTimeLoginUrl($user)->toString(), fn() => \user_pass_reset_url($user));
   }
 
   /**
diff --git a/tests/modules/ctx_plugin_registry_test/ctx_plugin_registry_test.info.yml b/tests/modules/ctx_plugin_registry_test/ctx_plugin_registry_test.info.yml
index 757a94b..78d1e0d 100644
--- a/tests/modules/ctx_plugin_registry_test/ctx_plugin_registry_test.info.yml
+++ b/tests/modules/ctx_plugin_registry_test/ctx_plugin_registry_test.info.yml
@@ -2,6 +2,6 @@ name: CTX plugin registry test
 type: module
 description: Fixture that exercises CTX plugin registry discovery and alter.
 package: Testing
-core_version_requirement: ^11.3
+core_version_requirement: ^11.3 || ^12
 dependencies:
   - drupal:system
diff --git a/tests/modules/ctx_requirements_test/ctx_requirements_test.info.yml b/tests/modules/ctx_requirements_test/ctx_requirements_test.info.yml
index 913cdcf..0b999b3 100644
--- a/tests/modules/ctx_requirements_test/ctx_requirements_test.info.yml
+++ b/tests/modules/ctx_requirements_test/ctx_requirements_test.info.yml
@@ -2,6 +2,6 @@ name: CTX requirements test
 type: module
 description: Fixture providing deterministic runtime requirements for tests.
 package: Testing
-core_version_requirement: ^11.3
+core_version_requirement: ^11.3 || ^12
 dependencies:
   - drupal:system
diff --git a/tests/modules/ctx_test/ctx_test.info.yml b/tests/modules/ctx_test/ctx_test.info.yml
index 409f545..d94ad7c 100644
--- a/tests/modules/ctx_test/ctx_test.info.yml
+++ b/tests/modules/ctx_test/ctx_test.info.yml
@@ -2,6 +2,6 @@ name: CTX test
 type: module
 description: Support module for testing the CTX module.
 package: Testing
-core_version_requirement: ^11.3
+core_version_requirement: ^11.3 || ^12
 dependencies:
   - drupal:system
diff --git a/tests/modules/ctx_test_updates/ctx_test_updates.info.yml b/tests/modules/ctx_test_updates/ctx_test_updates.info.yml
index a8d449d..e82bbdc 100644
--- a/tests/modules/ctx_test_updates/ctx_test_updates.info.yml
+++ b/tests/modules/ctx_test_updates/ctx_test_updates.info.yml
@@ -2,6 +2,6 @@ name: CTX test updates
 type: module
 description: Support module providing hook_update_N and hook_post_update_NAME implementations for UpdateApplyTool tests.
 package: Testing
-core_version_requirement: ^11.3
+core_version_requirement: ^11.3 || ^12
 dependencies:
   - drupal:system
