urirun

urirun://project/home

One URI registry for commands across code, shell, containers, and services.

Declare a route once, compile it into a registry, and call the same URI in-process or over HTTP, gRPC, a queue, serverless, Docker, MCP, or an A2A agent card.

quickstart GitHub install
curl -fsSL https://ifuri.com/urirun/install.sh | sh
urirun --help
urirun scan ./project \
  --out generated/bindings.v2.json \
  --registry-out generated/registry.json
urirun list generated/registry.json
urirun run 'tool://local/report/render' --registry generated/registry.json
Runtimeurirun
Repositorytellmesh/urirun
Default contractv2 JSON Schema
Executiondry-run first

urirun://schema

One contract, many runtimes.

Packaging commands starts with a schema. A decorator, helper, or artifact scan generates a binding, then urirun compiles it into a registry and runs the same URI everywhere.

fn Write a function Types and defaults are the source of truth.
{ } Generate a binding inputSchema plus argv or shell template is emitted.
Compile registry Routes are validated and discoverable.
Run the URI Dry-run first; execute only after policy allows it.
decorator + Pydantic

The decorator turns a function signature into a binding.

Types and defaults become JSON Schema, while the returned argv list becomes a deterministic command template.

declaration
import urirun
from urirun.v2 import decorated_bindings

@urirun.command("media://local/video/transcode")
def transcode(input: str, output: str, width: int = 1280, height: int = 720):
    return ["ffmpeg", "-i", "{input}", "-vf", "scale={width}:{height}", "{output}"]
binding + registry
from urirun.v2 import compile_registry, decorated_bindings

bindings = decorated_bindings()
registry = compile_registry(bindings)

flow://registry/build

Use existing artifacts as URI packages.

The useful path is not writing a new SDK. Point urirun at what your project already ships, generate bindings, validate the registry, and run by URI.

repo://project/artifacts/query/scan

Scan artifacts

Read Dockerfile labels, package metadata, Make targets, shell scripts, and explicit bindings.

registry://local/routes/command/compile

Compile a registry

Turn portable binding files into one lookup tree for every runtime.

policy://local/execution/query/check

Gate execution

Dry-run first, then require allow rules for real argv, shell, Docker, or network calls.

flow://local/task/command/run

Run the same URI

Call it from shell, backend, browser, Docker service, MCP tool, or A2A agent card.

transport://any/adapter/query

Same URI, different runtime.

A URI names what should run. The transport decides how it runs: in-process, argv, shell, Docker, HTTP, gRPC, a message queue, serverless, MCP, or A2A. The contract and the policy gate stay in one place.

in-process v2.run / local-function dispatch
argv Safe argument templates, no shell
shell Policy-gated shell templates
Docker docker-run / docker-exec, image labels
HTTP v2_service: POST /run, GET /routes
gRPC v2_grpc: Run, RunStream, ListRoutes
queue topic -> v2.run consumer (MQTT/NATS/Kafka shape)
serverless pure handler(event) function
MCP / A2A tools/list, tools/call, agent card

docs://local/index/query

Documentation.

examples://repo/current/query

Examples that show the layers working together.

The examples are intentionally small: they show how one registry can be used by browser UI, backend services, Docker workers, generators, and firmware-style adapters.

Four noVNC desktops (pc1 controller, pc2 service-node, pc3 client-node, pc4 monitor-node) in one dashboard, each terminal streaming URI-flow JSON events
novnc_lan_flow: four Docker computers communicating over one URI contract (pc://…, log://…), shown together in a dashboard.
v2/examples/transports

One registry driven over five transports (in-process, queue, serverless, HTTP, gRPC) plus a simple scan & run.

v2/examples/multi_transport

Docker stack mixing HTTP and gRPC workers: auto-generated registry, conflict detection, and a cross-environment flow.

v2/examples/docker_uri_flow

Docker Compose services communicating through generated URI bindings, with a library-native service dispatcher.

v2/examples/html_uri_app

Browser UI that calls a Python backend through URI actions and exposes logs, MCP tools, and an A2A card.

v2/examples/generators

JS, Node.js, TypeScript, and PHP declarations that generate the same v2 binding contract.

todo://urirun/usability/query

Next usability work.

  1. urirun init for a starter registry, policy, and example route
  2. urirun doctor for environment, dependency, port, and route conflict checks
  3. urirun serve for a local route browser, log viewer, dry-run console, and policy-gated execution
  4. standard log:// routes across frontend, backend, shell, firmware, and Docker examples
  5. urirun diff for comparing registries before deployment