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: FireScrape MCP Server

✨ 機能

ツール

説明

🌐 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_databasepsycopg2 を介して 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_markdownread_logsearch_webquery_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 で始まるクエリのみ許可

  • INSERTUPDATEDELETEDROPALTERTRUNCATEGRANTREVOKECREATEATTACH をどこかに含むクエリは拒否

  • スタッククエリ(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、limitWHERE フィルタリング、ブロックされた安全でないクエリ、ファイル欠落、テーブル欠落、空の結果セット、Postgres URL ルーティング(モック)

  • read_log — 末尾読み取り動作、ファイル欠落、デフォルト行数

  • fetch_markdown — HTML 除去とエラーハンドリング(ネットワークはモック)

  • search_web — 結果フォーマット、空の結果、エラーハンドリング(ネットワークはモック)

_query_postgres 自体は、このスイートではライブデータベースに対して実行されません。呼び出すかどうかを決定するルーティングロジックのみがテストされます。ライブでテストするには実際の Postgres/Supabase 接続文字列が必要ですが、これはテストファイルにハードコードしたり、リポジトリにコミットしたりしてはいけません。


🌐 デプロイ

オプション A — Glama(無料ディレクトリ掲載 + ブラウザインスペクタ)

このリポジトリの GitHub URL を glama.ai/mcp に送信してください。Glama はソースから直接ツールをインデックス化するため、ビルドやマニフェストは不要です。訪問者はブラウザ内インスペクタで fetch_markdownread_logsearch_webquery_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_webfetch_markdown にキャッシュを追加

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


🤝 貢献

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


📄 ライセンス

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

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Related MCP Servers

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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