DevTools MCP Server
🛠️ DevTools MCP サーバー
軽量な Model Context Protocol (MCP) サーバーで、MCP 互換の LLM クライアント(Claude Desktop、Claude Code、Cursor など)に開発者向けツールボックスを提供します。Web スクレイピング、ログ検査、ライブ Web 検索、SQLite または Postgres/Supabase に対する読み取り専用 SQL クエリを、すべて 1 つのサーバーで実現します。
🔗 ライブプレイグラウンド: Glama MCP Link — リスト掲載後、ブラウザで直接ツールを試せます(デプロイ を参照)。
📖 概要
DevTools MCP は MCP 上で 4 つのツールを公開し、LLM アシスタントが以下を実行できるようにします。
任意の Web ページからクリーンで読みやすいテキストを取得
ローカルのログファイルを末尾から読み、エラーをデバッグ
コードを書く前に最新のドキュメントをライブ Web 検索
ローカルの SQLite ファイル または ライブの Postgres/Supabase データベースに対して読み取り専用の
SELECTクエリを実行
すべてのツールはプレーンでテスト可能な Python 関数です。有料 API に依存するものは、あなた自身の任意の Supabase プロジェクト以外にはありません。
Related MCP server: MCP Server Toolkit
✨ 機能
ツール | 説明 |
🌐 | Web ページを取得し、 |
📄 | ローカルファイルの最後の N 行を読み取ります — 最近のスタックトレースやエラー出力を表示します。 |
🔍 | DuckDuckGo( |
🗄️ | ローカルの SQLite ファイルまたは Postgres/Supabase 接続文字列に対して 読み取り専用 の |
🏗️ アーキテクチャ
┌──────────────────────┐
│ MCP Client │ (Claude Desktop / Claude Code / Cursor / etc.)
└──────────┬────────────┘
│ MCP protocol (stdio)
┌──────────▼────────────┐
│ DevTools MCP Server │ FastMCP("DevTools") — server.py
│ │
│ ┌──────────────────┐ │
│ │ fetch_markdown │ │──▶ requests + BeautifulSoup ──▶ any URL
│ ├──────────────────┤ │
│ │ read_log │ │──▶ local filesystem
│ ├──────────────────┤ │
│ │ search_web │ │──▶ DDGS (DuckDuckGo, key-free)
│ ├──────────────────┤ │
│ │ query_database │ │──▶ _is_safe_select() (SQL safety gate)
│ │ │ │ │
│ │ │ │ ├──▶ _query_sqlite() ──▶ local .db file
│ │ │ │ └──▶ _query_postgres() ──▶ Postgres / Supabase
│ └──────────────────┘ │
└────────────────────────┘query_database がクエリの送信先を決定する方法
query_database(db_path_or_url, sql_query, limit)
│
▼
_is_safe_select(sql_query)?
│
┌────┴────┐
NO YES
│ │
reject does db_path_or_url start with
query "postgres://" or "postgresql://" ?
│
┌─────┴─────┐
YES NO
│ │
_query_postgres() _query_sqlite()_is_safe_select は、単一のプレーンな SELECT ステートメントのみを許可する厳格なゲートです。INSERT/UPDATE/DELETE/DROP/ALTER などは許可されず、; で連結されたスタッククエリも拒否されます。これは、SQL テキストが手入力ではなく LLM によって生成されるため重要です。このゲートにより、幻覚や操作されたクエリがデータを変更・破壊することを防ぎます。
スタック:
fastmcp— MCP サーバーフレームワーク。@mcp.toolで Python 関数を MCP ツールに変換requests+beautifulsoup4— Web スクレイピングddgs— キー不要のライブ Web 検索(旧duckduckgo-search)sqlite3— Python 組み込み。ローカルデータベースクエリに使用psycopg2— Postgres/Supabase クライアント。Postgres URL を使用する場合のみ遅延インポートpython-dotenv— ローカルの.env変数を読み込みpytest+pytest-mock— テストスイート
📂 プロジェクト構造
.
├── venv/ # Local virtual environment (not committed)
├── .env # Local secrets — real keys/paths, never committed
├── .gitignore
├── README.md
├── requirements.txt # Runtime + dev/test dependencies
├── server.py # Main MCP server — all 4 tools live here
├── test_server.py # Pytest suite covering all 4 tools
├── Dockerfile # Optional — only needed for Glama's hosted deployment
├── glama.json # Optional — repo attribution for Glama's listing
└── smithery.yaml # Optional — only relevant if also listing on Smithery🚀 はじめに
1. リポジトリをクローン
git clone https://github.com/YOUR_USERNAME/YOUR_REPO.git
cd YOUR_REPO2. 仮想環境を作成し、依存関係をインストール
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt3. 環境変数の設定(任意)
server.py は起動時に load_dotenv() を呼び出すため、ローカルの .env ファイル内の変数は自動的に読み込まれます。現在のツールで env 変数が 必須 のものはありません。query_database は接続情報を直接パラメータとして受け取ります。ただし、ローカルでの利便性のために .env を用意しても構いません。
# Only needed if you want a default connection string handy locally.
# Real credentials should live here and nowhere else.
SUPABASE_DB_URL=postgresql://postgres:your-password@db.xxxxxxxx.supabase.co:5432/postgres⚠️
.envファイルをコミットしないでください。 すでに.gitignoreで除外されています。注: これは Supabase プロジェクトの
SUPABASE_URL/SUPABASE_KEY(REST/JS クライアントで使用)とは異なります。query_databaseはpsycopg2を介して Postgres に直接接続するため、Supabase ダッシュボードの Settings → Database → Connection string にある Postgres 接続文字列 が必要です。API URL/キーのペアではありません。
4. サーバーをローカルで実行
python server.pyこれにより MCP サーバーが stdio 上で起動し、任意の MCP クライアントに接続できる状態になります。
🔌 Claude Desktop / Claude Code への接続
MCP クライアント設定(例: claude_desktop_config.json)にサーバーを追加します。
{
"mcpServers": {
"devtools": {
"command": "python",
"args": ["/absolute/path/to/server.py"]
}
}
}クライアントを再起動すると、4 つのツール(fetch_markdown、read_log、search_web、query_database)がアシスタントが呼び出せる関数として表示されます。
🧰 ツールリファレンス
fetch_markdown(url: str) -> str
Web ページを取得し、<script>、<style>、<nav>、<footer> タグを除去して、クリーンなプレーンテキストを返します(8,000 文字に制限)。
fetch_markdown("https://docs.python.org/3/library/asyncio.html")read_log(file_path: str, lines: int = 50) -> str
ローカルのテキスト/ログファイルの最後の lines 行を読み取ります。
read_log("/var/log/app/error.log", lines=100)search_web(query: str, max_results: int = 3) -> str
DuckDuckGo で指定されたクエリを検索し、各結果のタイトル、リンク、スニペットを返します。
search_web("fastapi background tasks example")query_database(db_path_or_url: str, sql_query: str, limit: int = 50) -> str
以下に対して 読み取り専用 の SELECT を実行します。
ローカルの SQLite ファイル(ファイルパスを渡す)、または
Postgres/Supabase データベース(
postgres://またはpostgresql://で始まる接続文字列を渡す)
結果は {column: value} 辞書のリストとして返され、limit 行に制限されます。
query_database("app.db", "SELECT * FROM users WHERE status = 'active'", limit=5)
query_database("postgresql://user:pass@host:5432/db", "SELECT id, email FROM users", limit=10)安全性の保証:
SELECTで始まるクエリのみ許可INSERT、UPDATE、DELETE、DROP、ALTER、TRUNCATE、GRANT、REVOKE、CREATE、ATTACHをどこかに含むクエリは拒否スタッククエリ(
SELECT ...; DROP TABLE ...)は拒否既知の制限: チェックは部分文字列一致であり、完全な SQL パーサーではありません。
SELECT * FROM updates_logのような無害なクエリも、updateという部分文字列を含むため拒否されます。これは意図的な「偽陽性を偽陰性より優先する」トレードオフです。
🧪 テスト
このプロジェクトには 4 つのツールすべてをカバーする 27 テストの pytest スイートが含まれており、モックされたネットワーク呼び出しと使い捨ての tmp_path フィクスチャを使用して完全にオフラインで実行されます。実際のファイル、データベース、Web サイトには一切触れません。
pip install -r requirements.txt
pytest test_server.py -vカバー内容:
_is_safe_select— 有効な SELECT、すべての禁止キーワード、スタッククエリ、既知の偽陽性動作を含む 10 以上のケースquery_database(SQLite)— 基本 SELECT、limit、WHEREフィルタリング、ブロックされた安全でないクエリ、ファイル欠落、テーブル欠落、空の結果セット、Postgres URL ルーティング(モック)read_log— 末尾読み取り動作、ファイル欠落、デフォルト行数fetch_markdown— HTML 除去とエラーハンドリング(ネットワークはモック)search_web— 結果フォーマット、空の結果、エラーハンドリング(ネットワークはモック)
_query_postgres自体は、このスイートではライブデータベースに対して実行されません。呼び出すかどうかを決定するルーティングロジックのみがテストされます。ライブでテストするには実際の Postgres/Supabase 接続文字列が必要ですが、これはテストファイルにハードコードしたり、リポジトリにコミットしたりしてはいけません。
🌐 デプロイ
オプション A — Glama(無料ディレクトリ掲載 + ブラウザインスペクタ)
このリポジトリの GitHub URL を glama.ai/mcp に送信してください。Glama はソースから直接ツールをインデックス化するため、ビルドやマニフェストは不要です。訪問者はブラウザ内インスペクタで fetch_markdown、read_log、search_web、query_database をローカルにインストールせずに試すことができます。
任意: glama.json(すでに含まれています)を追加して、掲載をあなたの GitHub アカウントに帰属させることができます。
オプション B — Glama ホスト型デプロイ(Glama が 24 時間 365 日実行)
Glama GitHub App をこのリポジトリに接続すると、含まれている Dockerfile が Glama のゲートウェイ(管理された TLS、認証、ロギング)の背後で実行中のインスタンスにビルドされます。このパスを選択する前に、現在のプラン詳細を glama.ai/mcp/hosting で確認してください。
オプション C — Smithery
⚠️ 2026 年初頭の時点で、Smithery は GitHub 経由の新しい 無料 ホスト型デプロイを受け付けなくなりました。現在は有料プランが必要です。Smithery での無料パスは、このサーバーを 外部サーバー として登録することです(つまり、自分でホストし(例: 上記の Glama ホスト型オプション)、Smithery の掲載をその URL にポイントするだけです)。smithery.yaml は、そのルートを選択する場合に備えてこのリポジトリに含まれています。ホスティングモデルは活発に変更されているため、現在の詳細は smithery.ai を参照してください。
🔐 環境変数
変数 | 必須 | 使用箇所 |
| ❌ 任意 | 自動的には読み取られません。 |
query_database は資格情報に関して意図的にステートレスです。ツール自体は環境変数から何も読み取らないため、デフォルトではデータベース資格情報がサーバー側に保存されることはありません。
🗺️ ロードマップ
使い捨ての Postgres/Supabase インスタンスに対する実際の統合テストを追加(CI のみ、資格情報はコミットしない)
部分文字列ベースの SQL キーワードチェックを適切な SQL パーサー(例:
sqlparse)に置き換え、偽陽性を排除search_webとfetch_markdownにキャッシュを追加ホスト型 Smithery デプロイ用の認証レイヤーを追加
🤝 貢献
貢献、問題報告、機能リクエストは歓迎します。PR や issue を自由に開いてください。
📄 ライセンス
このプロジェクトは MIT ライセンス の下でライセンスされています。
This server cannot be deployed
Maintenance
Related MCP Connectors
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
Web data for agents: YouTube transcripts, screenshots, Google News, WHOIS, jobs, tech stack, more.
Give your agent live data from Twitter, Reddit, the web and GitHub. No API keys, no scraping stack.
Web search and page-reading for AI agents. One-click OAuth connect, or a Caesar API key.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI models to search the web using DuckDuckGo, scrape webpage content in markdown format, and browse/read local files for code analysis and debugging.8 npm1MIT
- AlicenseAqualityCmaintenanceProvides filesystem, web search, SQLite, and system tools for AI assistants like Claude, enabling secure access to local resources and the web.6MIT
- AlicenseAqualityCmaintenanceEnables web search, scraping, and live package version lookup for local LLMs, with no API keys required.52MIT
- FlicenseAqualityCmaintenanceEnables a locally-run LLM to search the web, fetch pages as markdown, make arbitrary HTTP requests, and optionally render pages with headless Chromium.3-