Metadata-Version: 2.5
Name: lingguang
Version: 1.0.0
Summary: 把灵光 AI 的支付宝账单查询等功能封装成 MCP 工具和 CLI
Project-URL: Homepage, https://github.com/Tokisaki-Galaxy/lingguang-mcp
Project-URL: Repository, https://github.com/Tokisaki-Galaxy/lingguang-mcp
Project-URL: Issues, https://github.com/Tokisaki-Galaxy/lingguang-mcp/issues
Project-URL: Documentation, https://github.com/Tokisaki-Galaxy/lingguang-mcp#readme
Project-URL: Changelog, https://github.com/Tokisaki-Galaxy/lingguang-mcp/releases
Author: tokisaki-galaxy
License-Expression: MIT
License-File: LICENSE
Keywords: agent,alipay,dingtalk,lingguang,llm,mcp
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: End Users/Desktop
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Internet
Classifier: Topic :: Utilities
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: mcp>=1.2.0
Requires-Dist: pywin32>=306; sys_platform == 'win32'
Requires-Dist: requests>=2.32
Requires-Dist: typer>=0.12
Provides-Extra: dev
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Description-Content-Type: text/markdown

<div align="center">

# lingguang-mcp

**把灵光 AI 的账单查询与钉钉消息能力，封装成 MCP 工具和 CLI**

让 AI Agent 替你向灵光提问、取回结论、记录 Agent 的执行轨迹

![Python](https://img.shields.io/badge/python-3.11%2B-3776AB?style=flat-square&logo=python&logoColor=white) ![MCP](https://img.shields.io/badge/MCP-2026--07--28-6E56CF?style=flat-square) ![License](https://img.shields.io/badge/license-MIT-yellow?style=flat-square)

![PyPI](https://img.shields.io/badge/PyPI-lingguang-3775A9?style=flat-square&logo=pypi&logoColor=white) ![CLI](https://img.shields.io/badge/interface-CLI%20%2B%20MCP-FF6B35?style=flat-square) ![Transport](https://img.shields.io/badge/transport-stdio-2E8B57?style=flat-square) ![Tests](https://img.shields.io/badge/tests-54%20passed-4CAF50?style=flat-square)

</div>

> 本项目基于对 `lingguang.com` 网页接口的逆向分析，非官方 SDK。
> 接口随时可能变动，使用前请阅读 [风险与边界](#风险与边界)。

**不想自己折腾配置？** 复制以下内容发给 AGENT 工具。

```
请帮我装好 lingguang，这是一个让我能通过你查询支付宝和钉钉消息的工具。
需要两步：
1. 装工具：uv tool install lingguang
2. 装 skill：npx skills add Tokisaki-Galaxy/lingguang-mcp -g -y
仓库地址：https://github.com/Tokisaki-Galaxy/lingguang-mcp
详细说明见随附的 USAGE.md。
```

> 如果你是一个LLM,请阅读与当前文件同级的USAGE.MD文件帮助用户快速配置

## 为什么需要它

支付宝账单和钉钉消息，对个人用户没有可用的开放接口：

- 支付宝不向个人开放账单 API
- 钉钉需要企业管理员开启数据访问权限

灵光是唯一入口。它拿到支付宝授权、连上钉钉之后，能通过 Agent 真实查询账单。

## 前提：先连好服务

**刚注册的灵光是普通 AI，查不了账单。** 必须先做这两件事：

- 在**手机灵光 App** 里连接支付宝，完成授权
- 其他集成类似，均需要先在手机 App 里授权一次

**这些连接动作只能在实际的手机 App 里做**，网页版和本工具都没有连接入口。

没连的情况下，本工具能正常提问，但灵光会回答没有数据。

所以本项目本质上是一个**遥控器加录音机**：替你的 Agent 向灵光提问、取回结论、记录 Agent 的执行轨迹。

## 两种使用方式

本项目同时提供 **CLI** 和 **MCP** 两套接口，共用同一套核心逻辑，能力完全对齐。

| | CLI | MCP |
|---|---|---|
| 适合 | 人工手动操作、脚本调用、排查问题 | AI Agent 自动调用 |
| 启动 | `lingguang <命令>` | `lingguang serve` |
| 传输 | 进程内 | stdio |
| 能用的工具 | 全部，另有 `doctor` / `export` / `auth` 等运维命令 | 6 个基础工具 |
| 删除会话 | `lingguang sessions delete <id> --yes` | `delete_session`（需 `confirm=true`） |

两边签名一致，行为一致。按照现在最佳工程实践，推荐使用CLI+SKILLS。

## 安装

两步：先装工具，再装 skill。两个都要，缺一个用不了。

### 第一步：装工具

```bash
uv tool install lingguang
```

装完 `lingguang` 命令在任何目录都可用。升级重跑这条命令，卸载用 `uv tool uninstall lingguang`。

没有 `uv` 的话先装（Python 的现代包管理器，比 pip 快得多）：

```bash
# Windows PowerShell
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

# Linux / macOS
curl -LsSf https://astral.sh/uv/install.sh | sh
```

用 pip 也能装，但需要自己管虚拟环境：

```bash
pip install lingguang
```

### 第二步：装 skill

skill 是一份写给 AI 助手看的操作手册，告诉它什么时候该查账单、怎么用这些命令。

```bash
npx skills add Tokisaki-Galaxy/lingguang-mcp -g -a opencode -y
```

装到 `~/.agents/skills/lingguang/`。重启 opencode 生效。

其他 AI 工具把 `-a opencode` 换成对应的名字即可，比如 `-a claude-code`。

**备选：用 GitHub CLI 安装**

已经装了 `gh` 的话，也可以这样装：

```bash
gh skill install Tokisaki-Galaxy/lingguang-mcp --agent opencode --scope user
```

效果一样，装到同一位置。但注意 `gh skill` 目前还是 preview 功能，
命令和行为可能变动。两者选一个就行，不要重复装。

**为什么要装 skill？** 工具本身只是命令，AI 不会自己知道什么时候该用、该怎么用。
skill 补上这层判断。不装也能用，但你得自己记住每条命令。

### 从 Git 安装（追最新代码）

想在正式发版前拿到未发布的改动：

```bash
uv tool install git+https://github.com/Tokisaki-Galaxy/lingguang-mcp.git
```

指定分支或版本：

```bash
uv tool install git+https://github.com/Tokisaki-Galaxy/lingguang-mcp.git@master
uv tool install git+https://github.com/Tokisaki-Galaxy/lingguang-mcp.git@v0.1.0
```

skill 也一样，把仓库地址换成 git URL 即可。

### 参与开发

```bash
git clone https://github.com/Tokisaki-Galaxy/lingguang-mcp
cd lingguang-mcp
uv sync --extra dev
```

在项目目录里用 `uv run lingguang <命令>` 跑，或者激活虚拟环境后直接用 `lingguang`。

## 获取 cookie

这是唯一需要手动做的一步。cookie 相当于账号登录凭证，
程序没法替你登录，因为灵光要扫码。

### 步骤

1. 用浏览器打开 https://www.lingguang.com 并登录

2. 按 `F12` 打开开发者工具，切换到 **Application** 标签
   （中文版 Chrome 或 Edge 里叫「应用」）

3. 左侧栏找到 **Storage → Cookies → https://www.lingguang.com**

4. 在右侧表格里找到这三个值，双击 Value 列复制：

   | Cookie 名 | 说明 | 是否必须 |
   |---|---|---|
   | `ctoken` | 会话标识，形如 `bigfish_ctoken_xxx` | 必须 |
   | `prod_LINGGUANGJSESSIONID` | 服务端会话 | 强烈建议 |
   | `spanner` | 网关会话 | 强烈建议 |

   `spanner` 的域名是 `cognihome.lingguang.com`。
   如果在上面的列表里找不到，检查左侧有没有 `cognihome.lingguang.com` 这一项。

5. 把它们拼成一行，用分号加空格分隔：

   ```
   ctoken=bigfish_ctoken_xxxxx; prod_LINGGUANGJSESSIONID=prod_yyyyy; spanner=zzzzz
   ```

6. 存成文件，比如项目根目录下的 `cookie.txt`

### 最容易踩的坑

`prod_LINGGUANGJSESSIONID` 是 **HttpOnly** 的，
在控制台敲 `document.cookie` 读不到，必须在 Application 面板里复制。

### 导入并验证

```bash
lingguang auth import cookie.txt
```

导入后会立刻验证一次。成功会显示：

```
已保存到Windows 凭据管理器
验证通过，cookie 可用
```

**cookie 存在哪里：**

- **Windows**：系统凭据管理器，标识 `lingguang-mcp`，
  可在「控制面板 → 凭据管理器 → Windows 凭据」里查看和删除。
  不存在用户目录里，同步盘扫不到。
- **Linux / macOS**：`~/.config/lingguang/credentials.json`，权限 0600。

失败会直接报错，不会等到下次用的时候才炸。

也可以用环境变量跳过文件：

```bash
# Windows PowerShell
$env:LG_COOKIE="ctoken=xxx; spanner=yyy"

# Linux / macOS
export LG_COOKIE="ctoken=xxx; spanner=yyy"
```

## 自检

```bash
lingguang doctor
```

三项都通过就可以用了：

```
[通过] cookie 齐全
[通过] loginCheck 成功
[通过] 解析器能提取正文（891 字符）
```

## 检查版本与更新

```bash
lingguang version
```

这是唯一会访问 PyPI 的命令，用来检查有没有新版本：

```
lingguang 0.3.0
最新版本 0.4.0，有新版本可升

  升级：uv tool upgrade lingguang
  改了什么：https://github.com/Tokisaki-Galaxy/lingguang-mcp/compare/v0.3.0...v0.4.0

Python 3.11.11
凭据存储 windows-credential-manager
凭据状态 有效，上次成功 2 小时前
```

只想要版本号、不联网：

```bash
lingguang --version      # 输出 0.3.0
lingguang version --offline
```

**除了查灵光数据，这是唯一会访问外部服务的命令。**
其他命令只会连灵光接口，不会连别的任何地方。

## CLI 用法

```bash
# 列出会话
lingguang sessions list

# 查看某个会话，带工具执行轨迹
lingguang sessions show <session-id> --tools

# 提问并等待结果
lingguang ask "这个月吃饭花了多少钱" --wait

# 只提交不等待，拿 query_id
lingguang ask "这个月吃饭花了多少钱"
lingguang answer <query-id> --wait 40

# 导出归档
lingguang export <session-id> --format md -o out.md
```

完整命令：

| 命令 | 用途 |
|---|---|
| `lingguang auth status` | 检查登录态 |
| `lingguang auth import <文件>` | 导入 cookie |
| `lingguang auth clear` | 清除本地 cookie |
| `lingguang sessions list` | 列出会话 |
| `lingguang sessions show <id> [--tools] [--keyword KW]` | 查看会话内容 |
| `lingguang sessions delete <id> --yes` | 删除会话 |
| `lingguang ask "问题" [--wait] [--timeout N]` | 提问 |
| `lingguang answer <query-id> [--wait N]` | 取回提问结果 |
| `lingguang export <id> --format md\|json\|jsonl\|raw` | 导出会话 |
| `lingguang doctor` | 环境自检 |
| `lingguang version` | 检查版本更新（访问 PyPI） |
| `lingguang serve` | 启动 MCP server |

所有查询命令都支持 `--json`，方便管道处理。

## MCP 用法

### 挂载

编辑 opencode 配置文件：

```json
{
  "mcp": {
    "lingguang": {
      "type": "local",
      "command": ["lingguang", "serve"],
      "enabled": true
    }
  }
}
```

如果用 `uv tool install` 装的，`lingguang` 已经在 PATH 里，
上面的配置直接用就行。

如果没装到 PATH，用 `uv run` 指向项目目录，跨平台通用：

```json
{
  "mcp": {
    "lingguang": {
      "type": "local",
      "command": [
        "uv", "run",
        "--directory", "C:\\path\\to\\lingguang-mcp",
        "lingguang", "serve"
      ]
    }
  }
}
```

Linux 或 macOS 把路径换成 `/path/to/lingguang-mcp` 即可。

### 提供的工具

| 工具 | 用途 |
|---|---|
| `list_sessions` | 列出会话，支持游标分页 |
| `get_transcript` | 读取会话正文与 Agent 工具执行轨迹 |
| `ask` | 提交提问，立即返回，不阻塞 |
| `get_answer` | 取回提问结果，可短暂轮询 |
| `auth_status` | 检查登录态 |
| `delete_session` | 删除会话，必须显式传 `confirm=true` |

### 为什么提问是两段式

账单分析要跑 20 到 30 秒。MCP 工具同步阻塞会撞客户端超时，
调用方也没法中途取消。所以拆成：

```
ask        -> 立即返回 { session_id, query_id }
get_answer -> 按 query_id 取结果，wait_seconds 最多等 60 秒
```

Agent 的自然用法是 `ask` 之后立刻 `get_answer(wait_seconds=40)` 等结果。

### 工具轨迹是核心价值

每轮回答都能拿到 Agent 真实调用的子程序列表：

```
查看账单查询服务目录 / 统计本月收支概况 / 分析近三个月账单趋势 / 统计本月分类消费构成
```

这是普通对话接口给不了的结构化信息。

## 技术栈

| 层 | 选型 | 说明 |
|---|---|---|
| 语言 | Python 3.11+ | 用 `uv` 管理依赖 |
| HTTP | `requests` | SSE 按字节流自定义切帧，不用 `iter_lines` |
| MCP | 规范 `2026-07-28` | stdio 传输，无协议级会话 |
| CLI | `typer` | 自动生成帮助，支持 `--json` 管道输出 |
| 测试 | `pytest` | 54 项单测 + 5 项契约测试 |
| 存储 | 无 | 默认不落库，留 `MessageSink` 接口做扩展点 |

架构分三层，`cli/` 和 `mcp/` 是 `core/` 的薄壳：

```
src/lingguang/
  core/     解析器、HTTP 客户端、业务编排、异常分类
  cli/      命令行入口
  mcp/      MCP stdio server 与工具定义
```

## 风险与边界

**不是官方工具，接口随时可能失效。**

本项目依赖逆向出的网页接口。上游改版时解析器会崩。`lingguang doctor` 能帮你发现，但不能替你修。解析全挂时用 `export --format raw` 拿原始 JSON 兜底。

**请保持低频使用。**

这是最重要的一条。蚂蚁侧有风控系统，本工具按「个人日常使用」的频率设计。不要用它做批量抓取、定时轮询或自动化脚本。高频请求会让账号被风控标记，后果会连带影响你在灵光 App 里的正常使用。

正常节奏参考：一天问几次，和你在 App 里用的频率保持一致。

**cookie 等于你的登录态。**

`ctoken` 泄露等于别人能以你的身份访问灵光，看到你的账单。
不要把 `cookie.txt` 分享给任何人，不要提交到仓库。
Windows 上 cookie 存在系统凭据管理器，不在用户目录，同步盘扫不到。
Linux / macOS 存在 `credentials.json`，`.gitignore` 已排除。

cookie 会在长时间不操作后失效。失效时重新导入即可，`lingguang auth status` 会告诉你上次成功是多久之前。

**数据保存在哪里。**

除了 cookie，本工具不保存任何历史数据。默认不落库，每次调用都实时拉取。
需要归档时用 `lingguang export` 导出到你自己选的位置。

**关于 APASS 高危确认。**

灵光 2.0 宣称接入蚂蚁 APASS，高危操作需用户确认。
但实测表明该能力尚未在网页端落地。
如果未来某次提问触发了确认，`get_answer` 会返回
`awaiting_confirmation` 状态，此时需要你在灵光 App 里手动确认。

## 开发

```bash
# 跑测试
uv run pytest

# 含真实接口的契约测试（需要先导入 cookie）
uv run pytest -m live
```

约束：`cli/` 和 `mcp/` 只准 import `core` 下的
`service`、`models`、`errors`，不直接碰 `client` 和 `parser`。

接口逆向的完整记录，包括九条实测约束和已知坑，
见 [docs/reverse-notes.md](docs/reverse-notes.md)。

给 AI 助手看的使用说明见 [USAGE.md](USAGE.md)。

---

## 许可

MIT。详见 [LICENSE](LICENSE)。

本项目仅供个人学习与自用。使用者需自行承担因使用本项目产生的包括但不限于账号受限、数据丢失在内的风险。项目作者不对因使用本项目造成的任何后果负责。
