codex-hermes-a2a-bridge
Codex Hermes A2A Bridge
Локальный мост, который делает Codex «точкой входа»: Codex вызывает MCP-инструменты через stdio, а bridge преобразует запросы в A2A v1.0/JSON-RPC к профилю Hermes default, после чего сохраняет сопоставления диалогов/задач в SQLite. Hermes по-прежнему остаётся «мозгом», выполняющим agent loop, memory, skills, tools и внутреннюю оркестрацию.
Текущая версия: v0.1.1. Доступен только bind/call для loopback-эндпоинта; нет инструментов для смены модели, плагинов, конфигурации, обновлений, shell или управления сервисом Hermes.
Независимый проект: это независимое программное обеспечение сообщества, не являющееся официальным продуктом, не имеющее спонсорской поддержки и не представляющее Nous Research/Hermes Agent или OpenAI/Codex. Торговые марки используются только для описания совместимости.
Архитектура
Codex client --MCP stdio--> MCP server --> bridge core --> Hermes A2A :9900
\--> SQLite context/task mappingPython 3.11 и отдельное виртуальное окружение, не используется venv Hermes.
Официальный MCP SDK для Python, асинхронный
httpx, Pydantic и стандартная библиотека SQLite.Каждый новый
conversation_keyсопоставляется сcontextIdHermes; последующие витки используют это сопоставление.Исходные промпты не сохраняются; мост хранит fingerprint, маршрут, состояние, результаты и минимизированные ошибки.
Related MCP server: hermes-mcp-bridge
Требования и быстрая установка
Python 3.11.
Hermes Agent 0.20.5 с включённым A2A gateway на loopback.
Codex-клиент с поддержкой MCP stdio.
cd /absolute/path/to/codex-hermes-a2a-bridge
python3.11 -m venv .venv
.venv/bin/python -m pip install -e .
.venv/bin/codex-hermes-a2a-bridge doctorКонтрибьютор может установить дополнительные средства тестирования командой python -m pip install -e '.[dev]'. Переопределения описаны в .env.example; не коммитьте настоящий файл .env.
Безопасная конфигурация по умолчанию:
Переменная окружения | Значение по умолчанию | Назначение |
|
| A2A-корень; принимаются только loopback URL. |
| пусто | Bearer-токен берётся из env, через аргументы инструментов не передаётся. |
|
| SQLite с правами |
|
| Таймаут по умолчанию, ограничивается максимум 300 секунд. |
|
| Сколько ждёт |
|
| Предел inline-ожидания для |
|
| Время жизни SSE-воркера, чтобы сохранять A2A-задачи/результаты после начального таймаута. |
|
| Read-only фолбэк, когда in-memory TaskStore больше не доступен. |
|
| Лимит ходов/контекст для предотвращения зацикливания агента. |
|
| Число одновременных исходящих вызовов. |
Включение Hermes A2A и регистрация Codex
На уже установленной локально Hermes 0.20.5:
hermes plugins enable a2a-platform --no-allow-tool-override
hermes config set gateway.platforms.a2a.enabled true
hermes gateway run --no-superviseПри работе через foreground pass можно установить пользовательский сервис (без sudo):
hermes gateway install --start-now --start-on-loginЗарегистрируйте мост в общей конфигурации Codex:
codex mcp add codex-hermes-a2a-bridge -- \
/absolute/path/to/codex-hermes-a2a-bridge/.venv/bin/codex-hermes-a2a-bridge serve
codex mcp get codex-hermes-a2a-bridgeЧтобы новая запись была прочитана, необходимо открыть или перезапустить клиент Style. MCP stdio записывает в stdout только протокольные фреймы; диагностика выводится в stderr.
Семь MCP-инструментов v0.1
Инструмент | Назначение |
| Health, краткая Agent Card, счётчики записей в базе и состояние подключения. |
| Создание/продолжение диалога; |
| Сверка состояния, результата, ошибки или |
| Перечисление «долговечных» bridge-задач по диалогу/состоянию. |
| Ожидание активного потока, подписка на SSE, затем fallback-поллинг. |
| Отправка best-effort cancel; не гарантирует окончание вычислений. |
| Просмотр/инструменты/закрытие сопоставлений; закрытие не удаляет данные Hermes. |
Набор четырёх MVP-операций, упомянутых в исследовании (discover, send, get, continue), — не полный A2A. V0.1 объединяет их в семь высокоуровневых инструментов для работы с диалогами и задачами; более низкоуровневые операции A2A, такие как CRUD для push-уведомлений и администрирование Hermes, напрямую не экспонируются.
Пример рабочего процесса
Codex вызывает
hermes_status.Codex вызывает
hermes_chat(message=..., rescue_key=<стабильный>, mode="auto").Если задача всё ещё выполняется, используйте
hermes_task_waitилиhermes_task_get; не отправляйте вслепую после неоднозначного таймаута.Если
needs_input=true, спросите пользователя и затем вызовитеhermes_chatс тем жеconversation_key/context_id.Следующий виток диалога продолжает то же сопоставление;
hermes_contexts(action="close")закрывает только сопоставление в bridge.
Для операций с побочными эффектами указывайте idempotency_key. Hermes 0.20.5 не поддерживает идемпотентность на сетевом уровне, поэтому мост не отправляет повторно мутирующий send, если результат передачи неясен.
Начиная с v0.1.1, все три режима используют SendStreamingMessage, чтобы получать A2A-идентификаторы задач уже в первом событии. sync ждёт inline не более 30 секунд (или меньше, если задан меньший timeout); поток продолжает жить до correlation timeout. Для старых записей в состоянии outcome_unknown, не содержащих A2A ID, hermes_task_get/hermes_task_wait сначала пробуют ListTasks(contextId), затем читают официальное conversation persistence из Hermes. Восстановление присваивает результат только в том случае, когда есть ровно одна локальная нерешённая задача и ровно один remote/disk-кандидат; неоднозначные случаи оставляются без изменений: без повторной отправки и без догадок. Disk fallback не имеет состояния A2A, поэтому возвращает предупреждение и считает сохранённый ответ Hermes завершённым (completed).
Тестирование и эксплуатация
.venv/bin/pytest --cov=codex_hermes_a2a_bridge --cov-report=term-missing
.venv/bin/codex-hermes-a2a-bridge doctor
.venv/bin/codex-hermes-a2a-bridge smoke \
'Reply with exactly MY_MARKER and nothing else.' \
--conversation-key manual-smoke
.venv/bin/python scripts/live_check.py manual-smokepytest использует фейковый A2A-сервер на случайном loopback-порту и не требует реальной Hermes. doctor и live_check.py доступны только для чтения. Команда smoke отправляет реальный запрос; запускайте её с безобидным содержимым и только осознанно.
Безопасность и конфиденциальность
V0.1.1 отклоняет эндпоинты и Agent Card URL не из loopback, не переходит по редиректам и не принимает токен через MCP-аргументы.
SQLite по умолчанию находится за пределами исходного кода и имеет права
0600; в нём хранятся сопоставления, fingerprint, состояния, результаты и артефакты, а также минимальные ошибки. Результаты могут содержать конфиденциальные данные, поэтому применяйте соответствующие политики хранения и резервного копирования.Исходные промпты мостом не сохраняются, однако Hermes может вести собственные журналы диалогов/аудита. Fallback-восстановление читает только настроенную директорию диалогов Hermes.
MCP-сервер должен запускать доверенный пользователь; семь инструментов могут активировать Hermes, использующий навыки и инструменты с побочными эффектами. Используйте
idempotency_keyи не делайте слепых повторов приoutcome_unknown.Сообщайте об уязвимостях согласно SECURITY.md. Не публикуйте токены, транскрипты или SQLite в issue.
Гарантии и ограничения апстрима
Мост обеспечивает политику loopback, надёжное локальное сопоставление, отсутствие повторных мутирующих send-запросов при неопределённости и честную семантику отмены. Мост не гарантирует, что Hermes остановила вычисления, потоковую передачу на уровне токенов, идемпотентность на уровне протокола или сохранность задач при перезапуске Hermes.
Hermes 0.20.5 использует in-memory TaskStore, SSE-жизленный цикл, а отмена по протоколу не прерывает активный виток. Fallback-восстановление на основе conversation-store со стороны моста является условным и читающим; он не заменяет durable TaskStore ат повышable обновление. Проверенные подробности перечислены в Hermes A2A reference.
Troubleshooting
a2a_unreachable: запуститеhermes gateway statusи проверьте карточкуhttp://127.0.0.1:9900/.well-known/agent-card.json.Плагин A2A отмечен как включённый, но порт не запускается: проверьте
hermes config get gateway.platforms.a2a.enabled, затем перезапустите gateway.Codex не видит инструменты: выполните
codex mcp get codex-hermes-a2a-bridge, затем используйте новый процесс/клиент Codex.outcome_unknown: вызовитеhermes_task_get/hermes_task_wait, чтобы мост выполнил восстановление; если ситуация остаётся неоднозначной, не отправляйте задачу с сайд-эффектами повторно и уточните у пользователя.turn_budget_exceeded: закройте сопоставление и создайте новый диалог; не увеличивайте лимит просто для того, чтобы агент мог повторяться бесконечно.Hermes 0.20.5 теряет in-memory TaskStore при перезапуске; мост сохраняет локальную задачу/результат, но удалённый refresh может сообщить, что задача больше не существует.
macOS: если
launchctl bootstrapвозвращает exit 5, Hermes запускается через detached fallback: она работает, но не стартует и не перезапускается автоматически. Для подтверждения используйтеhermes gateway status.
Откат
См. scripts/rollback.sh. По умолчанию скрипт только выводит план. scripts/rollback.sh --apply удаляет именно zip MCP entry и A2A-конфигурацию/плагин, но сохраняет gateway-сервис, потому что он может обслуживать другие платформы. Добавляйте --include-gateway-service только если gateway был установлен исключительно для этого rollout. Исходные коды, .venv, SQLite и транскрипты Hermes сохраняются как есть.
Бэкапы, ограниченные сферой действия, создаются рядом с файлами конфигурации с суффиксом .pre-codex-hermes-a2a-bridge-v0.1.bak; автоответcтвие автоматического восстановления всего файла не включается, чтобы не затереть более новые изменения пользователя.
Документация
Официальные источники: OpenAI Codex MCP, Hermes A2A guide, NousResearch/hermes-agent. В случае расхождений приоритет отдаётся локальному коду Hermes 0.20.5, commit d736f5d53f1d33fabad5a17cb070eb138b618fb8.
Available Tools
7 toolshermes_chatBDestructive
Start or continue a Hermes conversation; returns a durable bridge task and A2A context mapping.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | auto waits briefly, sync waits, async returns early | auto |
| origin | No | ||
| message | Yes | User request for Hermes | |
| profile | No | Hermes profile; v0.1 supports default only | default |
| task_id | No | ||
| timeout | No | Absolute task/stream timeout in seconds | |
| context_id | No | Existing A2A contextId; normally reuse the returned value | |
| idempotency_key | No | Client key used to deduplicate exactly matching submissions | |
| conversation_key | No | Stable Codex conversation identifier |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and idempotentHint=false, so the safety profile is covered externally. The description usefully adds that a durable task and A2A context mapping are returned (relevant for continuation), but it never explains the non-idempotent/destructive posture or how mode affects blocking behavior.
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 sentence, front-loaded with the action and followed by the return-value clause; nothing is padded. It is dense with domain jargon ('A2A context mapping', 'bridge task') that is never unpacked, which slightly undercuts clarity.
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?
With a rich 9-parameter schema, full annotations and an output schema, the description does not need to carry everything. Still, for a conversation-continuation tool it omits the practical guidance an agent most needs: how the returned task/context IDs feed back into subsequent calls.
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 78%, so the schema already documents mode, profile, timeout, context_id, idempotency_key and conversation_key. The description's phrase 'A2A context mapping' loosely echoes context_id but adds no syntax, defaults, or reuse rules beyond what the schema states.
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 and resource ('Start or continue a Hermes conversation') and adds a distinctive output promise ('durable bridge task and A2A context mapping'). It does not, however, name or contrast any sibling (e.g. hermes_task_wait, hermes_contexts), so an agent must infer where this sits in the family.
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?
'Start or continue' implies a lifecycle but gives no explicit when-to-use guidance: nothing says when to reuse task_id/context_id versus starting fresh, nor when to prefer sync over async. No alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_contextsAIdempotent
List, inspect, or close bridge-owned conversation/context mappings; close never deletes Hermes data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows/tasks | |
| action | No | Mapping operation | list |
| context_id | No | Select a mapping by A2A contextId | |
| conversation_key | No | Select a mapping by Codex conversation |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint=true and destructiveHint=false. The description adds a specific behavioral guarantee that 'close never deletes Hermes data,' which goes beyond the annotations and clarifies safety. No contradictions with annotations, and the tool is low-risk, so this level of disclosure is adequate.
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 that front-loads the core actions (list, inspect, close) and adds a crucial caveat about data safety. Every word earns its place, with no redundancy or filler.
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 with all parameters optional and documented, an output schema present, and annotations covering idempotency and destructiveness. The description adequately covers the actions and a behavioral guarantee. It does not explicitly address parameter-action pairing, but the schema descriptions already convey that, so the overall context is 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 100%, with each parameter having a clear description (e.g., 'Mapping operation', 'Select a mapping by A2A contextId'). The tool description does not add additional parameter-level meaning, so the baseline of 3 for full schema coverage is appropriate.
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 function: listing, inspecting, or closing bridge-owned conversation/context mappings. It names the specific resource and actions, making the purpose unambiguous. While it does not explicitly name sibling tools for differentiation, the resource is distinct enough that the purpose is clear.
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 its usage for managing context mappings but provides no explicit guidance on when to choose this over alternatives or when not to use it. Siblings are clearly different in scope, so the decision is straightforward, but the lack of explicit routing or exclusion prevents a higher score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_statusARead-onlyIdempotent
Check bridge persistence, Hermes health, connectivity, and a concise Agent Card summary.
| 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?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds the specific scopes of the check (bridge persistence, health, connectivity, Agent Card summary), which is useful context, but it does not detail return structure, latency, or other behavioral nuances. This is consistent with the annotations, so no contradiction.
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, clear sentence with no filler. It front-loads the primary action ('Check') and then lists the elements, making it immediately scannable for an agent.
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 status-check tool with no parameters, full read-only annotations, and an output schema present, this description provides all necessary context. It covers the full scope of the tool's function and leaves no ambiguity about what it reports.
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 the description does not need to explain parameter semantics. With an empty schema, the baseline of 4 applies, and the description's mention of what is checked is sufficient.
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 the specific verb 'Check' and enumerates the exact resources checked: bridge persistence, Hermes health, connectivity, and Agent Card summary. This clearly distinguishes it from sibling tools like hermes_chat or hermes_task_get, which perform other functions.
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 usage is implied: the description states it checks various status aspects, making it evident this is for status queries. However, it does not explicitly mention when to use it instead of alternatives or any exclusions, lacking the direct guidance seen in stronger examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_task_cancelA
Request task cancellation; response is explicit that Hermes may continue underlying computation.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | bridge_task_id or known A2A task id | |
| timeout | No | Cancel request timeout in seconds |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations (all false) by explicitly warning that cancellation is only a request and that Hermes may continue underlying computation. This is a critical behavioral disclosure that prevents the agent from assuming the task will be stopped, and it surfaces a non-obvious execution semantic.
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 compact sentence that front-loads the core action ('Request task cancellation') and immediately follows with the most important caveat. Every word earns its place; there is no redundancy or extraneous 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?
The tool is simple with only two parameters and has an output schema, so the description only needs to cover the critical behavioral uncertainty, which it does. It doesn't discuss edge cases (e.g., cancelling a completed task), but given the presence of an output schema and the straightforward nature of the operation, this is 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?
The input schema already provides 100% coverage for both parameters (task_id and timeout) with meaningful descriptions. The tool description adds no additional information about parameter usage or syntax, so it relies on the schema, which is the baseline case.
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 'Request task cancellation' clearly identifies the action (request cancel) and the target (a task), and the 'request' caveat immediately distinguishes it from guarantee-style operations. This separates it cleanly from sibling tools like hermes_task_get, hermes_tasks_list, and hermes_task_wait.
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 intended use is implied by the name and description, but there is no explicit guidance on when to choose cancel over wait or get, nor any mention of conditions or exclusions. It doesn't tell an agent when cancellation is appropriate or when it might be too late to attempt.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_task_getB
Get a task/result; optionally acknowledge a consumed result_id with expected_origin verification.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Refresh a nonterminal task from Hermes when possible | |
| task_id | Yes | bridge_task_id or known A2A task id | |
| expected_origin | No | ||
| acknowledge_result_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and idempotentHint=false, so the agent already knows this is not a pure read. The description adds that acknowledgement is optional and that origin is verified, which explains the mutating profile, but it doesn't disclose what acknowledging actually does (marks consumed, irreversible?) or why the call is non-idempotent.
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 front-loaded sentence that leads with the core action and attaches the optional behaviour at the end. No wasted words, though the clause is packed tightly enough to be slightly cryptic.
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?
An output schema exists, so return values need not be described. For a tool that mixes a read with an optional state-changing acknowledgement, the definition is adequate but leaves the acknowledge side-effect and sibling selection under-explained.
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 coverage is only 50%: task_id and refresh are documented in the schema, while expected_origin and acknowledge_result_id are not. The description partially compensates by naming both undocumented parameters and their roles (consumption, origin verification), which is the baseline for this coverage level, but it gives no format or matching semantics for expected_origin.
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?
Clear verb+resource: 'Get a task/result' names both the action and the object, and the acknowledgement clause signals the consumption semantics. It does not, however, distinguish itself from siblings like hermes_task_wait, hermes_tasks_list, or hermes_task_cancel, so the agent must infer the boundary.
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 hints at a retrieve-then-acknowledge flow ('optionally acknowledge a consumed result_id'), which implies one usage scenario, but it never states when to use this tool versus hermes_task_wait or hermes_tasks_list, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_tasks_listARead-onlyIdempotent
List durable bridge tasks, optionally filtered by conversation and bridge state.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum tasks | |
| status | No | Optional bridge state such as working or completed | |
| conversation_key | No | Optional Codex conversation identifier |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds the 'durable' characteristic and filter behavior, which is useful, but it does not disclose ordering, pagination behavior, or how status values map to concrete bridge states.
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, front-loaded sentence with no filler. It communicates the core operation and the optional filters efficiently, and every word contributes meaning.
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 optional-parameter listing tool, the description combined with fully documented schema, strong annotations, and an output schema is nearly complete. It could be improved by explicitly directing agents to sibling tools for single-task retrieval, but no critical invocation details are 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 100%, so the parameters limit, status, and conversation_key are already documented. The description only loosely echoes the filtering parameters without adding new format constraints, allowed values, or behavioral details 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 states a specific verb ('List'), a specific resource ('durable bridge tasks'), and the optional filtering dimensions ('conversation and bridge state'). It clearly distinguishes this tool from siblings like hermes_task_get, hermes_task_wait, and hermes_task_cancel by signaling a listing operation rather than a single-task or mutation operation.
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: when you need to list bridge tasks, optionally filtered by conversation or status. However, it provides no explicit guidance about when not to use it or when a sibling such as hermes_task_get or hermes_task_wait would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_task_waitARead-onlyIdempotent
Wait for task progress/result using the active stream, A2A subscribe, then polling fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | bridge_task_id or known A2A task id | |
| timeout | No | Maximum wait in seconds |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the operational mechanism (active stream, A2A subscribe, polling fallback), which adds value beyond the annotations. Since annotations already declare readOnlyHint=true and idempotentHint=true, the description's detail about stream/subscribe/polling provides useful context about how the wait is implemented without contradicting the annotations.
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 that front-loads the core action ('Wait for task progress/result') before detailing the fallback mechanism. No redundant words or filler; every phrase earns its place.
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 description covers the primary purpose and mechanism but omits explicit usage scenarios versus alternatives, timeout behavior (e.g., what happens on timeout), and error handling. While the output schema and annotations provide some coverage, the description alone is insufficient for an agent to fully understand when and how to use this tool in a broader workflow.
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 input schema fully describes both parameters (task_id with 'bridge_task_id or known A2A task id' and timeout with 'Maximum wait in seconds'), so the description adds no extra parameter meaning. With 100% schema coverage, a baseline of 3 is appropriate.
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 starts with 'Wait for task progress/result', which clearly states the action (wait) and resource (task). It differentiates from siblings like hermes_task_get (which likely fetches status without blocking) and hermes_task_cancel (which cancels). The mechanism detail further clarifies intent, making the purpose unambiguous.
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 this tool is for blocking until a task progresses or completes, but it does not explicitly state when to prefer it over hermes_task_get or hermes_status. No alternatives are named and no 'when not to use' guidance is given, leaving the agent to infer from sibling names.
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.
2 tool updates
v0.5.0- Changed
hermes_chat2 fields changed- added
Input schema / properties / originAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Origin" +} - added
Input schema / properties / task_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Task Id" +}
- Changed
hermes_task_get2 fields changed- added
Input schema / properties / acknowledge_result_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Acknowledge Result Id" +} - added
Input schema / properties / expected_originAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expected Origin" +}
7 tool updates
v0.1.1- First observed
hermes_chat - First observed
hermes_contexts - First observed
hermes_status - First observed
hermes_task_cancel - First observed
hermes_task_get - First observed
hermes_task_wait - First observed
hermes_tasks_list
TDQS
Scored across 7 tools
Most tools have clearly distinct purposes: chat/context management, task retrieval, cancellation, listing, waiting, and bridge status. The main possible confusion is between hermes_task_get and hermes_task_wait, since both can surface task results, but their descriptions distinguish immediate retrieval from waiting behavior.
All tools use the hermes_ prefix and snake_case, which makes the set predictable overall. Minor deviations exist because some names are noun-only (hermes_chat, hermes_contexts, hermes_status) and task/tasks singular-plural usage varies.
Seven tools is well-scoped for a bridge server focused on Hermes conversation/context and A2A task lifecycle. Each tool has a distinct operational role, and the set avoids unnecessary surface area.
The surface covers conversation start/continue, context list/inspect/close, task list/get/wait/cancel, and bridge health/status. Result acknowledgment and origin verification are included in hermes_task_get, so the core A2A bridge lifecycle appears complete.
Maintenance
Related MCP Connectors
Human-input bridge for AI agents with voice-first answer links, MCP tools, and HTTP APIs.
A paid remote MCP for OpenAI Codex agent coordination MCP, built to return verdicts, receipts, usage
Cross-tool persistent memory and context for AI assistants over MCP.
Discover and call AI agents via MCP. Supports A2A agents and platform agents with async tasks.
Related MCP Servers
- AlicenseCqualityDmaintenanceBridges MCP clients with local Codex CLI to execute autonomous coding tasks, manage threads, and inspect history via SQLite state.131,061 npm4Apache 2.0
- AlicenseBqualityBmaintenanceA zero-friction stdio MCP bridge connecting Cursor Desktop to a local Hermes Agent, enabling natural language task delegation with session continuity and profile awareness.42Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables MCP agents to delegate tasks to a local Hermes Agent for terminal, file, browser, and coding operations, and schedule recurring jobs.MIT
- AlicenseNot gradedqualityCmaintenanceProvides an isolated MCP bridge giving Codex Hermes-style long-term memory, checkpoints, and optional tools, while keeping Hermes and Codex data read-only and requiring human approval for skill proposals.MIT