[{"name":"bookmark_get_contents","description":"Get the items contained in a bookmark by bookmark id.","signature":"(bookmark_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.bookmark","parameters":[{"name":"bookmark_id","required":true,"type":"str"}]},{"name":"bookmark_list","description":"List bookmarks the current user can see. Optional `name` (case-sensitive exact match).","signature":"(name: str | None = None) -> dict","tags":[],"mutates":false,"module":"domains.curated.bookmark","parameters":[{"name":"name","required":false,"type":"str | None","default":null}]},{"name":"change_action_create","description":"Create a Change Action. Required: `title`, `description`. Optional `policy` ('Change Action' default, or 'External Change Action').","signature":"(title: str, description: str, policy: str = 'Change Action') -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"title","required":true,"type":"str"},{"name":"description","required":true,"type":"str"},{"name":"policy","required":false,"type":"str","default":"Change Action"}]},{"name":"change_action_get","description":"Get a Change Action by id.","signature":"(ca_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"ca_id","required":true,"type":"str"}]},{"name":"change_action_search","description":"Search Change Actions (the umbrella objects that EXECUTE approved changes). USE THIS for 'change actions' / 'CAs'.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"change_order_create","description":"Create a Change Order. Required: `title`, `description`.","signature":"(title: str, description: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"title","required":true,"type":"str"},{"name":"description","required":true,"type":"str"}]},{"name":"change_order_get","description":"Get a Change Order by id.","signature":"(co_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"co_id","required":true,"type":"str"}]},{"name":"change_order_search","description":"Search Change Orders (approved orders directing a change). USE THIS for 'change orders' / 'COs'.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"change_request_create","description":"Create a Change Request. Required: `title`, `description`.","signature":"(title: str, description: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"title","required":true,"type":"str"},{"name":"description","required":true,"type":"str"}]},{"name":"change_request_get","description":"Get a Change Request by id.","signature":"(cr_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"cr_id","required":true,"type":"str"}]},{"name":"change_request_search","description":"Search Change Requests (proposed changes awaiting decision). USE THIS for 'change requests' / 'CRs'.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"collab_spaces","description":"List collaborative spaces (CollabSpaces) the current user belongs to.","signature":"() -> dict","tags":[],"mutates":false,"module":"domains.curated.bookmark","parameters":[]},{"name":"cross_search","description":"Search ALL major object families (Engineering, Manufacturing, Requirements, Change Actions/Orders/Requests, Issues, Drawings, Raw Materials, Documents) in parallel and return per-family hit counts + samples. USE THIS when the user asks generically ('find anything about X', 'is there a Y in the platform') and you don't yet know which family to query. The result tells you exactly which domain-specific tool to follow up with.","signature":"(query: str, sample_per_family: int = 3) -> dict","tags":[],"mutates":false,"module":"domains.curated.search","parameters":[{"name":"query","required":true,"type":"str"},{"name":"sample_per_family","required":false,"type":"int","default":3}]},{"name":"doc_create","description":"Create a new Document. Body: {title, description?}. Returns the created doc.","signature":"(title: str, description: str = '') -> dict","tags":[],"mutates":false,"module":"domains.curated.documents","parameters":[{"name":"title","required":true,"type":"str"},{"name":"description","required":false,"type":"str","default":""}]},{"name":"doc_get","description":"Get a Document by id.","signature":"(doc_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.documents","parameters":[{"name":"doc_id","required":true,"type":"str"}]},{"name":"doc_revise","description":"Create a new revision/iteration of an existing Document.","signature":"(doc_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.documents","parameters":[{"name":"doc_id","required":true,"type":"str"}]},{"name":"doc_search","description":"Search Documents by free-text. Optional `limit` (default 20).","signature":"(query: str, limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.documents","parameters":[{"name":"query","required":true,"type":"str"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"drw_get","description":"Get one Drawing by id.","signature":"(drw_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.drawings","parameters":[{"name":"drw_id","required":true,"type":"str"}]},{"name":"drw_get_items","description":"Get the items contained in a Drawing (sheets, views, annotations).","signature":"(drw_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.drawings","parameters":[{"name":"drw_id","required":true,"type":"str"}]},{"name":"drw_search","description":"Search Drawings (2D engineering drawings). USE THIS for 'drawings' / 'DRW' / '2D'.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.drawings","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"eng_add_instance","description":"Add a child instance under a parent Engineering Item. Both ids are physicalIds.","signature":"(parent_id: str, child_id: str, instance_title: str = '') -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"parent_id","required":true,"type":"str"},{"name":"child_id","required":true,"type":"str"},{"name":"instance_title","required":false,"type":"str","default":""}]},{"name":"eng_count_by","description":"Group Engineering Items by a field and count. `group_by` ∈ {'owner','collabspace','type','state','organization'}. Optional `owner`/`collabspace` filter. USE THIS for 'most popular categories' / distributions.","signature":"(group_by: str = 'type', owner: str | None = None, collabspace: str | None = None) -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"group_by","required":false,"type":"str","default":"type"},{"name":"owner","required":false,"type":"str | None","default":null},{"name":"collabspace","required":false,"type":"str | None","default":null}]},{"name":"eng_create","description":"Create a new Engineering Item with `title` and optional `description`. Returns the new item summary.","signature":"(title: str, description: str = '', type_: str = 'VPMReference') -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"title","required":true,"type":"str"},{"name":"description","required":false,"type":"str","default":""},{"name":"type_","required":false,"type":"str","default":"VPMReference"}]},{"name":"eng_get","description":"Get an Engineering Item by physicalId. Returns full attributes (verbose).","signature":"(physical_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"physical_id","required":true,"type":"str"}]},{"name":"eng_get_structure","description":"Get the assembly children (instances) of an Engineering Item by physicalId. `depth` default 1.","signature":"(physical_id: str, depth: int = 1) -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"physical_id","required":true,"type":"str"},{"name":"depth","required":false,"type":"int","default":1}]},{"name":"eng_get_summary","description":"Flat summary (id, name, title, description, revision, state, type, owner, collabspace, modified, created). PREFER THIS over eng_get for chat — much fewer tokens.","signature":"(physical_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"physical_id","required":true,"type":"str"}]},{"name":"eng_my_recent","description":"List Engineering Items associated with the current user, most recent first. Optional `collabspace` filter (e.g. 'AEI8'). `limit` default 10. RETURNS A CAVEAT — dseng search has NO date sort and NO date filter; results are items whose indexed text matches your owner keys (login + collab-space identities), ordered by `created` AFTER fetch. Very recent items (last hours/days) may be missing because the search index hasn't picked them up yet. ALWAYS pass the `caveat` field from the response to the user verbatim — do NOT present results as definitive 'most recent'. If user mentions a known title, prefer `eng_search` with that title.","signature":"(limit: int = 10, collabspace: str | None = None, extra_terms: list[str] | None = None) -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"limit","required":false,"type":"int","default":10},{"name":"collabspace","required":false,"type":"str | None","default":null},{"name":"extra_terms","required":false,"type":"list[str] | None","default":null}]},{"name":"eng_search","description":"Search Engineering Items by free-text. Optional filters applied client-side: `owner` (e.g. 'ptd'), `collabspace` (e.g. 'AEI8'). `limit` default 20. Returns {total, items: [summary, ...]}. Use `eng_my_recent` if you want items YOU created.","signature":"(query: str, limit: int = 20, owner: str | None = None, collabspace: str | None = None) -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"query","required":true,"type":"str"},{"name":"limit","required":false,"type":"int","default":20},{"name":"owner","required":false,"type":"str | None","default":null},{"name":"collabspace","required":false,"type":"str | None","default":null}]},{"name":"eng_set_partnumber","description":"Set the PartNumber (name attribute) on an Engineering Item. Common single-field edit.","signature":"(physical_id: str, partnumber: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"physical_id","required":true,"type":"str"},{"name":"partnumber","required":true,"type":"str"}]},{"name":"eng_update","description":"Update arbitrary attributes on an Engineering Item. `attrs` is a dict of attribute name → value.","signature":"(physical_id: str, attrs: dict) -> dict","tags":[],"mutates":false,"module":"domains.curated.engineering","parameters":[{"name":"physical_id","required":true,"type":"str"},{"name":"attrs","required":true,"type":"dict"}]},{"name":"issue_create","description":"Create an Issue (problem report). Required: `description`. Optional: `title`.","signature":"(description: str, title: str = '') -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"description","required":true,"type":"str"},{"name":"title","required":false,"type":"str","default":""}]},{"name":"issue_get","description":"Get an Issue by id.","signature":"(issue_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"issue_id","required":true,"type":"str"}]},{"name":"issue_search","description":"Search Issues (observed problems / defects reported in 3DEXPERIENCE). USE THIS for 'issues' / 'defects' / 'problems'.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.change","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"lifecycle_change_state","description":"Promote/demote an object. `command` is e.g. 'Promote', 'Demote', 'Release'.","signature":"(physical_id: str, command: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.lifecycle","parameters":[{"name":"physical_id","required":true,"type":"str"},{"name":"command","required":true,"type":"str"}]},{"name":"lifecycle_delete","description":"Delete an object — uses the 2-step Delete API (checkReady then options).","signature":"(physical_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.lifecycle","parameters":[{"name":"physical_id","required":true,"type":"str"}]},{"name":"lifecycle_get_transitions","description":"List available state transitions (Promote/Demote/etc.) for an object by physicalId.","signature":"(physical_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.lifecycle","parameters":[{"name":"physical_id","required":true,"type":"str"}]},{"name":"list_capabilities","description":"Return the catalogue of object families this MCP can handle, plus the EXACT tool name to call for each. Call this FIRST whenever the user asks about an object kind you're unsure about (requirements, change orders, materials, drawings, etc.). The output IS the routing table — pick a tool from it and call it.","signature":"() -> dict","tags":[],"mutates":false,"module":"domains.curated.search","parameters":[]},{"name":"mfg_from_eng_item","description":"Find Manufacturing Items linked to a given Engineering Item id.","signature":"(eng_item_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.manufacturing","parameters":[{"name":"eng_item_id","required":true,"type":"str"}]},{"name":"mfg_get","description":"Get a Manufacturing Item by id.","signature":"(mfg_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.manufacturing","parameters":[{"name":"mfg_id","required":true,"type":"str"}]},{"name":"mfg_get_resulting_eng_items","description":"Get the Engineering Items that this Manufacturing Item produces.","signature":"(mfg_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.manufacturing","parameters":[{"name":"mfg_id","required":true,"type":"str"}]},{"name":"mfg_get_structure","description":"Get the assembly children (instances) under a Manufacturing Item.","signature":"(mfg_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.manufacturing","parameters":[{"name":"mfg_id","required":true,"type":"str"}]},{"name":"mfg_search","description":"Search Manufacturing Items (the manufacturing-side equivalents of Engineering Items). USE THIS for 'manufacturing items' / 'MfgItems' / 'process products'.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.manufacturing","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"req_create","description":"Create a new Requirement. Body: {title, description?}.","signature":"(title: str, description: str = '') -> dict","tags":[],"mutates":false,"module":"domains.curated.requirements","parameters":[{"name":"title","required":true,"type":"str"},{"name":"description","required":false,"type":"str","default":""}]},{"name":"req_get","description":"Get one Requirement by id. Returns the full attributes (verbose).","signature":"(req_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.requirements","parameters":[{"name":"req_id","required":true,"type":"str"}]},{"name":"req_recent","description":"List recent Requirements, optionally filtered by collaborative space. Use this for 'recent requirements' instead of req_search. Returns a caveat because the dsreq indexed search API does not expose a reliable server-side created-date sort.","signature":"(collabspace: str | None = None, limit: int = 10, query: str = '*', sort_by: str = 'created', fetch_limit: int = 100) -> dict","tags":[],"mutates":false,"module":"domains.curated.requirements","parameters":[{"name":"collabspace","required":false,"type":"str | None","default":null},{"name":"limit","required":false,"type":"int","default":10},{"name":"query","required":false,"type":"str","default":"*"},{"name":"sort_by","required":false,"type":"str","default":"created"},{"name":"fetch_limit","required":false,"type":"int","default":100}]},{"name":"req_search","description":"Search Requirements (individual requirement statements) by free-text. Returns {total, items}. Use this when the user asks about 'requirements', 'specs', 'requirement IDs', or anything verb-like 'shall...'. For folders/specifications containing requirements, use `req_spec_search`.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.requirements","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"req_spec_expand","description":"Get the chapters + requirements tree under a Requirement Specification.","signature":"(spec_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.requirements","parameters":[{"name":"spec_id","required":true,"type":"str"}]},{"name":"req_spec_get","description":"Get one Requirement Specification by id. Use `req_spec_expand` for its tree.","signature":"(spec_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.requirements","parameters":[{"name":"spec_id","required":true,"type":"str"}]},{"name":"req_spec_recent","description":"List recent Requirement Specifications, optionally filtered by collaborative space. Use this for recent requirement documents/specifications/folders.","signature":"(collabspace: str | None = None, limit: int = 10, query: str = '*', sort_by: str = 'created', fetch_limit: int = 100) -> dict","tags":[],"mutates":false,"module":"domains.curated.requirements","parameters":[{"name":"collabspace","required":false,"type":"str | None","default":null},{"name":"limit","required":false,"type":"int","default":10},{"name":"query","required":false,"type":"str","default":"*"},{"name":"sort_by","required":false,"type":"str","default":"created"},{"name":"fetch_limit","required":false,"type":"int","default":100}]},{"name":"req_spec_search","description":"Search Requirement Specifications (containers/folders that hold chapters and individual requirements). USE THIS for 'specifications', 'requirement docs', 'requirement folders'.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.requirements","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"rm_create","description":"Create a Raw Material. Body: {title, description?}.","signature":"(title: str, description: str = '') -> dict","tags":[],"mutates":false,"module":"domains.curated.raw_materials","parameters":[{"name":"title","required":true,"type":"str"},{"name":"description","required":false,"type":"str","default":""}]},{"name":"rm_get","description":"Get one Raw Material by id.","signature":"(rm_id: str) -> dict","tags":[],"mutates":false,"module":"domains.curated.raw_materials","parameters":[{"name":"rm_id","required":true,"type":"str"}]},{"name":"rm_search","description":"Search Raw Materials (material catalogue: metals, plastics, composites). USE THIS for 'raw materials' / 'materials catalogue'.","signature":"(query: str = '*', limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.raw_materials","parameters":[{"name":"query","required":false,"type":"str","default":"*"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"search","description":"DEFAULT search — Engineering Items only. For other object families use the domain-specific tools (req_search, change_action_search, mfg_search, drw_search, rm_search, doc_search) OR `cross_search` to scan ALL families at once. If unsure which tool fits, call `list_capabilities` first.","signature":"(query: str, limit: int = 20) -> dict","tags":[],"mutates":false,"module":"domains.curated.search","parameters":[{"name":"query","required":true,"type":"str"},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"webservice_describe_operation","description":"Describe one OpenAPI operation by key or operationId, including path/query/body shape hints.","signature":"(operation: 'str') -> 'dict'","tags":[],"mutates":false,"module":"domains.curated.webservices","parameters":[{"name":"operation","required":true,"type":"str"}]},{"name":"webservice_execute_operation","description":"Execute a documented 3DEXPERIENCE OpenAPI operation by exact key. Use only after searching/describing the operation. Write calls are blocked by DX_READ_ONLY=true.","signature":"(operation: 'str', path_params: 'dict | None' = None, query_params: 'dict | None' = None, body: 'dict | None' = None) -> 'dict'","tags":[],"mutates":false,"module":"domains.curated.webservices","parameters":[{"name":"operation","required":true,"type":"str"},{"name":"path_params","required":false,"type":"dict | None","default":null},{"name":"query_params","required":false,"type":"dict | None","default":null},{"name":"body","required":false,"type":"dict | None","default":null}]},{"name":"webservice_list_services","description":"List the documented 3DEXPERIENCE OpenAPI service files available locally. Use this when the user asks what platform webservices/APIs exist.","signature":"(query: 'str' = '', limit: 'int' = 80) -> 'dict'","tags":[],"mutates":false,"module":"domains.curated.webservices","parameters":[{"name":"query","required":false,"type":"str","default":""},{"name":"limit","required":false,"type":"int","default":80}]},{"name":"webservice_search_operations","description":"Search the local 3DEXPERIENCE OpenAPI catalogue and return exact operation keys. Call this before webservice_execute_operation when no curated tool fits.","signature":"(query: 'str', service: 'str' = '', method: 'str' = '', include_mutating: 'bool' = False, limit: 'int' = 20) -> 'dict'","tags":[],"mutates":false,"module":"domains.curated.webservices","parameters":[{"name":"query","required":true,"type":"str"},{"name":"service","required":false,"type":"str","default":""},{"name":"method","required":false,"type":"str","default":""},{"name":"include_mutating","required":false,"type":"bool","default":false},{"name":"limit","required":false,"type":"int","default":20}]},{"name":"whoami","description":"Return info about the current authenticated user (sanity check / debugging).","signature":"() -> dict","tags":[],"mutates":false,"module":"domains.curated.search","parameters":[]}]