内容
# baresip-mcp
一款代表LLM客户端驱动[Baresip](https://github.com/baresip/baresip)的MCP服务器。
它一开始拥有一个空的集群;账户在运行时通过`register`工具引入,每个账户都有自己的无头Baresip子进程、
自己的临时目录、SIP端口和`ctrl_tcp`监听器。它发布了一组类型化的工具和一个`recent_events`查询,用于异步事件流。
## 架构
```
┌─▶ Baresip(账户 A)
LLM 客户端 ──标准输入/输出 MCP ──▶ baresip-mcp ─────┼─▶ Baresip(账户 B)
└─▶ Baresip(账户 C)
```
- `pkg/baresip` — 带有净字符串分帧的TCP客户端,JSON命令/响应通过令牌关联,异步事件通道和重连-重试。
- `cmd/baresip-mcp` — MCP标准输入/输出服务器使用[`github.com/modelcontextprotocol/go-sdk`](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk);管理每个账户的Baresip集群。
每个账户一个进程是故意的:sipgate在两个本地账户之间进行INVITE循环,所以每个腿都需要自己的SIP套接字以避免状态机冲突。
## 工具
| 工具 | 描述 |
|------------------|------------------------------------------------------|
| `dial` | 拨打一个SIP URI的呼叫 |
| `accept` | 接听一个来电 |
| `hangup` | 挂断当前呼叫 |
| `hangup_all` | 挂断所有呼叫,可选按方向过滤 |
| `list_calls` | 列出活跃的呼叫 |
| `call_status` | 当前呼叫的状态 |
| `reginfo` | SIP注册状态 |
| `hold` | 保持/恢复活跃的呼叫 |
| `mute` | 静音/取消静音活跃的呼叫 |
| `transfer` | 盲转当前呼叫 |
| `dtmf` | 发送DTMF数字 |
| `register` | 引入一个账户(AOR + 密码)并注册它;也可以设置自动应答、传输、出站代理(重启子进程) |
| `unregister` | 注销一个账户 |
| `inspect_account`| 显示每个子账户的账户行、临时目录、`ctrl_tcp`地址和Baresip日志尾部 |
| `recent_events` | 以JSON格式返回最近的异步Baresip事件 |
| `wait_for_event` | 阻塞直到匹配的事件到达(按类型/呼叫ID/AOR) |
| `command` | 原始的逃生口,用于任何Baresip长格式命令 |
## Baresip 配置
您**不需要**自己运行Baresip或手动配置`ctrl_tcp` — baresip-mcp为每个注册账户启动一个Baresip子进程,并将必要的配置写入每个子进程的临时目录。
baresip-mcp **不读取**账户文件。账户在运行时通过`register` MCP工具(AOR + `password`,以及可选的`username` / `extra_params`)引入。凭证仅存储在内存中和启动的子进程的临时目录中。
`baresip`二进制文件必须在`PATH`上,并且Baresip模块目录必须是可发现的(如果您的安装将模块存储在非标准位置,请设置`BARESIP_MODPATH`)。
## 构建和运行
```sh
go build ./cmd/baresip-mcp
./baresip-mcp
```
服务器通过标准输入/输出以MCP协议通信,因此它旨在由MCP客户端(Claude Code、Claude Desktop等)启动。
### 配置为Claude Code MCP服务器
将以下内容添加到您的`~/.claude/settings.json`(或项目本地的`.mcp.json`):
```json
{
"mcpServers": {
"baresip": {
"command": "/绝对路径/to/baresip-mcp"
}
}
}
```
### … 或无需安装,通过Docker镜像
发布的镜像包含Baresip,因此无需构建或将任何内容放到`PATH`上。将MCP客户端指向`docker` — 容器是服务器,通过继承的标准输入/输出以MCP协议通信:
```json
{
"mcpServers": {
"baresip": {
"command": "docker",
"args": ["run", "-i", "--rm", "--network", "host",
"ghcr.io/jakobhellermann/baresip-mcp:latest"]
}
}
}
```
SIP和RTP是UDP,因此 `--network host` (Linux)通常需要用于注册和媒体穿越NAT。在Docker Desktop(macOS/Windows)上,主机网络功能有限;本地构建的二进制文件是更流畅的路径。
## 测试
```sh
go test ./...
```
包测试包括一个进程内伪造的`ctrl_tcp`服务器,该服务器锻炼了净字符串分帧、响应关联和断开重连的监督器。