We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/norman-finance/norman-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
"""Test script to verify the Smithery configuration is valid."""
import os
import json
import sys
import yaml
from pathlib import Path
def validate_smithery_yaml():
"""Validate the smithery.yaml file."""
smithery_yaml_path = Path(__file__).parent.parent / "smithery.yaml"
# Check file exists
if not smithery_yaml_path.exists():
print("Error: smithery.yaml file not found!")
return False
try:
# Load YAML file
with open(smithery_yaml_path, 'r') as f:
config = yaml.safe_load(f)
# Validate basic structure
if 'startCommand' not in config:
print("Error: 'startCommand' section missing in smithery.yaml")
return False
if config['startCommand']['type'] != 'stdio':
print("Error: startCommand.type must be 'stdio'")
return False
if 'configSchema' not in config['startCommand']:
print("Error: 'configSchema' section missing in smithery.yaml")
return False
if 'commandFunction' not in config['startCommand']:
print("Error: 'commandFunction' section missing in smithery.yaml")
return False
# Check if configSchema is valid JSON Schema
schema = config['startCommand']['configSchema']
if not isinstance(schema, dict) or 'type' not in schema:
print("Error: configSchema must be a valid JSON Schema object")
return False
# Validate required fields in schema
if 'properties' not in schema:
print("Error: configSchema must have a 'properties' section")
return False
# Check if commandFunction is a string
if not isinstance(config['startCommand']['commandFunction'], str):
print("Error: commandFunction must be a string containing JavaScript code")
return False
print("smithery.yaml validation successful!")
return True
except yaml.YAMLError as e:
print(f"Error parsing smithery.yaml: {e}")
return False
except Exception as e:
print(f"Unexpected error validating smithery.yaml: {e}")
return False
def validate_dockerfile():
"""Validate the Dockerfile exists and has basic requirements."""
dockerfile_path = Path(__file__).parent.parent / "Dockerfile"
# Check file exists
if not dockerfile_path.exists():
print("Error: Dockerfile not found!")
return False
try:
# Read Dockerfile content
with open(dockerfile_path, 'r') as f:
content = f.read()
# Check for basic required elements
checks = {
"FROM": "FROM" in content,
"WORKDIR": "WORKDIR" in content,
"ENTRYPOINT or CMD": "ENTRYPOINT" in content or "CMD" in content
}
failed_checks = [key for key, passed in checks.items() if not passed]
if failed_checks:
print(f"Error: Dockerfile is missing required directives: {', '.join(failed_checks)}")
return False
print("Dockerfile validation successful!")
return True
except Exception as e:
print(f"Error validating Dockerfile: {e}")
return False
def main():
"""Run all validation checks."""
print("Validating Smithery deployment configuration...")
smithery_valid = validate_smithery_yaml()
dockerfile_valid = validate_dockerfile()
if smithery_valid and dockerfile_valid:
print("\nAll validations passed. Configuration is ready for Smithery deployment!")
return 0
else:
print("\nValidation failed. Please fix the issues before deploying to Smithery.")
return 1
if __name__ == "__main__":
sys.exit(main())