testmcpy 0.2.4__tar.gz → 0.2.7__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.
- {testmcpy-0.2.4/testmcpy.egg-info → testmcpy-0.2.7}/PKG-INFO +154 -20
- {testmcpy-0.2.4 → testmcpy-0.2.7}/README.md +147 -18
- {testmcpy-0.2.4 → testmcpy-0.2.7}/pyproject.toml +8 -2
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/__init__.py +1 -1
- testmcpy-0.2.7/testmcpy/auth_debugger.py +985 -0
- testmcpy-0.2.7/testmcpy/auth_flow_recorder.py +692 -0
- testmcpy-0.2.7/testmcpy/cli/__init__.py +14 -0
- testmcpy-0.2.7/testmcpy/cli/app.py +103 -0
- testmcpy-0.2.7/testmcpy/cli/commands/__init__.py +1 -0
- testmcpy-0.2.7/testmcpy/cli/commands/mcp.py +365 -0
- testmcpy-0.2.7/testmcpy/cli/commands/run.py +933 -0
- testmcpy-0.2.7/testmcpy/cli/commands/server.py +1276 -0
- testmcpy-0.2.7/testmcpy/cli/commands/tools.py +438 -0
- testmcpy-0.2.7/testmcpy/cli/commands/tui.py +207 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/config.py +156 -144
- testmcpy-0.2.7/testmcpy/core/__init__.py +20 -0
- testmcpy-0.2.7/testmcpy/core/chat_session.py +391 -0
- testmcpy-0.2.7/testmcpy/core/docs_optimizer.py +208 -0
- testmcpy-0.2.7/testmcpy/core/mcp_manager.py +328 -0
- testmcpy-0.2.7/testmcpy/core/tool_comparison.py +443 -0
- testmcpy-0.2.7/testmcpy/core/tool_discovery.py +361 -0
- testmcpy-0.2.7/testmcpy/error_handlers.py +70 -0
- testmcpy-0.2.7/testmcpy/evals/__init__.py +57 -0
- testmcpy-0.2.7/testmcpy/evals/auth_evaluators.py +556 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/evals/base_evaluators.py +627 -17
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/curl.py +2 -7
- testmcpy-0.2.7/testmcpy/llm_profiles.py +243 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/mcp_profiles.py +28 -17
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/research/claude_sdk_poc.py +1 -1
- testmcpy-0.2.7/testmcpy/server/api.py +865 -0
- testmcpy-0.2.4/testmcpy/server/api.py → testmcpy-0.2.7/testmcpy/server/api.py.bak +352 -5
- testmcpy-0.2.7/testmcpy/server/helpers/__init__.py +19 -0
- testmcpy-0.2.7/testmcpy/server/helpers/mcp_config.py +236 -0
- testmcpy-0.2.7/testmcpy/server/models.py +261 -0
- testmcpy-0.2.7/testmcpy/server/routers/__init__.py +8 -0
- testmcpy-0.2.7/testmcpy/server/routers/auth.py +338 -0
- testmcpy-0.2.7/testmcpy/server/routers/generation_logs.py +185 -0
- testmcpy-0.2.7/testmcpy/server/routers/llm.py +414 -0
- testmcpy-0.2.7/testmcpy/server/routers/mcp_profiles.py +833 -0
- testmcpy-0.2.7/testmcpy/server/routers/results.py +277 -0
- testmcpy-0.2.7/testmcpy/server/routers/smoke_reports.py +130 -0
- testmcpy-0.2.7/testmcpy/server/routers/test_profiles.py +187 -0
- testmcpy-0.2.7/testmcpy/server/routers/tests.py +1277 -0
- testmcpy-0.2.7/testmcpy/server/routers/tools.py +801 -0
- testmcpy-0.2.7/testmcpy/server/state.py +437 -0
- testmcpy-0.2.7/testmcpy/server/tool_compare_endpoint.py +127 -0
- testmcpy-0.2.7/testmcpy/server/websocket.py +410 -0
- testmcpy-0.2.7/testmcpy/smoke_test.py +428 -0
- testmcpy-0.2.7/testmcpy/src/llm_integration.py +2411 -0
- testmcpy-0.2.7/testmcpy/src/mcp_client.py +856 -0
- testmcpy-0.2.7/testmcpy/src/model_registry.py +509 -0
- testmcpy-0.2.7/testmcpy/src/models.py +274 -0
- testmcpy-0.2.7/testmcpy/src/runner_tools.py +535 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/src/test_runner.py +473 -55
- testmcpy-0.2.7/testmcpy/storage.py +1050 -0
- testmcpy-0.2.7/testmcpy/test_profiles.py +238 -0
- testmcpy-0.2.7/testmcpy/ui/dist/assets/index-CaEBvXci.css +1 -0
- testmcpy-0.2.7/testmcpy/ui/dist/assets/index-DbhZ0GnU.js +649 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/dist/index.html +2 -2
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/package-lock.json +1740 -130
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/package.json +5 -1
- testmcpy-0.2.7/testmcpy/ui/src/App.jsx +465 -0
- testmcpy-0.2.7/testmcpy/ui/src/components/CompareToolsTab.jsx +144 -0
- testmcpy-0.2.7/testmcpy/ui/src/components/ErrorAlert.jsx +68 -0
- testmcpy-0.2.7/testmcpy/ui/src/components/ErrorBoundary.jsx +127 -0
- testmcpy-0.2.7/testmcpy/ui/src/components/LLMProfileSelector.jsx +184 -0
- testmcpy-0.2.7/testmcpy/ui/src/components/LoadingSpinner.jsx +65 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/components/MCPProfileSelector.jsx +46 -12
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/components/SchemaCodeViewer.jsx +10 -9
- testmcpy-0.2.7/testmcpy/ui/src/components/SkeletonLoader.jsx +146 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/components/TestGenerationModal.jsx +248 -71
- testmcpy-0.2.7/testmcpy/ui/src/components/TestProfileSelector.jsx +207 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/components/TestResultPanel.jsx +32 -7
- testmcpy-0.2.7/testmcpy/ui/src/components/ToolComparison.jsx +291 -0
- testmcpy-0.2.7/testmcpy/ui/src/components/ToolDebugModal.jsx +569 -0
- testmcpy-0.2.7/testmcpy/ui/src/contexts/TestRunContext.jsx +381 -0
- testmcpy-0.2.7/testmcpy/ui/src/hooks/useKeyboardShortcuts.js +168 -0
- testmcpy-0.2.7/testmcpy/ui/src/hooks/useSafeFetch.js +182 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/index.css +90 -0
- testmcpy-0.2.7/testmcpy/ui/src/pages/AuthDebugger.jsx +1434 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/pages/ChatInterface.jsx +338 -103
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/pages/Configuration.jsx +4 -6
- testmcpy-0.2.7/testmcpy/ui/src/pages/GenerationHistory.jsx +634 -0
- testmcpy-0.2.7/testmcpy/ui/src/pages/LLMProfiles.jsx +1226 -0
- testmcpy-0.2.7/testmcpy/ui/src/pages/MCPExplorer.jsx +1995 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/pages/MCPProfiles.jsx +107 -45
- testmcpy-0.2.7/testmcpy/ui/src/pages/ProfilesManager.jsx +146 -0
- testmcpy-0.2.7/testmcpy/ui/src/pages/Reports.jsx +572 -0
- testmcpy-0.2.7/testmcpy/ui/src/pages/TestManager.jsx +1557 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/tailwind.config.js +3 -1
- {testmcpy-0.2.4 → testmcpy-0.2.7/testmcpy.egg-info}/PKG-INFO +154 -20
- testmcpy-0.2.7/testmcpy.egg-info/SOURCES.txt +125 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy.egg-info/requires.txt +7 -1
- testmcpy-0.2.4/testmcpy/cli.py +0 -2177
- testmcpy-0.2.4/testmcpy/evals/__init__.py +0 -1
- testmcpy-0.2.4/testmcpy/server/websocket.py +0 -167
- testmcpy-0.2.4/testmcpy/src/llm_integration.py +0 -1228
- testmcpy-0.2.4/testmcpy/src/mcp_client.py +0 -502
- testmcpy-0.2.4/testmcpy/ui/dist/assets/index-45O3yN-_.css +0 -1
- testmcpy-0.2.4/testmcpy/ui/dist/assets/index-rflbClOY.js +0 -458
- testmcpy-0.2.4/testmcpy/ui/src/App.jsx +0 -309
- testmcpy-0.2.4/testmcpy/ui/src/pages/MCPExplorer.jsx +0 -922
- testmcpy-0.2.4/testmcpy/ui/src/pages/TestManager.jsx +0 -589
- testmcpy-0.2.4/testmcpy.egg-info/SOURCES.txt +0 -71
- testmcpy-0.2.4/tests/test_api_optimize_docs.py +0 -264
- testmcpy-0.2.4/tests/test_mcp_client_auth.py +0 -216
- testmcpy-0.2.4/tests/test_url_protection.py +0 -379
- {testmcpy-0.2.4 → testmcpy-0.2.7}/LICENSE +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/MANIFEST.in +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/NOTICE +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/setup.cfg +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/__init__.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/base.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/graphql.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/javascript_client.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/json_yaml.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/protobuf.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/python.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/python_client.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/thrift.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/typescript.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/formatters/typescript_client.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/research/claude_sdk_detailed_exploration.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/research/claude_sdk_working_poc.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/research/test_ollama_tools.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/server/__init__.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/src/__init__.py +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/README.md +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/index.html +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/postcss.config.js +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/components/OptimizeDocsModal.jsx +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/components/ParameterCard.jsx +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/components/TestStatusIndicator.jsx +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/components/TypeBadge.jsx +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/main.jsx +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/utils/__tests__/formatConverters.test.js +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/src/utils/formatConverters.js +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy/ui/vite.config.js +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy.egg-info/dependency_links.txt +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy.egg-info/entry_points.txt +0 -0
- {testmcpy-0.2.4 → testmcpy-0.2.7}/testmcpy.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: testmcpy
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: A comprehensive testing framework for validating LLM tool calling capabilities with MCP services
|
|
5
5
|
Author: Amin Ghadersohi
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -18,7 +18,7 @@ Description-Content-Type: text/markdown
|
|
|
18
18
|
License-File: LICENSE
|
|
19
19
|
License-File: NOTICE
|
|
20
20
|
Requires-Dist: typer<1.0.0,>=0.9.0
|
|
21
|
-
Requires-Dist: rich<
|
|
21
|
+
Requires-Dist: rich<15.0.0,>=13.0.0
|
|
22
22
|
Requires-Dist: pyyaml<7.0,>=6.0
|
|
23
23
|
Requires-Dist: requests<3.0.0,>=2.28.0
|
|
24
24
|
Requires-Dist: aiohttp<4.0.0,>=3.8.0
|
|
@@ -29,6 +29,7 @@ Requires-Dist: httpx<1.0.0,>=0.27.0
|
|
|
29
29
|
Requires-Dist: python-dotenv<2.0.0,>=1.0.0
|
|
30
30
|
Requires-Dist: click<9.0.0,>=8.0.0
|
|
31
31
|
Requires-Dist: shellingham<2.0.0,>=1.3.0
|
|
32
|
+
Requires-Dist: textual<1.0.0,>=0.47.0
|
|
32
33
|
Provides-Extra: dev
|
|
33
34
|
Requires-Dist: ruff>=0.8.0; extra == "dev"
|
|
34
35
|
Requires-Dist: mypy>=1.13.0; extra == "dev"
|
|
@@ -40,17 +41,21 @@ Requires-Dist: build>=1.0.0; extra == "dev"
|
|
|
40
41
|
Requires-Dist: twine>=5.0.0; extra == "dev"
|
|
41
42
|
Requires-Dist: types-pyyaml>=6.0.0; extra == "dev"
|
|
42
43
|
Requires-Dist: types-requests>=2.28.0; extra == "dev"
|
|
44
|
+
Requires-Dist: textual-dev>=1.0.0; extra == "dev"
|
|
43
45
|
Provides-Extra: server
|
|
44
46
|
Requires-Dist: fastapi<1.0.0,>=0.104.0; extra == "server"
|
|
45
47
|
Requires-Dist: uvicorn[standard]<1.0.0,>=0.24.0; extra == "server"
|
|
46
48
|
Requires-Dist: websockets<15.0,>=14.0; extra == "server"
|
|
47
49
|
Provides-Extra: sdk
|
|
48
50
|
Requires-Dist: claude-agent-sdk>=0.1.0; extra == "sdk"
|
|
51
|
+
Provides-Extra: tui
|
|
52
|
+
Requires-Dist: textual>=0.85.0; extra == "tui"
|
|
49
53
|
Provides-Extra: all
|
|
50
54
|
Requires-Dist: fastapi<1.0.0,>=0.104.0; extra == "all"
|
|
51
55
|
Requires-Dist: uvicorn[standard]<1.0.0,>=0.24.0; extra == "all"
|
|
52
56
|
Requires-Dist: websockets<15.0,>=14.0; extra == "all"
|
|
53
57
|
Requires-Dist: claude-agent-sdk>=0.1.0; extra == "all"
|
|
58
|
+
Requires-Dist: textual>=0.85.0; extra == "all"
|
|
54
59
|
Dynamic: license-file
|
|
55
60
|
|
|
56
61
|
<p align="center">
|
|
@@ -109,6 +114,33 @@ That's it! No complex configuration needed to get started.
|
|
|
109
114
|
|
|
110
115
|
## Key Features
|
|
111
116
|
|
|
117
|
+
### Interactive TUI Dashboard (NEW!)
|
|
118
|
+
Beautiful terminal interface for MCP testing - no browser required:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
testmcpy dash # Launch interactive dashboard
|
|
122
|
+
testmcpy dash --auto-refresh # Live connection monitoring
|
|
123
|
+
testmcpy dash --profile prod # Use specific MCP profile
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**TUI Features:**
|
|
127
|
+
- Real-time MCP connection status
|
|
128
|
+
- Interactive tool exploration
|
|
129
|
+
- Live test execution with progress
|
|
130
|
+
- Configuration editor
|
|
131
|
+
- Global search across tools, tests, and settings
|
|
132
|
+
- Help system with keyboard shortcuts (press `?`)
|
|
133
|
+
- Multiple themes (default, light, high contrast)
|
|
134
|
+
|
|
135
|
+
**Quick CLI Commands (no TUI):**
|
|
136
|
+
```bash
|
|
137
|
+
testmcpy profiles # List MCP profiles (table)
|
|
138
|
+
testmcpy status # Connection status check
|
|
139
|
+
testmcpy explore-cli # Browse tools (non-interactive)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
[Screenshot: TUI dashboard showing profiles, quick actions, and keyboard shortcuts]
|
|
143
|
+
|
|
112
144
|
### Multi-Provider Support
|
|
113
145
|
Test with **Claude**, **GPT-4**, **Llama**, and other models. Works with both paid APIs and free local models via Ollama.
|
|
114
146
|
|
|
@@ -242,26 +274,62 @@ pip install 'testmcpy[all]'
|
|
|
242
274
|
|
|
243
275
|
### 1. Configuration
|
|
244
276
|
|
|
245
|
-
Run the interactive setup wizard:
|
|
277
|
+
Run the interactive setup wizard to create configuration files:
|
|
246
278
|
|
|
247
279
|
```bash
|
|
248
280
|
testmcpy setup
|
|
249
281
|
```
|
|
250
282
|
|
|
251
|
-
|
|
283
|
+
This will guide you through:
|
|
284
|
+
- **LLM Provider setup**: Choose between Claude (Anthropic), GPT-4 (OpenAI), or local Ollama models
|
|
285
|
+
- **MCP Service setup**: Configure your MCP server URL and authentication
|
|
286
|
+
- **API Key management**: Detects keys from environment and saves them to `.llm_providers.yaml`
|
|
252
287
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
288
|
+
The setup command creates two files in your current directory:
|
|
289
|
+
|
|
290
|
+
**`.llm_providers.yaml`** - LLM configuration with API keys:
|
|
291
|
+
|
|
292
|
+
```yaml
|
|
293
|
+
default: prod
|
|
294
|
+
|
|
295
|
+
profiles:
|
|
296
|
+
prod:
|
|
297
|
+
name: "Production"
|
|
298
|
+
description: "High-quality models for production use"
|
|
299
|
+
providers:
|
|
300
|
+
- name: "Claude claude-sonnet-4-5"
|
|
301
|
+
provider: "anthropic"
|
|
302
|
+
model: "claude-sonnet-4-5"
|
|
303
|
+
api_key: "your-anthropic-api-key-here" # API key stored directly
|
|
304
|
+
timeout: 60
|
|
305
|
+
default: true
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**`.mcp_services.yaml`** - MCP server profiles:
|
|
309
|
+
|
|
310
|
+
```yaml
|
|
311
|
+
default: prod
|
|
312
|
+
|
|
313
|
+
profiles:
|
|
314
|
+
prod:
|
|
315
|
+
name: "Production"
|
|
316
|
+
description: "Production MCP service"
|
|
317
|
+
mcps:
|
|
318
|
+
- name: "Preset Superset"
|
|
319
|
+
mcp_url: "https://your-workspace.preset.io/mcp"
|
|
320
|
+
auth:
|
|
321
|
+
auth_type: "jwt" # or "bearer" or "none"
|
|
322
|
+
api_url: "https://api.app.preset.io/v1/auth/"
|
|
323
|
+
api_token: "your-api-token"
|
|
324
|
+
api_secret: "your-api-secret"
|
|
325
|
+
timeout: 30
|
|
326
|
+
rate_limit_rpm: 60
|
|
327
|
+
default: true
|
|
262
328
|
```
|
|
263
329
|
|
|
264
|
-
**Configuration priority:** CLI options >
|
|
330
|
+
**Configuration priority:** CLI options > LLM Profile (.llm_providers.yaml) > MCP Profile (.mcp_services.yaml) > `.env` > Environment variables
|
|
331
|
+
|
|
332
|
+
**Note:** The setup command is **idempotent** - it's safe to run multiple times. Use `--force` to overwrite existing files.
|
|
265
333
|
|
|
266
334
|
### 2. Test Your MCP Service
|
|
267
335
|
|
|
@@ -319,7 +387,12 @@ testmcpy run tests/ --model claude-haiku-4-5
|
|
|
319
387
|
|
|
320
388
|
| Command | Description |
|
|
321
389
|
|---------|-------------|
|
|
390
|
+
| `testmcpy dash` | **Launch interactive TUI dashboard** |
|
|
322
391
|
| `testmcpy setup` | Interactive configuration wizard |
|
|
392
|
+
| `testmcpy profiles` | List MCP profiles (table) |
|
|
393
|
+
| `testmcpy status` | Show MCP connection status |
|
|
394
|
+
| `testmcpy explore-cli` | Browse tools (non-interactive) |
|
|
395
|
+
| `testmcpy explorer` | Launch TUI tool explorer |
|
|
323
396
|
| `testmcpy tools` | List available MCP tools |
|
|
324
397
|
| `testmcpy research` | Test LLM tool-calling capabilities |
|
|
325
398
|
| `testmcpy run <path>` | Execute test suite |
|
|
@@ -329,14 +402,55 @@ testmcpy run tests/ --model claude-haiku-4-5
|
|
|
329
402
|
| `testmcpy config-cmd` | View current configuration |
|
|
330
403
|
| `testmcpy doctor` | Diagnose installation issues |
|
|
331
404
|
|
|
405
|
+
### TUI Keyboard Shortcuts
|
|
406
|
+
|
|
407
|
+
**Global Navigation:**
|
|
408
|
+
- `h` - Home screen
|
|
409
|
+
- `e` - Explorer (MCP tools)
|
|
410
|
+
- `5` - Configuration
|
|
411
|
+
- `?` - Help modal
|
|
412
|
+
- `/` - Global search
|
|
413
|
+
- `q` - Quit (with confirmation)
|
|
414
|
+
- `F5` - Refresh
|
|
415
|
+
|
|
416
|
+
**Home Screen:**
|
|
417
|
+
- `1-5` - Quick actions (Tests, Explorer, Chat, Optimize, Config)
|
|
418
|
+
- `p` - Switch profile
|
|
419
|
+
- `Space` - Connect/disconnect
|
|
420
|
+
|
|
421
|
+
**Explorer:**
|
|
422
|
+
- `↑↓` or `j/k` - Navigate
|
|
423
|
+
- `Enter` - View details
|
|
424
|
+
- `t` - Create test
|
|
425
|
+
- `o` - Optimize docs
|
|
426
|
+
|
|
427
|
+
**Configuration:**
|
|
428
|
+
- `Tab` - Next field
|
|
429
|
+
- `s` - Save changes
|
|
430
|
+
- `q` - Quit without saving
|
|
431
|
+
|
|
332
432
|
## LLM Providers
|
|
333
433
|
|
|
434
|
+
Configure LLM providers in `.llm_providers.yaml`. See `.llm_providers.yaml.example` for examples.
|
|
435
|
+
|
|
334
436
|
### Anthropic (Recommended)
|
|
335
437
|
Best tool-calling accuracy, native MCP support:
|
|
336
438
|
|
|
337
439
|
```bash
|
|
440
|
+
# Set API key in .env or ~/.testmcpy
|
|
338
441
|
ANTHROPIC_API_KEY=sk-ant-your-key
|
|
339
|
-
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
```yaml
|
|
445
|
+
# Configure in .llm_providers.yaml
|
|
446
|
+
prod:
|
|
447
|
+
name: "Production"
|
|
448
|
+
providers:
|
|
449
|
+
- name: "Claude Sonnet 4.5"
|
|
450
|
+
provider: "anthropic"
|
|
451
|
+
model: "claude-sonnet-4-5"
|
|
452
|
+
api_key_env: "ANTHROPIC_API_KEY"
|
|
453
|
+
default: true
|
|
340
454
|
```
|
|
341
455
|
|
|
342
456
|
**Available models:** `claude-haiku-4-5`, `claude-sonnet-4-5`, `claude-opus-4-1`
|
|
@@ -352,16 +466,36 @@ brew install ollama # macOS
|
|
|
352
466
|
# Start Ollama and pull a model
|
|
353
467
|
ollama serve
|
|
354
468
|
ollama pull llama3.1:8b
|
|
469
|
+
```
|
|
355
470
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
471
|
+
```yaml
|
|
472
|
+
# Configure in .llm_providers.yaml
|
|
473
|
+
local:
|
|
474
|
+
name: "Local Only"
|
|
475
|
+
providers:
|
|
476
|
+
- name: "Ollama Llama"
|
|
477
|
+
provider: "ollama"
|
|
478
|
+
model: "llama3.1:8b"
|
|
479
|
+
base_url: "http://localhost:11434"
|
|
480
|
+
default: true
|
|
359
481
|
```
|
|
360
482
|
|
|
361
483
|
### OpenAI
|
|
362
484
|
```bash
|
|
485
|
+
# Set API key in .env or ~/.testmcpy
|
|
363
486
|
OPENAI_API_KEY=sk-your-key
|
|
364
|
-
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
```yaml
|
|
490
|
+
# Configure in .llm_providers.yaml
|
|
491
|
+
openai:
|
|
492
|
+
name: "OpenAI"
|
|
493
|
+
providers:
|
|
494
|
+
- name: "GPT-4"
|
|
495
|
+
provider: "openai"
|
|
496
|
+
model: "gpt-4-turbo"
|
|
497
|
+
api_key_env: "OPENAI_API_KEY"
|
|
498
|
+
default: true
|
|
365
499
|
```
|
|
366
500
|
|
|
367
501
|
## Built-in Evaluators
|
|
@@ -487,6 +621,6 @@ By contributing, you agree that your contributions will be licensed under Apache
|
|
|
487
621
|
|
|
488
622
|
## Acknowledgments
|
|
489
623
|
|
|
490
|
-
Built
|
|
624
|
+
Built to enable better LLM testing and integration with Model Context Protocol services.
|
|
491
625
|
|
|
492
626
|
Special thanks to the MCP community and all our contributors!
|
|
@@ -54,6 +54,33 @@ That's it! No complex configuration needed to get started.
|
|
|
54
54
|
|
|
55
55
|
## Key Features
|
|
56
56
|
|
|
57
|
+
### Interactive TUI Dashboard (NEW!)
|
|
58
|
+
Beautiful terminal interface for MCP testing - no browser required:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
testmcpy dash # Launch interactive dashboard
|
|
62
|
+
testmcpy dash --auto-refresh # Live connection monitoring
|
|
63
|
+
testmcpy dash --profile prod # Use specific MCP profile
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**TUI Features:**
|
|
67
|
+
- Real-time MCP connection status
|
|
68
|
+
- Interactive tool exploration
|
|
69
|
+
- Live test execution with progress
|
|
70
|
+
- Configuration editor
|
|
71
|
+
- Global search across tools, tests, and settings
|
|
72
|
+
- Help system with keyboard shortcuts (press `?`)
|
|
73
|
+
- Multiple themes (default, light, high contrast)
|
|
74
|
+
|
|
75
|
+
**Quick CLI Commands (no TUI):**
|
|
76
|
+
```bash
|
|
77
|
+
testmcpy profiles # List MCP profiles (table)
|
|
78
|
+
testmcpy status # Connection status check
|
|
79
|
+
testmcpy explore-cli # Browse tools (non-interactive)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
[Screenshot: TUI dashboard showing profiles, quick actions, and keyboard shortcuts]
|
|
83
|
+
|
|
57
84
|
### Multi-Provider Support
|
|
58
85
|
Test with **Claude**, **GPT-4**, **Llama**, and other models. Works with both paid APIs and free local models via Ollama.
|
|
59
86
|
|
|
@@ -187,26 +214,62 @@ pip install 'testmcpy[all]'
|
|
|
187
214
|
|
|
188
215
|
### 1. Configuration
|
|
189
216
|
|
|
190
|
-
Run the interactive setup wizard:
|
|
217
|
+
Run the interactive setup wizard to create configuration files:
|
|
191
218
|
|
|
192
219
|
```bash
|
|
193
220
|
testmcpy setup
|
|
194
221
|
```
|
|
195
222
|
|
|
196
|
-
|
|
223
|
+
This will guide you through:
|
|
224
|
+
- **LLM Provider setup**: Choose between Claude (Anthropic), GPT-4 (OpenAI), or local Ollama models
|
|
225
|
+
- **MCP Service setup**: Configure your MCP server URL and authentication
|
|
226
|
+
- **API Key management**: Detects keys from environment and saves them to `.llm_providers.yaml`
|
|
197
227
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
228
|
+
The setup command creates two files in your current directory:
|
|
229
|
+
|
|
230
|
+
**`.llm_providers.yaml`** - LLM configuration with API keys:
|
|
231
|
+
|
|
232
|
+
```yaml
|
|
233
|
+
default: prod
|
|
234
|
+
|
|
235
|
+
profiles:
|
|
236
|
+
prod:
|
|
237
|
+
name: "Production"
|
|
238
|
+
description: "High-quality models for production use"
|
|
239
|
+
providers:
|
|
240
|
+
- name: "Claude claude-sonnet-4-5"
|
|
241
|
+
provider: "anthropic"
|
|
242
|
+
model: "claude-sonnet-4-5"
|
|
243
|
+
api_key: "your-anthropic-api-key-here" # API key stored directly
|
|
244
|
+
timeout: 60
|
|
245
|
+
default: true
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**`.mcp_services.yaml`** - MCP server profiles:
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
default: prod
|
|
252
|
+
|
|
253
|
+
profiles:
|
|
254
|
+
prod:
|
|
255
|
+
name: "Production"
|
|
256
|
+
description: "Production MCP service"
|
|
257
|
+
mcps:
|
|
258
|
+
- name: "Preset Superset"
|
|
259
|
+
mcp_url: "https://your-workspace.preset.io/mcp"
|
|
260
|
+
auth:
|
|
261
|
+
auth_type: "jwt" # or "bearer" or "none"
|
|
262
|
+
api_url: "https://api.app.preset.io/v1/auth/"
|
|
263
|
+
api_token: "your-api-token"
|
|
264
|
+
api_secret: "your-api-secret"
|
|
265
|
+
timeout: 30
|
|
266
|
+
rate_limit_rpm: 60
|
|
267
|
+
default: true
|
|
207
268
|
```
|
|
208
269
|
|
|
209
|
-
**Configuration priority:** CLI options >
|
|
270
|
+
**Configuration priority:** CLI options > LLM Profile (.llm_providers.yaml) > MCP Profile (.mcp_services.yaml) > `.env` > Environment variables
|
|
271
|
+
|
|
272
|
+
**Note:** The setup command is **idempotent** - it's safe to run multiple times. Use `--force` to overwrite existing files.
|
|
210
273
|
|
|
211
274
|
### 2. Test Your MCP Service
|
|
212
275
|
|
|
@@ -264,7 +327,12 @@ testmcpy run tests/ --model claude-haiku-4-5
|
|
|
264
327
|
|
|
265
328
|
| Command | Description |
|
|
266
329
|
|---------|-------------|
|
|
330
|
+
| `testmcpy dash` | **Launch interactive TUI dashboard** |
|
|
267
331
|
| `testmcpy setup` | Interactive configuration wizard |
|
|
332
|
+
| `testmcpy profiles` | List MCP profiles (table) |
|
|
333
|
+
| `testmcpy status` | Show MCP connection status |
|
|
334
|
+
| `testmcpy explore-cli` | Browse tools (non-interactive) |
|
|
335
|
+
| `testmcpy explorer` | Launch TUI tool explorer |
|
|
268
336
|
| `testmcpy tools` | List available MCP tools |
|
|
269
337
|
| `testmcpy research` | Test LLM tool-calling capabilities |
|
|
270
338
|
| `testmcpy run <path>` | Execute test suite |
|
|
@@ -274,14 +342,55 @@ testmcpy run tests/ --model claude-haiku-4-5
|
|
|
274
342
|
| `testmcpy config-cmd` | View current configuration |
|
|
275
343
|
| `testmcpy doctor` | Diagnose installation issues |
|
|
276
344
|
|
|
345
|
+
### TUI Keyboard Shortcuts
|
|
346
|
+
|
|
347
|
+
**Global Navigation:**
|
|
348
|
+
- `h` - Home screen
|
|
349
|
+
- `e` - Explorer (MCP tools)
|
|
350
|
+
- `5` - Configuration
|
|
351
|
+
- `?` - Help modal
|
|
352
|
+
- `/` - Global search
|
|
353
|
+
- `q` - Quit (with confirmation)
|
|
354
|
+
- `F5` - Refresh
|
|
355
|
+
|
|
356
|
+
**Home Screen:**
|
|
357
|
+
- `1-5` - Quick actions (Tests, Explorer, Chat, Optimize, Config)
|
|
358
|
+
- `p` - Switch profile
|
|
359
|
+
- `Space` - Connect/disconnect
|
|
360
|
+
|
|
361
|
+
**Explorer:**
|
|
362
|
+
- `↑↓` or `j/k` - Navigate
|
|
363
|
+
- `Enter` - View details
|
|
364
|
+
- `t` - Create test
|
|
365
|
+
- `o` - Optimize docs
|
|
366
|
+
|
|
367
|
+
**Configuration:**
|
|
368
|
+
- `Tab` - Next field
|
|
369
|
+
- `s` - Save changes
|
|
370
|
+
- `q` - Quit without saving
|
|
371
|
+
|
|
277
372
|
## LLM Providers
|
|
278
373
|
|
|
374
|
+
Configure LLM providers in `.llm_providers.yaml`. See `.llm_providers.yaml.example` for examples.
|
|
375
|
+
|
|
279
376
|
### Anthropic (Recommended)
|
|
280
377
|
Best tool-calling accuracy, native MCP support:
|
|
281
378
|
|
|
282
379
|
```bash
|
|
380
|
+
# Set API key in .env or ~/.testmcpy
|
|
283
381
|
ANTHROPIC_API_KEY=sk-ant-your-key
|
|
284
|
-
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
```yaml
|
|
385
|
+
# Configure in .llm_providers.yaml
|
|
386
|
+
prod:
|
|
387
|
+
name: "Production"
|
|
388
|
+
providers:
|
|
389
|
+
- name: "Claude Sonnet 4.5"
|
|
390
|
+
provider: "anthropic"
|
|
391
|
+
model: "claude-sonnet-4-5"
|
|
392
|
+
api_key_env: "ANTHROPIC_API_KEY"
|
|
393
|
+
default: true
|
|
285
394
|
```
|
|
286
395
|
|
|
287
396
|
**Available models:** `claude-haiku-4-5`, `claude-sonnet-4-5`, `claude-opus-4-1`
|
|
@@ -297,16 +406,36 @@ brew install ollama # macOS
|
|
|
297
406
|
# Start Ollama and pull a model
|
|
298
407
|
ollama serve
|
|
299
408
|
ollama pull llama3.1:8b
|
|
409
|
+
```
|
|
300
410
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
411
|
+
```yaml
|
|
412
|
+
# Configure in .llm_providers.yaml
|
|
413
|
+
local:
|
|
414
|
+
name: "Local Only"
|
|
415
|
+
providers:
|
|
416
|
+
- name: "Ollama Llama"
|
|
417
|
+
provider: "ollama"
|
|
418
|
+
model: "llama3.1:8b"
|
|
419
|
+
base_url: "http://localhost:11434"
|
|
420
|
+
default: true
|
|
304
421
|
```
|
|
305
422
|
|
|
306
423
|
### OpenAI
|
|
307
424
|
```bash
|
|
425
|
+
# Set API key in .env or ~/.testmcpy
|
|
308
426
|
OPENAI_API_KEY=sk-your-key
|
|
309
|
-
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
```yaml
|
|
430
|
+
# Configure in .llm_providers.yaml
|
|
431
|
+
openai:
|
|
432
|
+
name: "OpenAI"
|
|
433
|
+
providers:
|
|
434
|
+
- name: "GPT-4"
|
|
435
|
+
provider: "openai"
|
|
436
|
+
model: "gpt-4-turbo"
|
|
437
|
+
api_key_env: "OPENAI_API_KEY"
|
|
438
|
+
default: true
|
|
310
439
|
```
|
|
311
440
|
|
|
312
441
|
## Built-in Evaluators
|
|
@@ -432,6 +561,6 @@ By contributing, you agree that your contributions will be licensed under Apache
|
|
|
432
561
|
|
|
433
562
|
## Acknowledgments
|
|
434
563
|
|
|
435
|
-
Built
|
|
564
|
+
Built to enable better LLM testing and integration with Model Context Protocol services.
|
|
436
565
|
|
|
437
566
|
Special thanks to the MCP community and all our contributors!
|
|
@@ -88,7 +88,7 @@ testmcpy = [
|
|
|
88
88
|
|
|
89
89
|
[project]
|
|
90
90
|
name = "testmcpy"
|
|
91
|
-
version = "0.2.
|
|
91
|
+
version = "0.2.7"
|
|
92
92
|
description = "A comprehensive testing framework for validating LLM tool calling capabilities with MCP services"
|
|
93
93
|
authors = [{name = "Amin Ghadersohi"}]
|
|
94
94
|
license = "Apache-2.0"
|
|
@@ -104,7 +104,7 @@ classifiers = [
|
|
|
104
104
|
]
|
|
105
105
|
dependencies = [
|
|
106
106
|
"typer>=0.9.0,<1.0.0",
|
|
107
|
-
"rich>=13.0.0,<
|
|
107
|
+
"rich>=13.0.0,<15.0.0",
|
|
108
108
|
"pyyaml>=6.0,<7.0",
|
|
109
109
|
"requests>=2.28.0,<3.0.0",
|
|
110
110
|
"aiohttp>=3.8.0,<4.0.0",
|
|
@@ -115,6 +115,7 @@ dependencies = [
|
|
|
115
115
|
"python-dotenv>=1.0.0,<2.0.0",
|
|
116
116
|
"click>=8.0.0,<9.0.0",
|
|
117
117
|
"shellingham>=1.3.0,<2.0.0",
|
|
118
|
+
"textual>=0.47.0,<1.0.0",
|
|
118
119
|
]
|
|
119
120
|
|
|
120
121
|
[project.optional-dependencies]
|
|
@@ -129,6 +130,7 @@ dev = [
|
|
|
129
130
|
"twine>=5.0.0",
|
|
130
131
|
"types-pyyaml>=6.0.0",
|
|
131
132
|
"types-requests>=2.28.0",
|
|
133
|
+
"textual-dev>=1.0.0",
|
|
132
134
|
]
|
|
133
135
|
server = [
|
|
134
136
|
"fastapi>=0.104.0,<1.0.0",
|
|
@@ -138,11 +140,15 @@ server = [
|
|
|
138
140
|
sdk = [
|
|
139
141
|
"claude-agent-sdk>=0.1.0",
|
|
140
142
|
]
|
|
143
|
+
tui = [
|
|
144
|
+
"textual>=0.85.0",
|
|
145
|
+
]
|
|
141
146
|
all = [
|
|
142
147
|
"fastapi>=0.104.0,<1.0.0",
|
|
143
148
|
"uvicorn[standard]>=0.24.0,<1.0.0",
|
|
144
149
|
"websockets>=14.0,<15.0",
|
|
145
150
|
"claude-agent-sdk>=0.1.0",
|
|
151
|
+
"textual>=0.85.0",
|
|
146
152
|
]
|
|
147
153
|
|
|
148
154
|
[project.scripts]
|