file-insight-mcp
ファイル分析MCP (file-insight-mcp)
指定されたフォルダ内の非構造化ドキュメントを読み取って構造を分析し、ドキュメント別の要約とフォルダ全体の要約レポートを作成する個人用ローカルMCPサーバーである。
このパッケージの
data/sample_docs/内のドキュメントはすべてデモ用に作成された合成データである。
基盤となる参考
サーバー構造(FastMCP、stdio、複数MCPサーバー構成): https://github.com/kyopark2014/mcp
ハーネス規約(段階的なstage/next_actions、根拠アンカー、承認境界): 同系列の
personal-meeting-mcp-trainingプロジェクトで確立した方式を再利用ハーネスエンジニアリング原則リスト: https://github.com/walkinglabs/awesome-harness-engineering (コンテキスト予算、事前承認フック、決定論的eval、静的セキュリティスキャナーの項目を このプロジェクトの規模に合わせて選別適用)
MCP Python SDK: https://github.com/modelcontextprotocol/python-sdk
Related MCP server: file-analyzer
このサーバーが行うこと
固定された対象フォルダ(
data/sample_docs/)の構造をスキャンする。許可された拡張子(
.txt .md .csv .log)のドキュメントのみを読み取る。ドキュメントから目次(見出し構造)、日付・数値・主要用語の候補をルールベースで抽出する。
ドキュメント全体を結合した要約プロンプトを作成する。要約自体はホストLLM(Claude/Codex)が 作成し、このMCPはLLM APIを呼び出さない。
作成された要約レポートの構造を検証し、言及されたファイル名が実際に存在するか照合する。
ユーザーが明示的に承認した後にのみレポートをファイルとして保存する。
クイックスタート
必須環境: Python 3.11以上、uv
uv sync --extra devインストール後、下記の検証節の4つのコマンドをすべてパスすることを確認する。
MCP Inspectorでツールを目視確認するには:
uv run mcp dev src/file_insight_mcp/server.pyプロジェクト構造
ドメインロジックとツール規約を分離し、検証ルールを変更するときにツール階層に触れないようにする。
パス | 役割 |
| パス安全性チェック、拡張子allowlist、サイズ・項目数上限 |
| フォルダスキャン、ドキュメント読み取り、レポート構造検証、承認ベース保存 |
| 目次・日付・数値・主要用語の抽出 (ルールベース、決定論的) |
| 要約に言及されたファイル名の照合 (助言的チェック) |
| ツール規約の共通要素 — |
| MCPツール・リソース・プロンプト登録 (ハーネス階層) |
| evalケースのパス式・判定・変数置換の純粋ロジック |
| 決定論的リグレッションケース (コードではなくデータ) |
| ケースを実際のMCPプロトコルで実行するランナー |
| STDIO起動・スキーマ・ハーネス規約スモークテスト |
| 配布前の静的チェック (クレデンシャル・危険な呼び出し・ツールコメント) |
| ドメイン関数のユニットテスト (サーバー起動なしで実行) |
推奨フロー
SCAN → LIST → READ → EXTRACT → DRAFT → CHECK → PREVIEW → [사용자 승인] → SAVED段階 | Tool | 読み書き | 役割 |
SCAN |
| 読み取り | 対象フォルダ構造・拡張子別の数・許可可否 |
LIST |
| 読み取り | 実際に読み取れるドキュメントのリスト |
READ |
| 読み取り | 原文の参照。行範囲の指定と |
EXTRACT |
| 読み取り | 目次(見出し/番号付け)構造の抽出 |
EXTRACT |
| 読み取り | 日付・数値・頻度ベースの主要用語候補の抽出 |
DRAFT |
| 読み取り | ドキュメント全体 + 標準レポート形式を結合したプロンプト生成 |
CHECK |
| 読み取り | 構造検証。 |
CHECK |
| 読み取り | 要約に言及されたファイル名が実際に存在するか照合 (助言、保存を妨げない) |
PREVIEW |
| 読み取り | 既存の保存版との差分確認 |
PREVIEW |
| 読み取り | 検証・diffをまとめて表示し、承認トークンを発行 |
SAVED |
| 書き込み | 承認トークンが一致する場合のみ保存 (唯一の書き込みツール) |
OBSERVE |
| 読み取り | 保存されたレポートのリスト |
OBSERVE |
| 読み取り | 保存監査ログの照会 |
リソースとプロンプト
種類 | URIまたは名前 | 役割 |
Resource |
| ドキュメント原文 |
Resource |
| 保存された要約レポート |
Prompt |
| スキャンから保存承認までの分析ワークフロー |
ハーネス設計
このサーバーは機能だけでなく、モデルがツールを使う方法も設計対象としている。
すべての応答に
stageとnext_actionsがあり、モデルが応答だけを見て次のツールを 選ぶ。blocking: trueは「この段階をスキップしないでください」という案内ヒントである。実際に 保存を妨げるのは構造検証と承認トークンであり、ヒントがその役割を代行することはない。エラーは
ToolFailureで原因コード・復旧方法・選択可能な値を一緒に返す。 モデルが再度問い合わせずに自分で回復できるようにすることが目的である。引数スキーマはフラットに保つ(
{"relative_path": "..."})。Pydanticモデルを 引数型として使うと{"params": {...}}のようにネストされ、呼び出し形式が変わる。戻り値はPydanticモデルなので
outputSchemaが自動的に生成される。すべてのツールに
readOnlyHint/destructiveHintを付け、ホストが書き込みツールに 異なる承認UIを表示できるようにする。確実なチェック(構造)のみ保存を妨げ、ヒューリスティックなチェック(ファイル名照合)は警告としてのみ通知する。
コンテキスト予算
「コンテキストウィンドウは捨てる場所ではなく作業メモリの予算」という原則に従い、 すべてのツールは応答サイズに明示的な上限を設けている。
scan_folder_structure:MAX_SCAN_ENTRIES(500)を超えるとtruncated: trueで 通知して切り詰める。read_document:MAX_FILE_BYTES(200KB)を超えるファイルは全体を読み取らず、read_document_chunkで一部のみ読み取るようにエラーで案内する。extract_key_terms:max_termsで分類別の項目数を制限する。preview_save_report:include_preview=Falseがデフォルト値なので、すでに保持している ドラフトを再度応答に含めない。含める必要がある場合のみmax_preview_charsで長さを 制限する。harness.truncate()/harness.number_lines(): 切り詰めの有無と引用アンカー(行 番号)を常に明示し、モデルが「これが全体なのか一部なのか」を推測しないようにする。
安全境界
サーバーは
security.TARGET_DIR(data/sample_docs/)の1つだけを扱う。..、絶対パス、 ドライブ文字、シンボリックリンクでもその外側にアクセスできない (security.safe_relative_path)。拡張子allowlist(
.txt .md .csv .log)外のファイルは読み取らない。実行/スクリプト 拡張子は対象から常に除外される。ファイルサイズが
MAX_FILE_BYTES(200KB)を超えると全体を読み取らず、エラーで案内する。名前が
.で始まる隠しファイル・フォルダはスキャンから除外する。書き込みツールは
save_approved_reportの1つだけで、preview_save_reportが発行した (report_id、本文)ハッシュトークンが一致する場合のみ動作する。このサーバーはドキュメントを読み取るだけである。
eval/exec/subprocessのようなコード・シェル実行 呼び出しがソースに入るとscripts/validate_package.pyが失敗する。
検証
uv run pytest -q
uv run python scripts/smoke_stdio.py
uv run python scripts/run_evals.py
uv run python scripts/validate_package.py4つのコマンドの役割がそれぞれ異なるため、すべてパスさせる必要がある。
コマンド | 検査範囲 | サーバー起動 |
|
| しない |
| ツール登録・スキーマの平坦性・コメント・エラーメッセージ規約 | する |
|
| する |
| クレデンシャル漏洩、危険な呼び出し、ツールコメントの静的チェック | しない |
run_evals.py には、承認トークンが正しい場合と間違っている場合に保存がそれぞれ成功・拒否されるかまで
含めた全体の保存フローが入っている。バグを修正するたびに、そのバグを再現するケースを
evals/cases.jsonl に1行追加する。ケースの文法は evals/README.md を参照。
他のフォルダを分析したい場合
このプロジェクトは安全性のため、対象フォルダを src/file_insight_mcp/security.py の
TARGET_DIR(パッケージ内の data/sample_docs/)に固定している。実際の業務フォルダを
分析するには:
TARGET_DIRを任意の絶対パスに変更するか、環境変数で注入するように修正する。そのフォルダに実際にある拡張子を
ALLOWED_EXTENSIONSに反映する。機密性の高いサブフォルダ(認証情報、個人情報など)がないか先に確認する。
Claude Desktop接続
config/claude_desktop_config.example.json の ABSOLUTE_PROJECT_PATH をこのフォルダの
絶対パスに置き換えた後、Claude Desktop設定に反映する。アプリを完全に終了してから
再度実行する必要がある。
設計原則
MCPは別のLLM APIを呼び出さない。ClaudeまたはCodexが要約文を作成し、 このMCPは原文・構造・検証・保存を担当する。
ドキュメントで確認されていないファイル名・数値・日付を作り出さず、根拠チェッカーが 機械的に照合する。
最終保存はプレビューで発行された承認トークンとユーザーの明示的承認の両方が 必要である。
ドメインロジック(
core、outline、grounding)とツール規約(server、harness、security)を分離する。
Available Tools
13 toolsbuild_summary_promptARead-onlyIdempotent
대상 폴더의 모든 문서와 표준 보고서 형식을 결합한 요약 프롬프트를 반환합니다.
이 MCP는 LLM API를 호출하지 않습니다. 요약은 호스트(Claude/Codex)가 하고, 이 도구는 '무엇을 어떤 형식으로 쓸지'에 대한 지시문과 원문 전체를 조립합니다.
Args: with_line_numbers: 원문 줄 번호 부착 및 인용 규칙 추가 여부 (기본 True).
Returns:
PromptResponse: prompt에 규칙 + 필수 섹션 + 문서 목록 + 원문이 담긴 지시문.
| Name | Required | Description | Default |
|---|---|---|---|
| with_line_numbers | No | True면 각 문서 원문에 줄 번호를 붙이고, 요약에 'L14' 형태로 인용하도록 규칙을 추가합니다. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| prompt | Yes | |
| status | Yes | 이 호출의 결과 상태 |
| target_dir | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
| document_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description goes beyond this by disclosing the key behavioral trait: the MCP makes no LLM API call and is a pure assembly operation. Knowing this tool has zero external side effects and does not itself perform the summary is genuinely valuable context that the annotations do not fully convey. No contradiction with the annotations; the description reinforces them.
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 purpose is front-loaded in the first sentence, followed by a valuable clarifier about not calling the LLM, then clean Args/Returns sections. The structure is tidy and scannable. The Args section slightly duplicates the schema parameter documentation, but the '요약은 호스트가 한다' sentence earns its place as it materially shapes how an agent should invoke the tool. No unnecessary bulk.
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 single-optional-parameter tool with an output schema present and 100% schema coverage, the description is quite complete: it covers purpose, the non-calling-LLM behavior, the parameter, and gives an overview of the return (rules + required sections + document list + raw text in the prompt field). Since an output schema exists, the description need not detail the return structure further. Minor omission: it does not state prerequisites like the target folder needing to be scanned first, but the sibling scan_folder_structure makes this implicit.
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 100%: the schema description for with_line_numbers already explains line-number attachment and the 'L14' citation rule, which is actually richer than the description's own '원문 줄 번호 부착 및 인용 규칙 추가 여부'. Both sources note the default of true. Per calibration, high schema coverage yields a baseline of 3, and the description adds only marginal value beyond what the schema provides.
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 and resource: it returns a summary prompt that combines all target-folder documents with a standard report format. It also clarifies what the tool is not — it does not call an LLM and does not summarize itself, which sharply distinguishes it from every sibling (scan_folder_structure, extract_key_terms, validate_report_draft, etc.). An agent can tell this is the assembly step versus the read/extract/validate steps without opening the schema.
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 clearly explains the tool's role in the workflow — it assembles instructions plus raw text for the host to consume, and explicitly states the LLM API is NOT called so the host does the summarizing. This tells the agent when to invoke it (as the prompt-building step before summarization) and why. It does not name specific sibling alternatives with when-not conditions, but the role is distinct enough among the siblings that this is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_summary_groundingARead-onlyIdempotent
보고서에 언급된 파일명이 현재 폴더 스캔 결과에 실제로 있는지 대조합니다.
"문서에 없는 파일을 만들어 내지 않는다"는 규칙을 사람 눈 대신 기계가 확인합니다.
중요: 이 검사는 자문(advisory) 입니다. 휴리스틱이므로 오탐이 있을 수 있고, 저장을 막지 않습니다. 저장 게이트는 validate_report_draft(구조)와 사용자 승인입니다.
Args: report_markdown: 요약 보고서 초안 전문.
Returns:
GroundingResponse: status(GROUNDED / MOSTLY_GROUNDED /
NEEDS_EVIDENCE_REVIEW), score(0-100), findings[].
| Name | Required | Description | Default |
|---|---|---|---|
| report_markdown | Yes | 검사할 요약 보고서 초안 전문(마크다운) |
Output Schema
| Name | Required | Description |
|---|---|---|
| score | Yes | |
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| checked | Yes | |
| summary | Yes | |
| advisory | No | True. 근거 검사는 저장을 막지 않습니다. 저장 게이트는 validate_report_draft와 사용자 승인입니다. |
| findings | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description discloses the tool is heuristic, may produce false positives, is advisory, and returns a GroundingResponse with status/score/findings. This adds crucial context about reliability and non-blocking behavior, which annotations alone do not convey.
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?
Front-loads the core purpose, then explains advisory nature, then lists args/returns. The Korean text is somewhat verbose but each section serves a function and the structure is clear and logical.
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 single-parameter tool with an output schema, the description covers the core function, advisory behavior, and return structure. It does not explicitly mention dependency on a prior folder scan, but that is inferable from sibling tools and the described purpose. Sufficient for correct invocation.
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% and the description merely repeats the parameter meaning (full draft markdown). It adds no extra semantic beyond what the schema already states, so the baseline of 3 applies.
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?
Description states a specific verb+resource: it checks file names mentioned in a report against the current folder scan results. It distinguishes itself from validate_report_draft by noting that the save gate is that tool plus user approval, so the agent can tell them apart.
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?
Explicitly states the tool is advisory, heuristic, may have false positives, and does not block saving, contrasting with validate_report_draft as the structural gate. However, it does not explicitly say when to call it (e.g., after scan_folder_structure) or provide alternatives beyond the save-gate distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_report_against_savedARead-onlyIdempotent
이미 저장된 보고서와 초안의 차이를 보여 줍니다.
같은 report_id로 두 번째 저장을 하면 기존 파일을 덮어씁니다. 무엇이 사라지는지 먼저 확인해 사고를 막는 용도입니다.
Args: report_id: 보고서 id. report_markdown: 초안 전문. diff_preview_lines: unified diff 미리보기 줄 수 (기본 40).
Returns:
DiffResponse: diff.write_mode가 CREATE / OVERWRITE / NO_CHANGE 중 하나.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | Yes | 보고서 id (영문 소문자/숫자/_/- 만 허용) | |
| report_markdown | Yes | 비교할 요약 보고서 초안 전문 | |
| diff_preview_lines | No | 돌려줄 diff 미리보기 줄 수 |
Output Schema
| Name | Required | Description |
|---|---|---|
| diff | Yes | |
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| target | Yes | |
| report_id | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, covering the safety profile. The description adds value beyond this by disclosing the overwrite semantics of a second save (currently a write operation yet non-destructive to this call) and the diff.write_mode return range (CREATE/OVERWRITE/NO_CHANGE). With annotations covering safety, this is solid supplementary context with 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 efficiently front-loaded with the purpose, followed by the overwrite warning and a compact Args/Returns block. The structure is clean and scannable, though the Args section is somewhat redundant with the schema. Minor waste, but nothing excessive.
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 a full input schema, an output schema describing DiffResponse, and annotations covering the safety profile, the description covers the purpose, the when-to-use scenario, and the key behavioral caveat (overwrite risk). Nothing critical an agent needs to call it correctly is missing; it could name alternatives, but overall it is complete.
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 100% — all three parameters (report_id, report_markdown, diff_preview_lines) are described in the schema, including the default of 40 for diff_preview_lines. The description's Args section largely restates this, adding negligible meaning beyond the schema. Baseline 3 is appropriate given the schema carries the load.
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+resource: it shows the diff between an already-saved report and a draft ('이미 저장된 보고서와 초안의 차이를 보여 줍니다'). This clearly distinguishes it from save/validate siblings (save_approved_report, validate_report_draft) by its comparative, non-writing role. It stops short of naming a sibling explicitly, but the purpose is 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 gives clear when-to-use context: a second save with the same report_id overwrites the existing file, so this tool exists to check what will be lost before that happens ('무엇이 사라지는지 먼저 확인해 사고를 막는 용도'). This strongly implies use before overwriting, though it does not explicitly name alternatives or exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_document_outlineARead-onlyIdempotent
마크다운 헤딩, 번호 매김 항목, 전부 대문자 줄을 목차 후보로 추출합니다.
비정형 문서는 형식이 제각각이므로 규칙 기반 휴리스틱 세 가지를 함께 사용합니다. 결과에는 원문 줄 번호가 함께 담겨 근거로 쓸 수 있습니다.
Args: relative_path: 문서 상대 경로.
Returns:
OutlineResponse: outline[]에 level, title, line이 담깁니다.
| Name | Required | Description | Default |
|---|---|---|---|
| relative_path | Yes | 문서 상대 경로 |
Output Schema
| Name | Required | Description |
|---|---|---|
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| outline | Yes | |
| entry_count | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
| relative_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=false, covering the safety profile. The description adds useful behavioral detail beyond annotations — the three heuristic rules and that results include original line numbers as evidence. This adds value without contradicting 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?
Purpose is front-loaded in the first line with the three heuristics following compactly. The Args/Returns block partly duplicates the schema and output summary, but the line-number-evidence detail is genuinely additive. Reasonably sized with minimal waste.
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 read-only, single-parameter tool with an output schema (OutlineResponse with level, title, line), the description covers the essential behavior and return semantics. It explains what heuristics produce candidates and that line numbers serve as evidence. Nothing critical is missing for correct invocation, though it could briefly note what disqualifies a line from being an outline candidate.
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 relative_path already described as '문서 상대 경로' in the schema. The description repeats the same parameter explanation verbatim, adding no new meaning about format, constraints, or interpretation beyond the schema. At full coverage, the baseline 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?
States a specific verb (extract), resource (document outline), and the three heuristic strategies (markdown headings, numbered items, all-caps lines). The intent is unambiguous and distinguishable from siblings like extract_key_terms or scan_folder_structure. Slight deduction for not explicitly positioning itself against those siblings.
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?
Implies usage for unstructured documents with inconsistent formatting ('비정형 문서는 형식이 제각각이므로'), which gives context on when it applies. However, it never states when not to use it or names alternative tools (e.g., scan_folder_structure for structural scans). Usage context is present but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_key_termsARead-onlyIdempotent
문서에서 날짜, 단위가 붙은 수치, 빈도 기반 핵심 용어 후보를 뽑습니다.
통계적 NLP가 아니라 정규식과 빈도 계산만 쓰는 결정적(deterministic) 추출이므로, 같은 문서에는 항상 같은 결과가 나옵니다.
Args: relative_path: 문서 상대 경로. max_terms: 분류별 최대 항목 수 (기본 20).
Returns:
KeyTermsResponse: dates, numbers에 줄 번호와 원문이, frequent_terms에
용어·빈도가 담깁니다.
| Name | Required | Description | Default |
|---|---|---|---|
| max_terms | No | 분류별 최대 항목 수. 컨텍스트 보호용입니다. | |
| relative_path | Yes | 문서 상대 경로 |
Output Schema
| Name | Required | Description |
|---|---|---|
| dates | Yes | |
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| numbers | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
| relative_path | Yes | |
| frequent_terms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral context: the extraction is deterministic (same document always yields same results) and uses regex and frequency rather than statistical NLP. This goes beyond the annotations by describing the method and consistency guarantees, which helps the agent trust the tool for reproducible use.
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 structured with a clear opening line stating the tool's function, followed by Args and Returns sections. It is not overly verbose; about 100 words in Korean. Key facts (determinism, regex usage) are front-loaded, and the parameter descriptions are wrapped into sections. A slight deduction for the Returns section being somewhat redundant with the output schema, but overall well-organized and efficient.
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 has a simple signature (2 parameters, 1 required) and an output schema that covers return structure, so the description does not need to detail return types extensively. It provides enough context for correct invocation: it names the parameters, explains the deterministic behavior, and notes the output categories (dates, numbers, frequent_terms). It lacks explicit usage guidance and error conditions, but these are minor gaps given the simplicity and existing annotations. Overall, it is sufficiently complete for an agent to call the tool 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?
Schema coverage is 100% for both parameters, so the baseline is 3. The description adds meaning beyond the schema: it clarifies that max_terms is 'per category' and notes it is 'for context protection' (컨텍스트 보호용), which explains the purpose of the limit. It also frames relative_path as a 'document relative path,' matching the schema but reinforcing usage. This extra insight justifies a score above baseline.
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 extracts dates, numbers with units, and frequency-based key term candidates from documents. It uses specific verbs ('extract') and resource types, and is distinct from siblings like extract_document_outline (which handles outlines) and read_document_chunk (which reads content). The purpose is immediately understandable without ambiguity.
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 usage for pulling key terms and metadata from a document, but it does not explicitly mention when to use this tool versus alternatives such as extract_document_outline or build_summary_prompt. No exclusions or alternative routing are provided, so an agent would need to infer context from sibling names rather than direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_saved_reportsARead-onlyIdempotent
이미 저장된 요약 보고서 목록을 조회합니다.
같은 report_id로 저장하면 덮어쓰기가 되므로, 저장 전에 무엇이 있는지 확인하는 용도입니다.
Returns:
SavedListResponse: saved[]에 report_id, 경로, 줄 수, 수정 시각(UTC),
내용 해시 앞 16자.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| saved | Yes | |
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only and non-destructive nature. The description adds the overwrite warning and details the returned fields (report_id, path, line count, UTC timestamp, content hash prefix), enriching behavioral context beyond 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?
Two punchy sentences plus a return specification. Purpose is front-loaded, every sentence earns its place, and there is no fluff.
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 parameterless, read-only tool with an output schema, the description covers purpose, return contents, and usage timing. Nothing an agent needs to invoke it 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?
Tool has zero parameters; baseline is 4. No parameter explanation needed, and schema coverage is irrelevant with 0 params.
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 it lists saved summary reports ('이미 저장된 요약 보고서 목록을 조회합니다') and explains its role in checking before saving. This distinguishes it from write operations like save_approved_report.
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 says when to use: before saving, to avoid overwriting (같은 report_id로 저장하면 덮어쓰기가 되므로, 저장 전에 확인). It does not name alternatives, but the context is clear among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_target_documentsARead-onlyIdempotent
확장자·크기 제한을 통과한, 실제로 읽고 요약할 수 있는 문서 목록을 돌려줍니다.
여기서 얻은 relative_path를 다른 모든 도구에 그대로 넘깁니다.
Returns:
DocumentListResponse: documents[]에 relative_path, 크기, 줄 수,
수정 시각이 담깁니다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| documents | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnlyHint=true, destructiveHint=false, idempotentHint=true), so the description's burden is light. It adds useful behavioral context beyond annotations: the tool applies extension/size filtering and guarantees the returned documents are readable and summarizable, plus it discloses the exact fields in each entry. There is no contradiction with 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?
Three short paragraphs in Korean, each earning its place: purpose/filter criteria first, the cross-tool relative_path guidance second, and the return-format disclosure third. Front-loaded and no filler. It could arguably merge the return-format paragraph with the first, but the structure is clear and efficient.
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, read-only list tool with an output schema, the description is largely complete: it explains filtering behavior, identifies the key deliverable (relative_path), and the output schema covers the return structure. The only minor gap is the absence of an explicit mention of the global list of documents the tool filters over, and no downside/edge-case disclosure (e.g., what happens when no documents pass the filters).
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 schema carries no semantic burden that the description must compensate for. Per the rubric, this earns the baseline of 4. The description appropriately focuses on output semantics (returned fields: relative_path, size, line count, modification time) rather than parameter syntax, which is irrelevant here.
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+resource: it returns the list of documents that passed extension/size restrictions and can actually be read and summarized. This clearly distinguishes it from siblings like scan_folder_structure (raw folder tree, not filtered documents) and list_saved_reports (previously saved reports, not analysis targets). Scope and filtering criteria are explicit.
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 actionable usage guidance by telling the agent that the relative_path obtained here is passed as-is to all other tools, establishing this as the canonical entry point for document selection. However, it does not explicitly state when to prefer siblings like scan_folder_structure or list_saved_reports instead — the exclusion logic is left to inference rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_save_reportARead-onlyIdempotent
저장 대상·변경 내용·검증 결과를 한 번에 보여 주고 승인 토큰을 발급합니다.
저장 직전의 단일 관문입니다. 구조 검증을 통과했을 때만 approval_token이
발급되며, 토큰은 (report_id, 본문) 해시라서 승인받은 내용과 저장되는
내용이 달라질 수 없습니다.
토큰은 사용자 승인을 대신하지 않습니다. 응답의 approval_request를
사용자에게 그대로 보여 주고, 사용자가 명시적으로 승인한 뒤에만
save_approved_report를 호출하세요.
Args: report_id: 보고서 id. report_markdown: 저장할 보고서 전문. include_preview: 전문을 응답에 다시 담을지 여부 (기본 False). max_preview_chars: preview 최대 길이 (기본 4000).
Returns:
PreviewResponse: status(AWAITING_APPROVAL / NEEDS_REVISION),
approval_token, validation, diff, approval_request.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | Yes | 보고서 id (영문 소문자/숫자/_/- 만 허용) | |
| include_preview | No | True면 보고서 전문을 응답에 그대로 되돌려줍니다. 이미 초안을 들고 있다면 False로 두어 컨텍스트를 아끼세요. | |
| report_markdown | Yes | 저장할 요약 보고서 전문(마크다운) | |
| max_preview_chars | No | preview 최대 길이 |
Output Schema
| Name | Required | Description |
|---|---|---|
| diff | Yes | |
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| target | Yes | |
| preview | No | |
| report_id | Yes | |
| validation | Yes | |
| write_mode | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
| approval_token | Yes | 검증을 통과했을 때만 발급됩니다. 이 토큰은 사용자 승인을 대신하지 않습니다. |
| approval_request | Yes | 사용자에게 그대로 보여 주고 승인을 받을 문장 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and destructiveHint false. The description adds crucial context: approval_token is issued only after structural validation, the token is a hash of (report_id, body) ensuring content integrity, and it does not replace user approval. This goes beyond the annotations to explain the tool's internal logic and constraints.
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 well structured, leading with the core purpose, then workflow details, a security warning, and parameter documentation. It is somewhat long but each section serves a purpose. It could be tightened by omitting the redundant parameter descriptions, but overall it is organized and front-loaded.
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 an output schema (PreviewResponse) and is part of a multi-step workflow, the description fully covers the operational flow: when the token is generated, how to use the response, and the explicit order of operations. The agent has enough information to invoke it correctly and know what to expect without any gaps.
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 100%, so the schema already documents each parameter thoroughly. The description's Args section essentially repeats the schema text without adding new meaning. It does not reveal, for example, the impact of include_preview on token generation or how max_preview_chars interacts with validation. It meets the baseline but adds no extra insight.
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 it shows the save target, changes, and validation results, and issues an approval token. It explicitly positions itself as the 'single gateway before saving' and distinguishes from save_approved_report, which is the actual save operation. The purpose is specific and actionable.
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 explains it must be used before saving, and explicitly instructs that save_approved_report should be called only after showing the approval_request to the user and receiving explicit approval. This provides clear when-to-use guidance and references the sibling tool directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_document_chunkARead-onlyIdempotent
relative_path에 해당하는 문서 원문을 읽습니다.
긴 문서를 통째로 읽어 컨텍스트를 낭비하지 않도록 줄 범위를 지정할 수 있습니다.
Args: relative_path: 문서 상대 경로. start_line: 시작 줄(1부터). 기본 1. end_line: 끝 줄. 생략하면 끝까지. with_line_numbers: 줄 번호 접두사 부착 여부. 기본 True.
Returns:
DocumentChunkResponse: content에 본문, total_lines에 전체 줄
수, truncated에 일부만 읽었는지 여부.
Raises: ToolFailure: DOCUMENT_NOT_FOUND / INVALID_PATH. 오류 메시지에 사용 가능한 relative_path 목록이 함께 담깁니다.
| Name | Required | Description | Default |
|---|---|---|---|
| end_line | No | 읽기를 끝낼 줄 번호. 생략하면 끝까지 읽습니다. | |
| start_line | No | 읽기 시작할 줄 번호(1부터) | |
| relative_path | Yes | list_target_documents가 돌려준 상대 경로 (예: 'research/market_research.txt') | |
| with_line_numbers | No | True면 'L14 | 내용' 형태로 줄 번호를 붙입니다. 요약 근거 칸에 인용 앵커를 적을 때 사용합니다. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| content | Yes | |
| end_line | Yes | |
| truncated | Yes | |
| start_line | Yes | |
| total_lines | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
| relative_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, idempotentHint=true), the description discloses error behavior: it raises ToolFailure with DOCUMENT_NOT_FOUND/INVALID_PATH and includes a list of available paths in the error message. It also explains the return fields (content, total_lines, truncated). This additional context helps the agent anticipate failures and interpret responses, exceeding what annotations alone provide.
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 well-structured with clear sections (Args, Returns, Raises) and is appropriately sized. The core purpose is front-loaded in the first sentence, and the rest is organized logically. However, the Args section redundantly lists parameters that are already fully described in the schema, which is a minor inefficiency but not bloated.
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 that an output schema exists (DocumentChunkResponse), the description still adds value by explaining error scenarios and the meaning of the response fields. It covers the essential context for correct invocation—path specification, line range semantics, and error handling. While pagination or performance limits are not mentioned, they are not necessary for a read tool with these annotations and output schema.
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 each parameter already has a detailed description, including examples and defaults (e.g., with_line_numbers for citation anchors). The description's Args section largely paraphrases these schema definitions without adding new semantic information. Thus, it meets the baseline but does not enrich parameter understanding 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 opens with a clear statement of the verb and resource: "relative_path에 해당하는 문서 원문을 읽습니다" (reads the original document at relative_path). It further specifies chunked reading via line ranges, which distinguishes it from siblings like extract_document_outline (structural extraction) and list_target_documents (listing). The purpose is immediately understandable.
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 a usage tip: "긴 문서를 통째로 읽어 컨텍스트를 낭비하지 않도록 줄 범위를 지정할 수 있습니다" (specify line ranges to avoid wasting context on long documents). This implies when to use line ranges, but it does not explicitly state when to prefer this tool over alternatives, nor does it mention exclusions or fallbacks. No sibling comparison is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_report_audit_logARead-onlyIdempotent
보고서 저장 감사 로그를 최신순으로 조회합니다.
AWAITING_APPROVAL → SAVED 흐름의 실행 증거를 확인할 때 사용합니다.
Args: limit: 최대 건수 (기본 20). report_id: 특정 보고서로 필터링 (선택).
Returns:
AuditResponse: events[] 최신순.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 최신순 최대 건수 | |
| report_id | No | 특정 보고서로 필터링. 생략하면 전체. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| events | Yes | |
| status | Yes | 이 호출의 결과 상태 |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint, idempotentHint, and destructiveHint. The description adds the return shape (AuditResponse with events[] in latest order) and confirms the read-only nature. It provides useful behavioral context beyond the annotations without contradicting them.
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 concise with a clear structure: a first line explaining what the tool does, a usage note, then Args and Returns. It is front-loaded and avoids verbosity, though it repeats some parameter details already present in the schema, which is slightly redundant but acceptable.
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 presence of an output schema and the tool's simplicity, the description is complete. It explains the purpose, usage context, ordering, and return format. No additional information is needed for an agent to correctly invoke the tool, as all parameters are optional and clearly described.
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 descriptions cover both parameters fully, including defaults and constraints. The description repeats the parameter list and adds minor clarifications (e.g., '선택' for optional, '생략하면 전체' for report_id). This is consistent with the baseline of 3 when schema already does the heavy lifting.
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 action (조회 - retrieve) and resource (보고서 저장 감사 로그 - report save audit log) and specifies the ordering (최신순 - latest). It also includes a concrete usage scenario (AWAITING_APPROVAL → SAVED flow), which effectively differentiates it from sibling tools like list_saved_reports or save_approved_report.
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 an explicit trigger for when to use: when verifying execution evidence of the AWAITING_APPROVAL → SAVED flow. However, it does not mention when not to use or suggest alternative tools, so it lacks explicit exclusions. Thus a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_approved_reportADestructiveIdempotent
미리보기에서 발급된 승인 토큰이 일치할 때만 보고서를 파일로 저장합니다.
이 서버에서 유일한 쓰기 도구입니다. 호출 전 반드시 두 조건을 만족해야 합니다.
preview_save_report가
AWAITING_APPROVAL을 돌려주고 토큰을 발급했다.사용자가 그 내용을 보고 명시적으로 저장을 승인했다.
토큰은 기술적 무결성(승인한 내용 == 저장되는 내용)만 보장합니다. 사용자 승인을 대신하지 않습니다. 사용자가 "저장해"라고 말하지 않았다면 호출하지 마세요.
Args: report_id: 보고서 id. report_markdown: 저장할 보고서 전문. approval_token: 미리보기가 발급한 토큰. expected_write_mode: 선택. 지정하면 실제 write_mode와 다를 때 거부합니다.
Returns:
SaveResponse: path(저장 경로), audit(감사 로그 경로),
write_mode(CREATE / OVERWRITE / NO_CHANGE).
Raises: ToolFailure: TOKEN_MISMATCH, VALIDATION_FAILED, WRITE_MODE_CHANGED, INVALID_REPORT_ID. 모두 복구 방법이 메시지에 포함됩니다.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | Yes | 보고서 id (영문 소문자/숫자/_/- 만 허용) | |
| approval_token | Yes | preview_save_report가 발급한 승인 토큰 | |
| report_markdown | Yes | 저장할 보고서 전문. preview_save_report에 넘긴 것과 한 글자라도 다르면 토큰 검증에 실패합니다. | |
| expected_write_mode | No | 미리보기에서 본 write_mode. 지정하면 실제 상태와 다를 때 저장을 거부합니다. 덮어쓰기 사고 방지용입니다. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| audit | Yes | |
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| report_id | Yes | |
| write_mode | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the bar for extra disclosure is lower — yet the description still adds critical context: the token guarantees only technical integrity (approved content == saved content), NOT user approval, which is a crucial safety clarification. It also discloses the OVERWRITE destructive mode and the WRITE_MODE_CHANGED rejection mechanism, deepening understanding of the idempotent+destructive combination.
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?
Well-structured with clear section headers (Args, Returns, Raises), a front-loaded purpose statement, and numbered preconditions that make the safety gate easy to parse. Slightly verbose — the Args block largely duplicates schema descriptions and the Raises list could be trimmed — but every section earns its place in an approval-gated tool where safety detail matters.
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 a conditional approval workflow, the description is complete: it covers the preconditions, the token semantics and its limitation, the error types with recovery info, the output shape (SaveResponse with path/audit/write_mode), and the optional expected_write_mode safeguard. Output schema exists and parameter coverage is 100%, so nothing an agent needs to call this 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 coverage is 100% and the schema itself already documents all four parameters well, including the critical constraint on report_markdown ('even one character different fails token verification') and expected_write_mode's overwrite-protection purpose. The description's Args section restates these rather than adding materially new meaning, though it does reinforce the cross-parameter binding (token must originate from preview, markdown must match preview) in the flow 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 opens with a specific verb+resource+condition: 'saves the report to file only when the approval token issued in preview matches.' This clearly differentiates it from sibling tools — it explicitly declares itself 'the only write tool on this server,' which is a concrete distinguishing claim against the read/validation siblings like preview_save_report and list_saved_reports.
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?
Provides two explicit numbered preconditions that must hold before invocation: (1) preview_save_report returned AWAITING_APPROVAL and issued a token, and (2) the user has explicitly approved saving. It goes further with a clear exclusion: 'Do not call unless the user said save.' This gives the agent unambiguous go/no-go criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_folder_structureARead-onlyIdempotent
서버에 고정된 대상 폴더를 재귀적으로 훑어 파일 구조를 돌려줍니다.
폴더 분석의 출발점입니다. 각 항목의 allowed가 false이면 확장자 또는
크기 제한 때문에 다른 도구로 읽을 수 없다는 뜻이며, reason에 이유가
담깁니다.
Returns:
ScanResponse: entries[]에 상대 경로·확장자·크기·수정 시각·허용
여부가 담기고, extension_counts에 확장자별 개수, truncated에
항목 수 제한으로 일부만 담겼는지 여부가 담깁니다.
Examples: - 사용: "이 폴더에 어떤 파일들이 있나요?" - 사용하지 않음: 이미 대상 파일을 알고 있고 원문이 필요할 때 → read_document_chunk
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| status | Yes | 이 호출의 결과 상태 |
| entries | Yes | |
| max_depth | Yes | |
| truncated | Yes | |
| target_dir | Yes | |
| total_files | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
| extension_counts | Yes | |
| total_size_bytes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already declaring readOnlyHint, idempotentHint, and destructiveHint, the description adds valuable context beyond them: it explains the recursive scan nature, the semantics of `allowed` and `reason` (why files are inaccessible due to extension/size limits), and the response structure including `truncated` for item count limits. This enriches the agent's understanding of tool behavior without contradicting any annotation.
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 well-structured with clear paragraphs: main action, then allowed/reason explanation, then Returns block, then Examples. It is somewhat lengthy (about 10 lines) but every sentence adds value, including the heuristic about `allowed` and the example usage. It front-loads the core purpose and doesn't waste words, though it could be slightly tighter by merging some explanatory sentences.
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 no parameters, a rich output schema (as indicated by 'Has output schema: true'), and the description already covers the return fields, the tool is completely specified. It explains the `allowed`/`reason` semantics that are crucial for agent decision-making, mentions the `truncated` field, and provides usage examples. No critical information is missing for an agent to correctly invoke this tool.
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 baseline is 4 per instructions. The description doesn't need to elaborate on parameters, and it correctly focuses on output semantics. Since schema coverage is 100% (vacuously true with no props), no additional parameter documentation is required. The description effectively explains the return structure, which is the relevant semantic content.
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 recursively scans a fixed target folder and returns the file structure. It uses a specific verb ('훑어' - scans) and resource ('대상 폴더'), and distinguishes itself from siblings by explicitly mentioning it is the 'starting point of folder analysis' and giving a concrete example of when not to use it (when you already know the target file and need original text, use read_document_chunk).
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 explicit guidance on when to use the tool ('folder analysis starting point'), explains the meaning of the `allowed` flag in terms of downstream tool accessibility, and gives a clear example of when to use an alternative (read_document_chunk when the target file is known). This effectively routes the agent to the correct sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_report_draftARead-onlyIdempotent
요약 보고서 초안의 구조를 검사합니다. 저장 게이트입니다.
error가 하나라도 있으면 preview_save_report에서 승인 토큰이 발급되지
않습니다.
검사 항목: - error: H1 제목, 필수 섹션 5개(폴더 개요/파일 구조/문서별 요약/주요 키워드/확인 필요 사항) - warning: 섹션 순서, 자리표시자 잔존, 대상 폴더 표기 누락, 문서 경로 인용 누락
Args: report_markdown: 요약 보고서 초안 전문.
Returns:
ValidationResponse: valid, error_count, warning_count,
issues[](rule_id/severity/message/fix/line).
| Name | Required | Description | Default |
|---|---|---|---|
| report_markdown | Yes | 검증할 요약 보고서 초안 전문(마크다운) |
Output Schema
| Name | Required | Description |
|---|---|---|
| stage | Yes | 폴더 분석 워크플로에서 지금 위치한 단계 |
| valid | Yes | |
| issues | Yes | |
| status | Yes | 이 호출의 결과 상태 |
| error_count | Yes | |
| next_actions | No | 이어서 호출하면 좋은 도구 목록 |
| warning_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, destructiveHint=false, and the description is fully consistent. Beyond those annotations it adds real context: the gating behavior (errors block the downstream approval token) and the return shape (valid/error_count/warning_count/issues[] with rule_id/severity/message/fix/line). No contradiction with 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?
Purpose and the critical gating consequence are front-loaded in the first two lines. Validation items are organized into error/warning lists, and Args/Returns sections are compact. Nothing is wasted; the whole definition 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?
With one fully documented parameter and an existing output schema, the description covers everything an agent needs: when to call it (before preview_save_report), what rules it enforces (with rule IDs and severities), and what it returns. No meaningful gap remains.
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 100% - the single parameter report_markdown is already documented in the schema as '검증할 요약 보고서 초안 전문(마크다운)'. The Args section merely restates it without adding new meaning, so the baseline of 3 applies. The validation-rule context lives in the description body, not in param semantics themselves.
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?
Uses a specific verb+resource (검사합니다/요약 보고서 초안 구조) and enumerates exact validation rules by severity (error: H1 + 5 required sections; warning: section order, placeholders, etc.). Clearly distinct from all 13 siblings as a structural pre-save validator.
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?
Explicitly frames the tool as a '저장 게이트' (save gate) and states the consequence: any error means preview_save_report won't issue an approval token. This routes the agent to call it before saving. It does not name alternatives like check_summary_grounding or diff_report_against_saved to clarify when those should be used instead, so it stops short of full exclusion guidance.
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.
13 tool updates
v0.1.0- First observed
build_summary_prompt - First observed
check_summary_grounding - First observed
diff_report_against_saved - First observed
extract_document_outline - First observed
extract_key_terms - First observed
list_saved_reports - First observed
list_target_documents - First observed
preview_save_report - First observed
read_document_chunk - First observed
read_report_audit_log - First observed
save_approved_report - First observed
scan_folder_structure - First observed
validate_report_draft
TDQS
Scored across 13 tools
Each tool has a distinct role in the workflow: scanning, listing readable docs, reading chunks, extracting outlines/terms, building prompts, validating structure, checking grounding, diffing, previewing, saving, listing saved reports, and reading audit logs. The only potential overlap is scan_folder_structure vs list_target_documents, but their purposes are clearly differentiated (full scan vs. actionable document list). No ambiguity in selection.
All tool names follow a consistent verb_noun pattern in snake_case (scan_folder_structure, read_document_chunk, extract_key_terms, validate_report_draft, list_saved_reports). Verbs are descriptive and parallel (scan/list/read/extract/build/validate/check/diff/preview/save). No mixed conventions or chaotic naming.
13 tools is within the ideal 3-15 range. Each tool supports a specific stage of a coherent workflow (folder analysis → report generation → validation → approval → save → audit). No redundant or trivial tools; the count feels well-scoped for the server's purpose.
The workflow covers scanning, extraction, prompt building, structural validation, grounding checks, diff, preview, save, list, and audit. The only notable gap is the lack of a tool to read a previously saved report's full content directly (e.g., read_saved_report), though diff_report_against_saved provides partial visibility. This is a minor gap that agents can work around via diff or by reading original documents.
Maintenance
Related MCP Connectors
Document inventory, extraction, summaries and comparison with source quotes and usage billing.
Convert PDF, Word, Excel and scanned documents to Markdown, tables and RAG chunks. OCR.
High-fidelity PDF to structured Markdown conversion and document field extraction.
Extract structured data points from research papers and other documents with an LLM.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables real-time indexing and semantic search of local documents (PDF, Word, text, Markdown, RTF) using vector embeddings and local LLMs. Monitors folders for changes and provides natural language search capabilities through Claude Desktop integration.22MIT
- FlicenseAqualityCmaintenanceEnables read-only analysis of local unstructured documents by scanning a folder, extracting text and structural metadata, and passing content with truncation and error-awareness to an LLM for summarization.91-
- AlicenseAqualityCmaintenanceEnables reading and extracting text from local documents (PDF, Word, Excel, PowerPoint, HWP, Markdown, CSV, etc.) without network access, and provides approval-gated summary saving and file organization.11MIT
- FlicenseAqualityCmaintenanceEnables local analysis of unstructured documents (PDF, DOCX, PPTX, SVG, PNG) by extracting text and structure with citation anchors, and verifies summaries against source material before a human approves saving a report.9-