diff --git a/src/Drush/Generators/SchemaExtensionGenerator.php b/src/Drush/Generators/SchemaExtensionGenerator.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4f83cb2530472640df5d94a766c7ad992e0ee04
--- /dev/null
+++ b/src/Drush/Generators/SchemaExtensionGenerator.php
@@ -0,0 +1,56 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\graphql\Drush\Generators;
+
+use Drupal\graphql\Plugin\SchemaPluginManager;
+use DrupalCodeGenerator\Asset\AssetCollection;
+use DrupalCodeGenerator\Attribute\Generator;
+use DrupalCodeGenerator\Command\BaseGenerator;
+use DrupalCodeGenerator\GeneratorType;
+use Drush\Commands\AutowireTrait;
+use Symfony\Component\DependencyInjection\Attribute\Autowire;
+
+/**
+ * Generator for GraphQL schema extension plugins.
+ */
+#[Generator(
+  name: 'plugin:graphql-schema-extension',
+  description: 'Generates a GraphQL schema extension plugin.',
+  aliases: ['graphql-schema-extension'],
+  templatePath: __DIR__,
+  type: GeneratorType::MODULE_COMPONENT,
+)]
+final class SchemaExtensionGenerator extends BaseGenerator {
+
+  use AutowireTrait;
+
+  public function __construct(
+    #[Autowire(service: 'plugin.manager.graphql.schema')]
+    protected SchemaPluginManager $schemaPluginManager,
+  ) {
+    parent::__construct();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function generate(array &$vars, AssetCollection $assets): void {
+    $ir = $this->createInterviewer($vars);
+
+    $vars['machine_name'] = $ir->askMachineName();
+
+    $vars['plugin_label'] = $ir->askPluginLabel();
+    $vars['plugin_id'] = $ir->askPluginId();
+    $vars['plugin_description'] = $ir->ask('Description');
+    $vars['class'] = $ir->askPluginClass(suffix: 'Extension');
+    $vars['services'] = $ir->askServices(FALSE);
+
+    $schemas = array_map(fn ($definition) => $definition['name'] ?? $definition['id'], $this->schemaPluginManager->getDefinitions());
+    $vars['schema'] = $ir->choice('Schema', $schemas);
+
+    $assets->addFile('src/Plugin/GraphQL/SchemaExtension/{class}.php', 'schema-extension.twig');
+  }
+
+}
diff --git a/src/Drush/Generators/schema-extension.twig b/src/Drush/Generators/schema-extension.twig
new file mode 100644
index 0000000000000000000000000000000000000000..07601dd0e4fa12df3e2883cceb6fcd9b1ef7c80b
--- /dev/null
+++ b/src/Drush/Generators/schema-extension.twig
@@ -0,0 +1,64 @@
+{% import '@lib/di.twig' as di %}
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\{{ machine_name }}\Plugin\GraphQL\SchemaExtension;
+
+{% apply sort_namespaces %}
+use Drupal\graphql\GraphQL\ResolverBuilder;
+use Drupal\graphql\GraphQL\ResolverRegistryInterface;
+use Drupal\graphql\Plugin\GraphQL\SchemaExtension\SdlSchemaExtensionPluginBase;
+  {% if services %}
+{{ di.use(services) }}
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+  {% endif %}
+{% endapply %}
+
+/**
+ * The '{{ plugin_id }}' schema extension.
+ *
+ * @SchemaExtension(
+ *   id = "{{ plugin_id }}",
+ *   name = @Translation("{{ plugin_label }}"),
+{% if plugin_description %} *   description = @Translation("{{ plugin_description }}"),
+{% endif %}
+ *   schema = "{{ schema }}",
+ * )
+ */
+final class {{ class }} extends SdlSchemaExtensionPluginBase {
+
+{% if services %}
+  public function __construct(
+    array $configuration,
+    $pluginId,
+    $pluginDefinition,
+{{ di.signature(services) }}
+  ) {
+    parent::__construct($configuration, $pluginId, $pluginDefinition);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): self {
+    return new self(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+{{ di.container(services) }}
+    );
+  }
+
+{% endif %}
+  /**
+   * {@inheritdoc}
+   */
+  public function registerResolvers(ResolverRegistryInterface $registry): void {
+    $builder = new ResolverBuilder();
+
+    // Register your resolvers here.
+  }
+
+}