Streaming enabled | Node: {{ activeNode?.container_name || 'None' }}
If you encounter issues accessing image files, try using the Hermes Agent
Dashboard
NODE INFO
Node ID / Name
{{ activeNode?.container_name }}
Host IP
{{ activeNode?.node_address }}
Status
HERMES AGENT INFO
Chat Engine
Model: {{ healthData.model }}
SSH User Audit 1 User
ocuser [psd: abcd1234!]
** If you got "REMOTE HOST IDENTIFICATION HAS CHANGED" problems,
please use "{{ sshCmd_2 }}" to re-generate before ssh command. **
Hermes Agent Dashboard
Hermes Agent Control ↗Access Token
token:da46de9526541a9b198a8067af0e8fad0759ad5c0d02c339
Microsoft Teams Integration Guide CHANNEL
Official Docs ↗How it works: In personal chat, the bot replies to every message (no @mention needed). In group chat & channels, the bot replies only when @mentioned.
Prerequisites
- Hermes Agent installed and accessible (gateway component)
- Node.js / NPM available for the Teams CLI
- A publicly reachable HTTPS endpoint (tunnel for dev, real domain for prod)
- Inference provider API key (e.g.
ANTHROPIC_API_KEY) set in~/.hermes/.env
Step 1 — Install Teams CLI & Login
Install the Microsoft Teams CLI (preview channel) and authenticate:
npm install -g @microsoft/teams.cli@preview
teams login
Tip:
Run teams status --verbose to verify login and get your AAD Object ID (needed for TEAMS_ALLOWED_USERS).
Step 2 — Expose Webhook Port
Teams cannot deliver to localhost. Expose gateway port 3978 via a public HTTPS tunnel:
# Option A: Microsoft devtunnel
devtunnel create hermes-bot --allow-anonymous
devtunnel port create hermes-bot -p 3978 --protocol https
devtunnel host hermes-bot
# Option B: ngrok
ngrok http 3978
# Option C: cloudflared
cloudflared tunnel --url http://localhost:3978
HTTPS required.
Teams rejects self-signed certs. Copy the resulting https:// URL and keep the tunnel running.
Step 3 — Create the Bot
Use the Teams CLI to register the app and set the messaging endpoint. The CLI outputs CLIENT_ID, CLIENT_SECRET, and TENANT_ID — save the secret securely:
teams app create \
--name "Hermes" \
--endpoint "https://<your-tunnel-url>/api/messages"
Step 4 — Configure Environment Variables
Add credentials to ~/.hermes/.env:
# Required
TEAMS_CLIENT_ID=<your-client-id>
TEAMS_CLIENT_SECRET=<your-client-secret>
TEAMS_TENANT_ID=<your-tenant-id>
# Recommended: restrict access by AAD Object ID
TEAMS_ALLOWED_USERS=<aad-object-id-1>,<aad-object-id-2>
config.yaml Alternative
Configure in ~/.hermes/config.yaml under platforms.teams
Optional Flags
TEAMS_ALLOW_ALL_USERS=true • TEAMS_PORT (default 3978)
Security:
Always set TEAMS_ALLOWED_USERS. Protect ~/.hermes/.env with chmod 600.
Step 5 — Start the Gateway
HERMES_UID=$(id -u) HERMES_GID=$(id -g) docker compose up -d gateway
Verify the gateway is ready:
# Health check (expect "ok")
curl http://localhost:3978/health
# Tail logs — look for "Webhook server listening on 0.0.0.0:3978/api/messages"
docker logs -f hermes
Step 6 — Install App in Teams & Verify
Get the install link from the Teams CLI and open it in your browser:
teams app get <teamsAppId> --install-link
Open the link → Teams will launch → send a DM to the bot to confirm it responds.
Production Deployment
For a permanent server, update the bot endpoint to your production domain:
teams app update --id <teamsAppId> \
--endpoint "https://your-domain.com/api/messages"
Troubleshooting
Bot doesn't respond
Check tunnel is running & endpoint URL matches
Auth errors
Verify CLIENT_ID, CLIENT_SECRET, TENANT_ID
No inference provider
Set ANTHROPIC_API_KEY in ~/.hermes/.env
Bot ignores messages
Add user AAD Object ID to TEAMS_ALLOWED_USERS
No Node Selected