{"name":"fenecam","title":"FeneCAM cutting optimizer","description":"Agent access to FeneCAM 1-CSP / 2-CSP optimization and PDF/XLS/CSV/DXF export. Not an AI-agent product; the primary product is a browser CAM for window shops.","base_url":"https://www.fenecam.com/api/v1","auth":"Authorization: Bearer fnc_live_… or X-API-Key","scopes":["plans:read","plans:write","optimize","export"],"error_codes":["UNAUTHORIZED","FORBIDDEN_SCOPE","VALIDATION_ERROR","PLAN_NOT_FOUND","PLAN_LIMIT_EXCEEDED","QUOTA_EXCEEDED","CREDITS_EXCEEDED","RATE_LIMITED","OPTIMIZE_BUSY","OPTIMIZE_COOLDOWN","NOT_OPTIMIZED","EXPORT_FORMAT_UNSUPPORTED","SOLVER_FAILED","STOCK_SHORTAGE","UNPLACED_PARTS","WRONG_KIND","FEATURE_DISABLED","EMPTY_CLIPBOARD","NOT_A_TABLE","CLIPBOARD_TOO_LARGE","PARSE_PROVIDER_FAILED","EMAIL_NOT_VERIFIED"],"credits":{"credit_usd":0.01,"credits_per_optimize":1,"free_one_time_grant":1000,"monthly_allotment":{"standard":1000,"professional":2000,"enterprise":12000},"period":"Paid plans: UTC calendar month, unused credits do not carry over. Free: one-time grant, no refill.","credit_packs":[{"credits":1000,"usd":10},{"credits":2000,"usd":20},{"credits":10000,"usd":100}],"credit_packs_url":"https://www.fenecam.com/dashboard/account.html#billing","spend_order":"Plan credits first, then pack credits. Pack credits do not expire.","charged_tools":["optimize_1csp","optimize_2csp"],"free_tools":["import_parts","parse_clipboard","create_or_update_plan","get_result","export_plan"],"shared_with_rest":true,"exhausted_error":"CREDITS_EXCEEDED"},"tools":[{"name":"import_parts","description":"Parse a bill of materials. Set file_format to json, csv, or sob. SOB parts keep their KTN id and both end angles (leftAngle, rightAngle).","scope":"plans:write","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["1csp","2csp"]},"file_format":{"type":"string","enum":["json","csv","sob"],"description":"Data file format. Use this for SOB and for future file types. format is an alias."},"format":{"type":"string","enum":["json","csv","sob"]},"csv":{"type":"string"},"sob":{"type":"string","description":"SOB text. Each KTN part keeps its id plus leftAngle and rightAngle."},"profile":{"type":"string","description":"When an SOB file has several profiles, import only this description or profile code."},"filename":{"type":"string"},"persist":{"type":"boolean"},"name":{"type":"string"},"kerf":{"type":"number"},"sizes":{"type":"array","items":{"type":"object"}},"parts":{"type":"array","items":{"type":"object"}},"stocks":{"type":"array","items":{"type":"object"}}}}},{"name":"parse_clipboard","description":"Read a table pasted from Excel or Google Sheets (TSV; CSV text also works) and return a plan draft: 1csp stocks + sizes (size, quantity, label, leftAngle, rightAngle) with kerf, leftTrim, rightTrim; 2csp sheet stocks (width, height, quantity, grain) + parts (width, height, quantity, label, grain, can_rotate) with kerf and trim. Lengths in mm. Also returns columns_mapped, assumptions and warnings; show them to the user before creating the plan. Pass the result (or its plan field) to create_or_update_plan, or set persist. Uses no credits; max 64 KB; rate limited per account (Free 10/min, paid 30/min).","scope":"plans:write","inputSchema":{"type":"object","required":["kind","clipboard_text"],"properties":{"kind":{"type":"string","enum":["1csp","2csp","1d","2d"],"description":"1csp = bars cut to length, 2csp = panels on sheets. The result always says 1csp or 2csp."},"clipboard_text":{"type":"string","description":"The pasted cells, rows separated by newlines and cells by tabs. At most 64 KB."},"locale_hint":{"type":"string","description":"Language of the headers, e.g. en or zh. Optional."},"unit_hint":{"type":"string","enum":["mm","cm","m","in","ft"],"description":"Unit to assume when the paste states none. Default mm."},"name":{"type":"string","description":"Plan name. Defaults to a name found in the paste, else \"Clipboard import\"."},"persist":{"type":"boolean","description":"If true, also create the plan and return plan_id. Default false."}}}},{"name":"create_or_update_plan","description":"Create or update a cutting plan/workspace the optimizer can run. Pass plan_id to update.","scope":"plans:write","inputSchema":{"type":"object","properties":{"plan_id":{"type":"string","description":"Plan id returned by create_or_update_plan"},"kind":{"type":"string","enum":["1csp","2csp"]},"name":{"type":"string"},"kerf":{"type":"number"},"sizes":{"type":"array","items":{"type":"object"}},"parts":{"type":"array","items":{"type":"object"}},"stocks":{"type":"array","items":{"type":"object"}}}}},{"name":"optimize_1csp","description":"Run linear profile optimization for aluminium or uPVC bars. Returns bars used, yield, waste, remnants, pattern summary. Uses 1 credit ($0.01) for a new solve, also when the solver fails; an unchanged plan returns the saved result for 0 credits. Returns credits_used, credits_remaining, credits_allotment, credits_refill, pack_credits_remaining, period_key.","scope":"optimize","inputSchema":{"type":"object","required":["plan_id"],"properties":{"plan_id":{"type":"string","description":"Plan id returned by create_or_update_plan"},"idempotency_key":{"type":"string","description":"Optional. Reuse the same key when retrying the same optimize call this month: the first outcome is returned and no second credit is used."}}}},{"name":"optimize_2csp","description":"Run sheet/panel nesting for glass and infill. Returns sheets used, yield, waste, remnants, pattern summary. Uses 1 credit ($0.01) for a new solve, also when the solver fails; an unchanged plan returns the saved result for 0 credits. Returns credits_used, credits_remaining, credits_allotment, credits_refill, pack_credits_remaining, period_key.","scope":"optimize","inputSchema":{"type":"object","required":["plan_id"],"properties":{"plan_id":{"type":"string","description":"Plan id returned by create_or_update_plan"},"idempotency_key":{"type":"string","description":"Optional. Reuse the same key when retrying the same optimize call this month: the first outcome is returned and no second credit is used."}}}},{"name":"get_result","description":"Idempotent read of yield, remnants, waste and patterns for a plan id. Never returns another user’s plan. Free: uses no credits.","scope":"plans:read","inputSchema":{"type":"object","required":["plan_id"],"properties":{"plan_id":{"type":"string","description":"Plan id returned by create_or_update_plan"}}}},{"name":"export_plan","description":"Export a completed plan as PDF, XLS, CSV or DXF only. Named CNC file dialects are undocumented and not exported.","scope":"export","inputSchema":{"type":"object","required":["plan_id","format"],"properties":{"plan_id":{"type":"string","description":"Plan id returned by create_or_update_plan"},"format":{"type":"string","enum":["pdf","xls","csv","dxf"]}}}}]}