Library / SDK
googleapis/google-cloud-node avatar
googleapis/google-cloud-node

google-cloud-node: idiomatic Node.js clients for individual Google Cloud services

Google Cloud Client Library for Node.js

3,201 stars721 forksTypeScriptApache-2.0

At a glance

What is it?
The repository is a monorepo of per-service npm packages rather than one SDK. This review covers how the packages are organised, how the repository is built, and where the model breaks down.
Who is it for?
Adopt google-cloud-node when you need a typed Node.js client for one specific Google Cloud API and want to depend on that API alone. Do not adopt it expecting a single unified SDK, and do not use it as a general-purpose HTTP client for non-Google services.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One repository, hundreds of separately versioned npm packages

The first thing to understand is that google-cloud-node is not an SDK you install once. The README describes it as "Node.js idiomatic client libraries for Google Cloud Platform services", and the table that follows lists each service with its own GitHub directory under packages/, its own release level, and its own npm package name. Access Approval becomes @google-cloud/access-approval. Access Context Manager becomes @google-cloud/access-context-manager. Address Validation is published under a different scope entirely, @googlemaps/addressvalidation. The naming is not perfectly uniform, which matters when you are guessing a package name from a service name.

This solves a specific problem: an application that talks to one Google Cloud API should not pull in generated code for two hundred others. Each package carries its own semver, its own changelog and its own release cadence, and the recent releases confirm that cadence is per-package rather than per-repository. On 2026-09-23 the repository published vectorsearch v0.13.0, tasks v7.2.0 and sql v0.29.0. Three services, three unrelated version numbers, one day.

The audience is therefore narrow and specific: Node.js engineers who are already on Google Cloud and need a client for a named service. If you are evaluating cloud providers from scratch, this repository tells you almost nothing about whether to pick Google Cloud. It tells you what the client surface looks like once you have.

How a service package is generated and why the version numbers diverge

The repository layout shows a split between generated and hand-written code. There are top-level directories named packages/, handwritten/, core/ and docs/. The root package.json is private and carries no runtime dependency on any cloud service; instead it declares tooling: chalk, figures, gaxios and parse-link-header, plus dev dependencies including turbo, typescript, eslint and prettier. Its scripts are mostly placeholders that echo a message, which is a deliberate signal that the root is a workspace shell and the real work happens per package.

The scripts that are not placeholders are the interesting ones. compile runs turbo with a filter of "...[HEAD^1]", meaning it builds only the packages affected by the last commit rather than the whole tree. lint runs a local bin/linter.mjs. generate runs bin/generate-readme.mjs, and test-generate runs the same script with SMOKE_TEST=true. That last detail is the mechanism behind the README you are reading: the service table is not maintained by hand, it is produced by a script from repository metadata. When you see a version badge next to a service, it reflects what the generator found, not an editor's memory.

That architecture explains the version divergence. A service whose upstream API surface is still moving gets a 0.x line, as vectorsearch does at v0.13.0. A service with a settled surface reaches v7.2.0 like tasks. The release level column in the README is the project's own signal about which of those you are looking at, and it is worth reading before you pin a version in a lockfile.

Building the monorepo and why consumers are unaffected by its toolchain

The repository requires pnpm for its own development. The root package.json declares packageManager [email protected] and a preinstall script that runs only-allow pnpm, so contributors cloning the monorepo cannot use npm or yarn to build it. Consumers of a published package are unaffected by that constraint, because the published package is installed from the npm registry the ordinary way.

The root package.json also declares an engines field of node >=22, so confirm your runtime before working with anything from this repository. A Node.js 20 environment will not satisfy the declared requirement.

The README does not include an install command or a code sample inline. It points each service at its npm page through a badge, and it directs readers to the per-service directory under packages/ for the details. What the repository does give you is the naming convention, so you can locate the right directory: the GitHub path is packages/ plus a prefixed directory name, and the npm name is the scope plus a hyphenated service name. Those two do not always match character for character, so use the table rather than deriving the package name by hand.

The commands the repository documents for its own maintenance are these, taken from the root package.json scripts:

bash
pnpm run compile
pnpm run lint
pnpm run generate

compile builds the packages affected by the last commit, lint runs bin/linter.mjs, and generate runs bin/generate-readme.mjs to regenerate the service table. The README does not document rollback, and it does not document the individual method signatures of any client; the per-service README is the place to check those.

The monorepo model costs you a dependency graph you have to manage

The trade-off is real. A single SDK gives you one version to pin, one changelog to read, one upgrade to schedule. This repository gives you one version per service. An application that touches five Google Cloud APIs has five independent upgrade decisions, five sets of release notes, and five chances for a transitive dependency to move underneath you. The pnpm lockfile at the root exists because the maintainers face the same problem internally.

There is a second limitation in how the repository presents itself. The README is a long table of service names, links and version badges. It documents what exists. It does not document authentication, retry behaviour, pagination, streaming, or how to configure a client for a non-default endpoint. Those details live in the per-service directories and on the linked cloud.google.com pages, which means the quality of the documentation you get depends on which service you picked. A stable service with years of usage will have more written about it than a 0.x service published recently.

A third case deserves naming: this is the wrong tool if you need a small, dependency-light HTTP client for a Google API and nothing else. The generated packages bring in their own transport and protobuf-related dependencies, and if you are calling one endpoint occasionally, a plain fetch against the REST API may be a smaller commitment. The trade is typing and generated method names against bundle size and upgrade surface.

Compared with the googleapis meta-package

The obvious alternative is the googleapis package, which exposes many Google APIs through a single dependency. The difference is architectural rather than cosmetic. googleapis is one package with one version; google-cloud-node is many packages with many versions. Choosing googleapis means every API you might ever call arrives at once, and upgrading it moves all of them together. Choosing a @google-cloud package means you take only what you named, and you upgrade it when you decide to.

That distinction shows up in the repository structure here. The packages/ directory is the whole point: it exists so a service can be released without dragging unrelated services along, which is why vectorsearch can sit at v0.13.0 while tasks sits at v7.2.0 on the same day. A single-package client cannot express that, because it has one version number to spend on all of them.

There is also a naming dimension. The README shows Address Validation published as @googlemaps/addressvalidation rather than under the @google-cloud scope, so the family is not strictly uniform even within this repository. If you are writing tooling that assumes every client is @google-cloud/*, that assumption will break on at least one entry in the table.

Maintenance, licensing and what an upgrade actually costs

The repository is not archived, and the last push was on 2026-09-23. Per-package releases landed the same day, so the release machinery is running. That is a statement about the repository's activity, not a guarantee about any individual service package; a service with a slow upstream API will have a slow client regardless.

The licence is Apache-2.0, declared both in the repository metadata and in the root package.json. Apache-2.0 permits commercial use and modification and includes an express patent grant. It also requires that you preserve the licence and notice files when redistributing. That is the general shape of the licence, not legal advice; if you are redistributing modified client code, have your own counsel read the text in the LICENSE file.

The practical upgrade cost is governed by the version line of the package you depend on. A package at v7.x has had seven major versions of API surface decisions behind it and is unlikely to break casually. A package at v0.13.0 is pre-1.0 by definition, and the semver convention gives no stability promise below 1.0. Pin exact versions for those, and read the changelog for the specific package rather than the repository as a whole. The root repository has no changelog that covers all services at once; the per-package release notes are the unit of information.

Editorial conclusion

Adopt google-cloud-node when you need a typed Node.js client for one specific Google Cloud API and want to depend on that API alone. Do not adopt it expecting a single unified SDK, and do not use it as a general-purpose HTTP client for non-Google services. Before committing, verify three things: that a package exists for the service you need, that your runtime satisfies the engines field of node >=22, and which release level the package carries, since the README's table marks some services Stable and others differently.

Frequently asked questions

Is google-cloud-node the same as the googleapis npm package?

No. google-cloud-node is a monorepo that publishes many separately versioned packages under the @google-cloud scope, one per Google Cloud service, while googleapis is a single package covering many APIs. The README describes this repository as client libraries for individual Google Cloud services.

What Node.js version does google-cloud-node require?

The root package.json declares an engines field of node >=22. That is the requirement stated for the repository, and it applies to the development tooling in the monorepo.

Which package manager does google-cloud-node use?

pnpm. The root package.json declares packageManager [email protected] and a preinstall script that runs only-allow pnpm, so building the monorepo with npm or yarn is blocked by design.

How do I find the npm package name for a Google Cloud service?

Use the table in the README, which lists each service with its GitHub directory and its npm badge. The names are not always derivable: Address Validation is published as @googlemaps/addressvalidation rather than under the @google-cloud scope.

Official sources

  1. googleapis/google-cloud-node on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/googleapis-google-cloud-node.svg)](https://hysenlabs.com/projects/googleapis-google-cloud-node)