Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Added "delete_variable" and "list_library_files"; removed "get_cell_formula", "get_job_status" and "snapshot_session"; changed the definition of "add_sheet", "audit_workbook", "close_session" and 19 more (26 tools before, 25 now)
Addaannewempty sheettoat the end of a session'sworkbook. Theworkbooknewandsheetmakebecomesit the activesheet.sheetOnly(theworksoneonunqualified refs like "B4" point to). Only for sessions createdfromblankdocuments(notcreate_sessionimportedwithxlsxnofilesfile); on an imported workbook it fails, so work in its existing sheets with set_inputs instead. To retitle a sheet use rename_sheet; sheets can't be deleted with these tools. Returns {sheet_index, sheet_name, sheet_count}.
⟨5 unchanged words⟩ ,"properties":{"name":{"description":"Display nameName for the new sheet tab, e.g. \"Assumptions\"","type":"string"},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨4 unchanged words⟩
RunCheck astructuralsession'sauditwholeonworkbooktheforsession'smodelingworkbook.problemsReturnsandformulareturnerrors,a JSON report: broken references, circulardependenciesreferences and whether they converge, hardcoded plugs (a constant or odd formula breaking a run of consistent formulas), external links, volatile functions, hidden sheets
CloseEnd acomputationsession andreleasediscard itsresources.workbook: the session_id stops working and the session can't be reopened. Edits not saved with save_to_library (or downloaded with export_workbook) are lost, and its commit_session checkpoints go with it, so restore_session can't bring it back. Call it when you're done with a workbook, or to free a slot when create_session fails with max_sessions. Returns {closed: true}, plus unsaved: true and a hint when the workbook was edited since it was opened or last saved to the Library. An unknown, expired or already closed session_id fails with session_not_found, which lists the sessions still open. Sessions also close on their own after 30 minutes without a call.
⟨5 unchanged words⟩ ,"properties":{"session_id":{"description":"SessionID of the session to close, from create_session or list_sessions","type":"string"}},"required": ⟨3 unchanged words⟩
Create a named checkpoint of the session's currentstate.state,Returnse.g.thebeforecommitaIDriskywhichedit.canReturnsbe{commit_id,passedmessage, total_commits}; pass commit_id to restore_session to roll back. Every call adds a new checkpoint. Checkpoints live in the sessiononly;only and are lost when it closes or expires; to keep one in the Library's version history ⟨13 unchanged words⟩
CreateOpen apersistentworkbookcomputationin a sessionforthatatheworkbook.otherPassworkbooklibrary_file_idtoolstothenloadusefromby session_id: theLibrary,starting
Create a defined name for a cell, orretargetrepoint an existing one, so set_inputs and get_outputs can use anamedreadablevariablekey ("Revenue") instead of a cell ref. A name that already exists in thesession'ssameworkbook.scopeTheisnameoverwrittencanwiththenthebenewusedtarget;
Compare two .xlsxworkbooksfiles cell by cell and return thecell-leveldifferences asJSON.JSON: {summary, added, removed, changed, format_changed}. Cells arejoinedmatched on (sheet title, cell ref);andchangedclassifiedcoversintovalueadded,andremovedformula changes, and format-only changes are listed separately. Use it to see what changed(valuebetweenand/or
⟨6 unchanged words⟩ ":{"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨3 unchanged words⟩
Batch-readRead the formulas and computed valuesforof one cell or a rectangular rangeofincellsa session: the way to check whattheaformulascellinor afileblockcompute.of cells computes. Pass a single cell ("B4", "Sheet1!B4") or a range ("A1:D10"). Returns {worksheet, range, cell_count, cells: [{cell, formula, value, value_type}]},per
Read computed values from a session by defined name,e.g.cell or range: the way to check whatthea model's formulasinreturn,ae.g.workbookafterreturn.set_inputs. Pass names as defined names, cell refs ("B4", "Sheet1!B4") or ranges ("Sheet1!H2:H18", up to 2,000 cells, one entry per cell), or; omit names to readallevery definednames.name.
InspectSummarize a session'smodelstructure:sheetseach sheet's index, name and used rows and columns, every definednamesname with its target,cell/formulathe iterative-calc settings, and counts of cells, memory, edit events andoptionallycommits.theUsefullit to find your way around a workbook before reading or editing it: sheet indexes for rename_sheet and define_variable, names for get_outputs and set_inputs. include_edges adds every formula dependency edge,graph.which is large on big models; to follow the chain from one cell use trace_dependencies instead. For errors, plugs and broken references use audit_workbook.
Listalltheactivesessionscomputationopen for this API key, to recover a session_id you've lost or to see how many are open before create_session. Returns {sessions:for[{id,thedocumentId,currentlibraryFileId,user.createdAt, updatedAt, sheetCount, memBytes}]}, times in epoch milliseconds; closed and expired sessions are left out. Pass an id to any session tool, or to close_session to free a slot. Takes no arguments. Each API key can hold 5 open sessions, and a session closes on its own after 30 minutes without a call.
Parse an .xlsx workbook in one call and returntheits full semantic NDJSON:outputone JSON record per line (workbook_meta, sheet, cell, edge, image, image_summary, audit),recordscovering every cell's value and formula and the formula dependency edges. Use it to read a whole file without opening a session. For a large file, use submit_job so the call doesn't wait on the parse; to read a few cells or edit, use create_session; to compare two files, use diff_workbooks. Pass exactly one of url or base64 (up to 20 MB). Each call counts against the API key's parse quota and fails with quota_exceeded once it is used up, or with the parse error's code for a file that isn't a readable workbook. webhook_url, if set, also gets an HMAC-signed POST when the parse finishes.
⟨13 unchanged words⟩ :"string"},"url":{"description":"Public https URL to fetch the .xlsx file from
⟨25 unchanged words⟩ :"string"},"url":{"description":"Public https URL to fetch the .xlsx file from (private and local addresses are refused)","format":"uri","type":"string ⟨2 unchanged words⟩
Rename a sheet in a session'sworkbook.workbook, found by its 0-based index (see the sheets list from create_session or inspect_model). Formulas, named ranges and validations that reference the sheet are rewritten to the new name, so results don'tchange.change; use it rather than add_sheet when you only need a different title. Excel's rules apply: 1-31 characters, none of ⟨4 unchanged words⟩ no leading or trailing apostrophe, unique ignoringcase.case; a name that breaks them, or an index past the last sheet, fails with bad_request. Returns {sheet_index, previous_name, sheet_name}.
⟨16 unchanged words⟩ "},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"},"sheet_index":{ ⟨18 unchanged words⟩
Rollbacka session back to apreviouscheckpointcommit.fromRevertscommit_session:allevery cellchangesedit madesinceafterthatitcommit.isReturnsundone, calc settings included, and thenumberworkbookofiscells
⟨30 unchanged words⟩ file. Otherwise it creates a new Library file.Returns the library_file_id.Each save is a named version in the ⟨25 unchanged words⟩ each step you want kept as a version. Returns {library_file_id, version_id, name, message, created, noop}; noop is true when nothing changed since the last version. Open the file again later with create_session's library_file_id; list_library_files finds it.
⟨32 unchanged words⟩ },"name":{"description":"File name for a new Library file (defaults to the session's document label); not used when saving a new version","type":"string"},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨3 unchanged words⟩
⟨61 unchanged words⟩ so an exported xlsx iterates in Excel too. Returns {calc, recalc}: the settings now in force and whether the model converged.
⟨47 unchanged words⟩ "},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨4 unchanged words⟩
SetWriteonevalues ormoreformulas into cellsinof a session andrecalculate.recalculate:Keysthecanwaybeto run a scenario on a model ("what if Revenue is 1.2M?"). Keys are defined names (e.g. "Revenue") or cellreferencesrefs (e.g."B4" on the active sheet, "Sheet1!A1").;
FetchCheck on or read a parse job started by submit_job. By default it returns the job's NDJSON records once it has completed: the same outputofparse_workbook returns, one JSON record per line. Pass wait_seconds (up to 60) to wait that long for a job still processing; if it is still processing after that, the call fails with job_not_ready and the job's status, so call again. Pass status_only: true to get the status instead, without waiting: {job_id, status, created_at, updated_at, expires_at, bytes_in, records_out, stream_url, error}, where status is "processing", "completed" or "failed". A failed job returns its parsejob.error,Passand an unknown or expired job_id, or one submitted with another API key, fails with not_found. Everything after `since` comes back in one result, with no paging; pass since toresumeskip
SubmitStart an.xlsxasyncworkbookparseforofasyncanparsing.xlsx workbook andgetreturnbackat once with a job handle({job_id, status: "processing", status_url, stream_url)}.withoutUsewaiting
Trace theFollowdependencyformulagraphreferences from one cell in acell.session,direction=breadth first, up to depth levels (1-5): direction "precedents"showswalkswhattofeedstheintocellsthisitcell;reads,direction="dependents"showsto
Delete variable — Delete a defined name from a session's workbook, e.g. one you made with define_variable and no longer need. Only the name goes; the cell it pointed to keeps its value and formula. Match is by name, ignoring case, in workbook scope or, with scope_sheet, the name scoped to that sheet. A name still used by a formula is not deleted: the call fails with name_in_use and lists those cells, so rewrite them with set_inputs (or repoint the name with define_variable) first. A name that doesn't exist in that scope fails with not_found, and Excel's built-in names (print areas, filters) can't be deleted. r…
List Library files — List the workbooks in the user's Library: the files this account owns, newest-updated first, including everything save_to_library saved. Use it to find a library_file_id to open with create_session, or to check that a save landed. Returns {files: [{library_file_id, name, size_bytes, created_at, updated_at, latest_version: {seq, message, created_at}}], truncated}, times in ISO 8601; latest_version is the newest saved version and its name. Pass query to match part of a file name (ignoring case) and limit for how many to return (1-200, default 50); truncated is true when more files match, so nar…
Get cell formula — Return the formula text and computed value for a single cell. If the cell has no formula (constant or empty), formula will be null.
Get job status — Check the status of a parse job submitted via submit_job.
Snapshot session — Export the session's current state as xlsx bytes (base64). Optionally creates a commit first. To get the file for a user or a non-Excel reader, with formula errors listed, prefer export_workbook.
Authorization required → not required
First tool surface recorded: 26 tools (server version 0.0.1)
Certificate recorded, valid to 2027-01-28
Authorization required
Unknown → Live
npm:@basis1/mcp (package_npm) — from mcp_registry, with the record
https://api.basis1.tech/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 8 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨6 unchanged words⟩ ":{"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨3 unchanged words⟩
⟨7 unchanged words⟩ :{"description":"Short description of the checkpoint, e.g. \"before exit cap change\"; also names the next Library version","type":"string"},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨4 unchanged words⟩
⟨83 unchanged words⟩ :"string"},"library_file_id":{"description":"ID of a Library fileIDtoloadopen (library_file_id from save_to_library or an earlier session)","type":"string"},"url":{"description":"Public https URL to fetch the .xlsx file from (private and local addresses are refused)","format":"uri","type":"string ⟨2 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"name":{"description":"VariableName to create or repoint, following Excel's name rules (e.g. \"Revenue\", \"Exit_Cap\")","type":"string"},"refers_to": ⟨11 unchanged words⟩ :"string"},"scope_sheet":{"description":"Sheet0-based sheet index for a sheet-scoped name; omit for workbook scope","type":"integer"},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨5 unchanged words⟩
⟨17 unchanged words⟩ :"string"},"after_url":{"description":"URLPublictohttpsfetchURL of the second (after) .xlsx filefrom","format":"uri","type":"string ⟨11 unchanged words⟩ :"string"},"before_url":{"description":"URLPublictohttpsfetchURL of the first (before) .xlsx filefrom","format":"uri","type":"string ⟨16 unchanged words⟩
⟨5 unchanged words⟩ ,"properties":{"range":{"description":"RangeAaddresscell or range, e.g. \"B4\", \"A1:D10\" or \"Sheet1!B2:F2\"","type":"string"},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨4 unchanged words⟩
⟨35 unchanged words⟩ "},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨3 unchanged words⟩
⟨6 unchanged words⟩ "include_edges":{"default":false,"description":"IncludeAlsothereturn every formula dependencygraphedge (default false; large on big models)","type":"boolean"},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨3 unchanged words⟩
⟨17 unchanged words⟩ "},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨4 unchanged words⟩
⟨11 unchanged words⟩ ,"boolean"]},"description":"Map ofname-or-refdefined name or cell ref tovalue.value; a string starting with \"=\" is stored as a formula. Example: {\"Revenue\": 1000000, \"Cap_Rate\": 0.055, \"Sheet1!B4\": \"=B2*1.1\"}","type":"object"},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required": ⟨4 unchanged words⟩
⟨14 unchanged words⟩ :"string"},"since":{"description":"RecordNumberindexof records toresumeskip from the start (the 0-based index of the first record to return; default 0)","minimum":0,"type":"integer"},"status_only":{"description":"Return the job's status instead of its records, without waiting (default false)","type":"boolean"},"wait_seconds":{"description":"Seconds to wait for a job that is still processing (0-60, default 0: don't wait)","maximum":60,"minimum":0,"type":"integer"}} ⟨4 unchanged words⟩
⟨13 unchanged words⟩ :"string"},"url":{"description":"Public https URL to fetch the .xlsx file from (private and local addresses are refused)","format":"uri","type":"string"},"webhook_url":{"description":"https URL that gets an HMAC-signed POSTherewith the job's status when the parsecompletesfinishes","format":"uri","type":"string ⟨2 unchanged words⟩
⟨31 unchanged words⟩ ,"type":"integer"},"direction":{"default":"both","description":"Which\"precedents\"directionfortothetracecells this cell reads, \"dependents\" for the cells that read it, \"both\" for each (default \"both\")","enum":["precedents","dependents","both"],"type":"string"},"session_id":{"description":"Session ID returned by create_session (list_sessions shows the open ones)","type":"string"}},"required":["session_id","cell","direction"],"type":"object"}