humanbottasks 0.1.0__tar.gz → 0.1.2__tar.gz
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.
- humanbottasks-0.1.2/Dockerfile +9 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/FORUM_POSTS.md +69 -69
- humanbottasks-0.1.2/GUIDE.md +76 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/LAUNCH_POST.md +33 -33
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/PKG-INFO +7 -2
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/README.md +49 -44
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/SUBMISSION.md +44 -44
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/alarm.py +2 -2
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/index.html +91 -90
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/pyproject.toml +1 -1
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/server.json +2 -2
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/store.py +3 -1
- humanbottasks-0.1.2/test_mcp_client.py +58 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/.gitignore +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/LICENSE +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/config/claude_desktop_config.json +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/config/cursor_mcp.json +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/data/reported_ids.txt +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/demo.py +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/fulfill.py +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/glama.json +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/http_demo.py +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/server.py +0 -0
- {humanbottasks-0.1.0 → humanbottasks-0.1.2}/test_smoke.py +0 -0
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
# Forum-/Community-Posts (fertig zum Copy-Paste)
|
|
2
|
-
|
|
3
|
-
Englisch, weil die Zielgruppe (AI-Builder) englischsprachig ist.
|
|
4
|
-
Posten braucht deine Accounts — die Texte sind einsatzbereit.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Reddit r/MCP
|
|
9
|
-
|
|
10
|
-
**Title:** I built humanbottasks — delegate anything your agent can't do to a real human, over MCP
|
|
11
|
-
|
|
12
|
-
**Body:**
|
|
13
|
-
Two tools. That's the whole API:
|
|
14
|
-
|
|
15
|
-
- `request_human_task(type, description, max_price)` — verification, physical_action, subjective_judgment, ground_truth_labeling, prove_human
|
|
16
|
-
- `get_task_status(task_id)` — poll for the result
|
|
17
|
-
|
|
18
|
-
Install: `uvx
|
|
19
|
-
|
|
20
|
-
Works over stdio (Claude Desktop, Cursor, Windsurf) and streamable-http (remote agents).
|
|
21
|
-
|
|
22
|
-
I built this because I kept hitting the same wall: agents confidently asserting things they couldn't verify, with no clean handoff for the parts only a human can do. The existing options either want me to wire up a marketplace account or bolt on a whole SDK — I wanted the thinnest possible thing that just works.
|
|
23
|
-
|
|
24
|
-
It's an MVP (SQLite queue, no payments yet — I fulfill tasks manually right now). Honest question for this sub: which task type actually matters to you? Where do your agents actually get stuck?
|
|
25
|
-
|
|
26
|
-
Repo: https://github.com/humanbottasks/humanbottasks
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Reddit r/LocalLLaMA
|
|
31
|
-
|
|
32
|
-
**Title:** Local agents can now call a human — humanbottasks (MCP, stdio, no cloud)
|
|
33
|
-
|
|
34
|
-
**Body:**
|
|
35
|
-
If you run local agents (Ollama/LM Studio + LangChain/CrewAI), here's a human-in-the-loop fallback that's just an MCP server on your own machine. No cloud account, no hosted service.
|
|
36
|
-
|
|
37
|
-
- stdio (spawn it as a subprocess, same as any MCP server) + streamable-http for remote
|
|
38
|
-
- Two tools: request_human_task / get_task_status
|
|
39
|
-
- SQLite queue, you (or anyone) fulfill via a one-line CLI
|
|
40
|
-
|
|
41
|
-
Install: `uvx
|
|
42
|
-
|
|
43
|
-
Why this matters for local agents specifically: local models are even worse at verification and physical-world actions than frontier models, and they can't buy things or pick up a phone at all. A local agent that can delegate the "actually check this" part to a human is much more useful.
|
|
44
|
-
|
|
45
|
-
Repo: https://github.com/humanbottasks/humanbottasks
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## X/Twitter (Thread, 3 Posts)
|
|
50
|
-
|
|
51
|
-
**Post 1:**
|
|
52
|
-
Your agent can't do everything. Now it can ask a human — over MCP, one line:
|
|
53
|
-
`uvx
|
|
54
|
-
|
|
55
|
-
**Post 2:**
|
|
56
|
-
Two tools: `request_human_task` and `get_task_status`. That's it. Verification, physical actions, subjective judgment, ground-truth labeling — delegate it to a real person, poll for the result. stdio + streamable-http.
|
|
57
|
-
|
|
58
|
-
**Post 3:**
|
|
59
|
-
Built this after watching agents confidently assert things they couldn't verify, with no clean handoff for the human parts. Open source, MIT, works with Claude Desktop / Cursor / Windsurf / local agents.
|
|
60
|
-
https://github.com/humanbottasks/humanbottasks
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## Discord (MCP / LangChain / n8n / Dify servers)
|
|
65
|
-
|
|
66
|
-
**Kurzer Blurb:**
|
|
67
|
-
> humanbottasks — human fallback for AI agents over MCP. Two tools (request_human_task / get_task_status), stdio + streamable-http, one-line install:
|
|
68
|
-
> `uvx
|
|
69
|
-
> MIT, works with Claude Desktop/Cursor/Windsurf and local agent frameworks.
|
|
1
|
+
# Forum-/Community-Posts (fertig zum Copy-Paste)
|
|
2
|
+
|
|
3
|
+
Englisch, weil die Zielgruppe (AI-Builder) englischsprachig ist.
|
|
4
|
+
Posten braucht deine Accounts — die Texte sind einsatzbereit.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Reddit r/MCP
|
|
9
|
+
|
|
10
|
+
**Title:** I built humanbottasks — delegate anything your agent can't do to a real human, over MCP
|
|
11
|
+
|
|
12
|
+
**Body:**
|
|
13
|
+
Two tools. That's the whole API:
|
|
14
|
+
|
|
15
|
+
- `request_human_task(type, description, max_price)` — verification, physical_action, subjective_judgment, ground_truth_labeling, prove_human
|
|
16
|
+
- `get_task_status(task_id)` — poll for the result
|
|
17
|
+
|
|
18
|
+
Install: `uvx humanbottasks`
|
|
19
|
+
|
|
20
|
+
Works over stdio (Claude Desktop, Cursor, Windsurf) and streamable-http (remote agents).
|
|
21
|
+
|
|
22
|
+
I built this because I kept hitting the same wall: agents confidently asserting things they couldn't verify, with no clean handoff for the parts only a human can do. The existing options either want me to wire up a marketplace account or bolt on a whole SDK — I wanted the thinnest possible thing that just works.
|
|
23
|
+
|
|
24
|
+
It's an MVP (SQLite queue, no payments yet — I fulfill tasks manually right now). Honest question for this sub: which task type actually matters to you? Where do your agents actually get stuck?
|
|
25
|
+
|
|
26
|
+
Repo: https://github.com/humanbottasks/humanbottasks
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Reddit r/LocalLLaMA
|
|
31
|
+
|
|
32
|
+
**Title:** Local agents can now call a human — humanbottasks (MCP, stdio, no cloud)
|
|
33
|
+
|
|
34
|
+
**Body:**
|
|
35
|
+
If you run local agents (Ollama/LM Studio + LangChain/CrewAI), here's a human-in-the-loop fallback that's just an MCP server on your own machine. No cloud account, no hosted service.
|
|
36
|
+
|
|
37
|
+
- stdio (spawn it as a subprocess, same as any MCP server) + streamable-http for remote
|
|
38
|
+
- Two tools: request_human_task / get_task_status
|
|
39
|
+
- SQLite queue, you (or anyone) fulfill via a one-line CLI
|
|
40
|
+
|
|
41
|
+
Install: `uvx humanbottasks`
|
|
42
|
+
|
|
43
|
+
Why this matters for local agents specifically: local models are even worse at verification and physical-world actions than frontier models, and they can't buy things or pick up a phone at all. A local agent that can delegate the "actually check this" part to a human is much more useful.
|
|
44
|
+
|
|
45
|
+
Repo: https://github.com/humanbottasks/humanbottasks
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## X/Twitter (Thread, 3 Posts)
|
|
50
|
+
|
|
51
|
+
**Post 1:**
|
|
52
|
+
Your agent can't do everything. Now it can ask a human — over MCP, one line:
|
|
53
|
+
`uvx humanbottasks`
|
|
54
|
+
|
|
55
|
+
**Post 2:**
|
|
56
|
+
Two tools: `request_human_task` and `get_task_status`. That's it. Verification, physical actions, subjective judgment, ground-truth labeling — delegate it to a real person, poll for the result. stdio + streamable-http.
|
|
57
|
+
|
|
58
|
+
**Post 3:**
|
|
59
|
+
Built this after watching agents confidently assert things they couldn't verify, with no clean handoff for the human parts. Open source, MIT, works with Claude Desktop / Cursor / Windsurf / local agents.
|
|
60
|
+
https://github.com/humanbottasks/humanbottasks
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Discord (MCP / LangChain / n8n / Dify servers)
|
|
65
|
+
|
|
66
|
+
**Kurzer Blurb:**
|
|
67
|
+
> humanbottasks — human fallback for AI agents over MCP. Two tools (request_human_task / get_task_status), stdio + streamable-http, one-line install:
|
|
68
|
+
> `uvx humanbottasks`
|
|
69
|
+
> MIT, works with Claude Desktop/Cursor/Windsurf and local agent frameworks.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Give your AI agent a human fallback — in 2 lines
|
|
2
|
+
|
|
3
|
+
Agents are great at reasoning, but bad at the parts that need a real person:
|
|
4
|
+
verifying a fact, doing something physical, judging whether something "feels right",
|
|
5
|
+
labeling data correctly. humanbottasks closes that gap with a two-tool MCP server.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
uvx humanbottasks
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
That's it. Add it to your MCP client (Claude Desktop, Cursor, Windsurf) or spawn it
|
|
14
|
+
as a subprocess from any agent framework.
|
|
15
|
+
|
|
16
|
+
## What you get — two tools
|
|
17
|
+
|
|
18
|
+
- `request_human_task(task_type, description, max_price_usd)` — delegate work to a real person
|
|
19
|
+
- `get_task_status(task_id)` — poll for the result
|
|
20
|
+
|
|
21
|
+
## Five task types
|
|
22
|
+
|
|
23
|
+
| task_type | for things like |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `verification` | check a fact, test a page, confirm a detail |
|
|
26
|
+
| `physical_action` | buy, ship, call, sign, visit |
|
|
27
|
+
| `subjective_judgment` | "does this sound natural?", "is this good enough?" |
|
|
28
|
+
| `ground_truth_labeling` | label data correctly, build eval sets |
|
|
29
|
+
| `prove_human` | CAPTCHA, identity/account verification |
|
|
30
|
+
|
|
31
|
+
## Example — Claude Desktop
|
|
32
|
+
|
|
33
|
+
`claude_desktop_config.json`:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"mcpServers": {
|
|
38
|
+
"humanbottasks": {
|
|
39
|
+
"command": "uvx",
|
|
40
|
+
"args": ["humanbottasks"]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Then ask Claude:
|
|
47
|
+
|
|
48
|
+
> Check whether https://example.com is reachable from your side, and if it is,
|
|
49
|
+
> what the page title is.
|
|
50
|
+
|
|
51
|
+
Claude calls `request_human_task(task_type="verification", description="...")`,
|
|
52
|
+
gets a `task_id`, a human fulfills it, and Claude polls `get_task_status` for the result.
|
|
53
|
+
|
|
54
|
+
## How the loop works
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Agent → request_human_task → queue (SQLite) → human fulfills → get_task_status → result
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The queue lives at `~/.humanbottasks/tasks.db` (override with `HBT_DB`). Fulfill from the CLI:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
python fulfill.py done <task_id> "<result>"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Transports
|
|
67
|
+
|
|
68
|
+
- `stdio` — Claude Desktop, Cursor, Windsurf, local agent frameworks (default)
|
|
69
|
+
- `streamable-http` — remote agents: `python -m server --transport streamable-http`
|
|
70
|
+
- `sse` — legacy clients
|
|
71
|
+
|
|
72
|
+
## Links
|
|
73
|
+
|
|
74
|
+
- Repo: https://github.com/humanbottasks/humanbottasks
|
|
75
|
+
- Landing: https://humanbottasks.github.io/humanbottasks/
|
|
76
|
+
- PyPI: https://pypi.org/project/humanbottasks/
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
# Show HN / Launch Post
|
|
2
|
-
|
|
3
|
-
Fertig zum Einfuegen (Show HN, X, Discord, Reddit r/MCP r/LocalLLaMA).
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
**Show HN: humanbottasks — human fallback for AI agents over MCP**
|
|
8
|
-
|
|
9
|
-
Your agent can't do everything. When it needs to verify a fact, make a phone
|
|
10
|
-
call, buy or ship something, or judge whether text sounds natural, it can now
|
|
11
|
-
delegate that to a real human — over MCP, one line.
|
|
12
|
-
|
|
13
|
-
Two tools:
|
|
14
|
-
- `request_human_task(type, description, max_price)` — submit a task
|
|
15
|
-
- `get_task_status(task_id)` — poll for the result
|
|
16
|
-
|
|
17
|
-
Install:
|
|
18
|
-
uvx
|
|
19
|
-
|
|
20
|
-
Works with Claude Desktop, Cursor, Windsurf (stdio) and remote agents
|
|
21
|
-
(streamable-http). Task types: verification, physical_action,
|
|
22
|
-
subjective_judgment, ground_truth_labeling, prove_human.
|
|
23
|
-
|
|
24
|
-
Why: models are great at reasoning and bad at anything that touches the
|
|
25
|
-
physical world or needs verified judgment. This is the thinnest possible
|
|
26
|
-
"human in the loop" — no SDK, just MCP, the protocol agents already speak.
|
|
27
|
-
|
|
28
|
-
I kept hitting the same wall: agents confidently asserting things they
|
|
29
|
-
couldn't verify, with no clean way to hand off the parts only a human can do.
|
|
30
|
-
So I built the handoff. Would love feedback — especially on which task types
|
|
31
|
-
matter most to you.
|
|
32
|
-
|
|
33
|
-
Repo: https://github.com/humanbottasks/humanbottasks
|
|
1
|
+
# Show HN / Launch Post
|
|
2
|
+
|
|
3
|
+
Fertig zum Einfuegen (Show HN, X, Discord, Reddit r/MCP r/LocalLLaMA).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
**Show HN: humanbottasks — human fallback for AI agents over MCP**
|
|
8
|
+
|
|
9
|
+
Your agent can't do everything. When it needs to verify a fact, make a phone
|
|
10
|
+
call, buy or ship something, or judge whether text sounds natural, it can now
|
|
11
|
+
delegate that to a real human — over MCP, one line.
|
|
12
|
+
|
|
13
|
+
Two tools:
|
|
14
|
+
- `request_human_task(type, description, max_price)` — submit a task
|
|
15
|
+
- `get_task_status(task_id)` — poll for the result
|
|
16
|
+
|
|
17
|
+
Install:
|
|
18
|
+
uvx humanbottasks
|
|
19
|
+
|
|
20
|
+
Works with Claude Desktop, Cursor, Windsurf (stdio) and remote agents
|
|
21
|
+
(streamable-http). Task types: verification, physical_action,
|
|
22
|
+
subjective_judgment, ground_truth_labeling, prove_human.
|
|
23
|
+
|
|
24
|
+
Why: models are great at reasoning and bad at anything that touches the
|
|
25
|
+
physical world or needs verified judgment. This is the thinnest possible
|
|
26
|
+
"human in the loop" — no SDK, just MCP, the protocol agents already speak.
|
|
27
|
+
|
|
28
|
+
I kept hitting the same wall: agents confidently asserting things they
|
|
29
|
+
couldn't verify, with no clean way to hand off the parts only a human can do.
|
|
30
|
+
So I built the handoff. Would love feedback — especially on which task types
|
|
31
|
+
matter most to you.
|
|
32
|
+
|
|
33
|
+
Repo: https://github.com/humanbottasks/humanbottasks
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: humanbottasks
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Human fallback for AI agents: delegate tasks a model can't do to a human, over MCP.
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -9,6 +9,8 @@ Description-Content-Type: text/markdown
|
|
|
9
9
|
|
|
10
10
|
# humanbottasks
|
|
11
11
|
|
|
12
|
+
mcp-name: io.github.humanbottasks/humanbottasks
|
|
13
|
+
|
|
12
14
|
Gemanagter Human-Service-Layer fuer AI-Agenten. Ein AI-Agent delegiert ueber MCP
|
|
13
15
|
eine Aufgabe, die er nicht selbst kann, an einen Menschen; der Mensch erledigt
|
|
14
16
|
sie, der Agent ruft das Ergebnis ab.
|
|
@@ -36,7 +38,10 @@ Host/Port via Umgebungsvariablen: HBT_HOST (default 127.0.0.1), HBT_PORT (defaul
|
|
|
36
38
|
Fuer Remote-Zugriff: HBT_HOST=0.0.0.0 setzen.
|
|
37
39
|
|
|
38
40
|
## Install (fuer andere Builder, 1 Zeile)
|
|
39
|
-
uvx
|
|
41
|
+
uvx humanbottasks
|
|
42
|
+
|
|
43
|
+
## Guide (Englisch)
|
|
44
|
+
- [GUIDE.md](GUIDE.md) — Einfuehrung, Task-Typen, Beispiel-Loop, Transports
|
|
40
45
|
|
|
41
46
|
## Task-Typen
|
|
42
47
|
verification · physical_action · subjective_judgment · ground_truth_labeling · prove_human
|
|
@@ -1,44 +1,49 @@
|
|
|
1
|
-
# humanbottasks
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- `
|
|
11
|
-
- `
|
|
12
|
-
- `
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
uv
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
uv run server.py
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
# humanbottasks
|
|
2
|
+
|
|
3
|
+
mcp-name: io.github.humanbottasks/humanbottasks
|
|
4
|
+
|
|
5
|
+
Gemanagter Human-Service-Layer fuer AI-Agenten. Ein AI-Agent delegiert ueber MCP
|
|
6
|
+
eine Aufgabe, die er nicht selbst kann, an einen Menschen; der Mensch erledigt
|
|
7
|
+
sie, der Agent ruft das Ergebnis ab.
|
|
8
|
+
|
|
9
|
+
## MVP-Status
|
|
10
|
+
- `server.py` MCP-Server (Tools: request_human_task, get_task_status)
|
|
11
|
+
- `store.py` SQLite-Queue (tasks.db)
|
|
12
|
+
- `fulfill.py` CLI fuer den Menschen (Tasks ansehen/erledigen)
|
|
13
|
+
- `demo.py` End-to-End-Demo (Agent -> Task -> Mensch -> Ergebnis)
|
|
14
|
+
- `test_smoke.py` Smoke-Test
|
|
15
|
+
|
|
16
|
+
## Setup & Start
|
|
17
|
+
cd humanbottasks
|
|
18
|
+
unset PYTHONPATH
|
|
19
|
+
uv venv
|
|
20
|
+
uv pip install "mcp<2"
|
|
21
|
+
uv run server.py
|
|
22
|
+
|
|
23
|
+
## Transporte
|
|
24
|
+
uv run server.py # stdio (Claude Desktop, Cursor, lokale Frameworks)
|
|
25
|
+
uv run server.py --transport streamable-http # HTTP-Endpoint http://127.0.0.1:8000/mcp (lokal/Remote-Agents)
|
|
26
|
+
uv run server.py --transport sse # Legacy-SSE http://127.0.0.1:8000/sse
|
|
27
|
+
|
|
28
|
+
Host/Port via Umgebungsvariablen: HBT_HOST (default 127.0.0.1), HBT_PORT (default 8000).
|
|
29
|
+
Fuer Remote-Zugriff: HBT_HOST=0.0.0.0 setzen.
|
|
30
|
+
|
|
31
|
+
## Install (fuer andere Builder, 1 Zeile)
|
|
32
|
+
uvx humanbottasks
|
|
33
|
+
|
|
34
|
+
## Guide (Englisch)
|
|
35
|
+
- [GUIDE.md](GUIDE.md) — Einfuehrung, Task-Typen, Beispiel-Loop, Transports
|
|
36
|
+
|
|
37
|
+
## Task-Typen
|
|
38
|
+
verification · physical_action · subjective_judgment · ground_truth_labeling · prove_human
|
|
39
|
+
|
|
40
|
+
## MCP-Clients (installiert + konfiguriert)
|
|
41
|
+
- **Claude Desktop**: `C:\Users\marku\AppData\Roaming\Claude\claude_desktop_config.json`
|
|
42
|
+
- **Cursor**: `C:\Users\marku\.cursor\mcp.json`
|
|
43
|
+
- **Windsurf**: `C:\Users\marku\.codeium\windsurf\mcp_config.json`
|
|
44
|
+
- Templates in `config/` (falls neu einrichten noetig)
|
|
45
|
+
|
|
46
|
+
## Naechste Schritte (Reihenfolge)
|
|
47
|
+
1. Nachfrage-Test: Server laeuft, ein echter Agent ruft request_human_task.
|
|
48
|
+
2. Website/Landing fuer Agent-Builder.
|
|
49
|
+
3. Payments (Stripe/Circle) erst, wenn Nachfrage da ist.
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
# humanbottasks — Directory Submission Copy
|
|
2
|
-
|
|
3
|
-
Fertige Texte fuer MCP-Registries (mcp.so, PulseMCP, glama.ai/mcp, smithery.ai, Cline Marketplace).
|
|
4
|
-
Einfuegen bei Submission; Tagline/Description je nach Feld passend kuerzen.
|
|
5
|
-
|
|
6
|
-
## Name
|
|
7
|
-
humanbottasks
|
|
8
|
-
|
|
9
|
-
## Tagline (eine Zeile)
|
|
10
|
-
Human fallback for AI agents — delegate anything a model can't do to a real person, over MCP.
|
|
11
|
-
|
|
12
|
-
## Description (lang)
|
|
13
|
-
humanbottasks is a managed human-service layer for AI agents. When an agent hits
|
|
14
|
-
something it can't or shouldn't do itself — verify a fact, make a phone call,
|
|
15
|
-
buy or ship something, judge whether text sounds natural, label ground-truth
|
|
16
|
-
data — it delegates the task to a human over MCP and polls for the result.
|
|
17
|
-
|
|
18
|
-
Two tools: `request_human_task` (submit a task with a type, description and max
|
|
19
|
-
price) and `get_task_status` (poll status and read the result).
|
|
20
|
-
|
|
21
|
-
Task types: verification, physical_action, subjective_judgment,
|
|
22
|
-
ground_truth_labeling, prove_human.
|
|
23
|
-
|
|
24
|
-
Transports: stdio (Claude Desktop, Cursor, Windsurf, local frameworks) and
|
|
25
|
-
streamable-http (remote agents).
|
|
26
|
-
|
|
27
|
-
## Category / Tags
|
|
28
|
-
human-in-the-loop, task-delegation, human-fallback, agent-tools, mcp
|
|
29
|
-
|
|
30
|
-
## Install
|
|
31
|
-
uvx
|
|
32
|
-
|
|
33
|
-
## MCP client config
|
|
34
|
-
{"mcpServers":{"humanbottasks":{"command":"uvx","args":["
|
|
35
|
-
|
|
36
|
-
## Use cases (fuer Directory-Description)
|
|
37
|
-
- Prove a claim before the agent states it (verification)
|
|
38
|
-
- Phone calls, purchases, shipments (physical_action)
|
|
39
|
-
- "Does this sound natural / is this good?" (subjective_judgment)
|
|
40
|
-
- Ground-truth data for fine-tuning and evals (ground_truth_labeling)
|
|
41
|
-
- CAPTCHA / account / identity checks (prove_human)
|
|
42
|
-
|
|
43
|
-
## Repo
|
|
44
|
-
https://github.com/humanbottasks/humanbottasks
|
|
1
|
+
# humanbottasks — Directory Submission Copy
|
|
2
|
+
|
|
3
|
+
Fertige Texte fuer MCP-Registries (mcp.so, PulseMCP, glama.ai/mcp, smithery.ai, Cline Marketplace).
|
|
4
|
+
Einfuegen bei Submission; Tagline/Description je nach Feld passend kuerzen.
|
|
5
|
+
|
|
6
|
+
## Name
|
|
7
|
+
humanbottasks
|
|
8
|
+
|
|
9
|
+
## Tagline (eine Zeile)
|
|
10
|
+
Human fallback for AI agents — delegate anything a model can't do to a real person, over MCP.
|
|
11
|
+
|
|
12
|
+
## Description (lang)
|
|
13
|
+
humanbottasks is a managed human-service layer for AI agents. When an agent hits
|
|
14
|
+
something it can't or shouldn't do itself — verify a fact, make a phone call,
|
|
15
|
+
buy or ship something, judge whether text sounds natural, label ground-truth
|
|
16
|
+
data — it delegates the task to a human over MCP and polls for the result.
|
|
17
|
+
|
|
18
|
+
Two tools: `request_human_task` (submit a task with a type, description and max
|
|
19
|
+
price) and `get_task_status` (poll status and read the result).
|
|
20
|
+
|
|
21
|
+
Task types: verification, physical_action, subjective_judgment,
|
|
22
|
+
ground_truth_labeling, prove_human.
|
|
23
|
+
|
|
24
|
+
Transports: stdio (Claude Desktop, Cursor, Windsurf, local frameworks) and
|
|
25
|
+
streamable-http (remote agents).
|
|
26
|
+
|
|
27
|
+
## Category / Tags
|
|
28
|
+
human-in-the-loop, task-delegation, human-fallback, agent-tools, mcp
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
uvx humanbottasks
|
|
32
|
+
|
|
33
|
+
## MCP client config
|
|
34
|
+
{"mcpServers":{"humanbottasks":{"command":"uvx","args":["humanbottasks"]}}}
|
|
35
|
+
|
|
36
|
+
## Use cases (fuer Directory-Description)
|
|
37
|
+
- Prove a claim before the agent states it (verification)
|
|
38
|
+
- Phone calls, purchases, shipments (physical_action)
|
|
39
|
+
- "Does this sound natural / is this good?" (subjective_judgment)
|
|
40
|
+
- Ground-truth data for fine-tuning and evals (ground_truth_labeling)
|
|
41
|
+
- CAPTCHA / account / identity checks (prove_human)
|
|
42
|
+
|
|
43
|
+
## Repo
|
|
44
|
+
https://github.com/humanbottasks/humanbottasks
|
|
@@ -5,8 +5,8 @@ Wird als no_agent-Cron-Script genutzt: stdout wird verbatim an Telegram geliefer
|
|
|
5
5
|
import os
|
|
6
6
|
import sqlite3
|
|
7
7
|
|
|
8
|
-
DB = "
|
|
9
|
-
STATE = "
|
|
8
|
+
DB = os.environ.get("HBT_DB") or os.path.join(os.path.expanduser("~"), ".humanbottasks", "tasks.db")
|
|
9
|
+
STATE = os.path.join(os.path.expanduser("~"), ".humanbottasks", "reported_ids.txt")
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def _load():
|
|
@@ -1,90 +1,91 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>humanbottasks — Human fallback for AI agents</title>
|
|
7
|
-
<meta name="description" content="Delegate anything your AI agent can't do — verification, physical actions, subjective judgment — to a real human over MCP.">
|
|
8
|
-
<style>
|
|
9
|
-
:root { --bg:#0a0a0f; --fg:#e8e8f0; --muted:#9a9ab0; --accent:#7c5cff; --accent2:#00d4aa; --card:#14141d; --border:#26263a; }
|
|
10
|
-
* { margin:0; padding:0; box-sizing:border-box; }
|
|
11
|
-
body { background:var(--bg); color:var(--fg); font-family:-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; line-height:1.6; }
|
|
12
|
-
a { color:var(--accent2); text-decoration:none; }
|
|
13
|
-
.wrap { max-width:960px; margin:0 auto; padding:0 24px; }
|
|
14
|
-
header { padding:32px 0; border-bottom:1px solid var(--border); }
|
|
15
|
-
.logo { font-weight:800; font-size:20px; letter-spacing:-0.5px; }
|
|
16
|
-
.logo span { color:var(--accent); }
|
|
17
|
-
.hero { padding:72px 0 48px; }
|
|
18
|
-
h1 { font-size:44px; line-height:1.15; letter-spacing:-1px; font-weight:800; }
|
|
19
|
-
h1 .grad { background:linear-gradient(90deg,var(--accent),var(--accent2)); -webkit-background-clip:text; background-clip:text; color:transparent; }
|
|
20
|
-
.sub { margin-top:20px; font-size:20px; color:var(--muted); max-width:640px; }
|
|
21
|
-
.cta { margin-top:32px; display:flex; gap:12px; flex-wrap:wrap; }
|
|
22
|
-
.btn { padding:12px 24px; border-radius:8px; font-weight:600; font-size:15px; display:inline-block; }
|
|
23
|
-
.btn-primary { background:var(--accent); color:#fff; }
|
|
24
|
-
.btn-ghost { border:1px solid var(--border); color:var(--fg); }
|
|
25
|
-
.grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:16px; padding:48px 0; }
|
|
26
|
-
.card { background:var(--card); border:1px solid var(--border); border-radius:12px; padding:24px; }
|
|
27
|
-
.card h3 { font-size:17px; margin-bottom:8px; }
|
|
28
|
-
.card p { color:var(--muted); font-size:15px; }
|
|
29
|
-
.code { background:var(--card); border:1px solid var(--border); border-radius:12px; padding:20px 24px; font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:14px; overflow-x:auto; color:#c9d1ff; margin:24px 0; }
|
|
30
|
-
.code .c { color:var(--muted); }
|
|
31
|
-
.steps { padding:32px 0; counter-reset:step; }
|
|
32
|
-
.step { display:flex; gap:16px; align-items:flex-start; margin-bottom:24px; }
|
|
33
|
-
.step .n { background:var(--accent); color:#fff; border-radius:50%; width:32px; height:32px; display:flex; align-items:center; justify-content:center; font-weight:700; flex-shrink:0; }
|
|
34
|
-
.step h4 { margin-bottom:4px; }
|
|
35
|
-
.step p { color:var(--muted); }
|
|
36
|
-
.chips { display:flex; flex-wrap:wrap; gap:8px; padding:24px 0 48px; }
|
|
37
|
-
.chip { border:1px solid var(--border); color:var(--muted); border-radius:999px; padding:6px 14px; font-size:13px; }
|
|
38
|
-
footer { border-top:1px solid var(--border); padding:32px 0; color:var(--muted); font-size:14px; }
|
|
39
|
-
.h2 { font-size:28px; letter-spacing:-0.5px; font-weight:700; margin-top:8px; }
|
|
40
|
-
</style>
|
|
41
|
-
</head>
|
|
42
|
-
<body>
|
|
43
|
-
<header><div class="wrap"><div class="logo">human<span>bot</span>tasks</div></div></header>
|
|
44
|
-
|
|
45
|
-
<section class="hero"><div class="wrap">
|
|
46
|
-
<h1>Your agent can't do everything.<br><span class="grad">Now it can ask a human.</span></h1>
|
|
47
|
-
<p class="sub">humanbottasks is a managed human-service layer for AI agents. Delegate verification, physical actions and subjective judgment to a real person — over MCP, one line.</p>
|
|
48
|
-
<div class="cta">
|
|
49
|
-
<a class="btn btn-primary" href="https://github.com/humanbottasks/humanbottasks">Get started</a>
|
|
50
|
-
<a class="btn btn-ghost" href="#install">View install</a>
|
|
51
|
-
</div>
|
|
52
|
-
</div></section>
|
|
53
|
-
|
|
54
|
-
<section class="wrap">
|
|
55
|
-
<div class="grid">
|
|
56
|
-
<div class="card"><h3>Delegate anything</h3><p>Verification, phone calls, purchases, data labeling, subjective judgment — whatever the model can't or shouldn't do itself.</p></div>
|
|
57
|
-
<div class="card"><h3>Standard MCP</h3><p>Works with Claude Desktop, Cursor, Windsurf and any local agent framework. stdio for local, HTTP for remote.</p></div>
|
|
58
|
-
<div class="card"><h3>You stay in control</h3><p>A real human fulfills the task; your agent polls the result. You set the max price per task.</p></div>
|
|
59
|
-
</div>
|
|
60
|
-
</section>
|
|
61
|
-
|
|
62
|
-
<section class="wrap" id="install">
|
|
63
|
-
<div class="h2">Install</div>
|
|
64
|
-
<div class="code"><span class="c"># one command</span><br>uvx
|
|
65
|
-
<div class="code"><span class="c"># MCP client config (Claude Desktop / Cursor / Windsurf)</span><br>{"mcpServers":{"humanbottasks":{"command":"uvx","args":["
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
<div class="
|
|
71
|
-
|
|
72
|
-
<div class="step"><div class="n">
|
|
73
|
-
<div class="step"><div class="n">
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
<div class="
|
|
80
|
-
|
|
81
|
-
<span class="chip">
|
|
82
|
-
<span class="chip">
|
|
83
|
-
<span class="chip">
|
|
84
|
-
<span class="chip">
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
</
|
|
90
|
-
</
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>humanbottasks — Human fallback for AI agents</title>
|
|
7
|
+
<meta name="description" content="Delegate anything your AI agent can't do — verification, physical actions, subjective judgment — to a real human over MCP.">
|
|
8
|
+
<style>
|
|
9
|
+
:root { --bg:#0a0a0f; --fg:#e8e8f0; --muted:#9a9ab0; --accent:#7c5cff; --accent2:#00d4aa; --card:#14141d; --border:#26263a; }
|
|
10
|
+
* { margin:0; padding:0; box-sizing:border-box; }
|
|
11
|
+
body { background:var(--bg); color:var(--fg); font-family:-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; line-height:1.6; }
|
|
12
|
+
a { color:var(--accent2); text-decoration:none; }
|
|
13
|
+
.wrap { max-width:960px; margin:0 auto; padding:0 24px; }
|
|
14
|
+
header { padding:32px 0; border-bottom:1px solid var(--border); }
|
|
15
|
+
.logo { font-weight:800; font-size:20px; letter-spacing:-0.5px; }
|
|
16
|
+
.logo span { color:var(--accent); }
|
|
17
|
+
.hero { padding:72px 0 48px; }
|
|
18
|
+
h1 { font-size:44px; line-height:1.15; letter-spacing:-1px; font-weight:800; }
|
|
19
|
+
h1 .grad { background:linear-gradient(90deg,var(--accent),var(--accent2)); -webkit-background-clip:text; background-clip:text; color:transparent; }
|
|
20
|
+
.sub { margin-top:20px; font-size:20px; color:var(--muted); max-width:640px; }
|
|
21
|
+
.cta { margin-top:32px; display:flex; gap:12px; flex-wrap:wrap; }
|
|
22
|
+
.btn { padding:12px 24px; border-radius:8px; font-weight:600; font-size:15px; display:inline-block; }
|
|
23
|
+
.btn-primary { background:var(--accent); color:#fff; }
|
|
24
|
+
.btn-ghost { border:1px solid var(--border); color:var(--fg); }
|
|
25
|
+
.grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:16px; padding:48px 0; }
|
|
26
|
+
.card { background:var(--card); border:1px solid var(--border); border-radius:12px; padding:24px; }
|
|
27
|
+
.card h3 { font-size:17px; margin-bottom:8px; }
|
|
28
|
+
.card p { color:var(--muted); font-size:15px; }
|
|
29
|
+
.code { background:var(--card); border:1px solid var(--border); border-radius:12px; padding:20px 24px; font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:14px; overflow-x:auto; color:#c9d1ff; margin:24px 0; }
|
|
30
|
+
.code .c { color:var(--muted); }
|
|
31
|
+
.steps { padding:32px 0; counter-reset:step; }
|
|
32
|
+
.step { display:flex; gap:16px; align-items:flex-start; margin-bottom:24px; }
|
|
33
|
+
.step .n { background:var(--accent); color:#fff; border-radius:50%; width:32px; height:32px; display:flex; align-items:center; justify-content:center; font-weight:700; flex-shrink:0; }
|
|
34
|
+
.step h4 { margin-bottom:4px; }
|
|
35
|
+
.step p { color:var(--muted); }
|
|
36
|
+
.chips { display:flex; flex-wrap:wrap; gap:8px; padding:24px 0 48px; }
|
|
37
|
+
.chip { border:1px solid var(--border); color:var(--muted); border-radius:999px; padding:6px 14px; font-size:13px; }
|
|
38
|
+
footer { border-top:1px solid var(--border); padding:32px 0; color:var(--muted); font-size:14px; }
|
|
39
|
+
.h2 { font-size:28px; letter-spacing:-0.5px; font-weight:700; margin-top:8px; }
|
|
40
|
+
</style>
|
|
41
|
+
</head>
|
|
42
|
+
<body>
|
|
43
|
+
<header><div class="wrap"><div class="logo">human<span>bot</span>tasks</div></div></header>
|
|
44
|
+
|
|
45
|
+
<section class="hero"><div class="wrap">
|
|
46
|
+
<h1>Your agent can't do everything.<br><span class="grad">Now it can ask a human.</span></h1>
|
|
47
|
+
<p class="sub">humanbottasks is a managed human-service layer for AI agents. Delegate verification, physical actions and subjective judgment to a real person — over MCP, one line.</p>
|
|
48
|
+
<div class="cta">
|
|
49
|
+
<a class="btn btn-primary" href="https://github.com/humanbottasks/humanbottasks">Get started</a>
|
|
50
|
+
<a class="btn btn-ghost" href="#install">View install</a>
|
|
51
|
+
</div>
|
|
52
|
+
</div></section>
|
|
53
|
+
|
|
54
|
+
<section class="wrap">
|
|
55
|
+
<div class="grid">
|
|
56
|
+
<div class="card"><h3>Delegate anything</h3><p>Verification, phone calls, purchases, data labeling, subjective judgment — whatever the model can't or shouldn't do itself.</p></div>
|
|
57
|
+
<div class="card"><h3>Standard MCP</h3><p>Works with Claude Desktop, Cursor, Windsurf and any local agent framework. stdio for local, HTTP for remote.</p></div>
|
|
58
|
+
<div class="card"><h3>You stay in control</h3><p>A real human fulfills the task; your agent polls the result. You set the max price per task.</p></div>
|
|
59
|
+
</div>
|
|
60
|
+
</section>
|
|
61
|
+
|
|
62
|
+
<section class="wrap" id="install">
|
|
63
|
+
<div class="h2">Install</div>
|
|
64
|
+
<div class="code"><span class="c"># one command</span><br>uvx humanbottasks</div>
|
|
65
|
+
<div class="code"><span class="c"># MCP client config (Claude Desktop / Cursor / Windsurf)</span><br>{"mcpServers":{"humanbottasks":{"command":"uvx","args":["humanbottasks"]}}}</div>
|
|
66
|
+
<p><a href="https://github.com/humanbottasks/humanbottasks/blob/main/GUIDE.md">Read the full guide →</a></p>
|
|
67
|
+
</section>
|
|
68
|
+
|
|
69
|
+
<section class="wrap">
|
|
70
|
+
<div class="h2">How it works</div>
|
|
71
|
+
<div class="steps">
|
|
72
|
+
<div class="step"><div class="n">1</div><div><h4>Agent delegates</h4><p>The agent calls request_human_task with a description and max price.</p></div></div>
|
|
73
|
+
<div class="step"><div class="n">2</div><div><h4>Human fulfills</h4><p>A real person does the task and submits the result.</p></div></div>
|
|
74
|
+
<div class="step"><div class="n">3</div><div><h4>Agent reads the result</h4><p>The agent polls get_task_status and continues with the answer.</p></div></div>
|
|
75
|
+
</div>
|
|
76
|
+
</section>
|
|
77
|
+
|
|
78
|
+
<section class="wrap">
|
|
79
|
+
<div class="h2">Task types</div>
|
|
80
|
+
<div class="chips">
|
|
81
|
+
<span class="chip">verification</span>
|
|
82
|
+
<span class="chip">physical_action</span>
|
|
83
|
+
<span class="chip">subjective_judgment</span>
|
|
84
|
+
<span class="chip">ground_truth_labeling</span>
|
|
85
|
+
<span class="chip">prove_human</span>
|
|
86
|
+
</div>
|
|
87
|
+
</section>
|
|
88
|
+
|
|
89
|
+
<footer><div class="wrap">humanbottasks — human fallback for AI agents. © 2026</div></footer>
|
|
90
|
+
</body>
|
|
91
|
+
</html>
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "humanbottasks"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.2"
|
|
8
8
|
description = "Human fallback for AI agents: delegate tasks a model can't do to a human, over MCP."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
"url": "https://github.com/humanbottasks/humanbottasks",
|
|
9
9
|
"source": "github"
|
|
10
10
|
},
|
|
11
|
-
"version": "0.1.
|
|
11
|
+
"version": "0.1.2",
|
|
12
12
|
"packages": [
|
|
13
13
|
{
|
|
14
14
|
"registryType": "pypi",
|
|
15
15
|
"registryBaseUrl": "https://pypi.org",
|
|
16
16
|
"identifier": "humanbottasks",
|
|
17
|
-
"version": "0.1.
|
|
17
|
+
"version": "0.1.2",
|
|
18
18
|
"transport": {
|
|
19
19
|
"type": "stdio"
|
|
20
20
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""SQLite-Task-Queue fuer humanbottasks (minimales MVP)."""
|
|
2
2
|
import sqlite3, uuid, time, os
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
_DB_ENV = os.environ.get("HBT_DB")
|
|
5
|
+
DB = _DB_ENV if _DB_ENV else os.path.join(os.path.expanduser("~"), ".humanbottasks", "tasks.db")
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
def _conn():
|
|
@@ -11,6 +12,7 @@ def _conn():
|
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
def init():
|
|
15
|
+
os.makedirs(os.path.dirname(DB), exist_ok=True)
|
|
14
16
|
with _conn() as c:
|
|
15
17
|
c.execute("""CREATE TABLE IF NOT EXISTS tasks (
|
|
16
18
|
id TEXT PRIMARY KEY,
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""End-to-End MCP-Protokolltest gegen das gepublishte PyPI-Package.
|
|
2
|
+
|
|
3
|
+
Simuliert exakt, was ein MCP-Client (Claude Desktop/Cursor) tut:
|
|
4
|
+
connect -> initialize -> list_tools -> call request_human_task
|
|
5
|
+
-> (Mensch erfuellt) -> call get_task_status -> Ergebnis.
|
|
6
|
+
|
|
7
|
+
Der Server wird als `uvx humanbottasks` (PyPI) via stdio gespawnt.
|
|
8
|
+
"""
|
|
9
|
+
import asyncio
|
|
10
|
+
import re
|
|
11
|
+
import sys
|
|
12
|
+
from mcp import ClientSession, StdioServerParameters
|
|
13
|
+
from mcp.client.stdio import stdio_client
|
|
14
|
+
import store as q
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def main():
|
|
18
|
+
# Test gegen das gepublishte PyPI-Package (0.1.1 mit DB-Fix)
|
|
19
|
+
# --refresh erzwingt Neuaufloesung (sonst greift uvx auf gecachtes 0.1.0 zurueck)
|
|
20
|
+
params = StdioServerParameters(command="uvx", args=["--refresh", "humanbottasks"])
|
|
21
|
+
async with stdio_client(params) as (read, write):
|
|
22
|
+
async with ClientSession(read, write) as session:
|
|
23
|
+
await session.initialize()
|
|
24
|
+
|
|
25
|
+
tools = await session.list_tools()
|
|
26
|
+
print("=== Tools (via MCP) ===")
|
|
27
|
+
for t in tools.tools:
|
|
28
|
+
print(f" - {t.name}")
|
|
29
|
+
|
|
30
|
+
res = await session.call_tool(
|
|
31
|
+
"request_human_task",
|
|
32
|
+
arguments={
|
|
33
|
+
"task_type": "verification",
|
|
34
|
+
"description": "TEST: Pruefe ob die Landing-Page erreichbar ist",
|
|
35
|
+
"max_price_usd": 2.0,
|
|
36
|
+
},
|
|
37
|
+
)
|
|
38
|
+
msg = res.content[0].text
|
|
39
|
+
print("\n=== request_human_task Antwort ===")
|
|
40
|
+
print(msg)
|
|
41
|
+
|
|
42
|
+
tid = re.search(r"task_id=([a-f0-9]+)", msg).group(1)
|
|
43
|
+
print("task_id:", tid)
|
|
44
|
+
|
|
45
|
+
t = q.get_task(tid)
|
|
46
|
+
print("\n=== DB-Status (sollte pending sein) ===")
|
|
47
|
+
print(f" status={t['status']} typ={t['task_type']} max=${t['max_price_usd']}")
|
|
48
|
+
|
|
49
|
+
q.complete(tid, "OK - HTTP 200, Seite erreichbar")
|
|
50
|
+
print("\n[Mensch hat erfuellt: 'OK - HTTP 200, Seite erreichbar']")
|
|
51
|
+
|
|
52
|
+
res2 = await session.call_tool("get_task_status", arguments={"task_id": tid})
|
|
53
|
+
print("\n=== get_task_status Antwort ===")
|
|
54
|
+
print(res2.content[0].text)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
if __name__ == "__main__":
|
|
58
|
+
asyncio.run(main())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|