{"server":{"name":"steelframe","version":"1.0.0"},"lane":"persistent","instructions":"SteelFrame: a real z/OS-style mainframe engine (JES2 batch, CICS online, VSAM/DB2, CA-7/Control-M scheduler). Everything you do here is PERSISTENT and visible in the SteelFrame web as your userid. Two uses. (1) Developer loop: check_source / upload_source / compile_program / run_program, then the JES2 tools (submit_job, wait_job, read_spool) and the dataset tools. (2) Reference ORACLE for modernization comparison: SteelFrame RETURNS what the mainframe holds and does — files (decode_records, export_bundle, export_state), a batch run's joblog + output datasets (run_batch), online screens ONE keystroke at a time (cics_open_session → cics_send → cics_close_session, or cics_run_script), scheduler cycles (sched_demand / sched_order → sched_wait_cycle). It never judges equivalence and never converts code: replay the same inputs against your modernized system and compare on your side. CICS definitions: cics_ceda runs ONE CEDA command line (DEFINE/ALTER/DELETE/INSTALL/COPY/VIEW/CHECK/EXPAND/LIST, LIBRARY included) and cics_cemt ONE CEMT line (INQUIRE/SET/DISCARD/PERFORM), decided by RACF for your userid exactly like the 3270 transactions: your own CSD groups (your personal group is named after your userid; GROUP(g) is required on DEFINE), never system-owned entries unless you are an administrator; cics_define is the JSON form of DEFINE and cics_csd the whole CSD as data. Isolation: create_workspace (give it a name), then pass workspace:<id> on any tool call to run it on a copy of the estate (the live estate never changes); reset_workspace re-baselines it. Creation is ASYNCHRONOUS: if the response says status:CREATING, poll get_workspace every 10-15 s until status=RUNNING before using it (tools are refused 409 NOT READY until then) — never call create_workspace again meanwhile (the same name returns the in-flight one). Seeding: load_dataset / stage_gdg (rows + copybook, or hex). Determinism: clock:{fixed:...} on run_batch / cics_open_session / cics_run_script pins the program clock; JOBIDs and JES timestamps stay real — decide on your side what to ignore.","workspaceProxy":"/api/workspaces/{id}/call","tools":[{"name":"whoami","description":"The user behind the presented bearer token (authoritative token→user mapping; both web surfaces refresh their cached user from this at boot)","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":null,"_binding":{"id":"whoami","method":"GET","path":"/api/me","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"upload_source","description":"MCP composite upload_source: batch-write source members into real cataloged datasets under the caller HLQ (allocate-if-missing PO FB80). kind cbl→<HLQ>.SOURCE, cpy→<HLQ>.COPYLIB, jcl→<HLQ>.JCL","inputSchema":{"type":"object","properties":{"items":{"description":"array of { member, lines, kind: 'cbl'|'cpy'|'jcl', dsn (optional override) }","type":"array","items":{"type":"object","properties":{"member":{"type":"string"},"lines":{"type":"array","items":{"type":"string"}},"kind":{"type":"string","enum":["cbl","cpy","jcl"]},"dsn":{"type":"string"}},"required":["member","lines"]}},"hlq":{"type":"string","description":"target dataset-name prefix: one or more dotted qualifiers, e.g. SYNUT or SYN.UT (default: your userid)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["items"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"mcpUploadSource","method":"POST","path":"/api/mcp/upload","pathParams":[],"queryParams":[],"bodyParams":["items","hlq"],"extraParams":["workspace"]}},{"name":"compile_program","description":"MCP composite compile_program: one-shot compile+link of a COBOL program through the REAL pipeline — source into <HLQ>.SOURCE, a generated EXEC IGYWCL deck through JES2, per-step RCs, diagnostics parsed from the genuine SYSPRINT listing; the load module lands in <HLQ>.LOADLIB (persistent, visible in the web as your job/datasets). Oracle use: loadlib + syslib install the module INTO an estate library (e.g. AWS.M2.CARDDEMO.LOADLIB) with the estate's copybooks","inputSchema":{"type":"object","properties":{"program":{"type":"string","description":"program/member name (1-8 chars) — becomes GOPGM and the load-module name"},"lines":{"type":"array","items":{"type":"string"},"description":"COBOL source card images (omit to compile an existing member)"},"copybooks":{"description":"array of { member, lines } staged into <HLQ>.COPYLIB and searched via SYSLIB (optional)","type":"array","items":{"type":"object","properties":{"member":{"type":"string"},"lines":{"type":"array","items":{"type":"string"}}},"required":["member","lines"]}},"parm":{"type":"string","description":"compile PARM, e.g. 'SQL' (DB2 precompile) or 'CICS' (translator); auto-detected from the source when omitted"},"hlq":{"type":"string","description":"dataset-name prefix: one or more dotted qualifiers, e.g. SYNUT or SYN.UT (default: your userid)"},"sourceDsn":{"type":"string","description":"source PDS override (default <HLQ>.SOURCE)"},"sourceMember":{"type":"string","description":"source member override (default: program)"},"loadlib":{"type":"string","description":"target load library override (default <HLQ>.LOADLIB) — install the module into an estate library, e.g. AWS.M2.CARDDEMO.LOADLIB"},"syslib":{"description":"copybook library search order: an ARRAY of cataloged PDS names (one string, comma-separated, also accepted; any other type is a 400); SYS2.COBOL.COPYLIB is appended — default <HLQ>.COPYLIB + SYS2.COBOL.COPYLIB","anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"timeout":{"description":"seconds to wait for the compile job (default 120, max 300); on timeout the jobid is returned for wait_job re-polling","type":"integer"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["program"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"jobs.write","_binding":{"id":"mcpCompileProgram","method":"POST","path":"/api/mcp/compile","pathParams":[],"queryParams":[],"bodyParams":["program","lines","copybooks","parm","hlq","sourceDsn","sourceMember","loadlib","syslib","timeout"],"extraParams":["workspace"]}},{"name":"run_program","description":"MCP composite run_program: generate+submit a GO deck (EXEC PGM= with STEPLIB <HLQ>.LOADLIB and DDs from a simple JSON spec) through JES2, wait, and return the RC plus the SYSOUT spool contents","inputSchema":{"type":"object","properties":{"program":{"type":"string","description":"load-module name in the STEPLIB (compile_program output)"},"parm":{"type":"string","description":"PARM= string passed to the program (optional)"},"dd":{"description":"DD spec object: { DDNAME: {lines: [...]} (instream) | {dsn, disp?, attrs?} | {sysout: true} | {dummy: true} } — STEPLIB and a default SYSOUT DD are generated","type":"object"},"hlq":{"type":"string","description":"STEPLIB HLQ (default: your userid → <HLQ>.LOADLIB)"},"steplib":{"type":"string","description":"explicit STEPLIB dataset override"},"timeout":{"description":"seconds to wait (default 120, max 300)","type":"integer"},"tail":{"description":"max lines of each SYSOUT file returned (default 500)","type":"integer"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["program"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"jobs.write","_binding":{"id":"mcpRunProgram","method":"POST","path":"/api/mcp/run","pathParams":[],"queryParams":[],"bodyParams":["program","parm","dd","hlq","steplib","timeout","tail"],"extraParams":["workspace"]}},{"name":"system_info","description":"Instance information: product/release, uptime, data root, subsystem status, engine-wide security posture","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"system.read","_binding":{"id":"systemInfo","method":"GET","path":"/api/system/info","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"list_datasets","description":"List catalog entries matching an MVS pattern (or a name prefix); the whole list by default, a page with total/truncated/next when max or from is given","inputSchema":{"type":"object","properties":{"pattern":{"type":"string","description":"MVS pattern (* = one qualifier chunk, ** = any, % = one char); default <user>.**"},"prefix":{"type":"string","description":"dataset-name prefix instead of a pattern: SYN.BANK lists SYN.BANK and every SYN.BANK.* entry"},"max":{"type":"string","description":"page size (1-5000); giving max or from returns { datasets, total, from, count, truncated, next } instead of the bare array"},"from":{"type":"string","description":"first entry of the page (0-based)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"listDatasets","method":"GET","path":"/api/datasets","pathParams":[],"queryParams":["pattern","prefix","max","from"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"search_catalog","description":"Search the catalog: dataset names, member names, and optionally member text content","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"MVS dataset pattern (default **) or bare string matched as **string** (query is an alias)"},"member":{"type":"string","description":"member-name pattern (* wildcard) — lists matching members of matching PO datasets"},"content":{"type":"string","description":"substring grep (case-insensitive) over member text of matching PO datasets"},"max":{"type":"string","description":"result cap per section (default 200, max 1000)"},"from":{"type":"string","description":"first dataset of the page (0-based) — page the datasets section with total/next"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"},"query":{"type":"string","description":"alias of q: MVS dataset pattern (default **) or bare string matched as **string** (query is an alias)"},"pattern":{"type":"string","description":"alias of q: MVS dataset pattern (default **) or bare string matched as **string** (query is an alias)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"searchCatalog","method":"GET","path":"/api/search","pathParams":[],"queryParams":["q","member","content","max","from"],"bodyParams":[],"extraParams":["workspace"],"aliases":{"query":"q","pattern":"q"}}},{"name":"check_source","description":"Compile-check source through the engine compiler pipeline (no artifacts); diagnostics cannot drift from a real compile step","inputSchema":{"type":"object","properties":{"language":{"type":"string","description":"'COBOL' (default) or 'JCL'"},"lines":{"type":"array","items":{"type":"string"},"description":"source card images"},"syslib":{"description":"array of PO dataset names for COPY resolution (optional)","type":"array","items":{"type":"string"}},"parm":{"type":"string","description":"compile PARM string, e.g. 'CICS' to force the translator (optional)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["lines"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"checkSource","method":"POST","path":"/api/check","pathParams":[],"queryParams":[],"bodyParams":["language","lines","syslib","parm"],"extraParams":["workspace"]}},{"name":"allocate_dataset","description":"Allocate (catalog) a new dataset; omitted BLKSIZE is system-determined","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"attrs":{"description":"{ dsorg, recfm, lrecl, ... }","type":"object"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"allocateDataset","method":"POST","path":"/api/dataset","pathParams":[],"queryParams":[],"bodyParams":["dsn","attrs"],"extraParams":["workspace"]}},{"name":"dataset_info","description":"Dataset info (PO datasets include memberList)","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"getDataset","method":"GET","path":"/api/dataset/{dsn}","pathParams":["dsn"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"list_members","description":"List the members of a PDS (the memberList of dataset_info on its own): name, changed, size, inUse when another session holds an edit","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"PDS name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"listMembers","method":"GET","path":"/api/dataset/{dsn}/members","pathParams":["dsn"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"delete_dataset","description":"Delete/uncatalog a dataset (VSAM clusters included)","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"datasets.write","_binding":{"id":"deleteDataset","method":"DELETE","path":"/api/dataset/{dsn}","pathParams":["dsn"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"rename_dataset","description":"Rename a dataset","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"newName":{"type":"string","description":"new dataset name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","newName"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"datasets.write","_binding":{"id":"renameDataset","method":"POST","path":"/api/dataset/{dsn}/rename","pathParams":["dsn"],"queryParams":[],"bodyParams":["newName"],"extraParams":["workspace"]}},{"name":"copy_dataset","description":"Copy a dataset","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"newName":{"type":"string","description":"target dataset name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","newName"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"copyDataset","method":"POST","path":"/api/dataset/{dsn}/copy","pathParams":["dsn"],"queryParams":[],"bodyParams":["newName"],"extraParams":["workspace"]}},{"name":"read_records","description":"Read raw records as hex (PS + VSAM; binary-safe for packed/zoned/binary fields). GDG relative names BASE(0)/BASE(-n) resolve to the current/older generation","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name (GDG relative form BASE(0) / BASE(-n) accepted)"},"from":{"type":"string","description":"first record index (default 0)"},"count":{"type":"string","description":"record count (default 1000, max 10000)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"readRecords","method":"GET","path":"/api/dataset/{dsn}/records","pathParams":["dsn"],"queryParams":["from","count"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"write_records","description":"Write raw records from hex (VSAM: keyed writes into the cluster)","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"records":{"type":"array","items":{"type":"string"},"description":"array of hex-encoded records"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","records"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"writeRecords","method":"PUT","path":"/api/dataset/{dsn}/records","pathParams":["dsn"],"queryParams":[],"bodyParams":["records"],"extraParams":["workspace"]}},{"name":"read_member_records","description":"Read raw records of a PDS member as hex","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"member":{"type":"string","description":"member name"},"from":{"type":"string","description":"first record index (default 0)"},"count":{"type":"string","description":"record count (default 1000, max 10000)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","member"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"readMemberRecords","method":"GET","path":"/api/dataset/{dsn}/records/{member}","pathParams":["dsn","member"],"queryParams":["from","count"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"write_member_records","description":"Write raw records of a PDS member from hex","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"member":{"type":"string","description":"member name"},"records":{"type":"array","items":{"type":"string"},"description":"array of hex-encoded records"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","member","records"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"writeMemberRecords","method":"PUT","path":"/api/dataset/{dsn}/records/{member}","pathParams":["dsn","member"],"queryParams":[],"bodyParams":["records"],"extraParams":["workspace"]}},{"name":"read_dataset","description":"Read a PS dataset (or browse a VSAM cluster) as text lines; ?view=hex for a hex dump","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"view":{"type":"string","description":"'hex' for a hex/EBCDIC dump"},"start":{"type":"string","description":"first record number for a paged read (0-based; with count, returns { lines, paged, start, total })"},"count":{"type":"string","description":"record count for a paged read (default 1000, max 100000)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"readDatasetContent","method":"GET","path":"/api/dataset/{dsn}/member","pathParams":["dsn"],"queryParams":["view","start","count"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"write_dataset","description":"Write a PS dataset as text lines (converted to EBCDIC at rest). Honours If-Match/ifMatch against the dataset's version tag (412 on stale copy); refused 409 while a job or another edit session holds the dataset (Lane-9 F9.1/F9.2/F9.3)","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"lines":{"type":"array","items":{"type":"string"},"description":"array of text lines"},"ifMatch":{"type":"string","description":"version tag from GET (optional; stale copy -> 412)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","lines"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"writeDatasetContent","method":"PUT","path":"/api/dataset/{dsn}/member","pathParams":["dsn"],"queryParams":[],"bodyParams":["lines","ifMatch"],"extraParams":["workspace"]}},{"name":"read_member","description":"Read a PDS member as text lines; ?view=hex for a hex dump","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"member":{"type":"string","description":"member name"},"view":{"type":"string","description":"'hex' for a hex/EBCDIC dump"},"start":{"type":"string","description":"first record number for a paged read (0-based)"},"count":{"type":"string","description":"record count for a paged read (default 1000, max 100000)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","member"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"readMember","method":"GET","path":"/api/dataset/{dsn}/member/{member}","pathParams":["dsn","member"],"queryParams":["view","start","count"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"write_member","description":"Write a PDS member as text lines. Honours If-Match/ifMatch against the member's version tag (412 on stale copy); refused 409 while a job or another edit session holds it (Lane-9 F9.1/F9.2/F9.3). A dataset that is not cataloged is a 404 unless allocate is given (then it is allocated first, PO FB 80 by default — the same allocate-if-missing upload_source does)","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"member":{"type":"string","description":"member name"},"lines":{"type":"array","items":{"type":"string"},"description":"array of text lines"},"ifMatch":{"type":"string","description":"version tag from GET (optional; stale copy -> 412)"},"allocate":{"description":"true = allocate the PDS if it is not cataloged (PO FB LRECL 80), or { dsorg, recfm, lrecl, ... } attributes for it","anyOf":[{"type":"boolean"},{"type":"object"}]},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","member","lines"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"writeMember","method":"PUT","path":"/api/dataset/{dsn}/member/{member}","pathParams":["dsn","member"],"queryParams":[],"bodyParams":["lines","ifMatch","allocate"],"extraParams":["workspace"]}},{"name":"delete_member","description":"Delete a PDS member","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"member":{"type":"string","description":"member name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","member"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"datasets.write","_binding":{"id":"deleteMember","method":"DELETE","path":"/api/dataset/{dsn}/member/{member}","pathParams":["dsn","member"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"rename_member","description":"Rename a PDS member","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"member":{"type":"string","description":"member name"},"newName":{"type":"string","description":"new member name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","member","newName"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"renameMember","method":"POST","path":"/api/dataset/{dsn}/member/{member}/rename","pathParams":["dsn","member"],"queryParams":[],"bodyParams":["newName"],"extraParams":["workspace"]}},{"name":"copy_member","description":"Copy a PDS member (optionally to another PDS)","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name"},"member":{"type":"string","description":"member name"},"toDsn":{"type":"string","description":"target PDS (default same)"},"toMember":{"type":"string","description":"target member name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn","member"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"copyMember","method":"POST","path":"/api/dataset/{dsn}/member/{member}/copy","pathParams":["dsn","member"],"queryParams":[],"bodyParams":["toDsn","toMember"],"extraParams":["workspace"]}},{"name":"define_cluster","description":"Define a VSAM cluster (IDCAMS DEFINE CLUSTER equivalent)","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"cluster name"},"type":{"type":"string","description":"KSDS|ESDS|RRDS (default KSDS)"},"keylen":{"description":"key length","type":"integer"},"keyoff":{"description":"key offset","type":"integer"},"maxrecl":{"description":"max record length","type":"integer"},"avgrecl":{"description":"average record length","type":"integer"},"volser":{"type":"string","description":"volume (default WORK01)"},"freespace":{"type":"string","description":"freespace string"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["name"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.write","_binding":{"id":"vsamDefine","method":"POST","path":"/api/vsam/define","pathParams":[],"queryParams":[],"bodyParams":["name","type","keylen","keyoff","maxrecl","avgrecl","volser","freespace"],"extraParams":["workspace"]}},{"name":"vsam_info","description":"VSAM cluster attributes and record count","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"cluster name"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"vsamInfo","method":"GET","path":"/api/vsam/info","pathParams":[],"queryParams":["dsn"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"submit_job","description":"Submit JCL to JES2 (internal-reader equivalent)","inputSchema":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"string"},"description":"array of JCL card images"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["lines"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"jobs.write","_binding":{"id":"submitJob","method":"POST","path":"/api/submit","pathParams":[],"queryParams":[],"bodyParams":["lines"],"extraParams":["workspace"]}},{"name":"list_jobs","description":"List jobs on the queue/output, most recent first (defaults to YOUR jobs; owner:\"\" lists every job you may see - your own and those that NOTIFY you; the system view needs RACF SPECIAL/OPERATIONS or a JESSPOOL grant)","inputSchema":{"type":"object","properties":{"max":{"type":"string","description":"return at most N jobs (default: all)"},"owner":{"type":"string","description":"only jobs owned by this userid"},"prefix":{"type":"string","description":"only jobs whose jobname matches (exact name or * wildcard, like SDSF PREFIX)"},"skip":{"type":"string","description":"skip the first N matching jobs (paging window for SDSF F8/DOWN)"},"count":{"type":"string","description":"1 = return { total } of matching jobs instead of the list (paging: DOWN MAX)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"jobs.read","_binding":{"id":"listJobs","method":"GET","path":"/api/jobs","pathParams":[],"queryParams":["max","owner","prefix","skip","count"],"bodyParams":[],"extraParams":["workspace"]},"_defaults":{"owner":"$USER"}},{"name":"get_job","description":"Job status + spool file list","inputSchema":{"type":"object","properties":{"jobid":{"type":"string","description":"JES2 job id (JOBnnnnn)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jobid"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"jobs.read","_binding":{"id":"getJob","method":"GET","path":"/api/jobs/{jobid}","pathParams":["jobid"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"wait_job","description":"Long-poll until the job completes (OUTPUT/OUTPUT-HOLD) or the timeout passes. Long jobs: on { timedOut: true } simply call wait_job again with the same jobid","inputSchema":{"type":"object","properties":{"jobid":{"type":"string","description":"JES2 job id"},"timeout":{"type":"string","description":"seconds (default 60, max 300)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jobid"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"jobs.read","_binding":{"id":"waitJob","method":"GET","path":"/api/jobs/{jobid}/wait","pathParams":["jobid"],"queryParams":["timeout"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"read_spool","description":"Read one spool file of a job — by its full name from the files list (Dnnnn.STEP.DD) or by the stable STEP.DD / DD handle (the Dnnnn spool-dataset number is assigned per run and shifts between otherwise identical jobs)","inputSchema":{"type":"object","properties":{"jobid":{"type":"string","description":"JES2 job id"},"name":{"type":"string","description":"spool file name (from the files list), or STEP.DD / PROCSTEP.STEP.DD / DD without the Dnnnn prefix"},"tail":{"type":"integer","description":"return only the last N lines (default 500)"},"full":{"type":"boolean","description":"true = the whole file (careful: listings can be long)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jobid","name"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"jobs.read","_binding":{"id":"readSpool","method":"GET","path":"/api/jobs/{jobid}/file/{name}","pathParams":["jobid","name"],"queryParams":[],"bodyParams":[],"extraParams":["tail","full","workspace"]},"_guard":{"kind":"tail","field":"content","defaultLines":500}},{"name":"list_replies","description":"Outstanding operator replies (WTOR): console messages awaiting a reply, with the owning job","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"jobs.read","_binding":{"id":"listReplies","method":"GET","path":"/api/jes/replies","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"reply_wtor","description":"Answer an outstanding reply (console R nn,text equivalent) — unblocks the waiting job step","inputSchema":{"type":"object","properties":{"replyId":{"type":"string","description":"outstanding reply id (2-digit, leading zero optional)"},"text":{"type":"string","description":"reply text delivered to the waiting program"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["replyId","text"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"jobs.write","_binding":{"id":"replyWtor","method":"POST","path":"/api/jes/replies/{replyId}","pathParams":["replyId"],"queryParams":[],"bodyParams":["text"],"extraParams":["workspace"]}},{"name":"cancel_job","description":"Cancel a job ($C J equivalent). ACTIVE: kills the tracked step child processes, unblocks its outstanding replies, and the job completes ABEND S222 with canceled:true. INPUT-HOLD: the held job completes CANCELED without ever running. OUTPUT-HOLD: the held output is canceled — the job is purged","inputSchema":{"type":"object","properties":{"jobid":{"type":"string","description":"JES2 job id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jobid"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"jobs.write","_binding":{"id":"cancelJob","method":"POST","path":"/api/jobs/{jobid}/cancel","pathParams":["jobid"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"hold_job","description":"Hold a job still on the input queue ($H J equivalent): it stays INPUT-HOLD — the mined casout /g state 1 — until released. TYPRUN=HOLD jobs arrive already held","inputSchema":{"type":"object","properties":{"jobid":{"type":"string","description":"JES2 job id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jobid"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"jobs.write","_binding":{"id":"holdJob","method":"POST","path":"/api/jobs/{jobid}/hold","pathParams":["jobid"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"release_job","description":"Release a held job ($A J equivalent): an INPUT-HOLD job (operator hold or TYPRUN=HOLD/JCLHOLD) is queued for the initiator and runs","inputSchema":{"type":"object","properties":{"jobid":{"type":"string","description":"JES2 job id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jobid"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"jobs.write","_binding":{"id":"releaseJob","method":"POST","path":"/api/jobs/{jobid}/release","pathParams":["jobid"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"inventory_scan","description":"Static portfolio scan: programs (language/LOC/CICS/SQL/DLI/MQ flags, CALL+COPY refs), jobs (EXEC PGM steps, DSN refs), BMS mapsets, copybooks","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"dataset pattern to scan (default **)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"inventoryScan","method":"GET","path":"/api/inventory","pathParams":[],"queryParams":["q"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"analysis_model","description":"The estate analysis model index (W7.1): per-program paragraphs/calls/files/SQL with dynamic-target resolution counts, per-job step+DD detail, screens, copybooks","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"dataset pattern to scan (default **)"},"refresh":{"type":"string","description":"bypass the 30s model cache when \"1\""},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"analysisModel","method":"GET","path":"/api/analysis/model","pathParams":[],"queryParams":["q","refresh"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"analysis_graph","description":"Analysis graphs (W7.1): kind=call (CALL/LINK/XCTL edges with literal/resolved/unresolved provenance), kind=job (job→program→dataset with I/O direction + cross-job dataflow), kind=screen (mapsets/transids + XCTL/RETURN-TRANSID navigation; transids resolve through the region CSD)","inputSchema":{"type":"object","properties":{"kind":{"type":"string","description":"call | job | screen (required)"},"q":{"type":"string","description":"dataset pattern to scan (default **)"},"refresh":{"type":"string","description":"bypass the model cache when \"1\""},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"analysisGraph","method":"GET","path":"/api/analysis/graph","pathParams":[],"queryParams":["kind","q","refresh"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"analysis_impact","description":"Field-level impact trace (W7.2, A13.2b): BFS over the estate impact graph — MOVE/COMPUTE/arith dataflow, group/REDEFINES aliasing, copybook identity, CALL USING linkage, COMMAREA, WRITE→dataset→READ file flow — from a seed field; expand:true answers the Change-Analyzer-style worklist grouped by program/copybook/dataset","inputSchema":{"type":"object","properties":{"field":{"type":"string","description":"seed field name (required)"},"program":{"type":"string","description":"restrict the seed to one program"},"copybook":{"type":"string","description":"seed the copybook-identity hub instead"},"depth":{"description":"BFS depth cap (default 6)","type":"integer"},"dir":{"type":"string","description":"'forward' | 'backward' | 'both' (default both)"},"expand":{"description":"true = seed-expansion worklist shape","type":"boolean"},"q":{"type":"string","description":"dataset pattern to scan (default **)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["field"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"analysisImpact","method":"POST","path":"/api/analysis/impact","pathParams":[],"queryParams":[],"bodyParams":["field","program","copybook","depth","dir","expand","q"],"extraParams":["workspace"]}},{"name":"analysis_metrics","description":"Complexity/dead-code metrics (W7.3, A13.2c): per-program cyclomatic complexity (pinned formula 1+IF+WHEN+AND/OR+UNTIL+handlers), dead paragraphs (conservative reachability; ALTER programs refuse loudly), unreferenced data, estate-dead copybook fields, plus the text report","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"dataset pattern to scan (default **)"},"program":{"type":"string","description":"single program (full metrics row)"},"report":{"type":"string","description":"\"text\" adds the rendered report"},"refresh":{"type":"string","description":"bypass the model cache when \"1\""},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"analysisMetrics","method":"GET","path":"/api/analysis/metrics","pathParams":[],"queryParams":["q","program","report","refresh"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"explain_program","description":"LLM program explanation over the analysis model (W7.4, A12.12): assembles a deterministic context pack (structure, call neighborhood, jobs/datasets, screens, metrics, shared copybooks, capped source) into a provider-agnostic request. GATED without tenant AI config (SF_AI_PROVIDER/SF_AI_MODEL/SF_AI_KEY/SF_AI_URL): returns the assembled prompt+request with gated:true, never a fabricated answer; with a key the live call runs","inputSchema":{"type":"object","properties":{"program":{"type":"string","description":"program name (required)"},"paragraph":{"type":"string","description":"focus one paragraph"},"q":{"type":"string","description":"dataset pattern to scan (default **)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"analysisExplain","method":"GET","path":"/api/analysis/explain","pathParams":[],"queryParams":["program","paragraph","q"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"run_capture","description":"Run a JCL deck and keep its golden envelope (RC/abend, every spool file, named output datasets as record hex) as a capture. Oracle use: prefer run_batch (joblog + decoded rows + run record); this is the raw capture primitive","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"capture name"},"jcl":{"description":"JCL card images","type":"array","items":{"type":"string"}},"datasets":{"description":"output dataset names to snapshot (optional)","type":"array","items":{"type":"string"}},"masks":{"description":"regexes masked before spool compare (defaults: jobids/timestamps)","type":"array","items":{"type":"string"}},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jcl"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"jobs.write","_binding":{"id":"captureRun","method":"POST","path":"/api/captures","pathParams":[],"queryParams":[],"bodyParams":["name","jcl","datasets","masks"],"extraParams":["workspace"]}},{"name":"list_runs","description":"List run records (run_batch / cics_run_script / sched_wait_cycle, format steelframe-run/1) and golden captures, newest first","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"jobs.read","_binding":{"id":"captureList","method":"GET","path":"/api/captures","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"get_run","description":"One run record (steelframe-run/1: jobs[].joblog, after.datasets hex+rows, cycle, before) or golden capture by id — the persisted artifact of run_batch / sched_wait_cycle / cics_run_script","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"capture id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"jobs.read","_binding":{"id":"captureGet","method":"GET","path":"/api/captures/{id}","pathParams":["id"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"delete_run","description":"Delete a run record (run_batch / cics_run_script / sched_wait_cycle) or a golden capture by id","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"run record / capture id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"jobs.write","_binding":{"id":"captureDelete","method":"DELETE","path":"/api/captures/{id}","pathParams":["id"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"search_source","description":"Find source members by kind and/or content across the text PO libraries: kind is detected from content (program|copybook|jcl|proc|bms|csd|other); with q the matching lines are returned with optional context, without q the members of the wanted kinds are listed","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"text to find (substring, case-insensitive; regex=true for a regular expression); omit to list members by kind"},"regex":{"type":"string","description":"'true' = q is a regular expression"},"kinds":{"type":"string","description":"comma list of kinds to keep: program,copybook,jcl,proc,bms,csd,other"},"libraries":{"type":"string","description":"comma list of PO datasets to scan (default: every non-load PO library; the 2000-member scan cap applies — give libraries on big estates); dsn / library are aliases"},"member":{"type":"string","description":"member-name pattern (* wildcard)"},"max":{"type":"string","description":"result cap (default 200, max 2000)"},"context":{"type":"string","description":"lines of context before/after each hit (0-20)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"},"dsn":{"type":"string","description":"alias of libraries: comma list of PO datasets to scan (default: every non-load PO library; the 2000-member scan cap applies — give libraries on big estates); dsn / library are aliases"},"library":{"type":"string","description":"alias of libraries: comma list of PO datasets to scan (default: every non-load PO library; the 2000-member scan cap applies — give libraries on big estates); dsn / library are aliases"},"query":{"type":"string","description":"alias of q: text to find (substring, case-insensitive; regex=true for a regular expression); omit to list members by kind"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"searchSource","method":"GET","path":"/api/search/source","pathParams":[],"queryParams":["q","regex","kinds","libraries","member","max","context"],"bodyParams":[],"extraParams":["workspace"],"aliases":{"dsn":"libraries","library":"libraries","query":"q"}}},{"name":"find_program","description":"Everything the estate knows about one program, as data: source location, transitive copybooks (COPY / EXEC SQL INCLUDE closure through the copybook libraries), load modules, every JCL step that runs it (+ the deck location), the CSD slice (PPT entry, transactions, FILEs the source names), mapsets, and the scheduler jobs that run those decks","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"program name"},"syslib":{"type":"string","description":"comma list of copybook libraries to resolve COPY through (default: the source library, every *COPY*/DCLGEN PO, SYS2.COBOL.COPYLIB)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["name"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"findProgram","method":"GET","path":"/api/search/program/{name}","pathParams":["name"],"queryParams":["syslib"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"decode_records","description":"Records of a dataset decoded through a copybook: byte truth (hex, charset stated — EBCDIC at rest for PS/PDS, program image for KSDS/ESDS) beside the decoded rows (alphanumerics right-trimmed, numerics as exact scaled-decimal strings, OCCURS expanded, FILLER omitted) and the field layout","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"dataset name (GDG relative (0)/(-n) accepted)"},"copybook":{"description":"record layout as 'LIB(MEMBER)' or { dsn, member } (required)","anyOf":[{"type":"string"},{"type":"object","properties":{"dsn":{"type":"string"},"member":{"type":"string"}},"required":["dsn","member"]}]},"record":{"type":"string","description":"which 01 level to use when the copybook holds several"},"member":{"type":"string","description":"PDS member (for a PO dataset)"},"from":{"type":"string","description":"first record (0-based, default 0)"},"count":{"type":"string","description":"records to return (default 1000, max 10000)"},"hex":{"type":"string","description":"'false' = rows only (default true: hex beside rows)"},"syslib":{"type":"string","description":"comma list of libraries nested COPY statements resolve through"},"ccsid":{"type":"string","description":"CCSID the EBCDIC-at-rest alphanumerics decode through (SBCS 37/273/284/285/297/500/1140/... or mixed 930/939/933/935/937/1399 with SO/SI); default = the dataset's effective CCSID (37). EBCDIC-at-rest datasets (PS/PDS/GDG) only: on a program-charset VSAM cluster it has no effect and the answer says so (ccsidIgnored: true + ccsidNote). PIC G is DBCS, PIC N UTF-16BE regardless"},"numbers":{"description":"numeric output form: 'native' (default: a JSON number when a double carries the exact decimal, else the exact decimal string — a whole-valued S9(10)V99 shows as 194, a 9(9) as 20973888), 'decimal' (ALWAYS the exact decimal text at the PICTURE scale: \"194.00\", \"-0.05\", \"20973888\") or 'display' (the fixed-width digit image of the PICTURE: \"0000000194.00\", \"020973888\"). Same byte-true magnitude in every form; layout[] carries digits/scale/signed per numeric field","type":"string","enum":["native","decimal","display"]},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"decodeRecords","method":"GET","path":"/api/dataset/{dsn}/decoded","pathParams":["dsn"],"queryParams":["copybook","record","member","from","count","hex","syslib","ccsid","numbers"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"encode_records","description":"JSON rows -> record images through a copybook (the inverse of decode_records): charset ebcdic (PS at rest — DISPLAY fields transcoded, COMP/COMP-3 bit-exact) or program (KSDS/ESDS image); feed the hex to write_records","inputSchema":{"type":"object","properties":{"copybook":{"type":"string","description":"record layout as 'LIB(MEMBER)' or { dsn, member }"},"lines":{"type":"array","items":{"type":"string"},"description":"or the copybook card images inline"},"record":{"type":"string","description":"which 01 level when the copybook holds several"},"rows":{"description":"array of row objects (keys = item names, case/hyphen-insensitive; groups nested or flat; OCCURS as arrays; numerics as strings or numbers)","type":"array","items":{"type":"object"}},"charset":{"description":"'ebcdic' (default, PS/PDS at rest) or 'program' (KSDS/ESDS image)","type":"string","enum":["ebcdic","program"]},"ccsid":{"description":"CCSID of the EBCDIC alphanumerics (default 37): SBCS pages 273/284/285/297/500/1140/... or mixed 930/939/933/935/937/1399 (SO/SI framed); unmappable characters -> the page's SUB X'3F'. PIC G = DBCS 2 bytes/char (X'4040' pad), PIC N = UTF-16BE 2 bytes/char regardless","type":"string"},"syslib":{"description":"libraries nested COPY statements resolve through","type":"array","items":{"type":"string"}},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["rows"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"encodeRecords","method":"POST","path":"/api/records/encode","pathParams":[],"queryParams":[],"bodyParams":["copybook","lines","record","rows","charset","ccsid","syslib"],"extraParams":["workspace"]}},{"name":"load_dataset","description":"SEED a dataset with records (hex, charset stated) or rows (+copybook) in one call: PS replace/append (all-or-nothing), KSDS replace (delete every key + write, one batched op list — cluster/AIX/PATH/catalog untouched) / append (duplicates reported) / upsert (rewrite-or-write), ESDS replace/append; allocates the dataset first when allocate:{attrs}|{like} is given. Refused for system HLQs and while a CICS task holds record locks","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"target dataset (PS, KSDS, ESDS; GDG generation by absolute name or (0)/(-n))"},"records":{"description":"array of hex record images","type":"array","items":{"type":"string"}},"charset":{"description":"charset of `records`: 'auto' (default = the own convention of the dataset: PS = EBCDIC at rest, KSDS/ESDS = program image) | 'ebcdic' | 'program' (a mismatch needs copybook so packed/binary fields convert correctly)","type":"string","enum":["auto","ebcdic","program"]},"rows":{"description":"array of row objects (needs copybook or lines)","type":"array","items":{"type":"object"}},"copybook":{"type":"string","description":"record layout LIB(MEMBER)"},"lines":{"type":"array","items":{"type":"string"},"description":"or the copybook inline"},"record":{"type":"string","description":"which 01 level"},"syslib":{"description":"copybook libraries","type":"array","items":{"type":"string"}},"mode":{"description":"'replace' (default) | 'append' | 'upsert' (KSDS only)","type":"string","enum":["replace","append","upsert"]},"member":{"type":"string","description":"PDS member (PS-style load into one member)"},"allocate":{"description":"when not cataloged: { attrs: {dsorg, recfm, lrecl, blksize?, volser?} | {dsorg:'VS', vsam:{type, keylen, keyoff, recl, alts?}} | {esds:true, lrecl} } or { like: 'MODEL.DSN' }","type":"object"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"datasets.write","_binding":{"id":"loadDataset","method":"PUT","path":"/api/dataset/{dsn}/load","pathParams":["dsn"],"queryParams":[],"bodyParams":["records","charset","rows","copybook","lines","record","syslib","mode","member","allocate"],"extraParams":["workspace"]}},{"name":"stage_gdg","description":"Roll a NEW generation into a GDG base from records/rows: a staging PS is loaded, then a real IEBGENER step with DSN=BASE(+1),DISP=(NEW,CATLG) creates the generation through the JES DISP path exactly as a production job would; returns the absolute GnnnnV00 name and the joblog","inputSchema":{"type":"object","properties":{"dsn":{"type":"string","description":"GDG base name"},"records":{"description":"hex record images (EBCDIC at rest)","type":"array","items":{"type":"string"}},"rows":{"description":"rows (+copybook)","type":"array","items":{"type":"object"}},"copybook":{"type":"string","description":"LIB(MEMBER)"},"lines":{"type":"array","items":{"type":"string"},"description":"copybook inline"},"record":{"type":"string","description":"01 level"},"charset":{"type":"string","description":"'auto'|'ebcdic'|'program' for records"},"attrs":{"description":"{ recfm, lrecl } (default: the DCB of the newest generation, else the base model)","type":"object"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["dsn"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"jobs.write","_binding":{"id":"stageGdg","method":"POST","path":"/api/dataset/{dsn}/gdg","pathParams":["dsn"],"queryParams":[],"bodyParams":["records","rows","copybook","lines","record","charset","attrs"],"extraParams":["workspace"]}},{"name":"export_state","description":"A pure DUMP of what the mainframe holds right now: named datasets (hex + rows when a copybook is given, charset stated, sha256), DB2 tables (rows), and optionally one job's spool — persisted server-side (get_state) and returned inline. Take two dumps (before/after, or oracle vs candidate) and compare them on YOUR side; SteelFrame does not diff","inputSchema":{"type":"object","properties":{"datasets":{"description":"array of dataset names or { dsn, copybook: 'LIB(MEMBER)', record?, member? }","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"db2":{"description":"array of table names or { table, orderBy }  (needs db2.exec)","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"spool":{"description":"{ jobid, files?: [STEP.DD names] } to include a joblog","type":"object"},"records":{"description":"'both' (default) | 'hex' | 'rows' | 'none' (hashes + counts only)","type":"string","enum":["both","hex","rows","none"]},"name":{"type":"string","description":"label"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"exportState","method":"POST","path":"/api/export/state","pathParams":[],"queryParams":[],"bodyParams":["datasets","db2","spool","records","name"],"extraParams":["workspace"]}},{"name":"create_workspace","description":"Create an ISOLATED workspace: a child engine on a copy of the estate (seed clone = copy of the live root incl. datasets/CSD/scheduler store, the parent's spool left behind unless includeSpool:true; snapshot:<id> = a quiesced snapshot; fresh = a seeded new system). Every tool then runs INSIDE it (pass workspace:<id> on any tool call) as you, and the live estate is never touched. Disposed at the TTL or by destroy_workspace. ram:true = a RAM-only zero-retention sandbox-class child instead of a disk child (what the private lane always makes). CREATION IS ASYNCHRONOUS: the workspace is registered at once with status CREATING (phase + progress in the view) while the estate copy and child boot run in the background; the call returns as soon as status leaves CREATING or after waitSeconds (default 20, max 45 — always under a 60 s MCP client timeout). If the response says status:CREATING, poll get_workspace every 10-15 s until status=RUNNING (ready:true) before passing workspace:<id> on other tools — they are refused 409 NOT READY until then. Do NOT call create_workspace again meanwhile: the same name returns the in-flight row (reused:true), a different name counts against your cap (429). A clone takes seconds to a few minutes depending on the host (the view's progress.typicalSeconds is the last one on this engine)","inputSchema":{"type":"object","properties":{"seed":{"type":"string","description":"'clone' (default) | 'fresh' | 'snapshot:<id>'"},"ttlSeconds":{"description":"dispose after N seconds (default 3600, max 86400)","type":"integer"},"name":{"type":"string","description":"label AND per-user idempotency key: naming a workspace of yours that is CREATING or RUNNING (same seed/kind) returns that one (reused:true) instead of cloning again — give every workspace a name"},"waitSeconds":{"description":"how long this call may wait for status to leave CREATING before answering (default 20, 0 = answer at once, max 45)","type":"integer"},"jobNumber":{"description":"set the child JES2 job-number counter (JOBIDs line up across re-runs)","type":"integer"},"ram":{"description":"true = RAM-only zero-retention sandbox-class child (the private lane's kind); default false = disk child under the data root","type":"boolean"},"includeSpool":{"description":"clone only: true = also copy the parent's JES2 spool (every past job's output — most of the estate's files, minutes on a big one); default false = the workspace starts with an empty spool and the parent's job-number counter","type":"boolean"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"workspace.write","_binding":{"id":"createWorkspace","method":"POST","path":"/api/workspaces","pathParams":[],"queryParams":[],"bodyParams":["seed","ttlSeconds","name","waitSeconds","jobNumber","ram","includeSpool"],"extraParams":[]}},{"name":"list_workspaces","description":"List your workspaces (a SPECIAL user sees all; ram:true marks the RAM-only ones) — including the ones still CREATING (status/phase/progress) and recently FAILED ones (error)","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"workspace.read","_binding":{"id":"listWorkspaces","method":"GET","path":"/api/workspaces","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":[]}},{"name":"get_workspace","description":"One workspace — THE POLL after create_workspace / reset_workspace: status CREATING (phase, progress.elapsedSeconds, progress.typicalSeconds) → RUNNING (ready:true, use it) | FAILED (error: destroy and recreate); after destroy_workspace: CANCELLING | DESTROYING until the row is gone (404)","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"workspace id"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"workspace.read","_binding":{"id":"getWorkspace","method":"GET","path":"/api/workspaces/{id}","pathParams":["id"],"queryParams":[],"bodyParams":[],"extraParams":[]}},{"name":"destroy_workspace","description":"Destroy a workspace (the child engine and its copy of the estate are removed). On a workspace still CREATING this cancels it (cancelled:true): the estate copy is stopped at once (a queued copy leaves the queue, a running copy process is killed), no child engine boots, the partial directory is removed. The row stays visible as CANCELLING (or DESTROYING for a RUNNING one) and counts toward your cap only until that is done — the call waits for it up to waitSeconds (default 15, max 45) and answers settled:true (row gone) or settled:false (still unwinding: poll get_workspace until 404). Idempotent: destroying an unwinding row again just reports it","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"workspace id"},"waitSeconds":{"description":"how long to wait for the child/copy to be fully gone before answering (default 15, 0 = answer at once, max 45)","type":"integer"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"workspace.write","_binding":{"id":"destroyWorkspace","method":"DELETE","path":"/api/workspaces/{id}","pathParams":["id"],"queryParams":["waitSeconds"],"bodyParams":[],"extraParams":[]}},{"name":"reset_workspace","description":"Reset a workspace to its seed baseline (destroy + recreate from the same seed under the SAME id; optional jobNumber so JOBIDs line up across your re-runs). Asynchronous like create_workspace: the view comes back when status leaves CREATING or after waitSeconds — poll get_workspace until status=RUNNING. Refused with 409 while the workspace is still CREATING (poll first) or being CANCELLED/DESTROYED (create a new one)","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"workspace id"},"jobNumber":{"description":"child JES2 job-number counter after the reset","type":"integer"},"waitSeconds":{"description":"wait for the rebuild up to N seconds before answering (default 20, max 45)","type":"integer"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"workspace.write","_binding":{"id":"resetWorkspace","method":"POST","path":"/api/workspaces/{id}/reset","pathParams":["id"],"queryParams":[],"bodyParams":["jobNumber","waitSeconds"],"extraParams":[]}},{"name":"export_bundle","description":"Export a modernization BUNDLE in one call: programs (source) + their transitive copybooks + JCL (with the DD/dataset list) + procs + BMS mapsets (source, parsed model, the region's physical map) + the CSD slice + the scheduler jobs that run those decks + datasets (hex + rows). Text parts are inline in the returned manifest; dataset parts are stored server-side (get_bundle_part pages them; GET /api/export/bundles/{id}/download = tar.gz). Nothing is converted","inputSchema":{"type":"object","properties":{"programs":{"description":"array of program names (or {dsn, member})","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"copybooks":{"description":"extra copybook names to include (the COPY closure of every program is included automatically)","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"jcl":{"description":"JCL member names (or {dsn, member})","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"procs":{"description":"proc member names","type":"array","items":{"type":"string"}},"maps":{"description":"extra BMS mapset names (every MAPSET('X') a program names is included automatically; a data-name MAPSET or a mapset found nowhere is a warning)","type":"array","items":{"type":"string"}},"db2":{"description":"extra DB2 table names (every table a program's EXEC SQL references is included automatically as a db2 part: CREATE TABLE DDL + indexes + rows; a referenced table that is not catalogued is a warning)","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"includeDb2":{"description":"default true","type":"boolean"},"datasets":{"description":"array of dataset names or { dsn, copybook: 'LIB(MEMBER)', record?, all?: true (no 10000-record cap) }","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"records":{"description":"'both' (default) | 'hex' | 'rows' | 'none'","type":"string","enum":["both","hex","rows","none"]},"includeCopybooks":{"description":"default true","type":"boolean"},"includeCsd":{"description":"default true","type":"boolean"},"includeSchedule":{"description":"default true","type":"boolean"},"includeLoadModules":{"description":"default false (engine-native modules, labelled)","type":"boolean"},"syslib":{"description":"copybook library search order","type":"array","items":{"type":"string"}},"name":{"type":"string","description":"label"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"exportBundle","method":"POST","path":"/api/export/bundles","pathParams":[],"queryParams":[],"bodyParams":["programs","copybooks","jcl","procs","maps","db2","includeDb2","datasets","records","includeCopybooks","includeCsd","includeSchedule","includeLoadModules","syslib","name"],"extraParams":["workspace"]}},{"name":"list_bundles","description":"List exported bundles, newest first","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"listBundles","method":"GET","path":"/api/export/bundles","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"get_bundle","description":"One bundle manifest (text parts inline)","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"bundle id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"getBundle","method":"GET","path":"/api/export/bundles/{id}","pathParams":["id"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"get_bundle_part","description":"One bundle part: a dataset part paged (hex + rows), a load module as hex, a text part as-is","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"bundle id"},"n":{"type":"string","description":"part index (manifest.parts[n])"},"from":{"type":"string","description":"first record"},"count":{"type":"string","description":"records (default 1000, max 10000)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["id","n"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"getBundlePart","method":"GET","path":"/api/export/bundles/{id}/parts/{n}","pathParams":["id","n"],"queryParams":["from","count"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"delete_bundle","description":"Delete a bundle","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"bundle id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"datasets.read","_binding":{"id":"deleteBundle","method":"DELETE","path":"/api/export/bundles/{id}","pathParams":["id"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"list_states","description":"List persisted state dumps (export_state), newest first","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"listStates","method":"GET","path":"/api/export/state","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"get_state","description":"One persisted state dump; page one dataset's records with dataset=&from=&count=","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"state id"},"dataset":{"type":"string","description":"return only this dataset artifact (paged)"},"from":{"type":"string","description":"first record (with dataset)"},"count":{"type":"string","description":"records (with dataset, default 1000)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"datasets.read","_binding":{"id":"getState","method":"GET","path":"/api/export/state/{id}","pathParams":["id"],"queryParams":["dataset","from","count"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"delete_state","description":"Delete a persisted state dump","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"state id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"datasets.read","_binding":{"id":"deleteState","method":"DELETE","path":"/api/export/state/{id}","pathParams":["id"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"run_batch","description":"Run a batch job and RETURN its run record in one call: submit (inline lines or a JCL member), wait, then step RCs/abend, the whole joblog (JESMSGLG/JESYSMSG/every SYSOUT DD, keyed STEP.DD), and the output datasets as hex + copybook-decoded rows (datasets auto-derived from the deck DDs unless given; GDG (+n) resolved after the run), optional DB2 tables, optional identical dump taken BEFORE the run (verbatim — no diff), WTORs auto-answered. Persisted as a steelframe-run/1 record (get_run)","inputSchema":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"string"},"description":"JCL card images"},"member":{"type":"string","description":"or a cataloged deck: 'CARDDEMO.JCL(POSTTRAN)'"},"datasets":{"description":"'auto' (default: every non-instream/SYSOUT/DUMMY DD of the deck) or an array of dataset names / { dsn, copybook }","anyOf":[{"type":"string","enum":["auto"]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}}]},"copybooks":{"description":"{ DSN-or-last-qualifier: 'LIB(MEMBER)' } record layouts for decoded rows (e.g. { 'AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS': 'CARDDEMO.COPYLIB(CVTRA05Y)' })","type":"object"},"db2":{"description":"array of table names / { table, orderBy } to dump after the run (needs db2.exec)","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"before":{"description":"true = also return the same dump taken before submit","type":"boolean"},"spool":{"description":"'all' (default) | 'tail' (last 200 lines per file) | 'names'","type":"string","enum":["all","tail","names"]},"records":{"description":"'both' (default) | 'hex' | 'rows' | 'none' (hashes + counts only)","type":"string","enum":["both","hex","rows","none"]},"replies":{"description":"[{ match?: regex over the WTOR text, text }] answered in order while waiting","type":"array","items":{"type":"object"}},"timeout":{"description":"seconds to wait (default 300, max 3600); on timeout { timedOut, jobid } is returned for wait_job","type":"integer"},"clock":{"description":"{ fixed: 'YYYY-MM-DD HH:MM:SS' } pins the COBOL runtime clock (ACCEPT FROM DATE/TIME, FUNCTION CURRENT-DATE) for every program step of THIS job so a re-run reproduces byte-for-byte; JES timestamps in JESMSGLG are real","type":"object","properties":{"fixed":{"type":"string"}}},"name":{"type":"string","description":"run label"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"jobs.write","_binding":{"id":"runBatch","method":"POST","path":"/api/run/batch","pathParams":[],"queryParams":[],"bodyParams":["lines","member","datasets","copybooks","db2","before","spool","records","replies","timeout","clock","name"],"extraParams":["workspace"]}},{"name":"cics_link","description":"LINK a CICS program headlessly with a COMMAREA (hex program-image bytes, or rows + copybook) and/or a channel of containers, under a real task with a live EIB (the ECI/JSON-provider path); returns the returned COMMAREA as hex (+ decoded rows when a copybook was given), containers, abend code","inputSchema":{"type":"object","properties":{"program":{"type":"string","description":"program name (PPT entry or load module)"},"transid":{"type":"string","description":"transaction id for the task (default CPIH)"},"commarea":{"description":"hex string (program image) or { rows: {...}, copybook: 'LIB(MEMBER)', record?, length? }","anyOf":[{"type":"string"},{"type":"object"}]},"channel":{"type":"string","description":"channel name (optional)"},"containers":{"description":"{ NAME: { hex, type?: BIT|CHAR } } (with channel)","type":"object"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["program"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"cics.exec","_binding":{"id":"cicsLink","method":"POST","path":"/api/cics/link","pathParams":[],"queryParams":[],"bodyParams":["program","transid","commarea","channel","containers"],"extraParams":["workspace"]}},{"name":"cics_open_session","description":"Open a headless CICS terminal session as the caller (the same engine terminal the web/Studio/TN3270E use): returns the session id, termid and the initial screen. Then cics_send one AID at a time; cics_close_session when done (idle sessions expire; per-user cap)","inputSchema":{"type":"object","properties":{"netname":{"type":"string","description":"LU name (CEDA TERMINAL match / session-continuity key, optional)"},"signon":{"description":"true = mark the terminal signed on as the caller like CESN (identity is attached either way)","type":"boolean"},"raw":{"description":"true = include the TN3270E data stream of the screen","type":"boolean"},"transaction":{"type":"string","description":"transid (1-4 chars) to START on the new terminal — typed as the unformatted input line and ENTERed exactly like the first keystroke of a session; the settled result of that step (screens, task, keyboard) is returned with the session. Without it the terminal is blank: send the transid as text on cics_send"},"clock":{"description":"{ fixed: 'YYYY-MM-DD HH:MM:SS' } pins the clock for every task of THIS terminal only (EIBDATE/EIBTIME, ASKTIME/FORMATTIME, FUNCTION CURRENT-DATE / ACCEPT FROM DATE in the programs) so a re-run paints the same screens; 'YYYY-MM-DD' alone = that date with the real time of day. Other terminals and users keep the real clock","type":"object","properties":{"fixed":{"type":"string"}}},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"cics.exec","_binding":{"id":"cicsOpenSession","method":"POST","path":"/api/cics/sessions","pathParams":[],"queryParams":[],"bodyParams":["netname","signon","raw","transaction","clock"],"extraParams":["workspace"]}},{"name":"cics_list_sessions","description":"List your open headless CICS sessions (a SPECIAL user sees all)","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"cics.exec","_binding":{"id":"cicsListSessions","method":"GET","path":"/api/cics/sessions","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"cics_send","description":"Send ONE keystroke to a session — an AID with field inputs addressed by BMS field NAME (or row/col) and/or the unformatted input line — and RETURN every screen the engine painted during the step plus the final screen (steelframe-screen/1: named fields, attributes, cursor, 24x80 text). Settles on the engine keyboard signal (task attached → task ended / RECEIVE suspended: task.alive tells you the next send feeds the same task); CLEAR / message screens settle on the write itself. 409 while the keyboard is still locked (task running): re-read with cics_screen or send with queue:true to type ahead","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"session id"},"aid":{"type":"string","description":"ENTER (default) | CLEAR | PA1-PA3 | PF1-PF24"},"text":{"type":"string","description":"unformatted input line (the transaction id on a cleared screen)"},"fields":{"description":"[{ name: 'USERID', text: 'USER0001' } | { row, col, text }] typed into unprotected fields of the current screen","anyOf":[{"type":"array","items":{"type":"object"}},{"type":"object"}]},"cursor":{"description":"[row, col] or { field: name } (default: the first typed field)","anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"object"}]},"expect":{"description":"{ text?, field?, timeoutMs? } — after settling, wait until the current screen contains the text / named field (expectMet reported, never an error)","type":"object"},"settle":{"description":"{ timeoutMs (default 8000), lockWaitMs (default 250) }","type":"object"},"raw":{"description":"true = include the TN3270E outbound data stream of the final screen","type":"boolean"},"queue":{"description":"true = type ahead while the keyboard is locked (queued like a real terminal)","type":"boolean"},"force":{"description":"true = allow typing into a protected field / over-length text","type":"boolean"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"},"session":{"type":"string","description":"alias of id: session id"},"sessionId":{"type":"string","description":"alias of id: session id"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"cics.exec","_binding":{"id":"cicsSend","method":"POST","path":"/api/cics/sessions/{id}/send","pathParams":["id"],"queryParams":[],"bodyParams":["aid","text","fields","cursor","expect","settle","raw","queue","force"],"extraParams":["workspace"],"aliases":{"session":"id","sessionId":"id"}}},{"name":"cics_screen","description":"The current screen of a session (re-read without sending anything) + task/keyboard state","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"session id"},"raw":{"type":"string","description":"'true' = include the TN3270E data stream"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"},"session":{"type":"string","description":"alias of id: session id"},"sessionId":{"type":"string","description":"alias of id: session id"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"cics.exec","_binding":{"id":"cicsScreen","method":"GET","path":"/api/cics/sessions/{id}/screen","pathParams":["id"],"queryParams":["raw"],"bodyParams":[],"extraParams":["workspace"],"aliases":{"session":"id","sessionId":"id"}}},{"name":"cics_close_session","description":"Close a session (a running task on it is killed, like a terminal disconnect)","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"session id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"},"session":{"type":"string","description":"alias of id: session id"},"sessionId":{"type":"string","description":"alias of id: session id"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"cics.exec","_binding":{"id":"cicsCloseSession","method":"DELETE","path":"/api/cics/sessions/{id}","pathParams":["id"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"],"aliases":{"session":"id","sessionId":"id"}}},{"name":"cics_run_script","description":"Run a whole online script in one call — open a session, send every step (same shape as cics_send), dump the named datasets (or state:auto = every CSD FILE), close — and RETURN the transcript: every screen of every step in order, as steelframe-screen/1. Persisted as a run record (kind online, get_run). Stops at the first step that does not settle or whose expect is not met (aborted reported, never a verdict)","inputSchema":{"type":"object","properties":{"steps":{"description":"[{ aid, text?, fields?, cursor?, expect?, settle? }] in order (fields: [{name|row+col, text}] or an object map { NAME: text })","type":"array","items":{"type":"object"}},"state":{"description":"'auto' (every CSD FILE dataset) or [dsn | {dsn, copybook}] to dump after the script","anyOf":[{"type":"string","enum":["auto"]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}}]},"transaction":{"type":"string","description":"transid (1-4 chars) to START first — run as step 1 (ENTER with the transid as the unformatted input line) before your steps"},"db2":{"description":"tables to dump after the script (needs db2.exec)","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"records":{"description":"'none' (default: counts + sha256) | 'hex' | 'rows' | 'both' for the state dump","type":"string","enum":["none","hex","rows","both"]},"netname":{"type":"string","description":"LU name"},"signon":{"description":"true = CESN-like signon as the caller","type":"boolean"},"raw":{"description":"true = data streams","type":"boolean"},"stopOnUnsettled":{"description":"false = keep going after an unsettled step","type":"boolean"},"name":{"type":"string","description":"run label"},"clock":{"description":"{ fixed: 'YYYY-MM-DD HH:MM:SS' } pins the clock for the script's terminal only (same as cics_open_session clock); echoed in the result and the run record","type":"object","properties":{"fixed":{"type":"string"}}},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["steps"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"cics.exec","_binding":{"id":"cicsRunScript","method":"POST","path":"/api/cics/scripts/run","pathParams":[],"queryParams":[],"bodyParams":["steps","state","transaction","db2","records","netname","signon","raw","stopOnUnsettled","name","clock"],"extraParams":["workspace"]}},{"name":"sched_import","description":"Import scheduler definitions straight in: a captured CA-7 LJOB,JOB=x,LIST=ALL report (folder = SYSTEM) or a Control-M DEFTABLE XML export — the same importers PGM=ZWSCHED IMPORT runs; optionally set the default JCL library","inputSchema":{"type":"object","properties":{"format":{"description":"CA7 | CTM","type":"string","enum":["CA7","CTM"]},"lines":{"type":"array","items":{"type":"string"},"description":"the report / XML lines"},"member":{"type":"string","description":"or a cataloged member 'DSN(MEMBER)'"},"jcllib":{"type":"string","description":"default JCL library for the cycles (sets options.jcllib)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["format"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"sched.admin","_binding":{"id":"schedImport","method":"POST","path":"/api/sched/import","pathParams":[],"queryParams":[],"bodyParams":["format","lines","member","jcllib"],"extraParams":["workspace"]}},{"name":"sched_define_job","description":"Define or update ONE scheduler job with its dependencies from JSON: CA-7 (triggers: this job triggers those jobs on completion) or Control-M (inconds/outconds); the definition is synthesized in the importer's own grammar (LJOB block / one-job DEFTABLE) and merged like an import — unknown trigger targets become stubs to define next","inputSchema":{"type":"object","properties":{"folder":{"type":"string","description":"folder (CA-7 SYSTEM name, 1-8 chars; Control-M folder)"},"type":{"type":"string","description":"'CA7' | 'CTM' (default: the folder's type, CA7 for a new folder)"},"name":{"type":"string","description":"job name"},"member":{"type":"string","description":"JCL member (default: name)"},"jcllib":{"type":"string","description":"JCL library or symbol, e.g. '&CARDDEMOPRODJCL'"},"owner":{"type":"string","description":"owner"},"class":{"type":"string","description":"job class"},"msgclass":{"type":"string","description":"msgclass"},"schid":{"type":"string","description":"CA-7 schedule id"},"freq":{"type":"string","description":"DAILY|WEEKLY|MONTHLY"},"days":{"type":"string","description":"day list (MON,FRI / SA)"},"triggers":{"description":"[{ job, schid?, qtm?, leadtm? }] (CA-7)","type":"array","items":{"type":"object"}},"inconds":{"description":"[{ name, odate?, andOr? }] (Control-M)","type":"array","items":{"type":"object"}},"outconds":{"description":"[{ name, odate?, sign? }] (Control-M)","type":"array","items":{"type":"object"}},"timefrom":{"type":"string","description":"HHMM"},"timeto":{"type":"string","description":"HHMM"},"calendar":{"type":"string","description":"SCAL / CONFCAL name"},"cyclic":{"description":"true (Control-M)","type":"boolean"},"interval":{"type":"string","description":"e.g. '00030M'"},"maxrerun":{"description":"number","type":"integer"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["folder","name"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"sched.admin","_binding":{"id":"schedDefineJob","method":"POST","path":"/api/sched/jobs","pathParams":[],"queryParams":[],"bodyParams":["folder","type","name","member","jcllib","owner","class","msgclass","schid","freq","days","triggers","inconds","outconds","timefrom","timeto","calendar","cyclic","interval","maxrerun"],"extraParams":["workspace"]}},{"name":"sched_ca7_command","description":"One CA-7 top-line command in CA-7 syntax: DEMAND[H] / RUN[H] (run one job — requirements not checked, completion neither posts nor triggers) / LJOB (definition report; the same grammar sched_import accepts) / LQ,LQUE,LREQ,LRDY,LACT (queues) / LPRRN (prior runs) / HOLD / RELEASE / CANCEL / POST. Report wording is engine-own; the syntax is CA-7's","inputSchema":{"type":"object","properties":{"command":{"type":"string","description":"e.g. 'RUN,JOB=POSTTRAN', 'LJOB,JOB=CLOSEFIL,LIST=ALL', 'LQ', 'POST,JOB=WAITSTEP,DEPJOB=POSTTRAN'"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["command"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedCa7","method":"POST","path":"/api/sched/ca7","pathParams":[],"queryParams":[],"bodyParams":["command"],"extraParams":["workspace"]}},{"name":"sched_wait_cycle","description":"Wait for a scheduler cycle (sched_demand / sched_order / RUN) to END and RETURN it: the cycle log (order the jobs ran, triggers fired), every job's state/jobid/maxcc/steps and joblog, optional output datasets; on timeout the live state is returned with each waiting job's reason. Persisted as a run record (kind cycle) when ended","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"cycle id (CYCnnnnn)"},"timeoutMs":{"description":"milliseconds to wait (default 300000)","type":"integer"},"joblogs":{"type":"string","description":"'all' (default) | 'tail' | 'names' | 'none'"},"outputs":{"description":"array of dataset names / { dsn, copybook } to dump after the cycle","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object"}]}},"records":{"description":"'both' | 'hex' | 'rows' | 'none' for outputs","type":"string","enum":["both","hex","rows","none"]},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["id"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.read","_binding":{"id":"schedWaitCycle","method":"POST","path":"/api/sched/cycle/{id}/wait","pathParams":["id"],"queryParams":[],"bodyParams":["timeoutMs","joblogs","outputs","records"],"extraParams":["workspace"]}},{"name":"purge_job","description":"Purge a job and its spool","inputSchema":{"type":"object","properties":{"jobid":{"type":"string","description":"JES2 job id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jobid"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"jobs.write","_binding":{"id":"purgeJob","method":"DELETE","path":"/api/jobs/{jobid}","pathParams":["jobid"],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"set_spool_file_outdisp","description":"Change one spool data set output disposition (SDSF JDS O/H/P actions): WRITE releases it, HOLD/LEAVE hold it, KEEP keeps it, PURGE removes the data set — the job is untouched","inputSchema":{"type":"object","properties":{"jobid":{"type":"string","description":"JES2 job id"},"name":{"type":"string","description":"spool file name"},"outdisp":{"type":"string","description":"WRITE | HOLD | KEEP | LEAVE | PURGE"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["jobid","name"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"jobs.write","_binding":{"id":"setSpoolFileOutdisp","method":"PUT","path":"/api/jobs/{jobid}/file/{name}/outdisp","pathParams":["jobid","name"],"queryParams":[],"bodyParams":["outdisp"],"extraParams":["workspace"]}},{"name":"sql","description":"Execute a SQL batch against the Db2 subsystem (SPUFI/DSNTEP2 equivalent): statements separated by ;, each answered with its SQLCODE, Db2 message text and rows. This is the Db2 door (tables in DSN1), not the copybook-mapped dataset SQL views of POST /api/sql.","inputSchema":{"type":"object","properties":{"sql":{"type":"string","description":"SQL statements separated by ;"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["sql"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"db2.exec","_binding":{"id":"spufi","method":"POST","path":"/api/spufi","pathParams":[],"queryParams":[],"bodyParams":["sql"],"extraParams":["workspace"]}},{"name":"cics_csd","description":"The whole CSD as data: every resource definition by kind (programs, transactions, files, mapsets, tdqueues, tranclasses, tsmodels, jsonservices, ...), the LIBRARY resources (libraries: DSNAME01..16, RANKING, CRITICAL, STATUS) and the group lists (lists: name -> [CSD groups]; DFHLIST is the startup list). Each entry names its CSD group (group) - no group = system-owned (CardDemo, the courses) - and installed:false marks a definition not yet installed. Read-only (cics.read). Like CEDA DISPLAY GROUP(*) on a real region, the whole CSD is visible to every CICS user - resource definitions (names, programs, data set names) are not secrets; the data behind them stays RACF-protected and only the owning group may change them. find_program returns the slice for one program; cics_ceda VIEW/EXPAND/CHECK/LIST are the CEDA views of the same data","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"cics.read","_binding":{"id":"cicsCsd","method":"GET","path":"/api/cics/csd","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"bms_preview","description":"Parse BMS mapset source into its map model (rows/cols/attributes/initials) — the IDE renders 3270 and HTML5 previews from it","inputSchema":{"type":"object","properties":{"lines":{"type":"array","items":{"type":"string"},"description":"BMS macro source (DFHMSD/DFHMDI/DFHMDF card images)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["lines"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"cics.read","_binding":{"id":"bmsPreview","method":"POST","path":"/api/bms/preview","pathParams":[],"queryParams":[],"bodyParams":["lines"],"extraParams":["workspace"]}},{"name":"cics_define","description":"CEDA-style DEFINE (+install) of ONE resource from a JSON attribute object - LIBRARY, PROGRAM, MAPSET, FILE, TDQUEUE or TRANSACTION (administrators: any kind) - on the live estate, authorized by RACF exactly like the CEDA transaction for this key's user. An administrator key (cics.admin / RACF SPECIAL user) defines anything, with or without a group. An ORDINARY user MUST pass `group`: its personal CSD group (named after its userid, created at its first logon) or another group it holds SFCSDGRP UPDATE on; and the rules are: a name nobody else owns (no system-owned entry, no entry of another group), no C*/built-in TRANSACTION and no DFH* PROGRAM/MAPSET names; LIBRARY(name) with attrs { dsname01..dsname16 (datasets it may READ; dsname01 required), ranking (1-99, default 50 like DFHRPL), critical (YES|NO) }; a PROGRAM needs a LIBRARY in the group first (or the compatibility attr library = a load library it may READ); a FILE needs dsn/DSNAME = a dataset it may UPDATE (the CASFILE operator check also applies); a TRANSACTION needs program = a PROGRAM of the same group and gets the group's TRANCLASS forced. ARGUMENT SHAPE: kind and name at top level, EVERY CEDA attribute inside attrs (attrs: { program: \"X\" }, attrs: { dsname01: \"ME.LOADLIB\" }) - a top-level attribute such as program is refused UNKNOWN ARGUMENT; cics_ceda takes the same thing as one command line. Refusals are in-band errors (HTTP 403) \"NOT AUTHORIZED - <reason> (YOUR CSD GROUPS: ...)\" (GROUP(group) REQUIRED; <KIND> <name> IS SYSTEM-OWNED (NO GROUP); ... IS ALREADY DEFINED IN GROUP <g>; INSUFFICIENT ACCESS AUTHORITY - REQUIRED UPDATE ON SFCSDGRP <g>; ... IS A RESERVED CICS NAME; GROUP <g> HAS NO LIBRARY; DSNAMEnn/DSNAME ... READ/UPDATE REQUIRED; PROGRAM <p> IS NOT DEFINED; <KIND> DEFINITIONS ARE ADMINISTRATOR-ONLY), audited (cics.ceda, door mcp). Returns ONLY the entry just defined: { ok, kind, name, group, installed, definition, message } - never other groups' or system definitions (cics_csd shows the whole CSD, like CEDA DISPLAY GROUP(*)). For CEDA command text, INSTALL/ALTER/DELETE/COPY/CHECK/VIEW/EXPAND/ADD/REMOVE/LIST, use cics_ceda. Inside a workspace (workspace:<id>) cics.exec defines freely (cics.admin is granted there: your own copy)","inputSchema":{"type":"object","properties":{"kind":{"type":"string","description":"LIBRARY|PROGRAM|TRANSACTION|FILE|MAPSET|TDQUEUE (ordinary users) | TRANCLASS|TSMODEL|JSONSERVICE|URIMAP|... (administrators)"},"name":{"type":"string","description":"resource name (1-8 characters; a TRANSACTION 1-4)"},"attrs":{"description":"attribute object, CEDA keywords as keys: LIBRARY { dsname01..dsname16, ranking, critical, status }; PROGRAM { language, library? (compat) }; FILE { dsn|dsname, ... }; TRANSACTION { program, ... }; TDQUEUE { type, dsname|indirectname, ... }","type":"object"},"group":{"description":"CSD group (REQUIRED for an ordinary user: its personal group = its userid, or a group it holds SFCSDGRP UPDATE on; attrs.group is accepted too; an administrator may omit it = system-owned)","type":"string"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["kind","name"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"cics.exec","_binding":{"id":"cicsDefine","method":"POST","path":"/api/cics/define","pathParams":[],"queryParams":[],"bodyParams":["kind","name","attrs","group"],"extraParams":["workspace"]}},{"name":"cics_ceda","description":"ONE CEDA command line, exactly as typed at a 3270 CEDA screen (the leading word CEDA is optional), run through the same parser and executor as the CEDA transaction and decided by the same RACF authority for THIS key's user - so an ordinary key does exactly what its user could do on the 3270, never more. Verbs: DEFINE, ALTER, DELETE, INSTALL, COPY (mutating), DISPLAY, VIEW, CHECK, EXPAND, LIST (read-only), ADD / REMOVE GROUP(g) LIST(l) (group lists; mutating). Kinds: LIBRARY (DSNAME01..16, RANKING, CRITICAL), PROGRAM, MAPSET, FILE (DSNAME), TDQUEUE, TRANSACTION (PROGRAM) for ordinary users; every CSD kind for administrators. Scopes: the read-only verbs need cics.read; a mutating verb needs cics.exec too. Authority: an administrator key (cics.admin / RACF SPECIAL) may do anything; an ORDINARY user may DEFINE / ALTER / INSTALL / COPY in a CSD group it holds SFCSDGRP UPDATE on (its personal group, named after its userid, or a group the security administrator granted it) and DELETE with ALTER; GROUP(g) is REQUIRED on DEFINE/COPY; names nobody else owns (no system-owned entries, no C*/built-in transactions, no DFH* programs); LIBRARY datasets it may READ; FILE DSNAME a dataset it may UPDATE (plus the CASFILE operator check); a TRANSACTION's PROGRAM defined in the same group (the group's TRANCLASS is forced). Result: { ok, lines } - the CEDA lines (DEFINE SUCCESSFUL / INSTALL SUCCESSFUL / the VIEW, EXPAND, CHECK, LIST report). A refusal or a command error is an MCP ERROR result (isError) whose content is still { ok:false, lines }: \"E NOT AUTHORIZED - <reason>\" plus a second line \"YOUR CSD GROUPS: ...\" naming the groups this user may define in (e.g. GROUP(group) REQUIRED, <KIND> <name> IS SYSTEM-OWNED (NO GROUP), ... IS ALREADY DEFINED IN GROUP <g>, INSUFFICIENT ACCESS AUTHORITY - REQUIRED UPDATE ON SFCSDGRP <g>); it is RACF's final answer - report it, do not retry. Refused calls are not charged. The typical student flow: DEFINE LIBRARY(lib) GROUP(me) DSNAME01(ME.LOADLIB) -> DEFINE PROGRAM(pgm) GROUP(me) -> DEFINE MAPSET(ms) GROUP(me) -> DEFINE FILE(f) GROUP(me) DSNAME(ME.DATA) -> DEFINE TRANSACTION(tr) GROUP(me) PROGRAM(pgm) -> CHECK GROUP(me) -> INSTALL GROUP(me). Every call is audited (cics.ceda, door mcp). Inside a workspace (workspace:<id>) cics.exec acts as an administrator (your own copy of the estate)","inputSchema":{"type":"object","properties":{"command":{"type":"string","description":"CEDA command text, e.g. 'DEFINE LIBRARY(RABILIB) GROUP(RABIAPP) DSNAME01(C826RHA.LOADLIB)', 'DEFINE PROGRAM(SGNON01C) GROUP(RABIAPP)', 'DEFINE TRANSACTION(RHSG) GROUP(RABIAPP) PROGRAM(SGNON01C)', 'CHECK GROUP(RABIAPP)', 'INSTALL GROUP(RABIAPP)', 'VIEW PROGRAM(SGNON01C)', 'EXPAND GROUP(RABIAPP)', 'ADD GROUP(RABIAPP) LIST(DFHLIST)', 'LIST' (the leading word CEDA is optional)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["command"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"cics.read","_binding":{"id":"cicsCeda","method":"POST","path":"/api/cics/ceda","pathParams":[],"queryParams":[],"bodyParams":["command"],"extraParams":["workspace"]},"_okFalseIsError":true},{"name":"cics_cemt","description":"ONE CEMT master-terminal command line, exactly as typed at a 3270 CEMT screen (the leading word CEMT is optional), run through the same parser and executor as the CEMT transaction and decided by the same RACF authority for THIS key's user - an ordinary key does exactly what its user could do on the 3270, never more. INQUIRE <resource> is open to every holder of cics.exec (FILE, PROGRAM, TRANSACTION, LIBRARY, TDQUEUE, TSQUEUE, TASK, TERMINAL, TRANCLASS, ...; INQUIRE LIBRARY shows ranking, status, DSNAME01..). SET (transient run-time state: FILE OPEN|CLOSED|ENABLED|DISABLED, PROGRAM ENABLED|DISABLED|NEWCOPY, TRANSACTION ENABLED|DISABLED, LIBRARY ENABLED|DISABLED, TASK PURGE|FORCEPURGE), DISCARD FILE|PROGRAM|TRANSACTION|TDQUEUE|LIBRARY (removes the installed resource, the CSD entry stays) and PERFORM (STATISTICS is open; RESET / SHUTDOWN need CCICSCMD) are authorized like the CEMT transaction: an administrator key (cics.admin / RACF SPECIAL) always; an ORDINARY user only on resources of a CSD group it holds SFCSDGRP UPDATE on (its personal group = its userid, plus granted groups), or with a CCICSCMD <resource> UPDATE profile; SET FILE also passes the CASFILE operator check. Result: { ok, lines } - the CEMT lines (NORMAL / the INQUIRE rows). A refusal or a command error is an MCP ERROR result (isError) whose content is still { ok:false, lines } (\"E FIL(x) NOT AUTHORIZED - <reason>\" plus \"YOUR CSD GROUPS: ...\" when the resource belongs to another group); nothing changed, nothing charged. SET never writes the CSD - a re-DEFINE or INSTALL (cics_ceda) resets it. Every call is audited (cics.ceda, door mcp). Inside a workspace (workspace:<id>) cics.exec acts as an administrator (your own copy of the estate)","inputSchema":{"type":"object","properties":{"command":{"type":"string","description":"CEMT command text, e.g. 'INQUIRE FILE(*)', 'SET FILE(ACCTDAT) CLOSED', 'INQUIRE LIBRARY(RABILIB)', 'SET LIBRARY(RABILIB) DISABLED', 'SET PROGRAM(SGNON01C) NEWCOPY', 'DISCARD TRANSACTION(RHSG)', 'INQUIRE TASK' (the leading word CEMT is optional)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["command"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"cics.exec","_binding":{"id":"cicsCemt","method":"POST","path":"/api/cics/cemt","pathParams":[],"queryParams":[],"bodyParams":["command"],"extraParams":["workspace"]},"_okFalseIsError":true},{"name":"sched_list","description":"Scheduler store overview: folders, jobs, conditions, symbols, cycles","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"sched.read","_binding":{"id":"schedStore","method":"GET","path":"/api/sched/store","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"sched_jobs","description":"Job definitions of a folder (* = all) WITH the dependency graph as data: CA-7 triggers[{job,schid,qtm,leadtm}], Control-M inconds/outconds, calendars, time windows","inputSchema":{"type":"object","properties":{"folder":{"type":"string","description":"folder name (* = all)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"sched.read","_binding":{"id":"schedJobs","method":"GET","path":"/api/sched/jobs","pathParams":[],"queryParams":["folder"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"sched_status","description":"One scheduler cycle: per-job state (WAITING|HELD|EXECUTING|ENDED-OK|ENDED-NOTOK|CANCELLED), jobid, maxcc, reason (WAIT-COND/WAIT-TIME/HELD-BY-OPERATOR/LATE) and the cycle log; sched_wait_cycle adds the joblogs","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"cycle id"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"sched.read","_binding":{"id":"schedCycle","method":"GET","path":"/api/sched/cycle","pathParams":[],"queryParams":["id"],"bodyParams":[],"extraParams":["workspace"]}},{"name":"sched_order","description":"Control-M ORDER: start a cycle for a folder — every calendar-eligible job (all with force) runs under its IN conditions; returns the cycle id for sched_wait_cycle","inputSchema":{"type":"object","properties":{"folder":{"type":"string","description":"folder name"},"force":{"description":"order even out of schedule","type":"boolean"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["folder"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedOrder","method":"POST","path":"/api/sched/order","pathParams":[],"queryParams":[],"bodyParams":["folder","force"],"extraParams":["workspace"]}},{"name":"sched_demand","description":"CA-7 DEMAND: run one job AND its trigger closure as a new cycle (only the demanded job starts ready; successors release as triggers fire); returns the cycle id for sched_wait_cycle","inputSchema":{"type":"object","properties":{"job":{"type":"string","description":"job name"},"schid":{"type":"string","description":"schedule id variant (optional)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["job"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedDemand","method":"POST","path":"/api/sched/demand","pathParams":[],"queryParams":[],"bodyParams":["job","schid"],"extraParams":["workspace"]}},{"name":"sched_symbol","description":"Set a JCLLIB-style symbol (e.g. &CARDDEMOPRODJCL)","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"symbol name"},"value":{"type":"string","description":"value"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["name","value"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedSymbol","method":"POST","path":"/api/sched/symbol","pathParams":[],"queryParams":[],"bodyParams":["name","value"],"extraParams":["workspace"]}},{"name":"sched_options","description":"Set scheduler options: okrc (max RC counted OK), jcllib (default JCL library the cycles submit from), newdayTime, condRetainDays, ca7Rerun (YES lets a CA-7 trigger re-run an already-run job), ca7MaxRuns","inputSchema":{"type":"object","properties":{"okrc":{"description":"max RC counted as OK","type":"integer"},"jcllib":{"type":"string","description":"default JCL library the cycles submit from (a DSN or a &SYMBOL set with sched_symbol)"},"newdayTime":{"type":"string","description":"New Day time HHMM (sched_newday's scheduled moment)"},"condRetainDays":{"description":"days a posted condition is kept before New Day ages it out","type":"integer"},"ca7Rerun":{"type":"string","description":"'YES' lets a CA-7 trigger re-run a job that already ran in the cycle (default 'NO')"},"ca7MaxRuns":{"description":"cap on re-runs of one job per cycle when ca7Rerun is YES (default 10)","type":"integer"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedOptions","method":"POST","path":"/api/sched/options","pathParams":[],"queryParams":[],"bodyParams":["okrc","jcllib","newdayTime","condRetainDays","ca7Rerun","ca7MaxRuns"],"extraParams":["workspace"]}},{"name":"sched_condition","description":"Post (+) or erase (-) a global IOA-style condition (name/ODATE) — the manual 'predecessor done' signal that releases a Control-M job waiting on an IN condition","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"condition name"},"sign":{"type":"string","description":"'+' (default) or '-'"},"odate":{"type":"string","description":"optional ODATE (yyyymmdd, ODAT, STAT/****; default ODAT=today; '-' with no odate erases every date of the name)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["name"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedCondition","method":"POST","path":"/api/sched/condition","pathParams":[],"queryParams":[],"bodyParams":["name","sign","odate"],"extraParams":["workspace"]}},{"name":"sched_job_action","description":"Operator action on a cycle job: HOLD, FREE, RUNNOW (release ignoring conditions/time window), BYPASS (force-complete without running; successors release) or RESTART a failed job","inputSchema":{"type":"object","properties":{"cycle":{"type":"string","description":"cycle id (CYCnnnnn)"},"job":{"type":"string","description":"job name"},"action":{"description":"HOLD|FREE|RUNNOW|BYPASS|RESTART","type":"string","enum":["HOLD","FREE","RUNNOW","BYPASS","RESTART"]},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["cycle","job","action"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedJobAction","method":"POST","path":"/api/sched/jobaction","pathParams":[],"queryParams":[],"bodyParams":["cycle","job","action"],"extraParams":["workspace"]}},{"name":"sched_cancel","description":"Cancel the remaining (waiting/held) work of an active cycle","inputSchema":{"type":"object","properties":{"cycle":{"type":"string","description":"cycle id (CYCnnnnn)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["cycle"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"sched.admin","_binding":{"id":"schedCancel","method":"POST","path":"/api/sched/cancel","pathParams":[],"queryParams":[],"bodyParams":["cycle"],"extraParams":["workspace"]}},{"name":"sched_newday","description":"Run the New Day procedure: age the conditions table, order every eligible Control-M folder, demand every scheduled CA-7 job (holiday/ROLL calendars applied)","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedNewday","method":"POST","path":"/api/sched/newday","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"sched_calendar","description":"Define a base calendar (CA-7 SCAL / Control-M CONFCAL): holidays + working week; jobs reference it via SCAL/SCHED_CALENDAR with ROLL/SHIFT semantics","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"calendar name"},"holidays":{"description":"[yyyymmdd,...]","type":"array","items":{"type":"string"}},"weekdays":{"type":"string","description":"working week, e.g. 'MO,TU,WE,TH,FR' (optional)"},"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"required":["name"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false},"scope":"sched.admin","_binding":{"id":"schedCalendar","method":"PUT","path":"/api/sched/calendar","pathParams":[],"queryParams":[],"bodyParams":["name","holidays","weekdays"],"extraParams":["workspace"]}},{"name":"sched_alerts","description":"SHOUT alert log (WHEN OK/NOTOK/LATESUB/LATETIME, destination, urgency), newest first","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"run inside this workspace (create_workspace) instead of the live estate (optional)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false},"scope":"sched.read","_binding":{"id":"schedAlerts","method":"GET","path":"/api/sched/alerts","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]}},{"name":"sched_reset","description":"Wipe the scheduler store + cycles — WORKSPACE-ONLY on the MCP surface (pass workspace:<id>); refused on the live door","inputSchema":{"type":"object","properties":{"workspace":{"type":"string","description":"REQUIRED: run inside this workspace (create_workspace) — this tool is refused on the live estate"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true},"scope":"sched.admin","_binding":{"id":"schedReset","method":"POST","path":"/api/sched/reset","pathParams":[],"queryParams":[],"bodyParams":[],"extraParams":["workspace"]},"_workspaceOnly":true}]}