Skip to main content
Glama

mcp-simple-job

하위 작업을 다른 머신의 로컬 모델에 넘기고, 결과를 반환하기 전에 검증하세요.

특정 형태의 문제를 위해 만들어졌습니다. 성능이 좋고 요금이 측정되는 어시스턴트는 여러분이 앉아 있는 머신에서 실행되는 반면, 충분히 쓸 만한 GPU 박스는 구석에서 놀고 있습니다. 파일 40개를 읽기, 긴 페이지 요약하기, 데이터셋 내려받기 — 이런 작업 중 어느 것도 비싼 모델이 필요하지 않으며, 어시스턴트의 컨텍스트에서 처리하면 진짜로 부족한 유일한 리소스를 소모합니다.

저자의 환경에서 동일한 작업 네 가지를 컨텍스트 안에서 처리하는 것과 비교해 측정한 결과: 약 2.7배 빠르고, 컨텍스트 소모는 6.1배 적습니다. 원본 페이지가 컨텍스트에 들어오지 않기 때문입니다.

단 하나의 규칙

작업에는 반드시 검증(check)이 따라야 합니다. 어떻게 성공했는지 알 수 있는 방법을 명시할 수 없는 작업은 거부됩니다 — 경고가 아니라 거부입니다.

이것은 로컬 모델에 대한 불신이 아닙니다. 호출자가 알 수 없기 때문입니다. 어시스턴트가 요약을 위임하고 400단어의 자신 있는 문장을 돌려받았을 때, 그 문장이 문서를 설명하는지 다른 무언가를 설명하는지 독립적으로 알 방법이 없습니다. 검증 없이 위임하면 초록불이 아무 의미도 없는 지점이 하나 더 생깁니다.

검증은 의도적으로 단순합니다: nonempty, contains, regex, json_keys, line_count, shell(여러분의 argv, 종료 코드 0이면 통과, 출력은 stdin으로 전달), summary_of(원본보다 짧고 원본을 복사한 것이 아님).

Related MCP server: Forgehand

네 가지 하위 작업

tool

하는 일

작업이 발생하는 곳

simple_job

여러분이 직접 만든 검증이 있는 일반 프롬프트

모델 호스트

summarize

텍스트, 또는 먼저 가져오는 url/urls

워커 머신 (fetch + model)

search_and_summarize

검색, 상위 페이지 읽기, 요약

검색은 호스트를 번갈아 가며, 나머지는 워커에서

download

파일 가져오기, 바이트 수 + sha256 보고

기본은 워커, 구성된 모든 호스트 가능

simple_job_stats는 모든 작업마다 기록되는 원장(ledger) 행을 바탕으로 그것들이 실제로 어떻게 진행되었는지 보고합니다.


실행하기

요구 사항

  • MCP 서버를 실행하는 머신에 Node 18+.

  • OpenAI 호환 채팅 엔드포인트. llama.cpp의 llama-server, Ollama, vLLM, LM Studio, 또는 호스팅 API — POST /v1/chat/completions에 응답하는 모든 것.

  • 가져오기(fetch)를 수행하는 머신에 Python 3.9+. 표준 라이브러리만 사용합니다. pip 설치도, node도, beautifulsoup도 없습니다.

  • 두 번째 머신에 SSH 키 인증, 사용하는 경우에 한합니다. 선택 사항입니다(아래 참조).

저자 머신에서의 연결 구성

두 대의 컴퓨터:

  • Mac mini — 일상 업무용 워크스테이션. 16GB, 보통 몇 GB는 스왑에 들어갑니다. Claude Desktop을 실행하며 따라서 이 MCP 서버도 실행합니다.

  • RTX 5070 Ti가 장착된 Pop!_OS 박스 — 실험실. 포트 8080에서 llama-server 아래 ornith라는 35B 모델을 실행하며, 하루 대부분은 유휴 상태입니다.

SSH 터널 덕분에 원격 모델이 Mac에서는 로컬처럼 보입니다:

ssh -N -o ServerAliveInterval=30 -L 127.0.0.1:8081:127.0.0.1:8080 pop-os

pop-os는 키와 IdentitiesOnly yes가 있는 ~/.ssh/config 별칭이라, 서버가 BatchMode=yes로 비대화식으로 도달할 수 있습니다.

MCP 클라이언트 항목은 그냥 이렇게:

{ "mcpServers": { "simple-job": { "command": "node", "args": ["/path/to/mcp-simple-job/index.js"] } } }

기본값이 나머지를 처리합니다: 127.0.0.1:8081의 모델, pop-os의 워커 머신, 그리고 기존의 ~/Code/harness/가 있으면 거기의 원장.

그 어떤 것도 손으로 호출되지 않습니다. 어시스턴트가 도구를 선택합니다 — 이것은 생각보다 어려운 문제이며, 아래에서 다룹니다.

여러분 환경에서 실행하기

두 대의 머신, 하나는 클라이언트, 하나는 모델 실행:

{
  "mcpServers": {
    "simple-job": {
      "command": "node",
      "args": ["/path/to/mcp-simple-job/index.js"],
      "env": {
        "ORNITH_URL": "http://127.0.0.1:8081/v1/chat/completions",
        "ORNITH_MODEL": "your-model-name",
        "POP_HOST": "your-ssh-alias"
      }
    }
  }
}

한 대의 머신 — 전부 로컬, SSH 없음:

{
  "env": {
    "ORNITH_URL": "http://127.0.0.1:11434/v1/chat/completions",
    "ORNITH_MODEL": "qwen3:8b",
    "SEARCH_HOSTS": "mac"
  }
}

SEARCH_HOSTS=mac는 "두 번째 머신이 없다"는 뜻의 스위치입니다. 가져오기, 다운로드, 검색이 모두 로컬에서 일어나며, 검색은 단순히 예산(rate budget)이 두 개 대신 하나입니다. 나머지는 동일하게 동작합니다.

환경 변수

variable

default

하는 일

ORNITH_URL

http://127.0.0.1:8081/v1/chat/completions

채팅 엔드포인트

ORNITH_MODEL

ornith:35b

요청에 보내는 모델 이름

POP_HOST

pop-os

워커 머신의 SSH 별칭

SEARCH_HOSTS

mac,pop

검색을 번갈아 수행할 머신들. 단일 머신 설치에서는 mac으로 설정

SEARCH_GAP_MS

30000

한 머신에서 검색 사이의 최소 간격

SEARCH_BLOCK_MS

300000

속도 제한을 받은 머신이 대기하는 시간

SIMPLE_JOB_STATE

index.js 옆

검색 타이밍 상태가 유지되는 곳

HARNESS_LEDGER

해당 디렉터리가 있으면 ~/Code/harness/ledger.db, 아니면 ~/.mcp-simple-job/ledger.db

SQLite 원장

HARNESS_TRACE

~/Code/harness/current_trace.txt

행에 찍을 선택적 추적 ID

원장은 선택 사항입니다. 처음 사용할 때 생성되며, 쓸 수 없어도 작업은 계속 실행됩니다 — 로깅은 best-effort이고 작업을 절대 막지 않습니다. HARNESS_TRACE는 저자 자신의 추적 설정을 위한 훅입니다. 무시하면 행에 trace id가 null로 찍힐 뿐입니다.

실제로 사용되게 만들기

대부분의 사람들이 건너뛰는 부분이고, 위의 모든 것이 의미 있는지 결정하는 부분입니다.

아무도 라우팅하지 않는 도구는 아무리 잘 작동해도 보이지 않습니다. 저자에게는 완벽하게 작동하는 별도의 MCP 서버가 있는데 몇 달 동안 호출이 0건이었습니다. 순전히 어시스턴트에게 그 도구를 사용하라고 말한 적이 없었기 때문입니다. 능력을 만드는 것과 그 능력으로 라우팅하는 것은 서로 다른 두 가지 작업이며, 첫 번째를 끝내면 끝난 것처럼 느껴집니다.

그 간격을 줄이는 세 가지 방법, 가장 저렴한 것부터. 대부분의 사람들은 두 번째를 원합니다.

1. 아무것도 하지 말고 지켜보기. 일부 클라이언트는 도구 설명을 충분히 잘 읽어서 충분히 명확한 요청 — "이 페이지 40개를 요약해 줘" — 이 스스로 도구를 찾아냅니다. 기계 장치를 추가하기 전에 하루 정도 시도해 볼 가치가 있습니다. 실제로 호출되는지 지켜보세요.

2. 클라이언트가 상시 지침을 두는 곳에 규칙을 넣기. Claude Desktop 프로젝트 지침, Claude Code용 CLAUDE.md, .cursorrules, 커스텀 GPT의 지침 — 클라이언트가 매 턴 읽는 무엇이든 좋습니다. 예를 들면:

simple-job을 통해 사용할 수 있는 로컬 모델이 있습니다. 자료가 아직 컨텍스트에 없고 작업이 기계적일 때 사용하세요: 페이지나 파일 요약, 웹 검색 후 읽기, 다운로드 가져오기, 추출 및 재포맷. 무료이고 원본에 컨텍스트를 소모하지 않습니다.

텍스트가 이미 컨텍스트에 있을 때, 작업이 해석보다는 필사(transcription)가 아니라 해석을 요구할 때, 또는 '맞는 것'보다 '검증 가능한 것'이 더 중요할 때는 직접 하세요. 판단이 필요한 호출, 반드시 정확해야 하는 코드, 파일 편집은 절대 위임하지 마세요.

모든 작업에는 검증이 따라야 합니다 — 서버는 검증할 수 없는 작업을 거부합니다.

위임하지 말아야 할 때에 대해 위임해야 할 때만큼 많은 말을 쓰세요. 위임 도구의 라우팅에서 나타나는 실패 모드는 과도한 위임이며, 모든 것을 아래로 내려보내는 어시스턴트는 여러분이 판단을 원했던 자리에 충실한 필사를 건넬 것입니다.

3. 라우터가 있다면 그에 연결하기. 이미 상황을 도구에 매칭하는 설정이 있다면 "아직 컨텍스트에 없는 자료의 대량 읽기 또는 가져오기" 항목을 추가하세요. 상시 지침보다 유리한 점은 측정 가능하다는 것입니다 — 제때 발동했는지 셀 수 있습니다. 상시 지침은 작동하거나 작동하지 않을 뿐이고, 어느 쪽인지 기록하는 것은 없습니다.

보내지 말아야 할 것

"그럴듯해 보인다"가 유일한 테스트인 모든 것. 판단이 필요한 호출. 반드시 정확해야 하는 코드. 파일 편집.

그리고 취향이 아니라 측정으로 발견된 경계 하나: 작은 로컬 모델은 충실하게 필사하지만 해석하지는 않습니다. 테스트에서 원본의 모호한 표현을 무엇을 의미하는지 해결하는 대신 그대로 재현했고, 저장소의 스타 수를 버그 리포트의 일부인 것처럼 요약했습니다. 필사는 보내세요. 해석은 직접 하세요.


만들면서 얻은 기록

아래는 모두 의견이 아니라 측정 결과입니다. 숫자는 코드 주석에도 있습니다.

생각(thinking)은 기본적으로 꺼져 있음

추론 모델은 자신의 숙고와 답을 같은 토큰 예산에서 내보냅니다. 동일한 요약 작업을 세 번 동일하게 실행했을 때, 세 번 중 두 번은 5,500~6,000자를 생각하는 데 쓰고 한도에 도달한 다음 HTTP 200과 함께 빈 답변을 반환했습니다.

max_tokens를 올려도 고쳐지지 않았습니다. reasoning_effort: "low"도 고쳐지지 않았습니다. /no_think 시스템 태그도 고쳐지지 않았습니다. 오직 chat_template_kwargs: {enable_thinking: false}만 효과가 있었고, 같은 작업이 그다음 258토큰으로 답했습니다. 진짜 숙고가 필요한 작업에는 think: true를 넘기고, 그와 함께 max_tokens도 올리세요.

검색은 배급되며, DuckDuckGo는 그 이유를 속임

DuckDuckGo는 정중하게 속도 제한을 하지 않습니다:

  • 서비스된 쿼리는 HTTP 200, 약 28KB, 결과 링크 10개

  • 거부된 쿼리는 HTTP 202, 약 14.2KB, 본문은 "Please complete the following challenge... Select all squares containing a duck" 라고 읽힙니다

IP에 대한 캡차 플래그이지 시간 제한이 아니며, 간격을 두는 것으로는 해제되지 않습니다. 4분간 조용히 있다가 한 머신에서 30초 간격으로 6개 쿼리, 다른 머신에서 15초 간격으로 6개 쿼리를 보냈더니 12개 모두 실패했습니다. 블록 동안 5초마다 폴링해도 162초 안에 회복되지 않았습니다 — 재시도가 오히려 키웁니다. 플래그는 약 20분 만에 스스로 사라졌습니다.

그래서 검색은 간격을 두고, 머신을 번갈아 가며(IP 두 개는 예산 두 개), 속도 제한은 throttled로 보고되며 결코 "결과 없음"으로 보고되지 않습니다. 그 둘은 반대 의미입니다.

읽기는 질문을 따라감

긴 페이지는 모델의 창에 맞게 잘리는데, 위에서부터 자르면 조용히 잘못된 질문에 답하게 됩니다. 40,063자 페이지에서 8,000자 창으로 "sparse gating and load balancing" 을 물었을 때, 첫 번째 버전은 기사 서두의 유창한 요약을 반환했습니다 — 그 서두에는 "load balancing"이 전혀 등장하지 않는데(16,181자에서 시작), "sparse"도 등장하지 않습니다(14,671자).

그래서 focus가 창을 조정합니다: 맥락을 위한 머리부분, 그 다음 각 명명된 용어 주변의 구절들, 어떤 용어가 두 번째 창을 받기 전에 각 용어당 하나의 창이 보장됩니다. 이전 두 버전으로는 충분하지 않았습니다 — 부분 문자열 매칭이 "download" 안에서 "load"를 찾아 노이즈 42건을 보고했고, 문서 순서대로 구절을 가져가면 16,181자에 도달하기 전에 예산을 다 써버렸습니다.

페이지가 그 단어들을 전혀 사용하지 않으면, 호출은 focus_not_found와 함께 ok:false를 반환합니다. 0건의 적중은 다른 자료의 그럴듯한 요약보다 더 나은 답변입니다.

대부분 스크립트인 페이지는 거부됨

어떤 사이트는 68,896바이트를 제공했는데 그중 텍스트는 40자("Loading...")뿐이었고, 원래의 if not text 가드가 통과시켰습니다 — 그래서 셸이 소스 자료로 요약에 들어갔고, 모델은 그것을 인용하며 자신 있는 벤치마크 수치를 써냈습니다.

이제 두 가지 테스트를 사용합니다. 각각 단독으로는 속기 때문입니다. 절대 하한선과, 또한 짧은 페이지만을 거부하는 텍스트-바이트 비율입니다. GitHub 이슈는 실제 토론 3,896자 주위에 290,000바이트의 마크업이 있으며, 비율만으로는 이를 버렸습니다.

인용은 확인할 수 있도록 번호가 매겨집니다

search_and_summarize는 페이지에 번호를 매기고 url 대신 [1], [2]를 요청합니다. url을 요청했을 때, 모델은 블로그에서 읽은 수치를 문서 페이지에 귀속시켰습니다. 사실은 실제이고 자료에 있었지만, 귀속은 그렇지 않았습니다. 그리고 summary_of는 이를 볼 수 없습니다. 잘못 라벨링된 불릿은 올바른 길이이고 복사본이 아니기 때문입니다.

url은 올바르게 복사하기에는 길고 불투명한 문자열입니다. 정수는 그렇지 않으며, 실제로 읽은 페이지에 대해 범위 검사를 할 수 있습니다. 코드는 이를 수행하여 범위를 벗어난 숫자에 대해 호출을 실패시키고 출처가 전혀 없는 불릿을 집계합니다.

어느 머신이 더 빠른가?

양쪽에서 동일한 sha256으로 검증됨:

클라이언트 머신

워커 머신

ssh 왕복

—

호출당 ~185 ms

4페이지 가져오기

~1.7 s

~2.0 s

20MB 다운로드

17.5 MB/s

12.6 MB/s

클라이언트 머신이 둘 다에서 더 빨랐습니다. 속도는 워커에게 작업을 보내는 이유가 아닙니다. 이유는 워커가 모델을 보유하고 있고, 다른 머신이 사용 중일 때 유휴 상태이며, 두 번째 머신이 두 번째 검색 예산이기 때문입니다. 다운로드 호스트는 처리량이 아니라 파일이 필요한 위치에 따라 선택하세요.

테스트

node test_e2e.mjs                        # 24 assertions, spawns the real server over JSON-RPC
node --test test/simple-job.test.mjs     # 19 unit assertions on the checks

엔드투엔드 스위트는 일회용 원장을 대상으로 클라이언트가 하는 방식대로 실제 서버를 생성합니다. 인프로세스 테스트는 PATH 또는 환경 버그를 잡지 못하며, 이러한 버그는 정확히 재시작 후에만 나타나는 종류입니다.

index.js에 대한 변경 사항은 클라이언트가 다음에 서버를 시작할 때 적용됩니다. pop_agent.py는 모든 호출에서 다시 읽히므로 가져오기, 검색 및 다운로드에 대한 변경 사항이 즉시 적용됩니다.

Available Tools

5 tools
downloadA

Download a file to pop (default) or to this Mac. Returns the path, byte count and sha256 — a download that reports success without those is not verified. Put it on pop when pop will use it (models, datasets, anything for the GPU); put it on the mac when you will open it.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYeshttp(s) url to download.
destNoDirectory on that machine. Default ~/Downloads.
hostNo"pop" (default) or "mac". Measured 2026-08-21: the Mac is the faster of the two (17.5 vs 12.6 MB/s), so choose by where the file is needed, not by speed.
max_mbNoRefuse anything larger. Default 500.
filenameNoOverride the filename.
overwriteNoReplace an existing file. Default false — an existing file is an error, not a silent clobber.
expect_sha256NoIf given, the download fails unless the hash matches.

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the expected return values ('path, byte count and sha256') and adds the important caveat that success without these is not verified, which is a meaningful behavioral warning. It also implies the default host is pop. However, it does not describe failure behavior beyond the overwrite rule (which is in the parameter schema), nor does it mention whether downloads are atomic or what happens on network errors. Given the lack of annotations, this is a strong disclosure but not exhaustive, so a 4 is appropriate.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with the primary action and destination, followed by the return-value verification note and then the host-selection guidance. Every sentence carries meaningful information; there is no filler or redundancy. It is an excellent example of concise, high-signal writing.

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 7 parameters, no output schema, and no annotations, the description covers the core aspects: what it does, where it downloads, what it returns, and how to decide between hosts. It also adds the verification requirement that guards against silently bad downloads. It does not mention edge cases like how max_mb is enforced or what happens when an existing file blocks the download (though the parameter schema covers that), but these are secondary. Overall, an agent can call this tool safely and correctly, so a 4 is suitable.

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

Parameters4/5

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

The schema already describes all 7 parameters with 100% coverage, so the baseline is 3. The main description adds value by explaining the strategic choice of host ('Put it on pop when pop will use it...'), which reinforces the host parameter's purpose and provides context beyond its schema description. It also emphasizes the verification requirement, which ties into the expect_sha256 parameter. While the schema covers syntax, the description adds usage logic, so a 4 is justified.

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

Purpose5/5

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

The description opens with a clear verb-and-resource pair — 'Download a file' — and specifies the two possible destinations ('to pop (default) or to this Mac'), which uniquely defines the tool's action. It also distinguishes it from the sibling tools (simple_job, summarize, etc.) which are entirely unrelated, so there is no ambiguity about what this tool does.

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

Usage Guidelines5/5

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

The description gives explicit, actionable guidance on when to use each host: 'Put it on pop when pop will use it (models, datasets, anything for the GPU); put it on the mac when you will open it.' This directly tells an agent how to choose the destination based on the intended use, and the default is also stated. No alternative tools are relevant, so this guidance is complete.

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

search_and_summarizeA

Search the web (DuckDuckGo), read the top pages on pop, and have ornith summarise them — one call, no Claude context spent on the raw pages. THE ONLY SEARCH TOOL HERE, and deliberately: DuckDuckGo rate-limits hard, so searches are spaced and alternated between this Mac and pop. A throttle is reported as a throttle, never as "no results".

ParametersJSON Schema
NameRequiredDescriptionDefault
checkNoOptional. Defaults to {type:"summary_of"} against the fetched pages.
countNoHow many search results to list. Default 6.
focusNoWhat you actually want to know, if narrower than the query.
modelNoDefault ornith:35b.
pagesNoHow many top results to read. Default 3, max 8. More pages costs seconds, not money.
queryYesThe web search query.
thinkNoLet ornith reason before answering. Default false. Measured 2026-08-21: with reasoning on, 2 of 3 summarise runs returned an EMPTY answer after burning the whole token budget on thinking. Turn it on only for a job that genuinely needs deliberation, and raise max_tokens with it.
max_wordsNoTarget summary length. Default 250.
max_tokensNoDefault 2048. Ornith reasons before answering; too low returns an empty answer.
temperatureNo
results_onlyNoSkip reading and summarising; just return the search results.

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations, the description carries full responsibility and excels: it discloses the DuckDuckGo backend, the reading and summarization pipeline, the lack of Claude context use, the spacing of requests, and the crucial behavior that throttles are reported truthfully. It even documents a known failure mode with the 'think' parameter. This is exemplary transparency.

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

Conciseness3/5

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

The description front-loads the purpose but then becomes a run-on sentence mixing operational details, typos, and policy notes. While information-dense and not excessively long, it could be split into clearer sentences to improve scannability. It feels a bit stream-of-consciousness.

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 an 11-parameter tool with no output schema, the description covers the core use case, operational constraints, and a known gotcha ('think'). It doesn't describe the return value, but that's a reasonable trade-off given the already rich parameter documentation and the absence of an output schema. The description is sufficient for an agent to decide when to call this tool.

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

Parameters3/5

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

Schema description coverage is high (91%), so the baseline is 3. The description itself does not add parameter-level details beyond what's in the schema, and the schema already describes 10 of 11 parameters. No contradiction or gap that requires the description to compensate.

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 clearly states the tool's purpose: 'Search the web (DuckDuckGo), read the top pages... and have ornith summarise them'. It also differentiates from siblings by declaring 'THE ONLY SEARCH TOOL HERE', making it unmistakable what this tool does relative to others. The typos ('pop', 'ornith') don't obscure the core verb-resource actions.

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 explicitly frames the tool as the only search option ('THE ONLY SEARCH TOOL HERE') and provides practical guidance on rate-limiting and throttle behavior. However, it doesn't explicitly state when *not* to use it (e.g., when you already have content to summarize, which sibling 'summarize' might handle), leaving exclusions to inference.

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

simple_jobA

Hand a plain subtask to ornith (35B, local, free) on pop and verify the result before returning it. REQUIRES a check — a task that cannot state how it would be known to have worked is refused. Good for: extraction against a schema, classifying, reformatting. Bad for: judgment calls, code that must be correct, editing files — do those yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesWhat ornith should do. Be specific about the output format.
checkYesHow the result is verified. One of: {type:"nonempty"} | {type:"contains",text,case_sensitive?} | {type:"regex",pattern,flags?} | {type:"json_keys",required:[...]} | {type:"line_count",min?,max?} | {type:"shell",command:[argv...],timeout_ms?} (result is piped to stdin; exit 0 passes).
modelNoDefault ornith:35b.
thinkNoLet ornith reason before answering. Default false. Measured 2026-08-21: with reasoning on, 2 of 3 summarise runs returned an EMPTY answer after burning the whole token budget on thinking. Turn it on only for a job that genuinely needs deliberation, and raise max_tokens with it.
contextNoMaterial for the task — the text, rows or code to work on.
max_tokensNoDefault 2048. Ornith reasons before answering; too low returns an empty answer.
temperatureNo

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses key behaviors: it verifies the result before returning, refuses tasks without a check, and mentions limitations (bad for judgment calls, code, editing). However, it does not specify what happens if verification fails, error handling, or output format, leaving some behavioral aspects undisclosed.

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 concise and well-structured: it opens with the core action, then lists requirements and use cases. Every sentence adds value without redundancy, and the format is easy to parse.

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

Completeness3/5

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

Given there is no output schema, the description should explain the return value or error cases, but it only says 'returns it' without specifying format. It also omits details about parameter interactions (e.g., temperature affects creativity) and failure modes, leaving some operational context incomplete.

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

Parameters3/5

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

The schema already provides descriptions for all parameters (86% coverage). The description adds little beyond the note that a check is required (which is already in the schema). No additional semantic value is provided for parameters like temperature or max_tokens.

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 clearly states the tool's function: delegating a subtask to ornith and verifying the result. It explicitly lists good and bad use cases (extraction, classification, reformatting vs. judgment calls, code, editing), making the purpose and scope unambiguous.

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

Usage Guidelines5/5

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

It provides explicit guidance on when to use the tool: it requires a verifiable check, lists suitable tasks, and explicitly warns against unsuitable ones (e.g., judgment calls, code) with 'do those yourself.' This clearly differentiates it from the alternatives (doing it manually or using other tools).

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

simple_job_statsB

How delegation has actually gone: jobs by kind, how often the check passed, and speed. Answers whether this server is earning its place.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description must carry the full burden of behavioral disclosure. It implies a read-only informational tool but does not explicitly state that it performs no mutations, requires no auth, or has any other behavioral caveats. The phrasing 'answers whether this server is earning its place' is not operationally informative.

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

Conciseness4/5

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

The description is brief and front-loaded with the core subject, but the final clause 'Answers whether this server is earning its place' adds little operational value and is somewhat metaphorical. Still, it is concise overall with minimal waste.

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

Completeness3/5

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

For a zero-parameter statistics tool, the description gives a reasonable sense of the returned dimensions: jobs by kind, check pass rate, and speed. However, it does not clarify the output format or precisely what 'speed' refers to, and it lacks any comparison to sibling tools, leaving some ambiguity for an agent.

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

Parameters4/5

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

The tool accepts zero parameters, so the schema already fully covers the input surface. The description does not need to explain parameter details, and the baseline for zero-parameter tools applies.

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 communicates that this tool reports statistics about job delegation, including breakdowns by kind, check pass rates, and speed. It is clear enough to identify the tool's purpose, though it lacks an explicit verb like 'returns' or 'computes' and does not explicitly differentiate itself from siblings.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as simple_job or summarize. No context, conditions, or exclusions are provided that would help an agent choose this tool correctly.

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

summarizeB

Summarise text with ornith on pop. Free, local, and it does not spend Claude context on the source. Pass the text directly, or a url/urls to fetch first (fetched on pop). The default check is a real one: the summary must be substantially shorter than the source and not a copy of it.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFetch this page on pop and summarise it.
textNoThe material to summarise. Either this or url/urls.
urlsNoFetch several pages on pop and summarise them together.
checkNoOptional. Defaults to {type:"summary_of"} against the source text.
focusNoWhat the summary should be about, if not everything. e.g. "only the benchmark numbers".
modelNoDefault ornith:35b.
styleNo"bullets" (default) or "paragraph".
thinkNoLet ornith reason before answering. Default false. Measured 2026-08-21: with reasoning on, 2 of 3 summarise runs returned an EMPTY answer after burning the whole token budget on thinking. Turn it on only for a job that genuinely needs deliberation, and raise max_tokens with it.
max_wordsNoTarget length. Default 200.
max_tokensNoDefault 2048. Ornith reasons before answering; too low returns an empty answer.
temperatureNo

TDQS

B3.4/5.0
Behavior4/5

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

With no annotations, the description carries the burden of disclosing behavior, and it does: free, local, avoids consuming Claude context, fetches URLs, and enforces a real anti-copy/shorter-than-source check. It does not cover failure modes or service dependencies, but the main behavioral traits that would affect an agent's invocation and expectation are present.

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

Conciseness4/5

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

The description is compact and front-loaded with the main verb and purpose. Every sentence contributes useful information, but 'on pop' appears twice without definition, slightly hurting clarity. It is appropriately sized and not padded.

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

Completeness3/5

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

Given 11 parameters, a nested check object, and no output schema, the description covers the main usage and the default verification behavior but leaves gaps: return value shape, error/failure behavior with URLs, and what the check object supports beyond its default. The schema covers most parameters, but the missing output context is notable.

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

Parameters3/5

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

Schema description coverage is high at 91%, so the baseline is 3. The description adds a little context about text/url/urls usage and the default check, but mostly repeats what the schema already documents. It does not add meaningful detail for parameters like focus, style, model, or temperature.

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 states the core action clearly with a specific verb and resource: 'Summarise text with ornith on pop.' It also clarifies the two input modes (direct text or URL/URLs) and differentiates itself via 'does not spend Claude context on the source.' However, 'on pop' is unexplained jargon, and it does not explicitly contrast with sibling search_and_summarize, so it is not a 5.

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

Usage Guidelines2/5

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

The description explains how to invoke the tool ('Pass the text directly, or a url/urls to fetch first') but provides no guidance on when to choose this tool over its siblings. search_and_summarize is a plausible alternative for search-then-summarize use cases, yet no exclusion or comparison is mentioned.

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. 5 tool updatesv1.0.0
    • First observeddownload
    • First observedsearch_and_summarize
    • First observedsimple_job
    • First observedsimple_job_stats
    • First observedsummarize

TDQS

A4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clear, distinct purpose: simple_job delegates a generic subtask, summarize condenses text, search_and_summarize combines web search with summarization, simple_job_stats reports on job execution, and download retrieves files. No two tools overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent lowercase_with_underscores convention, and related tools (simple_job, simple_job_stats) share a common prefix while remaining descriptive. No mixed camelCase or other styles.

Tool Count5/5

With 5 tools, the server is well-scoped—neither bare nor cluttered. Each tool serves a distinct, essential function, and the count aligns with the apparent purpose of task delegation and information retrieval.

Completeness5/5

The tool set covers the core operations needed for the server's domain: executing a job, summarizing, searching and summarizing, tracking job stats, and downloading files. No obvious missing functionality for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers