Metadata-Version: 2.4
Name: clawsomechannel
Version: 0.1.0
Summary: Agent 通用渠道 I/O 网关:给定主题一键跨渠道获取内容、一键多渠道发布。本地 MCP server。
License: Apache-2.0
Requires-Python: >=3.10
Requires-Dist: aiolimiter>=1.1
Requires-Dist: aiosqlite>=0.20
Requires-Dist: apprise>=1.8
Requires-Dist: cryptography>=42.0
Requires-Dist: datasketch>=1.6
Requires-Dist: feedparser>=6.0
Requires-Dist: httpx>=0.27
Requires-Dist: keyring>=25.0
Requires-Dist: markdown>=3.0
Requires-Dist: mcp>=1.2
Requires-Dist: platformdirs>=4.0
Requires-Dist: pydantic>=2.6
Requires-Dist: rank-bm25>=0.2
Requires-Dist: structlog>=24.1
Requires-Dist: tomli>=2.0; python_version < '3.11'
Provides-Extra: dev
Requires-Dist: mypy>=1.10; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: ruff>=0.4; extra == 'dev'
Provides-Extra: keyring
Description-Content-Type: text/markdown

# ClawsomeChannel

本地 MCP 服务,给 AI Agent 一套统一的渠道能力:Agent根据用户意图从指定渠道获取信息，或把内容发到指定渠道。

用户只需要用自然语言告诉 Agent 想看什么、发到哪里。Agent 通过 ClawsomeChannel 的 `fetch` 和 `publish` 工具完成输入与输出。

## 与其它 MCP 对比

| | 纯 RSS MCP<br>（feed-mcp、rss-reader-mcp 等） | 内置源 MCP<br>（mcp-news、OmniWire 等） | 通知 MCP<br>（Pheme、NotifyHub 等） | **ClawsomeChannel** |
|---|---|---|---|---|
| 输入 + 输出一体 | 通常只有 fetch | 通常只有 fetch | 通常只有 publish | **fetch + publish** |
| 渠道模型 | 临时传 URL 或维护 feed 列表 | 预置 feed 库，难个性化 | 无输入 | **命名 Channel，Agent 运行时注册** |
| 凭证配置 | 一般不需要 | 一般不需要 | 安装时写 env，改配置要重启 | **公开字段注册 + `creds set`，凭证与 Channel 同名分离** |
| 平台接入 | 几乎全靠用户/agent 找 RSS URL | 开箱即用，定制弱 | 各装一个 MCP 或各配一组 env | **官方 API 优先；缺凭证时 RSS/RSSHub 兜底** |
| 搜索与筛选 | 多为关键词或 feed 直拉 | 按国家/源等固定维度 | — | **对支持原生搜索的平台，Agent 传 `platform_options` 直达服务端关键词/筛选/排序；其余平台走 RSS/RSSHub + 本地筛选兜底** |
| 发布 | 无 | 无 | 单条消息/通知 | **本地 markdown 预检 + 多目标并行 + 逐渠道回执** |

**一句话**：其它 MCP 往往只做「读 RSS」或「发通知」其中一件事；ClawsomeChannel 用统一的 Channel 抽象把多平台输入、多目标输出和凭证生命周期收进同一套 MCP 工具里。

## 安装

```bash
pip install -U clawsomechannel
```

验证 beta 版时使用:

```bash
pip install --pre -U clawsomechannel
```

如果出现 `Requires-Python` 或 `Ignored the following versions` 报错,运行:

```bash
python3.10 -m venv ~/.local/share/clawsomechannel/venv
~/.local/share/clawsomechannel/venv/bin/python -m pip install -U pip
~/.local/share/clawsomechannel/venv/bin/python -m pip install -U clawsomechannel
mkdir -p ~/.local/bin
cat > ~/.local/bin/clawsomechannel <<'EOF'
#!/usr/bin/env sh
exec "$HOME/.local/share/clawsomechannel/venv/bin/python" -m clawsomechannel.cli "$@"
EOF
cat > ~/.local/bin/clawsomechannel-mcp <<'EOF'
#!/usr/bin/env sh
exec "$HOME/.local/share/clawsomechannel/venv/bin/python" -m clawsomechannel.transport.mcp_stdio "$@"
EOF
chmod +x ~/.local/bin/clawsomechannel ~/.local/bin/clawsomechannel-mcp
```

如果使用源码仓库中的安装脚本:

```bash
scripts/install.sh
# beta:
scripts/install.sh --beta
```

## 接入 MCP

推荐使用 CLI 自动配置:

```bash
clawsomechannel mcp install --client cursor
clawsomechannel mcp install --client claude-code
clawsomechannel mcp install --client claude-desktop
clawsomechannel mcp install --client codex
clawsomechannel mcp install --client openclaw
clawsomechannel mcp install --client hermes
```

只打印手动配置 JSON:

```bash
clawsomechannel mcp install --json
```

输出中的 `command` 是 MCP server 可执行文件的绝对路径。CLI 自动写入 Cursor、Claude
Desktop、Codex 等配置时也会使用这个绝对路径,避免 GUI 客户端拿不到 shell `PATH`。

## 什么是 Channel

Channel 是一个具体的输入源或输出目的地,也是用户和 Agent 日常使用的名字。

例子:
- `hn`: 一个 Hacker News输入渠道。
- `电报-工作群`: 一个 Telegram 输出渠道。
- `我的公众号`: 一个微信公众号输出渠道。


创建 Channel 后,按 Channel 名录入凭证:

```bash
clawsomechannel creds set <Channel名>
```

## 常用命令

查看支持哪些平台:

```bash
clawsomechannel platforms list
```

查看某个平台需要准备什么:

```bash
clawsomechannel platforms requirements telegram --direction output
clawsomechannel platforms requirements rss --direction input
```

查看已有 Channel 轻量列表:

```bash
clawsomechannel channels existing
```

查看某个 Channel 的非密详情:

```bash
clawsomechannel channels show 电报-工作群
```

录入某个 Channel 的凭证:

```bash
clawsomechannel creds set 电报-工作群
```

检查某个 Channel 当前是否可用:

```bash
clawsomechannel channels check 电报-工作群
```

删除一个动态注册的 Channel:

```bash
clawsomechannel channels remove hn
```

## 基本使用

你可以直接对 Agent 说:

```text
ClawsomeChannel 支持哪些输入和输出平台?
```

注册输入渠道:

```text
添加一个GitHub输入渠道, 将该渠道命名为“my-github-channel”。
```

用 RSS 注册输入渠道(适合没有独立平台、或你直接有 feed 地址的站点):

```text
帮我用这个 RSS 建一个输入渠道:https://sspai.com/feed，渠道名叫“少数派”。
```

也可以只说站点名，让 Agent 从内置速查表里挑官方 feed 帮你配好:

```text
帮我订阅 36 氪的最新内容，建一个输入渠道。
```

注册输出渠道:

```text
请在Telegram为我添加一个名为“电报-工作群”的输出渠道
```

录入凭证:

```bash
clawsomechannel creds set 电报-工作群
```

获取信息:

```text
请从"X", "hn", "Reddit"渠道抓取“AI 监管政策”相关信息,优先看最近 24 小时内讨论热度高的内容。
```

发布内容:

```text
请把 /absolute/path/article.md 同时发布到以下渠道：“电报-工作群”, "X”, "我的微信公众号"。
```

## 支持平台

准确、完整的参数与凭证要求以 `clawsomechannel platforms list` 和 `platforms requirements <平台> --direction input|output` 为准。下表按**独立平台**整理(每个 `platform` 值对应一种接入方式),并按 platform 首字母排序。

### 输入平台

| 平台 | 领域 | 说明 |
|------|------|------|
| `36kr` | 中文资讯 | 官方 feed 或 RSSHub |
| `amap` | 地图/LBS | POI、天气等;需 Web 服务 Key |
| `arxiv` | 学术/预印本 | arXiv 预印本检索;免 API key |
| `bilibili` | 视频/内容 | 需 feed/RSSHub URL |
| `caixin` | 财经/资讯 | 财新;需 feed URL |
| `crossref` | 学术/期刊 | DOI 与引用元数据;免 key,可配 `config.mailto` |
| `csdn` | 中文资讯 | 需 feed URL |
| `douban` | 社交/内容 | 需 feed URL |
| `github` | 开发/开源 | 代码库、Issue、用户搜索;token 可选 |
| `guancha` | 中文资讯 | 观察者网;需 feed URL |
| `hackernews` | 科技社区 | HN 帖子与评论;免 key |
| `hupu` | 体育/社区 | 虎扑;需 feed URL |
| `imap` | 通信 | 邮件收件箱搜索;需 IMAP 密码 |
| `jd` | 电商 | 京东联盟商品搜索;需开放平台凭证 |
| `juejin` | 社交/内容 | 需 feed URL |
| `openalex` | 学术/期刊 | 跨学科论文元数据(覆盖多数期刊);免 key,建议 OpenAlex API key |
| `pinduoduo` | 电商 | 多多客商品搜索;需开放平台凭证 |
| `producthunt` | 科技社区 | 产品发布(按 topic 筛选,非全文搜索);需 Developer Token |
| `pubmed` | 学术/期刊 | 生物医学文献(NCBI);免 key,高频可选 NCBI API key |
| `reddit` | 社交/论坛 | 帖子搜索;OAuth token 可选 |
| `rss` | 通用 | **任意** RSS/Atom feed 或 RSSHub 路由的统一入口 |
| `segmentfault` | 科技社区 | 需配 RSSHub/feed URL |
| `semantic_scholar` | 学术/期刊 | CS/AI 等论文检索;低频免 key,建议 Semantic Scholar API key |
| `sspai` | 中文资讯 | 官方 feed 或 RSSHub |
| `telegram_source` | 通信 | Bot 消息增量读取;需 Bot Token |
| `thepaper` | 中文资讯 | 澎湃新闻;需 feed URL |
| `v2ex` | 科技社区 | 热门/最新主题;免 key |
| `wechat_mp_source` | 中文资讯 | 公众号;需 RSSHub URL(实验) |
| `weibo` | 社交/内容 | 需 feed URL + 可选 Cookie |
| `x` | 社交/内容 | X/Twitter 检索;需 Bearer Token |
| `xiaohongshu` | 社交/内容 | 需 RSSHub URL(实验) |
| `youtube` | 视频/内容 | 视频搜索;API key 可选 |
| `zhihu` | 社交/内容 | 热榜等;需 feed URL,Cookie 可选 |

**没有上表中的独立平台怎么办?** 只要站点提供 RSS/Atom feed(或你能找到 RSSHub 路由),用 `platform=rss` 注册 Channel,在 `config.feeds` 写入 feed URL 即可——例如某期刊的 TOC(目录)订阅、博客、媒体栏目。B 站、微博、少数派等上表已列独立 `platform` 的站点,也可直接用 `rss` + feed URL 接入。

**API key 怎么配?** 公开身份字段(如 Telegram 的 `chat_id`)在 `register_channel` 时写入;**密钥/API key/token 一律用** `clawsomechannel creds set <Channel名>` **录入**,与 Channel 同名绑定,不会出现在 MCP 工具参数里。免 key 平台(如 PubMed、OpenAlex、Crossref、arXiv)可直接注册使用;标注「建议 key」的平台在限流变严时再补 creds 即可。

### 输出平台

| 平台 | 领域 | 说明 |
|------|------|------|
| `dingtalk` | 协作/IM | 钉钉机器人 |
| `discord` | 协作/IM | Webhook |
| `email` | 邮件 | SMTP 发信;注册时配收件人 |
| `gotify` / `ntfy` | 自托管推送 | 推送服务 |
| `lark` | 协作/IM | 飞书/Lark |
| `matrix` / `mattermost` / `rocketchat` | 协作/IM | 对应协议 Webhook |
| `msteams` | 协作/IM | Teams Webhook |
| `pushover` / `pushbullet` / `bark` | 移动推送 | 手机通知 |
| `pushplus` / `serverchan` | 国内推送 | 微信提醒类服务 |
| `slack` | 协作/IM | Webhook 或 Slack URL |
| `telegram` | 即时通讯 | Bot 发消息;需 Bot Token + `chat_id` |
| `twitter` | 社交发布 | X/Twitter 发帖/通知 |
| `webhook` | 通用 | 任意 HTTP JSON/form Webhook |
| `wechat_mp` | 内容发布 | 微信公众号图文;需公众号 API 凭证 |
| `wecom` | 协作/IM | 企业微信机器人 |
| `xianyu` | 电商 | 闲鱼;需淘宝开放平台 ISV 凭证 |
| `zhihu` | 内容发布 | 知乎文章;Cookie 方式(高风险) |

查看完整列表:

```bash
clawsomechannel platforms list
```

## 升级

```bash
clawsomechannel upgrade
```

升级命令会自更新到最新稳定包并迁移本地数据。完成后需要重载或重启 MCP 客户端,让它重新启动最新的 `clawsomechannel-mcp` 进程:

- Cursor:在 Settings > Tools & MCP 中切换该 server,执行 Developer: Reload Window,或完整重启 Cursor。
- Claude Desktop:完整退出并重新打开应用。
- Claude Code/Codex/其它 stdio 客户端:使用客户端提供的 MCP reconnect/reload 功能;没有热重载时重启当前会话。

