export interface TeamsManifestV1D23 { $schema?: string; /** * The version of the schema this manifest is using. This schema version supports extending * Teams apps to other parts of the Microsoft 365 ecosystem. More info at * https://aka.ms/extendteamsapps. */ manifestVersion: "1.23"; /** * The version of the app. Changes to your manifest should cause a version change. This * version string must follow the semver standard (http://semver.org). */ version: string; /** * A unique identifier for this app. This id must be a GUID. */ id: string; localizationInfo?: LocalizationInfo; developer: Developer; name: NameClass; description: Description; icons: Icons; /** * A color to use in conjunction with the icon. The value must be a valid HTML color code * starting with '#', for example `#4464ee`. */ accentColor: string; /** * These are tabs users can optionally add to their channels and 1:1 or group chats and * require extra configuration before they are added. Configurable tabs are not supported in * the personal scope. Currently only one configurable tab per app is supported. */ configurableTabs?: ConfigurableTab[]; /** * A set of tabs that may be 'pinned' by default, without the user adding them manually. * Static tabs declared in personal scope are always pinned to the app's personal * experience. Static tabs do not currently support the 'teams' scope. */ staticTabs?: StaticTab[]; /** * The set of bots for this app. Currently only one bot per app is supported. */ bots?: Bot[]; /** * The set of Office365 connectors for this app. Currently only one connector per app is * supported. */ connectors?: Connector[]; /** * Subscription offer associated with this app. */ subscriptionOffer?: SubscriptionOffer; /** * The set of compose extensions for this app. Currently only one compose extension per app * is supported. */ composeExtensions?: ComposeExtension[]; /** * Specifies the permissions the app requests from users. */ permissions?: Permission[]; /** * Specify the native features on a user's device that your app may request access to. */ devicePermissions?: DevicePermission[]; /** * A list of valid domains from which the tabs expect to load any content. Domain listings * can include wildcards, for example `*.example.com`. If your tab configuration or content * UI needs to navigate to any other domain besides the one use for tab configuration, that * domain must be specified here. */ validDomains?: string[]; /** * Specify your AAD App ID and Graph information to help users seamlessly sign into your AAD * app. */ webApplicationInfo?: WebApplicationInfo; /** * Specify the app's Graph connector configuration. If this is present then * webApplicationInfo.id must also be specified. */ graphConnector?: GraphConnector; /** * A value indicating whether or not show loading indicator when app/tab is loading */ showLoadingIndicator?: boolean; /** * A value indicating whether a personal app is rendered without a tab header-bar */ isFullScreen?: boolean; activities?: Activities; /** * A list of tenant configured properties for an app */ configurableProperties?: ConfigurableProperty[]; /** * List of 'non-standard' channel types that the app supports. Note: Channels of standard * type are supported by default if the app supports team scope. */ supportedChannelTypes?: SupportedChannelType[]; /** * A value indicating whether an app is blocked by default until admin allows it */ defaultBlockUntilAdminAction?: boolean; /** * The url to the page that provides additional app information for the admins */ publisherDocsUrl?: string; /** * The install scope defined for this app by default. This will be the option displayed on * the button when a user tries to add the app */ defaultInstallScope?: DefaultInstallScope; /** * When a group install scope is selected, this will define the default capability when the * user installs the app */ defaultGroupCapability?: DefaultGroupCapability; /** * Specify meeting extension definition. */ meetingExtensionDefinition?: MeetingExtensionDefinition; /** * Specify and consolidates authorization related information for the App. */ authorization?: TeamsManifestV1D23Authorization; extensions?: ElementExtension[]; /** * Defines the list of cards which could be pinned to dashboards that can provide summarized * view of information relevant to user. */ dashboardCards?: DashboardCard[]; copilotAgents?: CopilotAgents; /** * The Intune-related properties for the app. */ intuneInfo?: IntuneInfo; elementRelationshipSet?: ElementRelationshipSet; /** * Optional property containing background loading configuration. By opting in to this * performance enhancement, your app is eligible to be loaded in the background in any * Microsoft 365 application host that supports this feature. */ backgroundLoadConfiguration?: BackgroundLoadConfiguration; } export interface Activities { /** * Specify the types of activites that your app can post to a users activity feed */ activityTypes?: ActivityType[]; /** * Specify the customized icons that your app can post to a users activity feed */ activityIcons?: ActivityIcon[]; } export interface ActivityIcon { /** * Represents the unique icon ID. */ id: string; /** * Represents the relative path to the icon image. Image should be size 32x32. */ iconFile: string; } export interface ActivityType { type: string; description: string; templateText: string; /** * An array containing valid icon IDs per activity type. */ allowedIconIds?: string[]; } /** * Specify and consolidates authorization related information for the App. */ export interface TeamsManifestV1D23Authorization { /** * List of permissions that the app needs to function. */ permissions?: Permissions; } /** * List of permissions that the app needs to function. */ export interface Permissions { /** * Permissions that must be granted on a per resource instance basis. */ resourceSpecific?: ResourceSpecific[]; } export interface ResourceSpecific { /** * The name of the resource-specific permission. */ name: string; /** * The type of the resource-specific permission: delegated vs application. */ type: ResourceSpecificType; } /** * The type of the resource-specific permission: delegated vs application. */ export type ResourceSpecificType = "Application" | "Delegated"; /** * Optional property containing background loading configuration. By opting in to this * performance enhancement, your app is eligible to be loaded in the background in any * Microsoft 365 application host that supports this feature. */ export interface BackgroundLoadConfiguration { /** * Optional property within backgroundLoadConfiguration containing tab settings for * background loading. */ tabConfiguration?: TabConfiguration; } /** * Optional property within backgroundLoadConfiguration containing tab settings for * background loading. */ export interface TabConfiguration { /** * Required URL for background loading. This can be the same contentUrl from the staticTabs * section or an alternative endpoint used for background loading. */ contentUrl: string; } export interface Bot { /** * The Microsoft App ID specified for the bot in the Bot Framework portal * (https://dev.botframework.com/bots) */ botId: string; configuration?: Configuration; /** * This value describes whether or not the bot utilizes a user hint to add the bot to a * specific channel. */ needsChannelSelector?: boolean; /** * A value indicating whether or not the bot is a one-way notification only bot, as opposed * to a conversational bot. */ isNotificationOnly?: boolean; /** * A value indicating whether the bot supports uploading/downloading of files. */ supportsFiles?: boolean; /** * A value indicating whether the bot supports audio calling. */ supportsCalling?: boolean; /** * A value indicating whether the bot supports video calling. */ supportsVideo?: boolean; /** * Specifies whether the bot offers an experience in the context of a channel in a team, in * a group chat (groupChat), an experience scoped to an individual user alone (personal) OR * within Copilot surfaces. These options are non-exclusive. */ scopes: CommandListScope[]; /** * The list of commands that the bot supplies, including their usage, description, and the * scope for which the commands are valid. A separate command list should be used for each * scope. */ commandLists?: CommandList[]; requirementSet?: ElementRequirementSet; /** * System‑generated metadata. This information is maintained by Microsoft services and must * not be modified manually. */ registrationInfo?: RegistrationInfo; } export interface CommandList { /** * Specifies the scopes for which the command list is valid */ scopes: CommandListScope[]; commands: CommandListCommand[]; } export interface CommandListCommand { /** * The bot command name */ title: string; /** * A simple text description or an example of the command syntax and its arguments. */ description: string; } export type CommandListScope = "team" | "personal" | "groupChat" | "copilot"; export interface Configuration { team?: Team; groupChat?: Team; } export interface Team { fetchTask?: boolean; taskInfo?: TaskInfo; } export interface TaskInfo { /** * Initial dialog title */ title?: string; /** * Dialog width - either a number in pixels or default layout such as 'large', 'medium', or * 'small' */ width?: string; /** * Dialog height - either a number in pixels or default layout such as 'large', 'medium', or * 'small' */ height?: string; /** * Initial webview URL */ url?: string; } /** * System‑generated metadata. This information is maintained by Microsoft services and must * not be modified manually. */ export interface RegistrationInfo { /** * The partner source through which the bot is registered. System‑generated metadata. This * information is maintained by Microsoft services and must not be modified manually. */ source: Source; /** * A Power Platform environment that serves as a container for building apps under a * Microsoft 365 tenant and can only be accessed by users within that tenant. * System‑generated metadata. This information is maintained by Microsoft services and must * not be modified manually. */ environment?: string; /** * The Copilot Studio copilot schema name. System‑generated metadata. This information is * maintained by Microsoft services and must not be modified manually. */ schemaName?: string; /** * The core services cluster category for Copilot Studio copilots. System‑generated * metadata. This information is maintained by Microsoft services and must not be modified * manually. */ clusterCategory?: string; } /** * The partner source through which the bot is registered. System‑generated metadata. This * information is maintained by Microsoft services and must not be modified manually. */ export type Source = "standard" | "microsoftCopilotStudio" | "onedriveSharepoint"; /** * An object representing a set of requirements that the host must support for the element. */ export interface ElementRequirementSet { hostMustSupportFunctionalities: HostFunctionality[]; } /** * An object representing a specific functionality that a host must support. */ export interface HostFunctionality { /** * The name of the functionality. */ name: HostMustSupportFunctionalityName; } /** * The name of the functionality. */ export type HostMustSupportFunctionalityName = "dialogUrl" | "dialogUrlBot" | "dialogAdaptiveCard" | "dialogAdaptiveCardBot"; export interface ComposeExtension { /** * A unique identifier for the compose extension. */ id?: string; /** * The Microsoft App ID specified for the bot powering the compose extension in the Bot * Framework portal (https://dev.botframework.com/bots) */ botId?: string; /** * Type of the compose extension. */ composeExtensionType?: ComposeExtensionType; /** * Object capturing authorization information. */ authorization?: ComposeExtensionAuthorization; /** * A relative file path to the api specification file in the manifest package. */ apiSpecificationFile?: string; /** * A value indicating whether the configuration of a compose extension can be updated by the * user. */ canUpdateConfiguration?: boolean | null; commands?: ComposeExtensionCommand[]; /** * A list of handlers that allow apps to be invoked when certain conditions are met */ messageHandlers?: MessageHandler[]; requirementSet?: ElementRequirementSet; } /** * Object capturing authorization information. */ export interface ComposeExtensionAuthorization { /** * Enum of possible authentication types. */ authType?: AuthType; /** * Object capturing details needed to do single aad auth flow. It will be only present when * auth type is entraId. */ microsoftEntraConfiguration?: MicrosoftEntraConfiguration; /** * Object capturing details needed to do service auth. It will be only present when auth * type is apiSecretServiceAuth. */ apiSecretServiceAuthConfiguration?: APISecretServiceAuthConfiguration; } /** * Object capturing details needed to do service auth. It will be only present when auth * type is apiSecretServiceAuth. */ export interface APISecretServiceAuthConfiguration { /** * Registration id returned when developer submits the api key through Developer Portal. */ apiSecretRegistrationId?: string; } /** * Enum of possible authentication types. */ export type AuthType = "none" | "apiSecretServiceAuth" | "microsoftEntra"; /** * Object capturing details needed to do single aad auth flow. It will be only present when * auth type is entraId. */ export interface MicrosoftEntraConfiguration { /** * Boolean indicating whether single sign on is configured for the app. */ supportsSingleSignOn?: boolean; } export interface ComposeExtensionCommand { /** * Id of the command. */ id: string; /** * Type of the command */ type?: CommandType; samplePrompts?: SamplePrompt[]; /** * A relative file path for api response rendering template file. */ apiResponseRenderingTemplateFile?: string; /** * Context where the command would apply */ context?: CommandContext[]; /** * Title of the command. */ title: string; /** * Description of the command. */ description?: string; /** * A boolean value that indicates if the command should be run once initially with no * parameter. */ initialRun?: boolean; /** * A boolean value that indicates if it should fetch task module dynamically */ fetchTask?: boolean; /** * Semantic description for the command. */ semanticDescription?: string; parameters?: Parameter[]; taskInfo?: TaskInfo; } export type CommandContext = "compose" | "commandBox" | "message"; export interface Parameter { /** * Name of the parameter. */ name: string; /** * Type of the parameter */ inputType?: InputType; /** * Title of the parameter. */ title: string; /** * Description of the parameter. */ description?: string; /** * Initial value for the parameter */ value?: string; /** * The value indicates if this parameter is a required field. */ isRequired?: boolean; /** * Semantic description for the parameter. */ semanticDescription?: string; /** * The choice options for the parameter */ choices?: Choice[]; } export interface Choice { /** * Title of the choice */ title: string; /** * Value of the choice */ value: string; } /** * Type of the parameter */ export type InputType = "text" | "textarea" | "number" | "date" | "time" | "toggle" | "choiceset"; export interface SamplePrompt { /** * This string will hold the sample prompt */ text: string; } /** * Type of the command */ export type CommandType = "query" | "action"; /** * Type of the compose extension. */ export type ComposeExtensionType = "botBased" | "apiBased"; export interface MessageHandler { /** * Type of the message handler */ type: "link"; value: Value; } /** * Type of the message handler */ export interface Value { /** * A list of domains that the link message handler can register for, and when they are * matched the app will be invoked */ domains?: string[]; /** * A boolean that indicates whether the app's link message handler supports anonymous invoke * flow. */ supportsAnonymizedPayloads?: boolean; } export type ConfigurableProperty = "name" | "shortDescription" | "longDescription" | "smallImageUrl" | "largeImageUrl" | "accentColor" | "developerUrl" | "privacyUrl" | "termsOfUseUrl"; export interface ConfigurableTab { /** * A unique identifier for the tab. This id must be unique within the app manifest. */ id?: string; /** * The url to use when configuring the tab. */ configurationUrl: string; /** * A value indicating whether an instance of the tab's configuration can be updated by the * user after creation. */ canUpdateConfiguration?: boolean; /** * Specifies whether the tab offers an experience in the context of a channel in a team, in * a 1:1 or group chat, or in an experience scoped to an individual user alone. These * options are non-exclusive. Currently, configurable tabs are only supported in the teams * and groupchats scopes. */ scopes: ConfigurableTabScope[]; /** * The set of meetingSurfaceItem scopes that a tab belong to */ meetingSurfaces?: MeetingSurface[]; /** * The set of contextItem scopes that a tab belong to */ context?: ConfigurableTabContext[]; /** * A relative file path to a tab preview image for use in SharePoint. Size 1024x768. */ sharePointPreviewImage?: string; /** * Defines how your tab will be made available in SharePoint. */ supportedSharePointHosts?: SupportedSharePointHost[]; } export type ConfigurableTabContext = "personalTab" | "channelTab" | "privateChatTab" | "meetingChatTab" | "meetingDetailsTab" | "meetingSidePanel" | "meetingStage"; export type MeetingSurface = "sidePanel" | "stage"; export type ConfigurableTabScope = "team" | "groupChat"; export type SupportedSharePointHost = "sharePointFullPage" | "sharePointWebPart"; export interface Connector { /** * A unique identifier for the connector which matches its ID in the Connectors Developer * Portal. */ connectorId: string; /** * The url to use for configuring the connector using the inline configuration experience. */ configurationUrl?: string; /** * Specifies whether the connector offers an experience in the context of a channel in a * team, or an experience scoped to an individual user alone. Currently, only the team scope * is supported. */ scopes: "team"[]; } export interface CopilotAgents { /** * An array of declarative agent elements references. Currently, only one declarative agent * per application is supported. */ declarativeAgents?: DeclarativeAgentRef[]; /** * An array of Custom Engine Agents. Currently only one Custom Engine Agent per application * is supported. Support is currently in public preview. */ customEngineAgents?: CustomEngineAgent[]; } export interface CustomEngineAgent { /** * The id of the Custom Engine Agent. If it is of type bot, the id must match the id * specified in a bot in the bots node and the referenced bot must have personal scope. The * app short name and short description must also be defined. */ id: string; /** * The type of the Custom Engine Agent. Currently only type bot is supported. */ type: "bot"; disclaimer?: Disclaimer; } export interface Disclaimer { /** * The message shown to users before they interact with this application. */ text: string; [property: string]: any; } /** * The type of the Custom Engine Agent. Currently only type bot is supported. * * The content of the dashboard card is sourced from a bot. */ /** * A reference to a declarative agent element. The element's definition is in a separate * file. */ export interface DeclarativeAgentRef { /** * A unique identifier for this declarative agent element. */ id: string; /** * Relative file path to this declarative agent element file in the application package. */ file: string; } /** * Cards wich could be pinned to dashboard providing summarized view of information relevant * to user. */ export interface DashboardCard { /** * Unique Id for the card. Must be unique inside the app. */ id: string; /** * Represents the name of the card. Maximum length is 255 characters. */ displayName: string; /** * Description of the card.Maximum length is 255 characters. */ description: string; /** * Id of the group in the card picker. This must be guid. */ pickerGroupId: string; icon?: DashboardCardIcon; contentSource: DashboardCardContentSource; /** * Rendering Size for dashboard card. */ defaultSize: DefaultSize; } /** * Represents a configuration for the source of the card’s content. */ export interface DashboardCardContentSource { /** * The content of the dashboard card is sourced from a bot. */ sourceType?: "bot"; /** * The configuration for the bot source. Required if sourceType is set to bot. */ botConfiguration?: BotConfiguration; } /** * The configuration for the bot source. Required if sourceType is set to bot. */ export interface BotConfiguration { /** * The unique Microsoft app ID for the bot as registered with the Bot Framework. */ botId?: string; } /** * Rendering Size for dashboard card. */ export type DefaultSize = "medium" | "large"; /** * Represents a configuration for the source of the card’s content */ export interface DashboardCardIcon { /** * The icon for the card, to be displayed in the toolbox and card bar, represented as URL. */ iconUrl?: string; /** * Office UI Fabric/Fluent UI icon friendly name for the card. This value will be used if * ‘iconUrl’ is not specified. */ officeUIFabricIconName?: string; } /** * When a group install scope is selected, this will define the default capability when the * user installs the app */ export interface DefaultGroupCapability { /** * When the install scope selected is Team, this field specifies the default capability * available */ team?: Groupchat; /** * When the install scope selected is GroupChat, this field specifies the default capability * available */ groupchat?: Groupchat; /** * When the install scope selected is Meetings, this field specifies the default capability * available */ meetings?: Groupchat; } /** * When the install scope selected is GroupChat, this field specifies the default capability * available * * When the install scope selected is Meetings, this field specifies the default capability * available * * When the install scope selected is Team, this field specifies the default capability * available */ export type Groupchat = "tab" | "bot" | "connector"; /** * The install scope defined for this app by default. This will be the option displayed on * the button when a user tries to add the app */ export type DefaultInstallScope = "personal" | "team" | "groupChat" | "meetings" | "copilot"; export interface Description { /** * A short description of the app used when space is limited. Maximum length is 80 * characters. */ short: string; /** * The full description of the app. Maximum length is 4000 characters. */ full: string; } export interface Developer { /** * The display name for the developer. */ name: string; /** * The Microsoft Partner Network ID that identifies the partner organization building the * app. This field is not required, and should only be used if you are already part of the * Microsoft Partner Network. More info at https://aka.ms/partner */ mpnId?: string; /** * The url to the page that provides support information for the app. */ websiteUrl: string; /** * The url to the page that provides privacy information for the app. */ privacyUrl: string; /** * The url to the page that provides the terms of use for the app. */ termsOfUseUrl: string; } export type DevicePermission = "geolocation" | "media" | "notifications" | "midi" | "openExternal"; export interface ElementRelationshipSet { /** * An array containing multiple instances of unidirectional dependency relationships (each * represented by a oneWayDependency object). */ oneWayDependencies?: OneWayDependency[]; /** * An array containing multiple instances of mutual dependency relationships between * elements (each represented by a mutualDependency object). */ mutualDependencies?: Array; } /** * A specific instance of mutual dependency between two or more elements, indicating that * each element depends on the others in a bidirectional manner. */ export interface ElementReference { name: MutualDependencyName; id: string; commandIds?: string[]; } export type MutualDependencyName = "bots" | "staticTabs" | "composeExtensions" | "configurableTabs"; /** * An object representing a unidirectional dependency relationship, where one specific * element (referred to as the `element`) relies on an array of other elements (referred to * as the `dependsOn`) in a single direction. */ export interface OneWayDependency { element: ElementReference; dependsOn: ElementReference[]; } /** * The set of extensions for this app. Currently only one extensions per app is supported. */ export interface ElementExtension { requirements?: RequirementsExtensionElement; runtimes?: ExtensionRuntimesArray[]; ribbons?: ExtensionRibbonsArray[]; autoRunEvents?: ExtensionAutoRunEventsArray[]; alternates?: ExtensionAlternateVersionsArray[]; contentRuntimes?: ExtensionContentRuntimeArray[]; getStartedMessages?: ExtensionGetStartedMessageArray[]; contextMenus?: ExtensionContextMenuArray[]; keyboardShortcuts?: ExtensionKeyboardShortcut[]; /** * The url for your extension, used to validate Exchange user identity tokens. */ audienceClaimUrl?: string; } export interface ExtensionAlternateVersionsArray { requirements?: RequirementsExtensionElement; prefer?: Prefer; hide?: Hide; alternateIcons?: AlternateIcons; } export interface AlternateIcons { icon: ExtensionCommonIcon; highResolutionIcon: ExtensionCommonIcon; } export interface ExtensionCommonIcon { /** * Size in pixels of the icon. Three image sizes are required (16, 32, and 80 pixels) */ size: number; /** * Absolute Url to the icon. */ url: string; } export interface Hide { storeOfficeAddin?: StoreOfficeAddin; customOfficeAddin?: CustomOfficeAddin; [property: string]: any; } export interface CustomOfficeAddin { /** * Solution ID of the in-market add-in to hide. Maximum length is 64 characters. */ officeAddinId: string; } export interface StoreOfficeAddin { /** * Solution ID of an in-market add-in to hide. Maximum length is 64 characters. */ officeAddinId: string; /** * Asset ID of the in-market add-in to hide. Maximum length is 64 characters. */ assetId: string; } export interface Prefer { comAddin?: COMAddin; xllCustomFunctions?: ExtensionXllCustomFunctions; [property: string]: any; } export interface COMAddin { /** * Program ID of the alternate com extension. Maximum length is 64 characters. */ progId: string; } export interface ExtensionXllCustomFunctions { fileName?: string; [property: string]: any; } /** * Specifies limitations on which clients the add-in can be installed on, including * limitations on the Office host application, the form factors, and the requirement sets * that the client must support. * * Specifies the Office requirement sets. */ export interface RequirementsExtensionElement { capabilities?: Capability[]; /** * Identifies the scopes in which the add-in can run. Supported values: 'mail', 'workbook', * 'document', 'presentation'. */ scopes?: RequirementsScope[]; /** * Identifies the form factors that support the add-in. Supported values: mobile, desktop. */ formFactors?: FormFactor[]; } export interface Capability { /** * Identifies the name of the requirement sets that the add-in needs to run. */ name: string; /** * Identifies the minimum version for the requirement sets that the add-in needs to run. */ minVersion?: string; /** * Identifies the maximum version for the requirement sets that the add-in needs to run. */ maxVersion?: string; } export type FormFactor = "desktop" | "mobile"; export type RequirementsScope = "mail" | "workbook" | "document" | "presentation"; export interface ExtensionAutoRunEventsArray { requirements?: RequirementsExtensionElement; /** * Specifies the type of event. For supported types, please see: * https://learn.microsoft.com/en-us/office/dev/add-ins/outlook/autolaunch?tabs=xmlmanifest#supported-events. */ events: Event[]; } export interface Event { type: string; /** * The ID of an action defined in runtimes. Maximum length is 64 characters. */ actionId: string; /** * Configures how Outlook responds to the event. */ options?: Options; } /** * Configures how Outlook responds to the event. */ export interface Options { sendMode: SendMode; } export type SendMode = "promptUser" | "softBlock" | "block"; /** * Content runtime is for 'ContentApp', which can be embedded directly into Excel or * PowerPoint documents. */ export interface ExtensionContentRuntimeArray { /** * Specifies the Office requirement sets for content add-in runtime. If the user's Office * version doesn't support the specified requirements, the component will not be available * in that client. */ requirements?: ContentRuntimeRequirements; /** * A unique identifier for this runtime within the app. This is developer specified. */ id: string; /** * Specifies the location of code for this runtime. Depending on the runtime.type, add-ins * use either a JavaScript file or an HTML page with an embedded