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: FireScrape MCP Server
✨ 機能
ツール | 説明 |
🌐 | 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 installed
Maintenance
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables web search through DuckDuckGo and webpage content fetching with intelligent text extraction. Features built-in rate limiting and LLM-optimized result formatting for seamless integration with language models.2MIT
- Alicense-qualityDmaintenanceEnables AI models to search the web using DuckDuckGo, scrape webpage content in markdown format, and browse/read local files for code analysis and debugging.191MIT
- AlicenseAqualityDmaintenanceProvides web access capabilities for LLMs including search, fetching, content extraction, PDF reading, image viewing, and screenshots.346MIT
- Flicense-qualityCmaintenanceEnables AI agents to search the web via DuckDuckGo and fetch relevant webpage content using an LLM, without requiring an API key.
Related MCP Connectors
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
Give your agent live data from Twitter, Reddit, the web and GitHub. No API keys, no scraping stack.
Read a URL as clean markdown, screenshot a website, url to PDF. Web access for agents, no signup.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/notayannn/devtools-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server