Skip to content

Plugin Distribution

Distribution

One local MCP package, thin host wrappers.

Use llms.txt for the no-install hosted proof. Use froglet-mcp and plugins for real local/self-hosted Froglet actions.

  1. Official MCP Registry: publish server.json after the matching npm package version exists.
  2. Codex plugin bundle: use plugins/froglet/ plus .agents/plugins/marketplace.json for repo-local coding-agent distribution.
  3. Claude Code marketplace: use .claude-plugin/marketplace.json plus the same plugins/froglet/ bundle.
  4. OpenClaw package: ship the checked-in source plugin after host install verification.
  5. NemoClaw package: verify NemoClaw-specific sandbox and HTTPS deltas before claiming support.
  6. Third-party MCP directories: submit only after the official registry entry is live.

A hosted consumer app directory path is intentionally out of scope for this repo slice. If that path returns later, it should be a separate consumer app, not the local stdio MCP package.

The repository carries the MCP Registry metadata:

Terminal window
cat server.json

The npm package also declares the registry name:

"mcpName": "io.github.armanas/froglet"

Publish order:

Terminal window
npm run check:mcp
npm run test:mcp
npm pack --dry-run
npm publish --provenance=false --otp <npm-otp>
mcp-publisher login github
mcp-publisher publish
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.armanas/froglet"

Expected live result: the registry search returns io.github.armanas/froglet, package identifier froglet-mcp, version 0.4.0, and isLatest: true.

Verification commands:

Terminal window
npm view froglet-mcp version
node -e 'fetch("https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.armanas/froglet&limit=20").then(r=>r.json()).then(j=>{const row=j.servers?.find(x=>x.server?.name==="io.github.armanas/froglet"&&x._meta?.["io.modelcontextprotocol.registry/official"]?.isLatest); const s=row?.server; console.log(JSON.stringify({name:s?.name, package:s?.packages?.[0]?.identifier, version:s?.version, isLatest:row?._meta?.["io.modelcontextprotocol.registry/official"]?.isLatest}, null, 2));})'
node -e 'fetch("https://froglet.dev/learn/plugin-distribution/").then(r=>console.log(r.status, r.headers.get("content-type")))'

Do not use curl https://froglet.dev/learn/plugin-distribution/ as a proof command. That URL is a rendered documentation page, so raw curl output is HTML by design.

Repo-local artifacts:

  • plugins/froglet/.codex-plugin/plugin.json
  • plugins/froglet/.mcp.json
  • plugins/froglet/skills/froglet/SKILL.md
  • plugins/froglet/commands/froglet.md
  • .agents/plugins/marketplace.json
  • .cursor/mcp.json

The plugin starts the published MCP package in local mode:

{
"mcpServers": {
"froglet": {
"type": "stdio",
"command": "npx",
"args": ["-y", "froglet-mcp"],
"env": {
"FROGLET_PROFILE": "local",
"FROGLET_PROVIDER_URL": "http://127.0.0.1:8080",
"FROGLET_RUNTIME_URL": "http://127.0.0.1:8081",
"FROGLET_PROVIDER_AUTH_TOKEN_PATH": "data/runtime/froglet-control.token",
"FROGLET_RUNTIME_AUTH_TOKEN_PATH": "data/runtime/auth.token"
}
}
}
}

First call status. If the local node is not ready, use plan_install and get_install_guide before shell commands. After local health is verified, use plan_use_case before implementing the user’s first consumer, provider, evidence, payments, batch, or GPU workflow.

Codex CLI 0.114.0 exposes codex mcp, but no public plugin install or plugin validate command. Until Codex exposes that host workflow, Codex plugin verification means metadata inspection plus direct MCP stdio smoke, not a clean plugin-install claim.

The npm MCP package version and the host-plugin wrapper version are separate. Bump package.json and server.json for froglet-mcp package or registry changes. Bump plugin manifests and Claude marketplace metadata for wrapper-only skills, commands, or host packaging changes.

The repo includes .cursor/mcp.json for project-scoped Cursor MCP setup. It starts npx -y froglet-mcp against the local provider/runtime and token paths. Cursor host verification still requires Cursor or cursor-agent; when neither binary is installed, only config, MCP server tests, and direct stdio smoke are verified.

GitHub-hosted install path:

Terminal window
claude plugin marketplace add armanas/froglet --sparse .claude-plugin plugins
claude plugin install froglet@froglet

Local validation path:

Terminal window
claude plugin validate .
claude plugin marketplace add . --scope local
claude plugin install froglet@froglet --scope local

Expected proof: the plugin installs, starts the bundled MCP server, reports local status, then performs one real local action once the provider/runtime and token paths are available.

Claude Code also exposes /froglet, a command that follows the same local status, install-planning, and real-use-case flow through the MCP tool.

OpenClaw/NemoClaw use the checked-in source plugin until their package/registry surface is verified:

Terminal window
node --check integrations/openclaw/froglet/index.js
node --check integrations/openclaw/froglet/scripts/doctor.mjs
node --test integrations/openclaw/froglet/test/plugin.test.js \
integrations/openclaw/froglet/test/config-profiles.test.mjs \
integrations/openclaw/froglet/test/doctor.test.mjs \
integrations/openclaw/froglet/test/froglet-client.test.mjs

OpenClaw usually talks to loopback. NemoClaw usually runs inside a sandbox and must reach the host over HTTPS, so do not claim NemoClaw marketplace/package completion until that path is run in a real NemoClaw environment.

Current OpenClaw evidence covers static checks, plugin tests, doctor runtime checks, and direct source-plugin tool invocation. Full OpenClaw gateway-mediated invocation remains separate evidence.

NemoClaw remains blocked until a real NemoClaw/OpenShell sandbox can stage the plugin source and token, reach the host over HTTPS, and run one froglet tool action.

Reusable submission metadata lives in docs/MCP_DIRECTORY_SUBMISSIONS.md. The official MCP Registry is active for io.github.armanas/froglet at 0.4.0; third-party listings are not complete until each public listing points at froglet-mcp, Apache-2.0, the GitHub repository, and the local/self-hosted MCP boundary.

Every host must keep the same product boundary:

  • no-install hosted proof: https://froglet.dev/llms.txt, public free demo.* services, receipt/feed evidence, and no local secrets
  • installed MCP/plugins: local/self-hosted provider/runtime actions, paid rails, persistent identity, service publication, marketplace write flows, long jobs, batch, GPU, and production use cases