mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-10-27 02:32:23 +02:00
feat: Add fields filter to appliance_list
Appliances list can be very large (hundreds of entries). Use fields=["name","category"] to return only what the AI needs.
This commit is contained in:
parent
cd8bb7cca2
commit
3d3c0eb8db
@ -1171,9 +1171,11 @@ async def symbol_delete(
|
|||||||
|
|
||||||
|
|
||||||
@mcp.tool()
|
@mcp.tool()
|
||||||
async def appliance_list() -> list[dict[str, Any]]:
|
async def appliance_list(
|
||||||
"""List all available appliances (template library)."""
|
fields: Annotated[list[str] | None, Field(description="Optional: return only these fields. e.g. [\"name\",\"category\"]. Available: name, category, description, vendor_name, product_name, status, availability, images, versions, tags, symbol, usage, builtin")] = None,
|
||||||
return await asyncio.to_thread(_run_handler_sync, get_appliances_handler, {})
|
) -> list[dict[str, Any]]:
|
||||||
|
"""List all available appliances (template library). Use fields=[] to return only what you need."""
|
||||||
|
return await asyncio.to_thread(_run_handler_sync, get_appliances_handler, {"fields": fields} if fields else {})
|
||||||
|
|
||||||
|
|
||||||
@mcp.tool()
|
@mcp.tool()
|
||||||
|
|||||||
@ -40,9 +40,30 @@ def _get_connector(gns3_ctx: dict[str, Any]):
|
|||||||
|
|
||||||
# ── Tool handlers ──────────────────────────────────────────────────────────
|
# ── Tool handlers ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
VALID_APPLIANCE_FIELDS = {
|
||||||
|
"appliance_id", "name", "category", "description", "vendor_name",
|
||||||
|
"vendor_url", "product_name", "product_url", "documentation_url",
|
||||||
|
"status", "availability", "maintainer", "usage", "symbol",
|
||||||
|
"images", "versions", "tags", "builtin",
|
||||||
|
"first_port_name", "port_name_format", "port_segment_size",
|
||||||
|
"linked_clone", "docker", "iou", "dynamips", "qemu",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_appliances_handler(params: dict[str, Any], gns3_ctx: dict[str, Any]) -> dict[str, Any]:
|
def get_appliances_handler(params: dict[str, Any], gns3_ctx: dict[str, Any]) -> dict[str, Any]:
|
||||||
conn = _get_connector(gns3_ctx)
|
conn = _get_connector(gns3_ctx)
|
||||||
appliances = conn.http_call("get", f"{conn.base_url}/appliances").json()
|
appliances = conn.http_call("get", f"{conn.base_url}/appliances").json()
|
||||||
|
fields = params.get("fields")
|
||||||
|
if fields:
|
||||||
|
if not isinstance(fields, list):
|
||||||
|
return {"error": "fields must be a list, e.g. [\"name\", \"category\"]"}
|
||||||
|
invalid = [f for f in fields if f not in VALID_APPLIANCE_FIELDS]
|
||||||
|
if invalid:
|
||||||
|
return {
|
||||||
|
"error": f"Unknown fields: {invalid}",
|
||||||
|
"available_fields": sorted(VALID_APPLIANCE_FIELDS),
|
||||||
|
}
|
||||||
|
appliances = [{k: a[k] for k in fields if k in a} for a in appliances]
|
||||||
return {"appliances": appliances, "count": len(appliances)}
|
return {"appliances": appliances, "count": len(appliances)}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user