LayerX でスタッフソフトウェアエンジニアをしている @izumin5210 です。バクラク事業部の Platform Engineering 部 Enabling チームでいろいろしています。
新しいおもちゃを作ったので自慢させてください。
3行まとめ
- 任意のシェルスクリプトを MCP tool にできる any-script-mcp という MCP server を作ったよ
- 例えば「o3-search-mcp の gpt-5 を使うバージョン」などを、 YAML にちょっとしたコードを書くだけで作れるよ
- ほかにもおもしろい活用方法見つけたら教えてね
Claude Code を使った日々のソフトウェア開発で、o3-search-mcp をめちゃめちゃ活用しています。
Claude Code がわからないことがあれば自律的に o3 model に調査を委譲し、Web に潜って解決策を見つけてくれるのは本当に便利です。
そんな中、OpenAI から GPT-5 がリリースされました。当然「o3-search を GPT-5 でも試してみたい」と思うわけです。
最も単純には、Model やパラメタが違う tool が欲しくなるたびに追加で実装することになるでしょう。 o3-search-mcp のような MCP サーバーは、コード中に特定のモデル(この場合 o3)や system prompt を埋め込むかたちで実装されることが多いです。
この実装自体は OpenAI の SDK や Vercel AI SDK を利用できるため比較的シンプルになります。
しかし、これをモデルが出るたびに誰かが実装して npm publish
していくのはまあまあ大変です。 また、そうして生まれていくたくさんの MCP server が全て継続メンテされていくとは限りません。
別の実現方法として、ちょっと汎用的に作った MCP tool のパラメタに model や system prompt を引数で渡すパターンもあります。
しかし、AI エージェントに「どのモデルを使うか」を判断させるのも、AI に本質的でないことを考えさせている、コンテキストのノイズになる可能性もあります。
例えば OpenAI Codex CLI は MCP server として動かすこともできますが、その input は複雑であり、AI が適切な値を設定する難易度は高いです。
Codex MCP の codex
ツールの詳細情報。 これを AI Agent に埋めてもらうのは難しい。 Web 検索してほしいのに sandbox を指定してネットワークアクセスできなくなったりする。
アイディア: GitHub Actions のように、任意のスクリプトとその引数を yaml 記述させる
ここで GitHub Actions を思い出してみましょう。GitHub Actions では、ワークフローの中で任意のシェルスクリプトを記述できます:
steps:
- name: Run custom script
run: |
echo "Hello, World!"
npm test
また、GitHub Actions の custom action では引数を取ることもでき、これは yaml で引数のスキーマを定義できます。
name: 'hello'
description: 'Say hello with a custom message'
inputs:
message:
description: 'The greeting message'
required: true
runs:
using: "composite"
steps:
- name: Echo message
run: echo "Hello! Your message: ${{ inputs.message }}"
shell: bash
これを MCP tool の定義でも活用できないかというのを思いついたので、実際に作ってみました。
any-script-mcp は、任意のシェルスクリプトや CLI コマンドを MCP tool として公開できる MCP サーバーです。GitHub Actions の custom action のように、YAML ファイルで tool を定義できます。
基本的な考え方はシンプルです:
- YAML で tool の名前、説明、入力パラメータを定義
- 実行したいスクリプトを
run
フィールドに記述 - 入力は環境変数として自動的にスクリプトに渡される
Installation
any-script-mcp はよくある MCP と同じく、以下のようなコマンドで Claude Code に登録できます。
$ claude mcp add any-script \
-s user \
-- npx any-script-mcp
あるいはお使いのツールに合わせて mcp.json
的なファイルに記述してください。
{
"mcpServers": {
"any-script": {
"command": "npx",
"args": ["any-script-mcp"]
}
}
}
Tool の定義
デフォルトでは $XDG_CONFIG_HOME/any-script-mcp/config.yaml
に設定ファイルを配置します。最小限の設定例は以下のようになります:
tools:
- name: hello
description: Say hello with a custom message
inputs:
message:
type: string
description: The greeting message
required: true
run: |
echo "Hello! Your message: $INPUTS__MESSAGE"
この設定により、AI エージェントは hello
という tool を呼び出せるようになります。message
パラメータは環境変数 $INPUTS__MESSAGE
として渡されます。
Claude Code の /mcp
で登録した MCP tool の詳細を確認している様子
実践例: GPT-5 検索ツールの実装
冒頭で触れた課題「GPT-5 版の検索ツールが欲しい」を、any-script-mcp で解決してみましょう。
tools:
- name: gpt5-search
description: |
AI agent with web search for researching latest information,
troubleshooting program errors, discussing complex problems
and design decisions, exploring advanced library usage,
and investigating upgrade paths.
Supports natural language queries.
inputs:
prompt:
type: string
description: What you want to search, analyze, or discuss with the AI agent
required: true
run: |
codex exec \
--model gpt-5 \
--sandbox workspace-write \
--config "sandbox_workspace_write.network_access=true" \
"$INPUTS__PROMPT" \
--json \
| jq -sr 'map(select(.msg.type == "agent_message") | .msg.message) | last'
(description は o3-search-mcp を参考にさせてもらってます! 重ね重ねありがとうございます!)
この設定により、Claude Code から gpt5-search
tool が使えるようになります。o3-search-mcp と同様に、Web 検索が必要なタスクを GPT-5 に委譲できます。
Claude Code が gpt5-search tool に挨拶している様子
(余談: 今回の例は system prompt を与えてない簡易なものになってます。 目的に合わせてちゃんと設定するほうがいいでしょう。)
このように、MCP サーバーを新たに実装することなく、柔軟に MCP Tool を追加できるようになります。
Tool 定義自体が柔軟になることで Tool の input も最小の表現に絞り込めるため、AI からしても使いやすい Tool を定義することができます。
柔軟な Tool 追加の用例
any-script-mcp は小さい設定ファイルでいろんなツールを柔軟に追加できます。先程の o3-search-mcp の model 違いは一例ですが、ほかにも system prompt を変えて別の用途に
特化させたツールを作ることもできるかもしれません。例えば、「設計相談や技術選定にかかる調査に特化させたプロンプトを与えた gpt5-architect」などです。
他の例としては、ちょっと複雑な定型処理を AI agent が呼び出せるように MCP tool にするというのもあるかもしれません。例えば以下のようなツールを定義しておくと、AI Agent が必要に応じて OSS の CHANGELOG を見つけてくれます。
tools:
- name: get-changelog-from-github-releases
description: Fetch and format changelog from GitHub releases
inputs:
owner:
type: string
description: Repository owner (e.g., 'vercel')
repo:
type: string
description: Repository name (e.g., 'next.js')
run: |
gh api graphql \
-F owner="vercel" -F name="next.js" \
-f query='
query($owner: String!, $name: String!) {
repository(owner: $owner, name: $name) {
releases(first: 50, orderBy: {field: CREATED_AT, direction: DESC}) {
pageInfo { hasNextPage endCursor }
nodes {
name
tagName
isPrerelease
description
}
}
}
}
' \
--jq '
.data.repository.releases.nodes[]
| select(.isPrerelease | not) |
"##" + .name + "\n\n" + .description + "\n"
'
any-script-mcp で実装した get-changelog-from-github-releases を Claude Code が利用する様子
まとめ
any-script-mcp を利用することで、新たな MCP サーバーの導入あるいは開発なしに独自の MCP tool を追加できるようになります。
複雑なものは独自でサーバを実装したほうがいい場合ももちろんあるでしょう。一方で、別の AI ツールをモデル違い・プロンプト違いで呼び出したいときや、CHANGELOG 取得のような定型化しやすい複雑な処理を Agent に自律的に利用してほしいケースなどでは便利に活用できるのではないでしょうか。
このツール自体は思いつきから Vibe coding で作ったばかりなので、まだ思いついてない便利な用途があるかもしれません。 ぜひいろいろ試していただき、便利な使い方が見つかったら教えてもらえると嬉しいです!
Views: 0