内容
# teamsctl 🤖
你是否曾经想过…… 🤔
> "天哪,如果能更轻松地给同事发送 AI 生成的内容和回复该多好啊……"
或者
> "老天,我讨厌跟 Mike 说话!Mike 太烦人了,他有很酷的故事和短小的手臂。我希望他能跟 Claude 或 GPT 或其他中国模型聊天,那些模型根本不知道天安门广场是什么。"
或者
> "在团队中使用 LLM 并在里面提到我的名字是个极棒的主意!"
## 我有解决方案! 🫵
现在,**40%** 更多内容,**20x** 更多废话,还有 **100%** 从头到尾都注入了 vibe 的代码 —— **现在你可以!**
隆重推出 **teamsctl**(teams cuddle,因为它听起来很可爱)。
这允许你从命令行使用 teams…… **但还有更多!**
限时优惠,现在你可以试用我们的全新 **MCP 服务器**! 🔌
哇!你说什么?这听起来是不是一个很棒的想法?
只需 **4.99$**,你就可以获得一个终身订阅服务,里面包含一个 vibe 编码的 Go 项目和一个简陋且 hacky 的身份验证方法!
所以,如果你想把跟 Mike 或其他同事的对话外包出去,**这** 就是你的解决方案!
---
**我个人没有审查任何内容 💪**
> 我:"GPT5.6,请帮我生成这个"
> GPT5.6:"_BEEP_ _BOOP_ 好吧" _直接生成 800 行 Go 代码到一个文件中_
看,**这** 就是现代人做事的方式! 🚀
## 安装
使用 Homebrew:
```sh
brew install TheSinding/tap/teamsctl
```
或者直接安装最新版本:
```sh
wget -qO- https://raw.githubusercontent.com/TheSinding/teamsctl/main/scripts/install.sh | sh
```
在没有 `wget` 的 macOS 上使用:
```sh
curl -fsSL https://raw.githubusercontent.com/TheSinding/teamsctl/main/scripts/install.sh | sh
```
该命令会将二进制文件安装到 `${HOME}/.local/bin/teamsctl`。从 Git 检出源码后,可以构建并安装当前源代码:
```bash
make install
sudo make install PREFIX=/usr/local
```
其他目标:`make build`、`make test`、`make uninstall`。
在使用 CLI 或 MCP 服务器之前,请先进行身份验证:
```bash
teamsctl auth
```
身份验证会打开 Chrome,并使用持久性配置文件,将令牌写入 `~/.config/fossteams`。需要 Chrome;不需要 Node 和 Electron。
可选的自动填充:
```bash
TEAMS_EMAIL="$EMAIL" TEAMS_PASSWORD="$PASSWORD" TEAMS_OTP="$OTP" teamsctl auth
```
当 Chrome 未安装在其平台默认路径时,请使用 `CHROME_PATH`。
## CLI
| 命令 | 行为 |
|---|---|
| `teamsctl auth [-email ADDRESS] [-chrome PATH] [-timeout 5m]` | 刷新所有必需的 Teams 令牌。 |
| `teamsctl conversations` | 以 JSON 格式打印每个聊天和频道,包括可用的对话 ID。 |
| `teamsctl messages [-limit 50] [-name TITLE] ID` | 按时间顺序打印最新消息。`-limit 0` 返回所有已获取的消息。 |
| `teamsctl send [-format text\|html] [-mention NAME] ID [MESSAGE...]` | 发送消息。当省略 `MESSAGE` 时,从标准输入读取。重复 `-mention` 以提及多个人。 |
| `teamsctl mcp` | 在标准输入/输出上运行 MCP 服务器。 |
| `teamsctl version` | 打印从构建时嵌入的 Git 标签的版本号。 |
聊天记录可以包含 `ids` 中的备用 ID。命令接受以逗号分隔的候选 ID,并按顺序尝试它们。
示例:
```bash
teamsctl conversations | jq '.[] | select(.kind == "chat")'
teamsctl messages -limit 10 '19:conversation-id@thread.v2'
printf 'hello world' | teamsctl send '19:conversation-id@thread.v2'
teamsctl send -format html '19:conversation-id@thread.v2' '<strong>Hello</strong>'
teamsctl send -mention Mikkel '19:conversation-id@thread.v2' 'Hello @Mikkel'
```
## MCP
MCP 服务器在初始化期间和每次调用工具之前检查令牌过期情况。当连接因身份验证错误而失败时,请运行 `teamsctl auth`。
| 工具 | 目的 |
|---|---|
| `list_conversations` | 按 `query`、`kind` 和 `limit` 查找聊天/频道。结果缓存 5 分钟。 |
| `get_latest_message` | 解析最佳匹配的一对一聊天并返回其最新消息。 |
| `get_messages` | 使用对话 ID 读取消息。 |
| `send_message` | 发送纯文本或 HTML,带有可选的真实 Teams 提及。 |
使用 `format: "html"` 表示格式化或多部分消息。像 `<strong>@Mikkel</strong>` 这样的 HTML 只是粗体文本:真正的提及也需要 `"mentions": ["Mikkel"]`。未列出的 `@` 文本仍为纯文本。
高级消费者可以使用 `mention_entities` 跳过名称/电子邮件查找,使用 `display_name` 加 `mri` 或 `object_id`。
## 添加到代理
这些示例假设默认安装位置 `${HOME}/.local/bin/teamsctl`。更改代理配置后,请重启代理。
<details>
<summary>OpenCode</summary>
添加到 `~/.config/opencode/opencode.json`:
```json
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"teams": {
"type": "local",
"command": ["{env:HOME}/.local/bin/teamsctl", "mcp"],
"enabled": true
}
}
}
```
</details>
<details>
<summary>Claude 代码</summary>
```bash
claude mcp add --scope user teams -- "$HOME/.local/bin/teamsctl" mcp
```
通过 `claude mcp list` 验证。
</details>
<details>
<summary>Codex</summary>
```bash
codex mcp add teams -- "$HOME/.local/bin/teamsctl" mcp
```
等效的 `~/.codex/config.toml`:
```toml
[mcp_servers.teams]
command = "/bin/sh"
args = ["-c", "exec \"$HOME/.local/bin/teamsctl\" mcp"]
```
</details>
<details>
<summary>Pi</summary>
安装适配器:
```bash
pi install npm:pi-mcp-adapter
```
添加到 `~/.config/mcp/mcp.json`:
```json
{
"mcpServers": {
"teams": {
"command": "/bin/sh",
"args": ["-c", "exec \"$HOME/.local/bin/teamsctl\" mcp"],
"lifecycle": "lazy",
"directTools": true
}
}
}
```
</details>
## 开发
```bash
make test
make build
```