<#10333 feat: List plugins available on Meltano Hu...
# meltano-repo-activity
g
#10333 feat: List plugins available on Meltano Hub with `meltano hub list` Pull request opened by ReubenFrankel Description Finding a plugin to add means leaving the terminal for hub.meltano.com, and there has been no way to ask Meltano what the Hub offers since
meltano discover
was removed in
1502ad647
. This adds
meltano hub list
.
Copy code
$ meltano hub list meltanolabs
2026-09-18T11:52:05.347889Z [info     ] meltano      Environment 'dev' is active   
2026-09-18T11:52:05.379754Z [info     ] meltano      45 plugins match 'meltanolabs' (6 variants hidden, show with '--all')
                                                     
 TYPE        NAME                        VARIANT     
 ─────────────────────────────────────────────────── 
 extractor   tap-airbyte-wrapper         meltanolabs 
 extractor   tap-athena                  meltanolabs 
 extractor   tap-beautifulsoup           meltanolabs 
 extractor   tap-cloudwatch              meltanolabs 
 extractor   tap-csv                     meltanolabs 
 extractor   tap-dbt                     meltanolabs 
 extractor   tap-duckdb                  meltanolabs 
 extractor   tap-facebook                meltanolabs 
 extractor   tap-flipkart                meltanolabs 
 extractor   tap-ga4                     meltanolabs 
 extractor   tap-github                  meltanolabs 
 extractor   tap-gitlab                  meltanolabs 
 extractor   tap-gmail                   meltanolabs 
 extractor   tap-gohighlevel             meltanolabs 
 extractor   tap-google-analytics        meltanolabs 
 extractor   tap-google-search-console   meltanolabs 
 extractor   tap-jaffle-shop             meltanolabs 
 extractor   tap-jira                    meltanolabs 
 extractor   tap-klaviyo                 meltanolabs 
 extractor   tap-kustomer                meltanolabs 
 extractor   tap-linkedin-ads            meltanolabs 
 extractor   tap-messagebird             meltanolabs 
 extractor   tap-peloton                 meltanolabs 
 extractor   tap-postgres                meltanolabs 
 extractor   tap-pulumi-cloud            meltanolabs 
 extractor   tap-salesforce              meltanolabs 
 extractor   tap-service-titan           meltanolabs 
 extractor   tap-sftp                    meltanolabs 
 extractor   tap-slack                   meltanolabs 
 extractor   tap-snowflake               meltanolabs 
 extractor   tap-socrata                 meltanolabs 
 extractor   tap-stackexchange           meltanolabs 
 loader      target-athena               meltanolabs 
 loader      target-chromadb             meltanolabs 
 loader      target-csv                  meltanolabs 
 loader      target-duckdb               meltanolabs 
 loader      target-hubspot              meltanolabs 
 loader      target-mssql                meltanolabs 
 loader      target-pinecone             meltanolabs 
 loader      target-postgres             meltanolabs 
 loader      target-snowflake            meltanolabs 
 loader      target-sqlite               meltanolabs 
 loader      target-yaml                 meltanolabs 
 utility     evidence                    meltanolabs 
 mapper      map-gpt-embeddings          meltanolabs
• Add
meltano hub list
, beside
meltano hub ping
, in text or JSON. • List each plugin once, on the variant that Meltano installs when none is asked for.
--all
lists every variant, one to a row, naming the plugin once and marking the default where there is a choice. • Narrow the list with an optional pattern, matched against a plugin name or a variant, ignoring case. A row is kept only where the pattern is visible in it. • Filter by type with
--plugin-type
, the same argument type
meltano add
takes. • Log the count of what matched, naming the plugin type where one was asked for, and how many matching variants were hidden. A search that matches nothing is a warning and prints no table. • Reuse a fetched index for an hour, and fetch a fresh one with
--refresh
. • Document the command in the CLI reference. • Add 29 tests. The count is logged rather than printed so that it reaches a reader whichever format the rows are in, and so
--format json
writes nothing to stdout but the rows. Meltano Hub indexes one plugin type at a time and offers no search, so listing every type costs a request for each of them, and a pattern is applied after the plugins are fetched. That is what the cache is for: a second listing costs no request at all. Fetching is what every other reader of the Hub keeps doing.
get_plugins_of_type
defaults to
refresh=True
, so
meltano add
and
meltano hub ping
are unchanged, and no plugin published minutes ago is hidden from the commands that install one. Only
meltano hub list
opts out, and any fetch fills the cache, so a listing that follows an install is served from it.
meltano hub list
is gated like every other Hub reader. The 401 is raised in
MeltanoHubService._get
, so a user without a Meltano Cloud account gets the same error, naming
meltano cloud auth login
, as they do from
hub ping
,
add
and
lock
. A cached index is still served without a request. The test suite mocks the Hub, so
tests/conftest.py
points the cache at a temporary directory for the session. Without it a test run would leave a mock response where a real
meltano hub list
would read it. Checklist • I have read the contribution guide Was generative AI tooling used to co-author this PR? • Yes (please specify the tool below) Generated-by: Claude Code following the agentic coding guidelines Related Issues • Follows #10330 --- 🤖 Generated with Claude Code meltano/meltano