Skip to main content
Glama
HeshamFS

MCP Materials Server

by HeshamFS

search_by_elastic_properties

Find materials by specifying bulk and shear modulus ranges to identify substances with desired mechanical properties for engineering applications.

Instructions

Search for materials by elastic/mechanical properties.

Args:
    min_bulk_modulus: Minimum bulk modulus in GPa
    max_bulk_modulus: Maximum bulk modulus in GPa
    min_shear_modulus: Minimum shear modulus in GPa
    max_shear_modulus: Maximum shear modulus in GPa
    max_results: Maximum number of results (default: 10)

Returns:
    JSON with materials matching the elastic property criteria

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
min_bulk_modulusNo
max_bulk_modulusNo
min_shear_modulusNo
max_shear_modulusNo
max_resultsNo

Implementation Reference

  • The core handler function for the 'search_by_elastic_properties' tool. Decorated with @mcp.tool() for automatic registration and schema inference from type hints and docstring. Implements search on Materials Project elasticity data using bulk and shear modulus ranges.
    @mcp.tool()
    def search_by_elastic_properties(
        min_bulk_modulus: float | None = None,
        max_bulk_modulus: float | None = None,
        min_shear_modulus: float | None = None,
        max_shear_modulus: float | None = None,
        max_results: int = 10,
    ) -> str:
        """
        Search for materials by elastic/mechanical properties.
    
        Args:
            min_bulk_modulus: Minimum bulk modulus in GPa
            max_bulk_modulus: Maximum bulk modulus in GPa
            min_shear_modulus: Minimum shear modulus in GPa
            max_shear_modulus: Maximum shear modulus in GPa
            max_results: Maximum number of results (default: 10)
    
        Returns:
            JSON with materials matching the elastic property criteria
        """
        has_key, key_or_error = check_api_key()
        if not has_key:
            return json.dumps({"error": key_or_error})
    
        try:
            from mp_api.client import MPRester
    
            with MPRester(key_or_error) as mpr:
                search_kwargs: dict[str, Any] = {
                    "num_chunks": 1,
                    "chunk_size": max_results * 2,
                }
    
                # Add bulk modulus filter
                if min_bulk_modulus is not None or max_bulk_modulus is not None:
                    bulk_range = (
                        min_bulk_modulus if min_bulk_modulus else 0,
                        max_bulk_modulus if max_bulk_modulus else 1000,
                    )
                    search_kwargs["bulk_modulus"] = bulk_range
    
                # Add shear modulus filter
                if min_shear_modulus is not None or max_shear_modulus is not None:
                    shear_range = (
                        min_shear_modulus if min_shear_modulus else 0,
                        max_shear_modulus if max_shear_modulus else 1000,
                    )
                    search_kwargs["shear_modulus"] = shear_range
    
                docs = mpr.materials.elasticity.search(**search_kwargs)
    
                results = []
                for doc in docs[:max_results]:
                    results.append({
                        "material_id": str(doc.material_id),
                        "formula": doc.formula_pretty if hasattr(doc, 'formula_pretty') else None,
                        "bulk_modulus_GPa": doc.bulk_modulus.vrh if doc.bulk_modulus else None,
                        "shear_modulus_GPa": doc.shear_modulus.vrh if doc.shear_modulus else None,
                        "universal_anisotropy": doc.universal_anisotropy if hasattr(doc, 'universal_anisotropy') else None,
                    })
    
                return json.dumps({
                    "query": {
                        "bulk_modulus_range_GPa": [min_bulk_modulus, max_bulk_modulus],
                        "shear_modulus_range_GPa": [min_shear_modulus, max_shear_modulus],
                    },
                    "count": len(results),
                    "materials": results,
                }, indent=2)
    
        except Exception as e:
            return json.dumps({"error": str(e)})
  • Initialization of the FastMCP server instance where all @mcp.tool() decorated functions are automatically registered as tools.
    mcp = FastMCP("materials-science")
  • Input schema defined by function parameters with type hints (float | None, int) and comprehensive docstring describing arguments and return format (JSON). Output is standardized JSON with query summary and results.
    def search_by_elastic_properties(
        min_bulk_modulus: float | None = None,
        max_bulk_modulus: float | None = None,
        min_shear_modulus: float | None = None,
        max_shear_modulus: float | None = None,
        max_results: int = 10,
    ) -> str:
        """
        Search for materials by elastic/mechanical properties.
    
        Args:
            min_bulk_modulus: Minimum bulk modulus in GPa
            max_bulk_modulus: Maximum bulk modulus in GPa
            min_shear_modulus: Minimum shear modulus in GPa
            max_shear_modulus: Maximum shear modulus in GPa
            max_results: Maximum number of results (default: 10)
    
        Returns:
            JSON with materials matching the elastic property criteria
        """

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/HeshamFS/mcp-materials-server'

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