Skip to main content
Glama

🛠️ DevTools MCP サーバー

軽量な Model Context Protocol (MCP) サーバーで、MCP 互換の LLM クライアント(Claude Desktop、Claude Code、Cursor など)に開発者向けツールボックスを提供します。Web スクレイピング、ログ検査、ライブ Web 検索、SQLite または Postgres/Supabase に対する読み取り専用 SQL クエリを、すべて 1 つのサーバーで実現します。

MCP Python Tests License

🔗 ライブプレイグラウンド: Glama MCP Link — リスト掲載後、ブラウザで直接ツールを試せます(デプロイ を参照)。


📖 概要

DevTools MCP は MCP 上で 4 つのツールを公開し、LLM アシスタントが以下を実行できるようにします。

  • 任意の Web ページからクリーンで読みやすいテキストを取得

  • ローカルのログファイルを末尾から読み、エラーをデバッグ

  • コードを書く前に最新のドキュメントをライブ Web 検索

  • ローカルの SQLite ファイル または ライブの Postgres/Supabase データベースに対して読み取り専用の SELECT クエリを実行

すべてのツールはプレーンでテスト可能な Python 関数です。有料 API に依存するものは、あなた自身の任意の Supabase プロジェクト以外にはありません。


Related MCP server: MCP Server Toolkit

✨ 機能

ツール

説明

🌐 fetch_markdown(url)

Web ページを取得し、script/style/nav/footer を除去して、クリーンなテキストを返します(8,000 文字に制限)。

📄 read_log(file_path, lines)

ローカルファイルの最後の N 行を読み取ります — 最近のスタックトレースやエラー出力を表示します。

🔍 search_web(query, max_results)

DuckDuckGo(ddgs、API キー不要)でライブ Web を検索し、最新のドキュメントや解決策を取得します。

🗄️ query_database(db_path_or_url, sql_query, limit)

ローカルの SQLite ファイルまたは Postgres/Supabase 接続文字列に対して 読み取り専用 の SELECT を実行し、limit 行に制限します。


🏗️ アーキテクチャ

┌──────────────────────┐
│    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_REPO

2. 仮想環境を作成し、依存関係をインストール

python -m venv venv
source venv/bin/activate   # On Windows: venv\Scripts\activate

pip install -r requirements.txt

3. 環境変数の設定(任意)

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 を参照してください。


🔐 環境変数

変数

必須

使用箇所

SUPABASE_DB_URL(または任意の Postgres URL)

❌ 任意

自動的には読み取られません。query_database は接続文字列を直接引数として受け取ります。.env 内での個人的な参照/利便性にのみ役立ちます。

query_database は資格情報に関して意図的にステートレスです。ツール自体は環境変数から何も読み取らないため、デフォルトではデータベース資格情報がサーバー側に保存されることはありません。


🗺️ ロードマップ

  • 使い捨ての Postgres/Supabase インスタンスに対する実際の統合テストを追加(CI のみ、資格情報はコミットしない)

  • 部分文字列ベースの SQL キーワードチェックを適切な SQL パーサー(例: sqlparse)に置き換え、偽陽性を排除

  • search_web と fetch_markdown にキャッシュを追加

  • ホスト型 Smithery デプロイ用の認証レイヤーを追加


🤝 貢献

貢献、問題報告、機能リクエストは歓迎します。PR や issue を自由に開いてください。


📄 ライセンス

このプロジェクトは MIT ライセンス の下でライセンスされています。

Related MCP Connectors

Related MCP Servers