ToolJet/ToolJet · error · GrpcOperationError

Service ${serviceName} has no methods

Error message

Service ${serviceName} has no methods

What it means

Thrown in buildReflectionClient when reflectionClient.listMethods(serviceName, callOptions) returns an empty or null array. The service was found in the list, but the reflection server reported it has zero RPC methods. A well-formed gRPC service must have at least one rpc, so this signals a malformed, empty, or generated stub service definition on the server.

Source

Thrown at plugins/packages/grpcv2/lib/operations.ts:68

  try {
    const reflectionClient = await createReflectionClient(sourceOptions);
    const callOptions = buildCallOptionsForStreaming(sourceOptions);

    // list all available services to verify the service exists
    const serviceNames: string[] = await reflectionClient.listServices('*', callOptions);

    if (!serviceNames || serviceNames.length === 0) {
      throw new GrpcOperationError('No services found via reflection');
    }

    if (!serviceNames.includes(serviceName)) {
      throw new GrpcOperationError(`Service ${serviceName} not found. Available services: ${serviceNames.join(', ')}`);
    }

    const methods: ListMethodsType[] = await reflectionClient.listMethods(serviceName, callOptions);

    if (!methods || methods.length === 0) {
      throw new GrpcOperationError(`Service ${serviceName} has no methods`);
    }

    const descriptor = await reflectionClient.getDescriptorBySymbol(serviceName, callOptions);

    if (!descriptor) {
      throw new GrpcOperationError(`Service descriptor not found for ${serviceName}`);
    }

    const packageObject = descriptor.getPackageObject({
      keepCase: true,
      enums: String,
      longs: String,
      defaults: true,
      oneofs: true
    });

    const service = findServiceInPackage(packageObject, serviceName);
    if (!service) {

View on GitHub (pinned to 20602a8e10)

Solutions

  1. Confirm the service proto actually defines rpc methods; an empty service is not callable.
  2. Restart the server / reflection cache in case the descriptor is stale.
  3. Pick a different service that has methods, or re-run discoverMethods after the server is fully loaded.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  await plugin.run(queryOptions, sourceOptions);
} catch (e) {
  if (e instanceof GrpcOperationError && /has no methods/.test(e.message)) {
    // inform user the service is empty/placeholder; pick another
  } else throw e;
}

Prevention

When it happens

Trigger: A service block declared in proto with no rpc entries; a placeholder/empty service registered for testing; reflection returning partial descriptor data for a service still being deployed; tooling-generated service with methods stripped.

Common situations: Connecting mid-deploy before methods are registered; proto file declares service Foo {} with no RPCs; reflection caching a stale descriptor after the server was updated to add methods (try restarting reflection).

Related errors


AI-assisted analysis of ToolJet/ToolJet@20602a8e10 (2026-08-13). Data as JSON: /api/errors/cb37fad807ba1e14. Report an issue: GitHub.