---
title: "Order Real-World Services from Claude — ROJI Integration | roji.ai"
description: "Claude agents hit walls only a real business can clear. Connect mcp.roji.ai or define ROJI as a tool: search the catalog, order a listed service from a verified business, and consume a typed deliverable."
doc_version: f927356e9e53
last_updated: 2026-09-10
---
# Order Real-World Services from Claude — ROJI Integration | roji.ai

Developers

Claude / Anthropic

Real-world services for Claude

If your agent runs on Claude, the integration is one line: add mcp.roji.ai as an MCP server. Claude speaks the whole ordering surface natively — search, fee preview, order, questions, deliverables.

Get started

## The problem

Claude-based agents — Claude Code, the Agent SDK, bespoke tool-use loops — are exceptionally good at knowing what they *can't* do. What they lack is anywhere to send it. "I need a human to notarize this" currently ends the run with a message to the operator.

## The MCP path (recommended)

Add the server; the tools appear. Claude reads the listing schema itself — it is genuinely good at matching a requirement to a published service — and the async lifecycle fits Claude's agentic loop:

```text
1. Claude calls search_services, then get_service (schema + fee preview)
2. Claude calls order_service with the accepted fee_preview_id — paid at order
3. order.question_asked → Claude answers against the typed schema
4. order.delivered → Claude calls get_deliverable: schema-valid data
5. Not what the listing promised? request_refund, then review_business
```

(ordering tools land with the platform release)

Clients on the MCP `2026-07-28` stack additionally get the **Tasks** extension — protocol-native poll/resume on long-running calls, and mid-call input — but nothing requires it; `2025-11-25` clients run the same lifecycle over webhooks and polling.

## The raw tool-use path

No MCP in your loop? Define one tool and handle the async completion yourself. Illustrative sketch — pair it with a `search_services` call so Claude picks a real listing before it orders:

```python
# illustrative — not a published SDK
tools = [{
    "name": "order_service",
    "description": "Order a listed service from a verified business on roji. "
                   "The listing sets the price and the SLA; the order is paid "
                   "at order time. Returns an order id immediately; the "
                   "deliverable arrives via webhook. Use for licensed, "
                   "physical, or judgment work you cannot perform.",
    "input_schema": {
        "type": "object",
        "properties": {
            "service_id": {"type": "string"},
            "inputs": {"type": "object"},
            "fee_preview_id": {
                "type": "string",
                "description": "From get_service. The exact itemized total "
                               "you accepted before any charge."
            }
        },
        "required": ["service_id", "inputs", "fee_preview_id"]
    }
}]
```

## What to expect

Turnaround is a property of the [category](/categories), not the model: minutes for verification calls and urgent field dispatch, days for review and judgment work. Either way your agent does not guess — the business publishes its SLA on the listing, and the SLA is visible before ordering. Orders are paid at order and ROJI never holds the money; if the business rejects the order or misses its SLA, the refund is automatic and full. Details on the [ordering page](/developers/ordering) and the [developer overview](/developers).

Design partners

Get started

## Sitemap

- [Every public page, as markdown](/sitemap.md)
- [llms.txt](/llms.txt) · [AGENTS.md](/AGENTS.md) · [auth.md](/auth.md)
