How to Download Dify Plugins from Marketplace vs GitHub: Key Differences Explained
The only functional difference between downloading Dify plugins from the Marketplace versus GitHub lies in the URL construction and input parameters—Marketplace downloads use a REST API endpoint requiring author, name, and version, while GitHub downloads fetch release assets using repo, release, and asset patterns—before both paths converge on the identical repackaging logic in plugin_repackaging.sh.
When working with the junjiem/dify-plugin-repackaging repository to enable offline plugin installation, you must choose between two distinct acquisition methods. The plugin_repackaging.sh utility handles both sources through separate entry functions that ultimately execute the same offline preparation pipeline, differing only in how they resolve and fetch the original .difypkg file.
Entry Points and Parameter Structures
The script branches based on the first positional argument, invoking either the market or github function defined in plugin_repackaging.sh.
Marketplace Download (market sub-command):
- Defined at lines 28–52
- Requires three parameters:
plugin_author,plugin_name,plugin_version - Constructs a REST API call to the official Dify Marketplace
GitHub Download (github sub-command):
- Defined at lines 54–82
- Requires three parameters:
GitHub_repo,release_title,asset_name(must include.difypkgsuffix) - Constructs a standard GitHub release asset URL
URL Construction and API Patterns
Marketplace REST API Endpoint (lines 28–52)
For Marketplace downloads, the script assembles URLs using the MARKETPLACE_API_URL environment variable (defaulting to https://marketplace.dify.ai). The function builds the endpoint path as /api/v1/plugins/<author>/<name>/<version>/download at lines 42–44, then executes a curl command to fetch the package. Error handling at lines 46–49 validates the curl return code and aborts with a Marketplace-specific message if the request fails.
./plugin_repackaging.sh market junjiem mcp_sse 0.0.1
This resolves to https://marketplace.dify.ai/api/v1/plugins/junjiem/mcp_sse/0.0.1/download before triggering the repackaging workflow at line 51.
GitHub Release Asset URLs (lines 54–82)
For GitHub downloads, the script utilizes the GITHUB_API_URL base (default https://github.com). At lines 66–74, it constructs the path /<repo>/releases/download/<release>/<asset>, prepending the base URL if not already present. Like the Marketplace path, it performs curl validation at lines 76–79 but emits GitHub-specific error messages, then proceeds to repackaging at line 81.
./plugin_repackaging.sh github junjiem/dify-plugin-agent-mcp_sse 0.0.1 agent-mcp_sse.difypkg
This resolves to https://github.com/junjiem/dify-plugin-agent-mcp_sse/releases/download/0.0.1/agent-mcp_sse.difypkg.
The Unified Repackaging Pipeline (lines 99–146)
Regardless of the source, both download methods invoke the repackage function at lines 99–146. This function:
- Environment Detection: Determines
OS_TYPEandARCH_NAME(lines 16–24) to select the correctdify-plugin-<os>-<arch>binary - Extraction: Unpacks the downloaded
.difypkgarchive - Dependency Resolution: Runs
pip download(line 113) to fetch all Python wheels defined inrequirements.txt - Requirements Rewriting: Injects
--no-index --find-links=./wheels/intorequirements.txtat lines 118–124 to enable offline installation - Package Rebuild: Invokes the platform-specific
dify-pluginbinary at line 140 to generate a new offline-ready.difypkgfile with updated ignore files
Practical Usage Examples
Download from the official Dify Marketplace for the MCP SSE plugin:
./plugin_repackaging.sh market junjiem mcp_sse 0.0.1
# Generates: junjiem-mcp_sse_0.0.1-offline.difypkg
Download from a GitHub release asset:
./plugin_repackaging.sh github junjiem/dify-plugin-agent-mcp_sse 0.0.1 agent-mcp_sse.difypkg
# Generates: dify-plugin-agent-mcp_sse-0.0.1-offline.difypkg
Process a locally cached package without network access:
./plugin_repackaging.sh local ./db_query.difypkg
Summary
- Source-specific entry points: The
marketfunction (lines 28–52) andgithubfunction (lines 54–82) handle distinct parameter schemas and URL constructions - API vs Release semantics: Marketplace uses
/api/v1/plugins/<author>/<name>/<version>/downloadwhile GitHub uses/releases/download/<release>/<asset> - Convergent processing: Both paths call
repackage(lines 99–146) to extract dependencies, download wheels viapip, and rebuild offline-capable packages - OS/Architecture awareness: The script automatically selects the correct
dify-pluginbinary based onOS_TYPEandARCH_NAMEdetected at lines 16–24 - Error context: Each download path provides source-specific
curlfailure messages while sharing identical validation logic
Frequently Asked Questions
Can I use the same repackaging logic for both Marketplace and GitHub sources?
Yes. According to the junjiem/dify-plugin-repackaging source code, both the market and github functions in plugin_repackaging.sh resolve to the same repackage routine at lines 99–146. The only difference is how the original .difypkg is obtained and the naming convention of the output file.
Why does the GitHub method require the .difypkg suffix in the asset name?
The GitHub download logic at lines 66–74 constructs a direct URL to a release asset, and the script expects the asset parameter to explicitly include the .difypkg extension to ensure it fetches the correct binary package rather than source code archives or other release artifacts. This specificity prevents ambiguity when repositories contain multiple file types in a single release.
How does the script handle different operating systems and architectures?
Before any download occurs, the script executes environment detection at lines 16–24, setting OS_TYPE and ARCH_NAME variables. When the repackage function rebuilds the package at line 140, it invokes the corresponding dify-plugin-<os>-<arch> binary, ensuring the repackaged plugin matches your deployment environment regardless of whether you sourced it from the Marketplace or GitHub.
What happens if the curl download fails?
Both download paths implement curl return code checking immediately after the fetch operation. The Marketplace logic at lines 46–49 and GitHub logic at lines 76–79 verify the exit status; if non-zero, the script aborts with a source-specific error message indicating whether the Marketplace API or GitHub release URL was unreachable, without proceeding to the repackaging stage.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →