ifURI docs

MCP and A2A

How an LLM client calls ifURI URI routes as tools.

> In one sentence: ifURI turns your project's actions into URI routes, the > urirun runtime compiles them into a registry, > and ifuri-app urirun-mcp *projects* that registry as MCP > tools (and an A2A agent card) — so a client like Claude can discover and call > them, while every call still passes the urirun policy gate.

Sites: ifuri.com · docs.ifuri.com · examples.ifuri.com · get.ifuri.com · connect.ifuri.com · logo.ifuri.com · roadmap.ifuri.com Repos: if-uri/app · tellmesh/urirun

The contract

A route is a stable address scheme://target/resource/operation. A binding describes how to run it (adapter + JSON-Schema input). Many bindings compile into one registry. The same registry is what the CLI runs, what the HTTP/MCP server serves, and what flows call. See docs: registry-and-bindings and transports.

Pipeline (what happens, step by step)

project artifacts ──scan──▶ bindings.v2.json ──compile──▶ registry.json
                                                              │
                                   ┌──────────────────────────┼───────────────────────────┐
                                   ▼                          ▼                            ▼
                          MCP tools/list             A2A agent card                 tools/call
                       (to_mcp_tools)              (to_a2a_card)                   (call_tool)
                                   │                                                     │
                                   ▼                                                     ▼
                        Claude / MCP client  ───── JSON-RPC over stdio ─────▶  urirun.v2.run
                                                                                         │
                                                                       resolve_route → validate_input
                                                                       → adapter + policy gate → result

1. Declare / scan → bindings

You write bindings by hand, generate them with decorators, or scan a project.

2. Compile → registry

3. Project → MCP tools / A2A card

This is the bridge from "URI registry" to "agent tools".

Example:

ifuri-app urirun-mcp tools --registry generated/registry.json
# -> {"ok": true, "tools": [{"name": "sys_local_echo_hello", "inputSchema": {...}}, ...]}

4. Serve over stdio → a client connects

Register it in an MCP client (e.g. Claude Desktop / Claude Code) as a command server:

{
  "mcpServers": {
    "ifuri": {
      "command": "ifuri-app",
      "args": ["urirun-mcp", "serve", "--registry", "/path/generated/registry.json"]
    }
  }
}

5. The client discovers → calls

1. Client sends tools/list → server returns the projected tools. 2. Client sends tools/call {name, arguments}urirun.v2_mcp.call_tool() maps the tool name back to a URI (via build_tool_index()) and runs it.

6. Run → resolve, validate, gate, execute

call_tool (and the in-process path dispatch_local()) both end in urirun.v2.run():

The same registry, other surfaces

Because the contract is constant, the registry feeds more than MCP:

Libraries used

Try it

pip install "git+https://github.com/tellmesh/urirun.git@v0.3.12#subdirectory=adapters/python"
ifuri-app urirun-scan ./project --registry-out generated/registry.json
ifuri-app urirun-mcp tools --registry generated/registry.json   # what a client sees
ifuri-app urirun-mcp serve --registry generated/registry.json   # connect Claude here

More: commands · getting-started · runnable examples.ifuri.com.