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

# はじめに
Model Context Protocol（MCP）を利用して、CursorのチャットからNewRelicのトランザクション情報を取得してみました。
Python＋FastMCP+GraphQLで試してみました。

# 作業手順
まずは環境構築をします。

※Python3.x.xをインストール済なことが前提です。
　以下の手順で確認し、未インストールだった場合はインストールしてください。
```sh
# Pythonバージョン確認（Python 3.x.x ならOK）
python --version
```


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

仮想環境を構築し、有効化する。
```sh
# 仮想環境の作成
python3 -m venv venv
# 仮想環境の有効化
source venv/bin/activate
```

必要ライブラリをインストールする。
```sh
# ライブラリのインストール
pip install "mcp[cli]" gql requests requests-toolbelt
```

newrelicディレクトリ直下に newrelic_mcp.py を作成する。
```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508112/75fc9e70-8b03-4f96-9fa0-5ec1a3c29210.png)

Cursor Settingsの「MCP」を押下する。
![スクリーンショット 2025-05-21 22.51.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508112/fc2441f8-9725-4a78-88b6-2a72d8075ceb.png)

「Add new global MCP server」を押下する。
![スクリーンショット 2025-05-21 22.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508112/b3379cc0-c58d-46ab-bf36-f94940f59292.png)

mcp.jsonを以下のとおり修正する。
```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508112/27ae7ba8-100b-48b0-8fb9-6e9505969fd4.png)

あとはチャットで聞くだけです。
![スクリーンショット 2025-05-21 22.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508112/07457fc2-e058-40e8-a0ee-f2e37a639eff.png)

実際のNewRelic上の表示はこんな感じ。それっぽいですね。
![スクリーンショット 2025-05-21 22.03.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508112/179307d0-99d3-4112-b35d-40663dd63e96.png)

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

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