TRPC is a joy to build against — the client-server contract feels compile-time-enforced. That feeling is a security assumption in disguise.
The contract is enforced on the client, not the server. Anything the client can call, an attacker can call, with any payload the network will accept. We routinely find TRPC endpoints where the runtime validation on the server relies on the same schema type used to render the UI, and where the boundary between “internal” and “external” endpoints exists only in the file layout.