backlog-readonly-mcp-blog 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.github/copilot-instructions.md +57 -0
  2. package/.github/settings.yml +49 -0
  3. package/.husky/pre-commit +1 -0
  4. package/.kiro/hooks/agent-completion-sound.kiro.hook +15 -0
  5. package/.kiro/hooks/markdown-lint-save.kiro.hook +19 -0
  6. package/.kiro/settings/locale.json +3 -0
  7. package/.kiro/settings/mcp.json +32 -0
  8. package/.kiro/specs/backlog-readonly-mcp/design.md +285 -0
  9. package/.kiro/specs/backlog-readonly-mcp/requirements.md +158 -0
  10. package/.kiro/specs/backlog-readonly-mcp/tasks.md +224 -0
  11. package/.kiro/steering/blog-evaluation.md +103 -0
  12. package/.kiro/steering/pr-review-response.md +29 -0
  13. package/.markdownlint.json +5 -0
  14. package/.textlintrc.json +32 -0
  15. package/.vscode/settings.json +47 -0
  16. package/README.md +170 -0
  17. package/biome.json +36 -0
  18. package/blog_content/blog.md +57 -0
  19. package/package.json +49 -0
  20. package/packages/backlog-readonly-mcp/.backlog-mcp.env.example +49 -0
  21. package/packages/backlog-readonly-mcp/MCP_CLIENT_SETUP.md +303 -0
  22. package/packages/backlog-readonly-mcp/README.md +259 -0
  23. package/packages/backlog-readonly-mcp/package.json +58 -0
  24. package/packages/backlog-readonly-mcp/src/client/backlog-api-client.ts +348 -0
  25. package/packages/backlog-readonly-mcp/src/config/config-manager.ts +280 -0
  26. package/packages/backlog-readonly-mcp/src/index.ts +247 -0
  27. package/packages/backlog-readonly-mcp/src/tools/issue-tools.ts +449 -0
  28. package/packages/backlog-readonly-mcp/src/tools/master-data-tools.ts +209 -0
  29. package/packages/backlog-readonly-mcp/src/tools/project-tools.ts +219 -0
  30. package/packages/backlog-readonly-mcp/src/tools/tool-registry.ts +223 -0
  31. package/packages/backlog-readonly-mcp/src/tools/user-tools.ts +111 -0
  32. package/packages/backlog-readonly-mcp/src/tools/wiki-tools.ts +149 -0
  33. package/packages/backlog-readonly-mcp/src/types/index.ts +297 -0
  34. package/packages/backlog-readonly-mcp/src/utils/logger.ts +123 -0
  35. package/packages/backlog-readonly-mcp/test/backlog-api-client.test.ts +307 -0
  36. package/packages/backlog-readonly-mcp/test/config-manager.test.ts +303 -0
  37. package/packages/backlog-readonly-mcp/test/issue-tools.test.ts +345 -0
  38. package/packages/backlog-readonly-mcp/test/mcp-server-integration.test.ts +254 -0
  39. package/packages/backlog-readonly-mcp/test/mcp-server.test.ts +91 -0
  40. package/packages/backlog-readonly-mcp/test/project-tools.test.ts +194 -0
  41. package/packages/backlog-readonly-mcp/test/workspace-config.test.ts +320 -0
  42. package/packages/backlog-readonly-mcp/tsconfig.json +21 -0
  43. package/packages/backlog-readonly-mcp/tsconfig.prod.json +11 -0
  44. package/packages/backlog-readonly-mcp/vitest.config.ts +12 -0
  45. package/packages/cdk/README.md +14 -0
  46. package/packages/cdk/cdk.json +98 -0
  47. package/packages/cdk/jest.config.js +9 -0
  48. package/packages/cdk/node_modules/.bin/browserslist +21 -0
  49. package/packages/cdk/node_modules/.bin/cdk +21 -0
  50. package/packages/cdk/node_modules/.bin/jest +21 -0
  51. package/packages/cdk/node_modules/.bin/ts-jest +21 -0
  52. package/packages/cdk/node_modules/.bin/ts-node +21 -0
  53. package/packages/cdk/node_modules/.bin/ts-node-cwd +21 -0
  54. package/packages/cdk/node_modules/.bin/ts-node-esm +21 -0
  55. package/packages/cdk/node_modules/.bin/ts-node-script +21 -0
  56. package/packages/cdk/node_modules/.bin/ts-node-transpile-only +21 -0
  57. package/packages/cdk/node_modules/.bin/ts-script +21 -0
  58. package/packages/cdk/node_modules/.bin/tsc +21 -0
  59. package/packages/cdk/node_modules/.bin/tsserver +21 -0
  60. package/packages/cdk/package.json +31 -0
  61. package/packages/cdk/test/__snapshots__/cdk.test.ts.snap +40 -0
  62. package/packages/cdk/tsconfig.json +25 -0
  63. package/pnpm-workspace.yaml +2 -0
  64. package/scripts/setup-blog.js +148 -0
@@ -0,0 +1,57 @@
1
+ # Copilot Review Instructions
2
+
3
+ ## 言語設定
4
+ - レビューコメントは**日本語**で記述してください
5
+ - 技術用語は適切な日本語訳を使用し、必要に応じて英語を併記してください
6
+
7
+ ## プロジェクトコンテキスト
8
+ このプロジェクトは**個人用・学習・検証用**のコードです。以下の点を考慮してレビューしてください:
9
+
10
+ ### 開発・学習目的
11
+ - 本番運用ではなく、技術検証とブログ記事執筆が目的
12
+ - 学習効果を重視し、過度なセキュリティ要件は不要
13
+ - シンプルで理解しやすい実装を優先
14
+ - **個人利用のため、細かいエラーハンドリングや例外処理は最小限で十分**
15
+
16
+ ### 許容される実装
17
+ - 環境変数での機密情報管理(開発環境用)
18
+ - 基本的なリソース設定(過度なセキュリティ設定は不要)
19
+ - 開発環境での利便性を重視した設定
20
+ - 最小限のテストカバレッジ
21
+ - **個人用スクリプトレベルのエラーハンドリング**
22
+
23
+ ## レビュー重点項目
24
+ 以下の観点を重視してレビューしてください:
25
+
26
+ ### 優先度:高
27
+ - **機能的正確性**: コードが意図した通りに動作するか
28
+ - **型安全性**: 型定義と型チェックの適切性
29
+ - **統合性**: 各コンポーネント間の連携が正しく実装されているか
30
+ - **コメント・ドキュメント**: 学習用として理解しやすい説明があるか
31
+
32
+ ### 優先度:中
33
+ - コードの可読性と保守性
34
+ - エラーハンドリングの適切性
35
+ - パフォーマンスの基本的な考慮
36
+
37
+ ### 優先度:低(指摘不要)
38
+ - 本番環境向けセキュリティ設定
39
+ - 詳細なテストカバレッジ
40
+ - 高度な監視・ログ設定
41
+ - 本格的な暗号化・アクセス制御
42
+ - **個人用スクリプトの細かいエラーハンドリング**
43
+ - **ファイル存在チェック後の詳細なエラー処理**
44
+ - **エンタープライズレベルの例外処理**
45
+
46
+ ## 特記事項
47
+ - このプロジェクトは技術ブログの題材として使用されます
48
+ - 読者の理解を助ける観点からのコメントを歓迎します
49
+ - 過度に複雑な実装よりも、シンプルで説明しやすい実装を推奨してください
50
+
51
+ ## レビュー抑制ガイドライン
52
+ **個人用プロジェクトのため、以下の指摘は控えてください:**
53
+ - 細かいエラーハンドリングの不足
54
+ - ファイル操作の詳細な例外処理
55
+ - エンタープライズレベルのロバスト性
56
+ - 本番環境を想定した堅牢性の指摘
57
+ - 個人利用で十分な実装に対する過度な改善提案
@@ -0,0 +1,49 @@
1
+ # GitHub Repository Settings
2
+ # https://github.com/probot/settings
3
+
4
+ repository:
5
+ # Repository settings
6
+ name: backlog-readonly-mcp
7
+ description: "Backlog読み取り専用MCPサーバー - プロジェクト、課題、ユーザー情報を安全に取得"
8
+ homepage: ""
9
+ topics: ["mcp", "backlog", "readonly", "api", "typescript"]
10
+ private: false
11
+ has_issues: true
12
+ has_projects: false
13
+ has_wiki: false
14
+ has_downloads: true
15
+ default_branch: main
16
+ allow_squash_merge: true
17
+ allow_merge_commit: false
18
+ allow_rebase_merge: false
19
+ delete_branch_on_merge: true
20
+ enable_automated_security_fixes: true
21
+ enable_vulnerability_alerts: true
22
+
23
+ # Branch protection rules
24
+ branches:
25
+ - name: main
26
+ protection:
27
+ required_status_checks:
28
+ strict: false
29
+ contexts: []
30
+ enforce_admins: false
31
+ required_pull_request_reviews:
32
+ required_approving_review_count: 0
33
+ dismiss_stale_reviews: false
34
+ require_code_owner_reviews: false
35
+ dismissal_restrictions:
36
+ users: []
37
+ teams: []
38
+ bypass_pull_request_allowances:
39
+ users: []
40
+ teams: []
41
+ restrictions: null
42
+ required_conversation_resolution: true
43
+ allow_force_pushes: false
44
+ allow_deletions: false
45
+
46
+ # Pull request settings
47
+ pull_requests:
48
+ # Automatically delete head branches when pull requests are merged
49
+ delete_branch_on_merge: true
@@ -0,0 +1 @@
1
+ npx lint-staged
@@ -0,0 +1,15 @@
1
+ {
2
+ "enabled": true,
3
+ "name": "Agent Completion Sound",
4
+ "description": "エージェントの実行が完了した時にPing音を鳴らして通知します(macOS専用)",
5
+ "version": "1",
6
+ "when": {
7
+ "type": "agentStop"
8
+ },
9
+ "then": {
10
+ "type": "runCommand",
11
+ "command": "afplay /System/Library/Sounds/Ping.aiff"
12
+ },
13
+ "shortName": "agent-completion-sound",
14
+ "workspaceFolderName": "backlog-readonly-mcp-blog"
15
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "enabled": true,
3
+ "name": "Markdown Lint on Save",
4
+ "description": "Automatically runs markdown linting when markdown files are edited to ensure consistent formatting and catch syntax errors",
5
+ "version": "1",
6
+ "when": {
7
+ "type": "fileEdited",
8
+ "patterns": [
9
+ "*.md",
10
+ "*.markdown"
11
+ ]
12
+ },
13
+ "then": {
14
+ "type": "askAgent",
15
+ "prompt": "保存されたMarkdownファイルに対してtextlintを実行して文章を校正してください。以下のコマンドを実行してください:\n\npnpm lint:fix\n\n実行後、修正された内容があれば簡潔に報告してください。"
16
+ },
17
+ "workspaceFolderName": "techblog_workspace",
18
+ "shortName": "markdown-lint-save"
19
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "chatLanguage": "japanese"
3
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "mcpServers": {
3
+ "aws-knowledge-mcp-server": {
4
+ "url": "https://knowledge-mcp.global.api.aws",
5
+ "disabled": false,
6
+ "autoApprove": [
7
+ "aws___search_documentation",
8
+ "aws___read_documentation"
9
+ ]
10
+ },
11
+ "backlog-readonly": {
12
+ "command": "node",
13
+ "args": [
14
+ "packages/backlog-readonly-mcp/dist/index.js"
15
+ ],
16
+ "env": {
17
+ "BACKLOG_DOMAIN": "${BACKLOG_DOMAIN}",
18
+ "BACKLOG_API_KEY": "${BACKLOG_API_KEY}",
19
+ "BACKLOG_CONFIG_PATH": "${workspaceFolder}/.backlog-mcp.env"
20
+ },
21
+ "disabled": false,
22
+ "autoApprove": [
23
+ "test_connection",
24
+ "get_default_project",
25
+ "get_projects",
26
+ "get_wikis",
27
+ "get_project",
28
+ "get_issues"
29
+ ]
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,285 @@
1
+ # 設計文書
2
+
3
+ ## 概要
4
+
5
+ Backlog 読み取り専用 MCP サーバーは、TypeScript と Node.js を使用して実装される Model Context Protocol サーバーです。このサーバーは、Backlog の REST API を利用してプロジェクト、課題、ユーザー、Wiki などの情報を読み取り専用で提供します。セキュリティを重視し、データの変更や作成は一切行いません。
6
+
7
+ ## アーキテクチャ
8
+
9
+ ### 全体構成
10
+
11
+ ```mermaid
12
+ graph TB
13
+ subgraph "MCP Client"
14
+ A["AI Agent<br/>Claude/Cline/Cursor"]
15
+ end
16
+
17
+ subgraph "MCP Server"
18
+ B["MCP Protocol Handler"]
19
+ C["Tool Registry"]
20
+ D["Backlog API Client"]
21
+ E["Error Handler"]
22
+ F["Logger"]
23
+ end
24
+
25
+ subgraph "External Service"
26
+ G["Backlog REST API"]
27
+ end
28
+
29
+ A <-->|MCP Protocol| B
30
+ B --> C
31
+ C --> D
32
+ D -->|HTTP GET Only| G
33
+ B --> E
34
+ B --> F
35
+ ```
36
+
37
+ ### レイヤー構成
38
+
39
+ 1. **MCPプロトコル層**: MCP クライアントとの通信を処理
40
+ 2. **ツール層**: 各種 Backlog ツールの実装
41
+ 3. **APIクライアント層**: Backlog REST API との通信
42
+ 4. **ユーティリティ層**: エラーハンドリング、ログ、設定管理
43
+
44
+ ## コンポーネントとインタフェース
45
+
46
+ ### MCPサーバーコンポーネント
47
+
48
+ #### 1. MCPサーバー(McpServer)
49
+ - **責任**: MCP プロトコルの処理、ツールの登録・管理
50
+ - **依存関係**: @modelcontextprotocol/sdk
51
+ - **インタフェース**:
52
+ - `listTools()`: 利用可能なツール一覧を返す
53
+ - `callTool(name, args)`: 指定されたツールを実行
54
+
55
+ #### 2. BacklogAPIクライアント(BacklogApiClient)
56
+ - **責任**: Backlog REST API との通信、API キーの安全な管理
57
+ - **設定**: 環境変数(ワークスペース `.backlog-mcp.env` 優先)から API キー・ドメイン・オプション設定を読み込み
58
+ - **セキュリティ機能**:
59
+ - API キーのマスキング(ログ出力時)
60
+ - API キーの有効性検証
61
+ - **インタフェース**:
62
+ - `get(endpoint, params?)`: GET リクエストの実行
63
+ - `handleRateLimit()`: レート制限の処理
64
+ - `validateApiKey()`: API キーの有効性チェック
65
+ - `loadConfig()`: 環境変数と.backlog-mcp.env ファイルからの設定読み込み
66
+
67
+ #### 3. ツールレジストリ(ToolRegistry)
68
+ - **責任**: 各種 Backlog ツールの登録と管理
69
+ - **ツールカテゴリ**:
70
+ - プロジェクト関連ツール
71
+ - 課題関連ツール
72
+ - ユーザー関連ツール
73
+ - Wiki 関連ツール
74
+ - マスタデータ関連ツール
75
+
76
+ ### ツール実装
77
+
78
+ #### プロジェクト関連ツール
79
+
80
+ ```typescript
81
+ interface ProjectTool {
82
+ name: string;
83
+ description: string;
84
+ inputSchema: JSONSchema;
85
+ handler: (args: any) => Promise<any>;
86
+ }
87
+ ```
88
+
89
+ **実装ツール**:
90
+ - `get_projects`: プロジェクト一覧取得
91
+ - `get_project`: プロジェクト詳細取得
92
+ - `get_project_users`: プロジェクトメンバー取得
93
+
94
+ #### 課題関連ツール
95
+
96
+ **実装ツール**:
97
+ - `get_issues`: 課題一覧取得(検索条件付き)
98
+ - `get_issue`: 課題詳細取得
99
+ - `get_issue_comments`: 課題コメント取得
100
+ - `get_issue_attachments`: 課題添付ファイル取得
101
+
102
+ #### その他のツール
103
+
104
+ **ユーザー関連**: `get_users`, `get_user`, `get_myself`
105
+ **Wiki関連**: `get_wikis`, `get_wiki`
106
+ **マスタデータ関連**: `get_priorities`, `get_statuses`, `get_resolutions`, `get_categories`
107
+
108
+ ## データモデル
109
+
110
+ ### 設定モデル
111
+
112
+ ```typescript
113
+ interface BacklogConfig {
114
+ domain: string; // example.backlog.com
115
+ apiKey: string; // APIキー
116
+ defaultProject?: string; // デフォルトプロジェクトキー
117
+ maxRetries: number; // リトライ回数
118
+ timeout: number; // タイムアウト(ms)
119
+ }
120
+ ```
121
+
122
+ ### APIキー管理
123
+
124
+ #### 環境変数による設定
125
+ API キーとドメインは環境変数で管理し、ワークスペース単位での設定も可能です。
126
+
127
+ **設定の優先順位**:
128
+ 1. **ワークスペース設定ファイル** (最優先)
129
+ - プロジェクトルートの `.backlog-mcp.env` ファイル
130
+ - ワークスペース固有の設定
131
+ 2. **システム環境変数**
132
+ - グローバルな設定
133
+
134
+ **必須環境変数**:
135
+ - `BACKLOG_API_KEY`: Backlog の API キー
136
+ - `BACKLOG_DOMAIN`: Backlog ドメイン(例: your-company.backlog.com)
137
+
138
+ **オプション環境変数**:
139
+ - `BACKLOG_DEFAULT_PROJECT`: デフォルトプロジェクトキー(例: MYPROJ)
140
+ - `BACKLOG_MAX_RETRIES`: リトライ回数(デフォルト: 3)
141
+ - `BACKLOG_TIMEOUT`: タイムアウト(ms、デフォルト: 30000)
142
+
143
+ #### ワークスペース単位の設定
144
+ プロジェクトルートに `.backlog-mcp.env` ファイルを配置することで、ワークスペース固有の設定が可能:
145
+
146
+ ```bash
147
+ # プロジェクトA/.backlog-mcp.env
148
+ BACKLOG_DOMAIN="company-a.backlog.com"
149
+ BACKLOG_API_KEY="project-a-api-key"
150
+ BACKLOG_DEFAULT_PROJECT="PROJA"
151
+
152
+ # プロジェクトB/.backlog-mcp.env
153
+ BACKLOG_DOMAIN="company-b.backlog.com"
154
+ BACKLOG_API_KEY="project-b-api-key"
155
+ BACKLOG_DEFAULT_PROJECT="PROJB"
156
+ ```
157
+
158
+ #### デフォルトプロジェクト機能
159
+ 多くの場合、特定のプロジェクトに集中して作業するため、デフォルトプロジェクトを設定できます:
160
+
161
+ - `BACKLOG_DEFAULT_PROJECT` が設定されている場合、プロジェクト ID を省略可能
162
+ - 課題取得時に自動的にデフォルトプロジェクトを使用
163
+ - 明示的にプロジェクト ID を指定すれば他のプロジェクトにもアクセス可能
164
+
165
+ #### セキュリティ対策
166
+ ```typescript
167
+ interface SecurityConfig {
168
+ // APIキーの有効性チェック
169
+ validateApiKey: boolean;
170
+ // ログにAPIキーを出力しない
171
+ maskSensitiveData: boolean;
172
+ }
173
+ ```
174
+
175
+ #### 環境変数設定例
176
+
177
+ **システム全体の設定**:
178
+ ```bash
179
+ export BACKLOG_DOMAIN="your-company.backlog.com"
180
+ export BACKLOG_API_KEY="your-api-key-here"
181
+ ```
182
+
183
+ **ワークスペース固有の設定** (`.backlog-mcp.env` ファイル):
184
+ ```bash
185
+ # プロジェクトA/.backlog-mcp.env
186
+ BACKLOG_DOMAIN="company-a.backlog.com"
187
+ BACKLOG_API_KEY="project-a-api-key"
188
+ BACKLOG_DEFAULT_PROJECT="PROJA"
189
+ BACKLOG_MAX_RETRIES="3"
190
+ BACKLOG_TIMEOUT="30000"
191
+ ```
192
+
193
+ #### MCPクライアント設定例
194
+ ```json
195
+ {
196
+ "mcpServers": {
197
+ "backlog-readonly": {
198
+ "command": "node",
199
+ "args": ["dist/index.js"],
200
+ "cwd": "${workspaceFolder}",
201
+ "env": {
202
+ "NODE_ENV": "production"
203
+ }
204
+ }
205
+ }
206
+ }
207
+ ```
208
+
209
+ **注意**: MCP クライアント設定では `cwd` を `${workspaceFolder}` に設定することで、ワークスペースの `.backlog-mcp.env` ファイルが自動的に読み込まれます。
210
+
211
+ #### 使用例
212
+ ```typescript
213
+ // デフォルトプロジェクトの課題を取得
214
+ await callTool("get_issues", {});
215
+
216
+ // 特定プロジェクトの課題を取得
217
+ await callTool("get_issues", { projectId: "OTHERPROJ" });
218
+
219
+ // デフォルトプロジェクトの課題詳細を取得
220
+ await callTool("get_issue", { issueKey: "MYPROJ-123" });
221
+ ```
222
+
223
+ ### APIレスポンスモデル
224
+
225
+ ```typescript
226
+ interface BacklogProject {
227
+ id: number;
228
+ projectKey: string;
229
+ name: string;
230
+ chartEnabled: boolean;
231
+ subtaskingEnabled: boolean;
232
+ projectLeaderCanEditProjectLeader: boolean;
233
+ useWikiTreeView: boolean;
234
+ textFormattingRule: string;
235
+ archived: boolean;
236
+ displayOrder: number;
237
+ useDevAttributes: boolean;
238
+ }
239
+
240
+ interface BacklogIssue {
241
+ id: number;
242
+ projectId: number;
243
+ issueKey: string;
244
+ keyId: number;
245
+ issueType: IssueType;
246
+ summary: string;
247
+ description: string;
248
+ resolution: Resolution | null;
249
+ priority: Priority;
250
+ status: Status;
251
+ assignee: User | null;
252
+ category: Category[];
253
+ versions: Version[];
254
+ milestone: Milestone[];
255
+ startDate: string | null;
256
+ dueDate: string | null;
257
+ estimatedHours: number | null;
258
+ actualHours: number | null;
259
+ parentIssueId: number | null;
260
+ createdUser: User;
261
+ created: string;
262
+ updatedUser: User;
263
+ updated: string;
264
+ customFields: CustomField[];
265
+ attachments: Attachment[];
266
+ sharedFiles: SharedFile[];
267
+ stars: Star[];
268
+ }
269
+ ```
270
+
271
+ ### エラーモデル
272
+
273
+ ```typescript
274
+ interface BacklogError {
275
+ code: string;
276
+ message: string;
277
+ details?: any;
278
+ }
279
+
280
+ interface MCPError {
281
+ code: number;
282
+ message: string;
283
+ data?: any;
284
+ }
285
+ ```
@@ -0,0 +1,158 @@
1
+ # 要件文書
2
+
3
+ ## 概要
4
+
5
+ BacklogのAPIを利用して、プロジェクト、課題、ユーザー情報などを参照できるMCP(Model Context Protocol)サーバーを開発する。このMCPサーバーは読み取り専用に特化し、データの変更や作成は一切行わない。既存のnulab公式MCPサーバーとは異なり、セキュリティを重視し、誤ってデータを変更するリスクを完全に排除する。
6
+
7
+ ## 用語集
8
+
9
+ - **Backlog**: ヌーラボが提供するプロジェクト管理ツール
10
+ - **MCP_Server**: Model Context Protocolに準拠したサーバー
11
+ - **API_Client**: BacklogのREST APIにアクセスするクライアント
12
+ - **Project**: Backlogにおけるプロジェクト
13
+ - **Issue**: Backlogにおける課題
14
+ - **User**: Backlogのユーザー
15
+
16
+ ## 要件
17
+
18
+ ### 要件 1: API認証とアクセス
19
+
20
+ **ユーザーストーリー:** 開発者として、BacklogのAPIキーを使用してAPIにアクセスしたい。これにより、安全にBacklogのデータを取得できる。
21
+
22
+ #### 受け入れ基準
23
+
24
+ 1. WHEN APIキーが提供されたとき、THE MCP_Server SHALL Backlog APIに対して認証を行う
25
+ 2. WHEN 無効なAPIキーが提供されたとき、THE MCP_Server SHALL 適切なエラーメッセージを返す
26
+ 3. WHEN API接続が失敗したとき、THE MCP_Server SHALL 接続エラーを適切に処理する
27
+ 4. THE MCP_Server SHALL 環境変数またはコンフィグファイルからAPIキーを読み込む
28
+
29
+ ### 要件 2: プロジェクト情報の取得
30
+
31
+ **ユーザーストーリー:** ユーザーとして、Backlogのプロジェクト一覧と詳細情報を取得したい。これにより、プロジェクトの概要を把握できる。
32
+
33
+ #### 受け入れ基準
34
+
35
+ 1. WHEN プロジェクト一覧が要求されたとき、THE MCP_Server SHALL 利用可能なプロジェクトのリストを返す
36
+ 2. WHEN 特定のプロジェクトIDが指定されたとき、THE MCP_Server SHALL そのプロジェクトの詳細情報を返す
37
+ 3. WHEN 存在しないプロジェクトIDが指定されたとき、THE MCP_Server SHALL 適切なエラーメッセージを返す
38
+ 4. THE MCP_Server SHALL プロジェクト名、キー、説明、作成日時を含む情報を提供する
39
+
40
+ ### 要件 3: 課題情報の取得
41
+
42
+ **ユーザーストーリー:** ユーザーとして、Backlogの課題情報を検索・取得したい。これにより、プロジェクトの進捗状況を把握できる。
43
+
44
+ #### 受け入れ基準
45
+
46
+ 1. WHEN 課題一覧が要求されたとき、THE MCP_Server SHALL プロジェクト内の課題リストを返す
47
+ 2. WHEN 特定の課題IDが指定されたとき、THE MCP_Server SHALL その課題の詳細情報を返す
48
+ 3. WHEN 課題検索条件が指定されたとき、THE MCP_Server SHALL 条件に合致する課題を返す
49
+ 4. THE MCP_Server SHALL 課題のタイトル、説明、ステータス、担当者、期限を含む情報を提供する
50
+ 5. WHEN 存在しない課題IDが指定されたとき、THE MCP_Server SHALL 適切なエラーメッセージを返す
51
+
52
+ ### 要件 4: ユーザー情報の取得
53
+
54
+ **ユーザーストーリー:** ユーザーとして、Backlogのユーザー情報を取得したい。これにより、プロジェクトメンバーの情報を確認できる。
55
+
56
+ #### 受け入れ基準
57
+
58
+ 1. WHEN ユーザー一覧が要求されたとき、THE MCP_Server SHALL プロジェクトのユーザーリストを返す
59
+ 2. WHEN 特定のユーザーIDが指定されたとき、THE MCP_Server SHALL そのユーザーの詳細情報を返す
60
+ 3. THE MCP_Server SHALL ユーザー名、表示名、メールアドレス、ロールを含む情報を提供する
61
+ 4. WHEN 存在しないユーザーIDが指定されたとき、THE MCP_Server SHALL 適切なエラーメッセージを返す
62
+
63
+ ### 要件 5: MCPプロトコル準拠
64
+
65
+ **ユーザーストーリー:** 開発者として、標準的なMCPクライアントからこのサーバーを利用したい。これにより、既存のMCPエコシステムと統合できる。
66
+
67
+ #### 受け入れ基準
68
+
69
+ 1. THE MCP_Server SHALL MCPプロトコルの仕様に準拠する
70
+ 2. WHEN MCPクライアントから接続要求があったとき、THE MCP_Server SHALL 適切なハンドシェイクを行う
71
+ 3. THE MCP_Server SHALL 利用可能なツールのリストを提供する
72
+ 4. WHEN ツールが呼び出されたとき、THE MCP_Server SHALL 適切なレスポンスを返す
73
+ 5. THE MCP_Server SHALL エラー処理をMCPプロトコルに従って行う
74
+
75
+ ### 要件 6: 読み取り専用制限
76
+
77
+ **ユーザーストーリー:** システム管理者として、このMCPサーバーがBacklogのデータを変更しないことを保証したい。これにより、安全にデータを参照できる。
78
+
79
+ #### 受け入れ基準
80
+
81
+ 1. THE MCP_Server SHALL GET リクエストのみを使用してBacklog APIにアクセスする
82
+ 2. THE MCP_Server SHALL POST、PUT、DELETE リクエストを一切送信しない
83
+ 3. WHEN データ変更を要求するツール呼び出しがあったとき、THE MCP_Server SHALL エラーメッセージを返す
84
+ 4. THE MCP_Server SHALL 読み取り専用であることをツールの説明に明記する
85
+
86
+ ### 要件 7: エラーハンドリングとログ
87
+
88
+ **ユーザーストーリー:** 開発者として、APIエラーや接続問題を適切に処理・ログ出力したい。これにより、問題の診断と解決ができる。
89
+
90
+ #### 受け入れ基準
91
+
92
+ 1. WHEN Backlog APIからエラーレスポンスが返されたとき、THE MCP_Server SHALL 適切なエラーメッセージを生成する
93
+ 2. WHEN ネットワークエラーが発生したとき、THE MCP_Server SHALL 接続エラーを適切に処理する
94
+ 3. THE MCP_Server SHALL 重要な操作とエラーをログに記録する
95
+ 4. WHEN レート制限に達したとき、THE MCP_Server SHALL 適切な待機時間を設ける
96
+ 5. THE MCP_Server SHALL ユーザーフレンドリーなエラーメッセージを提供する
97
+
98
+ ### 要件 8: 既存MCPサーバーとの差別化
99
+
100
+ **ユーザーストーリー:** セキュリティ重視の環境で作業する開発者として、データ変更のリスクを完全に排除したBacklog MCPサーバーを使用したい。これにより、安心してAIエージェントにBacklogデータへのアクセスを許可できる。
101
+
102
+ #### 受け入れ基準
103
+
104
+ 1. THE MCP_Server SHALL 公式MCPサーバーと比較して読み取り専用機能のみを提供する
105
+ 2. THE MCP_Server SHALL データ変更機能(課題作成、コメント追加、Wiki編集など)を一切実装しない
106
+ 3. WHEN データ変更を試みるツール呼び出しがあったとき、THE MCP_Server SHALL 明確な拒否メッセージを返す
107
+ 4. THE MCP_Server SHALL セキュリティ重視の用途に適していることをドキュメントに明記する
108
+ 5. THE MCP_Server SHALL 最小限の権限でBacklog APIにアクセスする
109
+
110
+ ### 要件 9: 提供ツールの定義
111
+
112
+ **ユーザーストーリー:** 開発者として、MCPサーバーが提供する具体的なツールを把握したい。これにより、どのような操作が可能かを理解できる。
113
+
114
+ #### 受け入れ基準
115
+
116
+ 1. THE MCP_Server SHALL 以下のプロジェクト関連ツールを提供する:
117
+ - `get_projects`: プロジェクト一覧の取得
118
+ - `get_project`: 特定プロジェクトの詳細取得
119
+ - `get_project_users`: プロジェクトメンバー一覧の取得
120
+
121
+ 2. THE MCP_Server SHALL 以下の課題関連ツールを提供する:
122
+ - `get_issues`: 課題一覧の取得(検索条件付き)
123
+ - `get_issue`: 特定課題の詳細取得
124
+ - `get_issue_comments`: 課題のコメント一覧取得
125
+ - `get_issue_attachments`: 課題の添付ファイル一覧取得
126
+
127
+ 3. THE MCP_Server SHALL 以下のユーザー関連ツールを提供する:
128
+ - `get_users`: ユーザー一覧の取得
129
+ - `get_user`: 特定ユーザーの詳細取得
130
+ - `get_myself`: 自分のユーザー情報取得
131
+
132
+ 4. THE MCP_Server SHALL 以下のWiki関連ツールを提供する:
133
+ - `get_wikis`: Wiki一覧の取得
134
+ - `get_wiki`: 特定Wikiページの取得
135
+
136
+ 5. THE MCP_Server SHALL 以下のマスタデータ関連ツールを提供する:
137
+ - `get_priorities`: 優先度一覧の取得
138
+ - `get_statuses`: ステータス一覧の取得
139
+ - `get_resolutions`: 完了理由一覧の取得
140
+ - `get_categories`: カテゴリ一覧の取得
141
+
142
+ 6. WHEN 各ツールが呼び出されたとき、THE MCP_Server SHALL 適切なBacklog APIエンドポイントにGETリクエストを送信する
143
+
144
+ 7. THE MCP_Server SHALL 各ツールの説明に「読み取り専用」であることを明記する
145
+
146
+ ### 要件 10: ワークスペース固有設定
147
+
148
+ **ユーザーストーリー:** 複数のプロジェクトで作業する開発者として、ワークスペースごとに異なるBacklogプロジェクトをデフォルトとして設定したい。これにより、プロジェクト切り替え時の設定変更が不要になる。
149
+
150
+ #### 受け入れ基準
151
+
152
+ 1. THE MCP_Server SHALL BACKLOG_CONFIG_PATH環境変数で指定されたファイルから設定を読み込む
153
+ 2. WHEN ワークスペース固有の設定ファイルが存在するとき、THE MCP_Server SHALL そのファイルからBACKLOG_DEFAULT_PROJECTを読み込む
154
+ 3. WHEN デフォルトプロジェクトが設定されているとき、THE MCP_Server SHALL プロジェクトIDを省略した課題取得でそのプロジェクトを使用する
155
+ 4. THE MCP_Server SHALL 認証情報(BACKLOG_DOMAIN、BACKLOG_API_KEY)は環境変数から取得する
156
+ 5. WHEN 設定ファイルが存在しないとき、THE MCP_Server SHALL 環境変数のみを使用して動作する
157
+ 6. THE MCP_Server SHALL 設定ファイルの形式として.envファイル形式をサポートする
158
+ 7. WHEN 無効な設定ファイルが指定されたとき、THE MCP_Server SHALL 適切なエラーメッセージを返す