testmcpy 0.2.8__tar.gz → 0.2.10__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.8/testmcpy.egg-info → testmcpy-0.2.10}/PKG-INFO +1 -1
- {testmcpy-0.2.8 → testmcpy-0.2.10}/pyproject.toml +1 -1
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/mcp_profiles.py +5 -15
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/mcp_profiles.py +27 -21
- {testmcpy-0.2.8 → testmcpy-0.2.10/testmcpy.egg-info}/PKG-INFO +1 -1
- {testmcpy-0.2.8 → testmcpy-0.2.10}/LICENSE +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/MANIFEST.in +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/NOTICE +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/README.md +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/setup.cfg +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/auth_debugger.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/auth_flow_recorder.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/cli/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/cli/app.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/cli/commands/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/cli/commands/mcp.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/cli/commands/run.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/cli/commands/server.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/cli/commands/tools.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/cli/commands/tui.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/config.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/core/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/core/chat_session.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/core/docs_optimizer.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/core/mcp_manager.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/core/tool_comparison.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/core/tool_discovery.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/error_handlers.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/evals/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/evals/auth_evaluators.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/evals/base_evaluators.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/base.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/curl.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/graphql.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/javascript_client.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/json_yaml.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/protobuf.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/python.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/python_client.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/thrift.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/typescript.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/formatters/typescript_client.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/llm_profiles.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/research/claude_sdk_detailed_exploration.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/research/claude_sdk_poc.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/research/claude_sdk_working_poc.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/research/test_ollama_tools.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/api.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/api.py.bak +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/helpers/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/helpers/mcp_config.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/models.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/auth.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/generation_logs.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/llm.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/results.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/smoke_reports.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/test_profiles.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/tests.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/routers/tools.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/state.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/tool_compare_endpoint.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/server/websocket.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/smoke_test.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/src/__init__.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/src/llm_integration.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/src/mcp_client.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/src/model_registry.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/src/models.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/src/runner_tools.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/src/test_runner.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/storage.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/test_profiles.py +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/README.md +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/dist/assets/index-CaEBvXci.css +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/dist/assets/index-DbhZ0GnU.js +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/dist/index.html +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/index.html +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/package-lock.json +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/package.json +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/postcss.config.js +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/App.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/CompareToolsTab.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/ErrorAlert.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/ErrorBoundary.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/LLMProfileSelector.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/LoadingSpinner.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/MCPProfileSelector.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/OptimizeDocsModal.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/ParameterCard.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/SchemaCodeViewer.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/SkeletonLoader.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/TestGenerationModal.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/TestProfileSelector.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/TestResultPanel.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/TestStatusIndicator.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/ToolComparison.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/ToolDebugModal.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/components/TypeBadge.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/contexts/TestRunContext.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/hooks/useKeyboardShortcuts.js +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/hooks/useSafeFetch.js +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/index.css +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/main.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/AuthDebugger.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/ChatInterface.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/Configuration.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/GenerationHistory.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/LLMProfiles.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/MCPExplorer.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/MCPProfiles.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/ProfilesManager.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/Reports.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/pages/TestManager.jsx +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/utils/__tests__/formatConverters.test.js +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/src/utils/formatConverters.js +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/tailwind.config.js +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy/ui/vite.config.js +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy.egg-info/SOURCES.txt +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy.egg-info/dependency_links.txt +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy.egg-info/entry_points.txt +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy.egg-info/requires.txt +0 -0
- {testmcpy-0.2.8 → testmcpy-0.2.10}/testmcpy.egg-info/top_level.txt +0 -0
|
@@ -88,7 +88,7 @@ testmcpy = [
|
|
|
88
88
|
|
|
89
89
|
[project]
|
|
90
90
|
name = "testmcpy"
|
|
91
|
-
version = "0.2.
|
|
91
|
+
version = "0.2.10"
|
|
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"
|
|
@@ -120,12 +120,7 @@ class MCPProfileConfig:
|
|
|
120
120
|
"""
|
|
121
121
|
Find MCP services configuration file.
|
|
122
122
|
|
|
123
|
-
|
|
124
|
-
1. Provided config_path
|
|
125
|
-
2. .mcp_services.yaml in current directory
|
|
126
|
-
3. .mcp_services.yaml in parent directories (up to 5 levels)
|
|
127
|
-
|
|
128
|
-
Note: User home directory (~/.mcp_services.yaml) is NOT searched.
|
|
123
|
+
Looks for .mcp_services.yaml in the current working directory.
|
|
129
124
|
"""
|
|
130
125
|
if config_path:
|
|
131
126
|
path = Path(config_path)
|
|
@@ -133,15 +128,10 @@ class MCPProfileConfig:
|
|
|
133
128
|
return path
|
|
134
129
|
return None
|
|
135
130
|
|
|
136
|
-
# Check current directory
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
config_file
|
|
140
|
-
if config_file.exists():
|
|
141
|
-
return config_file
|
|
142
|
-
if current.parent == current:
|
|
143
|
-
break
|
|
144
|
-
current = current.parent
|
|
131
|
+
# Check current directory only (same as llm_profiles)
|
|
132
|
+
config_file = Path.cwd() / ".mcp_services.yaml"
|
|
133
|
+
if config_file.exists():
|
|
134
|
+
return config_file
|
|
145
135
|
|
|
146
136
|
return None
|
|
147
137
|
|
|
@@ -119,35 +119,40 @@ profiles:
|
|
|
119
119
|
my-profile:
|
|
120
120
|
# Display name for the profile
|
|
121
121
|
name: My MCP Server
|
|
122
|
+
description: My MCP server configuration
|
|
122
123
|
|
|
123
|
-
# MCP servers in this profile
|
|
124
|
+
# MCP servers in this profile (list format with -)
|
|
124
125
|
mcps:
|
|
125
|
-
|
|
126
|
-
#
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
# How to start the server
|
|
130
|
-
# Option 1: Command to run
|
|
131
|
-
command: npx
|
|
132
|
-
args:
|
|
133
|
-
- -y
|
|
134
|
-
- "@my-org/my-mcp-server"
|
|
135
|
-
|
|
136
|
-
# Option 2: URL for remote server
|
|
137
|
-
# url: http://localhost:3000/mcp
|
|
138
|
-
|
|
139
|
-
# Environment variables (optional)
|
|
140
|
-
# env:
|
|
141
|
-
# API_KEY: your-api-key
|
|
126
|
+
- name: My Server
|
|
127
|
+
# URL of the MCP server
|
|
128
|
+
mcp_url: http://localhost:3000/mcp
|
|
142
129
|
|
|
143
130
|
# Authentication (optional)
|
|
144
131
|
# auth:
|
|
145
132
|
# type: bearer
|
|
146
|
-
#
|
|
133
|
+
# token: your-bearer-token
|
|
134
|
+
|
|
135
|
+
# For JWT auth:
|
|
136
|
+
# auth:
|
|
137
|
+
# type: jwt
|
|
138
|
+
# api_url: https://api.example.com/auth/
|
|
139
|
+
# api_token: your-api-token
|
|
140
|
+
# api_secret: your-api-secret
|
|
141
|
+
|
|
142
|
+
# Global settings (optional)
|
|
143
|
+
global:
|
|
144
|
+
timeout: 30
|
|
145
|
+
rate_limit:
|
|
146
|
+
requests_per_minute: 60
|
|
147
147
|
"""
|
|
148
148
|
|
|
149
149
|
config_file.write_text(default_template)
|
|
150
150
|
|
|
151
|
+
# Reload the profile config cache
|
|
152
|
+
from testmcpy.mcp_profiles import reload_profile_config
|
|
153
|
+
|
|
154
|
+
reload_profile_config()
|
|
155
|
+
|
|
151
156
|
return {
|
|
152
157
|
"success": True,
|
|
153
158
|
"message": "Created .mcp_services.yaml with default template",
|
|
@@ -161,10 +166,11 @@ profiles:
|
|
|
161
166
|
@router.get("/profiles")
|
|
162
167
|
async def list_mcp_profiles():
|
|
163
168
|
"""List available MCP profiles from .mcp_services.yaml."""
|
|
164
|
-
from testmcpy.mcp_profiles import
|
|
169
|
+
from testmcpy.mcp_profiles import reload_profile_config
|
|
165
170
|
|
|
166
171
|
try:
|
|
167
|
-
|
|
172
|
+
# Always reload to pick up file changes
|
|
173
|
+
profile_config = reload_profile_config()
|
|
168
174
|
if not profile_config.has_profiles():
|
|
169
175
|
return {
|
|
170
176
|
"profiles": [],
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|