▸ 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 and /openapi.yaml. Whatever your stack speaks, there is a manifest for it.
▸ Discovery
Four manifests, one control plane.
Each manifest describes the same dispatch surface, in its own format — generated from one source of truth, so they cannot drift apart.
/mcp.jsonMCP manifestServer name, endpoint URL, negotiated protocol versions, and the dispatch 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.
/.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 |
|---|---|---|
| agentic.readiness_probe | Public | Free multi-surface storefront readiness snapshot (UCP/ACP discovery, product schema, robots, answer-engine maps). Not an attested Store Guard grade. Response includes a Store Guard $149 CTA. No API key required. |
| dispatch.quote | x-api-key | Request a field-service quote by trade, location, and urgency. Returns availability and quote details when available. Accepts a provisioned integration key through x-api-key or, when OAuth is enabled, a scoped self-serve OAuth token through Authorization: Bearer. MCP also accepts the provisioned key through Authorization: Bearer. Request a key at [email protected]. Anonymous callers receive HTTP 401 with WWW-Authenticate. Public modeled pricing is available through dispatch.estimate. |
| dispatch.estimate | Public | Public modeled field-service price estimate using cited BLS wage data and disclosed model assumptions. Returns wage_basis and billed_estimate so callers can inspect the calculation and geographic basis. The response identifies estimates based on a national baseline and distinguishes model assumptions from observed prices. Use dispatch.quote with an accepted credential to request a quote. No API key required. |
| dispatch.order | x-api-key | Create a field-service order and return its status URL. HTTP 201 returns a created order; HTTP 202 returns an order accepted_pending_fulfilment with fulfilled=false. Order creation requires a provisioned integration key through x-api-key. MCP also accepts that key through Authorization: Bearer; direct REST order creation requires x-api-key. A self-serve OAuth token authenticates but is not entitled to create orders: HTTP 402 payment_required (JSON-RPC -32002 over MCP). Anonymous callers receive HTTP 401 with WWW-Authenticate. Provisioning contact: [email protected]. |
| dispatch.evals | Public | Return the public evaluation document for a selected rolling window. Consult its per-field provenance and methodology to distinguish self-reported estimates, measurements, and unavailable fields. It is not an independent audit or a service-level guarantee. No API key required. |
| dispatch.index | Public | Return the catalog of 8 dispatch trade verticals. Per trade: the BLS OES hourly WAGE (medianRateDollars/p25/p75 — what a technician earns, NOT a price) alongside billedHourlyRateRoutineDollars, what a buyer pays hourly at routine urgency, derived by the same wage→billed transform dispatch.estimate uses. See the wage_vs_billed block. 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.