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
- Confirm the service proto actually defines rpc methods; an empty service is not callable.
- Restart the server / reflection cache in case the descriptor is stale.
- 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
- Avoid calling empty/placeholder services; check discoverMethods() output first.
- Treat a zero-method service as a server-side defect to report.
- Refresh discovery after server deploys that add methods.
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
- Method ${queryOptions.method} not found in service ${queryOp
- No services found via reflection
- Service ${serviceName} not found. Available services: ${serv
- Service descriptor not found for ${serviceName}
- Service ${serviceName} not found in proto descriptor
AI-assisted analysis of ToolJet/ToolJet@20602a8e10 (2026-08-13).
Data as JSON: /api/errors/cb37fad807ba1e14.
Report an issue: GitHub.