# bin A place for things to be binned ## Install **Claude Code:** ```bash claude plugin marketplace add / claude plugin install bin@ ``` **GitHub Copilot CLI:** ```bash copilot plugin marketplace add / copilot plugin install bin ``` **Local (development):** ```bash # Claude Code claude --plugin-dir ./plugins/bin # GitHub Copilot CLI copilot plugin install ./plugins/bin ``` ## Contents | Component | Path | Description | |---|---|---| | Skills | `.apm/skills/` → `skills/` | Slash commands available after install | | MCP servers | `.mcp.json` | The `obsidian` server (`npx @bitbonsai/mcpvault@0.15.0 docs/`), hand-authored at the plugin root | `.apm/` is the authoring source; `skills/` is the generated mirror plugin hosts scan (ADR-0017). This plugin ships no agents. It is the only plugin here with a non-empty `.mcp.json`, which is why its compiled manifests are the only ones carrying an `mcpServers` block. The two compiled manifests get that block by different routes. `.claude-plugin/plugin.json` gets it from apm itself: `build_plugin_manifest`'s Claude branch calls `collect_mcp_servers`, which reads `.mcp.json`, sanitizes it, and inlines the resulting server objects. `.github/plugin/plugin.json` gets nothing from apm — the Copilot branch drops the field — so `scripts/sync-plugin-content.sh`'s `reinject_mcp_servers()` puts it back, as the **string `".mcp.json"`** rather than the resolved objects. Copilot's manifest schema types the field as "string or object — MCP server config path or inline definitions", and a path reference cannot carry a credential into a committed manifest. See ADR-0017's `mcpServers` amendment. ## Author Defame1297