OpenCode provider plugins for coding-plan subscriptions, and gateway middleware and agents for magpie, maintained by the community. Each package signs in to one subscription and makes its requests. The packages work in OpenCode and in magpie, which runs OpenCode's provider plugins.
| Package | Signs in to | Provider id |
|---|---|---|
| cline | Cline (cline.bot): usage-billed models, ClinePass's and Cline's free ones, with Cline's device sign-in or an API key | cline |
| commandcode | Command Code plans (Pro, GOAT, Max, Ultra, Go, Teams Pro) | commandcode-plan |
| cursor | Cursor subscriptions (Pro, Pro+, Ultra, Teams), on the API cursor-agent talks to | cursor |
| devin | Devin subscription (the devin CLI's account) | devin |
| factory | Factory (Droid) subscription | factory |
| grok | Grok (SuperGrok / X Premium+), through the Grok Build CLI's sign-in | grok |
| kiro | Kiro (Free, Pro, Pro+, Power), with Kiro's sign-in, kiro-cli's or the IDE's, or an API key | kiro |
| minimax | MiniMax Code (China): account credits and M Plan, with MiniMax Code's device sign-in | minimax-code |
| minimax | MiniMax Code (international): account credits and M Plan, with MiniMax Code's device sign-in | minimax-code-global |
| mimo | Xiaomi MiMo, with a Xiaomi account | mimo-app |
| qoder | Qoder subscription (qoder.com), with Qoder's device sign-in | qoder |
| qoder | Qoder CN subscription (qoder.cn), with Qoder CN's device sign-in | qoder-cn |
| trae | Trae CN (trae.cn) and Trae international (trae.ai), free tier included, with Trae's browser sign-in (experimental) | trae-cn, trae-global |
| workbuddy | WorkBuddy (China build, CodeBuddy plan) | workbuddy |
| workbuddy | WorkBuddy (international build) | workbuddy-ai |
| zcode | ZCode: Z.ai / BigModel (智谱) GLM Coding Plan, team seats, Start Plan | zcode |
| zed | Zed (Pro, Pro Trial, Student, Business): Anthropic, OpenAI, Google and xAI models hosted by Zed | zed |
| zen-free | OpenCode Zen free models with the public credential | opencode-zen-free |
These packages aren't OpenCode plugins. magpie runs them in its gateway, on the requests every agent sends and the replies it gets back, whichever provider serves them. Each one is a port of something New API does for its channels, or something agents commonly need.
| Package | What it does |
|---|---|
| param-override | New API's 参数覆盖 (param_override): set, delete, move, copy or rewrite request fields, for some models or under conditions, or turn a request away |
| model-map | New API's 模型重定向 (model_mapping): send a model under another name, by name or /pattern/; replies name the model asked for |
| system-prompt | Your own system prompt on every request, or on some agents' or models', in each API's own place |
| word-guard | New API's 敏感词过滤: turn away or mask words and patterns in what users send, and in replies |
| think-tags | Take <think>…</think> out of a reply's text, or put a Chat reply's reasoning_content into it (thinking_to_content) |
magpie plugin add @magpie-community/middleware-<name>
magpie plugin options <name> '<json>'In the app, they're under Plugins › Discover › Gateway middleware, and each one's Options button edits its options in its row.
A middleware package is a folder under packages/<name>/ with:
package.json: name@magpie-community/middleware-<name>,"magpie": {"middleware": "./<name>.middleware.js", "options": {…}}, nomain.optionsis the example magpie offers when none are set.<name>.middleware.js: exportsonRequest,onEventand/oronResponse(the hooks). It runs in magpie's gateway on moejs, so it is one file and imports nothing.cases.jsonand a test that runs them withcheck()fromscripts/middleware.mjs, which calls the hooks the way the gateway does.
These add an agent magpie has no setup of its own for. Once added, the agent is on magpie's Agents page like the ones magpie ships with: pick one of magpie's models in its row and magpie writes it into the agent's config, and switching it off puts the config back.
| Package | Agent |
|---|---|
| aider | Aider: ~/.aider.conf.yml, through litellm's openai/ prefix |
magpie plugin add @magpie-community/agent-<name>An agent package is a folder under packages/<name>/ with:
package.json: name@magpie-community/agent-<name>,"magpie": {"agent": "./<name>.agent.js"}, nomain.<name>.agent.js: exportsagent(where the agent keeps its model) and, if it needs more than the model,connect(the other keys to write) (the reference). It runs in magpie on moejs, so it is one file and imports nothing.- a test of what
connectreturns.
Agent skills for magpie users, in skills/<name>/SKILL.md.
| Skill | What it does |
|---|---|
| magpie-quota | Lets an agent check what is left of every subscription, coding plan and key balance magpie has (magpie quota --json), and wait for allowance to come back |
In magpie, it is first under Library › Market › Skills. Elsewhere:
npx skills add magpie-community/plugins --skill magpie-quotamagpie:
magpie plugin add @magpie-community/opencode-<name>-auth
magpie plugin login <provider id>In the app, the Plugins tab lists these packages: install one there, then sign in.
OpenCode, in opencode.json:
{ "plugin": ["@magpie-community/opencode-<name>-auth"] }then opencode auth login.
Each package is a folder under packages/<name>/:
package.json- name:
@magpie-community/opencode-<name>-auth "type": "module","main": "./index.mjs"- version,
"license": "MIT" - no runtime dependencies unless one is really needed. Bun's and Node's
fetch,cryptoandfsusually cover it.
- name:
index.mjs- Exports one async plugin function, as OpenCode's
Plugintype describes. - Returns an
authhook:{ provider, loader, methods }.- A browser sign-in is
{ type: "oauth", label, prompts?, authorize }.authorizereturns{ url, instructions, method: "auto" | "code", callback }. - A key is
{ type: "api", label }. loader(getAuth, provider)returns what the AI SDK is given:baseURL,apiKey,headersand afetchthat signs each request and refreshes the token (saving it withclient.auth.set).
- A browser sign-in is
- A provider that models.dev doesn't list is declared in a
confighook that setsconfig.provider[<id>] = { name, npm, api, models }. The npm field names the AI SDK package the models speak:@ai-sdk/openai-compatible(chat completions),@ai-sdk/openai(Responses) or@ai-sdk/anthropic(Messages). - A list the account decides goes in the
provider: { id, models(provider, { auth }) }hook. - A daily check-in (签到) the vendor rewards goes in the
authhook ascheckin(getAuth, provider). magpie calls it once a day for each signed-in account while the user has it on (Settings → Usage → Plugins), and shows what came of it on the account's Usage card. It returns{ outcome, credit?, streak?, message? },outcomebeingclaimed(checked in now),done(already today),ineligible,inactive(no check-in event now),captchaorfailed; a throw isfailedwith its message, and onlyfailedis tried again that day. Never solve a captcha: returncaptchaand the user checks in in the vendor's app. Needs magpie with the hook (after v0.1.1083); the contract.
- Exports one async plugin function, as OpenCode's
README.md: what the package signs in to, how, where the sign-in is kept, and the models.
The provider id is the one magpie's built-in subscription has (grok,
zcode, workbuddy, commandcode-plan, …). While magpie still has the
built-in, the plugin's provider shows as <id>-plugin. Once the built-in
is gone, it takes over the same id, so an agent set to <id>/<model> keeps
working.
bun scripts/check.mjs [<name>] # loads each plugin and checks its hooks; signs in to nothing
MAGPIE=/path/to/magpie scripts/try.sh <name> [login <id> | provider test <id>-plugin]try.sh runs magpie in a sandbox HOME (.sandbox/<name>), so your own
magpie, agents and sign-ins are left alone.
MIT
registry.json is the list magpie's Plugins tab shows: the packages
here. A middleware's entry has "kind": "middleware" and no providers. magpie
fetches it every few hours and keeps a copy built into the app for when
it can't. To list a plugin, add an entry with its npm package, a
name, providers (the provider ids it signs in to), an icon and a
summary in English and Chinese ({"en": …, "zh": …}), and open a pull
request.
A new package's first version is published by hand before its pull request
is merged: npm's trusted publishing, which publishes every later version
from main, can't create a package. A magpie-community npm owner runs
scripts/publish.sh <otp> on the pull request's branch and sets
.github/workflows/publish.yml as the package's Trusted Publisher on
npmjs.com. The pull request's on-npm check fails until then.