Lets AI agents read, check, and edit Excel models by parsing workbooks, evaluating formulas, and managing interactive workbook sessions.
Also known as basis1tech/basis-oss, mcp, @basis1/mcp
- Stars
- 0
- Tools
- 22
- Downloads, 30 days
- 1,539
- Latest version
- 0.3.2
- Last commit
- Nov 9, 2026
- License
- Apache-2.0
What is Basis MCP?
Basis lets AI agents read, check, and edit Excel models by parsing workbooks, evaluating formulas, and managing interactive workbook sessions. It exposes 22 tools, such as parse_workbook, submit_job, stream_job.
Summary generated from the project's README
About Basis MCP server
Enabling AI agents to interact with complex Excel models is what Basis provides for developers using Claude, Cursor, or other MCP clients. This server allows agents to parse workbooks, evaluate formulas, and trace dependencies through the Basis API. By connecting via a local installation using npx or a remote hosted endpoint, users can grant AI models the ability to read, check, and edit spreadsheet data.
Users must provide a Basis API key to access the engine. The server supports various input methods including local file paths, URLs, or base64 strings. It offers specialized tools for different workflows, such as parse_workbook for extracting metadata and cell data, evaluate_formula for testing specific Excel functions, and recalc_workbook for computing values in a file. For more interactive tasks, the server manages workbook sessions that allow an agent to change inputs, rename sheets, and manage defined names while maintaining a stateful connection to the model.
What you can do with it
- 1Run interactive financial simulationsAn agent can open a workbook session to change specific input values and then read the resulting computed outputs.
Written from the project's README. Every use case is checked against a quote from it.
How to install Basis MCP
Formats verified 10 Nov 2026Install Basis MCP in Claude Code
$ claude mcp add --env BASIS_API_KEY=<YOUR_BASIS_API_KEY> mcp -- npx -y @basis1/mcpInstall Basis MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": [
"-y",
"@basis1/mcp"
],
"env": {
"BASIS_API_KEY": "<YOUR_BASIS_API_KEY>"
}
}
}
}Install Basis MCP in VS Code
.vscode/mcp.json
{
"servers": {
"mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@basis1/mcp"
],
"env": {
"BASIS_API_KEY": "<YOUR_BASIS_API_KEY>"
}
}
}
}Install Basis MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": [
"-y",
"@basis1/mcp"
],
"env": {
"BASIS_API_KEY": "<YOUR_BASIS_API_KEY>"
}
}
}
}Install Basis MCP in Codex
~/.codex/config.toml
[mcp_servers.mcp] command = "npx" args = ["-y", "@basis1/mcp"] [mcp_servers.mcp.env] BASIS_API_KEY = "<YOUR_BASIS_API_KEY>"
Install Basis MCP in Gemini CLI
~/.gemini/settings.json
{
"mcpServers": {
"mcp": {
"command": "npx",
"args": [
"-y",
"@basis1/mcp"
],
"env": {
"BASIS_API_KEY": "<YOUR_BASIS_API_KEY>"
}
}
}
}Basis MCP tools 22
Detected from the READMEparse_workbooksubmit_jobstream_jobdiff_workbooksevaluate_formularecalc_workbookcreate_sessionset_inputsget_outputsdefine_variabledelete_variableadd_sheet
| parse_workbook | — | |
| submit_job | — | |
| stream_job | — | |
| diff_workbooks | — | |
| evaluate_formula | — | |
| recalc_workbook | — | |
| create_session | — | |
| set_inputs | — | |
| get_outputs | — | |
| define_variable | — | |
| delete_variable | — | |
| add_sheet | — |
Show all 22 toolsShow fewer tools
rename_sheetdelete_sheetset_calc_settingsinspect_modelget_formula_rangetrace_dependenciesaudit_workbookexport_workbooksave_to_librarylist_library_files
| rename_sheet | — | |
| delete_sheet | — | |
| set_calc_settings | — | |
| inspect_model | — | |
| get_formula_range | — | |
| trace_dependencies | — | |
| audit_workbook | — | |
| export_workbook | — | |
| save_to_library | — | |
| list_library_files | — |
Configuration
BASIS_API_KEYRequiredSecretYour Basis API key, from https://api.basis1.tech
BASIS_BASE_URLBasis API base URL, to use a self-hosted server
| Name | Description | |
|---|---|---|
| BASIS_API_KEY | Your Basis API key, from https://api.basis1.tech | RequiredSecret |
| BASIS_BASE_URL | Basis API base URL, to use a self-hosted server |
Automated checks
Ran Nov 12, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work
- Source repository linked and reachablePass
- Open source license (OSI)Pass
- Commit or release in the last yearPass
- Package name not close to a popular packagePass
- Remote endpoint uses HTTPSPass
- Destructive tools are labelledNot checked
- No hidden instructions to the modelPass
- No critical advisory in the package or its dependenciesPass
README
View on GitHub@basis1/mcp
The Excel engine for AI agents. Let AI agents read, check and edit Excel models.
An MCP server for Basis. It lets Claude, Cursor and other MCP clients parse Excel workbooks, evaluate formulas, trace dependencies, and open a workbook as a session to change inputs and read results.
Every tool runs on the Basis API. You need a Basis API key and a network connection, and the workbooks you give a tool are uploaded to the Basis API at https://api.basis1.tech. See What gets uploaded.
Install
You need Node.js 20.19 or later and a Basis API key, which you create yourself in your account settings at basis1.tech/settings. Each snippet below starts the server with npx, which downloads the package the first time.
One-click install (you'll paste your API key afterwards in Cursor, or be asked for it in VS Code):
Claude Desktop
Open Settings → Developer → Edit Config and add this to claude_desktop_config.json, then restart Claude Desktop:
{
"mcpServers": {
"basis": {
"command": "npx",
"args": ["-y", "@basis1/mcp"],
"env": {
"BASIS_API_KEY": "your-api-key"
}
}
}
}
Claude Code
claude mcp add basis --env BASIS_API_KEY=your-api-key -- npx -y @basis1/mcp
Add --scope user to use it in every project, or --scope project to share it through the project's .mcp.json. In a shared file, write "BASIS_API_KEY": "${BASIS_API_KEY}" so each person's key comes from their own environment.
Cursor
Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:
{
"mcpServers": {
"basis": {
"command": "npx",
"args": ["-y", "@basis1/mcp"],
"env": {
"BASIS_API_KEY": "your-api-key"
}
}
}
}
Other MCP clients
Configure a stdio server with the command npx and the arguments -y @basis1/mcp, and set BASIS_API_KEY in its environment. On Windows, if your client can't start npx directly, use the command cmd with the arguments /c npx -y @basis1/mcp.
Without installing anything: the hosted endpoint
The hosted endpoint is https://api.basis1.tech/mcp. Clients that support remote MCP servers can connect to it directly instead of running this package, in one of two ways: by signing in to Basis, or with an API key.
Sign in (Claude, Claude Desktop, Claude mobile, and other clients that support MCP authorization). No API key to copy:
- Claude (claude.ai, Desktop, mobile): open Customize → Connectors, choose Add custom connector, enter
https://api.basis1.tech/mcp, and select Connect. You'll be sent to basis1.tech to sign in (or create an account) and approve the connection. - Claude Code:
claude mcp add --transport http basis https://api.basis1.tech/mcp, then run/mcpin a session and pick basis to sign in. - Other clients: add
https://api.basis1.tech/mcpas a remote (streamable HTTP) server without anAuthorizationheader. The client finds the sign-in page by itself (OAuth 2.1 with PKCE, as the MCP authorization specification describes).
Your account's email must be confirmed before an app can connect. Listing the tools works before you sign in; the first tool call asks you to sign in. Connected apps share your account's free monthly allowance, and you can see and disconnect them in Settings.
API key. If your client supports custom headers, send your key instead:
{
"mcpServers": {
"basis": {
"type": "http",
"url": "https://api.basis1.tech/mcp",
"headers": { "Authorization": "Bearer your-api-key" }
}
}
}
In Claude Code: claude mcp add --transport http basis https://api.basis1.tech/mcp --header "Authorization: Bearer your-api-key".
It offers the same tools, except that it can't read files on your computer: pass a url or base64 instead of a path. This package adds path support by reading the file on your machine and uploading it for you.
Settings
| Variable | Default | What it does |
|---|---|---|
BASIS_API_KEY |
none (required) | Your Basis API key. Without it the server still starts, and every tool tells you the key is missing. |
BASIS_BASE_URL |
https://api.basis1.tech |
The Basis API to use, for example a self-hosted server. It must use https:// unless it points at localhost, so your key is never sent unencrypted. |
BASIS_MCP_MAX_FETCH_BYTES |
200000000 |
The largest workbook a tool will download when you pass a url. |
BASIS_TOKEN, the old name for the key, still works and logs a reminder to rename it.
If a setting is invalid, the server doesn't start: it writes what to fix to stderr, which your MCP client shows in its server logs (Claude Desktop: Settings → Developer, or ~/Library/Logs/Claude/mcp-server-basis.log on macOS). The server writes diagnostics only to stderr, because stdout carries the MCP protocol, and it never prints your key.
npx -y @basis1/mcp --help lists these settings, and --version prints the version.
Tools
Workbook inputs accept exactly one of path (a file on your computer), url or base64.
Parsing
parse_workbook: returns the workbook as NDJSON records (workbook_meta,sheet,cell,edge,image,image_summary,audit). Large files run as a background job and are polled to completion for you.submit_job: starts a parse job and returns its handle (job_id,status_url,stream_url) without waiting.stream_job: the NDJSON output of a finished job, optionally from recordsince.wait_seconds(up to 60) waits for a job that is still running;status_only: truereturns the job's status instead.diff_workbooks: cell-level differences between two workbooks: added, removed and changed cells (value and/or formula), with format-only changes listed separately. Takesbefore_*andafter_*inputs andinclude_format.
Formulas
evaluate_formula: evaluates one Excel formula against cell values you pass, for example{"formula": "NPV(0.08,A1:A5)", "data": {"A1": 100, ...}}. Values keep their Excel types:true/falseare logical cells and a string such as"#N/A"is that error, soSUM,AVERAGEandCOUNTtreat them as a workbook would. Supports 278 Excel functions, including financial, statistical, lookup and dynamic-array functions.
Recalculating a file
recalc_workbook: takes an.xlsx(path,urlorbase64) and returns it with computed values saved in every formula cell, plus the same error summary. Call it after you create or edit a workbook with openpyxl (or any library that saves formulas without results): without it, pandas, openpyxldata_only=Trueand other readers that are not Excel see empty cells. It replaces running LibreOffice'srecalc.py. Passoutput_pathto write the result on your computer; the same path as the input withoverwrite: truerecalculates a file in place. The file is uploaded for the calculation and not kept.
Both file-returning tools carry over what Basis does not model (styles, charts, images, data validation, conditional formats, defined names, comments, VBA in .xlsm) byte for byte. What cannot be kept is listed under summary.warnings: per-word formatting inside a cell's text, what-if data tables, and the cached results of multi-cell array formulas. Formulas Basis cannot compute are listed under summary.uncomputed instead of being saved blank without notice.
Workbook sessions. A session holds one workbook open on the Basis API so you can change it step by step.
create_session: opens a workbook frompath,url,base64or your Library (library_file_id), or starts a blank one. Optionalcalcturns on iterative calculation. A localpathtravels inside one request, so files over about 24 MB can't open as a session yet;parse_workbookhandles large files.list_sessions,close_session.set_inputs: sets values or formulas by defined name or cell reference, recalculates, and reports which named outputs changed.get_outputs: reads computed values by name, cell reference or range (Sheet1!H2:H18), or every defined name.define_variable: creates or retargets a defined name.delete_variable: deletes a defined name that no formula uses (it lists the formulas that still do).add_sheet: adds a sheet to a blank workbook.rename_sheet: renames a sheet; formulas, defined names and validations that point at it follow the new name.delete_sheet: deletes a sheet the way Excel does: formulas elsewhere that referenced it read#REF!, names scoped to it go, and later sheets move down one index. It lists the formulas and names that broke, refuses the last sheet, and can't be undone withrestore_session.set_calc_settings: turns iterative calculation on or off for circular models.inspect_model: sheets, defined names, calculation settings and statistics, optionally with the dependency graph.get_formula_range: formulas and values for one cell (B4) or a range (A1:D10), up to 2,000 cells a call.trace_dependencies: precedents, dependents or both for a cell, up to 5 levels deep.audit_workbook: a structural audit (errors, broken references, cycles, named ranges).commit_session,restore_session: named checkpoints and rollback.export_workbook: recalculates the session and returns it as an.xlsxwith every formula's computed value saved in the file, plus a summary of formula errors (#REF!,#DIV/0!,#NAME?with sheet and cell). Passoutput_pathto write the file on your computer instead of getting base64 back (overwrite: trueto replace an existing file).save_to_library: saves the workbook to your Basis Library as a new file or a new version.list_library_files: lists the workbooks in your Library, newest first, optionally filtered by name, so you can reopen one withcreate_session'slibrary_file_id.
Tool errors come back as a tool result with isError set and a JSON body {"code", "message", "status"}, for example missing_api_key, unauthorized, network_error, session_not_found or one of the API's error codes.
What gets uploaded
- Parsing and diffing: the workbook is sent to the Basis API. Parse jobs and their results are kept in the server's memory only and expire after 15 minutes.
- Formulas: the formula and the cell values you pass are sent to the Basis API.
- Sessions: the workbook is uploaded when you create the session and stays on the Basis API while you work. A session closes after 30 minutes without use, or when you call
close_session. So that sessions survive server restarts, their state is also checkpointed to private cloud storage, which deletes checkpoints within a day. - Library:
save_to_librarystores the workbook in your Library until you delete it. - Files on your computer: a tool reads a
pathyou pass and uploads that file's contents. It reads nothing else. - URLs: this package downloads a
urlyou pass toparse_workbook,submit_jobordiff_workbookson your machine and uploads the bytes. For sessions, the Basis API downloads the URL itself.
All traffic uses HTTPS, with your API key in the Authorization header. If your workbooks can't leave your machine, don't use this server with them.
Development
From a checkout of this repository:
(cd ../sdk && npm ci && npm run build) # @basis1/parse, linked as file:../sdk
npm ci
npm run build # typecheck, then bundle dist/index.js
npm test # unit, hosted forwarding and stdio handshake tests
npm run test:pack # pack, install in a temp dir, MCP handshake over stdio
To run your build against another Basis server, for example a self-hosted one:
BASIS_API_KEY=devtoken BASIS_BASE_URL=http://localhost:8080 node dist/index.js
How the package is built
dist/index.js is a single esbuild bundle that includes @modelcontextprotocol/sdk and zod (both MIT). As runtime dependencies they would install 95 packages (23 MB) on every first npx run, including web-server frameworks a stdio server never uses. Bundled, npx installs two packages and runs the exact versions we tested. Their license texts ship in dist/THIRD_PARTY_LICENSES.txt, and the build fails if a bundled package isn't permissively licensed.
@basis1/parse is a real runtime dependency, not bundled. In the repository it's file:../sdk. The release process rewrites that to ^<sdk version> before publishing, and scripts/check-publishable.mjs refuses a package that still has a local path.
Releasing
Releases are published by the maintainers. When a change touches both packages, the SDK is released first, then the MCP server, which depends on the published SDK version. version is kept in sync between package.json and server.json.
MCP Registry
server.json describes this server for the MCP Registry as tech.basis1/mcp, and mcpName in package.json links the npm package to it. The tech.basis1/ namespace belongs to the basis1.tech domain rather than a personal GitHub account, so the registry verifies it through DNS. Nothing is submitted automatically.
The maintainers list each release in the registry after the npm publish, signing in with mcp-publisher login dns --domain basis1.tech. The tech.basis1/ namespace is verified through a DNS record on basis1.tech.
License
Apache-2.0. See LICENSE.
Basis MCP questions
How do I add Basis MCP to Claude Code?
Run claude mcp add --env BASIS_API_KEY=<YOUR_BASIS_API_KEY> mcp -- npx -y @basis1/mcp in your terminal. Add --scope user to make it available in every project.
How do I add Basis MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
What tools does Basis MCP provide?
It exposes 22 tools, including parse_workbook, submit_job, stream_job, diff_workbooks, evaluate_formula.
What can the Basis MCP server do with Excel files?
It allows AI agents to parse workbooks, evaluate formulas (supporting 278 Excel functions), trace dependencies, and manage interactive sessions to change inputs and read results.
Do I need an API key to use Basis?
Yes, you need a Basis API key to run the tools, which you can create in your account settings at basis1.tech.
How are my local files handled?
The server reads the file from the path you provide and uploads its contents to the Basis API for processing; it does not read anything else on your computer.