tambora-mcp 0.1.0__tar.gz

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.
@@ -0,0 +1,38 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ build-and-publish:
10
+ runs-on: ubuntu-latest
11
+ environment: pypi
12
+ permissions:
13
+ contents: read
14
+ id-token: write
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ fetch-depth: 0
19
+
20
+ - uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.12"
23
+
24
+ # No test step yet: this repo has no tests/ suite. Add a `pytest`
25
+ # step here before build once one exists.
26
+
27
+ - name: Build
28
+ run: |
29
+ pip install hatch
30
+ hatch build
31
+
32
+ - name: Check package metadata
33
+ run: |
34
+ pip install twine
35
+ twine check dist/*
36
+
37
+ - name: Publish to PyPI
38
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
@@ -0,0 +1,25 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+ .eggs/
8
+ tambora_mcp/_version.py
9
+
10
+ # Virtual environments
11
+ venv/
12
+ .venv/
13
+ env/
14
+
15
+ # Environment / secrets
16
+ .env
17
+ *.env
18
+
19
+ # IDE
20
+ .idea/
21
+ .vscode/
22
+ *.swp
23
+
24
+ # OS
25
+ .DS_Store
@@ -0,0 +1,17 @@
1
+ {
2
+ "mcpServers": {
3
+ "tambora": {
4
+ "command": "python3",
5
+ "args": [
6
+ "-m",
7
+ "tambora_mcp"
8
+ ],
9
+ "cwd": "/Users/jesus.palomino/Documents/GitHub/tambora-mcp",
10
+ "env": {
11
+ "TAMBORA_BASE_URL": "http://localhost:8000",
12
+ "TAMBORA_API_KEY": "vnsGEJS6v0DWaOHFtK3-qJtEimLFJej5M16y2seLrpc",
13
+ "TAMBORA_PROJECT_KEY": "MPP"
14
+ }
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,116 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ `tambora-mcp` is a [FastMCP](https://github.com/jlowin/fastmcp) server that exposes Tambora test-case management operations as native MCP tools, allowing Claude to create test cases and manage test runs without generating and executing scripts manually.
8
+
9
+ ## Commands
10
+
11
+ **Install for development:**
12
+ ```bash
13
+ pip install -e .
14
+ ```
15
+
16
+ **Run the server:**
17
+ ```bash
18
+ tambora-mcp
19
+ # or
20
+ python -m tambora_mcp
21
+ ```
22
+
23
+ **Build the package:**
24
+ ```bash
25
+ pip install hatch
26
+ hatch build
27
+ ```
28
+
29
+ **Release a new version:**
30
+ ```bash
31
+ git tag v0.6.0
32
+ git push origin v0.6.0
33
+ ```
34
+ Pushing a `v*` tag triggers `.github/workflows/publish.yml`, which builds and publishes to PyPI via Trusted Publishing (OIDC — no stored tokens). The version is resolved automatically from the git tag via `hatch-vcs`; never bump a version string in `pyproject.toml`/`__init__.py` by hand, and never run `twine upload` manually.
35
+
36
+ ## Architecture
37
+
38
+ The package has two distinct layers:
39
+
40
+ ### `TamboraClient` (`client.py`)
41
+ Low-level HTTP client for the Tambora REST API. Key behaviors:
42
+ - All public methods are safe — they catch all network/HTTP errors and return `None`/`False` instead of raising.
43
+ - Retries: `MAX_RETRIES=2` with `RETRY_BACKOFF=1s` exponential backoff.
44
+ - **Critical**: POST requests that time out abort immediately and do NOT retry (`_last_post_timeout` flag), to prevent duplicate creation in Tambora.
45
+ - Bulk create falls back to individual creates on failure, but **not** on timeout.
46
+ - `gherkin_to_prosemirror()` converts Gherkin text into the ProseMirror document schema expected by the Tambora API.
47
+ - Auth uses the `http-api-token` header.
48
+
49
+ **Field mappings:**
50
+ - Severity → Priority: `critical→Critical`, `normal→Low`, `minor→Trivial`
51
+ - Status: `passed→Passed`, `failed→Failed`, `skipped→Skipped`, `error→Blocked`
52
+
53
+ ### `TamboraCreator` (`creator.py`)
54
+ High-level adapter used at test-generation time (not during test execution). Bridges the MCP tool interface to `TamboraClient`. Normalizes the `gherkin`/`severity`/`is_automated` fields from MCP inputs into the `description`/`priority`/`automation_status` fields expected by the client.
55
+
56
+ ### `server.py`
57
+ FastMCP server wiring. Reads configuration from environment variables at startup and instantiates a module-level `_creator` (TamboraCreator) and `_client` (TamboraClient). Exposes MCP tools: `check_connectivity`, `create_test_case`, `create_test_cases`, `edit_test_case`, `list_test_cases`, `create_test_run`, `edit_test_run`, `assign_test_cases`, `add_test_run_results`, `complete_test_run`, `create_test_run_from_suite`, `list_suites`, `add_test_cases_to_suite`.
58
+
59
+ **Hierarchy model:** `module` (top-level, `is_module: true`) → `suite` (child, has `parent_id`). Use `module`/`suite` params, not `feature`/`story`.
60
+
61
+ ## Configuration
62
+
63
+ All configuration is via environment variables:
64
+
65
+ | Variable | Description |
66
+ |---|---|
67
+ | `TAMBORA_BASE_URL` | Tambora instance URL (e.g. `https://your-instance.tambora.com`) |
68
+ | `TAMBORA_API_KEY` | API key for authentication (project is derived from the token on the backend) |
69
+
70
+ ## MCP Registration
71
+
72
+ Register in `.mcp.json`. Recommended — no install step, via `uvx` (package is published on PyPI as `tambora-mcp`):
73
+ ```json
74
+ {
75
+ "mcpServers": {
76
+ "tambora": {
77
+ "command": "uvx",
78
+ "args": ["tambora-mcp@latest"],
79
+ "env": {
80
+ "TAMBORA_BASE_URL": "https://your-instance.tambora.com",
81
+ "TAMBORA_API_KEY": "your-api-key"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ Alternative, if `tambora-mcp` was installed persistently via `pip install tambora-mcp`:
89
+ ```json
90
+ {
91
+ "mcpServers": {
92
+ "tambora": {
93
+ "command": "tambora-mcp",
94
+ "env": {
95
+ "TAMBORA_BASE_URL": "https://your-instance.tambora.com",
96
+ "TAMBORA_API_KEY": "your-api-key"
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ ## API Endpoints Used
104
+
105
+ - `GET /api/v1/health` — connectivity check
106
+ - `POST /api/v1/testcase/external-create` — single test case
107
+ - `POST /api/v1/testcase/external-bulk-create` — bulk test cases
108
+ - `PATCH /api/v1/testcase/{code}/external-edit` — edit existing test case *(backend needed)*
109
+ - `GET /api/v1/testcase/external-list` — list test cases by project/feature/story/labels
110
+ - `GET /api/v1/suite/external-list` — list suites for the project
111
+ - `POST /api/v1/suite/external-add-test-cases` — add test cases to a suite
112
+ - `POST /api/v1/test-runs/external-create` — create test run
113
+ - `PATCH /api/v1/testrun/{code}/external-edit` — edit test run
114
+ - `POST /api/v1/testrun/{code}/external-assign` — assign test case codes to a run
115
+ - `POST /api/v1/testrun/{code}/external-results` — add results
116
+ - `PUT /api/v1/testrun/{code}/external-complete` — complete test run
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Koombea
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,261 @@
1
+ Metadata-Version: 2.4
2
+ Name: tambora-mcp
3
+ Version: 0.1.0
4
+ Summary: MCP server for Tambora test case management
5
+ Project-URL: Homepage, https://github.com/koombea/tambora-mcp
6
+ Project-URL: Repository, https://github.com/koombea/tambora-mcp
7
+ Author-email: Koombea <jesus.palomino@koombea.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Software Development :: Testing
19
+ Requires-Python: >=3.10
20
+ Requires-Dist: fastmcp
21
+ Requires-Dist: requests>=2.28.0
22
+ Description-Content-Type: text/markdown
23
+
24
+ # tambora-mcp
25
+
26
+ MCP server that exposes [Tambora](https://tambora.io) test case management operations as native tools for Claude. Allows Claude to create test cases, manage test runs, and list existing tests without generating and executing scripts manually.
27
+
28
+ ## Requirements
29
+
30
+ - Python 3.10+
31
+ - A running Tambora instance with API access
32
+ - Claude Code (claude.ai/code) or any MCP-compatible client
33
+
34
+ ---
35
+
36
+ ## Installation
37
+
38
+ ### Option A — No install, via `uvx` (recommended)
39
+
40
+ If you have [uv](https://docs.astral.sh/uv/) installed, you don't need to install anything up front — point your MCP client at `uvx tambora-mcp@latest` (see [MCP Setup](#mcp-setup-in-claude-code) below). The `@latest` suffix matters: without it, `uvx` resolves the version once and reuses that cached environment on later runs instead of re-checking PyPI.
41
+
42
+ ### Option B — Persistent install from PyPI
43
+
44
+ ```bash
45
+ pip install tambora-mcp
46
+ ```
47
+
48
+ To install a specific version:
49
+
50
+ ```bash
51
+ pip install tambora-mcp==0.6.0
52
+ ```
53
+
54
+ ### Option C — Local development (contributors/maintainers)
55
+
56
+ ```bash
57
+ git clone https://github.com/koombea/tambora-mcp.git
58
+ cd tambora-mcp
59
+ pip install -e .
60
+ ```
61
+
62
+ ### Verify installation
63
+
64
+ ```bash
65
+ tambora-mcp --help
66
+ ```
67
+
68
+ ---
69
+
70
+ ## MCP Setup in Claude Code
71
+
72
+ ### 1. Locate or create your `.mcp.json`
73
+
74
+ The `.mcp.json` file lives at the root of your project (project-level) or at `~/.claude/mcp.json` (global).
75
+
76
+ ### 2. Add the tambora server
77
+
78
+ Recommended — no install step, via `uvx`:
79
+
80
+ ```json
81
+ {
82
+ "mcpServers": {
83
+ "tambora": {
84
+ "command": "uvx",
85
+ "args": ["tambora-mcp@latest"],
86
+ "env": {
87
+ "TAMBORA_BASE_URL": "https://your-instance.tambora.com",
88
+ "TAMBORA_API_KEY": "your-api-key"
89
+ }
90
+ }
91
+ }
92
+ }
93
+ ```
94
+
95
+ Alternative — if you already did a persistent `pip install tambora-mcp`:
96
+
97
+ ```json
98
+ {
99
+ "mcpServers": {
100
+ "tambora": {
101
+ "command": "tambora-mcp",
102
+ "env": {
103
+ "TAMBORA_BASE_URL": "https://your-instance.tambora.com",
104
+ "TAMBORA_API_KEY": "your-api-key"
105
+ }
106
+ }
107
+ }
108
+ }
109
+ ```
110
+
111
+ | Variable | Description |
112
+ |---|---|
113
+ | `TAMBORA_BASE_URL` | Base URL of your Tambora instance |
114
+ | `TAMBORA_API_KEY` | API key for authentication (project is derived from the token) |
115
+
116
+ ### 3. Restart Claude Code
117
+
118
+ After saving `.mcp.json`, restart Claude Code so it picks up the new MCP server. You can verify it loaded correctly by asking Claude:
119
+
120
+ > "Check connectivity to Tambora"
121
+
122
+ ---
123
+
124
+ ## Available MCP Tools
125
+
126
+ ### Test Cases
127
+
128
+ | Tool | Description |
129
+ |---|---|
130
+ | `check_connectivity` | Verify the Tambora API is reachable |
131
+ | `create_test_case` | Create a single BDD test case |
132
+ | `create_test_cases` | Bulk-create test cases from a list |
133
+ | `edit_test_case` | Edit an existing test case (title, gherkin, severity, module, suite, labels) |
134
+ | `list_test_cases` | List test cases filtered by module, suite, or labels |
135
+
136
+ ### Suites
137
+
138
+ | Tool | Description |
139
+ |---|---|
140
+ | `list_suites` | List all suites (modules and their children) in the project |
141
+ | `add_test_cases_to_suite` | Add test cases to an existing suite by name or UUID |
142
+
143
+ ### Test Runs
144
+
145
+ | Tool | Description |
146
+ |---|---|
147
+ | `create_test_run` | Create a new test run |
148
+ | `edit_test_run` | Edit an existing test run (name, description, or status) |
149
+ | `complete_test_run` | Mark a test run as completed |
150
+ | `list_test_run_cases` | List all test cases assigned to a specific test run (by code or name) |
151
+
152
+ > **Note:** `assign_test_cases`, `add_test_run_results`, and `create_test_run_from_suite` require a backend endpoint not yet available. They will be enabled in a future release.
153
+
154
+ ---
155
+
156
+ ## Usage Examples
157
+
158
+ Once the MCP server is registered, Claude can interact with Tambora conversationally:
159
+
160
+ > "Check connectivity to Tambora"
161
+
162
+ > "Create a test case for the login flow with Given/When/Then steps under the Authentication module"
163
+
164
+ > "Bulk-create 3 test cases for the Sign Up suite"
165
+
166
+ > "List all test cases in the Authentication module, Login suite"
167
+
168
+ > "Edit TC-MPP-42 and mark it as manual"
169
+
170
+ > "List all suites in the project"
171
+
172
+ > "Add TC-MPP-42 and TC-MPP-43 to the Login suite"
173
+
174
+ > "Create a test run called 'Regression v1.2.0' and mark it as In Progress"
175
+
176
+ > "Complete test run TR-MPP-14"
177
+
178
+ ### End-to-end workflow example
179
+
180
+ ```
181
+ 1. Read requirements from a Jira ticket or spec
182
+ 2. Bulk-create BDD test cases in the appropriate module and suite
183
+ 3. Add the test cases to the relevant suite with add_test_cases_to_suite
184
+ 4. Create a Test Run with a descriptive name
185
+ 5. Complete the Test Run once execution is done
186
+ ```
187
+
188
+ ---
189
+
190
+ ## Releasing a New Version (for maintainers)
191
+
192
+ Versioning is automatic — the package version is derived from the git tag at build time, so there's nothing to bump in source. To cut a release:
193
+
194
+ ```bash
195
+ git tag v0.6.0
196
+ git push origin v0.6.0
197
+ ```
198
+
199
+ Pushing the tag triggers `.github/workflows/publish.yml`, which builds the package and publishes it to PyPI. Watch the run under the repo's **Actions** tab, then confirm the new version is live at [pypi.org/project/tambora-mcp](https://pypi.org/project/tambora-mcp/). Users on `uvx tambora-mcp@latest` pick up the new version automatically; persistent installs upgrade with `pip install --upgrade tambora-mcp`.
200
+
201
+ ---
202
+
203
+ ## Architecture
204
+
205
+ ```
206
+ tambora_mcp/
207
+ ├── server.py # FastMCP server, tool definitions, env config
208
+ ├── client.py # Low-level HTTP client for the Tambora REST API
209
+ ├── creator.py # High-level adapter used at test-generation time
210
+ └── __main__.py # Entry point for python -m tambora_mcp
211
+ ```
212
+
213
+ - **`TamboraClient`** — handles HTTP, retries, and error handling. POST timeouts abort immediately and do not retry to prevent duplicate creation.
214
+ - **`TamboraCreator`** — normalizes MCP input fields (`gherkin`, `severity`, `is_automated`) into the API schema (`description`, `priority`, `automation_status`).
215
+ - **`server.py`** — wires everything together via FastMCP and reads configuration from environment variables at startup.
216
+
217
+ ---
218
+
219
+ ## Changelog
220
+
221
+ ### v0.5.0
222
+
223
+ - **New tool**: `list_test_run_cases` — list all test cases assigned to a test run, filterable by code or name. Each result includes code, summary, description, suite, severity, automation status, and tags.
224
+ - **New filters for `list_test_cases`**: `code` (look up a specific test case), `created_after`, and `created_before` (ISO 8601 date range filtering).
225
+ - **Tags on creation**: `create_test_case` now accepts a `tags` parameter that is sent to the API on creation. No extra edit call required.
226
+ - **Rename**: `labels` parameter renamed to `tags` across `create_test_case`, `list_test_cases`, `creator.py`, and `client.py` for consistency with Tambora's terminology.
227
+ - **Fix**: `create_test_case` now defaults `is_automated` to `false` instead of `true`.
228
+
229
+ ### v0.4.0
230
+
231
+ - **Breaking change**: `feature`/`story` parameters renamed to `module`/`suite` across all tools to match Tambora's hierarchy model (Module → Suite).
232
+ - **New tools**: `edit_test_case`, `list_suites`, `add_test_cases_to_suite`.
233
+ - **Fix**: corrected suite API endpoint paths (`/suites/` → `/suite/`).
234
+ - **Fix**: `edit_test_case` response now correctly reads the nested `data.data` envelope from the API.
235
+ - **Fix**: `assign_test_cases` and `add_test_cases_to_suite` now accept `test_case_codes` as a JSON string for reliable MCP client compatibility.
236
+
237
+ ### v0.3.1
238
+
239
+ - **Fix**: `create_test_case` and `bulk_create_test_cases` no longer receive `project_key` from `TamboraCreator`.
240
+
241
+ ### v0.3.0
242
+
243
+ - **New tool**: `edit_test_run`.
244
+ - **Fix**: corrected test run API endpoint paths (`test-runs` → `testrun`).
245
+ - **Fix**: `create_test_run` now sends `status` with a default of `"Pending"`.
246
+ - **Fix**: `create_test_cases` and `add_test_run_results` now accept list parameters as JSON strings.
247
+ - **Fix**: `complete_test_run` response now correctly reads the `status` field.
248
+
249
+ ### v0.2.0
250
+
251
+ - Added `list_test_cases`, `create_test_run`, `create_test_run_from_suite`, `assign_test_cases`, `add_test_run_results`, `complete_test_run` tools.
252
+
253
+ ### v0.1.0
254
+
255
+ - Initial release with `check_connectivity`, `create_test_case`, `create_test_cases`.
256
+
257
+ ---
258
+
259
+ ## License
260
+
261
+ MIT