Two kinds of access
Bot Framework. The bot receives messages, replies, posts on its own, and reads the list of people in a chat through the Azure Bot service. None of this needs a permission in the manifest: it comes with the bot being installed. In a group chat or team channel the Bot Framework only delivers messages that mention the bot. Resource-specific consent. The Teams app manifest can ask for permissions that apply to one chat or one team at a time. Whoever installs the app in a chat consents for that chat; a tenant admin can allow or block these for the whole tenant but never has to consent per chat. They are declared in the manifest underauthorization → permissions → resourceSpecific and are tied to the app registration named in webApplicationInfo. This is the model Lua uses.
Lua asks for no tenant-wide Microsoft Graph permission by default. Those require a tenant administrator to consent once for every file, chat or user in the organization. One is optional: Files.Read.All, which lets the agent open files people attach in group chats and channels. See Optional tenant-wide permission.
Permissions the app declares
All seven are resource-specific consent, application type, declared in the Teams app manifest.
What is deliberately not there:
ChatMessage.Send.Chat,ChannelMessage.Send.Group,TeamsActivity.Send.*: replying and posting go through the Bot Framework and need no permission. Adding these grants nothing the agent uses.Sites.Read.All,Sites.ReadWrite.All,Files.ReadWrite.All: the optional file permission below is the read-onlyFiles.Read.All; nothing wider is needed and nothing is ever written to a drive.
Optional tenant-wide permission
Teams does not deliver a file attached with the paperclip, or dragged into a group chat or channel, to a bot. That is a documented Microsoft limitation, not something the manifest can ask for. Lua works around it through Microsoft Graph: it reads Graph’s copy of the message to learn which file was attached, then downloads the file through Graph. That read needs a Microsoft Graph application permission that applies to the whole tenant, so it is not part of the manifest and is off by default. Without it the agent is told that such files do not reach it and says so; pasted images and files sent in a direct message work regardless.
To grant it, a Microsoft 365 administrator opens Microsoft Entra and follows these steps on the app registration behind your own Azure Bot. The shared Lua bot’s registration lives in Lua’s tenant, so it cannot be granted this in yours.
- App registrations, then open the app registration behind the bot.
- API permissions.
- Add a permission.
- Microsoft Graph.
- Application permissions.
- Tick
Files.Read.All, then Add. - Grant admin consent.
Who consents, and when
Permissions apply to a chat or team from the moment the bot is added with them. A bot that was already there before the permissions were added keeps its old grant until it is removed and added again, and publishing a new version of the app resets a team’s grant the same way: until the app is re-added, only mentions reach the bot in that team.
Applying a new version
When a version of the app adds a permission:- Open the app in the Teams Developer Portal, add the permission under Permissions, and increase the app version.
- Publish to org and have the Teams admin approve it, or download the package and upload it under Apps → Manage your apps → Upload a custom app.
- In every group chat and team where the bot already is, remove the bot and add it again. Chats the bot joins later get the new permissions on install.
What the agent knows about its own access
Any of these permissions can be missing in a given chat: the bot was added before the permission existed, the app was updated and not re-added, or the tenant blocks resource-specific consent. The agent is told rather than left to guess.- When the bot is added to a chat or team, and every ten minutes while people talk to it, Lua reads which permissions that chat or team granted. With
TeamsAppInstallation.Read.Chat(or.Group) this is a direct read; without it Lua uses what the turn itself proved, and never claims a permission is missing on that basis alone. - When something is missing the agent’s instructions for that turn say so, in one or two sentences, with the fix: for a chat permission, “the person who added you needs to remove and re-add the app”; for file access, “a Microsoft 365 administrator must grant the Teams app the file permission”. Nothing is added when the grant set is complete.
- The same reading is visible in the admin dashboard: the agent’s Group chats tab shows a Limited permissions label on the conversation with the missing permission names, and the channel card shows Graph unavailable when the tenant does not know the bot’s app at all.
- Agent code reads it as
Lua.request.conversation.access.

