mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-30 08:33:10 +00:00
ifcmcp: source tool descriptions from ifcquery/ifcedit instead of duplicating them
Alternative to #8955, for #8951 (23 of 25 ifcmcp tools reach MCP clients with an empty description because FastMCP reads each wrapper's own __doc__, and the server.py wrappers had none). #8955 fixes this by hand-writing a new docstring directly onto each server.py wrapper. Most of those wrappers are thin passthroughs to IfcSession methods in core.py, which already had short docstrings, which themselves mostly delegate to already-documented ifcquery/ifcedit functions -- so that fix tripled up content across three layers that can drift out of sync. This instead enriches the true source (the ifcquery/ifcedit library functions, useful independently of MCP) and has core.py's IfcSession methods copy __doc__ from their delegate via a small _use_doc() decorator, and server.py's tool registration pull description= from the matching IfcSession method. Methods that aren't pure passthroughs (session lifecycle, generic API/shape dispatch) keep their own hand-written docs. Keeps #8955's regression test. Generated with the assistance of an AI coding tool.
This commit is contained in:
committed by
Thomas Krijnen
parent
e077390e3d
commit
6f3acc84ee
@@ -94,9 +94,15 @@ def list_functions(module: str) -> list[dict]:
|
||||
|
||||
|
||||
def function_docs(module: str, function: str) -> dict:
|
||||
"""Full documentation for a single API function.
|
||||
"""Show the full documentation for one ifcopenshell.api function.
|
||||
|
||||
Returns a dict with: module, function, description, params (with types/defaults/descriptions), return_type
|
||||
Returns the summary and long description, every parameter with its type,
|
||||
default and description, and the return type. Read this before calling
|
||||
``run_api()`` so that parameter names and value types are correct.
|
||||
|
||||
:param module: API module name, for example ``'root'``.
|
||||
:param function: Function name within the module, for example
|
||||
``'create_entity'``.
|
||||
"""
|
||||
fn = _get_underlying_function(module, function)
|
||||
if fn is None:
|
||||
|
||||
@@ -14,10 +14,21 @@ def list_rules() -> list[dict[str, str]]:
|
||||
|
||||
|
||||
def run_quantify(model: ifcopenshell.file, rule: str, selector: str | None = None) -> dict[str, Any]:
|
||||
"""Run quantity take-off on the model using the named rule.
|
||||
"""Compute base quantities for elements and write them into the model.
|
||||
|
||||
Modifies the model in-place by adding/updating IfcElementQuantity psets.
|
||||
Returns a summary dict with ok, rule, and elements_quantified.
|
||||
This is a write operation: it derives lengths, areas and volumes from
|
||||
element geometry and adds or updates their ``IfcElementQuantity`` sets.
|
||||
It does not report a schedule — see ``ifcquery.schedule()`` for the
|
||||
construction programme and ``ifcquery.cost()`` for cost schedules. An
|
||||
unrecognised ``rule`` is reported as an error listing the rules that are
|
||||
available.
|
||||
|
||||
:param model: The in-memory IFC model. Modified in-place.
|
||||
:param rule: Quantity take-off rule set, for example
|
||||
``'IFC4QtoBaseQuantities'`` or ``'IFC4X3QtoBaseQuantities'``.
|
||||
:param selector: ifcopenshell selector restricting which elements are
|
||||
measured, e.g. ``'IfcWall'``. Omit to measure every ``IfcElement`` and
|
||||
``IfcSpace``.
|
||||
"""
|
||||
from ifc5d.qto import edit_qtos, quantify
|
||||
from ifc5d.qto import rules as rule_sets
|
||||
|
||||
Reference in New Issue
Block a user