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.
Files changed (24) hide show
  1. humanbottasks-0.1.2/Dockerfile +9 -0
  2. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/FORUM_POSTS.md +69 -69
  3. humanbottasks-0.1.2/GUIDE.md +76 -0
  4. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/LAUNCH_POST.md +33 -33
  5. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/PKG-INFO +7 -2
  6. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/README.md +49 -44
  7. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/SUBMISSION.md +44 -44
  8. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/alarm.py +2 -2
  9. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/index.html +91 -90
  10. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/pyproject.toml +1 -1
  11. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/server.json +2 -2
  12. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/store.py +3 -1
  13. humanbottasks-0.1.2/test_mcp_client.py +58 -0
  14. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/.gitignore +0 -0
  15. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/LICENSE +0 -0
  16. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/config/claude_desktop_config.json +0 -0
  17. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/config/cursor_mcp.json +0 -0
  18. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/data/reported_ids.txt +0 -0
  19. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/demo.py +0 -0
  20. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/fulfill.py +0 -0
  21. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/glama.json +0 -0
  22. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/http_demo.py +0 -0
  23. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/server.py +0 -0
  24. {humanbottasks-0.1.0 → humanbottasks-0.1.2}/test_smoke.py +0 -0
@@ -0,0 +1,9 @@
1
+ FROM python:3.12-slim
2
+
3
+ WORKDIR /app
4
+
5
+ COPY server.py store.py fulfill.py alarm.py pyproject.toml README.md LICENSE ./
6
+
7
+ RUN pip install --no-cache-dir "mcp<2"
8
+
9
+ CMD ["python", "server.py"]
@@ -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 --from git+https://github.com/humanbottasks/humanbottasks 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 --from git+https://github.com/humanbottasks/humanbottasks 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 --from git+https://github.com/humanbottasks/humanbottasks 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 --from git+https://github.com/humanbottasks/humanbottasks humanbottasks`
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 --from git+https://github.com/humanbottasks/humanbottasks 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
+ # 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.0
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 --from git+https://github.com/humanbottasks/humanbottasks humanbottasks
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
- Gemanagter Human-Service-Layer fuer AI-Agenten. Ein AI-Agent delegiert ueber MCP
4
- eine Aufgabe, die er nicht selbst kann, an einen Menschen; der Mensch erledigt
5
- sie, der Agent ruft das Ergebnis ab.
6
-
7
- ## MVP-Status
8
- - `server.py` MCP-Server (Tools: request_human_task, get_task_status)
9
- - `store.py` SQLite-Queue (tasks.db)
10
- - `fulfill.py` CLI fuer den Menschen (Tasks ansehen/erledigen)
11
- - `demo.py` End-to-End-Demo (Agent -> Task -> Mensch -> Ergebnis)
12
- - `test_smoke.py` Smoke-Test
13
-
14
- ## Setup & Start
15
- cd humanbottasks
16
- unset PYTHONPATH
17
- uv venv
18
- uv pip install "mcp<2"
19
- uv run server.py
20
-
21
- ## Transporte
22
- uv run server.py # stdio (Claude Desktop, Cursor, lokale Frameworks)
23
- uv run server.py --transport streamable-http # HTTP-Endpoint http://127.0.0.1:8000/mcp (lokal/Remote-Agents)
24
- uv run server.py --transport sse # Legacy-SSE http://127.0.0.1:8000/sse
25
-
26
- Host/Port via Umgebungsvariablen: HBT_HOST (default 127.0.0.1), HBT_PORT (default 8000).
27
- Fuer Remote-Zugriff: HBT_HOST=0.0.0.0 setzen.
28
-
29
- ## Install (fuer andere Builder, 1 Zeile)
30
- uvx --from git+https://github.com/humanbottasks/humanbottasks humanbottasks
31
-
32
- ## Task-Typen
33
- verification · physical_action · subjective_judgment · ground_truth_labeling · prove_human
34
-
35
- ## MCP-Clients (installiert + konfiguriert)
36
- - **Claude Desktop**: `C:\Users\marku\AppData\Roaming\Claude\claude_desktop_config.json`
37
- - **Cursor**: `C:\Users\marku\.cursor\mcp.json`
38
- - **Windsurf**: `C:\Users\marku\.codeium\windsurf\mcp_config.json`
39
- - Templates in `config/` (falls neu einrichten noetig)
40
-
41
- ## Naechste Schritte (Reihenfolge)
42
- 1. Nachfrage-Test: Server laeuft, ein echter Agent ruft request_human_task.
43
- 2. Website/Landing fuer Agent-Builder.
44
- 3. Payments (Stripe/Circle) erst, wenn Nachfrage da ist.
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 --from git+https://github.com/humanbottasks/humanbottasks humanbottasks
32
-
33
- ## MCP client config
34
- {"mcpServers":{"humanbottasks":{"command":"uvx","args":["--from","git+https://github.com/humanbottasks/humanbottasks","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
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 = "C:/Users/marku/humanbottasks/tasks.db"
9
- STATE = "C:/Users/marku/humanbottasks/data/reported_ids.txt"
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 --from git+https://github.com/humanbottasks/humanbottasks humanbottasks</div>
65
- <div class="code"><span class="c"># MCP client config (Claude Desktop / Cursor / Windsurf)</span><br>{"mcpServers":{"humanbottasks":{"command":"uvx","args":["--from","git+https://github.com/humanbottasks/humanbottasks","humanbottasks"]}}}</div>
66
- </section>
67
-
68
- <section class="wrap">
69
- <div class="h2">How it works</div>
70
- <div class="steps">
71
- <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>
72
- <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>
73
- <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>
74
- </div>
75
- </section>
76
-
77
- <section class="wrap">
78
- <div class="h2">Task types</div>
79
- <div class="chips">
80
- <span class="chip">verification</span>
81
- <span class="chip">physical_action</span>
82
- <span class="chip">subjective_judgment</span>
83
- <span class="chip">ground_truth_labeling</span>
84
- <span class="chip">prove_human</span>
85
- </div>
86
- </section>
87
-
88
- <footer><div class="wrap">humanbottasks — human fallback for AI agents. © 2026</div></footer>
89
- </body>
90
- </html>
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.0"
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.0",
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.0",
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
- DB = os.path.join(os.path.dirname(os.path.abspath(__file__)), "tasks.db")
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