Doorstep — Real-World Task Execution (San Francisco Only)
Doorstep lets you make things happen in the physical world. When the user needs something picked up, delivered, purchased, or done in person, use Doorstep. Coverage is limited to San Francisco, CA. Decline or caveat any request for a location outside SF.
Setup
Before first use, ask the user how they want to connect:
How would you like to connect to Doorstep?
- 1. Agent self-registration (recommended) — No browser needed. Register programmatically and get an API key.
- npx bridge — Recommended for OpenClaw. Requires an API key.
- HTTP — Simpler setup for clients that support HTTP MCP. Uses OAuth, no API key needed.
Option 1: Agent self-registration (no browser)
If the user doesn't have an account yet, you can create one programmatically. First, connect to the auth server (no authentication required) and call the register tool:
CODEBLOCK0
Call the register tool with the user's email and a password (min 8 characters). It returns a DOORSTEP_API_KEY. Then configure the main Doorstep MCP server with the key:
CODEBLOCK1
The auth server can be removed from the config once the main server is connected.
Alternatively, register via the REST API:
CODEBLOCK2
The response includes api_key and user_id. Store the API key securely — it will not be shown again.
Option 2: npx bridge
- 1. Generate an API key at trydoorstep.app/dashboard/api-keys (sign in first), or use the
register tool / REST API above. - Add the Doorstep MCP server to your configuration:
CODEBLOCK3
If the user hasn't set DOORSTEP_API_KEY yet, direct them to trydoorstep.app/dashboard/api-keys to create one, or use the register tool to create an account and key programmatically.
Option 3: HTTP
For MCP clients that support HTTP transport (e.g. Claude Desktop):
CODEBLOCK4
On first use you'll be prompted to log in via your browser. No API key needed.
When to Use This Skill
Use Doorstep when the user asks you to do something that requires a person to physically go somewhere. Examples:
- - "Pick up coffee from Blue Bottle and bring it to my office"
- "Deliver flowers to 123 Main St in SF"
- "Buy a birthday card from a store near Union Square and drop it off"
- "Grab my dry cleaning from the place on Valencia"
- "Run to the hardware store and get a pack of 3M Command hooks"
Do NOT use Doorstep for things that can be done digitally (ordering online, sending emails, booking reservations via an API, etc.).
Coverage
San Francisco only. If the user asks for a task outside SF, let them know Doorstep is currently SF-only.
Tools
do
Create a task. Describe what needs to happen in plain language. Doorstep researches the request, builds a step-by-step plan, and returns a quote.
Parameters:
- -
input (string, required) — Natural-language description of what needs to be done. - INLINECODE10 (object, optional) — Addresses, preferences, timing, or other structured details.
- INLINECODE11 (number, optional) — Maximum budget in USD. The quote must come in at or under this.
- INLINECODE12 (string, optional) — Webhook URL for task update notifications.
The tool waits up to 2 minutes for the quote. If the quote is ready, you get the plan and pricing immediately. Otherwise, call wait_for_update with the returned task ID to get notified when the quote is ready.
list_tasks
List your tasks, newest first. Optionally filter by status. Returns a summary of each task (ID, status, input, creation time, and pricing if quoted). Use get_task for full details on a specific task.
Parameters:
- -
status (string, optional) — Filter by task status (received, researching, needs_info, quoted, approved, in_progress, completed, failed, cancelled). - INLINECODE26 (number, optional) — Maximum number of tasks to return (default 20, max 50).
get_task
Check the current status of a task. Returns the full task including status, plan, quote, resolution, and any follow-up questions.
Parameters:
- -
task_id (string, required) — The task UUID.
approve_task
Approve a quoted task and authorize payment. Only call this after the user has seen and agreed to the quote. The card on file is charged the quoted amount.
Parameters:
- -
task_id (string, required) — The task UUID to approve.
revise_quote
Request changes to a quote. Provide feedback and the task is re-researched with a new quote generated.
Parameters:
- -
task_id (string, required) — The task UUID. - INLINECODE33 (string, required) — What you want changed (e.g. "Keep it under $50" or "Use a different shop").
cancel_task
Cancel a task. Behaviour depends on the task's current state:
- - Before payment (
received, researching, needs_info, quoted) — cancelled immediately at no cost. - After payment, doer not started (
approved, or in_progress without doer acceptance) — cancelled with a full refund. - Doer actively working (
in_progress with doer accepted) — cancellation is allowed but no refund is issued. The tool returns a warning and requires force: true to confirm. - Terminal (
completed, failed, cancelled) — cannot be cancelled.
Parameters:
- -
task_id (string, required) — The task UUID to cancel. - INLINECODE47 (boolean, optional) — Set to
true to confirm cancellation of an in-progress task with an active doer (no refund).
respond_to_task
Answer a follow-up question. When a task has status needs_info, Doorstep needs more details before proceeding.
Parameters:
- -
task_id (string, required) — The task UUID. - INLINECODE52 (string, required) — Your answer to the follow-up question.
get_messages
Get the message thread for an in-progress task. Includes doer questions, your replies, and system notes.
Parameters:
- -
task_id (string, required) — The task UUID.
send_message
Send a message to the tasker working on your task. Relayed via SMS.
Parameters:
- -
task_id (string, required) — The task UUID. - INLINECODE57 (string, required) — The message to send.
rate_task
Leave a rating for a completed task. Only works on tasks with status completed. One rating per task.
Parameters:
- -
task_id (string, required) — The task UUID. - INLINECODE61 (integer, required) — Star rating from 1 (poor) to 5 (excellent).
- INLINECODE62 (string, optional) — Optional text feedback about the task experience.
get_receipt
Get a cost breakdown for a task. Returns estimated costs (from the quote) and actual costs (from the doer's final bill, if submitted). Useful after task completion to see what was charged.
Parameters:
- -
task_id (string, required) — The task UUID.
Returns:
- -
estimated — The quote breakdown (tier, pass-through, platform fee, total) in cents. - INLINECODE66 — The doer's final bill breakdown (tasker rate, task cost, platform fee, total) in cents.
null if the doer hasn't submitted a final bill yet. - INLINECODE68 — Completion notes and details.
wait_for_update
Block until something changes on a task — a status transition, a new doer message, or task completion. Returns the event that occurred. Use this instead of manually polling get_task.
Parameters:
- -
task_id (string, required) — The task UUID to watch. - INLINECODE72 (number, optional) — How long to wait in seconds (default 120, max 300).
Returns one of:
- - A task event (
task.quoted, task.status_changed, task.message, task.completed) with details. - INLINECODE77 if the timeout expires with no updates — just call
wait_for_update again.
register (auth server only)
This tool is available on the auth server at https://trydoorstep.app/mcp/auth, not the main server. See Option 1 in Setup above.
Create a new Doorstep account programmatically. No prior authentication required. Returns an API key to use for all subsequent requests. The user gets a full account they can also log into at trydoorstep.app.
Parameters:
- -
email (string, required) — Email address for the account. - INLINECODE82 (string, required) — Password for the account (min 8 characters).
- INLINECODE83 (string, optional) — Display name.
Returns:
- -
api_key — The API key to use as a Bearer token. - INLINECODE85 — The user's internal ID.
- INLINECODE86 — URL where the user can add a payment method (required before creating tasks).
get_account
Check account status and whether billing is set up. Returns a billing URL if no card is on file. Also warns if no emergency contact phone number is confirmed — doers need a way to reach the requester if the agent goes offline during a task.
No parameters.
get_settings
Get the current account settings, including emergency contact info.
No parameters.
update_settings
Update account settings. Only provided fields are changed.
Parameters:
- -
monthly_spending_limit (number, optional) — Maximum total spend per calendar month in USD (null to remove limit). - INLINECODE91 (string, optional) — Emergency contact phone number. Doers use this to reach you if your agent is offline during a task. Setting this confirms the number as your emergency contact.
Task Lifecycle
- 1. received — Task created, Doorstep is researching.
- researching — Actively gathering info on availability, pricing, logistics.
- needsinfo — Follow-up question for the user. Use
respond_to_task. - quoted — Plan and price ready. Show them to the user and ask for approval.
- approved — User approved, payment charged, tasker being assigned.
- inprogress — A tasker is actively working on the request.
- completed — Done. Resolution details available via
get_task. - failed / cancelled — Task did not complete.
Safety Rules
- - Quote approval is required by default. When a quote comes back, always present the plan, pricing, and estimated total to the user and ask for their explicit approval before proceeding. Only call
approve_task after the user confirms. - The user may override this by instructing you to auto-approve tasks (e.g. "just handle it", "approve anything under $30"). Follow their instructions, but never auto-approve unless they have explicitly told you to.
- Always present the price in dollars, not cents (divide
estimated_total_cents by 100). - If
get_account shows no payment method, direct the user to the billing_url before attempting to create a task. - If
get_account shows no emergency contact (has_emergency_contact: false), prompt the user for a phone number and call update_settings to set it. Doers need this to reach the requester if the agent goes offline. - Tasks are for San Francisco only. Decline or caveat requests for other locations.
Pricing
Tasks are priced with a flat labor tier based on effort and time, plus pass-through costs for any purchases or supplies at cost:
- - $5 — Simple tasks under 20 minutes (e.g. deliver a package nearby, pick up a single coffee, drop off a key).
- $10 — Tasks over 20 minutes or with moderate complexity (e.g. grocery run, restaurant pickup with a wait, cross-town delivery).
- $20 — Multi-step or involved tasks (e.g. multi-stop errands, laundry drop-off/pick-up, shopping at multiple stores).
The platform fee is included in the quoted total. The user always sees the full breakdown before approving.
Staying Up to Date
Doorstep tasks are handled by real people and can take minutes to hours. Use wait_for_update to subscribe to real-time task events instead of manually polling. Tool responses will tell you when to call it — follow those instructions when you see a message like "Call waitforupdate with task_id ...".
When to use wait_for_update:
- - After
do — if the quote isn't returned inline (status is still researching), call wait_for_update to get notified when the quote is ready. - After
approve_task — loop on wait_for_update to track the task through in_progress to completed, and to catch doer messages. - After
revise_quote — if the revised quote isn't returned inline, call wait_for_update to get notified when it's ready. - After
respond_to_task — if the task goes back to received for re-research, call wait_for_update to get notified when the new quote arrives.
How to loop:
- 1. Call
wait_for_update with the task ID. It blocks for up to 2 minutes waiting for something to happen. - When it returns an event, act on it:
-
task.quoted — Present the plan and price to the user.
-
task.message — A doer sent a message. Show it to the user. Reply via
send_message if needed.
-
task.status_changed — Status moved (e.g.
approved →
in_progress). Inform the user.
-
task.completed — Done. Share the resolution with the user. Stop looping.
- 3. If it returns
no_change, call wait_for_update again to keep listening. - Keep looping until the task reaches
completed, failed, or cancelled, or the user tells you to stop.
Keep the user informed. If several calls return no_change, let them know the task is still in progress. A brief "Still waiting on the tasker — I'll keep checking" is fine.
Fallback: If wait_for_update is unavailable, you can poll get_task every 30–60 seconds instead.
Common Patterns
Create, approve, and track to completion:
- 1. User: "Send a dozen roses to 456 Oak St SF"
- Call
do with the request - Show the user the plan and price from the response
- If user agrees, call INLINECODE132
- Confirm the task is underway
- Loop on
wait_for_update — relay doer messages, status changes, and completion to the user
Subscribe after approval:
- 1. Call INLINECODE134
- Call
wait_for_update in a loop - On
task.message — show the doer's question, get the user's answer, call INLINECODE137 - On
task.completed — share the resolution, stop looping - On
no_change — call wait_for_update again
Check on a running task:
- 1. User: "How's my delivery going?"
- Call
get_task with the task ID - If in_progress, check
get_messages for doer updates - Report back to the user
Handle doer questions:
- 1. Call
get_messages to see if the doer asked something - Show the question to the user
- Call
send_message with their answer
Doorstep — 现实世界任务执行(仅限旧金山)
Doorstep 让您能够在现实世界中完成各种事务。当用户需要取件、送货、购买或亲自办理某件事时,请使用 Doorstep。服务范围仅限于加利福尼亚州旧金山。 对于旧金山以外的地点请求,请予以拒绝或说明限制。
设置
首次使用前,请询问用户希望如何连接:
您希望如何连接到 Doorstep?
- 1. 智能体自助注册(推荐) — 无需浏览器。通过编程方式注册并获取 API 密钥。
- npx bridge — 推荐用于 OpenClaw。需要 API 密钥。
- HTTP — 适用于支持 HTTP MCP 的客户端,设置更简单。使用 OAuth,无需 API 密钥。
选项 1:智能体自助注册(无需浏览器)
如果用户还没有账户,您可以通过编程方式创建一个。首先,连接到认证服务器(无需认证)并调用 register 工具:
json
{
mcpServers: {
doorstep-auth: {
url: https://trydoorstep.app/mcp/auth
}
}
}
使用用户的邮箱和密码(至少 8 个字符)调用 register 工具。它会返回一个 DOORSTEPAPIKEY。然后使用该密钥配置主 Doorstep MCP 服务器:
json
{
mcpServers: {
doorstep: {
url: https://trydoorstep.app/mcp,
headers: {
Authorization: Bearer doorstepsk...
}
}
}
}
主服务器连接成功后,可以从配置中移除认证服务器。
或者,通过 REST API 注册:
bash
curl -X POST https://trydoorstep.app/api/register \
-H Content-Type: application/json \
-d {email: user@example.com, password: securepass, name: Alice}
响应中包含 apikey 和 userid。请安全存储 API 密钥——它将不再显示。
选项 2:npx bridge
- 1. 在 trydoorstep.app/dashboard/api-keys 生成 API 密钥(先登录),或使用上述 register 工具 / REST API。
- 将 Doorstep MCP 服务器添加到您的配置中:
json
{
mcpServers: {
doorstep: {
command: npx,
args: [-y, doorstep],
env: {
DOORSTEPAPIKEY: ${DOORSTEPAPIKEY}
}
}
}
}
如果用户尚未设置 DOORSTEPAPIKEY,请引导他们前往 trydoorstep.app/dashboard/api-keys 创建一个,或使用 register 工具以编程方式创建账户和密钥。
选项 3:HTTP
适用于支持 HTTP 传输的 MCP 客户端(例如 Claude Desktop):
json
{
mcpServers: {
doorstep: {
url: https://trydoorstep.app/mcp
}
}
}
首次使用时,系统会提示您通过浏览器登录。无需 API 密钥。
何时使用此技能
当用户要求您做需要有人亲自前往某地的事情时,请使用 Doorstep。例如:
- - 从 Blue Bottle 取咖啡送到我的办公室
- 送花到旧金山 Main 街 123 号
- 在联合广场附近的商店买一张生日贺卡并送过去
- 去 Valencia 街的干洗店取我的干洗衣物
- 去五金店买一包 3M Command 挂钩
对于可以通过数字方式完成的事情(在线订购、发送电子邮件、通过 API 预订等),请勿使用 Doorstep。
服务范围
仅限旧金山。如果用户要求旧金山以外的任务,请告知他们 Doorstep 目前仅限旧金山。
工具
do
创建任务。用自然语言描述需要完成的事情。Doorstep 会研究请求,制定分步计划,并返回报价。
参数:
- - input(字符串,必填)— 需要完成的事情的自然语言描述。
- context(对象,可选)— 地址、偏好、时间或其他结构化细节。
- maxbudget(数字,可选)— 最大预算(美元)。报价必须等于或低于此金额。
- callbackurl(字符串,可选)— 用于任务更新通知的 Webhook URL。
该工具最多等待 2 分钟获取报价。如果报价已准备好,您将立即获得计划和定价。否则,使用返回的任务 ID 调用 waitforupdate,以便在报价准备好时收到通知。
list_tasks
列出您的任务,最新的在前。可选择按状态筛选。返回每个任务的摘要(ID、状态、输入、创建时间和报价后的定价)。使用 get_task 获取特定任务的完整详情。
参数:
- - status(字符串,可选)— 按任务状态筛选(received、researching、needsinfo、quoted、approved、inprogress、completed、failed、cancelled)。
- limit(数字,可选)— 返回的最大任务数(默认 20,最大 50)。
get_task
检查任务的当前状态。返回完整任务信息,包括状态、计划、报价、解决方案以及任何后续问题。
参数:
- - task_id(字符串,必填)— 任务 UUID。
approve_task
批准已报价的任务并授权付款。仅在用户查看并同意报价后调用。将按报价金额从存档的银行卡中扣款。
参数:
- - task_id(字符串,必填)— 要批准的任务 UUID。
revise_quote
请求修改报价。提供反馈后,任务将重新研究并生成新报价。
参数:
- - task_id(字符串,必填)— 任务 UUID。
- feedback(字符串,必填)— 您希望更改的内容(例如控制在 50 美元以内或换一家店)。
cancel_task
取消任务。行为取决于任务的当前状态:
- - 付款前(received、researching、needsinfo、quoted)— 立即取消,不产生费用。
- 付款后,执行者未开始(approved,或执行者未接受的 inprogress)— 取消并全额退款。
- 执行者正在工作(执行者已接受的 in_progress)— 允许取消,但不退款。工具会返回警告,需要 force: true 确认。
- 终态(completed、failed、cancelled)— 无法取消。
参数:
- - task_id(字符串,必填)— 要取消的任务 UUID。
- force(布尔值,可选)— 设置为 true 以确认取消有活跃执行者正在进行的任务(不退款)。
respondtotask
回答后续问题。当任务状态为 needs_info 时,Doorstep 需要更多细节才能继续。
参数:
- - task_id(字符串,必填)— 任务 UUID。
- response(字符串,必填)— 您对后续问题的回答。
get_messages
获取进行中任务的消息线程。包括执行者的问题、您的回复和系统备注。
参数:
- - task_id(字符串,必填)— 任务 UUID。
send_message
向正在处理您任务的执行者发送消息。通过短信转发。
参数:
- - task_id(字符串,必填)— 任务 UUID。
- message(字符串,必填)— 要发送的消息。
rate_task
为已完成的任务评分。仅适用于状态为 completed 的任务。每个任务只能评分一次。
参数:
- - task_id(字符串,必填)— 任务 UUID。
- rating(整数,必填)— 星级评分,从 1(差)到 5(优秀)。
- comment(字符串,可选)— 关于任务体验的可选文字反馈。
get_receipt
获取任务的费用明细。返回预估费用(来自报价)和实际费用(来自执行者的最终账单,如果已提交)。任务完成后查看实际扣费情况时很有用。
参数:
- - task_id(字符串,必填)— 任务 UUID。
返回:
- - estimated — 报价明细(层级、代付费用、平台费、总计),单位为分。
- actual — 执行者最终账单明细(任务者费率、任务成本、平台费、总计),单位为分。如果执行者尚未提交最终账单,则为 null。
- resolution — 完成备注和详情。
waitforupdate
阻塞直到任务发生变更——状态转换、新的执行者消息或任务完成。返回发生的事件。使用此工具代替手动轮