Connect Codex to Urable
Set up in minutes
Choose where it runs
On your computer through your own Codex, or hosted in the cloud. The rest of setup adapts to your choice:
Pick what it can do in Urable
A preset of real Urable operations. Each one becomes a tool the agent can call, and it can't touch anything outside the list.
Connect Urable
One sign-in. The agent acts through your account, scoped to the operations you picked.
Add your personal MCP link
The last step mints a private MCP URL for this agent and walks you through exactly this, with your real link filled in. The page flips to Connected the moment your Codex first calls in. Codex connects when a session starts — run codex, or restart a running one (in the Codex app, Restart).
Run this in your terminal. The Codex app shares its config, so it gets the server too
<your-link> is your personal server URL — setup mints it for you.
Tools Codex gets
Urable
25 toolsList customers. Requires scope `customers:read`.
Retrieve a customer. Requires scope `customers:read`.
Create a customer. Requires scope `customers:write`. `firstName` is required (and cannot be blank).
Update a customer. Requires scope `customers:write`. Only supplied fields are changed.
List items. Requires scope `items:read`.
Retrieve an item. Requires scope `items:read`.
Create an item. Requires scope `items:write`. `customerId` (must exist) and `name` are required. For `lawnCare`, `location` is also required.
Update an item. Requires scope `items:write`. Only supplied fields are changed. Supply `customerId` to move the item to a different customer.
List products/services. Requires scope `products:read`.
Retrieve a product/service. Requires scope `products:read`.
List categories. Requires scope `products:read`. Ordered the way the app lists them (by `num`), not newest-first.
List jobs. Requires scope `jobs:read`. Note: ordering by `start`/`end` only returns jobs that have that field set (i.e. scheduled jobs).
Retrieve a job. Requires scope `jobs:read`.
Create a job. Requires scope `jobs:write`. Send line items as product/service references + quantities; the server looks up prices, embeds the products, and computes the invoice subtotal/tax/total. A sequential `num` is assigned. Requires a customer, an `industry`, at least one `itemId`, and at least one line item. A job's work is always tracked per item, so the invoice comes back with the line items grouped under `invoice.items` — keyed by item ref — rather than as a flat `invoice.lineItems` array. On a job with one item every line item belongs to it; on a job with several, each line item must name its `itemId`, and every item needs at least one line item. A `field` job is performed on site, so it also needs a `location`: send one, or omit it and the customer's location is copied onto the job. It is rejected only when neither exists. A `location` sent on a `shop` job is ignored. If `name` is omitted it defaults to the joined names of the referenced items (e.g. the vehicle names). Jobs are always created `unpaid`. To record an invoice that was already collected, create the job and then record the money with `POST /v1/payments`, which settles the invoice and derives the payment status. When importing history, set `completedAt` to the original completion date along with `status: completed` so the job reports in the right period. The earnings and profit reports only count completed jobs, so `completedAt` without that status is rejected rather than silently leaving the revenue out of every figure. Likewise `canceledAt` requires `status: canceled` in the same request. New jobs pick up the account's default reminders, but the immediate 'job scheduled' confirmation message is suppressed by default so imports can't mass-message customers — pass `deployScheduledMessage: true` to send it (future-dated jobs only, and only when the account's scheduled-message auto-deploy preference is on).
Update a job. Requires scope `jobs:write`. Only supplied fields are changed. If `lineItems` is supplied the invoice is recomputed; otherwise the existing invoice is preserved. Because a job's line items are grouped under the item they are for, `itemIds` and `lineItems` move together: send the line items alongside any change to `itemIds` (they are rebuilt against the new set, and items dropped from the job lose their line items). Payment status is derived from the invoice and cannot be set here; record money with `POST /v1/payments`. A supplied `location` replaces the job's address outright (the derived `formattedAddress`, `geoPoint` and `timeZone` are all recomputed). On a job that is or becomes `field` and has no location yet, the customer's is copied onto it; the request is rejected only when neither exists. Changing `type` to `shop` clears the job's location.
List events. Requires scope `events:read`.
Retrieve an event. Requires scope `events:read`.
Create an event. Requires scope `events:write`. `name`, `start`, and `end` are required.
List orders. Requires scope `orders:read`.
Retrieve an order. Requires scope `orders:read`.
List payments. Requires scope `payments:read`. Filter by `jobId`, `orderId`, or `subscriptionId` to find the payments applied to a specific record.
Retrieve a payment. Requires scope `payments:read`.
List proposals. Requires scope `proposals:read`. Proposals are read-only via the API. Use `createdAfter` or `updatedAfter` (Unix ms) to poll for new/changed proposals cheaply instead of paging through the full history; supplying either overrides `orderBy` to match the filtered field.
Retrieve a proposal. Requires scope `proposals:read`.
List users. Requires scope `users:read`. Returns every team member on the account (not paginated). Users are read-only via the API.
About Codex
Frequently asked questions
More ways to connect
Open your Codex agent in one click.
NoClick runs Codex for you with Urable wired in as tools. Connect your account and run.