$npx -y skills add zilliztech/mfs --skill open-tagAdmin/control console for an Open Tag Slack tag-in workflow backed by MFS. Use to set up a new Open Tag bot from scratch, check what is currently running (backend, permitted MFS scopes, Slack channel), change settings, add or remove data sources, switch the CLI agent backend (cla
| 1 | # Open Tag (admin) |
| 2 | |
| 3 | This skill is the **control console** for an Open Tag deployment. Use it for the |
| 4 | first-time setup and for ongoing operation alike: inspect the live bot, change |
| 5 | the backend or permitted scopes, add a new data source, move the bot to another |
| 6 | Slack channel, or debug a run. |
| 7 | |
| 8 | Keep the architecture generic: |
| 9 | |
| 10 | - **Brain**: the selected CLI agent backend — `claude -p` (Claude Code) or |
| 11 | `codex exec` (Codex). |
| 12 | - **Memory**: MFS-indexed, operator-authorized context such as Slack history, |
| 13 | repositories, docs, issues, databases, or object stores. |
| 14 | - **Tools**: MFS connectors for external read/search plus any explicit tools the |
| 15 | backend is allowed to use in the workspace. |
| 16 | |
| 17 | The user-facing flow is: |
| 18 | |
| 19 | 1. Configure MFS sources and allowed scopes. |
| 20 | 2. Configure a Slack app with Socket Mode and invite it to a sandbox channel. |
| 21 | 3. Start the Open Tag bridge. |
| 22 | 4. Move to Slack and tag the bot in a thread. |
| 23 | 5. Let the bridge invoke the selected backend with thread context and scoped MFS |
| 24 | helper scripts for permitted external context. |
| 25 | |
| 26 | This skill does not call a model API directly. Model access, tool access, and |
| 27 | write permissions come from the selected CLI agent backend. |
| 28 | |
| 29 | ## Prerequisites |
| 30 | |
| 31 | Open Tag is a thin layer on top of a **running MFS server with at least one |
| 32 | indexed source**. Confirm these before any Slack work: |
| 33 | |
| 34 | 1. **MFS server installed and running.** `uv tool install mfs-server`, then |
| 35 | `mfs-server run` (binds `127.0.0.1:13619`). Check with |
| 36 | `curl -s 127.0.0.1:13619/healthz`. |
| 37 | 2. **At least one data source indexed.** Open Tag only *consumes* already-indexed |
| 38 | scopes as Memory — it does not configure connectors itself. Use the |
| 39 | **mfs-ingest** skill (Codex: `$mfs-ingest`) to add a source; see |
| 40 | "Adding data sources" below. |
| 41 | |
| 42 | `opentag_doctor.py` fails fast with a hint if either is missing. |
| 43 | |
| 44 | ## Bot name convention |
| 45 | |
| 46 | The Slack display name is whatever you call the Slack app — Open Tag's code |
| 47 | strips the mention regardless. Recommended convention, so it reads like the |
| 48 | official `@Claude` tag: |
| 49 | |
| 50 | | Backend | Suggested Slack app name | In Slack | |
| 51 | |---|---|---| |
| 52 | | `claude` | **OpenClaude** | `@OpenClaude <task>` | |
| 53 | | `codex` | **OpenCodex** | `@OpenCodex <task>` | |
| 54 | |
| 55 | Name the Slack app accordingly when you create it (step 3). Set |
| 56 | `OPENTAG_BOT_NAME` if you want the startup summary to print a different label. |
| 57 | |
| 58 | ## Setup Workflow |
| 59 | |
| 60 | 1. Satisfy **Prerequisites** above (MFS running + at least one indexed source). |
| 61 | 2. Read `references/slack-adapter.md` and follow its end-to-end checklist. |
| 62 | 3. Confirm or create a private or otherwise isolated Slack channel. |
| 63 | 4. Create or reuse a Slack app named per the convention above, enable Socket |
| 64 | Mode, subscribe to `app_mention`, add the required bot scopes, install it, and |
| 65 | invite the bot to the channel. |
| 66 | 5. Configure MFS memory sources and set `MFS_ALLOWED_SCOPES` to the exact source |
| 67 | roots the runtime agent may use. |
| 68 | 6. Choose `OPENTAG_BACKEND` explicitly: `claude` or `codex`. |
| 69 | 7. Run `python scripts/opentag_doctor.py --channel-id <channel-id>` and fix any |
| 70 | failed check. |
| 71 | 8. Start the bridge with |
| 72 | `uv run --with slack-bolt python scripts/slack_socket_agent.py --backend <backend>`. |
| 73 | It prints a "what's live now" summary — read it, then validate thread context, |
| 74 | permitted-context retrieval, and task execution with a realistic delegated task. |
| 75 | |
| 76 | ## Adding data sources |
| 77 | |
| 78 | Open Tag's reach is exactly what MFS has indexed and what you list in |
| 79 | `MFS_ALLOWED_SCOPES`. To add a source, use the **mfs-ingest** skill — it handles |
| 80 | credentials and writes the connector config; Open Tag never duplicates that. |
| 81 | |
| 82 | Representative sources (each is `mfs add <uri> --config <toml>` once, then add |
| 83 | its root to `MFS_ALLOWED_SCOPES`): |
| 84 | |
| 85 | - **Local repo / docs**: `mfs add /path/to/repo` → `file://local/path/to/repo` |
| 86 | - **Slack history**: `slack://team-memory` (own token + channel allowlist) |
| 87 | - **GitHub (code + issues)**: `github://your-org/your-repo` |
| 88 | - **Linear (issues)**: `linear://your-workspace` |
| 89 | - **Postgres rows**: `postgres://prod` |
| 90 | |
| 91 | MFS supports 20+ connectors (databases, object stores, trackers, chat, web). |
| 92 | For the full list and per-connector credentials, point users at the |
| 93 | **mfs-ingest** skill and `docs/connectors/`. This breadth of Memory — including |
| 94 | raw data layers, all self-hosted — is Open Tag's main edge over a hosted tag bot; |
| 95 | it does **not** add hosted governance, audit, or approval flows. |
| 96 | |
| 97 | ## What The Python Scripts Do |
| 98 | |
| 99 | Keep the Python scripts as deterministic glue: |
| 100 | |
| 101 | - `slack_socket_agent.py`: receive Slack `app_mention`, read the thread, post |
| 102 | progr |