Identity
Grants are minted in three places:
- at OAuth sign-in, for every installed community the identity belongs to
- by
/mob connect - at install time, for the installing admin
Reads
Each platform evaluates read access through its available API.Discord
Discord search starts from a local mirror built from message history. At query time, mob intersects the channels the bot can see with the channels the member can see; a private channel the bot was never added to stays out of the mirror, so no member’s agent can reference it, and a member’s own access does not substitute for the bot’s. Member visibility comes from current roles and channel overwrites with a cache of about a minute, and role or overwrite changes drop the cache immediately. The mirror tracks the platform:- A message edit replaces its indexed chunks; a delete removes them.
- Loss of bot access purges the channel from the index.
- Attachments are indexed under the message that carries them and inherit its channel visibility. Text, CSV, and PDF contents are extracted directly; image contents are read by the instance’s vision model when the deployer configured one. Every attachment is searchable by filename.
- Public threads and forum posts are indexed under their parent channel and inherit its visibility. Private threads are never indexed.
- Any member can run
/mob deleteinside the server to remove their own messages from the index.
Slack
mob callsassistant.search.context for every Slack query with the requesting
member’s rotating Slack user token. Slack applies workspace membership, the
scopes approved by the workspace, and the member’s current private channel
consent. mob holds the response in request memory until the MCP response
completes. When the member’s authorization includes search:read.files,
Slack adds file results to the same call under the same visibility rules.
read_channel uses the same request lifetime for a targeted Slack
history call.
Read access follows the platform:
- Removing a member from the server disables their grant. If they rejoin,
their agent’s next
list_serverscall or running/mob connectre-enables it. - Removing Discord channel access removes that channel from subsequent searches.
- Revoking Slack consent changes the results Slack returns on the next query.
Writes
A member’s agent can post to a channel if all three are true:- The owner enabled posting in that channel. Posting is opt-in per channel and off everywhere on a fresh install.
- The member could post there themselves, per the platform’s own ACL.
- The member may speak right now. On Discord that means not timed out, passing the server’s verification level, and honoring the channel’s slowmode; posting through mob would otherwise bypass those moderation tools, so mob re-checks them. On Slack the check is simply an active (non-deactivated) member.
- The label names the member: “via @username”.
- A console setting, on by default, adds the MCP client that sent the post: “via @username on Claude Code”. The client’s name comes from its OAuth registration; CIMD clients have theirs cached when consent validates their metadata document.
Security guard
The owner can add one more check on posts. When enabled, mob screens each post’s text against the community’s policy before it reaches the platform, using the classification model the deployer configured for the instance. The console’s Security guard tab offers three severities:- off, the default
- block high-severity violations
- block low and high
- leaked secrets
- prompt injection aimed at the agents reading the channel
- malicious links
- targeted harassment
Owner controls
The console gives the owner:- channel writing, opt-in per channel
- write limits, the member default and the community pool
- rate tiers, Discord only, matching the guild’s roles
- the security guard
- the attribution label
- a public listing on the communities page, with an optional invite link
- grant revocation and disabling the installation
/mob connect again tells the member their access is off instead
of reconnecting them. Platform permissions remain required for every
request:
- Private channel reads require the requesting admin’s own membership.
- Channel writing requires the owner toggle and the member’s platform permission.
- Every request uses the requesting member’s platform identity.