Using Modyard

Publish a mod

Publishing is uploading a zip of your plugin folder. Modyard checks it, rebuilds a canonical archive, and lists it in your publisher's marketplace. You can do it from the web, from a script or from an agent.

4 min read

Before you start

You need a publisher. The first time you sign in with Google, Modyard creates one for you: an account with a slug, such as ana, that is also the name of your marketplace. A publisher can be a person or a team; owners can invite members as owners, editors or viewers. Editors and owners can publish.

You also need a mod that works. Check it locally before you upload anything:

bash
claude plugin validate ./bash-logger
claude plugin test ./bash-logger

If you have not written one yet, write your first mod walks through bash-logger from scratch.

What the zip must contain

Zip the plugin folder. Modyard accepts the files at the root of the zip or inside one wrapping top folder, so both of these work:

bash
cd bash-logger && zip -r ../bash-logger.zip . && cd ..
# or
zip -r bash-logger.zip bash-logger

Modyard checks the archive before it accepts it:

RuleDetail
.claude-plugin/plugin.jsonRequired. name in lowercase letters, digits and hyphens; version as x.y.z
hooks/hooks.jsonRequired, and every path in its modules must exist in the zip
SizeAt most 2 MB compressed and 10 MB unpacked
FilesAt most 500

If something fails, the error says which rule and which file, so you can fix it and upload again.

Modyard does not serve your zip as you sent it. It rebuilds a canonical archive: files sorted, timestamps fixed. Then it computes the sha256 of that archive. Two uploads of the same files give the same bytes and the same hash, and that hash goes into your marketplace so Claude Code can verify every download.

Way 1: the web form

Open publish, choose your publisher if you belong to more than one, and drop the zip. Modyard shows the name, version and description it read from plugin.json, the list of files, and what the mod can touch. Read that list before you confirm: if it says network and you never meant to make requests, something in your code does. What a mod can touch explains each category.

Once published, the mod has its page under mods and appears in your marketplace at once.

Way 2: curl and an API key

For scripts and CI, create an API key in settings. Only owners can create keys, and a key that publishes needs the read and write scope. Keys start with mdy_. Then:

bash
curl -X POST https://mods.gonzaloverdugo.com/api/v1/mods \
  -H "Authorization: Bearer mdy_..." \
  -F archive=@bash-logger.zip

The response is the published version, including its sha256. The key belongs to one publisher, so it publishes there and nowhere else. Keep it out of your repository: put it in your CI's secrets.

Way 3: from an agent over MCP

If Claude is helping you write the mod, it can publish it too. Connect Claude Code to Modyard's MCP endpoint with a read and write key:

bash
claude mcp add --transport http modyard https://mods.gonzaloverdugo.com/mcp \
  --header "Authorization: Bearer mdy_..."

Then ask Claude to publish the folder. It calls the modyard_publish_mod tool with the archive, and modyard_list_my_mods shows what your publisher already has. Use Modyard from an agent covers the setup in Claude Code and in claude.ai.

Names and versions

Names are unique across Modyard, not per publisher, first come first served. If bash-logger already exists, choose another name. Some publisher slugs are reserved (such as anthropic, claude, official and modyard) so nobody can pass for them.

Versions are immutable. Once 0.1.0 is published, its files never change, so the code people read is the code they run. To ship a fix, raise version in plugin.json and upload again. Each new version must be higher than the latest one: 0.1.1 or 0.2.0 after 0.1.0, never 0.1.0 again and never 0.0.9.

json
{ "name": "bash-logger", "version": "0.1.1", "description": "Shows each Bash command in the status line" }

People who already installed the mod get the new version when they run /plugin marketplace update ana in Claude Code.

Unlist or delete

From the mod's page, a publisher can:

  • Unlist the mod. It leaves search and your marketplace listing, but anyone with a direct link can still install it. Use it for a mod you no longer promote but someone may still depend on.
  • Delete the mod. Its versions go away and the name is freed, so anyone can take it later. Users who installed it keep their copy, but they get no updates.

With a key, deleting is also one request:

bash
curl -X DELETE https://mods.gonzaloverdugo.com/api/v1/mods/bash-logger \
  -H "Authorization: Bearer mdy_..."

Deleting cannot be undone, and a freed name can be taken by someone else. If you only want the mod out of sight, unlist it.

A short checklist

  1. claude plugin validate and claude plugin test pass.
  2. version is higher than the last one you published.
  3. The zip has plugin.json, hooks.json and every module it names.
  4. What the mod can touch matches what it says it does.
  5. The description tells a stranger what it does in one sentence.

Your first mod, installed in two commands

Sign in with Google and you get a publisher with its own marketplace. Upload a zip, read what Modyard found in it, and share the install command.