0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NewRelic MCPを自作してCursorで動かしてみた

Last updated at Posted at 2025-05-29

はじめに

Model Context Protocol(MCP)を利用して、CursorのチャットからNewRelicのトランザクション情報を取得してみました。
Python+FastMCP+GraphQLで試してみました。

作業手順

まずは環境構築をします。

※Python3.x.xをインストール済なことが前提です。
 以下の手順で確認し、未インストールだった場合はインストールしてください。

# Pythonバージョン確認(Python 3.x.x ならOK)
python --version

作業ディレクトリを作成する。

# 作業ディレクトリを作成し、移動する。
mkdir newrelic
cd newrelic

仮想環境を構築し、有効化する。

# 仮想環境の作成
python3 -m venv venv
# 仮想環境の有効化
source venv/bin/activate

必要ライブラリをインストールする。

# ライブラリのインストール
pip install "mcp[cli]" gql requests requests-toolbelt

newrelicディレクトリ直下に newrelic_mcp.py を作成する。

newrelic_mcp.py
import os
import json
from gql import gql, Client
from gql.transport.requests import RequestsHTTPTransport
from mcp.server.fastmcp import FastMCP

# MCPサーバー初期化
mcp = FastMCP("newrelic")

# New Relic設定
NR_URL = "https://api.newrelic.com/graphql"
API_KEY = os.getenv("NEW_RELIC_API_KEY")
ACCOUNT_ID = os.getenv("NEW_RELIC_ACCOUNT_ID")

# gql クライアント設定
transport = RequestsHTTPTransport(
    url=NR_URL,
    headers={
        "API-Key": API_KEY,
        "Content-Type": "application/json",
    },
    verify=True,
    retries=3,
)
gql_client = Client(transport=transport, fetch_schema_from_transport=True)

@mcp.tool()
async def fetch_newrelic_logs(query: str):
    try:
        # GraphQLクエリ生成
        graphql_query = gql(f"""
        {{
          actor {{
            account(id: {ACCOUNT_ID}) {{
              nrql(query: "{query}") {{
                results
              }}
            }}
          }}
        }}
        """)
        # 実行
        result = gql_client.execute(graphql_query)
        items = result["actor"]["account"]["nrql"]["results"]
        # 整形
        if not items:
            return "No results"
        return json.dumps(items, indent=2, ensure_ascii=False)

    except Exception as e:
        return f"Error querying logs: {e}"

if __name__ == "__main__":
    mcp.run()

MCPを全く勉強できていないのですが、
関数を@mcp.tool()でツール登録すると、LLMが使ってくれるという感じですかね。
動きとしては、NRQLでNewRelicから取得したデータをJSON形式でLLMに返しています。

あとは、Cursor側も設定していきます。

Cursor > Preferences > Cursor Settingsに遷移する。
スクリーンショット 2025-05-21 22.09.10.png

Cursor Settingsの「MCP」を押下する。
スクリーンショット 2025-05-21 22.51.04.png

「Add new global MCP server」を押下する。
スクリーンショット 2025-05-21 22.10.14.png

mcp.jsonを以下のとおり修正する。

mcp.json
{
  "mcpServers": {
    "newrelic": {
      "command": "python3",
      "args": ["<「newrelic_mcp.py」のフルパス>"],
      "env": {
        "NEW_RELIC_API_KEY": "<NewRelicのAPIキー(NR・・・)>",
        "NEW_RELIC_ACCOUNT_ID": "<NewRelicのアカウントID>"
      }
    }
  }
}

正しく登録されると、MCP Serversに追加され、一覧のインジケータが緑色になります。
スクリーンショット 2025-05-29 10.21.25.png

あとはチャットで聞くだけです。
スクリーンショット 2025-05-21 22.02.54.png

実際のNewRelic上の表示はこんな感じ。それっぽいですね。
スクリーンショット 2025-05-21 22.03.12.png

おわりに

今回はCursorからMCP経由でNewRelicへ情報取得しましたが、
LLMとMCPを共にクラウド上にあげてやってみたいですね。

アラートが発生したらそれを契機にLLM→MCP→NewRelicと動いて情報取得し、
必要に応じて勝手にリカバリとかやって欲しいです。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?