Skip to content

Commit ff27114

Browse files
committed
docs(readme): document workspace-root routing, Tool Optimization (@mux), auto-update
- README: add "Different Tools for Different Folders" (per-folder workspace-root routing) and "Let Your AI Curate Its Own Toolset" (built-in Tool Optimization driven by the @mux trigger; reads silent, writes approved, space_id targeting). Note auto-install-on-launch updates in How It Works. - Capture spec: add scenes for the Workspaces and Tool Optimization pages so the pipeline produces workspaces.png + tool-optimization.png. - docs/screenshots/README: document the two new screenshots. Screenshots for the two new surfaces are populated by running the capture command (see docs/screenshots/README.md) on a machine with a display. Signed-off-by: Mohammod Al Amin Ashik <maa.ashik00@gmail.com>
1 parent efcb910 commit ff27114

3 files changed

Lines changed: 56 additions & 1 deletion

File tree

README.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ Lightweight and cross-platform — built in Rust with Tauri 2, McpMux uses minim
7979

8080
**3.** Done. Every tool from every server is available in every client, right now.
8181

82-
McpMux routes calls to the right server, refreshes OAuth tokens automatically, and keeps credentials encrypted in your OS keychain — you never think about it again.
82+
McpMux routes calls to the right server, refreshes OAuth tokens automatically, and keeps credentials encrypted in your OS keychain — you never think about it again. It also keeps **itself** current: new versions download and install on launch by default (toggle in Settings), so a restart is all it takes.
8383

8484
---
8585

@@ -107,6 +107,12 @@ Create isolated Spaces — each with their own servers, credentials, and permiss
107107

108108
![Workspaces — switch context instantly from the sidebar](docs/screenshots/space-switcher.png)
109109

110+
### Different Tools for Different Folders
111+
112+
Your AI client tells McpMux which folder it's working in (its MCP *root*). McpMux uses that to **route each workspace to its own toolset** — open your backend repo and the AI sees your database and deploy tools; open a docs folder and it sees only search and filesystem. Map a folder once in the **Workspaces** tab (or let the AI do it — see below) and every future session from that exact path resolves automatically. Matching is per-folder and exact, so nothing leaks across projects.
113+
114+
![Workspaces — route each folder to its own FeatureSet](docs/screenshots/workspaces.png)
115+
110116
### Control What Each Client Can Do
111117

112118
Not every AI client should have the same power. Create Feature Sets — permission bundles that control exactly which tools, prompts, and resources a client can access. Build a "Read Only" set for cautious workflows, a "React Development" set with just GitHub and Filesystem, or a "Full Stack Dev" set with everything. Assign them per-client so each tool only goes where you want it.
@@ -119,6 +125,22 @@ Cursor, VS Code, Windsurf, Claude Code — see every AI client connected to your
119125

120126
![Client Management — per-client permissions and effective features](docs/screenshots/client-detail.png)
121127

128+
### Let Your AI Curate Its Own Toolset
129+
130+
Hand an assistant a hundred tools and it burns tokens and reaches for the wrong one. McpMux ships a built-in **Tool Optimization** capability so the AI can keep *itself* lean — straight from chat, no config files.
131+
132+
Start a request with **`@mux`** and the assistant can:
133+
134+
- **Discover** what's available — `mcpmux_list_spaces`, `mcpmux_list_all_tools`, `mcpmux_search_tools`
135+
- **Compose** a focused FeatureSet of just the tools it needs — `mcpmux_manage_feature_set`
136+
- **Pin** the current folder to that set so it sticks — `mcpmux_bind_current_workspace`
137+
138+
Reads are silent; anything that changes your setup pops a **one-click approval dialog that names the exact Space** — the AI proposes, you decide. The `@mux` trigger keeps these requests cleanly separated from your real work, and every operation can target a specific Space by id.
139+
140+
> *"@mux build a minimal toolset for this Next.js repo and pin it to this folder."*
141+
142+
![Tool Optimization — the AI composes and pins its own toolset, gated by your approval](docs/screenshots/tool-optimization.png)
143+
122144
---
123145

124146
## Security

docs/screenshots/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ pnpm exec wdio run tests/e2e/wdio.conf.ts --spec tests/e2e/specs/capture-screens
2626
| `discover.png` | Discover | content area | Server registry (mock bundle with 14 servers) |
2727
| `spaces.png` | Spaces | content area | Workspace cards (default + 5 additional) |
2828
| `featuresets.png` | FeatureSets | content area | Permission bundles |
29+
| `workspaces.png` | Workspaces | content area | Per-folder routing — map a folder (MCP root) to a FeatureSet/Space |
30+
| `tool-optimization.png` | Built-in Servers | content area | Tool Optimization shelf: meta-tool list + `@mux` trigger tip |
2931
| `clients.png` | Clients | full window | OAuth consent modal over connected clients (Cursor, VS Code, Windsurf, Claude Code) |
3032
| `settings.png` | Settings | content area | App settings page |
3133

tests/e2e/specs/capture-screenshots.manual.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,37 @@ describe('Screenshot Capture', function () {
528528
await saveScreenshot('featuresets');
529529
});
530530

531+
it('captures Workspaces (per-folder routing)', async () => {
532+
const nav = await byTestId('nav-workspaces');
533+
await safeClick(nav);
534+
await browser.pause(2000);
535+
// Open the "map a folder" form so the binding UI (root + FeatureSet picker)
536+
// is visible even without a live client reporting roots.
537+
try {
538+
const toggle = await byTestId('workspace-binding-create-toggle');
539+
await safeClick(toggle);
540+
await browser.pause(800);
541+
} catch {
542+
// form may already be open or the page empty — capture whatever renders
543+
}
544+
await saveScreenshot('workspaces');
545+
});
546+
547+
it('captures Tool Optimization (built-in self-management)', async () => {
548+
const nav = await byTestId('nav-builtin-servers');
549+
await safeClick(nav);
550+
await browser.pause(2000);
551+
// Select the Tool Optimization capability to reveal its tool list + @mux tip.
552+
try {
553+
const card = await byTestId('builtin-server-tool-optimization');
554+
await safeClick(card);
555+
await browser.pause(800);
556+
} catch {
557+
// fall back to the shelf overview
558+
}
559+
await saveScreenshot('tool-optimization');
560+
});
561+
531562
it('captures Connected Clients with approval modal', async () => {
532563
const nav = await byTestId('nav-clients');
533564
await safeClick(nav);

0 commit comments

Comments
 (0)