Skip to main content
Glama
test_skills.py5.41 kB
"""Integration tests for skill management MCP tools (skill_list, skill_get, skill_delete).""" import json from pathlib import Path import pytest from fastmcp import Client from mcp_server_browser_use.skills.models import Skill, SkillRequest def create_test_skill(name: str, description: str = "Test skill") -> Skill: """Create a test skill for testing.""" return Skill( name=name, description=description, original_task=f"Test task for {name}", request=SkillRequest( url="https://api.example.com/search?q={query}", method="GET", response_type="json", extract_path="results[*].name", ), ) class TestSkillList: """Tests for the skill_list tool.""" @pytest.mark.anyio async def test_skill_list_returns_valid_structure(self, mcp_client: Client, temp_skills_dir: Path): """skill_list should return valid JSON with skills array.""" result = await mcp_client.call_tool("skill_list", {}) assert result.content is not None data = json.loads(result.content[0].text) assert "skills" in data assert isinstance(data["skills"], list) # If empty, should have message; if not empty, each skill has required fields if len(data["skills"]) == 0: assert "message" in data assert "No skills found" in data["message"] else: for skill in data["skills"]: assert "name" in skill assert "description" in skill assert "success_rate" in skill @pytest.mark.anyio async def test_skill_list_with_skills(self, mcp_client: Client, temp_skills_dir: Path): """skill_list should return all skills with summaries.""" # Create skills directly in the temp directory from mcp_server_browser_use.skills import SkillStore store = SkillStore(directory=temp_skills_dir) skill1 = create_test_skill("search-skill", "Search for items") skill2 = create_test_skill("fetch-skill", "Fetch data from API") store.save(skill1) store.save(skill2) # Re-initialize client to pick up new skills result = await mcp_client.call_tool("skill_list", {}) data = json.loads(result.content[0].text) assert "skills" in data # Note: The test client might use a different directory # This test mainly verifies the response structure if len(data["skills"]) > 0: skill = data["skills"][0] assert "name" in skill assert "description" in skill assert "success_rate" in skill assert "usage_count" in skill class TestSkillGet: """Tests for the skill_get tool.""" @pytest.mark.anyio async def test_skill_get_not_found(self, mcp_client: Client): """skill_get should return error for non-existent skill.""" result = await mcp_client.call_tool("skill_get", {"skill_name": "nonexistent-skill"}) text = result.content[0].text assert "Error" in text assert "not found" in text @pytest.mark.anyio async def test_skill_get_returns_yaml(self, mcp_client: Client, temp_skills_dir: Path, monkeypatch): """skill_get should return skill definition as YAML.""" # Override the skills directory in settings monkeypatch.setenv("MCP_SKILLS_DIRECTORY", str(temp_skills_dir)) from mcp_server_browser_use.skills import SkillStore store = SkillStore(directory=temp_skills_dir) skill = create_test_skill("yaml-test-skill", "Test skill for YAML output") store.save(skill) # The client might not pick up the new directory, so test with the fixture store # This test verifies the tool exists and handles parameters correctly result = await mcp_client.call_tool("skill_get", {"skill_name": "yaml-test-skill"}) text = result.content[0].text # Either we get the YAML or a not found error (due to directory mismatch) assert "yaml-test-skill" in text or "not found" in text.lower() class TestSkillDelete: """Tests for the skill_delete tool.""" @pytest.mark.anyio async def test_skill_delete_not_found(self, mcp_client: Client): """skill_delete should return error for non-existent skill.""" result = await mcp_client.call_tool("skill_delete", {"skill_name": "nonexistent-skill"}) text = result.content[0].text assert "Error" in text assert "not found" in text @pytest.mark.anyio async def test_skill_delete_success(self, mcp_client: Client, temp_skills_dir: Path, monkeypatch): """skill_delete should successfully delete existing skill.""" monkeypatch.setenv("MCP_SKILLS_DIRECTORY", str(temp_skills_dir)) from mcp_server_browser_use.skills import SkillStore store = SkillStore(directory=temp_skills_dir) skill = create_test_skill("delete-test-skill") store.save(skill) # Verify skill exists assert store.exists("delete-test-skill") # Delete via MCP tool result = await mcp_client.call_tool("skill_delete", {"skill_name": "delete-test-skill"}) text = result.content[0].text # Either deleted successfully or not found (directory mismatch) assert "deleted" in text.lower() or "not found" in text.lower()

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Saik0s/mcp-browser-use'

If you have feedback or need assistance with the MCP directory API, please join our Discord server