▸ Agent quickstart · steadywrk.app
Wire SteadyWrk into your agent.
The dispatch control plane already runs at /api/mcp and /api/a2a. Two of its tools — dispatch.evals and dispatch.index — are public. No key, no account, no waiting list. Point an agent at them and read live dispatch quality before you route a single job.
Discovery is published at /mcp.json, /openapi.yaml, and /ai-plugin.json. Whatever your stack speaks, there is a manifest for it.
▸ Discovery
Four manifests, one control plane.
Each manifest describes the same four tools and the same endpoints — they are generated from one source of truth, so they cannot drift apart.
/mcp.jsonMCP manifestServer name, endpoint URL, negotiated protocol versions, and the four tools — mirrors tools/list on /api/mcp.
/openapi.yamlOpenAPI 3.1REST contract for the public reads and the key-gated quote + order endpoints, accurate to the live route handlers.
/ai-plugin.jsonPlugin manifestOpenAI-style plugin descriptor pointing at the OpenAPI document. Declares the no-auth read surface.
/.well-known/agent-card.jsonA2A agent cardAgent2Agent skill card for the live /api/a2a endpoint. The discovery doc for skill-based agents.
▸ Start keyless
Connect the evals tool in one step.
Pick the surface that matches your client. Every snippet below calls dispatch.evals with no credentials. Swap in dispatch.index for the trade-rate catalog — also keyless.
{
"mcpServers": {
"steadywrk-dispatch": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://steadywrk.app/api/mcp"]
}
}
}# List tools (no key)
curl -sS https://steadywrk.app/api/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# Call the keyless evals tool
curl -sS https://steadywrk.app/api/mcp \
-H 'content-type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "dispatch.evals",
"arguments": { "period": "rolling_30d" }
}
}'# A2A message/send — invoke the evals skill (no key)
curl -sS https://steadywrk.app/api/a2a \
-H 'content-type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": {
"role": "user",
"parts": [
{ "kind": "data",
"data": { "skill": "dispatch.evals",
"input": { "period": "rolling_30d" } } }
]
}
}
}'# The same evals data over plain REST (no key)
curl -sS 'https://steadywrk.app/api/dispatch/analytics/evals?period=rolling_30d'
# The trade-rate catalog (no key)
curl -sS 'https://steadywrk.app/api/dispatch/index'The MCP config uses the mcp-remote bridge so stdio-only hosts can reach the Streamable-HTTP endpoint by URL. The key for write tools lives on the server, never in your client config — so this stays the same whether or not write access is enabled.
▸ Tool surface
What needs a key, and what does not.
Reads are open. Writes are gated by a server-side dispatch key. When that key is not set, the server answers quote and order with a coming_soon result instead of failing — so discovery and evals stay usable end-to-end.
| Tool | Auth | What it returns |
|---|---|---|
| dispatch.quote | x-api-key | Return an instant dispatch quote for a field-service job. Accepts trade + location + urgency and returns matched contractor, estimated cost in cents, ETA tier, and valid_for_minutes. |
| dispatch.order | x-api-key | Create a dispatch work order. Auto-matches a contractor from the active pool and returns a tracked order with masked contractor reference and status URL. |
| dispatch.evals | Public | Return the public evals dashboard: completion rate, NTE variance, dispatch latency, human-override rate, and operational counts for the selected rolling window. No API key required. |
| dispatch.index | Public | Return the catalog of 8 dispatch trade verticals with baseline model rates (routine urgency, 1.0× multiplier). Rates are STEADYWRK model rates informed by BLS OES data — not BLS verbatim. No API key required. |
Read the evals, then route.
The keyless evals tool is the audit step. When you are ready to quote and order, request a dispatch key and the same client config gains write access.