...

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

{{ activeNode?.status?.state || 'Unknown' }}

HERMES AGENT INFO

Chat Engine

Model: {{ healthData.model }}

{{ healthData.ready ? '🟢 READY' : '🔴 UNCONFIGURED' }}

SSH User Audit 1 User

⚠️ 检测到解析杂质: {{ healthData.foundTrash.join(', ') }}

ocuser [psd: abcd1234!]

{{ sshCmd }}

** 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=trueTEAMS_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