AsItIs について
AsItIs は、コーディングエージェント向け Markdown 指示ファイルを調べる読み取り専用の MCP サーバーと CLI です。構造表示、lint、コンテキスト予算、修正プレビューを提供し、ファイルは変更しません。
主な機能
- 01バイト単位の情報付きで Markdown を読む
- 02見出しのアウトラインと指示ファイルの lint
- 03エージェントのコンテキストトークン予算を推定
- 04読み込みタイミング別に指示ファイルを検索
- 05書き込まず差分形式で修正案を提示
活用シーン
- 01利用前にエージェント指示ファイルを確認
- 02リンク切れや矛盾するルールを検出
- 03毎回読み込む指示のコンテキスト量を推定
- 04CI や pre-commit で指示ファイルを lint
MCP 対応
MCP サーバーは、Markdown 指示ファイルの読み取り、アウトライン化、lint、予算算出、検索、修正提案を行う6つの読み取り専用ツールを公開します。stdio で通信し、設定されたルート内だけを読み取ります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
@asitis/mcp
Markdown および AI エージェントの指示ファイル向けの読み取り専用 MCP サーバーです。 ファイルを書き換えない Markdown エディター、AsItIs の提供です。MIT ライセンスです。ソース、課題、Claude Code プラグイン:github.com/Katta041/asitis-agent-tools。
コーディングエージェントに、CLAUDE.md、AGENTS.md、GEMINI.md、SKILL.md、サブエージェント、コマンド、ルール、Cursor の .mdc ルール、Copilot の指示、メモリファイルを読み取り、アウトライン作成、リント、予算確認、修正案の提示を行う6つのツールを提供します。これらのファイルを変更することはできません。同じパッケージには、CI と pre-commit 用の asitis コマンドも含まれています。
- 書き込みなし。 書き込み、パッチ、削除のツールはなく、パッケージ内に書き込みコードもありません。
- ネットワーク接続なし。 テレメトリー、更新確認、リモート呼び出しはありません。MCP は stdio のみで通信します。
- 指定したフォルダーのみ。 スキルまたは設定のスキャンを明示的に指定しない限り、起動時に指定したフォルダー(複数可)配下の Markdown ファイルと、独自の
.asitisrc.jsonおよびルートの.gitmodulesのみを読み取ります。
インストール
Node 22.13 以降が必要です。必ずバージョンを固定してください。エージェント設定では @latest を使用しないでください。MCP クライアントはプロジェクトの外部でサーバーを起動するため、--root には絶対パスを指定してください。
起動することを確認します。
npx -y @asitis/[email protected] --version
Claude Code
プロジェクトフォルダーで次を実行します。
claude mcp add asitis -- npx -y @asitis/[email protected] --root "$PWD"
または、Claude Code プラグインをインストールします。バイト単位で内容を維持する編集スキル、/asitis:md-lint、/asitis:md-budget、任意で有効にできるガードフックが追加され、Node の権限モデルの下でこのサーバーが実行されます。
claude plugin marketplace add Katta041/asitis-agent-tools
claude plugin install asitis@asitis
Claude Desktop
macOS では ~/Library/Application Support/Claude/claude_desktop_config.json、Windows では %APPDATA%\Claude\claude_desktop_config.json を使用します。
{
"mcpServers": {
"asitis": {
"command": "npx",
"args": ["-y", "@asitis/[email protected]", "--root", "/absolute/path/to/project"]
}
}
}
Cursor
プロジェクト内の .cursor/mcp.json(または ~/.cursor/mcp.json)を使用します。
{
"mcpServers": {
"asitis": {
"command": "npx",
"args": ["-y", "@asitis/[email protected]", "--root", "${workspaceFolder}"]
}
}
}
Cursor のバージョンによって ${workspaceFolder} が展開されない場合は、絶対パスを使用してください。サーバーは ${...} が残っているルートを推測で補わず、拒否します。
VS Code
プロジェクト内の .vscode/mcp.json を使用します(Copilot エージェントモード)。VS Code では mcpServers ではなく servers キーを使用します。
{
"servers": {
"asitis": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@asitis/[email protected]", "--root", "${workspaceFolder}"]
}
}
}
Codex(CLI、IDE、デスクトップ)
~/.codex/config.toml を使用します。
[mcp_servers.asitis]
command = "npx"
args = ["-y", "@asitis/[email protected]", "--root", "/absolute/path/to/project"]
Gemini CLI
プロジェクト内の .gemini/settings.json(または ~/.gemini/settings.json)を使用します。
{
"mcpServers": {
"asitis": {
"command": "npx",
"args": ["-y", "@asitis/[email protected]", "--root", "/absolute/path/to/project"]
}
}
}
セキュリティ強化:Node の権限モデル
Node の権限モデルの下でファイルを直接実行すると、Node 自体が書き込みと子プロセスの起動を禁止します(Node 25 以降ではネットワークアクセスも禁止します)。
npm install -g @asitis/[email protected]
node --permission \
--allow-fs-read="$(npm root -g)/@asitis/mcp" \
--allow-fs-read=/absolute/path/to/project \
"$(npm root -g)/@asitis/mcp/dist/asitis-mcp.mjs" --root /absolute/path/to/project
クライアント設定では、command に node を指定し、それ以外の語句はすべて同じ順序で args に指定します。設定ではシェルコマンドが実行されないため、$(npm root -g) はそのコマンドが出力するフォルダーに置き換えてください。
デスクトップアプリが npx または node を見つけられない場合は、フルパスを command に指定してください(which npx、または Windows では where npx を実行します)。
CLI と CI
このパッケージには、スクリプト、CI、pre-commit 向けの asitis コマンドもあります。lint_steering と同じ方法で lint を実行し、終了コードは 0(問題なし)、1(--fail-on 以上の重要度の指摘あり。デフォルトは error)、2(修正可能な問題。stderr に1行出力)、3(asitis のバグ)です。
npx -y -p @asitis/[email protected] asitis lint # every steering file under the current folder
npx -y -p @asitis/[email protected] asitis lint CLAUDE.md AGENTS.md # only these files
npx -y -p @asitis/[email protected] asitis lint --format sarif > asitis.sarif
npx -y -p @asitis/[email protected] asitis lint --fix-preview=safe | git apply # apply the safe fixes yourself
npx -y -p @asitis/[email protected] asitis budget # tokens each agent loads every session
形式は text、json、sarif(GitHub のコードスキャンが読み込む標準レポート形式)、github(プルリクエストの注釈)です。github では、エラーと警告のみが注釈になります。ノートも注釈にするには --annotate-notes を追加します。ファイルへの書き込みは行いません。--fix-preview は差分を表示するので、適用するかどうかは自分で判断できます。各コマンドのオプションは asitis lint --help と asitis budget --help に記載されています。
$ npx -y -p @asitis/[email protected] asitis lint --include skills
.claude/skills/release/SKILL.md:4:1 warning sec-skill-allowed-tools allowed-tools pre-approves "Bash" (any shell command), so during the turn that invokes this skill those calls go ahead without asking you; scope each entry to the commands it needs, for example Bash(git status *) or WebFetch(domain:docs.example.com)
CLAUDE.md:7:1 warning duplicate-rule Same rule as line 5: "Run `pnpm test` before every commit". Duplicates cost context and drift apart when one is edited; keep one
CLAUDE.md:9:1 warning broken-link Relative link target not found: "docs/api.md". Fix the path or remove the link
CLAUDE.md:11:1 note hidden-comment 1 comment (HTML or [//]: # style) is hidden in rendered views on line 11: "maintainer note: keep this short". It does not read like an instruction to an agent; Claude Code strips it from CLAUDE.md at session start, though its Read tool and other agents still see it, so check that it says what you expect
Linted 2 files: 0 errors, 3 warnings, 1 note.
Skill scan: 1 skill folder, 0 scripts and 0 markdown files read, 0 other files checked for executable headers (0 files in all).
この実行は終了コード 0 になります。デフォルトの --fail-on error では、エラーのみがビルド失敗の原因になります。仕込まれた不可視文字や双方向テキスト制御文字、および指示を無視する、何かを隠す、コマンドを実行する、秘密情報を探すようエージェントに指示する隠しコメントはエラーとなるため、デフォルトでビルド失敗の原因になります。警告も失敗の対象にするには、--fail-on warning を渡してください。
GitHub Action。 npm のインストールなしで同梱の CLI を実行し、指摘をプルリクエストに表示します。
permissions:
contents: read
jobs:
asitis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22
- uses: Katta041/[email protected]
pre-commit。 ステージング済みのステアリングファイルのみを lint します。
repos:
- repo: https://github.com/Katta041/asitis-agent-tools
rev: v0.3.0
hooks:
- id: asitis-lint
docs/ci.md では、Action の入力と SARIF のアップロード、lefthook、husky、GitLab CI について説明しています。すべてのフラグと終了コードは docs/cli-contract.md に記載されています。
設定
プロジェクトのルートに .asitisrc.json を置きます。すべての項目は任意です。
{
"$schema": "https://raw.githubusercontent.com/Katta041/asitis-agent-tools/main/packages/mcp/schema/asitisrc-1.json",
"extends": "recommended",
"rules": {
"duplicate-rule": "off",
"length": ["warning", { "claudeMdLines": 300 }]
},
"ignore": ["vendor/**", "examples/**"],
"overrides": [{ "files": ["docs/**"], "rules": { "contradiction": "off" } }],
"include": ["skills", "config"]
}
| キー | 説明 |
|---|---|
rules | ルール ID ごとに error、warning、note、off を指定します。length では claudeMdLines、skillMdLines、cursorRuleLines、codexBytes、windsurfChars、memoryIndexLines も指定できます。 |
extends | recommended(デフォルト)または strict を指定します。strict では、ノートが警告になり、2つのインベントリノート(プレーンなフック、tools リストのないサブエージェント)が追加され、CLI と Action でスキルおよび設定のスキャンが実行されます。 |
ignore, overrides | スキップするファイルの glob と、glob ごとのルール設定を指定します。 |
include | オプトインするスキャンを指定します。skills、config、config-local を指定できます。CLI と Action で有効です。MCP サーバーはこれを無視し、lint_steering に include を渡すよう求めます。そのため、リポジトリがサーバーに指定以上の内容を読み込ませることはできません。 |
誤記があると、ファイル名、行番号、修正候補を示して実行が停止します(.asitisrc.json line 2: unknown key "rulez" (did you mean "rules"?))。
1つの指摘を無視するには、その直上にルール ID を含むコメントを置きます:``。ファイル全体を対象にする場合は asitis-disable-file を使います。-- の後に続ける理由は任意です。理由を指定すると、JSON と SARIF の出力に含まれます。ルール ID は各指摘の重要度の後にある単語です。ルールの一覧は docs/rules/ にあります。セキュリティルール(隠し指示、不可視文字、sec-* ルール)は、攻撃者がまさに追加するものがコメントであるため、コメントでは無効化できません。.asitisrc.json またはベースラインで無効にしてください。これらの変更はレビューで確認できます。既存のリポジトリでは、asitis lint --format json --write-baseline > .asitis-baseline.json を実行してから --baseline .asitis-baseline.json を指定すると、新しい指摘のみが報告されます。
すべてのルールには例を含むページがあります:docs/rules/。
ツール
| ツール | 返される内容 |
|---|---|
read_markdown | 保存されているとおりのファイルテキストに加えて、バイトプロファイル(エンコーディング、BOM、CRLF/LF/CR の数、末尾の改行、末尾の空白、無効な UTF-8 バイト範囲、sha256)を返します。大きなファイルはページ分割します(offset_bytes、max_bytes、デフォルトは 256 KB、最大は 1 MB)。as: "base64" を指定すると、正確なバイト列を返します。コンテンツを信頼できないものとして扱い、隠し文字やコメントを要約します。 |
outline | フロントマターとフェンス付きコードを除外して、行番号付きの ATX 見出しと setext 見出しを返します。 |
lint_steering | 1 行目のフロントマターと有効な YAML、SKILL.md およびサブエージェントに必須の name と description、不明なキー、ベンダー制限に対する長さ、壊れた相対リンクと @path インポート、ゼロ幅文字・双方向テキスト制御文字などの不可視文字、指示のように読める隠し HTML コメント、インラインスタイルで隠されたテキスト、重複したルールや矛盾しているように見えるルールを検査します。複数ファイルにわたる検査では、Claude Code が読み込まない AGENTS.md、同期がずれているミラーファイル、Codex の共通 32 KiB 予算も確認します。パスを指定しない場合は、フォルダー内のすべてのステアリングファイルを検査します。.asitisrc.json と抑制コメントを適用します。include: ["skills"] を指定するとスキルフォルダー内のスクリプトも検査し、include: ["config"] を指定すると .claude/settings.json と MCP 設定ファイルを監査します。 |
context_budget | 各セッションで読み込まれるファイルごと、およびツールごとの概算トークン数を返します。対象は、Claude Code(CLAUDE.md と最大 4 段階の @imports、または CLAUDE.md がない場合は AGENTS.md、paths のないルール、メモリフォルダーを 2 つ目のルートとして追加した場合の MEMORY.md の先頭 200 行、スキルとサブエージェントの一覧)、Codex(ルートの AGENTS.md の先頭 32 KiB)、Gemini CLI(GEMINI.md と最大 5 段階のインポート)、Cursor の常時適用ルール、Copilot のリポジトリ指示、Windsurf と Cline のルールです。長い一覧は切り詰めますが、合計にはすべてのファイルが含まれます。 |
find_steering_files | すべてのステアリングファイルを、読み込みタイミング別に分類して返します。すべてのセッション、条件一致時(paths、globs、applyTo)、呼び出し時(スキル、コマンド、エージェント、プロンプト)、必要時(ネストされた指示ファイル)、メモリ。 |
suggest_fixes | 機械的な検出事項(不可視文字、1 行目にないフロントマター、スキルの name フィールド、末尾の空白、末尾の改行の欠落、指示のような HTML コメント)に対する修正を統合差分で返し、各編集の変更前と変更後のテキストも示します。各修正には safe または review のラベルが付きます。書き込みは行いません。アシスタントが、承認した編集を適用します。 |
すべてのツールには readOnlyHint: true、destructiveHint: false、openWorldHint: false が注釈として付いています。--footer(または ASITIS_MCP_FOOTER=1)を指定しない限り、ツールの結果に asitis.app へのリンクは含まれません。指定した場合は、各セッションの最初の結果の末尾に Edit these files without rewriting them: https://asitis.app/?ref=mcp という 1 行が追加されます。後続の結果やエラーには繰り返し表示されません。--no-footer も引き続き指定できますが、何も変更しません。結果はテキストのみです。スクリプト向けに各結果を structuredContent 内の JSON としても取得するには、--structured(または ASITIS_MCP_STRUCTURED=1)を指定します。デフォルトでは無効です。Claude Code 2.1 では両方があるとテキストではなく JSON がモデルに渡され、信頼できないコンテンツに関する注意書きと、read_markdown の場合はファイルテキストが失われるためです。
検査対象のベンダー制限と出典は src/limits.ts にあります。
| ファイル | 上限 |
|---|---|
| CLAUDE.md | 200 行未満を目標にしてください(Claude Code のメモリドキュメント) |
| SKILL.md | 500 行未満。リスト表示では description と when_to_use が 1,536 文字で切り詰められます(Claude Code のスキルドキュメント)。name は最大 64 文字、description は最大 1,024 文字です(Agent Skills 仕様。Claude API と claude.ai はこれを超えると拒否しますが、Claude Code は読み込んだうえでリスト表示を切り詰めます) |
| MEMORY.md | 読み込みは先頭 200 行または 25 KB までです(Claude Code のメモリドキュメント) |
| AGENTS.md | Codex が読み込む AGENTS.md ファイル全体で合計 32 KiB までです。ルートから読み込みます(project_doc_max_bytes) |
| Cursor ルール | 500 行未満 |
| Windsurf ルール | ワークスペースのルールファイルごとに 12,000 文字(global_rules.md は 6,000 文字) |
プライバシー
- サーバーと CLI はネットワーク接続を行わず、ネットワーク関連のコードもありません。何も収集せず、何も送信しません。
- ファイルの書き込み、名前変更、削除は一切行わず、一時ファイルも作成しません。修正は差分として返され、適用するかどうかはあなた、またはアシスタントが決めます。
- デフォルトでは、Markdown のステアリングファイル、
.asitisrc.json、および相対リンクが見つからない場合に限りルートの.gitmodules(チェックアウトされていないサブモジュールと壊れたリンクを区別するため)のみを読み込みます。スキルスクリプトはinclude: ["skills"](または--include skills)を渡した場合にのみ読み込みます。.claude/settings.json、.mcp.json、.cursor/mcp.json、.vscode/mcp.json、.gemini/settings.jsonはinclude: ["config"]を指定した場合にのみ読み込みます。この指定では、プロジェクト独自の MCP サーバーとインストールスクリプトを認識できるよう、ルートのpackage.jsonとpyproject.tomlのname、homepage、repositoryも読み込みます。.claude/settings.local.jsonの読み込みにはconfig-localが必要です。~/.claude.jsonは読み込みません。設定ファイルの値をそのまま出力することはありません。検出結果ではキー名を示し、秘密情報のような値はすべて伏せられます。 - 起動時にバージョンとルートフォルダーを含む 1 行を stderr に記録します。ファイルの内容は記録しません。
- 結果をアシスタントがどう扱うかは、アシスタント次第です。 ツールの結果はモデルのコンテキストに入り、アシスタントが使用する AI プロバイダーに届きます。それはアシスタントのネットワーク通信であり、こちらの通信ではありません。
セキュリティモデル
- ルートの制限。 すべてのパスは
realpathで解決され、起動時に指定されたルート内にとどまる必要があります。../による移動、ルート外の絶対パス、ルート外を指すシンボリックリンク(ファイルまたはフォルダー)は拒否されます。ルート内を指すシンボリックリンクはたどられるため、エージェントが参照する場所で、AGENTS.md へのリンクを含む CLAUDE.md や、リンク先の.claude/skillsフォルダーもチェックされます。ファイルシステムのルートとホームフォルダーは、--allow-broad-rootを指定しない限り、ルートとして拒否されます。 - オプトインしない限り、Markdown のみ。 デフォルトでは、
.md、.mdc、.markdown、.mdx、.cursorrules、.windsurfrules、.clinerulesと、.asitisrc.json(最大 64 KB)のみが読み込まれます。include: ["skills"]を指定すると、スキルフォルダー内のスクリプトが追加されます(各ファイル最大 1 MB。それ以外のファイルは、バイナリを検出するために先頭の 4 バイトのみ読み込まれます)。include: ["config"]を指定すると、Privacy に記載されたエージェント設定ファイルと MCP 設定ファイルが追加されます。.env*、.git/またはnode_modules/内のすべてのファイル、~/.claude.json、その他すべてのファイルは、対象を指すシンボリックリンク経由の場合も含め、常に拒否されます。リポジトリの.asitisrc.jsonで MCP サーバーのこれらのスキャンを有効にすることはできません。有効化できるのは呼び出しまたは CLI フラグのみです。他のファイルを参照する@importsは、サイズのみが集計され、読み込まれることはありません。読み込まれた内容が実行されることはありません。 - 処理の上限。 16 MB を超えるファイルは拒否され(
--max-file-mb)、結果には上限が設けられ、各ツール呼び出しの制限時間は 20 秒で、すべてのスキャナーは線形時間で処理します。テストスイートでは、コメントの閉じ忘れ、括弧やバッククォートの大量連続、2,000 文字のインポートトークン、不正な UTF-8 などを含む、敵対的な 10 MB の入力 32 件を、すべてのツールに対して呼び出しごとに 3 秒の制限時間で実行します。 - 信頼できないコンテンツ。
read_markdownはファイルの内容を指示ではなくデータとして扱い、隠れた指示や不可視文字を事前に報告します。これによって、モデルが読み取ったテキストに従ってしまうことを防ぐわけではありません。テキストを可視化します。 - より強固なサンドボックス(任意)。 Node の権限モデルを使ってサーバーを実行すると、ランタイム自体が書き込みと子プロセスを禁止します(Node 25 以降ではネットワークアクセスも禁止します)。Install の Hardened setup で設定方法を説明しています。Claude Code プラグインでは、デフォルトでこの設定が適用されます。
既知の制限
- トークン数はローカルでの概算(英語では約 4 文字で 1 トークン)であり、ベンダーのトークナイザーによる数値ではありません。
- ルート内にある、別の場所のファイルへのハードリンクは、他のファイルと同様に読み込まれます(読み取りのみ)。
- チェック後、ファイルを開く前に親フォルダー内のシンボリックリンクが差し替えられる可能性はわずかにあります。最後のパス要素は
O_NOFOLLOWで開き、inode で確認します。 - Windows では、ジャンクション、大文字小文字を区別しないパス、8.3 短縮名、
\\?\および\\.\デバイスプレフィックス、UNC パス、末尾のピリオドや空白は、実際のパスに基づいて判定され、テストされています。代替データストリーム(notes.md:stream)と予約済みデバイス名(CON、NUL.md)は無条件に拒否されます。
オプション
asitis-mcp --root <folder> [--root <folder>...] [options]
--root <folder> Folder the server may read (repeatable). Default: the current folder.
--footer Add one line linking to asitis.app to the first result of the session. Off by default.
--structured Also return each result as JSON (structuredContent), for scripts. Off by default.
--max-file-mb <n> Largest file to analyse, in MB (default 16, max 64).
--allow-broad-root Allow your home folder or the filesystem root as the root.
--version Print the version.
--help Print this help.
ASITIS_MCP_ROOT(フォルダーは : で区切り、Windows では ;)、ASITIS_MCP_FOOTER=1、ASITIS_MCP_STRUCTURED=1 は環境変数として使用できます。プロジェクト外にあるメモリフォルダーを指定する場合は、2 つ目の --root を追加します。例:~/.claude/projects/<project>/memory。
入力に誤りがある場合は、1 行のメッセージを表示してコード 2 で終了します。例:
asitis-mcp: Root folder not found: /x. Pass an existing folder with --root.
パッケージ
パッケージは、サーバーの dist/asitis-mcp.mjs と CLI の dist/asitis.mjs の 2 つのファイルで構成されます(esbuild でビルド、minify 済み)。ランタイム依存関係はゼロで、インストールスクリプトもありません。MCP SDK(1.31.0 に固定)、zod、yaml はバンドルされています。各ライセンスは dist/THIRD_PARTY_NOTICES.md に記載されています。このリポジトリのリリースワークフロー(.github/workflows/release.yml)は npm provenance 付きで公開するため、公開されたバージョンには npmjs.com 上で provenance attestation が表示され、npm audit signatures で検証できます。0.2.4 以前のバージョンは、provenance なしで手動公開されました。
ライセンス
MITです。変更内容は変更履歴に記載されています。脆弱性はGitHubのセキュリティアドバイザリから非公開で報告してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。