mcpField
H
human-dispatch-mcp

human-dispatch-mcp

本地服务
github.com/zyntarasystems商业与营销022 周前更新

关于 human-dispatch-mcp

human-dispatch-mcp 将 AI Agent 的任务路由给注册的人类服务提供方,面向需要委托现实世界或数字任务的 Agent 运营者与服务商。它按能力、地区、预算及可靠性匹配,并在无匹配时回退到手动处理。

主要功能

  1. 01按类别、地区和预算匹配提供方
  2. 02支持回退链与手动后备
  3. 03跟踪任务状态及完成凭证
  4. 04注册和管理 Webhook 提供方
  5. 05筛选、分页查看任务

适用场景

  1. 01把现场或数字任务分派给服务商
  2. 02追踪任务进度与完成证明
  3. 03接入服务商 Webhook 并接收任务
  4. 04无匹配提供方时转为手动处理

MCP 相关

作为 MCP 服务,它通过 stdio 或 HTTP 向客户端提供任务分派、状态查询、取消及提供方管理工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"zyntarasystems-human-dispatch": {
"command": "npx",
"args": [
"-y",
"human-dispatch-mcp"
],
"env": {
"RENTAHUMAN_API_KEY": "<RENTAHUMAN_API_KEY>",
"MTURK_ACCESS_KEY_ID": "<MTURK_ACCESS_KEY_ID>",
"MTURK_SECRET_ACCESS_KEY": "<MTURK_SECRET_ACCESS_KEY>",
"MTURK_SANDBOX": "<MTURK_SANDBOX>",
"MANUAL_WEBHOOK_URL": "<MANUAL_WEBHOOK_URL>"
}
}
}
}
启动命令npx -y human-dispatch-mcp
需要配置的环境变量
RENTAHUMAN_API_KEY密钥API key for the RentAHuman.ai backend
MTURK_ACCESS_KEY_ID密钥AWS access key ID for the Amazon Mechanical Turk backend
MTURK_SECRET_ACCESS_KEY密钥AWS secret access key for the Amazon Mechanical Turk backend
MTURK_SANDBOXSet to "false" to use MTurk production environment (defaults to sandbox mode)
MANUAL_WEBHOOK_URLWebhook URL for the manual backend to send task notifications

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmhuman-dispatch-mcp0.2.2

工具

5

收录的工具列表 · 更新于 2 周前

参数类型必填说明
budgetobject是任务的预算限制
budget.max_usdnumber是此任务愿意支付的最高金额(USD)
budget.currencystring否货币代码——目前仅支持 USD
categoryenum是任务类别——决定哪些后端最适合errand | photo_video | data_collection | verification | delivery | digital_micro | in_person | custom
deadlineobject是任务需要完成的时间
deadline.urgencyenum是紧急程度:low=数天,medium=数小时,high=不到一小时,asap=立即low | medium | high | asap
deadline.complete_bystring是任务必须完成的 ISO 8601 日期时间(例如:'2025-01-15T18:00:00Z')
locationany否任务应执行的位置。实体任务必填。数字任务设为 null 或省略。
metadataobject否供你自行跟踪使用的任意键值对(例如:{'order_id': '12345', 'agent_name': 'my-bot'})
task_typeenum是任务是否需要亲自到场、仅限数字方式,或两者兼有physical | digital | hybrid
descriptionstring是清晰、详细地描述人工工作者应执行的事项。具体说明地点、时间安排和预期输出。示例:'Take a photo of the menu board at the Starbucks on 5th Ave and 42nd St, NYC'
quality_slaenum是质量与速度的权衡:low=最快/最便宜,medium=默认,high=经过验证的工作者并提供多项证明low | medium | high
callback_urlany否用于接收状态更新通知的 Webhook URL。如果改为轮询状态,请设为 null 或省略。
fallback_chainarray否首选后端失败时使用的后备后端有序列表。'manual' 后端始终可作为最后手段。
proof_requiredarray是工作者完成任务时必须提交的证明类型。至少需要一项。示例:['photo', 'gps_checkin']
preferred_backendsarray否用于分配此任务的首选后端服务,按顺序尝试。若省略,路由器会自动选择最佳后端。

详细介绍

human-dispatch-mcp

🌐 humandispatch.ai — 主页和服务提供方文档

AI Agent 到人工任务路由的通用调度层 — 任何企业(律师事务所、虚拟助理服务、自由职业者、代理机构)都可以通过 webhook 接入,并在几分钟内开始接收由 AI 调度的任务。

将任务路由到已注册的 webhook 服务提供方,并支持智能匹配、备用链和完成凭证跟踪。任何服务提供方都可以注册 webhook,路由器会根据能力、地区和预算将任务匹配给服务提供方。

快速开始

# Clone and install
git clone https://github.com/zyntarasystems/human-dispatch-mcp.git
cd human-dispatch-mcp
npm install

# Configure (optional — works out of the box with manual fallback)
cp .env.example .env

# Build and run
npm run build
node dist/index.js

使用 MCP Inspector 测试

验证服务是否正常工作的最简单方法:

npx @modelcontextprotocol/inspector node dist/index.js

打开 http://localhost:5173,输入终端中显示的代理会话令牌,然后点击 连接。

测试步骤:
  1. 列出后端 — 调用 human_list_backends,查看 webhook_provider 和 manual

  2. 注册服务提供方 — 调用 human_register_provider:

{
  "name": "Test Provider",
  "webhook_url": "https://webhook.site/your-uuid",
  "webhook_secret": "a-secret-that-is-at-least-32-chars-long!",
  "categories": ["digital_micro"],
  "task_types": ["digital"],
  "regions": ["*"],
  "min_budget_usd": 0,
  "max_budget_usd": 500,
  "max_concurrent_tasks": 10
}
  1. 调度任务 — 使用 原始 JSON 输入模式调用 human_dispatch_task:
{
  "description": "Test task — verify the MCP server is routing correctly",
  "category": "digital_micro",
  "task_type": "digital",
  "budget": { "max_usd": 5, "currency": "USD" },
  "deadline": {
    "complete_by": "2026-04-10T18:00:00Z",
    "urgency": "low"
  },
  "proof_required": ["text_report"],
  "quality_sla": "low",
  "callback_url": null
}

任务应路由到已注册的服务提供方。如果没有匹配的服务提供方,任务会转到手动后端。

MCP 客户端配置

Claude Desktop / Cursor / 任意 MCP 客户端
{
  "mcpServers": {
    "human-dispatch": {
      "command": "npx",
      "args": ["human-dispatch-mcp"]
    }
  }
}
HTTP 传输

注意: HTTP 传输仅绑定到 127.0.0.1。如需远程访问,请在服务前放置一个负责 TLS 终止的反向代理(例如 nginx、Caddy)。切勿直接暴露端口。

必需: 未设置 MCP_AUTH_TOKEN 时,HTTP 传输会拒绝启动。所有 POST /mcp 请求都必须包含 Authorization: Bearer <MCP_AUTH_TOKEN>。/callbacks/task/:taskId 端点使用 HMAC 签名进行身份验证,因此服务提供方不会看到 Bearer 令牌。

{
  "mcpServers": {
    "human-dispatch": {
      "command": "npx",
      "args": ["human-dispatch-mcp"],
      "env": {
        "TRANSPORT": "http",
        "PORT": "3000",
        "MCP_AUTH_TOKEN": "a-long-random-string-32-chars-or-more"
      }
    }
  }
}

工具参考

工具说明
human_dispatch_task将任务提交给最匹配的服务提供方,由人工工作者完成
human_get_task_status查询任务当前状态、工作者信息和完成凭证提交情况
human_cancel_task取消待处理或进行中的任务
human_list_tasks使用筛选条件(状态、后端、类别)和分页列出任务
human_list_backends显示可用后端、其配置状态和能力
human_register_provider注册 webhook 服务提供方以接收调度的任务
human_list_providers使用统计信息和筛选条件列出已注册的服务提供方
human_remove_provider注销 webhook 服务提供方

架构

┌─────────────┐
│   AI Agent   │
│ (Claude, etc)│
└──────┬───────┘
       │ MCP Protocol (stdio or HTTP)
       ▼
┌──────────────────────────────────────┐
│     human-dispatch-mcp Server        │
│                                      │
│  ┌────────────┐  ┌────────────────┐  │
│  │ Task Store │  │ Provider       │  │
│  │ (in-memory)│  │ Registry       │  │
│  └────────────┘  └───────┬────────┘  │
│                          │           │
│  ┌────────────┐  ┌───────▼────────┐  │
│  │   Router   │──│  Webhook       │  │
│  │  (scoring) │  │  Provider      │  │
│  └──────┬─────┘  │  Adapter       │  │
│         │        └───────┬────────┘  │
│         │                │           │
│         │    ┌───────────▼─────────┐ │
│         │    │ Provider A (law)    │ │
│         │    │ Provider B (VA)     │ │
│         │    │ Provider C (photos) │ │
│         │    └─────────────────────┘ │
│         ▼                            │
│  ┌────────────┐                      │
│  │   Manual   │ (always-on fallback) │
│  │  Adapter   │                      │
│  └────────────┘                      │
└──────────────────────────────────────┘

面向服务提供方

任何企业都可以注册为服务提供方,以接收由 AI 调度的任务。操作方法如下:

1. 设置 webhook 端点

你的端点会收到包含以下标头的 POST 请求:

标头说明
x-dispatch-signaturesha256=<hmac_hex> — 使用共享密钥对请求正文计算的 HMAC-SHA256
X-Dispatch-Event事件类型:task.new、task.cancel 或 provider.verify
X-Dispatch-TaskId任务的 UUID
2. 处理 task.new 事件

请求正文:

{
  "payload_version": 1,
  "event": "task.new",
  "task_id": "uuid",
  "description": "What needs to be done",
  "category": "photo_video",
  "task_type": "physical",
  "location": { "address": "123 Main St", "region": "US" },
  "budget": { "max_usd": 25, "currency": "USD" },
  "deadline": { "complete_by": "2026-04-10T18:00:00Z", "urgency": "medium" },
  "proof_required": ["photo", "gps_checkin"],
  "quality_sla": "medium"
}

payload_version 是请求格式的版本;请将解析器固定为已知版本,并拒绝未知版本。目前仅发送 1。

响应:

{ "accepted": true, "external_id": "your-internal-id" }

或者拒绝:

{ "accepted": false, "reason": "Outside service area" }
处理 provider.verify 事件

注册服务提供方时,服务器会立即 POST 一个 provider.verify 事件,以确认端点可访问且愿意接收任务。仅返回 200 还不够——你的端点必须在 JSON 正文中返回 { "verified": true }。其他任何情况(字段缺失、值为 false、非 JSON)都会将验证标记为不可访问。这样一来,注册就需要端点明确同意,而不仅仅是 URL 可访问。

3. 报告完成情况(仅限 HTTP 传输)

使用以下标头向 http://<server>/callbacks/task/<task_id> 发送 POST 请求:

  • x-provider-id:你的服务提供方 UUID
  • x-dispatch-signature:正文的 sha256=<hmac_hex>
{
  "status": "completed",
  "proof": [
    { "type": "photo", "url": "https://...", "submitted_at": "2026-04-10T12:00:00Z" }
  ],
  "actual_cost_usd": 20,
  "notes": "Task completed successfully"
}
4. 验证 HMAC 签名

始终使用共享密钥验证传入的 Webhook:

const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signatureHeader));

HMAC 规范化约定(至关重要):签名是基于请求 POST 时使用的确切字节计算的,而不是基于重新序列化的 JSON 对象计算的。发送回调时,应对实际发送到网络上的字节串进行签名——不要解析请求正文,再将其重新序列化后签名,因为键的顺序或空白可能不同。使用一次 JSON.stringify(payload),保存生成的字符串,对该字符串签名,并发送该字符串。服务端接收时也遵循相同规则:在任何 JSON 解析器处理请求正文之前,先捕获原始请求正文缓冲区。

智能路由

路由器会根据以下因素自动选择最佳后端:

  1. Agent 偏好 — 优先遵循 preferred_backends 和 fallback_chain
  2. 提供方匹配 — 类别、任务类型、区域和预算兼容性
  3. 可靠性 — 优先尝试完成率较高的提供方
  4. 速度 — 速度更快的提供方得分更高
  5. 回退 — manual 后端始终可用,作为最终回退选项

Agent 使用示例

使用 LangGraph 的 Python
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient

async def dispatch_photo_task():
    async with MultiServerMCPClient({
        "human": {
            "command": "node",
            "args": ["path/to/human-dispatch-mcp/dist/index.js"],
            "transport": "stdio",
        }
    }) as client:
        tools = client.get_tools()

        # Register a provider first
        await client.call_tool("human_register_provider", {
            "name": "Photo Service Co",
            "webhook_url": "https://photos.example.com/webhook",
            "webhook_secret": "your-secret-that-is-at-least-32-characters",
            "categories": ["photo_video"],
            "task_types": ["physical"],
            "regions": ["US"],
            "min_budget_usd": 5,
            "max_budget_usd": 100,
            "max_concurrent_tasks": 20
        })

        # Dispatch a task
        result = await client.call_tool("human_dispatch_task", {
            "description": "Take a photo of the menu board at Starbucks on 5th Ave, NYC",
            "category": "photo_video",
            "task_type": "physical",
            "location": {
                "address": "5th Ave & 42nd St, New York, NY",
                "region": "US"
            },
            "budget": {"max_usd": 15, "currency": "USD"},
            "deadline": {
                "complete_by": "2026-01-15T18:00:00Z",
                "urgency": "medium"
            },
            "proof_required": ["photo", "gps_checkin"],
            "quality_sla": "medium"
        })
        print(result)

asyncio.run(dispatch_photo_task())

环境变量

变量默认值说明
TRANSPORTstdio传输模式:stdio 或 http
PORT3000HTTP 端口(当 TRANSPORT=http 时)
MCP_AUTH_TOKEN—当 TRANSPORT=http 时,每个 POST /mcp 请求都必须提供的 Bearer 令牌。未设置时,HTTP 传输不会启动。
MANUAL_WEBHOOK_URL—用于手动任务通知的 Webhook URL
PROVIDERS_CONFIG—用于在启动时预先填充提供方的 JSON 对象数组

安全性

此服务代表调用方处理出站 HTTP 请求,旨在可信的基础设施中运行。相关保障如下:

  • HTTP 传输需要身份验证。 MCP_AUTH_TOKEN 为必填项;未设置时,服务不会启动。Bearer 令牌比较采用恒定时间算法(timingSafeEqual)。
  • 已在 POST /mcp 上启用 DNS 重绑定防护。 如果请求的 Host 标头指向的不是配置的回环地址,传输层会拒绝该请求。
  • 出站 URL 防护。 服务获取的每个 Webhook URL(提供方注册、MANUAL_WEBHOOK_URL、callback_url、证明 URL)都会经过结构化验证:仅允许 HTTPS,不允许回环地址、RFC1918 / 链路本地 / 唯一本地地址主机,并在获取时进行 DNS 解析检查,以防范最后一刻的重绑定。无法禁用此防护 — 本地测试请使用公共隧道(ngrok、cloudflared)。
  • 入站回调通过 HMAC 而非 IP 进行身份验证。 每个提供方都会注册自己的 Webhook 密钥。服务会在解析 JSON 之前,基于原始请求字节验证 x-dispatch-signature。每个提供方都受令牌桶限流,限制回调洪泛(突发 30 次,持续每秒 5 次)。
  • 终态保护。 任务进入 completed、failed 或 cancelled 状态后,针对该任务的回调都会被拒绝,并返回 409。这可阻止重放、提供方的延迟重试以及提供方驱动的状态变更。
  • Webhook 负载版本控制。 所有出站正文都带有 payload_version 和 event 判别字段。请固定解析器版本,并拒绝未知版本。
  • Webhook 密钥不会离开服务端。 MCP 工具返回的提供方数据经过清理,不包含 webhook_secret。该字段也绝不会出现在日志中。
  • 不持久化。 任务、提供方和每个任务的状态都保存在内存中。重启服务会丢弃所有状态。如果在生产环境中运行此服务,请妥善终止,以便进行中的任务能够快速失败,而不是一直卡在提供方处。

如果发现安全问题,请在 GitHub 上私下提交安全公告,而不要创建公开问题。

路线图

  • 持久化提供方注册表(SQLite / PostgreSQL)
  • 任务过期和自动重试
  • 提供方质量评分和反馈循环
  • 调度前估算成本
  • 批量提交任务
  • 提供方仪表板 / 管理界面
  • 基于 OAuth 的提供方身份验证

参与贡献

添加新的后端适配器
  1. 在 src/services/backends/ 中创建一个新文件
  2. 扩展 BaseBackendAdapter
  3. 实现 BackendAdapter 接口中的所有方法
  4. 在 src/types.ts 的 BackendId 枚举中添加后端 ID
  5. 在 src/index.ts 中注册该适配器

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。