> = {
twitch: "https://docs.spacebot.sh/twitch-setup",
mattermost: "https://docs.spacebot.sh/mattermost-setup",
signal: "https://docs.spacebot.sh/signal-setup",
+ teams: "https://docs.spacebot.sh/teams-setup",
};
// --- Platform Catalog (Left Column) ---
@@ -78,6 +81,7 @@ export function PlatformCatalog({onAddInstance}: PlatformCatalogProps) {
"webhook",
"mattermost",
"signal",
+ "teams",
];
const COMING_SOON = [
@@ -811,6 +815,22 @@ export function AddInstanceCard({
credentials.signal_dm_allowed_users = result.entries.join(",");
}
}
+ } else if (platform === "teams") {
+ if (
+ !credentialInputs.teams_app_id?.trim() ||
+ !credentialInputs.teams_client_secret?.trim() ||
+ !credentialInputs.teams_tenant_id?.trim()
+ ) {
+ setMessage({
+ text: "App ID, client secret, and tenant ID are required",
+ type: "error",
+ });
+ return;
+ }
+ credentials.teams_app_id = credentialInputs.teams_app_id.trim();
+ credentials.teams_client_secret =
+ credentialInputs.teams_client_secret.trim();
+ credentials.teams_tenant_id = credentialInputs.teams_tenant_id.trim();
}
if (!isDefault && !instanceName.trim()) {
@@ -1304,6 +1324,63 @@ export function AddInstanceCard({
>
)}
+ {platform === "teams" && (
+ <>
+
+
+
+ setCredentialInputs({
+ ...credentialInputs,
+ teams_app_id: e.target.value,
+ })
+ }
+ placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
+ />
+
+
+
+
+ setCredentialInputs({
+ ...credentialInputs,
+ teams_client_secret: e.target.value,
+ })
+ }
+ placeholder="Your Azure app client secret"
+ />
+
+
+
+
+ setCredentialInputs({
+ ...credentialInputs,
+ teams_tenant_id: e.target.value,
+ })
+ }
+ placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
+ onKeyDown={(e) => {
+ if (e.key === "Enter") handleSave();
+ }}
+ />
+
+ >
+ )}
+
{platform === "signal" && (
<>
@@ -1521,7 +1598,7 @@ function BindingForm({
)}
- {(platform === "discord" || platform === "slack") && (
+ {(platform === "discord" || platform === "slack" || platform === "teams") && (
+ {(credentialInputs.teams_app_id ?? "").trim() !== "" && (
+ <>
+
+
+ The package uses the default Spacebot icon. To use your own, unzip it, replace
+ icon-color.png (192×192) and icon-outline.png (32×32), and re-zip.
+
+ >
+ )}
>
)}
From 44f913d122b46321c32a1b0d35d5d809e106a136 Mon Sep 17 00:00:00 2001
From: "S.L" <101876007+slvnlrt@users.noreply.github.com>
Date: Mon, 29 Jun 2026 16:07:09 +0200
Subject: [PATCH 8/8] docs(teams): document the Download-app-package button +
manual/icon-swap path
---
docs/content/docs/(messaging)/teams-setup.mdx | 41 +++++++++++++++++--
1 file changed, 38 insertions(+), 3 deletions(-)
diff --git a/docs/content/docs/(messaging)/teams-setup.mdx b/docs/content/docs/(messaging)/teams-setup.mdx
index 927527fca..a590512a5 100644
--- a/docs/content/docs/(messaging)/teams-setup.mdx
+++ b/docs/content/docs/(messaging)/teams-setup.mdx
@@ -37,13 +37,48 @@ Then open **Channels** and add the **Microsoft Teams** channel.
## Step 3: Build and install the Teams app
-Teams needs an app package (a zip with a `manifest.json` and two icons) to surface the bot to users.
+Teams needs an app package (a zip with a `manifest.json` and two icons).
+
+
+
+
+1. In **Settings → Channels**, open the Microsoft Teams card and enter your **App ID** (Step 1).
+2. Click **Download Teams app package**. Spacebot builds a correct `manifest.json` (with the right schema, a distinct app id, and the Spacebot icon) and downloads `spacebot-teams-app.zip`.
+3. Upload it in Teams (**Apps → Manage your apps → Upload an app**).
+
+The package uses the default Spacebot icon. To use your own, unzip it, replace `icon-color.png` (192×192) and `icon-outline.png` (32×32, transparent), and re-zip.
+
+
+
+
+Build the package by hand if you prefer. The `manifest.json`:
-The manifest `id` (the Teams app id) must be its **own** GUID, distinct from the bot's App ID. `bots[].botId` is the App ID from Step 1. Scopes are lowercase (`personal`, `team`, `groupchat`), and `validDomains` plus an `accentColor` are required.
+The manifest `id` (the Teams app id) must be its **own** GUID, distinct from the bot's App ID. `bots[].botId` is the App ID from Step 1. Scopes are lowercase (`personal`, `team`, `groupchat`); `validDomains` and `accentColor` are required; do **not** add a `packageName` key (schema 1.17 rejects it).
-Upload the package in Teams (**Apps** → **Manage your apps** → **Upload an app**). Most tenants require admin approval: approve it in the **Teams admin center** under **Manage apps**, where you can also restrict who may install it.
+```json
+{
+ "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.17/MicrosoftTeams.schema.json",
+ "manifestVersion": "1.17",
+ "version": "1.0.0",
+ "id": "GENERATE-A-FRESH-GUID",
+ "developer": { "name": "Spacebot", "websiteUrl": "https://example.com", "privacyUrl": "https://example.com", "termsOfUseUrl": "https://example.com" },
+ "icons": { "color": "icon-color.png", "outline": "icon-outline.png" },
+ "name": { "short": "Spacebot", "full": "Spacebot — AI assistant" },
+ "description": { "short": "AI assistant powered by Spacebot.", "full": "Chat with your Spacebot agent in Microsoft Teams." },
+ "accentColor": "#6264A7",
+ "bots": [{ "botId": "YOUR-APP-ID", "scopes": ["personal", "team", "groupchat"], "supportsFiles": false, "isNotificationOnly": false }],
+ "validDomains": []
+}
+```
+
+Zip `manifest.json` + `icon-color.png` (192×192) + `icon-outline.png` (32×32) at the **root** of the archive.
+
+
+
+
+Most tenants require admin approval: approve it in the **Teams admin center** under **Manage apps**, where you can also restrict who may install it.
## Step 4: Configure Spacebot