Company plugins quickstart

Install and try an approved plugin from your company marketplace, then publish your own and request its publication review.

Your company marketplace holds Claude Code and Codex plugins that company members published and a workspace admin approved.
This page first has you install and run an approved plugin (as a user), then publish your own plugin and request its publication review (as an author).

You need axhub CLI v0.50.0 or newer. The commands and output on this page are for v0.50.0. Check with axhub --version, and if it's older, upgrade with axhub update apply --execute --yes.

What you need

  • A signed-in axhub CLI — sign in with axhub auth login. To install the CLI, see CLI › Install.
  • Claude Code or Codex — where the plugin gets installed. The claude or codex command must run in your terminal.
  • Your company UUID — find it right below.

Find your company UUID

Plugin commands take the company (tenant) as --tenant. Listing and installing also accept the company address (slug) while you're signed in, but publishing, requesting a publication review, and anything run with a scoped PAT accept only the company UUID. To keep it simple, use the UUID from the start, and carry the --tenant you used for listing through installing and publishing.

axhub auth status --json

In the tenants list of the output, the tenant_id of the entry whose tenant_slug is your company address is the company UUID.

"tenants":[{"tenant_id":"3f6c2a1e-8d4b-4c7a-9e21-5b0f7d9a1c33","tenant_slug":"acme","role":"member",…}]

If adding it every time is tedious, set it once with export AXHUB_TENANT=<company UUID>. You can then drop --tenant <company UUID> from the commands below.

As a user: install an approved plugin

1

See which plugins you can install

axhub plugin list --tenant <company UUID>

Each line is one plugin: install name, version being served, whether it's installable, and app address.

weather-tools	1.2.3	installable	weather-tools

Only installable plugins can be installed. For your first one, pick a plugin from your company that does something clear and whose author you know. A plugin can run hooks, commands, and MCP servers on your computer, so passing the publication review alone doesn't make it safe.

2

Preview the install

axhub plugin install --tenant <company UUID> --app weather-tools --version 1.2.3 --host claude

Use --host codex to install into Codex. Without --execute, it only shows what it would do, without any network request.

Plugin install preview
  App: weather-tools
  Version: 1.2.3
  Host: claude (user scope)
  No network request, extraction, or host command was performed.
  Next: axhub --tenant <company UUID> plugin install --app weather-tools --version 1.2.3 --host claude --execute --yes
3

Install

Run the preview's Next command as is.

axhub plugin install --tenant <company UUID> --app weather-tools --version 1.2.3 --host claude --execute --yes

The CLI downloads that version's ZIP, checks its SHA-256, and installs it with the Claude Code or Codex plugin commands. Files that were executable stay executable.

Installed weather-tools 1.2.3 for claude through marketplace axhub-app-<app ID>. Restart the host to load it.
4

Run it in a new session

Close any open Claude Code or Codex and start a new session for the plugin to load. First check from the terminal that it's installed.

claude plugin list

For Codex it's codex plugin list. You're set when weather-tools@axhub-app-<app ID> shows up. In the new session, call the plugin's features with /weather-tools:<feature name> in Claude Code or $weather-tools:<feature name> in Codex. A plugin with hooks runs them on its own at set moments, such as session start.

Updating, reinstalling, checking execute permissions, and connecting the whole company marketplace to Claude Code or Codex are in Company plugin marketplace.

As an author: publish your plugin and request its publication review

A published plugin reaches your company only after it passes its publication review. The flow is upload → automated review → workspace admin approval → served; uploading alone makes it visible to no one.

1

Prepare the plugin folder

Prepare a plugin folder with .claude-plugin/plugin.json at its root. name is the install name and version (SemVer) is the version you upload. An uploaded version can never change, so raise the version number every time you fix something. A skill folder with only SKILL.md at its root and no .claude-plugin/plugin.json is uploaded too, together with its supporting files.

These are the rules the CLI packs by:

  • .git, .venv, __pycache__, .DS_Store, and __MACOSX are always left out, and node_modules is packed only with --keep-dir node_modules.
  • .gitignore isn't applied. A built dist/ ships as is, so name the paths to leave out with --exclude <glob>.
  • Executable files stay executable. On Windows, publish from inside a git repository or mark executables with --executable <path>.
  • Secret files such as .env, *.key, id_rsa*, or a *.pem holding a private key stop the preview (plugin_secret_files).
2

Issue a publishing PAT

Publishing uses a PAT with the plugins:read and plugins:write scopes instead of an OAuth login. Issue it once while you're signed in.

axhub auth pat issue --scopes plugins:read,plugins:write --tenant-id <company UUID> --use

--use only saves the token in this CLI; it never shows its value. You're done when Saved PAT in keychain. appears. Don't use --show-token, which prints the token value.

3

Preview

axhub plugin publish ./weather-tools --tenant <company UUID> --submit

Without --execute, it shows — with no network request — the files to pack, executables, paths left out, and risky parts (hooks, MCP servers, bin, scripts).

Plugin publish preview (offline)
  Name: weather-tools
  Version: 1.2.3
  Kind: plugin_zip
  Files: 4
    - .claude-plugin/plugin.json
    - hooks/session-start.sh (실행 파일)
    - …
  Risk inventory:
    - …
  Artifact SHA-256: …
  Artifact size: … bytes
  No network request or authentication was performed.
  --submit: 업로드가 끝나면 이 버전의 게시 심사를 바로 신청해요.
  Next: review the preview, then add --attest-distribution-rights --execute.
4

Upload and request the publication review

Once the list looks right, add --attest-distribution-rights, which confirms your right to distribute it, and --execute. With --submit, it also requests the version's publication review in the same run, after upload processing finishes.

axhub plugin publish ./weather-tools --tenant <company UUID> --attest-distribution-rights --execute --submit
플러그인 버전 업로드가 끝났어요
  App ID: <app ID>
  App slug: weather-tools
  Version ID: <version ID>
  Version: 1.2.3
게시 심사를 신청했어요 (신청 ID: <request ID>, 자동 검수: awaiting)
결과 알림은 없어요 — `axhub plugin manage status` 로 확인하세요
다음: axhub --tenant <company UUID> plugin manage status --app <app ID> --version 1.2.3

If the upload succeeded but only the request failed, don't rerun publish — rerun just the axhub plugin submit command it prints. Use the same command to request the review of an already uploaded version later.

axhub --tenant <company UUID> plugin submit --app <app ID> --version 1.2.3 --execute

Submitting the same version again creates no new request and finishes successfully (already_submitted: true).

5

Check the status and approval

axhub --tenant <company UUID> plugin manage status --app <app ID> --version 1.2.3 --watch

The first line is the one current state; below it come the next command to run and the state of each stage (upload processing, automated review, publication review, publication, served). --watch keeps watching until the state no longer waits on the server (5 minutes by default).

[관리자 심사 대기] 워크스페이스 관리자가 승인하면 제공돼요. 결과 알림은 없으니 이 화면이나 `axhub plugin manage status` 로 확인하세요.
다음: axhub --tenant <company UUID> plugin manage status --app <app ID> --version 1.2.3
상태:
  업로드 처리: 완료
  …
위험 요약: hooks 1 · MCP 0 · bin 0 · 동적 컨텍스트 0 · 스크립트 0

Once the automated review passes, a workspace admin approves it under App review in the console (Review apps). When the approval is applied, the state turns to [제공 중] (served), and from then on company members can install it as above. There's no notification of the result, so check it with this command.

axhub plugin submit --wait waits only for upload processing. Once processing finishes it submits and exits — it doesn't wait for the automated review or admin approval. After that, follow it with axhub plugin manage status --app <app> --watch. publish --execute also waits until upload processing finishes before it exits.

  • The app's visibility must be Internal or External for the plugin to be served. A plugin of a Private or Invite-only app can't be installed even once approved — see When a plugin is served.
  • If the automated review rejects it, check the findings on the Versions tab of the app console and request a review with a reason, or fix it and upload a new version. A rejection for found secrets can't be passed (gate_override_forbidden).
  • If other commands fail with a permission error (exit code 4 or 8) after publishing, the saved publishing PAT is being used instead of your login. Clear the active PAT with axhub auth pat unset.
  • What each error code means and what to do is in Company plugin error codes.