Basis
概览
作者提供的说明(英文原文)
The Excel engine for AI agents: read, check and edit Excel models over MCP.
PopNx MCP 的三大支柱
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
- 用户评价i暂无评价评价功能将在后续阶段与账户功能一起开放
- 我们的基础检查i3 项中通过 3 项依据公开信息检查;尚未扫描代码
- 使用情况i正在增长↓ 958/周 · ★ –
它能帮你做什么
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
- 连接方式: 电脑或云端
- 传输方式: stdio, Streamable HTTP
- 分类: 文档、表格与办公
- 你需要填写:BASIS_API_KEY, Authorization
安装
选择你使用的 AI 应用,然后复制设置。
安装之前
- 基础检查:3 项中通过 3 项
- 在作者的服务器上运行:你向它提出的内容会经过他们的服务器。
- 可以做 26 件事(工具) parse_workbook, submit_job, stream_job, diff_workbooks …
- 需要你自己填写:
BASIS_API_KEY,BASIS_BASE_URL,Authorization
标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
这个地址需要在请求的 header 中放入密钥,而添加连接器的菜单无法设置。请改用 Claude Code、Cursor 或 VS Code。
或者在你的电脑上运行
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"basis1": {
"command": "npx",
"args": [
"-y",
"@basis1/mcp"
],
"env": {
"BASIS_API_KEY": "your-value",
"BASIS_BASE_URL": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add --transport http basis1 https://api.basis1.tech/mcp --header 'Authorization: Bearer {api_key}'或者在你的电脑上运行
claude mcp add basis1 --env BASIS_API_KEY=your-value --env BASIS_BASE_URL=your-value -- npx -y @basis1/mcp运行前请先填写空着的值。
或者自己复制设置
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"basis1": {
"url": "https://api.basis1.tech/mcp",
"headers": {
"Authorization": "Bearer {api_key}"
}
}
}
}或者在你的电脑上运行
或者自己复制设置
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"basis1": {
"command": "npx",
"args": [
"-y",
"@basis1/mcp"
],
"env": {
"BASIS_API_KEY": "your-value",
"BASIS_BASE_URL": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
或者自己复制设置
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"basis1": {
"type": "http",
"url": "https://api.basis1.tech/mcp",
"headers": {
"Authorization": "Bearer {api_key}"
}
}
}
}或者在你的电脑上运行
或者自己复制设置
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"basis1": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@basis1/mcp"
],
"env": {
"BASIS_API_KEY": "your-value",
"BASIS_BASE_URL": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个地址需要在请求的 header 中放入密钥,而添加连接器的菜单无法设置。请改用 Claude Code、Cursor 或 VS Code。
你的选择通过 Cookie 保存在这台设备上,无需账户。
需要你填写的值
- Your Basis API key, from https://api.basis1.tech
BASIS_BASE_URLenvBasis API base URL, to use a self-hosted serverAuthorization机密 必填 HTTP headerBearer followed by your Basis API key
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它能做什么
工具名称和描述与服务器在 2026年11月8日 报告的完全一致。这些内容由作者撰写,不是我们写的;我们以纯文本形式显示。
parse_workbookParse an .xlsx workbook in one call and return its full semantic NDJSON: one JSON record per line (workbook_meta, sheet, cell, edge, image, image_summary, audit), covering every cell's value and formula and the formula dependency edges. Use it to read a whole file without opening
submit_jobStart an async parse of an .xlsx workbook and return at once with a job handle {job_id, status: "processing", status_url, stream_url}. Use it instead of parse_workbook for large files or when you don't want to wait: call stream_job with wait_seconds to wait for the records (or st
stream_jobCheck 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 output parse_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 pr
diff_workbooksCompare two .xlsx files cell by cell and return the differences as JSON: {summary, added, removed, changed, format_changed}. Cells are matched on (sheet title, cell ref); changed covers value and formula changes, and format-only changes are listed separately. Use it to see what c
evaluate_formulaEvaluate an Excel formula locally and return the computed result: a quick way to check what a formula returns on a few sample values before you put it in a workbook. Pass data as a map of cell references to values (e.g. {"A1": 100, "A2": true, "A3": "#N/A", "B1": "hello"}) and a
create_sessionOpen a workbook in a session that the other workbook tools then use by session_id: the starting point for reading, editing, recalculating and exporting a model. Pass at most one of library_file_id (a file in your Library), base64 (raw .xlsx bytes) or url, or none for a blank work
close_sessionEnd a session and discard its 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
list_sessionsList the sessions open for this API key, to recover a session_id you've lost or to see how many are open before create_session. Returns {sessions: [{id, documentId, libraryFileId, createdAt, updatedAt, sheetCount, memBytes}]}, times in epoch milliseconds; closed and expired sessi
add_sheetAdd an empty sheet at the end of a session's workbook and make it the active sheet (the one unqualified refs like "B4" point to). Only for sessions created blank (create_session with no file); on an imported workbook it fails, so work in its existing sheets with set_inputs instea
rename_sheetRename a sheet in a session's 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't change; use it rather than add_sheet when
delete_sheetDelete a sheet from a session's workbook, found by its 0-based index (see the sheets list from create_session or inspect_model), the way Excel does: formulas on other sheets that referenced it now read #REF! (Gone!A1 becomes #REF!A1) and evaluate to #REF!, a 3D range ending on it
set_inputsWrite values or formulas into cells of a session and recalculate: the way to run a scenario on a model ("what if Revenue is 1.2M?"). Keys are defined names (e.g. "Revenue") or cell refs ("B4" on the active sheet, "Sheet1!A1"); values are numbers, booleans (logical TRUE/FALSE), er
set_calc_settingsTurn iterative calculation on or off for a session and recalculate. Needed for circular models (e.g. development pro formas where loan size depends on cost, which includes the loan's interest and fees): with it on, set_inputs re-converges the loop on every call. Saved with the se
get_outputsRead computed values from a session by defined name, cell or range: the way to check what a model's formulas return, e.g. after 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); omit names to
define_variableCreate a defined name for a cell, or repoint an existing one, so set_inputs and get_outputs can use a readable key ("Revenue") instead of a cell ref. A name that already exists in the same scope is overwritten with the new target; no cell's value or formula changes. Names follow
delete_variableDelete 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 she
inspect_modelSummarize a session's structure: each sheet's index, name and used rows and columns, every defined name with its target, the iterative-calc settings, and counts of cells, memory, edit events and commits. Use it to find your way around a workbook before reading or editing it: shee
export_workbookGet a session's workbook back as an .xlsx file with every formula's computed value saved in it. Recalculates first. Call this when you need the file itself: to give it to the user, or to read it with pandas, openpyxl (data_only=True) or any tool that is not Excel. Returns file_ba
recalc_workbookRecalculate an .xlsx file and return it with the computed values saved in every formula cell. Use this after you create or edit a workbook with openpyxl or any other library that writes formulas without results: those files have no cached values, so pandas, openpyxl (data_only=Tr
get_formula_rangeRead the formulas and computed values of one cell or a rectangular range in a session: the way to check what a cell or a block of cells computes. Pass a single cell ("B4", "Sheet1!B4") or a range ("A1:D10"). Returns {worksheet, range, cell_count, cells: [{cell, formula, value, va
commit_sessionCreate a named checkpoint of the session's current state, e.g. before a risky edit. Returns {commit_id, message, total_commits}; pass commit_id to restore_session to roll back. Every call adds a new checkpoint. Checkpoints live in the session only and are lost when it closes or e
restore_sessionRoll a session back to a checkpoint from commit_session: every cell edit made after it is undone, calc settings included, and the workbook is recalculated. Use it to throw away a what-if or a bad edit; it rewinds this session only and can't reopen a closed one. Returns {restored_
trace_dependenciesFollow formula references from one cell in a session, breadth first, up to depth levels (1-5): direction "precedents" walks to the cells it reads, "dependents" to the cells that read it, and "both" (the default) does each. Returns {root, direction, max_depth, levels: [{depth, nod
audit_workbookCheck a session's whole workbook for modeling problems and return a JSON report: broken references, circular references and whether they converge, hardcoded plugs (a constant or odd formula breaking a run of consistent formulas), external links, volatile functions, hidden sheets
save_to_librarySave the session's workbook to the user's Library for durable storage. If the session was loaded from the Library or was previously saved, this creates a new version of that file. Otherwise it creates a new Library file. Each save is a named version in the Library's history: pass
list_library_filesList 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_byt
基础检查i
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月9日
- ✓ 通过
作者与仓库一致
注册名称已通过域名 basis1.tech 验证(注册中心会核实域名所有权)
- … 尚未检查
仍在维护
我们还没有从 GitHub 读取这个仓库
- … 尚未检查
有许可证
我们还没有从 GitHub 读取这个仓库
- ✓ 通过
端点有响应
在 78 毫秒内响应(HTTP 200)
- – 不适用
使用 OAuth 登录
无需登录
- ✓ 通过
工具描述中没有隐藏指令
已读取 26 个工具描述,未发现针对 AI 的隐藏指令
与“文档、表格与办公”中的其他服务器比较i
- 星标数多于此分类中其他 3598 个服务器的 0%
- 发布到注册中心的时间比此分类中其他 3598 个服务器的 94% 更新
- 基础检查结果等于或优于此分类中其他 3598 个服务器的 100%
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
常见问题
Basis 安全吗?
它在 3 项适用的基础检查中通过了 3 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
它需要哪些密钥或代码?
你需要填写:BASIS_API_KEY, Authorization
它在我的电脑上运行还是在云端?
两种方式都可以:安装在你的电脑上,或者连接云端版本。
它还在维护吗?
GitHub 仓库最后更新于–,最新版本(0.3.1)于昨天进入注册中心。
哪些应用可以使用它?
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
有什么可以替代它?
同一分类中有:Agent-Native Calendar, Excel MCP Server, MCP Server for Excel
替代选择
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Excel MCP Server
Create and edit Excel files with AI: charts, PivotTables, formulas. No Excel needed.
MCP Server for Excel
Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.
作者的 README
打开 README
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
@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.
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
If your client supports remote MCP servers over HTTP with custom headers, you can connect to the hosted endpoint directly instead of running this package:
{
"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.get_job_status: the status of a job.stream_job: the NDJSON output of a finished job, optionally from recordsince.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, ...}}. 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.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.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_cell_formula,get_formula_range: formulas and values for one cell or a range.trace_dependencies: precedents and dependents of 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).snapshot_session: the current workbook as.xlsxbytes (base64), no summary. Preferexport_workbook.save_to_library: saves the workbook to your Basis Library as a new file or a new version.
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 ^ 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.