testmcpy 0.2.4__tar.gz → 0.2.6__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.
Files changed (141) hide show
  1. {testmcpy-0.2.4/testmcpy.egg-info → testmcpy-0.2.6}/PKG-INFO +154 -20
  2. {testmcpy-0.2.4 → testmcpy-0.2.6}/README.md +147 -18
  3. {testmcpy-0.2.4 → testmcpy-0.2.6}/pyproject.toml +8 -2
  4. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/__init__.py +1 -1
  5. testmcpy-0.2.6/testmcpy/auth_debugger.py +985 -0
  6. testmcpy-0.2.6/testmcpy/auth_flow_recorder.py +688 -0
  7. testmcpy-0.2.6/testmcpy/cli/__init__.py +14 -0
  8. testmcpy-0.2.6/testmcpy/cli/app.py +103 -0
  9. testmcpy-0.2.6/testmcpy/cli/commands/__init__.py +1 -0
  10. testmcpy-0.2.6/testmcpy/cli/commands/mcp.py +365 -0
  11. testmcpy-0.2.6/testmcpy/cli/commands/run.py +933 -0
  12. testmcpy-0.2.6/testmcpy/cli/commands/server.py +1276 -0
  13. testmcpy-0.2.6/testmcpy/cli/commands/tools.py +438 -0
  14. testmcpy-0.2.6/testmcpy/cli/commands/tui.py +207 -0
  15. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/config.py +156 -144
  16. testmcpy-0.2.6/testmcpy/core/__init__.py +20 -0
  17. testmcpy-0.2.6/testmcpy/core/chat_session.py +391 -0
  18. testmcpy-0.2.6/testmcpy/core/docs_optimizer.py +208 -0
  19. testmcpy-0.2.6/testmcpy/core/mcp_manager.py +328 -0
  20. testmcpy-0.2.6/testmcpy/core/tool_comparison.py +443 -0
  21. testmcpy-0.2.6/testmcpy/core/tool_discovery.py +361 -0
  22. testmcpy-0.2.6/testmcpy/error_handlers.py +70 -0
  23. testmcpy-0.2.6/testmcpy/evals/__init__.py +57 -0
  24. testmcpy-0.2.6/testmcpy/evals/auth_evaluators.py +556 -0
  25. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/evals/base_evaluators.py +627 -17
  26. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/curl.py +2 -7
  27. testmcpy-0.2.6/testmcpy/llm_profiles.py +243 -0
  28. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/mcp_profiles.py +28 -17
  29. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/research/claude_sdk_poc.py +1 -1
  30. testmcpy-0.2.6/testmcpy/server/api.py +865 -0
  31. testmcpy-0.2.4/testmcpy/server/api.py → testmcpy-0.2.6/testmcpy/server/api.py.bak +352 -5
  32. testmcpy-0.2.6/testmcpy/server/helpers/__init__.py +19 -0
  33. testmcpy-0.2.6/testmcpy/server/helpers/mcp_config.py +236 -0
  34. testmcpy-0.2.6/testmcpy/server/models.py +261 -0
  35. testmcpy-0.2.6/testmcpy/server/routers/__init__.py +8 -0
  36. testmcpy-0.2.6/testmcpy/server/routers/auth.py +338 -0
  37. testmcpy-0.2.6/testmcpy/server/routers/generation_logs.py +185 -0
  38. testmcpy-0.2.6/testmcpy/server/routers/llm.py +414 -0
  39. testmcpy-0.2.6/testmcpy/server/routers/mcp_profiles.py +833 -0
  40. testmcpy-0.2.6/testmcpy/server/routers/results.py +277 -0
  41. testmcpy-0.2.6/testmcpy/server/routers/smoke_reports.py +130 -0
  42. testmcpy-0.2.6/testmcpy/server/routers/test_profiles.py +187 -0
  43. testmcpy-0.2.6/testmcpy/server/routers/tests.py +1277 -0
  44. testmcpy-0.2.6/testmcpy/server/routers/tools.py +801 -0
  45. testmcpy-0.2.6/testmcpy/server/state.py +437 -0
  46. testmcpy-0.2.6/testmcpy/server/tool_compare_endpoint.py +127 -0
  47. testmcpy-0.2.6/testmcpy/server/websocket.py +410 -0
  48. testmcpy-0.2.6/testmcpy/smoke_test.py +428 -0
  49. testmcpy-0.2.6/testmcpy/src/llm_integration.py +2411 -0
  50. testmcpy-0.2.6/testmcpy/src/mcp_client.py +856 -0
  51. testmcpy-0.2.6/testmcpy/src/model_registry.py +509 -0
  52. testmcpy-0.2.6/testmcpy/src/models.py +274 -0
  53. testmcpy-0.2.6/testmcpy/src/runner_tools.py +535 -0
  54. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/src/test_runner.py +473 -55
  55. testmcpy-0.2.6/testmcpy/storage.py +1050 -0
  56. testmcpy-0.2.6/testmcpy/test_profiles.py +238 -0
  57. testmcpy-0.2.6/testmcpy/ui/dist/assets/index-CaEBvXci.css +1 -0
  58. testmcpy-0.2.6/testmcpy/ui/dist/assets/index-DbhZ0GnU.js +649 -0
  59. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/dist/index.html +2 -2
  60. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/package-lock.json +1740 -130
  61. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/package.json +5 -1
  62. testmcpy-0.2.6/testmcpy/ui/src/App.jsx +465 -0
  63. testmcpy-0.2.6/testmcpy/ui/src/components/CompareToolsTab.jsx +144 -0
  64. testmcpy-0.2.6/testmcpy/ui/src/components/ErrorAlert.jsx +68 -0
  65. testmcpy-0.2.6/testmcpy/ui/src/components/ErrorBoundary.jsx +127 -0
  66. testmcpy-0.2.6/testmcpy/ui/src/components/LLMProfileSelector.jsx +184 -0
  67. testmcpy-0.2.6/testmcpy/ui/src/components/LoadingSpinner.jsx +65 -0
  68. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/components/MCPProfileSelector.jsx +46 -12
  69. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/components/SchemaCodeViewer.jsx +10 -9
  70. testmcpy-0.2.6/testmcpy/ui/src/components/SkeletonLoader.jsx +146 -0
  71. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/components/TestGenerationModal.jsx +248 -71
  72. testmcpy-0.2.6/testmcpy/ui/src/components/TestProfileSelector.jsx +207 -0
  73. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/components/TestResultPanel.jsx +32 -7
  74. testmcpy-0.2.6/testmcpy/ui/src/components/ToolComparison.jsx +291 -0
  75. testmcpy-0.2.6/testmcpy/ui/src/components/ToolDebugModal.jsx +569 -0
  76. testmcpy-0.2.6/testmcpy/ui/src/contexts/TestRunContext.jsx +381 -0
  77. testmcpy-0.2.6/testmcpy/ui/src/hooks/useKeyboardShortcuts.js +168 -0
  78. testmcpy-0.2.6/testmcpy/ui/src/hooks/useSafeFetch.js +182 -0
  79. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/index.css +90 -0
  80. testmcpy-0.2.6/testmcpy/ui/src/pages/AuthDebugger.jsx +1434 -0
  81. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/pages/ChatInterface.jsx +338 -103
  82. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/pages/Configuration.jsx +4 -6
  83. testmcpy-0.2.6/testmcpy/ui/src/pages/GenerationHistory.jsx +634 -0
  84. testmcpy-0.2.6/testmcpy/ui/src/pages/LLMProfiles.jsx +1226 -0
  85. testmcpy-0.2.6/testmcpy/ui/src/pages/MCPExplorer.jsx +1995 -0
  86. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/pages/MCPProfiles.jsx +107 -45
  87. testmcpy-0.2.6/testmcpy/ui/src/pages/ProfilesManager.jsx +146 -0
  88. testmcpy-0.2.6/testmcpy/ui/src/pages/Reports.jsx +572 -0
  89. testmcpy-0.2.6/testmcpy/ui/src/pages/TestManager.jsx +1557 -0
  90. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/tailwind.config.js +3 -1
  91. {testmcpy-0.2.4 → testmcpy-0.2.6/testmcpy.egg-info}/PKG-INFO +154 -20
  92. testmcpy-0.2.6/testmcpy.egg-info/SOURCES.txt +125 -0
  93. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy.egg-info/requires.txt +7 -1
  94. testmcpy-0.2.4/testmcpy/cli.py +0 -2177
  95. testmcpy-0.2.4/testmcpy/evals/__init__.py +0 -1
  96. testmcpy-0.2.4/testmcpy/server/websocket.py +0 -167
  97. testmcpy-0.2.4/testmcpy/src/llm_integration.py +0 -1228
  98. testmcpy-0.2.4/testmcpy/src/mcp_client.py +0 -502
  99. testmcpy-0.2.4/testmcpy/ui/dist/assets/index-45O3yN-_.css +0 -1
  100. testmcpy-0.2.4/testmcpy/ui/dist/assets/index-rflbClOY.js +0 -458
  101. testmcpy-0.2.4/testmcpy/ui/src/App.jsx +0 -309
  102. testmcpy-0.2.4/testmcpy/ui/src/pages/MCPExplorer.jsx +0 -922
  103. testmcpy-0.2.4/testmcpy/ui/src/pages/TestManager.jsx +0 -589
  104. testmcpy-0.2.4/testmcpy.egg-info/SOURCES.txt +0 -71
  105. testmcpy-0.2.4/tests/test_api_optimize_docs.py +0 -264
  106. testmcpy-0.2.4/tests/test_mcp_client_auth.py +0 -216
  107. testmcpy-0.2.4/tests/test_url_protection.py +0 -379
  108. {testmcpy-0.2.4 → testmcpy-0.2.6}/LICENSE +0 -0
  109. {testmcpy-0.2.4 → testmcpy-0.2.6}/MANIFEST.in +0 -0
  110. {testmcpy-0.2.4 → testmcpy-0.2.6}/NOTICE +0 -0
  111. {testmcpy-0.2.4 → testmcpy-0.2.6}/setup.cfg +0 -0
  112. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/__init__.py +0 -0
  113. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/base.py +0 -0
  114. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/graphql.py +0 -0
  115. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/javascript_client.py +0 -0
  116. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/json_yaml.py +0 -0
  117. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/protobuf.py +0 -0
  118. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/python.py +0 -0
  119. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/python_client.py +0 -0
  120. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/thrift.py +0 -0
  121. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/typescript.py +0 -0
  122. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/formatters/typescript_client.py +0 -0
  123. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/research/claude_sdk_detailed_exploration.py +0 -0
  124. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/research/claude_sdk_working_poc.py +0 -0
  125. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/research/test_ollama_tools.py +0 -0
  126. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/server/__init__.py +0 -0
  127. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/src/__init__.py +0 -0
  128. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/README.md +0 -0
  129. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/index.html +0 -0
  130. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/postcss.config.js +0 -0
  131. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/components/OptimizeDocsModal.jsx +0 -0
  132. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/components/ParameterCard.jsx +0 -0
  133. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/components/TestStatusIndicator.jsx +0 -0
  134. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/components/TypeBadge.jsx +0 -0
  135. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/main.jsx +0 -0
  136. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/utils/__tests__/formatConverters.test.js +0 -0
  137. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/src/utils/formatConverters.js +0 -0
  138. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy/ui/vite.config.js +0 -0
  139. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy.egg-info/dependency_links.txt +0 -0
  140. {testmcpy-0.2.4 → testmcpy-0.2.6}/testmcpy.egg-info/entry_points.txt +0 -0
  141. {testmcpy-0.2.4 → testmcpy-0.2.6}/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.4
3
+ Version: 0.2.6
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<14.0.0,>=13.0.0
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
- Or manually create `~/.testmcpy`:
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
- ```bash
254
- # MCP Service
255
- MCP_URL=http://localhost:5008/mcp/
256
- MCP_AUTH_TOKEN=your_bearer_token
257
-
258
- # LLM Provider (choose one)
259
- DEFAULT_PROVIDER=anthropic
260
- DEFAULT_MODEL=claude-haiku-4-5
261
- ANTHROPIC_API_KEY=sk-ant-...
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 > `.env` > `~/.testmcpy` > Environment variables > Defaults
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
- DEFAULT_MODEL=claude-haiku-4-5 # Fast & cost-effective
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
- # Configure testmcpy
357
- DEFAULT_PROVIDER=ollama
358
- DEFAULT_MODEL=llama3.1:8b
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
- DEFAULT_MODEL=gpt-4-turbo
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 by the team at [Preset](https://preset.io) to enable better LLM testing and integration with Apache Superset and beyond.
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
- Or manually create `~/.testmcpy`:
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
- ```bash
199
- # MCP Service
200
- MCP_URL=http://localhost:5008/mcp/
201
- MCP_AUTH_TOKEN=your_bearer_token
202
-
203
- # LLM Provider (choose one)
204
- DEFAULT_PROVIDER=anthropic
205
- DEFAULT_MODEL=claude-haiku-4-5
206
- ANTHROPIC_API_KEY=sk-ant-...
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 > `.env` > `~/.testmcpy` > Environment variables > Defaults
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
- DEFAULT_MODEL=claude-haiku-4-5 # Fast & cost-effective
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
- # Configure testmcpy
302
- DEFAULT_PROVIDER=ollama
303
- DEFAULT_MODEL=llama3.1:8b
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
- DEFAULT_MODEL=gpt-4-turbo
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 by the team at [Preset](https://preset.io) to enable better LLM testing and integration with Apache Superset and beyond.
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.4"
91
+ version = "0.2.6"
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,<14.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]
@@ -6,4 +6,4 @@ capabilities with MCP (Model Context Protocol) services.
6
6
  """
7
7
 
8
8
  __version__ = "0.2.0"
9
- __author__ = "Amin Ghadersohi"
9
+ __author__ = "testmcpy Contributors"