mirror of
https://github.com/httprunner/httprunner.git
synced 2026-09-05 23:51:25 +08:00
fix: mcp test json
This commit is contained in:
@@ -8,7 +8,7 @@ import (
|
|||||||
|
|
||||||
func TestLoadSettings(t *testing.T) {
|
func TestLoadSettings(t *testing.T) {
|
||||||
// Load settings from test.mcp.json
|
// Load settings from test.mcp.json
|
||||||
settings, err := LoadSettings("test.mcp.json")
|
settings, err := LoadSettings("testdata/test.mcp.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to load settings: %v", err)
|
t.Fatalf("Failed to load settings: %v", err)
|
||||||
}
|
}
|
||||||
@@ -21,11 +21,11 @@ func TestLoadSettings(t *testing.T) {
|
|||||||
// Verify specific server configurations
|
// Verify specific server configurations
|
||||||
filesystemConfig := settings.MCPServers["filesystem"]
|
filesystemConfig := settings.MCPServers["filesystem"]
|
||||||
assert.Equal(t, "npx", filesystemConfig.Command)
|
assert.Equal(t, "npx", filesystemConfig.Command)
|
||||||
assert.Equal(t, []string{"-y", "@modelcontextprotocol/server-filesystem", "/Users/debugtalk/Downloads/tmp"}, filesystemConfig.Args)
|
assert.Equal(t, []string{"-y", "@modelcontextprotocol/server-filesystem", "/tmp"}, filesystemConfig.Args)
|
||||||
|
|
||||||
weatherConfig := settings.MCPServers["weather"]
|
weatherConfig := settings.MCPServers["weather"]
|
||||||
assert.Equal(t, "uv", weatherConfig.Command)
|
assert.Equal(t, "uv", weatherConfig.Command)
|
||||||
assert.Equal(t, []string{"--directory", "/Users/debugtalk/MyProjects/ByteDance/EvalTools/quickstart-resources/weather-server-python/", "run", "weather.py"}, weatherConfig.Args)
|
assert.Equal(t, []string{"--directory", "/Users/debugtalk/MyProjects/HttpRunner-dev/httprunner/internal/mcp/testdata", "run", "demo_weather.py"}, weatherConfig.Args)
|
||||||
assert.Equal(t, []string{"get_forecast"}, weatherConfig.AutoApprove)
|
assert.Equal(t, []string{"get_forecast"}, weatherConfig.AutoApprove)
|
||||||
assert.Equal(t, map[string]string{"ABC": "123"}, weatherConfig.Env)
|
assert.Equal(t, map[string]string{"ABC": "123"}, weatherConfig.Env)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestGetTools(t *testing.T) {
|
func TestGetTools(t *testing.T) {
|
||||||
hub, err := NewMCPHub("./test.mcp.json")
|
hub, err := NewMCPHub("./testdata/test.mcp.json")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
@@ -27,7 +27,7 @@ func TestGetTools(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCallTool(t *testing.T) {
|
func TestCallTool(t *testing.T) {
|
||||||
hub, err := NewMCPHub("./test.mcp.json")
|
hub, err := NewMCPHub("./testdata/test.mcp.json")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
@@ -39,26 +39,11 @@ func TestCallTool(t *testing.T) {
|
|||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
result, err = hub.InvokeTool(ctx, "shoots_ug_toolbox_utils_utils", "get_udid",
|
|
||||||
map[string]interface{}{},
|
|
||||||
)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
result, err = hub.InvokeTool(ctx, "shoots_ug_toolbox_utils_utils", "is_login",
|
|
||||||
map[string]interface{}{},
|
|
||||||
)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
result, err = hub.InvokeTool(ctx, "shoots_ug_toolbox_utils_utils", "login_app_account",
|
|
||||||
map[string]interface{}{"phone": "a12342038903", "password": "a123456"},
|
|
||||||
)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
t.Logf("Result: %v", result)
|
t.Logf("Result: %v", result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCallEinoTool(t *testing.T) {
|
func TestCallEinoTool(t *testing.T) {
|
||||||
hub, err := NewMCPHub("./test.mcp.json")
|
hub, err := NewMCPHub("./testdata/test.mcp.json")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
@@ -76,7 +61,7 @@ func TestCallEinoTool(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestConvertToolsToRecordsFromFile(t *testing.T) {
|
func TestConvertToolsToRecordsFromFile(t *testing.T) {
|
||||||
hub, err := NewMCPHub("./test.mcp.json")
|
hub, err := NewMCPHub("./testdata/test.mcp.json")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
"mcpServers": {
|
|
||||||
"shoots_ug_toolbox_install_helper": {
|
|
||||||
"args": [
|
|
||||||
"--directory",
|
|
||||||
"/Users/debugtalk/MyProjects/ByteDance/EvalTools/shoots-ug-box",
|
|
||||||
"run",
|
|
||||||
"install_helper.py"
|
|
||||||
],
|
|
||||||
"command": "uv"
|
|
||||||
},
|
|
||||||
"shoots_ug_toolbox_utils_utils": {
|
|
||||||
"args": [
|
|
||||||
"--directory",
|
|
||||||
"/Users/debugtalk/MyProjects/ByteDance/EvalTools/shoots-ug-box",
|
|
||||||
"run",
|
|
||||||
"utils_utils.py"
|
|
||||||
],
|
|
||||||
"command": "uv"
|
|
||||||
},
|
|
||||||
"weather": {
|
|
||||||
"args": [
|
|
||||||
"--directory",
|
|
||||||
"/Users/debugtalk/MyProjects/ByteDance/EvalTools/shoots-ug-box",
|
|
||||||
"run",
|
|
||||||
"demo_weather.py"
|
|
||||||
],
|
|
||||||
"autoApprove": [
|
|
||||||
"get_forecast"
|
|
||||||
],
|
|
||||||
"command": "uv",
|
|
||||||
"env": {
|
|
||||||
"ABC": "123"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+94
@@ -0,0 +1,94 @@
|
|||||||
|
from typing import Any
|
||||||
|
import httpx
|
||||||
|
from mcp.server.fastmcp import FastMCP
|
||||||
|
|
||||||
|
# Initialize FastMCP server
|
||||||
|
mcp = FastMCP("weather")
|
||||||
|
|
||||||
|
# Constants
|
||||||
|
NWS_API_BASE = "https://api.weather.gov"
|
||||||
|
USER_AGENT = "weather-app/1.0"
|
||||||
|
|
||||||
|
async def make_nws_request(url: str) -> dict[str, Any] | None:
|
||||||
|
"""Make a request to the NWS API with proper error handling."""
|
||||||
|
headers = {
|
||||||
|
"User-Agent": USER_AGENT,
|
||||||
|
"Accept": "application/geo+json"
|
||||||
|
}
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
try:
|
||||||
|
response = await client.get(url, headers=headers, timeout=30.0)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.json()
|
||||||
|
except Exception:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def format_alert(feature: dict) -> str:
|
||||||
|
"""Format an alert feature into a readable string."""
|
||||||
|
props = feature["properties"]
|
||||||
|
return f"""
|
||||||
|
Event: {props.get('event', 'Unknown')}
|
||||||
|
Area: {props.get('areaDesc', 'Unknown')}
|
||||||
|
Severity: {props.get('severity', 'Unknown')}
|
||||||
|
Description: {props.get('description', 'No description available')}
|
||||||
|
Instructions: {props.get('instruction', 'No specific instructions provided')}
|
||||||
|
"""
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def get_alerts(state: str) -> str:
|
||||||
|
"""Get weather alerts for a US state.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
state: Two-letter US state code (e.g. CA, NY)
|
||||||
|
"""
|
||||||
|
url = f"{NWS_API_BASE}/alerts/active/area/{state}"
|
||||||
|
data = await make_nws_request(url)
|
||||||
|
|
||||||
|
if not data or "features" not in data:
|
||||||
|
return "Unable to fetch alerts or no alerts found."
|
||||||
|
|
||||||
|
if not data["features"]:
|
||||||
|
return "No active alerts for this state."
|
||||||
|
|
||||||
|
alerts = [format_alert(feature) for feature in data["features"]]
|
||||||
|
return "\n---\n".join(alerts)
|
||||||
|
|
||||||
|
@mcp.tool()
|
||||||
|
async def get_forecast(latitude: float, longitude: float) -> str:
|
||||||
|
"""Get weather forecast for a location.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
latitude: Latitude of the location
|
||||||
|
longitude: Longitude of the location
|
||||||
|
"""
|
||||||
|
# First get the forecast grid endpoint
|
||||||
|
points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
|
||||||
|
points_data = await make_nws_request(points_url)
|
||||||
|
|
||||||
|
if not points_data:
|
||||||
|
return "Unable to fetch forecast data for this location."
|
||||||
|
|
||||||
|
# Get the forecast URL from the points response
|
||||||
|
forecast_url = points_data["properties"]["forecast"]
|
||||||
|
forecast_data = await make_nws_request(forecast_url)
|
||||||
|
|
||||||
|
if not forecast_data:
|
||||||
|
return "Unable to fetch detailed forecast."
|
||||||
|
|
||||||
|
# Format the periods into a readable forecast
|
||||||
|
periods = forecast_data["properties"]["periods"]
|
||||||
|
forecasts = []
|
||||||
|
for period in periods[:5]: # Only show next 5 periods
|
||||||
|
forecast = f"""
|
||||||
|
{period['name']}:
|
||||||
|
Temperature: {period['temperature']}°{period['temperatureUnit']}
|
||||||
|
Wind: {period['windSpeed']} {period['windDirection']}
|
||||||
|
Forecast: {period['detailedForecast']}
|
||||||
|
"""
|
||||||
|
forecasts.append(forecast)
|
||||||
|
|
||||||
|
return "\n---\n".join(forecasts)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Initialize and run the server
|
||||||
|
mcp.run(transport='stdio')
|
||||||
Vendored
+27
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"filesystem": {
|
||||||
|
"command": "npx",
|
||||||
|
"args": [
|
||||||
|
"-y",
|
||||||
|
"@modelcontextprotocol/server-filesystem",
|
||||||
|
"/tmp"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"args": [
|
||||||
|
"--directory",
|
||||||
|
"/Users/debugtalk/MyProjects/HttpRunner-dev/httprunner/internal/mcp/testdata",
|
||||||
|
"run",
|
||||||
|
"demo_weather.py"
|
||||||
|
],
|
||||||
|
"autoApprove": [
|
||||||
|
"get_forecast"
|
||||||
|
],
|
||||||
|
"command": "uv",
|
||||||
|
"env": {
|
||||||
|
"ABC": "123"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
v5.0.0-beta-2504251727
|
v5.0.0-beta-2504251755
|
||||||
|
|||||||
+1
-1
@@ -74,7 +74,7 @@ func TestTapHandler(t *testing.T) {
|
|||||||
|
|
||||||
func TestInvokeToolHandler(t *testing.T) {
|
func TestInvokeToolHandler(t *testing.T) {
|
||||||
router := NewRouter()
|
router := NewRouter()
|
||||||
router.InitMCPHub("../internal/mcp/test.mcp.json")
|
router.InitMCPHub("../internal/mcp/testdata/test.mcp.json")
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
|||||||
Reference in New Issue
Block a user