Install
$ agentstack add skill-alxxpersonal-forge-exo-teams ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
exo-teams
Go CLI for Microsoft Teams using the internal (desktop app) API. No admin consent, no Graph API registration, no IT department. Tokens stored at ~/.exo-teams/.
Auth
Five token scopes, all acquired via device code OAuth (exo-teams auth):
| Token | Used for | |-------|----------| | skype | messaging, activity feed, read receipts | | chatsvcagg | teams/channels/chats listing | | teams | middle tier ops | | graph | calendar, files, search, user profiles | | assignments | education assignments via assignments.onenote.com (bypasses admin consent) |
Tokens auto-refresh. Check status with exo-teams whoami.
Skypetoken quirk: messaging uses Authentication: skypetoken= header, NOT Authorization: Bearer. The skypetoken is derived from the raw skype JWT via an authz exchange endpoint.
Quick Start
exo-teams auth # device code login
exo-teams whoami # token status + account info
exo-teams list-teams # see all teams, channels, and channel IDs
exo-teams list-chats # all DMs and group chats with IDs
Command Reference
See references/commands.md for full flag docs. Quick map:
| Command | What it does | |---------|-------------| | auth [--import\|--refresh] | login, import from fossteams, or force refresh | | whoami | account info + per-token expiry | | list-teams | all teams + channels with IDs | | list-chats | all DMs + group chats with IDs | | get-messages | channel messages by name search or ID | | get-chat | DM/group chat messages | | send | send text to any conversation | | send-file --file | upload file to OneDrive, send share link | | new-dm | find user by name, open DM, send message | | files | list SharePoint files | | upload --path --file | upload to SharePoint | | download --path | download from SharePoint | | calendar [--days N] | upcoming calendar events (default 7 days) | | assignments [--classes] | all assignments with submission status | | submit --file | submit a file to an assignment | | deadlines | pending assignments sorted by due date | | unread | unread conversations at a glance | | activity | activity feed (mentions, replies, reactions) | | search | search messages + files | | mark-read | mark conversation as read |
All commands accept --json for machine-readable output.
Data Discovery Guide
See references/data-discovery.md for full patterns. Critical ones:
Find team/channel IDs:
exo-teams list-teams
# Output: == Team Name == / #channel-name 19:abc123@thread.tacv2
Find chat/DM IDs:
exo-teams list-chats
# Output: * [DM] Person Name 19:abc@unq.gbl.spaces
Find your user ID:
exo-teams whoami --json
# or: exo-teams new-dm "their name" "" (prints found user ID to stderr)
Find assignment IDs:
exo-teams assignments --classes # list class IDs
exo-teams assignments --json # includes classId, id, submissionId
Key Gotchas
- Conversation IDs contain
:and@- they are always URL-encoded internally, but pass them raw to CLI args chat.hiddenis unreliable - most active DMs havehidden=true, uselist-chatsnot hidden filterannotationsSummary.emotionsreturns either[]anyormap[string]anydepending on message- File upload to DMs uses OneDrive ("Microsoft Teams Chat Files" folder) + share link, not AMS
- SharePoint upload (team files) uses Graph PUT to
/groups/{id}/drive/root:/{path}:/content - 423 on OneDrive upload means file is locked - tool auto-retries with deduped name up to 5 times
- Activity feed reads from a special conversation ID
48:notifications - Unread status comes from
isReadfield on Chat which can be bool or null - null means read - Search uses Graph
/search/querywithmessage+driveItementity types (no Chat.Read needed) assignmentscommand usesassignments.onenote.comAPI not Graph/education/(bypasses admin consent)
Common Patterns
# Check what needs submitting today
exo-teams deadlines
# Read a specific channel
exo-teams get-messages "Academic Writing" --replies --count 50
# Read all messages ever (paginated)
exo-teams get-messages "General" --all
# Messages after a date
exo-teams get-messages "General" --since 2026-03-01
# Send a file to a DM
exo-teams send-file "19:abc@unq.gbl.spaces" --file report.pdf --message "here it is"
# Multi-file send
exo-teams send-file "19:abc@unq.gbl.spaces" --file a.pdf --file b.docx
# Download class material
exo-teams files "Academic Writing" --drive "Class Materials"
exo-teams download "Academic Writing" --path "Class Materials/week1.pdf" --drive "Class Materials"
# Submit assignment
exo-teams submit "Academic Writing" "Essay 1" --file essay.docx
# Export channel to JSON
exo-teams get-messages "General" --all --json > general.json
Scripting Patterns
See references/scripting.md for full automation examples including:
- Fetch all pending assignments + download class materials
- Monitor channel for new messages (poll loop)
- Export full conversation to markdown
- Bulk-send files across multiple conversations
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: alxxpersonal
- Source: alxxpersonal/forge
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.