Skip to content

mcpx docs: plugin pages -- plugins, compatibility, interface and config, opencode v1 and v2, vibeMcp #1855

Closed

Description

@dezren39

Relocated from dezren39/darwin-nix#148 on 2026-10-28 (placement audit): mcpx's single source lives in developing-today/code (pkgs/mcpx); re-home tracked at #309. Original body below; issue references inside it are historical (dezren39/nix numbering).

Parent: #94

Summary

This issue covers the level-2 plugin pages: plugins, plugin compatibility, plugin interface & config, the opencode v1 plugin, the opencode v2 plugin, and vibeMcp. Anchors are under plugins#… in #146's page map. The pages may split into a plugins index plus an opencode page, with the same anchors either way.

"Plugin" means two different things in this project, and the pages must say which one each section means:

meaning direction exists today where it is designed
harness plugin: code that plugs mcpx into an agent harness (the opencode plugin) a consumer of mcpx yes: plugin/opencode/ this issue; #47, #48
mcpx plugin: an extension of mcpx (Go, binary, script or remote plugins, hooks, variables) extends mcpx no: "There is no plugin concept in the daemon at all" (#80) extensibility theme: #80, #82, #83

Nearly everything in the notes' plugin lines is about the first meaning. "vibeMcp" appears nowhere in the repo, and its meaning is the first open question.

Original notes

Source-notes lines 1, 2, 7, 49-52 (parents) and 72-77 (this issue). The lines in between are quoted in sibling issues.

  • documentation
    • make a book using whatever is the most common and simple modern choice
      • 3 main things, not book sections jsut like levels of detail-
        • the 'ok i just installed this thing what even is it' layer
          • basically a more normal set of docs
          • new person might assume this is all there is and wont be upset
          • a page or section in a page for
            • plugins
            • plugin compatibility
            • plugin interface & config
            • opencode v1 plugin
            • opencode v2 plugin
            • vibeMcp

Current state (what mcpx does today, with file refs)

Paths are relative to pkgs/mcpx/ on main (d0b7e01); re-checked at 05c78b2 in the 2026-09-30 issues pass, after #171 changed the plugin settings.

  • What ships:

    • plugin/opencode/mcpx-session.ts, the opencode adapter: hooks, tools, toasts, session id.
    • plugin/opencode/mcpx/daemon.ts, the portable core: DaemonClient, the discovery ladder, the remembered-choice file. It imports nothing from opencode.
    • mcpx-tui.tsx, an optional TUI picker.
    • Four skills: mcpx-basics, mcpx-observability, mcpx-browser, mcpx-daemon.

    Source: plugin/opencode/README.md "The files".

  • How it is installed: by hand with cp -R into ~/.config/opencode/plugin/, and mcpx/ must stay a subdirectory (README "Install"). Nothing in ~/.config/nix outside pkgs/mcpx references it (git grep mcpx-session origin/main finds nothing), so the Nix config does not install it.

  • Versions: opencode v1 is 1.18.31; the v2 CLI opencode2 is 2.0.3 (docs/opencode-plugin.md §1). v1 plugins do not load in v2 (build(deps): bump actions/checkout from 3 to 4 #47). v1.18.31 runs both plugin systems, so a v2 plugin file dropped into v1 is loaded by the v2 host and rejected, harmlessly, by the v1 loader (§1).

  • No binary needed: the plugin needs no mcpx on PATH (Bump rustls-webpki from 0.100.1 to 0.100.2 in /sources/pavex/examples/realworld #44, closed, fixed in chore(deps): bump build/buck/preludes/buck2-prelude from d956689 to 880be56 #53). It reaches the daemon over the unix socket. It spawns mcpx --json status only at rung 4 of discovery, the last fallback, used when a binary exists and the daemons are too old to answer GET /v1/resolve (plugin/opencode/README.md:99-112, plugin/opencode/mcpx/daemon.ts). backend: v1 never spawns, and bin: "" forbids spawning (README:83-85). The pages say "never needs the binary", not "never runs it".

  • Two sources for plugin configuration (as written at d0b7e01, struck where Phase 2: delegated Manage cannot add members #171 changed it):

    • The registry has 9 plugin.* settings: backend, bin, binArgs, discoveryRetry, env, instructions, skills, toolTiming, tools (docs/configuration.md "plugin"). At 05c78b2 the registry has 10: those minus skills (deleted, since nothing registers skills), plus remember and annotate (added) (internal/settings/plugin.go; docs/configuration.md:346-355).
    • The README's options table has 13 (plugin/opencode/README.md:79-93). Six of them are not plugin.* settings: endpoint and socket (mapped to MCPX_DAEMON_ENDPOINT/MCPX_ENDPOINT and MCPX_SOCKET), remember, daemonTools, annotate, headless. Four of them are not plugin.* settings: endpoint and socket (mapped to MCPX_DAEMON_ENDPOINT/MCPX_ENDPOINT and MCPX_SOCKET), daemonTools and headless. Phase 2: delegated Manage cannot add members #171 allowlisted all four with a reason each (pluginEnvAllowed, internal/settings/consumed_test.go:188-200). headless and daemonTools have defaults computed at boot, so a declared default would be wrong in one realm.
    • discoveryRetry is in the registry, and since Phase 2: delegated Manage cannot add members #171 actually read (mcpx-session.ts:196), but is still missing from the README table. skills is gone.
    • docs/configuration.md:85-86 says "The plugin reads process.env directly, so the variable names are the contract between the two and a test pins them". The test pins only the registry's names. Since Phase 2: delegated Manage cannot add members #171 this holds in both directions. TestEverySettingIsReadSomewhere requires every plugin.* variable to appear in the plugin's sources, and TestThePluginReadsNoUndeclaredSetting (consumed_test.go:209) fails on any variable the plugin reads that is neither a setting nor allowlisted. What no test pins is the README table itself.
  • Stale variable name: docs/opencode-plugin.md:406 (§6) says the plugin sets "MCPX_SESSION, MCPX_CALL and friends". The code sets MCPX_SESSION_ID (mcpx-session.ts:670), MCPX_CALL_ID (:677) and MCPX_PARENT_SESSION_ID (:713), which are the names session and parent-session scopes read (story.md "Sharing and scope"). The pages use the code's names. This is a doc fix only. MCPX_SESSION is a different, live variable: mcpx sets it for each script and the generated client reads it (internal/codegen/emit.go:253). It must not be renamed. MCPX_CALL exists nowhere (Root flake check fails on nixosConfigurations due to missing clan-core.clanModules #159 item 13, struck and corrected).

  • Other harnesses: codex, claude code, pi and manus have no plugin. Update Rust crate anyhow to 1.0.75 #48 designs a harness-free core plus adapters. docs/opencode-plugin.md §5 lists what an adapter must provide. Only (1) a directory and (2) a session identifier are required; everything else degrades.

  • Commands referenced below that are dispatched but missing from Commands(): mcpx api and mcpx adapter (see ⚡ Bolt: Optimize hash calculation for cursor colors #147 Finding 1). All others are in Commands().

Content per item

plugins#plugins

Approaches: naming the two meanings.

Content for the harness-plugin section:

  • What a harness plugin adds, and that it is optional. Any harness with a shell can use mcpx through AGENTS.md alone. The plugin adds:
    • the session id, so session-scoped servers persist across commands (README "Why");
    • the socket fast path (0.17 ms versus a 23 ms spawn);
    • optional tools, a system-prompt line, timing records and the daemon picker.
  • Hosts that only speak MCP need no plugin: mcpx serve --transport stdio or /mcp, linking modes#server-modes (🎨 Palette: Add aria-labels to search and goto-line inputs #146).

plugins#plugin-compatibility

A matrix. Every cell cites a source or says "unknown", with nothing guessed:

harness plugin how mcpx reaches it today session id source
opencode v1 (1.18.31) yes, plugin/opencode plugin, or shell + AGENTS.md injected by the shell.env hook README; docs/opencode-plugin.md §2, §6
opencode v2 (2.0.3) no: v1 plugins do not load shell + AGENTS.md, or mcpx as an MCP server in its mcp config not injected; needs the v2 session environment API (#47) docs/opencode-plugin.md §4; #47
codex no shell + AGENTS.md; MCP unknown #48
claude code no shell + AGENTS.md; MCP unknown #48
pi no unknown unknown #48
manus no unknown unknown #48
any MCP host not needed /mcp or stdio none (MCP carries no harness session) #147 mcp#mcp

Also one runtime note from the README: the core dials the socket with Bun's fetch(url, {unix}). A Node-based harness has to use MCPX_DAEMON_ENDPOINT and the TCP listener instead.

plugins#plugin-interface-and-config

Two interfaces and one configuration surface:

  1. Plugin to harness. The four opencode hooks mcpx uses (docs/opencode-plugin.md §2.2), and what each one degrades to without it (§6).

  2. Plugin to daemon. DaemonClient / connect(), and the discovery ladder (plugin/opencode/README.md:104-112): 0 a named endpoint or socket; 1 the choice remembered for this directory; 2 the daemon-*.json info files (the usual case, no binary); 3 GET /v1/resolve; 4 spawn mcpx --json status, the only rung that runs the binary, used as a last fallback and never under backend: v1 or bin: ""; 5 ask the user; 6 the best candidate, with a warning (docs/plugin-discovery.md §2-§5).

  3. For authors of plugins for other harnesses: the adapter contract (§5's six items, two of them required). This is what Update Rust crate anyhow to 1.0.75 #48 builds on.

  4. Configuration:

    • precedence is plugin option > environment variable > default;
    • options reach the plugin only when it is named in opencode config as a two-element array (README "Passing options");
    • the options table must be generated from one list.

    Approaches for that one list (revised 2026-09-30: Phase 2: delegated Manage cannot add members #171 settled part of this. It registered remember and annotate, deleted skills, and allowlisted the other four with reasons. The original C, "declare every plugin option in the registry", is kept below as B because Phase 2: delegated Manage cannot add members #171 rejected it for two of the four):

    • A (least): the README table stays the source. It already disagrees with the registry: it omits discoveryRetry.
    • B (middle): register the remaining four too (the original recommendation): endpoint and socket as aliases of daemon.endpoint and a socket setting, and headless and daemonTools as settings. The existing plugin-variable test then pins all of them, and 🎨 Palette: Improve accessibility of editor search panel #144 generates the table. The cost is the one Phase 2: delegated Manage cannot add members #171 recorded: headless and daemonTools default to something computed at boot, so any declared default is wrong in one of the two realms the plugin runs in. MCPX_SOCKET is also read before any settings exist.
    • C (recommended): generate the table from the registry's plugin.* settings plus a declared list of the non-setting options. Move pluginEnvAllowed out of the test into a non-test declaration that gives each entry its option name, variable, default description and effect. The test and the generator both read it. That declaration is the plugin slice of Phase 2: membership, delegation, groups, and server config #172's table of non-setting variables, so use Phase 2: membership, delegation, groups, and server config #172's shape rather than inventing one. This keeps Phase 2: delegated Manage cannot add members #171's reasoning, needs no behaviour change, and makes the README and docs table impossible to leave incomplete, which is exactly how discoveryRetry went missing.

plugins#opencode-v1-plugin

What ships today:

  • the files, the install commands and why mcpx/ must stay a subdirectory;
  • skills installation;
  • options via config;
  • what gets injected (README "What gets injected"; minimal/standard/full via plugin.env);
  • the tools: mcpx_discover, mcpx_exec and mcpx_observe, off by default because each adds a tool to every request; plus the daemon tools;
  • instructions, toolTiming, trace ids, the TUI picker.

One paragraph on interplay with opencode's own code mode (OPENCODE_EXPERIMENTAL_CODE_MODE, #149 faq#opencode-code-mode): the two do not conflict, and the plugin needs nothing in opencode's mcp config.

Install friction is real: cp -R by hand, and the Nix config does not install it. Open question 4 asks whether the page should promise a packaged install.

plugins#opencode-v2-plugin

Approaches: documenting something not yet built.

  • A (least recommended): leave it out until build(deps): bump actions/checkout from 3 to 4 #47 ships. The notes list it, and a v2 user who lands on the plugin pages would find nothing about their version, not even that nothing exists.

  • B (middle): document the planned design (the §4 lists: unnecessary / possible / breaks / same). This is accurate as a design, but it reads as a feature, and a reader will try it.

  • C (recommended): a short status section. It says: "Not built; tracked in build(deps): bump actions/checkout from 3 to 4 #47. On opencode v2 today:"

    1. shell + AGENTS.md works, with no session id, so session-scoped servers are isolated per call;
    2. alternatively add mcpx serve --transport stdio to v2's mcp config.

    It also states what the rewrite will change, in four bullets taken from §4, and links the compendium (docs(id): design plan, research, and n0 relay default #152) for the full design.

    One caveat for option 2: v2 defaults MCP servers to code mode, so mcpx's own tools end up wrapped inside v2's code mode. OPENCODE-V2.md records that v2 ships mcp-codemode-defaults.ts to turn that off for servers that are themselves code mode. Whether it recognises mcpx is unknown (open question 3).

    This is honest, useful today, and cannot be mistaken for a shipped feature.

plugins#vibemcp

The term does not appear in the repo, in ~/git, or in the other notes (rg -il 'vibe.?mcp' finds only the notes files). A web search on 2026-09-30 found four unrelated projects with the name:

project what it is relevance
VibeTensor/vibemcp (@vibetensor/vibemcp) a Gmail + Microsoft 365 MCP server that returns TOON rather than JSON, "One server. Two ecosystems. Half the tokens." the same concern as mcpx (tokens), addressed inside one server's output format
VibeTechnologies/vibe-mcp (@vibebrowser/mcp) browser automation that lets "multiple AI agents control the same browser simultaneously" through a relay daemon the Chrome problem again, solved the opposite way: a shared browser, where mcpx gives each session its own
VibeCodingInc/vibe-mcp (slashvibe-mcp) presence and DMs between developers across coding sessions none
Jinjos/vibe-mcp AI coding-rules management for vibe-cli none

Candidate readings, for the user to choose from (open question 1):

  1. "Vibe-coding an MCP server": getting tools without writing a server. mcpx already does three versions of this:

    • a command-line program becomes tools through paths.adapters (mcpx adapter);
    • an OpenAPI document becomes tools through mcpx api --spec or paths.apis;
    • a saved script or recipe runs by name (mcpx recipes, mcpx run).

    Caveat: adapter and OpenAPI tools are MCP tools, not script namespaces, so they are absent from tools.<ns> (Bump build/buck/preludes/buck2-prelude from d956689 to f12c8d1 #102). chore(deps): bump build/buck/preludes/buck2-prelude from d956689 to 36464cf #83 plans to make them first-class. If this is the reading, the page probably moves out of the plugin block, to configuration#server-config or an "extending mcpx" page.

  2. A named external project, most plausibly the multi-agent browser (VibeTechnologies). It would appear as a comparison, or as a server known to work behind mcpx.

  3. Vibe-coding with mcpx: the user describes a task and gets a script back (mcpx prompt, recipes, POST /v1/intent; docs/consumer.md).

  4. A planned name for an mcpx mode or product not yet written down anywhere.

Until this is answered, the page map keeps the item verbatim at plugins#vibemcp, and the page holds a one-line placeholder rather than a guess.

Open questions

  1. What does "vibeMcp" mean? One of the four readings above, or something else? This decides whether the page stays under plugins.
  2. Plugin config source (Approach C in interface & config): register the six extra plugin options in the registry? Phase 2: delegated Manage cannot add members #171 registered two and allowlisted four with reasons. Is that split final? And should the README table be generated from the registry plus Phase 2: membership, delegation, groups, and server config #172's declared list, as C proposes?
  3. opencode v2 as an MCP host of mcpx: does v2's code-mode default wrap mcpx's mcpx_exec, and should mcpx declare itself so mcp-codemode-defaults.ts turns code mode off for it?
  4. Packaging: should the v1 plugin be installable from the Nix config or a release artifact before the page describes installing it? Or does the page document the cp -R flow as-is (amd host fails at evaluation: no outputHashes for p2panda-core-0.7.1 #158)?
  5. The compatibility matrix: who fills in the "unknown" cells for codex, claude code, pi and manus? Update Rust crate anyhow to 1.0.75 #48 is where the work lives. The docs should not claim support before an adapter exists.

Docs checks run in CI; see the testing trackers under #91 (CI pipeline #95, integration/environments #97).

Ease · Impact · Related

Ease S-M (mostly assembly from plugin/opencode/README.md and docs/opencode-plugin.md; the config table waits on the registry decision; vibeMcp waits on the user) · Impact med: it matters to every opencode user and to anyone porting to another harness · Depends on / related: #94, #44 (closed, fixed in #53), #47, #48, #80, #82, #83, #102, #88, #146, #147, #149, #144, #158, #152, #153, #159 (item 9: the plugin option sources; item 13: the MCPX_SESSION doc line), #172 (the declared list of non-setting variables that Approach C builds on)

Security/auth deferred; see tracker.

Activity

  1. developing-today commented on Oct 28, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    History carried over from dezren39/darwin-nix#148 (verbatim, oldest first):


    @dezren39 · 2026-09-30T07:20:30Z

    Integration pass. Placed in the DAG rooted at #181.


    @dezren39 · 2026-09-30T12:00:50Z

    Issues pass (2026-09-30, at 05c78b2). I edited the body in place. The vibeMcp section, the naming approaches and the v2 approaches are unchanged.

  3. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 29, 2026
  4. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor
  5. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · triage verdict — CONFIRMED, no duplicate, follow-up enqueued; one open question is Drew's

    Verdict: CONFIRMED with one correction and one escalation. The level-2 plugin pages do not exist yet; the issue's recommended approaches (C/C/C) stand; the follow-up is enqueued.

    Verified fresh at current main 82b019a0 (2026-10-29):

    1. No pages yet, sources intact. pkgs/mcpx/docs/ has no plugins page (tree checked: opencode-plugin.md and plugin-discovery.md are the design/reference sources the pages assemble from, not level-2 pages). pkgs/mcpx/plugin/opencode/ ships as the issue describes: mcpx-session.ts, mcpx-tui.tsx, mcpx/ portable core, skills/, README.md.
    2. Dedupe — no duplicate. Docs-issue searches return mcpx docs: plugin pages -- plugins, compatibility, interface and config, opencode v1 and v2, vibeMcp #1855 as the only issue scoped to the plugin pages. mcpx docs: level-2 page map, and the configuration, modes and transport pages #1848 (page map + configuration/modes/transport pages), mcpx docs: level 2 -- the 'ok i just installed this thing what even is it' layer (tracker) #1898 (level-2 tracker) and mcpx docs: the book -- overview, manual and compendium (tracker) #1888 (book tracker) are its parent/sibling structure, not coverage of these pages; mcpx docs: compendium structure, migrating the existing design docs, and a catalogue of MCP servers, resources, indexes and projects #1867/mcpx docs: generated reference pages -- settings, env vars, flags, CLI, /v1, MCP tools, protocol and parity matrices #1843/mcpx docs: overview, quick start, install page and 'now what' #1878 cover other page sets. Nothing to close.
    3. Correction to the issue's config-table premise: the machinery has moved since the issue's 05c78b2 check. pluginEnvAllowed no longer exists under that name; internal/settings/consumed_test.go now directs authors to pluginSettings() ("Add them to pluginSettings() so mcpx settings can report them", ~L279) and pins plugin variables both directions against the plugin's TypeScript sources. Approach C's intent stands — one declared list that both the test and the table generator read — but the follow-up must build on the current pluginSettings()/registry state, not the issue's stale consumed_test.go:188-200 reference.
    4. Approaches settled by the issue itself, carried into the follow-up intact: naming = C (keep "plugin", qualify every time — "Harness plugins: mcpx inside your agent" / "mcpx plugins: extending mcpx", the second a status stub until the extensibility work lands); config table = C as corrected above; opencode v2 page = C (short status section: not built, what works today, what the rewrite changes — never written as a shipped feature). Compatibility matrix ships with the issue's table and its "unknown" cells left unknown (open question 5: docs do not claim support before an adapter exists). The v1 page documents the cp -R install as it is today (open question 4's conservative branch: document reality, promise nothing).
    5. ESCALATED to Drew — open question 1, "vibeMcp": the word is from Drew's own notes and appears nowhere in any repo; the issue lays out four candidate readings (1: vibe-coding an MCP server — tools without writing a server, via adapters/OpenAPI/recipes; 2: a named external project, most plausibly the multi-agent shared-browser vibe-mcp; 3: vibe-coding with mcpx — describe a task, get a script; 4: a planned name for an unwritten mcpx mode). Only Drew can say which he meant, and it decides whether the page even stays under plugins. Per the issue's own rule, the follow-up ships plugins#vibemcp as a one-line placeholder rather than a guess; the rest of the pages do not wait on this.

    Follow-up: docs implementation packet enqueued to repo-health-code-pilot (task ID in the completion note) with the five sections (plugins, plugin-compatibility, plugin-interface-and-config, opencode-v1-plugin, opencode-v2-plugin) plus the vibeMcp placeholder as its scope.

  6. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · triage complete

    • Agent: queue worker (repo-worker-code), Lane D shift
    • Session / ID: queue task 2744 → follow-up task 3067
    • Outcome: Triage CONFIRMED (verdict above). Docs implementation follow-up enqueued to repo-health-code-pilot as task 3067 (small_fix, dedupe_key repo-health:v1:fix:developing-today/code:issue:1855); this issue now carries queue/queued for it. Open question 1 (vibeMcp) is escalated to Drew in the verdict — the follow-up ships that anchor as a placeholder only.
  7. 9 remaining items

  8. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/claimedQueue worker lifecycle state
    on Oct 29, 2026
  9. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked

  10. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked (merge queue broken, #2403)

  11. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done

    • Agent: queue worker (repo-worker-code), lane C shift
    • Session / ID: queue task 3067, shift 2026-10-29 19:14 CDT
    • Found via: queue claim (resume of merge_ready_blocked_on_mq park)
    • Task: Re-enqueue PR docs(mcpx): level-2 plugin pages (#1855) #2452 (level-2 plugin docs pages) after the merge-queue freeze cleared
    • Result: PR docs(mcpx): level-2 plugin pages (#1855) #2452 MERGED at 2026-10-30T00:41:29Z, merge commit 42aa2c3. Verified fresh this shift before enqueueing: head e6b7efb, all basic checks pass (test, spec parity, proxy port fallbacks), and all 4 Codex review threads are resolved (findings fixed in 211a093 + e6b7efb per the prior lane's disposition record). This issue auto-closed on merge; its in-flight queue/work/status labels were stripped.
  12. removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    work/assignedQueue worker lifecycle state
    on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions