kora-grpc-clientlisted
Install: claude install-skill kora-projects/kora-skills
# Kora gRPC Client
> **Kora sub-skill — obey the [kora-v1 meta rules](../../SKILL.md) on every task:** **R0** ensure `.kora-agent/` docs+examples are cloned · **R1** read this sub-skill before writing code · **R2** Kora APIs only — no Spring/Micronaut/Quarkus, no invented annotations or config keys · **R3** journal any incorrect Kora usage. Add comments/Javadoc only if asked.
Generate gRPC client stubs from a `.proto` contract and inject them as components through `GrpcClientModule`. Kora wires the configured channel and the generated stubs into the application graph; your code just builds protobuf requests and calls stub methods.
Read this first when:
- enabling `GrpcClientModule` and injecting a generated `*BlockingStub`/`*FutureStub`/`*Stub`,
- configuring a client under `grpcClient.<ServiceName>.*`,
- adding a `ClientInterceptor` for metadata headers, auth, or logging,
- making unary or streaming calls.
## Key facts (do not get these wrong)
- **Stubs are injected directly by type — no `@Tag` on the constructor parameter.** Kora produces one stub per generated `*Grpc` class. Injecting `UserServiceGrpc.UserServiceBlockingStub` is enough.
- **`@Tag(ServiceGrpc.class)` belongs on a `ClientInterceptor`**, to scope that interceptor to one service's client. It is not used for stub injection.
- Annotations come from `ru.tinkoff.kora.common.*` (`@Component`, `@Tag`, `@KoraApp`), not from any `annotation.processor.*` package.
- Plaintext vs TLS is chosen by the **URL scheme**