Skip to main content
Glama
Vetrox

ventrox

Official
by Vetrox

Ventrox

코딩 에이전트는 하루에도 여러 번 같은 벽에 부딪히지만, 아무도 그 사실을 보지 못한다. Ventrox는 에이전트에 도구 호출 하나를 추가한다: 시도한 것, 실패한 것, 낭비된 시간. 에이전트는 벤트를 다시 읽을 수 없다; 서버는 각 벤트에 세션, 프로젝트, 브랜치, 시간을 기록한다. 리뷰어는 VENTROX_SECRET=$(ventrox grant) claude로 세션을 시작하고, 유사도 기준으로 그룹화된 벤트 목록을 개수와 시간 순으로 정렬해 확인한다. 가장 많은 시간을 낭비하게 한 벽이 먼저 나온다. 몇 백 줄의 Python, 홈 디렉터리의 SQLite 파일 하나, 설치 명령 두 개. 네트워크로 전송되는 것은 없고, 저장소에 남는 것도 없다. 클러스터링은 n-gram에 대한 TF-IDF이며 동의어는 놓친다; 편집(redaction)은 정규식 목록으로, 최선의 노력이다. 제한: 세션당 벤트 20개, 10분당 5개. 아이디어는 Lovable의 vent 도구와 vent-widget에서 나왔다.

설치

Ventrox를 전역 도구로 설치:

uv tool install git+https://github.com/Vetrox/ventrox.git

또는 체크아웃에서 복제 후 설치:

git clone https://github.com/Vetrox/ventrox && cd ventrox && uv tool install .

그런 다음 설정을 실행:

ventrox setup

설정은 ventrox-report 및 ventrox-review 스킬을 ~/.claude/skills/에 복사한다. 그런 다음 claude mcp add --scope user ventrox -- ventrox로 MCP 서버를 등록한다.

Related MCP server: todox MCP Server

사용

리포터: 에이전트는 tried, failed, minutes_lost와 함께 ventrox_vent를 호출한다. 턴당 벤트 하나를 작성하며, 동일한 마찰이 반복된 후에만(실패 2회 이상 또는 10분 초과) 작성한다. 같은 세션에서 ventrox_edit으로 벤트를 수정한다. 서버는 세션당 20개, 10분당 5개의 벤트를 허용한다.

리뷰어: 일회용 토큰으로 세션을 시작:

VENTROX_SECRET=$(ventrox grant) claude

토큰은 일회용이며 10분 동안 유효하다. 그런 다음 세션에 리뷰어 도구가 포함된다. 다음 순서로 호출:

  1. ventrox_recluster는 열린 벤트를 어휘 중복으로 그룹화한다.

  2. ventrox_clusters는 열린 개수, 그다음 낭비된 시간 순으로 정렬된 그룹을 나열한다.

  3. ventrox_resolve_cluster는 그룹을 resolved 또는 wontfix로 표시한다.

제거

ventrox setup --remove
uv tool uninstall ventrox
rm -r ~/.local/share/ventrox   # deletes all vents

도구

도구

모드

인수

반환

ventrox_vent

reporter

tried, failed, minutes_lost

id, 또는 error

ventrox_edit

reporter

id, 그리고 tried, failed, minutes_lost 중 하나 이상

ok

ventrox_get

reviewer

id

벤트, 또는 error

ventrox_search

reviewer

query, status (선택), limit (기본 20, 최대 100)

results, 최신순

ventrox_clusters

reviewer

없음

clusters 열린 개수, 그다음 낭비된 시간 순으로 정렬

ventrox_recluster

reviewer

없음

clusters 개수, vents 개수

ventrox_resolve

reviewer

id, status (resolved 또는 wontfix)

ok

ventrox_resolve_cluster

reviewer

cluster_id, status (resolved 또는 wontfix)

ok, changed 개수

텍스트 필드는 14000자. minutes_lost는 01440 범위.

환경 변수

변수

용도

기본값

VENTROX_HOME

데이터 디렉터리

설정 안 됨

VENTROX_SESSION

세션 ID

프로세스당 생성

VENTROX_SECRET

리뷰어 세션용 부여 토큰; 일회용, 10분 유효

설정 안 됨

VENTROX_EXAMPLES

프로젝트 예제가 있는 파일 경로

설정 안 됨

VENTROX_MAX_PER_SESSION

서버가 세션당 허용하는 벤트 수

20

VENTROX_MAX_PER_10MIN

서버가 10분당 허용하는 벤트 수

5

데이터 위치

서버는 $VENTROX_HOME, $XDG_DATA_HOME/ventrox, ~/.local/share/ventrox 중 첫 번째를 선택한다. 모든 벤트는 해당 디렉터리의 vents.db에 저장된다. 파일은 암호화되지 않은 일반 SQLite이며, 파일 권한만이 보호한다. 데이터 디렉터리가 git 워크트리 안에 있으면 서버는 시작을 거부하고 코드 2로 종료한다.

스킬

ventrox-report는 에이전트에게 어떤 마찰이 벤트로 간주되는지, 세 필드가 무엇을 포함해야 하는지 알려준다. ventrox-review는 리뷰어에게 recluster, clusters, resolve 순서로 실행하라고 지시한다. ventrox setup은 둘 다 설치한다.

프로젝트 예제

프로젝트 루트에 .ventrox.md 파일을 두어 좋은 벤트의 프로젝트별 예제를 추가한다. VENTROX_EXAMPLES를 파일 경로로 설정하면 모든 프로젝트에 예제를 추가한다. 서버는 둘 다 ventrox_vent 도구 설명에 추가한다.

개발

uv sync
uv run pytest
uv run ventrox

비목표

Ventrox는 이슈 트래커에 동기화하지 않는다. 다중 사용자 모드가 없다. 도구 호출 추적을 기록하지 않으며, 에이전트가 작성한 세 필드만 기록한다. 네트워크 연결을 열지 않는다.

Available Tools

2 tools
ventrox_editA

Edit the tried, failed, or minutes_lost of a vent you wrote.

Provide the vent ID. Validation rules match ventrox_vent. Returns ok (true or false). If the edit fails, we do not state the reason. Possible causes: wrong ID, wrong session, or validation error.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
triedNo
failedNo
minutes_lostNo

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description correctly explains that it returns a bare true/false, does not report failure reasons, and lists likely causes of failure. It also indicates scope ('a vent you wrote'), which implies an ownership or session restriction, though it does not detail authentication behavior.

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

Conciseness5/5

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

The description is focused, front-loaded with the action, and every clause earns its place. It includes the necessary fields, the required input, return shape, and failure behavior without padding or repetition.

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

Completeness4/5

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

For a tool with no output schema and no annotations, the description gives sufficient info to call it and interpret false results. The user session context is mentioned but not explained, and validation rules are deferred to a sibling tool, which is acceptable but not fully self-contained.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must clarify parameter meaning. It names all editable fields ('tried, failed, or minutes_lost') and the required id, covering the four parameters adequately even without per-property explanations.

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

Purpose5/5

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

The description's leading sentence clearly states the action ('Edit') and the resource ('a vent you wrote') and specifies the editable fields. It distinguishes itself from the sibling ventrox_vent by framing this as an edit operation for existing vents, not a creation operation.

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

Usage Guidelines4/5

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

It states the required input ('Provide the vent ID') and implies this is used to modify an existing vent instead of creating one. It does not explicitly name ventrox_vent as the alternative, but the context signals make the intended usage clear.

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

ventrox_ventA

Record friction you hit today.

A vent describes what blocked you. Write what you tried, what failed, and how many minutes you lost. Do not write fixes, workarounds, or lessons. We do not read vents back to you.

Write one vent per turn. Write a vent only after you hit the same friction again. Friction repeats when the same thing fails two times or more, or when one thing costs more than 10 minutes.

Good vents:

  • tried "run the test suite with uv run pytest", failed "import error on conftest.py three times in a row; the fix needed PYTHONPATH that no doc states", minutes_lost 25

  • tried "deploy to staging with the standard CloudFormation template", failed "VPC id mismatch in the template; had to edit manually each time for 3 deploys", minutes_lost 18

  • tried "install the linter with pip install ruff", failed "no wheel for Python 3.13 on macOS arm64; built from source twice, flaky on CI", minutes_lost 12

  • tried "run database migration with python manage.py migrate", failed "timeout on the first attempt; docs don't mention --timeout flag; second attempt with flag succeeded", minutes_lost 8

Not vents:

  • A one-off typo you fixed once. That is not repeated friction.

  • "How do I make the tests faster?" That is a question, not friction.

  • "Next time use pytest-xdist for parallel tests". That is a lesson or a fix, not what blocked you.

  • "Finished the feature, took 3 hours". That is a task-progress note, not friction.

ParametersJSON Schema
NameRequiredDescriptionDefault
triedYes
failedYes
minutes_lostYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden, and it does so thoroughly. It discloses that vents are not read back, that only one vent should be written per turn, that vents should only be logged after repeated friction, and that fixes/workarounds/lessons should be excluded. This goes well beyond a simple 'record friction' statement.

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

Conciseness5/5

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

The description is longer than average, but every section earns its place: a front-loaded purpose statement, eligibility thresholds, and illustrative good/bad examples. It is information-dense rather than padded, and the structured examples are easy for an agent to pattern-match against.

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

Completeness5/5

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

For a logging tool with no output schema and no annotations, the description is complete. It tells the agent what to record, when recording is appropriate, what not to record, and what happens after recording ('we do not read vents back to you'). No critical operational detail appears to be missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must supply all parameter meaning. It clearly maps 'tried' to what you attempted, 'failed' to what blocked you, and 'minutes_lost' to the time lost. The examples reinforce this by showing realistic combinations, and the 'not vents' section clarifies what should not go into the parameters.

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

Purpose4/5

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

The description clearly defines the tool as recording friction: what you tried, what failed, and minutes lost. It gives strong examples of good and bad vents. However, it does not explicitly differentiate itself from the sibling tool ventrox_edit, so the agent must infer the create-vs-edit boundary from the tool names.

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

Usage Guidelines4/5

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

The description provides explicit when-to-use guidance: write a vent only after the same friction repeats, with precise thresholds like two failures or more than 10 minutes lost. It also gives clear exclusions such as one-off typos, questions, lessons, and task-progress notes. It does not mention ventrox_edit as the alternative for editing existing vents, so the usage guidance is excellent for creation but not complete against its sibling.

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.

  1. 2 tool updatesv0.1.0
    • First observedventrox_edit
    • First observedventrox_vent

TDQS

A4.4/5.0

Scored across 2 tools

Disambiguation5/5

ventrox_vent is exclusively for recording a new friction event, while ventrox_edit explicitly modifies an existing vent's fields. There is no overlap or ambiguity between creating and editing.

Naming Consistency4/5

Both tools share the ventrox_ prefix and use short action-style names, making the pattern predictable. The only minor inconsistency is that ventrox_vent uses the verb 'vent' while ventrox_edit omits an object noun such as 'vent'.

Tool Count4/5

Two tools is slightly thin, but it matches the server's focused purpose of recording and correcting friction entries. Each tool is meaningful and there is no bloat.

Completeness4/5

The server covers creating and editing vents, which are the core operations for its purpose. There is no delete or list/read tool, though deletion is a minor gap and reading is intentionally not provided.

Related MCP Connectors

Related MCP Servers