Skip to main content
Glama

Native Agent Runtime Router (NAR)

English | 简体中文

Route coding tasks from an orchestrator agent (Codex / opencode / Claude Code) to native CLI worker agents (ZCode, any ACP-compatible agent) through a small, deterministic, model-free kernel.

The kernel never calls a model. It handles task state, bounded waiting, workspace locking, fixed verification, one pre-authorized repair, cancellation with confirmation, budgets, recovery, usage accounting and per-agent scoring — so the orchestrator spends its tokens on judgment, not on polling and log-shuffling.

Orchestrator (Codex / opencode / Claude Code)
        |  MCP (5 stable tools)  or  CLI (`nar`)
        v
  Model-free kernel: tasks, locks, verification, repair, budget, recovery
        v
  Pluggable native adapters
   ├── zcode-native   (ZCode app-server protocol 0.16, verified live on 0.16.5)
   ├── acp-generic    (Agent Client Protocol, verified live on opencode 1.18.15)
   └── your adapter   (small class, see docs/BACKENDS.md)

More native agents are being supported…

  • MCP: nar-mcp exposes exactly five tools: agents, run, wait, inspect, cancel. New backends are added by config, not by new tools.

  • CLI: nar shares the same kernel (debugging, scripting, humans).

  • Token discipline: compact results by default; full logs/diffs on disk, paged via inspect; deterministic scoring per task (zero tokens) feeds routing.

Install

Requires Python >= 3.10. For the ZCode adapter: Node.js >= 22 and the ZCode desktop app (or its CLI on PATH). For ACP agents: any ACP server binary.

pip install native-agent-router        # or: pipx install native-agent-router
# from a clone:
pip install -e .

Verify environment and discovery:

nar doctor

nar doctor prints what it found (ZCode bundle, node, git) and what to do if something is missing. It never prints credentials.

Related MCP server: peer-cli-mcp

Quickstart

  1. Create the config (optional — auto-discovery works without it):

mkdir -p ~/.native-agent-router
cp config.example.json ~/.native-agent-router/agents.json
  1. List agents, submit a complete work unit, wait, inspect:

nar agents
nar run zcode "Implement parse_flag() in flags.py per the docstring; only modify flags.py" \
    /abs/path/to/project --mode build --policy allow --scope flags.py --verify "python -m pytest -q" --wait 600
nar wait <task_id>
nar inspect <task_id> summary
nar inspect <task_id> diagnose      # sanitized, shareable error report
  1. Continue the SAME native session for follow-up work on the same module:

nar run zcode "Now handle the --verbose edge case we discussed" /abs/path/to/project \
    --session-ref <previous_task_id> --mode build --policy allow --verify "python -m pytest -q"

Configuration (the teaching section)

Config file lookup order: --config flag → NAR_CONFIG env → <home>/agents.json (home = NAR_HOME env or ~/.native-agent-router) → built-in defaults + auto-discovery.

Top-level settings

Key

Default

Meaning

wait_default_sec

120

default bounded block for wait

wait_max_sec

3600

cap on a single wait call (does NOT cap task timeouts)

timeout_default_sec

1800

default per-turn timeout

verify_timeout_sec

600

timeout per verification command

max_result_chars

12000

result summary budget returned to the orchestrator

repair_default

true

one pre-authorized targeted repair per task

verify_allow_shell

false

verify commands run without a shell (argv / shlex.split); set true only if you need shell semantics

require_git_baseline

false

fail-closed: refuse to run a worker in a non-git workspace so changes are always auditable

Agents

Every task must name an agent_id explicitly. There is no global "selected backend" that other calls could silently change.

Key

Applies to

Meaning

adapter

all

zcode-native, acp-generic, or stub (tests)

enabled

all

set false to hide an agent

command

acp-generic

argv that starts the ACP server, e.g. ["opencode","acp"]

cwd_arg

acp-generic

some ACP servers want --cwd <ws>; set the flag name here

model

both

model selection (see below)

model_args

acp-generic

CLI-arg model injection template, e.g. ["--model","{model}"]

provider

zcode-native

ZCode provider id from your own ~/.zcode/v2/config.json

thought_level

zcode-native

e.g. low / high / max (per model capabilities)

default_mode

zcode-native

plan (read-only) / build / edit / yolo

default_permission_policy

both

deny (default, honest) or allow (auto-approve within one task)

tool_allowlist

zcode-native

native tool-set restriction, e.g. ["Read","Grep","Glob"]

zcode_home

zcode-native

"isolated" = keep NAR's ZCode sessions in a private home (see docs/SECURITY.md)

credentials

zcode-native

auto (default): reuse the user's own ZCode config; see below

env

both

extra env for the agent subprocess (do NOT put secrets in here; they land in config files)

Model selection

  • ZCode (zcode-native): set provider + model (+ optional thought_level). NAR builds ZCode 0.16's runtimeModel payload from your own ~/.zcode/v2/config.json and passes it inside the protocol only. No credential is ever copied to disk by default, no provider/base URL/billing channel is changed, and cold session/resume works (verified live on 0.16.5).

  • ACP agents (acp-generic): NAR first tries the ACP-native path — session/set_config_option / session/set_model (works with opencode, whose session/new advertises a model config option) — then falls back to model_args CLI substitution (e.g. gemini --experimental-acp --model X).

ZCode discovery (how zcode.cjs is found)

Order: ZCODE_BIN env → zcode on PATH → Windows registry uninstall entries (InstallLocation) → %LOCALAPPDATA%\Programs\ZCodeProgram Files\ZCode on every drive. If none match, nar doctor tells you exactly what to set. The desktop app does not add its CLI to PATH — that is normal.

Credentials, honestly

credentials: "auto" reads (read-only) the provider you already configured in the ZCode desktop app and passes the same provider/model/base-URL/key to the headless app-server in the protocol payload only. NAR never logs keys, never uploads them anywhere, never switches billing channels, and never bypasses authentication or plan limits. If you prefer a private session store, set zcode_home: "isolated" (documents trade-offs in docs/SECURITY.md).

MCP integration

Run nar-mcp over stdio. Examples:

Codex (~/.codex/config.toml):

[mcp_servers.native-agent-router]
command = "nar-mcp"
args = []

opencode (opencode.json in your project or ~/.config/opencode/):

{ "mcp": { "native-agent-router": { "type": "local", "command": ["nar-mcp"], "enabled": true } } }

Claude Code (.mcp.json):

{ "mcpServers": { "native-agent-router": { "command": "nar-mcp" } } }

Then ask your orchestrator, in one sentence: "Run agents, then run this task to zcode with scope and verify, and wait for it." See skill/native-agent-router/SKILL.md for the delegation rules you can drop into any agent's skill folder.

The five MCP tools

Tool

Purpose

agents

configured agents + capabilities + score stats (routing data)

run

submit one complete work unit (goal/scope/forbid/verify/budget/mode/session_ref)

wait

bounded block until terminal/blocked; never busy-polls

inspect

paged on-demand reads: status/summary/diff/verify/log/raw/usage/diagnose

cancel

request stop and report whether it was confirmed

run returning means submitted, not done. Only succeeded|failed|cancelled|blocked|interrupted are final. On blocked the kernel keeps the workspace lock and watches the native session until a real terminal event arrives (or you cancel/kill).

CLI reference

nar agents | doctor | list
nar run <agent_id> <goal> <workspace> [--scope ...] [--verify "cmd"] [--mode build]
        [--policy allow|deny] [--session-ref TASK] [--timeout N] [--wait N]
        [--budget N] [--idempotency-key K] [--no-repair]
nar wait <task_id> [--timeout N]
nar inspect <task_id> [status|summary|diff|verify|log|raw|usage|diagnose] [--offset N] [--limit N]
nar cancel <task_id>
nar kill <task_id> --yes        # force: terminate agent + release lock (user boundary)
nar stats [agent_id]            # deterministic per-agent score statistics

Tests

pip install -e ".[dev]"
pytest -q                 # 64 tests, no model calls, no network
pytest -q -m real         # opt-in: hits your real installed agents (spends tokens!)

Docs

ARCHITECTURE.md · BACKENDS.md · VERIFY.md · BENCHMARK.md · SECURITY.md · ROLLBACK.md · Skill

Status & honesty

  • Verified live on this machine: ZCode 0.16.5 (read-only, native resume, edit+verify, permission handling, real usage), opencode 1.18.15 over ACP (handshake, model switch, resume). Evidence paths in docs/VERIFY.md.

  • Not yet verified here: Gemini CLI (not installed), Claude Code as ACP (installed but currently unusable per user), Codex as orchestrator client.

  • No claim of "optimal" or fixed savings percentage: see BENCHMARK.md for what was measured and what wasn't.

  • MIT licensed. Independent community project; not affiliated with Z.AI/ZCode, OpenAI Codex, or SST/opencode.

Available Tools

5 tools
agentsA

List configured worker agents and their capabilities (adapter type, transport, native session resume support, usage accounting quality) plus per-agent SCORE STATS (avg_score, success_rate, repair_rate, out_of_scope_rate, blocked_rate, avg_tokens, median_duration_sec, last_tasks). Use the stats to route work: high-score agents for hard units, cheaper/lower-score agents for well-specified mechanical units. Use this before run() to pick a valid agent_id.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the behavioral burden. The verb 'List' clearly signals a read-only operation, and the description discloses the exact output categories and stats. It does not mention staleness or permission requirements, but those are minor for a zero-parameter enumeration tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but dense and purposeful: it front-loads the core list action, then presents output fields and routing strategy. Some field enumeration overlaps with the output schema, but the added interpretation and usage guidance justify the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter listing tool with an output schema and a clear follow-up action (run), this description is complete. It tells the agent what it will receive, how to interpret the stats, and how to apply them when selecting an agent_id. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema description coverage is 100%, so there is no parameter burden for the description to compensate for. The description correctly focuses on output semantics and usage rather than input semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List configured worker agents and their capabilities' — a specific verb and resource — and enumerates the exact stats returned. It also distinguishes itself from lifecycle siblings by explicitly positioning agents as the discovery step before run().

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It says explicitly to use this before run() to pick a valid agent_id, and gives a concrete routing heuristic: high-score agents for hard units, cheaper/lower-score agents for well-specified mechanical units. This is actionable guidance for when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancelA

Request cancellation and report whether the stop was CONFIRMED by the native runtime (confirmed=true only on an observed terminal/exit). A cancel request alone is not a stop.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It reveals a critical non-obvious trait: confirmed=true is only set on an observed terminal/exit, and the cancel request itself does not guarantee a stop. This is genuinely useful runtime semantics. It does not mention output format or whether the call blocks, but the core behavior is well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tightly written sentences. The first states the primary action; the second delivers a crucial caveat that prevents misinterpretation. There is no filler, no repetition of the tool name, and the most important semantic distinction is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema and no annotations, the description covers the essential cancellation semantics well. However, it leaves gaps: it does not define the return shape or clarify whether the reported confirmation is immediate or requires polling. These omissions are notable because there is no output schema for the agent to lean on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It never explains the task_id parameter beyond implying it identifies what to cancel. There is no mention of how to obtain the ID, what format it must take, or whether it must come from a run call. The agent can only infer the parameter's role from the tool name and general context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Request cancellation and report whether the stop was CONFIRMED by the native runtime." It precisely scopes the tool's behavior and distinguishes it from siblings like run, wait, and inspect. The added clarification that a cancel request alone is not a stop removes ambiguity about what the tool actually accomplishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance about when to call this tool versus alternatives such as wait or inspect. It implies cancellation happens after a task is running, but it never says whether this should follow a run call, whether wait is needed to confirm the stop, or under what conditions cancellation is appropriate. The agent is left to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspectA

Read task details on demand (logs/diffs stay on disk; read slices here). what: status | summary | diff | verify | log | raw | usage | diagnose.

  • diagnose returns a compact SANITIZED report (secrets/emails/blobs redacted, size-bounded) with a stable code and actionable hints — safe to share.

ParametersJSON Schema
NameRequiredDescriptionDefault
whatNostatus
limitNo
offsetNo
task_idYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden. It explicitly discloses that logs/diffs stay on disk, that inspect reads slices rather than whole artifacts, and that `diagnose` returns a sanitized, size-bounded report with redacted secrets/emails/blobs and a stable `code` + `hints`. These are genuinely useful, non-obvious behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and uses a short list plus one focused bullet for the special `diagnose` behavior. Every sentence earns its place without redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with no output schema and no annotations, the description covers purpose, allowed `what` values, disk behavior, and the important sanitization guarantee for `diagnose`. It could elaborate on the return shape of the other `what` variants and on offset/limit semantics, but the information provided is sufficient for basic correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides zero parameter descriptions and no enums, so the description's explicit `what: status | summary | diff | verify | log | raw | usage | diagnose` list adds real selection value. It does not explain `task_id`, `limit`, or `offset` in detail, but 'read slices here' and the default values make their roles inferable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a direct verb and resource: 'Read task details on demand,' and then enumerates the concrete read slices via the `what` list. This clearly distinguishes `inspect` from the process-oriented sibling tools (`run`, `wait`, `cancel`, `agents`).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'on demand' signals that inspect is the async/read-side counterpart to running or waiting, and the sibling names make the operational contrast obvious. It does not explicitly name alternatives or exclusion conditions, but the usage context is clear enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

runA

Submit a complete work unit to a worker agent and return its task_id.

Requirements:

  • agent_id: exact id from agents(); every task is explicitly bound to one agent.

  • goal: full objective, constraints and context in ONE prompt (complete work unit; do not ping-pong per file/line).

  • workspace: directory path (canonicalized to an absolute path by the kernel).

  • scope_files: RELATIVE paths the worker may modify (absolute or escaping paths are rejected; enforced by diff audit).

  • forbid: extra prohibitions.

  • verify: commands executed by the kernel after the turn; the worker cannot pass by editing them. Prefer list form; string form is arg-split (no shell) unless config verify_allow_shell is on. Exit code 0 = pass.

  • mode: adapter-specific permission mode (zcode: plan|build|edit|yolo).

  • session_ref: task_id of a previous task on the SAME agent+workspace to continue its native session. Cross-agent/workspace reuse is rejected.

  • timeout_sec: per-turn timeout; on timeout the task becomes blocked (never silently resubmitted; the lock is held and a watcher keeps observing).

  • wait_sec: bounded block until finish (default: return immediately).

  • budget_tokens: hard token budget; exceeded -> task failed (budget_exceeded).

  • permission_policy: "deny" (default) or "allow" (auto-allow within this task).

  • repair_allowed: one pre-authorized targeted repair attempt (default true).

  • idempotency_key: resubmitting the same key returns the original task.

Returns a snapshot dict with ok/status/code. A run() success only means SUBMITTED, not done — follow with wait()/inspect().

ParametersJSON Schema
NameRequiredDescriptionDefault
goalYes
modeNo
forbidNo
verifyNo
agent_idYes
wait_secNo
workspaceYes
scope_filesNo
session_refNo
timeout_secNo
budget_tokensNo
repair_allowedNo
idempotency_keyNo
permission_policyNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it delivers. It discloses timeout behavior (task becomes blocked, never silently resubmitted), budget behavior (task failed with budget_exceeded), idempotency, verify enforcement ('worker cannot pass by editing them'), and the critical nuance that run() success only means SUBMITTED, not done. These are behavioral traits well beyond what any scaffold would imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and is organized as a parameter-by-parameter list, making it scannable. It is long, but each line earns its place given 14 parameters and zero schema descriptions. A small deduction for length, but the structure is effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 14 parameters, 0% schema coverage, no output schema, no annotations, and sibling tools for follow-up, the description is remarkably complete. It covers submission semantics, return meaning, timeout/budget edge cases, and explicitly points to wait()/inspect() for next steps. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate entirely, and it does. Each of the 14 parameters is explained with purpose and constraints—e.g., session_ref requires same agent+workspace, verify prefers list form, scope_files must be relative. The description adds meaning far beyond the raw schema names and types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Submit a complete work unit to a worker agent and return its task_id.' This clearly distinguishes the tool from siblings like agents, wait, inspect, and cancel by naming the submission action and the immediate return. The scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit requirements and behavior for each parameter, including constraints like 'complete work unit; do not ping-pong per file/line' and 'absolute or escaping paths are rejected.' It also tells the agent to follow up with wait()/inspect() after a successful submission, which is clear when-to-use guidance versus the siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

waitA

Bounded blocking wait for a task to reach a terminal or blocked state. Does not busy-poll. Returns the snapshot dict; if it still runs when the timeout expires, wait_timed_out=true — call again later. 'submitted'/'running' is NOT completion; only status succeeded/failed/blocked/cancelled/interrupted is.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes
timeout_secNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it discloses non-busy-polling, bounded blocking, the returned snapshot dict with wait_timed_out flag, and the exact terminal status set. It does not mention errors or side effects, but for a wait operation this is solid coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with no redundancy: core purpose, no busy-poll, return/flag behavior, and terminal-status exclusions. The key scoping statement is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given only two simple parameters and no output schema, the description is complete enough: an agent knows what to pass, what the timeout means, what the response flag indicates, and which statuses count as completion. No critical gap prevents correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates by explaining timeout_sec behavior: if still running, wait_timed_out=true and call again later. It also clarifies that task_id refers to a task awaiting terminal/blocked state. Parameter names and defaults remain in the schema, but the important operational semantics are added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'bounded blocking wait for a task to reach a terminal or blocked state'. It also says 'does not busy-poll', which separates it from inspect (passive status check), run (initiation), and cancel (mutation), so an agent can tell it apart from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: wait until a terminal status, handle timeout by re-calling later, and do not treat 'submitted'/'running' as completion. It does not explicitly name alternatives or when-not-to-use, but the guidance is strong enough to direct an agent to correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv1.0.0
    • First observedagents
    • First observedcancel
    • First observedinspect
    • First observedrun
    • First observedwait

TDQS

A4.2/5.0
Disambiguation5/5

Each tool covers a distinct lifecycle stage: agents discovers workers, run submits a unit of work, wait blocks for completion, inspect reads task details, and cancel aborts. There is no meaningful overlap or ambiguity between them.

Naming Consistency4/5

The verb-style names run, wait, inspect, and cancel are clear and consistently formatted. 'agents' is a minor deviation since it is a noun command rather than a verb_noun action like list_agents, but the pattern is still easy to predict.

Tool Count5/5

Five tools is well-scoped for the server's purpose: agent discovery, task submission, waiting, inspection, and cancellation. Each tool has a clear role and none feel redundant.

Completeness4/5

The core agent-routing and task lifecycle is well covered: discover agents, submit tasks, wait, inspect, and cancel. A minor gap is the lack of a task-listing or search tool if a task_id is lost, but this does not prevent normal workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/BerineYang/native-agent-router'

If you have feedback or need assistance with the MCP directory API, please join our Discord server