def get_properties(
material_id: str,
) -> str:
"""
Get detailed properties for a specific material from Materials Project.
Args:
material_id: Materials Project ID (e.g., "mp-149" for Silicon)
Returns:
JSON with comprehensive material properties
"""
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:
doc = mpr.materials.summary.get_data_by_id(material_id)
properties = {
"material_id": str(doc.material_id),
"formula": doc.formula_pretty,
"elements": [str(el) for el in doc.elements],
"nelements": doc.nelements,
"nsites": doc.nsites,
"volume": doc.volume,
"density": doc.density,
# Thermodynamic properties
"formation_energy_per_atom": doc.formation_energy_per_atom,
"energy_above_hull": doc.energy_above_hull,
"is_stable": doc.is_stable,
# Electronic properties
"band_gap": doc.band_gap,
"is_metal": doc.is_metal,
"is_magnetic": doc.is_magnetic,
"total_magnetization": doc.total_magnetization,
# Symmetry
"crystal_system": str(doc.symmetry.crystal_system.value) if doc.symmetry and hasattr(doc.symmetry.crystal_system, 'value') else (str(doc.symmetry.crystal_system) if doc.symmetry else None),
"space_group_symbol": doc.symmetry.symbol if doc.symmetry else None,
"space_group_number": doc.symmetry.number if doc.symmetry else None,
"point_group": doc.symmetry.point_group if doc.symmetry else None,
# Provenance
"database_ids": doc.database_IDs if hasattr(doc, 'database_IDs') else None,
}
return json.dumps(properties, indent=2)
except Exception as e:
return json.dumps({"error": str(e)})