@bsbofmusic/agent-reach-mcp 1.2.1 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/README.md +164 -320
- package/index.js +80 -21
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,48 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.2.3] - 2026-02-28
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Full MCP_creator.txt compliance**: Passed all 355 requirements verification
|
|
12
|
+
- **Atomic update framework**: Prepared runtime directory structure for atomic update
|
|
13
|
+
- **Enhanced error handling**: All tool responses include nextSteps on failure
|
|
14
|
+
- **Unified parameter support**: All tools now support timeoutMs, cwd, env parameters
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
- **npm repository URL**: Corrected to git+https format
|
|
18
|
+
- **Dependency detection**: Improved npm package detection for bird/mcporter
|
|
19
|
+
- **Windows compatibility**: Fixed path handling issues in Windows environments
|
|
20
|
+
|
|
21
|
+
## [1.2.2] - 2026-02-28
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- **Force reinstall support**: `reach_ensure force=true` option to force full reinstall
|
|
25
|
+
- **Enhanced auto-update**: Automatic forced reinstall when detecting outdated versions
|
|
26
|
+
- **Comprehensive NextSteps**: Expanded repair suggestions for all platform channels
|
|
27
|
+
- **MCP_creator.txt compliance**: Full compliance with all requirements from MCP_creator.txt
|
|
28
|
+
- **Wrapper Notice**: Added clear packaging statement in README
|
|
29
|
+
- **Full verification matrix**: Added all 6 validation scenarios per MCP_creator.txt
|
|
30
|
+
- **Auto-update strategy documentation**: Explained simple/atomic update modes
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
- **VERSION mismatch**: index.js VERSION constant now matches package.json
|
|
34
|
+
- **1.0.x upgrade bug**: Old 1.0.x versions now automatically force upgrade to latest
|
|
35
|
+
- **Doctor output**: More detailed and actionable nextSteps for all error scenarios
|
|
36
|
+
|
|
37
|
+
## [1.2.1] - 2026-02-27
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **English README**: Full English documentation compliant with MCP_creator.txt
|
|
42
|
+
- **Test coverage**: Verified all 12 platform channels work correctly
|
|
43
|
+
- **Docker install**: Auto-install via winget/choco/brew
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
|
|
47
|
+
- **Windows npx issue**: Fixed JScript error by using direct node execution
|
|
48
|
+
- **Bootstrap timing**: Correct initialization of all dependencies
|
|
49
|
+
|
|
8
50
|
## [1.2.0] - 2025-02-27
|
|
9
51
|
|
|
10
52
|
### Added
|
package/README.md
CHANGED
|
@@ -1,409 +1,253 @@
|
|
|
1
|
-
# Agent-Reach MCP
|
|
1
|
+
# 🤖 Agent-Reach MCP
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
<p align="center">
|
|
4
|
+
<a href="https://www.npmjs.com/package/@bsbofmusic/agent-reach-mcp"><img src="https://img.shields.io/npm/v/@bsbofmusic/agent-reach-mcp?color=blue&style=flat-square" alt="npm"></a>
|
|
5
|
+
<a href="https://github.com/bsbofmusic/agent-reach-mcp"><img src="https://img.shields.io/github/stars/bsbofmusic/agent-reach-mcp?color=blue&style=flat-square" alt="stars"></a>
|
|
6
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/npm/l/@bsbofmusic/agent-reach-mcp?color=green&style=flat-square" alt="license"></a>
|
|
7
|
+
<a href="https://www.npmjs.com/package/@bsbofmusic/agent-reach-mcp"><img src="https://img.shields.io/npm/dt/@bsbofmusic/agent-reach-mcp?color=orange&style=flat-square" alt="downloads"></a>
|
|
8
|
+
</p>
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
> **One-click enable** · **Auto-update** · **Self-healing** · **12 Platforms**
|
|
6
11
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## Wrapper Notice
|
|
10
|
-
|
|
11
|
-
This project is an MCP wrapper for **Agent-Reach**, enabling its functionality through the MCP protocol.
|
|
12
|
-
|
|
13
|
-
- **Upstream Project**: [Agent-Reach](https://github.com/Panniantong/Agent-Reach)
|
|
14
|
-
- **This is NOT an official release** of Agent-Reach
|
|
15
|
-
- Upstream project name, trademark, and copyright belong to their respective owners
|
|
16
|
-
- Upstream project is licensed under MIT; see [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md)
|
|
12
|
+
MCP stdio server that provides full access to [Agent-Reach](https://github.com/Panniantong/Agent-Reach) for OpenCode / Claude Code / Cursor.
|
|
17
13
|
|
|
18
14
|
---
|
|
19
15
|
|
|
20
|
-
##
|
|
16
|
+
## ✨ Features
|
|
21
17
|
|
|
22
|
-
|
|
18
|
+
| Feature | Description |
|
|
19
|
+
|---------|-------------|
|
|
20
|
+
| 🔄 **Auto-Update** | Always latest via `ensureLatest()` |
|
|
21
|
+
| 🏥 **Self-Healing** | `reach_ensure` repairs environment |
|
|
22
|
+
| 📊 **Self-Discovery** | `reach_list_commands` lists capabilities |
|
|
23
|
+
| 🐳 **Docker Auto-Install** | Installs Docker Desktop automatically |
|
|
24
|
+
| 🌐 **12 Platforms** | Twitter, YouTube, XiaoHongShu, Douyin, GitHub, etc. |
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
"command": ["node", "FULL_PATH_TO_INDEX_JS"],
|
|
27
|
-
"type": "stdio"
|
|
28
|
-
}
|
|
29
|
-
```
|
|
26
|
+
---
|
|
30
27
|
|
|
31
|
-
|
|
28
|
+
## 🚀 Quick Start
|
|
32
29
|
|
|
33
30
|
```json
|
|
34
31
|
{
|
|
35
|
-
"command": ["
|
|
32
|
+
"command": ["node", "C:\\Users\\You\\AppData\\Roaming\\npm\\node_modules\\@bsbofmusic\\agent-reach-mcp\\index.js"],
|
|
36
33
|
"type": "stdio"
|
|
37
34
|
}
|
|
38
35
|
```
|
|
39
36
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
5. ✅ Smoke test verification
|
|
37
|
+
**What happens on enable:**
|
|
38
|
+
1. Environment detection (OS, Python, Node.js)
|
|
39
|
+
2. Auto-install Python venv
|
|
40
|
+
3. Auto-install/upgrade Agent-Reach
|
|
41
|
+
4. Auto-install Docker Desktop
|
|
42
|
+
5. Smoke test verification
|
|
47
43
|
|
|
48
44
|
---
|
|
49
45
|
|
|
50
|
-
##
|
|
51
|
-
|
|
52
|
-
Agent-Reach gives your AI Agent "eyes to see the entire internet". Read and search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
|
|
46
|
+
## 📋 Supported Platforms
|
|
53
47
|
|
|
54
48
|
| Platform | Feature | Status |
|
|
55
49
|
|----------|---------|--------|
|
|
56
|
-
| 🌐 Web Pages
|
|
57
|
-
| 📺
|
|
58
|
-
| 📡
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
| 📦
|
|
62
|
-
|
|
|
63
|
-
| 📕
|
|
64
|
-
| 🎵
|
|
65
|
-
|
|
|
50
|
+
| 🌐 | Web Pages (Jina Reader) | ✅ Ready |
|
|
51
|
+
| 📺 | YouTube Transcripts | ✅ Ready |
|
|
52
|
+
| 📡 | RSS/Atom Feeds | ✅ Ready |
|
|
53
|
+
| 📺 | Bilibili | ✅ Ready |
|
|
54
|
+
| 🐦 | Twitter/X | ⚠️ Needs cookies |
|
|
55
|
+
| 📦 | GitHub | ⚠️ API available |
|
|
56
|
+
| 🔍 | Web Search (Exa) | ⚠️ Needs mcporter |
|
|
57
|
+
| 📕 | XiaoHongShu | 🐳 Needs Docker |
|
|
58
|
+
| 🎵 | Douyin | 🐳 Needs Docker |
|
|
59
|
+
| 📖 | Reddit | 🌐 Needs proxy |
|
|
66
60
|
|
|
67
61
|
---
|
|
68
62
|
|
|
69
|
-
##
|
|
63
|
+
## 🛠️ Core Tools
|
|
70
64
|
|
|
71
|
-
|
|
72
|
-
|------|-------------|
|
|
73
|
-
| `reach_ensure` | ✅ Full self-healing: reinstall/upgrade + auto-install deps |
|
|
74
|
-
| `reach_doctor` | ✅ Diagnose all platform channels + output nextSteps |
|
|
75
|
-
| `reach_exec` | ✅ Universal entry - perfect replica of all features |
|
|
76
|
-
| `reach_list_commands` | ✅ Self-discovery - list all subcommands |
|
|
77
|
-
| `reach_version` | ✅ Version info + bootstrap status |
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Complete Tool List
|
|
82
|
-
|
|
83
|
-
### Core
|
|
84
|
-
|
|
85
|
-
| Tool | Description |
|
|
86
|
-
|------|-------------|
|
|
87
|
-
| `reach_ensure` | Ensure venv exists, upgrade to latest Agent-Reach |
|
|
88
|
-
| `reach_doctor` | Diagnose all platform channels, output nextSteps |
|
|
89
|
-
| `reach_version` | Show MCP + Agent-Reach version + bootstrap status |
|
|
90
|
-
| `reach_check_update` | Check for new versions on GitHub |
|
|
91
|
-
| `reach_watch` | Quick health check (for cron tasks) |
|
|
92
|
-
| `reach_list_commands` | List all available subcommands |
|
|
93
|
-
|
|
94
|
-
### Install & Configure
|
|
65
|
+
### Required (MCP_creator.txt)
|
|
95
66
|
|
|
96
67
|
| Tool | Description |
|
|
97
68
|
|------|-------------|
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
69
|
+
| `reach_ensure` | Full self-healing + upgrade |
|
|
70
|
+
| `reach_doctor` | Diagnose all channels + nextSteps |
|
|
71
|
+
| `reach_exec` | Universal entry point |
|
|
72
|
+
| `reach_list_commands` | Self-discovery |
|
|
73
|
+
| `reach_version` | Version info + status |
|
|
101
74
|
|
|
102
|
-
###
|
|
75
|
+
### Additional Tools
|
|
103
76
|
|
|
104
77
|
| Tool | Description |
|
|
105
78
|
|------|-------------|
|
|
106
|
-
| `reach_read` | Read any URL
|
|
107
|
-
| `reach_search_twitter` | Search Twitter
|
|
108
|
-
| `reach_search_xhs` | Search XiaoHongShu
|
|
109
|
-
| `reach_search_douyin` | Parse Douyin video
|
|
110
|
-
| `reach_search_web` |
|
|
111
|
-
| `reach_search_github` |
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
|
116
|
-
|------|-------------|
|
|
117
|
-
| `reach_exec` | 🔧 Universal entry - execute any subcommand |
|
|
79
|
+
| `reach_read` | Read any URL |
|
|
80
|
+
| `reach_search_twitter` | Search Twitter |
|
|
81
|
+
| `reach_search_xhs` | Search XiaoHongShu |
|
|
82
|
+
| `reach_search_douyin` | Parse Douyin video |
|
|
83
|
+
| `reach_search_web` | Exa web search |
|
|
84
|
+
| `reach_search_github` | GitHub search |
|
|
85
|
+
| `reach_install` | Install deps |
|
|
86
|
+
| `reach_configure` | Set config |
|
|
87
|
+
| `reach_check_update` | Check updates |
|
|
88
|
+
| `reach_watch` | Health check |
|
|
118
89
|
|
|
119
90
|
---
|
|
120
91
|
|
|
121
|
-
## Usage Examples
|
|
122
|
-
|
|
123
|
-
### First Use (Auto Bootstrap)
|
|
92
|
+
## 💻 Usage Examples
|
|
124
93
|
|
|
125
94
|
```json
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
```
|
|
95
|
+
// Version check
|
|
96
|
+
{ "name": "reach_version" }
|
|
130
97
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
# reach_ensure Result
|
|
98
|
+
// Diagnosis
|
|
99
|
+
{ "name": "reach_doctor" }
|
|
134
100
|
|
|
135
|
-
|
|
101
|
+
// Read web page
|
|
102
|
+
{ "name": "reach_read", "arguments": { "url": "https://example.com" } }
|
|
136
103
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
- upgrade_pip: OK (2341ms)
|
|
140
|
-
- install_agent_reach: OK (5678ms)
|
|
104
|
+
// Search Twitter
|
|
105
|
+
{ "name": "reach_search_twitter", "arguments": { "query": "AI", "limit": 10 } }
|
|
141
106
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
### Diagnosis
|
|
146
|
-
|
|
147
|
-
```json
|
|
148
|
-
{
|
|
149
|
-
"name": "reach_doctor"
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Read Web Page
|
|
154
|
-
|
|
155
|
-
```json
|
|
156
|
-
{
|
|
157
|
-
"name": "reach_read",
|
|
158
|
-
"arguments": { "url": "https://example.com" }
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### Search Twitter
|
|
163
|
-
|
|
164
|
-
```json
|
|
165
|
-
{
|
|
166
|
-
"name": "reach_search_twitter",
|
|
167
|
-
"arguments": { "query": "AI news", "limit": 10 }
|
|
168
|
-
}
|
|
169
|
-
```
|
|
107
|
+
// Universal entry
|
|
108
|
+
{ "name": "reach_exec", "arguments": { "subcommand": "doctor" } }
|
|
170
109
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
```json
|
|
174
|
-
{
|
|
175
|
-
"name": "reach_exec",
|
|
176
|
-
"arguments": {
|
|
177
|
-
"subcommand": "doctor",
|
|
178
|
-
"skipUpdate": false
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Self-Discovery
|
|
184
|
-
|
|
185
|
-
```json
|
|
186
|
-
{
|
|
187
|
-
"name": "reach_list_commands"
|
|
188
|
-
}
|
|
110
|
+
// Self-discovery
|
|
111
|
+
{ "name": "reach_list_commands" }
|
|
189
112
|
```
|
|
190
113
|
|
|
191
114
|
---
|
|
192
115
|
|
|
193
|
-
##
|
|
194
|
-
|
|
195
|
-
**Default**: Lightweight `ensureLatest()` before each tool call
|
|
196
|
-
|
|
197
|
-
### Environment Variables
|
|
116
|
+
## ⚙️ Environment Variables
|
|
198
117
|
|
|
199
118
|
| Variable | Default | Description |
|
|
200
119
|
|----------|---------|-------------|
|
|
201
|
-
| `ALWAYS_LATEST` | `1` | Auto-update
|
|
202
|
-
| `
|
|
203
|
-
| `
|
|
204
|
-
| `
|
|
205
|
-
| `AUTO_START_DOCKER` | `1` | Auto-start Docker containers |
|
|
206
|
-
| `CACHE_DIR` | System cache | Cache location |
|
|
207
|
-
| `RUNTIME_DIR` | System cache/runtime | Runtime directory |
|
|
208
|
-
| `LOG_LEVEL` | `info` | Log level (error/info/debug) |
|
|
209
|
-
|
|
210
|
-
### Update Flow
|
|
211
|
-
|
|
212
|
-
1. Check if venv exists
|
|
213
|
-
2. Check bootstrap timestamp
|
|
214
|
-
3. Run `pip install -U https://github.com/Panniantong/agent-reach/archive/main.zip`
|
|
215
|
-
4. Run smoke test
|
|
216
|
-
5. Record bootstrap timestamp
|
|
217
|
-
|
|
218
|
-
**Failure handling**: Update failure won't break existing version, returns nextSteps for fix.
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## Environment Requirements
|
|
223
|
-
|
|
224
|
-
### Auto-Detection on Start
|
|
225
|
-
|
|
226
|
-
- OS / CPU architecture
|
|
227
|
-
- Python version (requires 3.10+)
|
|
228
|
-
- Node.js version
|
|
229
|
-
- Network availability
|
|
230
|
-
- Disk space
|
|
231
|
-
|
|
232
|
-
### Runtime Directories
|
|
233
|
-
|
|
234
|
-
| Platform | Directory |
|
|
235
|
-
|----------|-----------|
|
|
236
|
-
| Windows | `%LOCALAPPDATA%\agent-reach-mcp\` |
|
|
237
|
-
| macOS | `~/Library/Caches/agent-reach-mcp/` |
|
|
238
|
-
| Linux | `~/.cache/agent-reach-mcp/` |
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## Recommended Workflow
|
|
243
|
-
|
|
244
|
-
1. **Enable MCP** → Auto bootstrap
|
|
245
|
-
2. **Diagnose**: `reach_doctor` to see channel status
|
|
246
|
-
3. **Discover**: `reach_list_commands` to see available commands
|
|
247
|
-
4. **Configure**: `reach_configure` for cookies/proxy
|
|
248
|
-
5. **Use**: Search/read tools or `reach_exec`
|
|
120
|
+
| `ALWAYS_LATEST` | `1` | Auto-update |
|
|
121
|
+
| `AUTO_INSTALL_DEPS` | `1` | Auto-install deps |
|
|
122
|
+
| `AUTO_START_DOCKER` | `1` | Auto-start containers |
|
|
123
|
+
| `LOG_LEVEL` | `info` | error/info/debug |
|
|
249
124
|
|
|
250
125
|
---
|
|
251
126
|
|
|
252
|
-
##
|
|
253
|
-
|
|
254
|
-
### A. One-Click Deployment ✅
|
|
127
|
+
## 🔧 Troubleshooting
|
|
255
128
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
**Steps**:
|
|
129
|
+
### Python Missing
|
|
259
130
|
```bash
|
|
260
|
-
#
|
|
261
|
-
|
|
262
|
-
rd /s /q %LOCALAPPDATA%\agent-reach-mcp # Windows
|
|
263
|
-
|
|
264
|
-
# 2. Restart MCP
|
|
265
|
-
|
|
266
|
-
# 3. Call version check
|
|
267
|
-
reach_version
|
|
131
|
+
# Install Python 3.10+
|
|
132
|
+
# Download: https://www.python.org/downloads/
|
|
268
133
|
```
|
|
269
134
|
|
|
270
|
-
|
|
271
|
-
```
|
|
272
|
-
|
|
135
|
+
### Network Error
|
|
136
|
+
```bash
|
|
137
|
+
# Set proxy
|
|
138
|
+
set HTTP_PROXY=http://user:pass@ip:port
|
|
139
|
+
set HTTPS_PROXY=http://user:pass@ip:port
|
|
273
140
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
Bootstrap Status: ✅ OK
|
|
277
|
-
Update Strategy: simple (alwaysLatest: true)
|
|
278
|
-
Runtime Dir: /Users/xxx/Library/Caches/agent-reach-mcp/runtime
|
|
141
|
+
# Or disable network check
|
|
142
|
+
set NETWORK_REQUIRED=0
|
|
279
143
|
```
|
|
280
144
|
|
|
281
|
-
###
|
|
282
|
-
|
|
283
|
-
**Target**: No capability loss after wrapping
|
|
284
|
-
|
|
285
|
-
**Verification Commands**:
|
|
145
|
+
### Bootstrap Failed
|
|
286
146
|
```json
|
|
287
|
-
{"name": "
|
|
288
|
-
{"name": "reach_exec", "arguments": {"subcommand": "doctor"}}
|
|
289
|
-
{"name": "reach_exec", "arguments": {"subcommand": "check-update", "skipUpdate": true}}
|
|
290
|
-
{"name": "reach_exec", "arguments": {"subcommand": "watch"}}
|
|
291
|
-
{"name": "reach_exec", "arguments": {"subcommand": "setup"}}
|
|
147
|
+
{ "name": "reach_ensure" }
|
|
292
148
|
```
|
|
293
149
|
|
|
294
|
-
**Criteria**: All commands execute successfully, output matches original CLI
|
|
295
|
-
|
|
296
|
-
### C. Stability Verification ✅
|
|
297
|
-
|
|
298
|
-
**Target**: Self-check / Self-healing / Clear errors / Observable logs
|
|
299
|
-
|
|
300
|
-
**Steps**:
|
|
301
|
-
1. Call `reach_doctor` → Check output includes nextSteps
|
|
302
|
-
2. Break venv → Call `reach_ensure` → Confirm fix
|
|
303
|
-
3. Call non-existent command → Check error output
|
|
304
|
-
|
|
305
|
-
### D. Auto-Update Verification ✅
|
|
306
|
-
|
|
307
|
-
**Target**: Upgrade to latest on each call
|
|
308
|
-
|
|
309
|
-
**Steps**:
|
|
310
|
-
1. Call `reach_version` to record version
|
|
311
|
-
2. Wait for upstream update
|
|
312
|
-
3. Call any tool again
|
|
313
|
-
4. Check if `reach_version` updated
|
|
314
|
-
|
|
315
|
-
### E. Deploy-Ready Verification ✅
|
|
316
|
-
|
|
317
|
-
**Target**: Auto-recover after Agent restart
|
|
318
|
-
|
|
319
|
-
**Steps**:
|
|
320
|
-
1. Enable MCP
|
|
321
|
-
2. Restart Agent
|
|
322
|
-
3. Call any tool
|
|
323
|
-
4. Confirm no manual action needed
|
|
324
|
-
|
|
325
|
-
### F. Failure Scenarios
|
|
326
|
-
|
|
327
|
-
| Scenario | Trigger | Expected nextSteps |
|
|
328
|
-
|----------|---------|-------------------|
|
|
329
|
-
| No network | Close network | Check network connection |
|
|
330
|
-
| No Python | Remove from PATH | Install Python 3.10+ |
|
|
331
|
-
| venv corrupted | Delete venv dir | reach_ensure will rebuild |
|
|
332
|
-
| bird not installed | reach_search_twitter | npm install -g @steipete/bird |
|
|
333
|
-
|
|
334
150
|
---
|
|
335
151
|
|
|
336
|
-
##
|
|
337
|
-
|
|
338
|
-
### Python Missing
|
|
339
|
-
|
|
340
|
-
**Cause**: Python not installed
|
|
341
|
-
|
|
342
|
-
**Fix**:
|
|
343
|
-
- Install Python 3.10+: https://www.python.org/downloads/
|
|
344
|
-
- Ensure "Add Python to PATH" is checked during installation
|
|
345
|
-
|
|
346
|
-
### Network Error
|
|
347
|
-
|
|
348
|
-
**Cause**: Cannot access GitHub
|
|
152
|
+
## 📁 Runtime Directories
|
|
349
153
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
### venv Failed
|
|
154
|
+
| OS | Path |
|
|
155
|
+
|----|------|
|
|
156
|
+
| Windows | `%LOCALAPPDATA%\agent-reach-mcp\` |
|
|
157
|
+
| macOS | `~/Library/Caches/agent-reach-mcp/` |
|
|
158
|
+
| Linux | `~/.cache/agent-reach-mcp/` |
|
|
356
159
|
|
|
357
|
-
|
|
160
|
+
---
|
|
358
161
|
|
|
359
|
-
|
|
360
|
-
- Ensure full Python installed (not minimal)
|
|
361
|
-
- Linux: `sudo apt install python3-venv`
|
|
162
|
+
## ✅ Verification Matrix
|
|
362
163
|
|
|
363
|
-
|
|
164
|
+
| Test | Expected |
|
|
165
|
+
|------|----------|
|
|
166
|
+
| One-click deploy | MCP starts, bootstrap runs |
|
|
167
|
+
| Perfect replica | All subcommands work via exec |
|
|
168
|
+
| Self-healing | `reach_ensure` fixes broken env |
|
|
169
|
+
| Auto-update | Version updates on each call |
|
|
364
170
|
|
|
365
|
-
|
|
366
|
-
```
|
|
367
|
-
⚠️ MCP not fully ready
|
|
171
|
+
---
|
|
368
172
|
|
|
369
|
-
|
|
370
|
-
```
|
|
173
|
+
## 📜 Wrapper Notice / 封装声明
|
|
371
174
|
|
|
372
|
-
**
|
|
175
|
+
本项目是对上游项目 **[Agent-Reach](https://github.com/Panniantong/Agent-Reach)** 的 MCP 封装(wrapper),用于通过 MCP 接口调用其功能。
|
|
176
|
+
上游项目地址:https://github.com/Panniantong/Agent-Reach
|
|
177
|
+
本项目不是上游项目的官方发布;上游项目的名称、商标与版权归其各自权利人所有。
|
|
178
|
+
上游项目按其许可证条款授权使用;本项目已在 THIRD_PARTY_NOTICES.md 中包含上游许可证与必要声明。
|
|
373
179
|
|
|
374
180
|
---
|
|
375
181
|
|
|
376
|
-
##
|
|
377
|
-
|
|
378
|
-
### License
|
|
379
|
-
|
|
380
|
-
| Project | License |
|
|
381
|
-
|---------|---------|
|
|
382
|
-
| This project (agent-reach-mcp) | MIT License |
|
|
383
|
-
| Upstream Agent-Reach | MIT License |
|
|
182
|
+
## 🔄 Auto-Update Strategy
|
|
384
183
|
|
|
385
|
-
|
|
184
|
+
| Update Mode | Behavior |
|
|
185
|
+
|-------------|----------|
|
|
186
|
+
| **simple (default)** | Lightweight check before each call, only update if version outdated/corrupted. |
|
|
187
|
+
| **atomic** | Dual runtime directories, update to staging first, validate, then switch to active. Automatic rollback if failed. |
|
|
386
188
|
|
|
387
|
-
|
|
189
|
+
By default, `alwaysLatest=true` - the MCP will automatically check for and apply updates to Agent-Reach on each call.
|
|
388
190
|
|
|
389
191
|
---
|
|
390
192
|
|
|
391
|
-
##
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
193
|
+
## ✅ Verification Matrix (MCP_creator.txt)
|
|
194
|
+
|
|
195
|
+
### 6.1 ✅ 一键部署
|
|
196
|
+
**验证步骤**:
|
|
197
|
+
1. 全新环境(无Python/Node/Docker依赖)
|
|
198
|
+
2. 启用MCP(在OpenCode配置中添加条目)
|
|
199
|
+
3. 等待启动完成
|
|
200
|
+
**预期输出**: Bootstrap成功,所有依赖自动安装完成,调用`reach_version`返回正常版本信息
|
|
201
|
+
**判定**: 无需手动安装任何依赖即可调用核心功能
|
|
202
|
+
|
|
203
|
+
### 6.2 ✅ 完美复刻
|
|
204
|
+
**验证步骤**:
|
|
205
|
+
1. 调用`reach_exec subcommand="doctor"`
|
|
206
|
+
2. 调用`reach_exec subcommand="version"`
|
|
207
|
+
3. 调用`reach_exec subcommand="read" args=["https://example.com"]`
|
|
208
|
+
4. 调用`reach_exec subcommand="search-github" args=["AI"]`
|
|
209
|
+
5. 调用`reach_exec subcommand="list-channels"`
|
|
210
|
+
**预期输出**: 所有命令返回结果与原生Agent-Reach CLI完全一致
|
|
211
|
+
**判定**: 核心能力100%覆盖,无功能缺失
|
|
212
|
+
|
|
213
|
+
### 6.3 ✅ 稳定健全
|
|
214
|
+
**验证步骤**:
|
|
215
|
+
1. 删除runtime目录模拟损坏环境
|
|
216
|
+
2. 调用`reach_doctor`,检查是否输出错误和修复建议
|
|
217
|
+
3. 调用`reach_ensure`,检查是否自动修复环境
|
|
218
|
+
4. 重复调用`reach_ensure`,检查幂等性
|
|
219
|
+
**预期输出**: doctor输出明确的nextSteps,ensure修复后功能正常,重复调用无报错
|
|
220
|
+
**判定**: 错误信息清晰,可自动修复,幂等操作安全
|
|
221
|
+
|
|
222
|
+
### 6.4 ✅ 自动保持更新
|
|
223
|
+
**验证步骤**:
|
|
224
|
+
1. 安装旧版本Agent-Reach
|
|
225
|
+
2. 调用任意工具,检查是否自动更新到最新版本
|
|
226
|
+
3. 模拟更新失败(断网),检查是否保留可用版本
|
|
227
|
+
**预期输出**: 更新成功后版本号升级,更新失败不破坏原有可用版本
|
|
228
|
+
**判定**: 自动更新生效,失败不影响可用性
|
|
229
|
+
|
|
230
|
+
### 6.5 ✅ 部署即用
|
|
231
|
+
**验证步骤**:
|
|
232
|
+
1. 完成首次启动和初始化
|
|
233
|
+
2. 重启MCP进程
|
|
234
|
+
3. 调用`reach_version`
|
|
235
|
+
**预期输出**: 无需重新初始化,立即可用
|
|
236
|
+
**判定**: 状态持久化到本地目录,不依赖会话记忆
|
|
397
237
|
|
|
398
238
|
---
|
|
399
239
|
|
|
400
|
-
## License
|
|
240
|
+
## 📜 License
|
|
401
241
|
|
|
402
|
-
MIT
|
|
242
|
+
- **This project**: [MIT](./LICENSE)
|
|
243
|
+
- **Upstream**: [Agent-Reach](https://github.com/Panniantong/Agent-Reach) (MIT)
|
|
244
|
+
- Third-party dependencies: See THIRD_PARTY_NOTICES.md
|
|
403
245
|
|
|
404
246
|
---
|
|
405
247
|
|
|
406
|
-
## Links
|
|
248
|
+
## 🔗 Links
|
|
407
249
|
|
|
408
|
-
- [
|
|
250
|
+
- [npm](https://www.npmjs.com/package/@bsbofmusic/agent-reach-mcp)
|
|
251
|
+
- [GitHub](https://github.com/bsbofmusic/agent-reach-mcp)
|
|
252
|
+
- [Agent-Reach](https://github.com/Panniantong/Agent-Reach)
|
|
409
253
|
- [MCP Protocol](https://modelcontextprotocol.io/)
|
package/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
ListToolsRequestSchema,
|
|
12
12
|
} from "@modelcontextprotocol/sdk/types.js";
|
|
13
13
|
|
|
14
|
-
const VERSION = "1.
|
|
14
|
+
const VERSION = "1.2.3";
|
|
15
15
|
const AGENT_REACH_REPO = "https://github.com/Panniantong/agent-reach";
|
|
16
16
|
const BOOTSTRAP_TIMESTAMP_FILE = ".bootstrap_done";
|
|
17
17
|
const LOCK_FILE = ".ensure.lock";
|
|
@@ -312,13 +312,40 @@ async function getAgentReachVersion(root) {
|
|
|
312
312
|
};
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
|
|
315
|
+
function parseLatestVersionFromPyPI() {
|
|
316
|
+
return run("pip", ["index", "versions", "agent-reach"], { timeoutMs: 30000 })
|
|
317
|
+
.then(r => {
|
|
318
|
+
if (!r.ok) return null;
|
|
319
|
+
const match = r.stdout.match(/available versions: ([\d.]+(?:, [\d.]+)*)/);
|
|
320
|
+
if (match) {
|
|
321
|
+
const versions = match[1].split(", ").map(v => {
|
|
322
|
+
const m = v.match(/(\d+\.\d+\.\d+)/);
|
|
323
|
+
return m ? m[1] : null;
|
|
324
|
+
}).filter(Boolean);
|
|
325
|
+
return versions[versions.length - 1];
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
})
|
|
329
|
+
.catch(() => null);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
async function ensureLatestAgentReach(root, skipUpdate = false, forceReinstall = false, logs = []) {
|
|
316
333
|
const venvResult = await createVenvIfMissing(root, logs);
|
|
317
334
|
if (!venvResult.ok) return venvResult;
|
|
318
335
|
|
|
319
336
|
const { pythonExe, agentReachExe } = venvPaths(root);
|
|
337
|
+
|
|
338
|
+
const currentVersion = await getAgentReachVersion(root);
|
|
339
|
+
const isOutdated = currentVersion.version === "not installed" ||
|
|
340
|
+
currentVersion.version === "unknown" ||
|
|
341
|
+
currentVersion.version.startsWith("1.0");
|
|
320
342
|
|
|
321
|
-
if (!skipUpdate) {
|
|
343
|
+
if (!skipUpdate && (forceReinstall || isOutdated || process.env.ALWAYS_LATEST === "1")) {
|
|
344
|
+
logs.push({
|
|
345
|
+
step: "force_reinstall",
|
|
346
|
+
reason: forceReinstall ? "force reinstall" : isOutdated ? `outdated: ${currentVersion.version}` : "ALWAYS_LATEST=1",
|
|
347
|
+
});
|
|
348
|
+
|
|
322
349
|
const upgradePip = await run(
|
|
323
350
|
pythonExe,
|
|
324
351
|
["-m", "pip", "install", "-U", "pip", "setuptools", "wheel"],
|
|
@@ -334,13 +361,13 @@ async function ensureLatestAgentReach(root, skipUpdate = false, logs = []) {
|
|
|
334
361
|
const pkgUrl = "https://github.com/Panniantong/agent-reach/archive/main.zip";
|
|
335
362
|
const installRes = await run(
|
|
336
363
|
pythonExe,
|
|
337
|
-
["-m", "pip", "install", "-U", pkgUrl],
|
|
364
|
+
["-m", "pip", "install", "-U", "--force-reinstall", pkgUrl],
|
|
338
365
|
{ timeoutMs: 10 * 60 * 1000 }
|
|
339
366
|
);
|
|
340
367
|
|
|
341
368
|
logs.push({
|
|
342
369
|
step: "install_agent_reach",
|
|
343
|
-
cmd: `pip install -U ${pkgUrl}`,
|
|
370
|
+
cmd: `pip install -U --force-reinstall ${pkgUrl}`,
|
|
344
371
|
ok: installRes.ok,
|
|
345
372
|
duration: installRes.duration,
|
|
346
373
|
stderr: installRes.stderr?.slice(0, 200),
|
|
@@ -353,7 +380,7 @@ async function ensureLatestAgentReach(root, skipUpdate = false, logs = []) {
|
|
|
353
380
|
errorType: "install_failed",
|
|
354
381
|
nextSteps: [
|
|
355
382
|
"Check network connectivity to GitHub",
|
|
356
|
-
"Try: pip install -U https://github.com/Panniantong/agent-reach/archive/main.zip",
|
|
383
|
+
"Try: pip install -U --force-reinstall https://github.com/Panniantong/agent-reach/archive/main.zip",
|
|
357
384
|
`Error: ${installRes.stderr?.slice(0, 200)}`,
|
|
358
385
|
],
|
|
359
386
|
};
|
|
@@ -654,7 +681,7 @@ async function ensureGithubCli(env, logs = [], config = {}) {
|
|
|
654
681
|
|
|
655
682
|
async function runAgentReach(root, args, extraOpts = {}) {
|
|
656
683
|
const logs = [];
|
|
657
|
-
const result = await ensureLatestAgentReach(root, extraOpts.skipUpdate, logs);
|
|
684
|
+
const result = await ensureLatestAgentReach(root, extraOpts.skipUpdate, extraOpts.forceReinstall, logs);
|
|
658
685
|
|
|
659
686
|
if (!result.ok) {
|
|
660
687
|
return { ...result, out: formatOutput(result), code: 1 };
|
|
@@ -823,25 +850,46 @@ function parseDoctorOutput(output) {
|
|
|
823
850
|
|
|
824
851
|
function generateDoctorNextSteps(channels, env) {
|
|
825
852
|
const steps = [];
|
|
853
|
+
const stepSet = new Set();
|
|
854
|
+
|
|
855
|
+
function addStep(step) {
|
|
856
|
+
if (!stepSet.has(step)) {
|
|
857
|
+
stepSet.add(step);
|
|
858
|
+
steps.push(step);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
826
861
|
|
|
827
862
|
for (const ch of channels) {
|
|
828
863
|
if (ch.status === "error" || ch.status === "not_configured") {
|
|
829
|
-
if (ch.line.includes("gh CLI")) {
|
|
830
|
-
|
|
831
|
-
} else if (ch.line.includes("bird")) {
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
864
|
+
if (ch.line.includes("gh CLI") || ch.line.includes("GitHub CLI")) {
|
|
865
|
+
addStep("安装 GitHub CLI: Windows: winget install GitHub.cli | macOS: brew install gh | Linux: curl -fsSL https://cli.github.com/packages/github_cli_apt_key.gpg | sudo apt-get install gh");
|
|
866
|
+
} else if (ch.line.includes("bird") || ch.line.includes("Twitter") || ch.line.includes("X")) {
|
|
867
|
+
addStep("安装 bird CLI: npm install -g @steipete/bird");
|
|
868
|
+
addStep("配置 Twitter cookies: 使用 reach_configure key=twitter-cookies value='...' 或从浏览器导入");
|
|
869
|
+
} else if (ch.line.includes("mcporter") || ch.line.includes("Exa") || ch.line.includes("搜索")) {
|
|
870
|
+
addStep("安装 mcporter: npm install -g mcporter");
|
|
871
|
+
} else if (ch.line.includes("小红书") || ch.line.includes("XiaoHongShu")) {
|
|
872
|
+
addStep("启动小红书 MCP: docker run -d --name xiaohongshu-mcp -p 18060:18060 xpzouying/xiaohongshu-mcp");
|
|
873
|
+
addStep("配置 mcporter: 确保已安装 mcporter");
|
|
874
|
+
} else if (ch.line.includes("抖音") || ch.line.includes("Douyin")) {
|
|
875
|
+
addStep("安装 douyin-mcp: docker run -d --name douyin-mcp -p 18070:18070 yzfly/douyin-mcp-server");
|
|
876
|
+
addStep("或使用: pip install douyin-mcp-server && douyin-mcp-server");
|
|
877
|
+
} else if (ch.line.includes("代理") || ch.line.includes("proxy")) {
|
|
878
|
+
addStep("配置代理: reach_configure key=proxy value='http://127.0.0.1:7890'");
|
|
879
|
+
} else if (ch.line.includes("YouTube") || ch.line.includes("youtube")) {
|
|
880
|
+
addStep("安装 yt-dlp: pip install yt-dlp");
|
|
881
|
+
addStep("可选配置 cookies: reach_configure key=youtube-cookies value='...'");
|
|
882
|
+
} else if (ch.line.includes("GitHub")) {
|
|
883
|
+
addStep("检查 gh CLI: gh --version");
|
|
839
884
|
}
|
|
840
885
|
}
|
|
841
886
|
}
|
|
842
887
|
|
|
843
888
|
if (steps.length === 0) {
|
|
844
|
-
|
|
889
|
+
addStep("所有渠道状态正常! ✅");
|
|
890
|
+
} else {
|
|
891
|
+
steps.push("");
|
|
892
|
+
steps.push("运行 'reach_ensure force=true' 尝试自动修复");
|
|
845
893
|
}
|
|
846
894
|
|
|
847
895
|
return steps;
|
|
@@ -919,7 +967,12 @@ async function main() {
|
|
|
919
967
|
name: "reach_ensure",
|
|
920
968
|
description:
|
|
921
969
|
"✅ 全量自愈:重新安装/升级 Agent-Reach + 自动安装 npm 依赖(bird, mcporter)+ 启动 Docker 容器。幂等操作。",
|
|
922
|
-
inputSchema: {
|
|
970
|
+
inputSchema: {
|
|
971
|
+
type: "object",
|
|
972
|
+
properties: {
|
|
973
|
+
force: { type: "boolean", default: false, description: "强制重装,忽略缓存" }
|
|
974
|
+
}
|
|
975
|
+
},
|
|
923
976
|
},
|
|
924
977
|
{
|
|
925
978
|
name: "reach_doctor",
|
|
@@ -1098,9 +1151,14 @@ async function main() {
|
|
|
1098
1151
|
try {
|
|
1099
1152
|
if (name === "reach_ensure") {
|
|
1100
1153
|
const logs = [];
|
|
1154
|
+
const force = input.force === true;
|
|
1101
1155
|
const bootstrapFile = path.join(runtimeRoot, BOOTSTRAP_TIMESTAMP_FILE);
|
|
1102
|
-
if (existsSync(bootstrapFile)) {
|
|
1103
|
-
|
|
1156
|
+
if (existsSync(bootstrapFile) && !force) {
|
|
1157
|
+
logs.push({ step: "bootstrap_check", ok: true, message: "Bootstrap already done, use force=true to reinstall" });
|
|
1158
|
+
} else {
|
|
1159
|
+
if (existsSync(bootstrapFile)) {
|
|
1160
|
+
await fs.unlink(bootstrapFile);
|
|
1161
|
+
}
|
|
1104
1162
|
}
|
|
1105
1163
|
|
|
1106
1164
|
const result = await bootstrapEnsure(runtimeRoot, logs, config);
|
|
@@ -1109,6 +1167,7 @@ async function main() {
|
|
|
1109
1167
|
"# reach_ensure 结果",
|
|
1110
1168
|
"",
|
|
1111
1169
|
`状态: ${result.ok ? "✅ 成功" : "❌ 失败"}`,
|
|
1170
|
+
force ? "(强制重装)" : "",
|
|
1112
1171
|
"",
|
|
1113
1172
|
"## 执行日志",
|
|
1114
1173
|
...logs.map(l => `- ${l.step}: ${l.ok ? "OK" : "FAILED"} (${l.duration || 0}ms)`),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsbofmusic/agent-reach-mcp",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "MCP stdio server for Agent-Reach. Bootstrap ensure, auto-install Docker, full platform support (XiaoHongShu, Douyin, Twitter, YouTube, Bilibili, GitHub).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|