🛵

自然言語でテストケースを管理するためにZephyr のMCPサーバーを作ってみた

に公開

こんにちは。ダイの大冒険エンジョイ勢のbun913と申します。

最近ではすっかりMCPサーバーが注目を集めていますよね。

私も以前TestRailというテストマネジメントツールを自然言語で操作するためのMCPサーバーを作っていました。

https://zenn.dev/moneyforward/articles/6c439bab3cb0f4

最近では事情があり、ZephyrというJIRAのプラグインとして提供されているテストマネジメントサービス用のデータ移行ツールやAPIクライアントを作成しています。

Zephyr(Scale)に関しても、すでにMCPサーバーを自作されている方が見受けられたのですが、いくつか気になる点があったので自分で作成して公開していたZephyrのAPIクライアントを利用してMCPサーバーを作ってみました。

成果物

NPMパッケージとして以下のように公開しています。

https://www.npmjs.com/package/mcp-zephyr-scale

ソースコードはこちらです。

https://github.com/bun913/mcp-zephyr-scale

早速デモ

まず以下のように、MCPサーバーの設定を行います。

{
  "mcpServers": {
    "zephyr-scale": {
      "command": "npx",
      "args": ["-y", "mcp-zephyr-scale"],
      "env": {
        "ZEPHYR_API_TOKEN": "your-api-token-here",
        "JIRA_PROJECT_KEY": "YOUR_PROJECT"
      }
    },
    "atlassian": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.atlassian.com/v1/sse"]
    }
  }
}

最初に申し上げたとおり、Zephyr(Scale)はJIRAのプラグインとして公開されているため、JIRAのチケットに対してテストケースを追加したり、そのチケットに対するテスト実行を記録したりできます。

それら機能については、すでに公式のリモートMCPサーバーがあったので、そちらを利用するようにしています。これにより、チケットに書いてある仕様や要求などを読み込んだ上で、テストケースを作成させたりできます。

https://www.atlassian.com/ja/blog/remote-mcp-server

ディレクトリ操作・テストケース作成

以下のようなやり取りでディレクトリを作ったり、ディレクトリの配下にテストケースを作成できます。

> では API Tests を包括するディレクトリを作りたいので作成して。

⏺ 了解です!npmパッケージ版が正しく動作しているか確認するため、フォルダを作成してみます。

⏺ zephyr-scale - createFolder (MCP)(projectKey: "SAM", name: "認証API テストケース", folderType: "TEST_CASE")
  ⎿  {                                                                                                                                          
       "message": "Folder created successfully",
       "folder": {
         "id": 11111,
         "self": "https://api.zephyrscale.smartbear.com/v2/folders/11111"
       }
     }

特定のディレクトリ配下にテストケースを作成できます。

> じゃあ API テストケースっぽいテストケースを追加してよ。\
ユーザーのログインのテストを API テストケースのディレクトリの下に。\
ディレクトリがわからなかったら取得してみて 

⏺ 了解です!まず、TEST_CASEフォルダを取得して、先ほど作った「認証API テストケース」フォルダのIDを確認します。

⏺ zephyr-scale - listFolders (MCP)(projectKey: "SAM", folderType: "TEST_CASE")
  ⎿  {                                                                                                                                          
       "message": "Folders retrieved successfully",
       "folders": {
     … +86 lines (ctrl+o to expand)

⏺ わかりました!「認証API テストケース」フォルダ(ID: 11111)の下にユーザーログインのテストケースを作成します。

⏺ zephyr-scale - createTestCase (MCP)(projectKey: "SAM", name: "ユーザーログインAPI - 正常系テスト", objective: "POST /api/v1/auth/login
                                     エンドポイントで、有効な認証情報を使用したログインが成功することを検証する", precondition: "-
                                     テストユーザー(username: testuser)がDBに登録済み<br>- APIサーバーが起動していること<br>-
                                     データベース接続が正常であること", priorityName: "High", statusName: "Draft", folderId: 11111, customFields:
                                     {"security_score":10})
  ⎿  {                                                                                                                                          
       "message": "Test case created successfully",
       "testCase": {
     … +5 lines (ctrl+o to expand)

demo_testcase

詳細なテストステップの作成・更新

Zephyrでは一つのテストケースに対して、詳細なテストのステップを設定できます。

テストステップの追加(上書き)も自然言語で行えます。

⏺ 良いですね!SAM-T13が作成できました。次に、OVERWRITEモードでテストステップを追加します。

⏺ zephyr-scale - createTestCaseTestSteps (MCP)(testCaseKey: "SAM-T13", mode: "OVERWRITE", items: [{"inline":{"description":"POST
                                              /api/v1/auth/loginに有効な認証情報を送信","testData":"{\"username\": \"testuser\", \"password\":
                                              \"Password123!\"}","expectedResult":"HTTPステータスコード200が返される"}},{"inline":{"description":"レ
                                              スポンスボディにtokenフィールドが含まれることを確認","expectedResult":"tokenフィールドが存在し、文字列
                                              形式である"}},{"inline":{"description":"レスポンスボディにexpiresInフィールドが含まれることを確認","exp
                                              ectedResult":"expiresInフィールドが3600である"}},{"inline":{"description":"レスポンスボディにuserオブジ
                                              ェクトが含まれることを確認","expectedResult":"user.id, user.username, user.emailが正しく設定されている"
                                              }},{"inline":{"description":"取得したtokenを使用して保護されたAPIを呼び出す","testData":"Authorization:
                                               Bearer {token}","expectedResult":"認証が成功し、保護されたリソースにアクセスできる"}}])
  ⎿  {                                                                                                                                          
       "message": "Test steps created successfully",
       "result": {
     … +4 lines (ctrl+o to expand)

⏺ 完璧です!「認証API テストケース」フォルダの下にユーザーログインのテストケースを作成しました。

  作成したテストケース: SAM-T13
  - 名前: ユーザーログインAPI - 正常系テスト
  - フォルダ: 認証API テストケース (ID: 1111111)
  - Priority: High
  - Security Score: 10

demo_test_steps

JIRAのチケット(イシュー)との関連付け

他にも詳細なことはツールのドキュメントをご参照いただきたいですが、以下のようにJIRAのイシューとの関連付けまで行ってくれます。

demo_link

Zephyrにはテストケースやテストプランにカスタムのフィールドを設定できますが、それらの値を更新・作成することにも対応しています。

今回自作した理由・実装のポイント

MCP Zephyr というように検索することでいくつかツールが見つかるのですが、それらには以下のように気になる点が見つかりました。

  • 最初に作って更新されていない
    • ライブラリの脆弱性更新などを含む
  • npm run build && node dist/index.js のようにローカルでビルドして利用すること前提であるため、ますます脆弱性更新をされないまま放置されてしまいそう
  • テストステップの更新・作成などにバグをかかえていて、うまく動かないところがありそう

これらの理由で、MCP Zephyr を自作することにしました。

実装のポイントは、とても素直に @modelcontextprotocol/sdk を利用しています。

/**
 * Central registry for all MCP tools
 */
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import type { ZephyrV2Client } from "zephyr-api-client";
import { registerTestCaseTools } from "./cases.js";
import { registerFolderTools } from "./folders.js";
import { registerTestPlanTools } from "./plans.js";
import { registerTestCycleTools } from "./cycles.js";
import { registerTestExecutionTools } from "./executions.js";
import { registerStatusTools } from "./statuses.js";
import { registerPriorityTools } from "./priorities.js";
import { registerEnvironmentTools } from "./environments.js";
import { registerLinkTools } from "./links.js";

/**
 * Register all Zephyr Scale MCP tools
 */
export function registerAllTools(
	server: McpServer,
	zephyrClient: ZephyrV2Client,
): void {
	// Register test case tools
	registerTestCaseTools(server, zephyrClient);

	// Register folder tools
	registerFolderTools(server, zephyrClient);

	// Register test plan tools
	registerTestPlanTools(server, zephyrClient);

	// Register test cycle tools
	registerTestCycleTools(server, zephyrClient);

	// Register test execution tools
	registerTestExecutionTools(server, zephyrClient);

	// Register status tools
	registerStatusTools(server, zephyrClient);

	// Register priority tools (read-only)
	registerPriorityTools(server, zephyrClient);

	// Register environment tools (read-only)
	registerEnvironmentTools(server, zephyrClient);

	// Register link tools
	registerLinkTools(server, zephyrClient);
}

また、APIクライアントをあちこちで管理しないですむように、以下のように自作していたクライアントを使っています。

https://zenn.dev/moneyforward/articles/e863832fa9ce5e

これにより、このリポジトリではほぼこのクライアントツールをラップする形で色々な機能を短い時間で実装しました。(クライアントをほぼそのままラップするMCPの是非はあると思いますが・・・)

想定される使用例

テスト技術者であれば、「何をテストするか」をテスト分析というフェーズで決めて、「どのようにテストするか」ということをテスト設計というフェーズで決めることが多いと思います。

このMCPサーバーではAtlassianのMCPサーバーとの連携を想定していますが、他にもNotionやFigmaのMCPサーバーと連携することで、要求や仕様のドキュメントから漏れがないようにテストケースを作成することができます。

もちろんそれに関して人のレビューは必要になると思いますが、「どのようにテストするか」という手書きのステップをAIにほぼ任せたり、探索的なテストではなく「チェックに近いテスト」をあまり時間をかけずに準備できるのに使うと良いと思われます。

私も以前TestRailのMCPサーバーを作成した時には、同様のアプローチを取り入れており業務時間を大幅に削減していました。

まとめ

  • Zephyr(Scale)というテスト管理ツールとの連携を実現するためのMCPサーバーを自作しました
  • テストケースを作成する時間を削減したり、Notionなど他のMCPサーバーと連携して仕様からのテストの読み込みをすることで、「チェック」の観点が強いテストケースを半自動で作成できると考えています

以上、最後までお読みいただきありがとうございました。

GitHubで編集を提案
Money Forward Developers

Discussion