localagents
localagents
Поручите черновую работу Claude Code модели, работающей на вашем собственном оборудовании.
localagents — это MCP-сервер, который предоставляет Claude Code инструмент run_agent. Каждый вызов запускает полноценную headless-сессию Claude Code — те же инструменты, тот же CLAUDE.md, то же рабочее дерево — за исключением того, что его API-трафик идёт на ваш сервер llama.cpp или vLLM, а не на Anthropic. Claude пишет бриф, локальная модель выполняет работу, Claude проверяет результат. Ваш бюджет токенов Anthropic тратится на те части, которые этого требуют.
Qwen 27B на одной GPU вполне способен на «добавь CLI для этого модуля и тесты к нему»; Opus лучше потратить на проектирование, чем на наблюдение за запуском pytest. Два локальных агента параллельно могут собрать две половины пакета по фиксированному интерфейсу.
Статус: ранний. Работает, я пользуюсь им ежедневно, интерфейс будет меняться. Ориентирован конкретно на llama.cpp и vLLM; Ollama не является целью.
Как это работает
Claude Code (your session)
│ MCP: run_agent(task, model=...)
▼
localagents ── spawns ──▶ headless `claude` (Agent SDK)
│ │ ANTHROPIC_BASE_URL
│ ▼
└──── in-process shim ◀────┘ normalises requests, logs them,
│ translates backend errors
▼
llama-server / vllm (/v1/messages, on your machine or your LAN)Три вещи делают это чем-то большим, чем переменная окружения:
Реестр, который опрашивается в реальном времени.
models.yamlперечисляет, где находятся серверы, и меню имён моделей. Что каждый сервер реально обслуживает сейчас, его фактическое контекстное окно и сколько слотов занято — обнаруживается при каждом вызове. Вы поднимаете и опускаете модели вручную — сервер ничего не запускает — и когда Claude нужна модель, которая не запущена, он просит вас назвать её по имени.Прослойка между Claude Code и бэкендом. Claude Code отправляет то, что локальные chat-шаблоны отвергают, а локальные серверы падают так, как Claude Code не распознаёт. Прослойка исправляет оба направления (подробности ниже) и записывает
requests.jsonlдля каждой задачи, чтобы вы могли видеть, что именно ушло по сети.Та же модель изоляции, что и у собственных субагентов Claude. По умолчанию задача работает в вашем дереве, как инструмент Agent.
isolation: worktreeдаёт ей свежий git worktree на веткеlocal-agent/<job>, сохраняемый только если она что-то изменила, с diffstat в записи задачи, чтобы Claude мог просмотреть её как diff.
Related MCP server: lmstudio-mcp
Требования
Python 3.12+ и uv
Claude Code. Agent SDK включает собственный бинарник
claude, так что больше ничего устанавливать не нужно.Сервер, говорящий на Anthropic
/v1/messages:llama.cpp
llama-server— запускайте с--jinja; добавьте--slots --metrics, чтобы получить занятость и статистику кэша в выводе инструмента.vLLM с
--enable-auto-tool-choice --tool-call-parser <parser>.
Модель, которая действительно может управлять Claude Code: надёжный нативный вызов инструментов и контекстное окно 128k или больше на запрос. Qwen3.8-27B работает хорошо. Меньшие окна работают, но постоянно сжимаются; см. Контекстные окна.
Установка
git clone https://github.com/ccebelenski/localagents.git && cd localagents
uv tool install -e . # `localagents` on PATH; editable, so repo edits apply
cp models.example.yaml models.yaml # edit for your servers (gitignored)
claude mcp add --scope user local -- localagents --config "$PWD/models.yaml"Область пользователя означает, что каждый проект получает сервер local. Он наследует текущую рабочую директорию сессии Claude Code, которая его запустила, поэтому run_agent по умолчанию использует дерево этого проекта. Проект может нести собственный ./models.yaml для переопределения реестра.
Если вы предпочитаете ограничить его одним проектом, поместите это в .mcp.json этого проекта:
{"mcpServers": {"local": {"command": "localagents", "args": ["--config", "/path/to/models.yaml"]}}}Перезапустите Claude Code (или /mcp → reconnect) после добавления; MCP-серверы загружаются при запуске.
Использование
Claude подхватывает его как любой инструмент. Попросите по имени, и он сделает всё правильно:
Используй локального агента, чтобы добавить флаг
--jsonв CLI и покрыть его тестами.
Что Claude делает за кулисами: list_models чтобы узнать, что запущено, run_agent(task=…) который возвращает id задачи, затем wait_job / job_status / job_log пока не завершится, затем читает files_touched (или diff worktree) и проверяет работу. Задачи, переживающие 2-минутный таймаут инструмента Claude Code, уходят в фон и подхватываются позже; вам ничего делать не нужно.
Если ничего подходящего не запущено, вас попросят запустить:
qwen3.8-27bнигде не запущен. Попросите пользователя поднять его. Примечания: стандартный среднеразмерный кодер на llama.cpp; запускать с --reasoning on
Запустите его как обычно, скажите «готово», и Claude повторит попытку.
Инструменты
инструмент | что делает |
| endpoints с живым состоянием, обслуживаемыми id, контекстным окном, занятостью слотов; пул с |
| запустить задачу: |
| следить за задачами и управлять ими |
| что сказать пользователю, чтобы поднять модель из пула |
| добавить в пул из сессии (записывается в |
| одноразовая генерация без инструментов — сводки, черновики, классификация |
Записи задач хранятся в ~/.local/state/localagents/jobs/<job>/: transcript.txt (что агент сказал и сделал), events.jsonl (каждое SDK-сообщение), requests.jsonl (каждый запрос к бэкенду с таймингом, размером и использованием), и requests_full.jsonl, если включён дамп запросов.
Конфигурация: models.yaml
Начните с models.example.yaml. Он перечитывается при каждом вызове, поэтому изменения вступают в силу немедленно, и сервер никогда не перезаписывает его — register_* пишут в sidecar models.local.yaml, который объединяется поверх.
endpoints:
llamacpp:
base_url: http://127.0.0.1:8080
backend: llama.cpp
gpu-server:
base_url: http://gpu-server.lan:8000
backend: vllm
host: gpu-server
models:
qwen3.8-27b:
notes: default mid-size coder on llama.cpp; run with --reasoning on
deepseek-v4-flash:
host: gpu-server
notes: vllm needs --enable-auto-tool-choice --tool-call-parser deepseek_v3endpoints — это места, обслуживающие
/v1/messages. Что они обслуживают, определяется зондированием.models — это просто имена. Имя нечётко сопоставляется с обслуживаемыми id (
qwen3.8-27bнаходитunsloth/Qwen3.8-27B-GGUF:UD-Q4_K_XL), поэтому записи нужны толькоnotesи, возможно,hostдля передачи, когда вы просите запустить её.served_name(точный id или glob),endpoint,context(запасное окно) иbring_up(команда запуска) существуют как переопределения, если они нужны. Команды запуска быстро устаревают; имя и заметка обычно живут дольше.defaults покрывают модель по умолчанию,
permission_mode(acceptEdits), разрешённые и запрещённые инструменты (субагенты не могут порождать субагентов), какие настройки Claude загружать,max_turns,timeout_sи суффикс системного промпта, сообщающий агенту, что он делегат и как отчитываться.
Что делает прослойка
И llama.cpp, и vLLM говорят на /v1/messages нативно, поэтому указание ANTHROPIC_BASE_URL на них почти работает. Прослойка закрывает пробелы:
Системные сообщения в середине разговора. Claude Code помещает записи role: system внутри messages — список навыков, маркер бюджета токенов и ещё один за каждый ход. Chat-шаблон Qwen отказывается: "System message must be at the beginning". Прослойка сворачивает каждое из них в соседнее пользовательское сообщение как текстовый блок <system>…</system>, на месте. Подъём их в верхнеуровневое поле system вместо этого меняет начало промпта каждый ход, что инвалидирует префикс KV-кэша сервера и заставляет пересчитывать весь промпт ~35k токенов каждый раз (21–47 с на ход на 27B). Сворачивание на месте сохраняет промпт append-only: f_sim_best 0.88–0.99 в логе llama-server, 2.5–14 с на ход.
Переполнение контекста. Claude Code предполагает окно 200k для любой модели, которую не узнаёт; с меньшим слотом он сталкивается с exceed_context_size_error от llama.cpp, который не понимает, и задача умирает. См. следующий раздел.
Всё, что делает прослойка, — no-op, когда это не нужно, и каждый запрос логируется с таймингом, количеством сообщений, размером в байтах и заявленным использованием.
Контекстные окна
Два слоя удерживают сессию в реальном окне:
Зонд читает его — llama.cpp
/propsn_ctx(на слот:-cделённое на--parallel, когда unified KV выключен), vLLMmax_model_len— и сессия получаетCLAUDE_CODE_MAX_CONTEXT_TOKENS. Собственный авто-компакт Claude Code срабатывает в нужный момент. Ниже 128k бюджет вывода также уменьшается доn_ctx/8, потому что порог компакта —window − max_output— иначе был бы на нуле.Если запрос всё ещё переполняется, прослойка переписывает ошибку бэкенда в Anthropic
prompt is too long: N tokens > M maximum, на что Claude Code отвечает компактом и повтором.
При 64k это работает, но с трудом: фиксированный промпт Claude Code ~20k и схемы инструментов, плюс сводка компакта ~7k токенов (~55 с на 27B) и файлы, которые он повторно прикрепляет, снова заполняют окно через несколько ходов, и его защита от тряски завершает задачу. Дайте каждому слоту 128k или больше.
Заметки по бэкендам
llama.cpp:
llama-server -hf <gguf> --jinja -fa on --slots --metrics, плюс--reasoning onдля думающих моделей и--parallel Nдля параллельных задач. С включённым/slotslist_modelsпоказывает{total, busy, free}, так что Claude знает, запустится ли второй агент сейчас или встанет в очередь. С включённым/metricsкаждая задача записывает обработанные токены промпта против кэшированных, коэффициент попадания в кэш, скорость генерации промпта и токенов, и приём спекулятивного декодирования — счётчики общие для сервера, поэтому перекрывающиеся задачи делят дельту.vLLM:
vllm serve <model> --served-model-name <alias> --enable-auto-tool-choice --tool-call-parser <parser>. Сессия запускается сCLAUDE_CODE_ATTRIBUTION_HEADER=0, потому что хэш атрибуции на каждый запрос ломает префиксное кэширование.Первый ход задачи стоит около 20k токенов промпта на холодном слоте (системный промпт плюс схемы инструментов), ~10 с на 27B. Всё после этого — попадание в кэш плюс дельта.
Разработка
uv sync --dev
uv run pytest -qСм. CONTRIBUTING.md для структуры и как тестировать изменения против реального сервера.
Лицензия
MIT. См. LICENSE.
Copyright © 2026 Chris Cebelenski
Available Tools
11 toolscancel_jobB
Cancel a running job (kills the headless Claude session).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It does disclose a key behavioral trait—that cancellation kills the headless session—but does not elaborate on reversibility, side effects on job output, or whether the cancellation is asynchronous. This is partial disclosure but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no unnecessary words. The core action ('Cancel a running job') is front-loaded, and the parenthetical adds essential behavioral detail. It is highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter cancellation tool, the description covers the essential action and primary side effect. However, it lacks details about error handling (e.g., what happens if the job is already finished), whether cancellation is synchronous, or any prerequisites. The presence of an output schema reduces the need to describe return values, but overall the description is adequate yet not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The only parameter, job_id, is never explained; its meaning is only implied by the tool's purpose. The description does not clarify how to obtain a valid job_id or that it must reference a running job.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Cancel') and a clear resource ('a running job'), and adds the clarifying detail that it 'kills the headless Claude session.' This clearly distinguishes it from related tools like job_status, wait_job, and list_jobs without needing to inspect their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states only what the tool does, not when to use it relative to alternatives. It does not mention conditions for use (e.g., only when a job is running) or contrast with siblings like job_status or wait_job. No guidance on when to avoid this tool is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_logB
Tail of a job's human-readable transcript (assistant text, tool calls, results).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| tail_lines | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It does disclose that the tool returns the tail of a transcript and what content categories are included, but it does not describe behavior for missing jobs, incomplete jobs, or error conditions. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence with no filler. 'Tail of a job's human-readable transcript' is front-loaded and the parenthetical content list adds useful scope without bloating the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has an output schema, so return values need not be re-described. However, with no annotations and no parameter-level details, the description leaves some context implicit, such as the unit for tail_lines and whether the tool is safe for active jobs. An agent can still call it, but the context is minimally sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, but it does not explicitly explain job_id or tail_lines. The word 'Tail' loosely implies tail_lines controls how much is returned, and job_id is inferable from 'a job's transcript', but the meaning of the default and the line-count semantics are left to the schema titles only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and action: retrieving the tail of a job's human-readable transcript. It also clarifies content type (assistant text, tool calls, results), which distinguishes it from status-oriented siblings like job_status or list_jobs, though it does not name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance about when to use this tool versus alternatives such as job_status, wait_job, or list_jobs. The phrase 'tail of a job's transcript' weakly implies a read-after-run scenario, but no exclusions or selection criteria are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_statusB
Current status, last activity, files touched, and result (if finished) of a job.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must bear the transparency burden. It does disclose what the tool reports and notes the conditional result field for finished jobs, but it does not explicitly state that the call is non-mutating, non-blocking, or what happens for unknown jobs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and efficiently lists the key return categories without filler. Minor structural issue: it is a noun phrase rather than a complete verb-led sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the lack of return-value detail is acceptable, and the essentials for invoking with job_id are present. However, the tool lacks usage context and behavioral caveats, leaving an agent to infer how this relates to wait_job and job_log.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needs to compensate, but it only implies job_id through 'of a job'. It does not explain the expected format, where to find the ID, or any constraints beyond the schema's generic string type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource (a job) and lists the exact information returned: current status, last activity, files touched, and result when finished. It is clear enough to separate from list_jobs or wait_job, though it lacks an explicit verb like 'Gets' or 'Returns'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to call this instead of siblings such as wait_job or job_log. The 'if finished' caveat is the only hint about polling behavior; there is no explicit context for choosing this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsA
List jobs from this server session (newest last).
| Name | Required | Description | Default |
|---|---|---|---|
| include_finished | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It usefully discloses ordering and session scoping, but it does not mention side-effect guarantees, pagination, or how include_finished affects results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single concise sentence with no filler. The action is front-loaded, and the scope and ordering details are included efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with one self-explanatory optional boolean and an output schema, the description is mostly sufficient. The main gap is the lack of connection to sibling tools and explicit include_finished behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description never mentions the include_finished parameter. The parameter name and default value imply its meaning, but the description adds no semantic value for it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete action and object ('List jobs'), scopes them to 'this server session', and adds ordering ('newest last'). This clearly distinguishes it from siblings like job_status, job_log, and cancel_job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use list_jobs versus job_status, job_log, or wait_job. It implies a session scope but does not state exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modelsA
List configured endpoints (with live health + what they're serving now) and the model pool.
Pool entries that are currently reachable are marked `available: true` with the endpoint name
and the served id. Unavailable ones are the menu to ask the user for (by name, on `host`).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses live health semantics, the meaning of 'available: true', and how unavailable entries should be treated. Read-only behavior is only implicit via the verb 'List', but that is reasonable for this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse sentences front-load the primary purpose and each subsequent sentence adds useful semantic or behavioral detail. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing tool with an output schema, the description is complete: it explains what is listed, what availability means, and how to interpret unavailable entries. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter documentation burden. The description appropriately focuses on behavior and output meaning instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and distinct resources: configured endpoints with live health and the model pool. It also clarifies what availability means, differentiating this from list-style siblings like list_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it: to inspect live endpoint availability and decide which unavailable models to ask the user about. It does not explicitly name alternatives or exclusion conditions, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
local_completeA
One-shot completion on a local model, no tools, no agent loop. Cheap offload for summaries, drafts, classification, translation, boilerplate. Returns the text.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | ||
| prompt | Yes | ||
| system | No | ||
| endpoint | No | ||
| max_tokens | No | ||
| temperature | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the core behavior (one-shot, no tools, returns text) and notes it's 'cheap' (low cost), but omits potential failure modes, authorization requirements, or network behavior (despite an endpoint parameter). It adds some value but not full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is 3 succinct sentences, front-loading the primary action and immediately differentiating from siblings. Every sentence contributes: purpose, use cases, and return value. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters and sibling tools for registering models/endpoints, the description doesn't mention prerequisites or how to choose a model. It assumes the agent knows it can just pass prompt and rely on defaults, but lacks guidance on when to specify model/endpoint. Given the output schema exists, return format is covered, but operational context is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema parameter description coverage is 0%, and the tool description offers no parameter-specific explanation. It doesn't clarify how 'model', 'endpoint', or 'system' interact, nor does it mention defaults or dependencies. The parameter names are self-explanatory, but the description adds no semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs one-shot completion on a local model, explicitly contrasting with agent loops and tools. It lists concrete use cases (summaries, drafts, classification, translation) and specifies the output, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly identifies when to use it ('cheap offload' for simple tasks) and when not to ('no tools, no agent loop'), implicitly routing to sibling tools like run_agent for agentic needs. While it doesn't name the alternative directly, the exclusion is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_endpointC
Add or update an inference endpoint (persisted to models.yaml) and probe it.
`base_url` is the server root that exposes `/v1/messages`, e.g. `http://127.0.0.1:8080`.
`backend` is one of llama.cpp | vllm | ollama | other (informational).
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | local | |
| name | Yes | ||
| notes | No | ||
| backend | No | other | |
| base_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool persists to models.yaml and probes the endpoint, which is useful, but it omits critical behavioral details such as whether the operation is idempotent, what happens on probe failure, error handling, or potential side effects like network timeouts. For a tool that mutates state and performs network calls, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief at two sentences plus a code block, which is concise. However, it lacks a clear structure: the parameter explanations are dropped inline rather than presented as a list, and key scoping info is not front-loaded. It's not bloated, but it could be more organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has five parameters, no annotations, no output schema (schema is present but no output schema referenced), and 0% schema description coverage, the description is incomplete. It does not explain the return value of probing, error conditions, or how the endpoint is validated. An agent cannot fully predict the tool's behavior from the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It explicitly covers base_url (server root exposing /v1/messages) and backend (enum of llama.cpp, vllm, ollama, other), but fails to describe the other three parameters: name, host, and notes. Two of five parameters are explained, leaving the rest undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Add or update an inference endpoint (persisted to models.yaml) and probe it.' The verb 'add or update' combined with the resource 'inference endpoint' is specific, and the persistence detail distinguishes it from related tools like register_model or list_models.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives. It mentions the tool registers endpoints but doesn't indicate when to prefer it over other registry-related tools, nor does it list any prerequisites or exclusions. The context about base_url and backend is informative but not usage-routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_modelA
Add or update a model in the pool (persisted to models.yaml).
Only `name` is required: it is fuzzy-matched against served ids (alphanumerics, case-folded,
substring), so `qwen3.8-27b` finds `unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_XL`. `host` and `notes`
are what gets relayed when asking the user to bring it up. The rest are overrides:
`served_name` (exact id or glob) when fuzzy matching is ambiguous, `endpoint` to prefer one,
`context` as a fallback window when the backend doesn't report one, `bring_up` a start command
(goes stale quickly; usually leave empty).
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| name | Yes | ||
| tags | No | ||
| notes | No | ||
| context | No | ||
| bring_up | No | ||
| endpoint | No | ||
| served_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite having no annotations, the description discloses key behaviors: upsert semantics, persistence to a YAML file, the fuzzy-matching algorithm, and the caveat that bring_up goes stale. It clearly indicates mutation and side effects. It omits auth/permission requirements and error scenarios, but the disclosed details are substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then breaks down parameters with clear rationale. Each sentence adds value, though it is somewhat long. The structure is logical and efficient, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 params, matching algorithm, overrides) and lack of annotations, the description covers most operational aspects: required field, matching behavior, param purposes, and a caveat. The omission of tags and lack of error/edge-case discussion are gaps, but the output schema presumably covers return values. Overall, it is largely complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description explains most parameters (name matching, host/notes relay, served_name, endpoint, context, bring_up) with usage context. However, the 'tags' parameter is completely ignored, leaving one of eight parameters undocumented. The detail given for the others is strong and compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states a specific action ('Add or update a model in the pool') with a concrete resource and persistence detail ('persisted to models.yaml'). The verb+object is unambiguous and distinct from sibling tools like register_endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (to add or update a model) but does not explicitly contrast it with alternatives such as register_endpoint or request_model. No when-not-to-use guidance, prerequisites, or conditions that select this tool over siblings are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_modelA
What to relay to the user to bring up a model that is not currently running.
Returns the pool entry's `host`/`notes` (and a start command only if one is on file). If the
model is already up, says so instead.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of explaining behavior, and it does so well. It discloses the return payload (host/notes, plus a start command only if one is on file) and the conditional behavior when the model is already up. It implies a read-only, informational operation by saying it relays content to the user, though it does not explicitly state that no start action is triggered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: a one-sentence purpose, a one-sentence return summary, and a one-sentence conditional behavior note. Every sentence adds distinct information, and the key purpose is front-loaded. No redundant phrasing or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description is largely complete: it explains what to pass, what to expect in return, and the main conditional case. It does not address what happens if the model is unknown or not registered in the pool, but the presence of an output schema and the clear conditional wording make this a minor gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only a 'model' string parameter and no parameter description, so schema coverage is 0%. The description adds some context by framing 'model' as the identifier of a model that is not currently running, but it does not specify expected values, naming conventions, or where the model identifier comes from. This is partially compensated by the self-explanatory parameter name and the surrounding context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: relay to the user what is needed to bring up a model that is not currently running. It identifies the resource (model) and a specific action (request/relay), and the conditional 'if the model is already up, says so instead' further clarifies scope. It does not explicitly name a sibling tool, but the unique purpose is recognizable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage condition: use this when a model is not currently running and you need instructions to give the user. It also handles the alternative case by noting that if the model is already up, the tool says so. It does not name alternative tools like list_models or register_model, but the intended context is reasonably explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_agentA
Delegate a task to an agent on a local model. Returns a job id immediately.
The agent is a headless Claude Code session (Read/Edit/Write/Glob/Grep/Bash, project
CLAUDE.md, same working tree) whose API calls go to the local endpoint. Write the task like a
brief for a capable but junior engineer: what to do, where, how to verify, and what to report.
Args:
task: The brief. Be explicit; local models follow less implicit context than Claude.
model: Pool name (see list_models) or a served model id/glob. Default from models.yaml.
endpoint: Force a specific endpoint; with no `model`, uses whatever it is serving.
cwd: Working directory (default: this server's cwd, i.e. the current project).
isolation: "none" (work in cwd, like a normal subagent) or "worktree" (fresh git worktree
on branch local-agent/<job>; kept only if the agent changed something, reported in
job.worktree with a diffstat). Use worktree for risky/large edits you want to review as a diff.
wait_s: If > 0, block up to this many seconds and return the result when done (else job id).
permission_mode: acceptEdits (default) | bypassPermissions | default | plan.
max_turns: Cap on agent turns (default from models.yaml).
allowed_tools: Override auto-approved tools.
system_prompt_append: Extra instructions appended to the Claude Code system prompt.
resume_job: Continue a previous job's session (same model) with `task` as the next message.
timeout_s: Wall-clock cap for the job.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | ||
| task | Yes | ||
| model | No | ||
| wait_s | No | ||
| endpoint | No | ||
| isolation | No | none | |
| max_turns | No | ||
| timeout_s | No | ||
| resume_job | No | ||
| allowed_tools | No | ||
| permission_mode | No | ||
| system_prompt_append | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 the agent's toolset (Read/Edit/Write/Glob/Grep/Bash, project CLAUDE.md, same working tree), immediate-return behavior, isolation details including worktree retention and diffstat reporting, permission modes, resume semantics, and blocking behavior via wait_s. This goes well beyond what the name and schema reveal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized for a 12-parameter tool. Each sentence earns its place: the opening sentence states purpose and return behavior, the second gives task-writing guidance, and the arg list is dense but scannable. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, no annotations, and an output schema to cover return values, the description is complete. It covers all parameters, defaults, the immediate-return/blocking distinction, worktree behavior, permission modes, and resume capability. Nothing an agent needs to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate, and it does. Every one of the 12 parameters gets a meaningful explanation with defaults, allowed values, and behavioral effects (e.g., isolation explains 'none' vs 'worktree', permission_mode lists all options, resume_job explains continued sessions).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Delegate a task to an agent on a local model,' which is a specific verb and resource, and immediately states the key behavioral distinction: 'Returns a job id immediately.' This clearly differentiates run_agent from the job-management siblings (job_log, cancel_job, job_status, wait_job).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong usage context: how to write the task brief, when to use isolation='worktree' ('Use worktree for risky/large edits you want to review as a diff'), when wait_s should be used, and points to a sibling tool via 'Pool name (see list_models)'. It doesn't explicitly name alternatives for follow-up status checks (e.g., job_status/wait_job), but the immediate-return semantics make that implication clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_jobA
Block up to timeout_s seconds for a job to finish; returns its status/result either way.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the blocking behavior, the timeout bound, and the fact that it returns a status/result even when the job has not finished. This is meaningful transparency, though it does not mention error cases like invalid job_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one sentence with no filler. It front-loads the blocking behavior, states the timeout parameter, and conveys the return guarantee efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter wait tool, the description covers the core behavior and return guarantee, and an output schema exists to document the result shape. It could add a note about already-finished jobs or invalid IDs, but nothing essential is missing for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to compensate. It clarifies that timeout_s is measured in seconds and controls the blocking duration, but it does not explain job_id beyond the implicit 'a job'. The parameter names are largely self-explanatory, so this is adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Block'), the resource ('a job'), and the outcome ('returns its status/result either way'). This clearly distinguishes wait_job from siblings like job_status or list_jobs, which check or list rather than block.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys a clear usage context: call this when you are willing to block up to a timeout for a job to finish, and you will get the result whether or not it completed. It does not explicitly name alternatives or state when not to use it, such as 'use job_status for non-blocking checks', so it stops short of a 5.
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.
11 tool updates
v0.1.0- First observed
cancel_job - First observed
job_log - First observed
job_status - First observed
list_jobs - First observed
list_models - First observed
local_complete - First observed
register_endpoint - First observed
register_model - First observed
request_model - First observed
run_agent - First observed
wait_job
TDQS
Scored across 11 tools
Most tools target distinct resources and actions: job lifecycle (run_agent, job_status, job_log, wait_job, cancel_job, list_jobs) and model/endpoint management (list_models, request_model, register_model, register_endpoint) are clearly separated. The main overlap risk is between wait_job and job_status, both returning status/result, but blocking vs non-blocking behavior distinguishes them.
The naming mostly follows a clear verb_noun pattern (cancel_job, list_models, register_model, run_agent, wait_job, list_jobs). Minor deviations exist with job_log, job_status, and local_complete, which use noun-first or adjective-verb constructions but are still readable and predictable.
11 tools is well-scoped for a local agent orchestration server. Each tool covers a distinct operational concern, and none feel redundant or superfluous.
The core domain is well covered: job creation, waiting, status, logs, cancellation, listing, plus model pool and endpoint registration and a one-shot completion fallback. Minor gaps include no explicit unregister/delete tool for models or endpoints, but these are not major blockers for typical workflows.
Maintenance
Related MCP Connectors
Work on your own computers from Claude or ChatGPT: run commands, edit and search files.
- ZionDeskOAuthapp.ziondesk
Connect ChatGPT, Claude, Cursor or VS Code to your Windows PC: files, terminal, browser, apps.
No-data MCP handoff for local Claude Code to Codex harness moves. $49 lifetime.
Agent personas for Claude. 16 tools, 13 personas, 3 workflows. Zero extra API cost. Free.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables Claude to delegate coding tasks to local Ollama models, reducing API token usage by up to 98.75% while leveraging local compute resources. Supports code generation, review, refactoring, and file analysis with Claude providing oversight and quality assurance.426 npm25AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables Claude Code to delegate mechanical tasks (summaries, boilerplate, reformatting) to local models running in LM Studio.1MIT
- AlicenseAqualityCmaintenanceEnables Claude Code to offload routine code generation and text processing tasks to a local Ollama LLM, saving Cloud API tokens and costs with automatic model selection and security features.11111 npm4Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables Claude Code to hand off bulk, mechanical, read-heavy tasks to a local model, including agentic loops that can read, write, and run commands sandboxed at zero cloud token cost.MIT