自然言語でテストケースを管理するためにZephyr のMCPサーバーを作ってみた
こんにちは。ダイの大冒険エンジョイ勢のbun913と申します。
最近ではすっかりMCPサーバーが注目を集めていますよね。
私も以前TestRailというテストマネジメントツールを自然言語で操作するためのMCPサーバーを作っていました。
最近では事情があり、ZephyrというJIRAのプラグインとして提供されているテストマネジメントサービス用のデータ移行ツールやAPIクライアントを作成しています。
Zephyr(Scale)に関しても、すでにMCPサーバーを自作されている方が見受けられたのですが、いくつか気になる点があったので自分で作成して公開していたZephyrのAPIクライアントを利用してMCPサーバーを作ってみました。
成果物
NPMパッケージとして以下のように公開しています。
ソースコードはこちらです。
早速デモ
まず以下のように、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サーバーがあったので、そちらを利用するようにしています。これにより、チケットに書いてある仕様や要求などを読み込んだ上で、テストケースを作成させたりできます。
ディレクトリ操作・テストケース作成
以下のようなやり取りでディレクトリを作ったり、ディレクトリの配下にテストケースを作成できます。
> では 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)

詳細なテストステップの作成・更新
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

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

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クライアントをあちこちで管理しないですむように、以下のように自作していたクライアントを使っています。
これにより、このリポジトリではほぼこのクライアントツールをラップする形で色々な機能を短い時間で実装しました。(クライアントをほぼそのままラップするMCPの是非はあると思いますが・・・)
想定される使用例
テスト技術者であれば、「何をテストするか」をテスト分析というフェーズで決めて、「どのようにテストするか」ということをテスト設計というフェーズで決めることが多いと思います。
このMCPサーバーではAtlassianのMCPサーバーとの連携を想定していますが、他にもNotionやFigmaのMCPサーバーと連携することで、要求や仕様のドキュメントから漏れがないようにテストケースを作成することができます。
もちろんそれに関して人のレビューは必要になると思いますが、「どのようにテストするか」という手書きのステップをAIにほぼ任せたり、探索的なテストではなく「チェックに近いテスト」をあまり時間をかけずに準備できるのに使うと良いと思われます。
私も以前TestRailのMCPサーバーを作成した時には、同様のアプローチを取り入れており業務時間を大幅に削減していました。
まとめ
- Zephyr(Scale)というテスト管理ツールとの連携を実現するためのMCPサーバーを自作しました
- テストケースを作成する時間を削減したり、Notionなど他のMCPサーバーと連携して仕様からのテストの読み込みをすることで、「チェック」の観点が強いテストケースを半自動で作成できると考えています
以上、最後までお読みいただきありがとうございました。
Discussion