Skip to main content
Glama

ExcelMCP

AI 에이전트를 위한 실시간 Excel 인텔리전스 레이어. OneDrive 폴더를 가리키면 에이전트가 현재 있는 숫자에 대해 평범한 영어로 스프레드시트에 질문할 수 있습니다.

Python License: MIT MCP Built with FastMCP Microsoft Graph Status PRs welcome


이 도구가 해결하는 문제

대부분의 스프레드시트 통합은 데이터를 다른 곳에 복사하는 방식으로 작동합니다. 통합 문서를 수집하고, 청크로 나누고, 셀 값을 임베딩한 후, 전체를 벡터 데이터베이스에 저장합니다. 그 순간부터 에이전트는 스냅샷에 대한 질문에 답하게 됩니다. 누군가 오전 9시에 재고 시트를 업데이트해도 에이전트는 화요일 숫자를 인용하고 있습니다.

ExcelMCP는 문제를 두 가지로 나눕니다.

구조는 캐시됩니다. 파일 이름, 시트 이름, 열 머리글, 머리글 행이 시작되는 위치, 어떤 열이 날짜를 보유하는지, 시트가 서로 어떻게 관련되는지 — 또한 낮은 카디널리티 열당 고유 레이블의 작은 샘플도 포함됩니다. 이는 수백 개의 거의 동일한 시트에서 라우팅을 가능하게 하는 요소입니다. 이것은 거의 변경되지 않으며 저장 비용이 저렴하고, 에이전트가 무엇을 요청할지 알기 위해 필요한 정보입니다. (샘플링된 레이블은 구조가 값에 닿는 유일한 지점입니다. 정확한 경계는 디스크에 저장되는 내용에 설명되어 있습니다.)

데이터는 절대 캐시되지 않습니다. 숫자를 반환하는 모든 도구 호출은 Microsoft Graph API로 나가서 실시간으로 가져옵니다. 오래된 데이터 캐시, 뒤처지는 동기화 작업, 디스크에서 제공되는 답변은 없습니다.

모든 응답에는 metadata.fetched_at 타임스탬프와 is_cached: false 플래그가 포함되어 있어 모델이 대역 내에서 최신 데이터를 보고 있음을 알 수 있습니다.


Related MCP server: Microsoft 365 MCP Server

작동 방식

자연어 질문이 임베딩되고, 코사인 유사도로 시트 설명과 매칭된 후, 열 이름 및 샘플링된 값과의 어휘적 중복으로 재순위화됩니다. 이는 20개의 통합 문서가 하나의 스키마를 공유할 때 라우팅을 의미 있게 유지하는 방법입니다. 해당 시트들만 실시간으로 가져옵니다. 그런 다음 필터링과 집계는 새로 가져온 프레임에서 pandas로 이루어집니다. 단일 값 질문은 행 파이프라인을 완전히 건너뜁니다. lookup은 하나의 키 열과 하나의 행을 읽고, 출처와 함께 셀을 반환합니다.


요구 사항

  • Python 3.10 이상

  • OneDrive가 있는 Microsoft 365 계정

  • uv 또는 원한다면 일반 pip


설치

저장소 루트에서:

git clone https://github.com/Karunya-Muddana/ExcelMCP.git
cd ExcelMCP

uv sync      # install dependencies
uv build     # build the wheel
pip install dist/excelmcp-0.3.0-py3-none-any.whl

또는 빌드 없이 소스에서 직접 설치:

pip install .

컴파일러 단계나 네이티브 확장 빌드가 없습니다. 벡터 검색은 hnswlib 대신 NumPy 코사인 스캔으로 실행되므로, C++ 툴체인이 없는 머신에서도 pip install이 작동합니다.


설정

마법사를 한 번 실행합니다:

excelmcp-setup

네 가지를 안내합니다:

  1. Microsoft 장치 흐름 로그인. 코드를 받아 브라우저에 붙여넣으면 토큰 캐시가 0600 권한으로 ~/.excelmcp/token.json에 저장됩니다.

  2. 인덱싱할 OneDrive 폴더(예: /ERP).

  3. 해당 폴더의 모든 .xlsx 파일을 스캔하여 구조 그래프와 임베딩을 구축합니다.

  4. 머신에 이미 설치된 AI 에이전트를 감지하고 선택한 에이전트에 대한 설정 항목을 작성합니다.

자동으로 설정할 수 있는 에이전트

에이전트

설정 파일

Claude Code

~/.claude.json

Claude Desktop

claude_desktop_config.json

Cursor

~/.cursor/mcp.json

Windsurf

~/.codeium/windsurf/mcp_config.json

Gemini CLI

~/.gemini/settings.json

Codex CLI

~/.codex/config.toml

VS Code (Copilot)

VS Code 사용자 mcp.json

Cline

확장 cline_mcp_settings.json

Continue

~/.continue/config.yaml

Goose

~/.config/goose/config.yaml

Zed

~/.config/zed/settings.json

Hermes

~/.hermes/config.yaml

기존 설정 파일은 수정되기 전에 백업됩니다. 에이전트가 목록에 없으면 마법사가 직접 붙여넣을 정확한 JSON 또는 TOML 블록을 출력합니다.

기타 마법사 명령어

excelmcp-setup list-agents           # show what was detected
excelmcp-setup install --only cursor # register with one agent, skip the rescan
excelmcp-setup doctor                # diagnose a broken install
excelmcp-setup uninstall             # remove ExcelMCP from every agent config
excelmcp-setup --folder /ERP --yes   # fully non-interactive
excelmcp-setup --dry-run             # print the changes, write nothing

에이전트에 노출되는 도구

도구

네트워크

기능

get_workspace_graph

없음

작업 공간의 전체 구조: 파일, 시트, 열, 테이블 영역, 관계, 이름 변형, 스캔 연령. 즉시.

inspect_file

없음

동일하지만 하나의 파일로 좁혀짐, 마지막 스캔 기준 대략적인 행 수 포함. 즉시.

scan_workspace

무거움

OneDrive를 다시 크롤링하고 구조, 샘플링된 값, 관계, 임베딩을 재구축합니다.

query

실시간

자연어 질문, 벡터 유사도 및 어휘 재순위화로 라우팅됩니다.

lookup

실시간

한 번 호출 → 파일/시트/셀 출처 및 신호 신뢰도와 함께 하나의 셀 값.

get_cell

실시간

하나의 주소가 지정된 셀을 하나의 Graph 요청으로 가져옵니다.

filter_sheet

실시간

시트 하나를 가져와 조건과 일치하는 행을 반환합니다.

aggregate

실시간

시트 하나를 가져와 그룹화하고 축소하며 having을 지원합니다.

cross_file_aggregate

실시간

모든 파일에서 일치하는 시트를 가져와 총계로 합칩니다.

join_sheets

실시간

알려진 관계에서 제안된 키 열을 기준으로 두 시트를 병합합니다.

derive

실시간

거래 유형에 대한 부호 있는 합계 — 한 번 호출로 순 재고.

두 구조 도구는 로컬 그래프를 읽기 때문에 무료이며 즉시 실행됩니다. 실시간으로 표시된 모든 것은 매 호출마다 API로 이동합니다.


사용법

서버가 등록되면 대부분 평소처럼 에이전트와 대화하면 됩니다. 내부적으로는 다음과 같은 호출을 수행합니다.

먼저 방향을 잡습니다. 에이전트는 열 이름을 추측하기 전에 항상 이 작업을 수행해야 합니다. 어떤 두 회사도 같은 방식으로 이름을 짓지 않기 때문입니다:

get_workspace_graph(folder_path="/ERP")

답이 어디에 있는지 모르는 상태에서 질문합니다:

query("what are the top 10 products by sales value", folder_path="/ERP")

알려진 시트를 필터링합니다:

filter_sheet(
    file_name="Inventory.xlsx",
    sheet="Stock",
    conditions={"Status": "Low", "Quantity": "<50"},
    folder_path="/ERP",
    sort_by="Quantity",
    limit=100,
)

지원되는 조건 연산자, 모두 AND로 결합됩니다:

형식

의미

{"Col": "value"}

정확히 일치 — 대소문자 및 공백 무시; 엄격하게 하려면 exact_case=True 전달

{"Col": "~value"}

포함, 리터럴 부분 문자열, 정규식 아님

{"Col": ">100"}

보다 큼 (>=, <, <=도 지원)

{"Col": ">=2026-01-01"}

날짜 경계, ISO-8601, 감지된 날짜 열에서 작동

{"Col": {"in": ["a", "b"]}}

나열된 값 중 하나

{"Col": {"between": [10, 500]}}

포함 범위, 숫자 또는 날짜

{"Col": {">=": "2026-01-01", "<": "2026-04-01"}}

결합된 경계

{"Col": {"is_null": false}}

null 검사 — 공백 및 빈 문자열은 null로 간주

존재하지 않는 열 이름이나 연산자는 오류를 발생시켜 자동으로 0행을 반환하지 않습니다. 이는 에이전트가 잘못된 것을 자신 있게 보고하게 만드는 실패 모드입니다. 조건이 정당하게 아무것도 일치하지 않으면 응답에 zero_match_diagnostics가 포함됩니다 — 각 조건이 자체적으로 일치시킨 내용과 문제가 있는 열에 실제로 있는 최대 20개의 값 — 따라서 근접 실패가 "데이터 없음"으로 보고되는 대신 수정됩니다.

한 번의 호출로 단일 수치를 요청합니다:

lookup(query="contracted rate for Titanium Dioxide under the BESTEX contract",
       folder_path="/Contracts")

답변은 출처(파일, 시트, 셀 주소, 일치된 행)와 신뢰도 필드와 함께 반환됩니다. 여러 개의 일치 행이 있으면 모든 행과 함께 ambiguous를 반환합니다. 시트 간에 불일치가 있으면 모든 버전과 값 없이 conflict를 반환합니다. 잘못 입력된 키는 퍼지 제안을 반환합니다. 이 도구는 절대 단순한 숫자를 반환하지 않습니다.

하나의 파일 내에서 그룹화하고 축소합니다:

aggregate(
    file_name="Sales.xlsx",
    sheet="Q1",
    group_by="Region",
    value_col="Revenue",
    operation="sum",
    folder_path="/ERP",
)

작업 공간의 모든 파일에서 동일한 시트를 합산합니다:

cross_file_aggregate(
    sheet="Q1",
    value_col="Revenue",
    operation="sum",
    folder_path="/ERP",
    conditions={"Status": "Closed"},
)

cross_file_aggregate는 파일별 분석과 함께 총계를 반환하며, 파일을 읽을 수 없는 경우 skipped_files와 정확한 시트 이름을 포함하지 않는 모든 파일에 대해 unmatched_files( did_you_mean 후보 포함)를 반환합니다. 이렇게 하면 부분 총계가 조용히 잘못되는 대신 명확하게 부분임을 알 수 있습니다. 여기에는 일부 파일에서 시트 이름이 Sales이고 다른 파일에서는 Sales 2024인 경우도 포함됩니다. 집계하기 전에 get_workspace_graph에서 sheet_name_variants를 확인하여 이러한 분열을 미리 확인하십시오.


에이전트 플레이북

서버를 설치하는 것은 쉬운 절반입니다. agents/ 폴더는 나머지 절반을 다룹니다: 이러한 도구를 가진 에이전트를 프롬프트하는 방법, 각 호스트에 연결하는 방법, 그리고 작동한 후에 자동화할 내용입니다.

agents/system-prompt.md

커스텀 에이전트, 서브에이전트, CLAUDE.md 또는 Cursor 규칙에 바로 적용할 수 있는 시스템 프롬프트입니다. 전체 버전과 축약 버전, 그리고 작업 공간의 특성을 고정하기 위한 템플릿이 포함되어 있습니다.

agents/prompts.md

작업별로 분류된 복사-붙여넣기 프롬프트: 오리엔테이션, 직답, 분석, 검증, 보고, 데이터 품질. 마지막에는 안티 프롬프트 세트, 즉 그럴듯해 보이지만 신뢰할 수 있는 오답을 생성하는 표현들이 포함되어 있습니다.

agents/guides/getting-started.md

체인이 처음부터 끝까지 작동함을 증명하는 첫 번째 세션으로, 데이터가 실제로 실시간임을 직접 확인하는 방법을 포함합니다.

agents/guides/hosts.md

지원되는 12개 호스트 구성 각각에 기록되는 내용, 확인 방법, 호스트별 특이 사항, 호스트 없이 프로그래밍 방식으로 서버를 구동하는 방법을 다룹니다.

agents/guides/query-patterns.md

어떤 도구를 사용해야 하는지, 시맨틱 라우팅이 실제로 시트를 선택하는 방법, 조건 구문으로 표현할 수 없는 것, 그리고 확신에 찬 오답을 생성하는 데이터 형태에 대해 설명합니다.

agents/guides/troubleshooting.md

PATH 문제와 403 오류부터 잘못된 열 이름과 두 배로 나오는 합계까지, 다양한 증상에 대한 해결 방법을 제공합니다.

agents/routines/

즉시 사용 가능한 네 가지 루틴: 일일 재고 확인, 주간 매출 요약, 월말 정산, 데이터 품질 감사. 각각 프롬프트, 일정, 그리고 자주 발생하는 문제점이 포함되어 있습니다.

서버에 내장된 안전장치

서버는 MCP 명령어에 일련의 운영 규칙을 포함하여 제공하며, 호스트 모델은 첫 번째 호출을 하기 전에 이를 읽습니다. 이 규칙들은 LLM이 스프레드시트 질문에 대해 특정 방식으로 오류를 범하기 때문에 존재합니다:

  • 파일 이름, 시트 이름 또는 열 이름을 추정하지 마십시오. 그래프에서 찾으십시오.

  • 여러 파일의 숫자를 머릿속으로 더하지 마십시오. cross_file_aggregate를 호출하여 도구가 처리하도록 하십시오.

  • openpyxl, pandas.read_excel 또는 로컬 파일 시스템을 사용하지 마십시오. 파일은 이 머신에 없습니다.

  • 트랜잭션 스타일 데이터에서 수량 열을 원시 합계로 계산하지 마십시오. 트랜잭션 유형을 명시하여 derive를 사용하십시오.

  • 날짜 열은 서버에서 직렬 값에서 이미 변환된 ISO-8601 문자열로 도착합니다. 수동으로 직렬 산술을 수행하지 마십시오.

  • 단일 수치의 경우 lookup을 호출하고 반환되는 출처를 인용하십시오. 값을 선택하는 대신 ambiguous 및 conflict 결과를 표시하십시오.

  • 결과가 완전하다고 주장하기 전에 truncated 및 total_matched 필드를 확인하십시오.

서버 명령어를 무시하는 호스트와 직접 구축하는 커스텀 에이전트는 자체 프롬프트에 이를 명시해야 합니다. agents/system-prompt.md를 참조하십시오.


구성

변수

기본값

목적

EXCELMCP_CLIENT_ID

내장

Azure AD 애플리케이션 클라이언트 ID

EXCELMCP_TENANT_ID

common

테넌트. 개인 계정의 경우 common을 사용하십시오.

EXCELMCP_DEFAULT_FOLDER

설정 안 됨

도구 호출 시 folder_path가 생략된 경우 사용할 폴더입니다. 마법사가 이를 에이전트 구성에 기록합니다.

EXCELMCP_MAX_CONCURRENCY

8

모든 코드 경로에서 최대 동시 Microsoft Graph 요청 수입니다.

내장 클라이언트 ID는 장치 코드 흐름에 사용되는 공용 클라이언트입니다. 비밀을 포함하지 않으며, 설계상 모든 인증 요청에 표시되며, 이 저장소에 있어도 안전합니다. 동의 화면에 조직 이름을 표시하려면 자체 앱 등록으로 교체하십시오.


디스크에 저장되는 내용

~/.excelmcp/
  token.json           MSAL token cache. Auth material only, written 0600.
  graph.json           Structure graph: item IDs, sheet names, column headers,
                       used-range dimensions, date column types, per-sheet
                       table regions, inferred and formula-declared
                       relationships — and sampled values (see below).
  vectors.npy          Embedded sheet descriptions for semantic routing.
  metadata.json        Labels and lexical terms tying each embedding to a sheet.
  relationships.yaml   Optional, written by you: declared join relationships.

0.3.0 기준, 캐시 없음 주장의 정직한 버전입니다. 데이터의 어떤 행, 셀 그리드, 또는 쿼리 가능한 값도 디스크에 저장되지 않습니다. 모든 답변은 항상 실시간 가져오기로 제공됩니다. 한 가지 의도적인 예외가 있습니다: graph.json은 샘플링된 값을 저장하며, 스캔 시점에 캡처된 낮은 카디널리티 열(클라이언트 이름, 상태, 자재 이름, 단위)당 최대 50개의 고유 텍스트 레이블을 저장합니다. 이 값들은 수백 개의 구조적으로 동일한 시트를 질문 라우팅 시 구별할 수 있도록, lookup이 모든 것을 다운로드하지 않고도 "BESTEX"가 포함된 시트를 찾을 수 있도록, 그리고 열 이름에서 가정하는 대신 값 중복에서 관계를 추론할 수 있도록 존재합니다. 이는 라우팅 증거이지 데이터 캐시가 아닙니다. 어떤 것도 이 값들로 질문에 답변하지 않으며, 작업 공간 스캔 시 전체를 새로 고칩니다. 그래프는 또한 시트별 구조 지문(헤더 열 및 사용된 범위 주소)을 드리프트 감지 목적으로만 저장하며, 0.3.0의 새로운 기능으로 영역 맵을 저장합니다: 시트의 자체 SUM/COUNT/AVERAGE 수식이 참조하는 범위와 교차 시트 수식이 읽는 주소에서 파생된 시트의 각 테이블 본문 행 범위입니다. 이는 행 번호와 셀 주소이지 내용이 아닙니다. 값을 읽어 생성되지 않습니다. 영역의 label(있는 경우)은 샘플링된 값과 함께 두 번째 의도적인 예외입니다: 영역 바로 위의 섹션 배너 셀에서 읽은 몇 단어("NAPHTHALENE", "OLEUM 65%")로, 모델이 행 번호에서 추측하는 대신 어떤 테이블을 의미하는지 이름을 지정할 수 있도록 유지됩니다. 이는 시트 레이아웃을 설명하는 구조적 메타데이터이지 행 데이터가 아닙니다. 이는 샘플링된 값이 이미 그리는 것과 동일한 구분입니다. 이 중 어떤 것이든 디스크에 저장하기 싫다면 해당 폴더를 스캔하지 마십시오. 경계를 확인하려면 graph.json이 작고 읽을 수 있으므로 직접 확인하십시오.

Windows에서 os.chmod는 읽기 전용 비트만 전환하므로 0600 모드는 최선의 노력이며 실제 보호는 %USERPROFILE%의 기본 사용자별 ACL입니다. macOS 및 Linux에서는 임시 파일에 내용이 기록되기 전에 모드가 적용되므로 토큰이 세계에서 읽을 수 있는 상태로 잠시 존재하지 않습니다.


테스트

# offline unit tests, no network and no credentials required
pytest tests/test_unit.py

# live integration tests against a workspace you have already scanned, opt in
EXCELMCP_TEST_FOLDER=/ERP pytest tests/test_live_integration.py -v

통합 테스트 스위트는 EXCELMCP_TEST_FOLDER가 설정되지 않으면 자체를 건너뛰므로, 일반 pytest 실행은 오프라인 상태를 유지합니다.


프로젝트 레이아웃

agents/           prompts, host guides, and schedulable routines
auth.py           MSAL device flow, token cache, proactive refresh
graph_client.py   Graph API wrapper, 429 backoff, shared concurrency gate
structure.py      Structure discovery, value sampling, relationship inference
embeddings.py     FastEmbed vectors, NumPy cosine search, lexical rerank
query_engine.py   Conditions, live fetch, aggregation, joins, derive
lookup.py         Single-cell lookup pipeline and get_cell
ranges.py         A1-notation range arithmetic
main.py           FastMCP tool definitions and server entry point
cli.py            Setup wizard, agent detection, config writing
agents.py         Per agent config formats and file locations
storage.py        Atomic writes, stderr logging, config directory handling

기여

이슈 및 풀 리퀘스트를 환영합니다. 다른 에이전트에 대한 지원을 추가하는 경우, agents.py만 수정하면 됩니다: 구성 경로, 항목 형태 및 감지 힌트와 함께 AgentSpec을 추가하십시오.


라이선스

MIT. LICENSE를 참조하십시오.

Available Tools

11 tools
aggregateA

Fetches a sheet LIVE and runs a grouped aggregation. Operations: sum, count, mean, min, max. group_by is one column name or a list of them. conditions filters rows before aggregating (same grammar as filter_sheet, including the object form). having filters the AGGREGATED rows afterwards, e.g. having={"Revenue": ">1000"} keeps only groups whose aggregate exceeds 1000. SINGLE FILE ONLY. For totals across multiple files you MUST use cross_file_aggregate instead — never use this tool and then manually add results across files. Get column names from get_workspace_graph first. Returns rows plus a truncated flag. If conditions matched zero rows, zero_match_diagnostics shows what each condition matched alone and the values actually present — correct the condition and retry.

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetYes
havingNo
group_byYes
file_nameYes
operationYes
value_colYes
conditionsNo
folder_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description discloses key behavioral traits: live data fetch, output includes a 'truncated flag', and zero_match_diagnostics behavior when no rows match. It also explains condition grammar and having filter semantics with an example, providing substantial context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured with line breaks, and each sentence adds necessary information (operations, parameters, single-file constraint, diagnostics). It is slightly long but avoids redundancy and earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (8 params, grouped aggregation), the description covers essential context: multi-file exclusion, column names source, condition/having grammar, return flags, and error diagnostics. An output schema exists, so return details need not be repeated. Folder_path is the only minor omission, but optional and less critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It explains group_by (column name or list), conditions (filter_sheet grammar), having (post-aggregation filter with example), and lists operations. However, folder_path and file_name/sheet are not explicitly described, leaving minor gaps for those parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's core action: 'Fetches a sheet LIVE and runs a grouped aggregation' and lists supported operations. It also distinguishes itself from siblings by explicitly limiting to a single file and pointing to cross_file_aggregate for multi-file operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use and when-not-to-use guidance: 'SINGLE FILE ONLY' and 'For totals across multiple files you MUST use cross_file_aggregate instead'. It also references filter_sheet grammar for condition syntax and advises fetching column names from get_workspace_graph first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cross_file_aggregateA

MANDATORY for any total spanning more than one file. Fetches relevant sheets from ALL files in PARALLEL, applies filter conditions, returns the aggregate total.

WHEN YOU MUST CALL THIS:

  • Any total, sum, count, or average across multiple files

  • Any cross-file comparison or consolidation

  • Verifying a total you calculated from individual files

NEVER calculate cross-file totals by:

  • Adding individual filter_sheet results in your head

  • Using Python to sum numbers from separate tool calls

  • Guessing based on partial data

Always call this AND show per-file breakdown so the user can verify both agree. If they differ, flag it.

ONLY files whose sheet is named EXACTLY sheet are included in the total. Files without that exact sheet are listed in unmatched_files, with their actual sheet names and did_you_mean candidates — they are NEVER silently included. If the response has a warning, skipped_files, or unmatched_files, surface that to the user: the total may be incomplete. Check sheet_name_variants in get_workspace_graph first to see naming fragmentation before aggregating.

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetYes
operationYes
value_colYes
conditionsNo
folder_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, the description discloses key behaviors: parallel fetching, exact sheet-name matching, listing unmatched files with did_you_mean candidates, and never silently including them. It also warns that warning/skipped_files/unmatched_files indicate incomplete totals and mandates surfacing them to the user. It does not explicitly state read-only nature, but there are no mutations implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but well-structured with bolded headings and lists, making it scannable. Each sentence carries actionable guidance, though some redundancy exists (e.g., repeated emphasis on showing per-file breakdown). Overall, it earns its length without being bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values need not be described, yet the description references response fields (unmatched_files, skipped_files, warning) for error handling and gives a cross-tool prerequisite. It does not explain all parameters or link to filter_sheet's conditions structure, but it is highly comprehensive for a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It clarifies that `sheet` must match exactly and mentions 'filter conditions' conceptually, but it does not explain `value_col`, `operation` options, `conditions` structure, or `folder_path`. It adds some semantic context beyond the bare schema but leaves significant parameter gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'MANDATORY for any total spanning more than one file' and explicitly states it fetches sheets from all files, applies filter conditions, and returns the aggregate total. It distinguishes from siblings like filter_sheet and aggregate by contrasting its cross-file scope with single-file alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'WHEN YOU MUST CALL THIS' list (any cross-file total/sum/count/average, cross-file comparison, verifying totals) and a 'NEVER calculate' list (adding filter_sheet results, Python summing, guessing). It also instructs to check sheet_name_variants in get_workspace_graph first, naming a prerequisite tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deriveA

Computes a NET value over transaction types in one call: sum of sign * groupwise_sum(quantity_col) across the given components. This is how a stock figure like receipts + purchases − consumption − returns becomes ONE call with the arithmetic done in pandas, instead of five filter_sheet calls added up in your head (which RULE 3 forbids).

components is a list of {"conditions": {...same grammar as filter_sheet...}, "sign": 1 or -1, "label": "receipts"} conditions (optional) pre-filters the sheet before any component applies. The response includes a per-component breakdown with rows_matched. A component that matched ZERO rows is flagged and warned about — check the spelling of the transaction type before trusting the net.

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetYes
group_byYes
file_nameYes
componentsYes
conditionsNo
folder_pathNo
quantity_colYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that computation is done in pandas, includes a per-component breakdown with rows_matched, and flags zero-match components with a warning. It does not explicitly state that the operation is read-only (no file modification), but given its nature and the context, that is a minor omission. Overall, it provides strong behavioral safeguards beyond a simple summary.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact but rich. It front-loads the core purpose, then provides an example, breaks down the components structure, and adds a critical warning. A few words are slightly repetitive ('one call' appears twice), but each sentence adds value and the structure is logical, so it earns a high score without being overly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 7 parameters and is genuinely complex, but the description covers the main behavioral contract: the net computation, component structure, optional conditions, and output warnings. It doesn't elaborate on folder_path or file_name, but those are self-explanatory. Given the output schema exists (per context signals), the description does not need to explain return values in detail. This is fairly complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description is the only source of parameter meaning. It thoroughly explains the complex 'components' list (conditions, sign, label), clarifies 'conditions' as optional pre-filter, and ties 'quantity_col' to the groupwise_sum. This goes well beyond the bare schema and compensates entirely for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Computes') and clearly defines the resource ('NET value over transaction types'). It explicitly contrasts with filter_sheet by showing how it replaces five calls, which strongly distinguishes it from siblings. This is a textbook example of purpose clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: to compute a net figure from signed components in one call, and tells the agent to avoid multiple filter_sheet calls (citing RULE 3). It names the alternative filter_sheet and implies that the tool is the right choice for this pattern. No exclusion criteria are missing; it is very clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

filter_sheetA

Fetches a specific sheet LIVE from OneDrive and returns rows matching the given conditions. Always live — no cache. Use when you already know which file and sheet to query. Get column names from get_workspace_graph first.

Condition formats (string form): Exact match: {"ColumnName": "value"} Contains: {"ColumnName": "~value"} (literal, not regex) Comparisons: {"ColumnName": ">100"} (also >=, <, <=) Date bounds: {"Batch Date": ">=2026-01-01"} (ISO-8601)

Condition formats (object form, combinable): IN list: {"Status": {"in": ["Closed", "Shipped"]}} Range: {"Qty": {"between": [10, 500]}} Date range: {"Batch Date": {">=": "2026-01-01", "<": "2026-04-01"}} Null check: {"Notes": {"is_null": false}} Contains: {"Name": {"contains": "oxide"}}

Multiple conditions are ANDed together; multiple operators inside one object are ANDed too. An unknown column name or operator is an error, not an empty result.

MATCHING IS NORMALISED, NOT STRICT: exact string matches ignore case and surrounding whitespace ("closed" matches "Closed "), because Excel cells carry stray whitespace constantly. Pass exact_case=true for byte-for-byte matching. Contains (~) is case-insensitive. If zero rows match, the response includes zero_match_diagnostics showing what each condition matched on its own and the values actually present in the column — use it to correct a near-miss and retry instead of concluding the data does not exist. At most 1000 rows are returned; check the truncated and total_matched fields in the response.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sheetYes
sort_byNo
file_nameYes
conditionsYes
exact_caseNo
folder_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description takes full responsibility for behavioral disclosure. It covers the live/cache behavior, case-insensitive normalized matching, exact_case flag, literal-contains semantics, error behavior for unknown columns/operators, zero_match_diagnostics, and the 1000-row limit with truncated/total_matched fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but earns its length: a clear purpose sentence, structured condition formats with examples, then matching semantics and edge-case behavior. Each section serves a distinct need, and examples are concrete.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given seven parameters, nested conditions, and an output schema, this description covers the high-risk behaviors: error semantics, matching rules, zero-match diagnostics, and response truncation. The presence of an output schema covers return-value structure, and the description supplements it with total_matched/truncated details. The only gaps are sort_by/folder_path semantics, which are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does, thoroughly, for the conditions parameter: exact/contains/comparison/date/IN/between/is_null/contains object forms, AND semantics, and normalization. It also explains exact_case and limit behavior. However, sort_by and folder_path are not explicitly described beyond the schema, a minor gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Fetches a specific sheet LIVE from OneDrive and returns rows matching the given conditions.' It also preempts sibling confusion by noting to get column names from get_workspace_graph first and stating 'Use when you already know which file and sheet to query.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use when you already know which file and sheet to query,' and directs users to get_workspace_graph for column names, setting clear context. It doesn't spell out when not to use it relative to query/aggregate/join_sheets, but the specificity of the condition syntax and the mention of the 1000-row limit imply boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cellA

Reads EXACTLY ONE cell, LIVE, by address. One Graph request, tiny payload, no ambiguity. Use when the location is already known — follow-up questions, scheduled routines, anything where lookup or filter_sheet already established the address earlier. address is A1 notation ("B7") or the name of a workbook-scoped named range that resolves to one cell. Serial dates arrive converted to ISO-8601; check resolved_type. A multi-cell address is an error — use filter_sheet for ranges.

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetYes
addressYes
file_nameYes
folder_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses that it reads exactly one cell, performs a live Graph request, converts serial dates to ISO-8601 with a resolved_type check, and treats multi-cell addresses as errors. These are concrete behavioral details beyond a simple read hint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences earn their place: purpose, usage, then parameter and behavior details. Front-loaded and free of fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and the presence of an output schema, the description covers all key aspects: exact behavior, usage context, parameter semantics, and an edge case. No critical gaps for an AI agent to select and invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It thoroughly explains the address parameter (A1 notation or named range) and its constraints, though file_name, sheet, and folder_path rely on their naming for meaning. Adds clear value for the most complex parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Reads'), a precise resource ('EXACTLY ONE cell'), and key qualifiers ('LIVE, by address'), distinguishing it from sibling range tools like filter_sheet. It emphasizes 'no ambiguity' to set expectations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: 'when the location is already known' for follow-up questions or scheduled routines, and names filter_sheet as the alternative for ranges. This provides a clear when-to-use vs when-not-to.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_workspace_graphA

Returns the cached file structure — all filenames, sheet names, column headers, and cross-sheet relationships (inferred at scan time from matching column names plus overlapping sampled values, merged with any the user declared in ~/.excelmcp/relationships.yaml; each carries a confidence score and its evidence). INSTANT — makes no API call. Reads from local graph.json. ALWAYS call this first at session start to orient yourself. Shows you exactly which files exist, what sheets they have, and what columns are in each sheet. The structure varies for every company — never assume, always discover. Also returns sheet_name_variants: groups of sheet names that differ only in case or whitespace across files — check it before any cross-file operation, because those match by exact sheet name. Each sheet carries a regions list: the table bodies found in it, derived from the sheet's own SUM/COUNT formulas, in absolute sheet rows. A sheet with more than one region holds several separate tables (also listed in multi_region_sheets), so a plain aggregate over it adds up blocks that were never meant to be summed — read its unclaimed_rows and check which region you mean before totalling anything. layout_confidence is "unconfirmed" wherever the region map came from formulas alone and nothing has verified it. Use this before any filter_sheet call when unsure which file or column to query.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses caching ('makes no API call', 'Reads from local graph.json'), warns about unconfirmed layout_confidence, explains multi-region sheets and the risk of summing separate tables, and notes sheet_name_variants as a matching caveat.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core function and all sentences add behavioral value. However, it is somewhat verbose and contains overlapping usage advice ('ALWAYS call this first' and 'Use this before any filter_sheet call'), so it is not maximally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is exceptionally complete for a tool with an output schema and no annotations. It covers the return content, performance characteristics, caching path, confidence scoring, multi-region quirks, and recommended invocation order, leaving little ambiguity about the tool's role.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema defines one parameter, folder_path, but the description never mentions it. Schema description coverage is 0%, and the description provides no compensation—an agent would not know when or why to provide folder_path, or what happens if omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') naming a clear resource ('cached file structure') and enumerates exact content (filenames, sheet names, column headers, cross-sheet relationships). It also distinguishes itself from siblings by highlighting that it is cached and requires no API call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is given: 'ALWAYS call this first at session start' and 'Use this before any filter_sheet call when unsure which file or column to query.' This makes the intended usage context and sequencing very clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_fileA

Returns structural metadata for one specific file — sheet names, column headers, and each sheet's approx_row_count AS OF THE LAST SCAN (this tool makes no API call, so the count is not live; treat it as an order-of-magnitude hint, not a current figure). INSTANT — reads from cached graph.json. Use before filter_sheet when you need to confirm the exact column names available in a specific file.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_nameYes
folder_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it 'makes no API call', 'reads from cached graph.json', and the count is 'not live' and should be treated as an 'order-of-magnitude hint'. This reveals staleness and performance characteristics beyond what annotations would provide, ensuring the agent understands the tool's limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the primary purpose, and every sentence earns its place: it covers the output, the caveat about non-live counts, the performance characteristic (INSTANT), and a usage example. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides rich behavioral context (caching, staleness, speed) and usage guidance, and an output schema exists to detail return values. However, the folder_path parameter is not explained, and the description does not mention potential error cases or prerequisites. These gaps are minor given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It implicitly covers file_name via 'one specific file', but it does not mention folder_path at all. This leaves one of two parameters unexplained, which is a significant gap in parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Returns structural metadata for one specific file — sheet names, column headers, and each sheet's approx_row_count.' This is specific with a verb ('returns') and resource ('one specific file'), and it distinguishes the tool from siblings by emphasizing structural metadata and its use before filter_sheet.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises 'Use before filter_sheet when you need to confirm the exact column names available in a specific file.' This provides a clear when-to-use scenario and a named alternative. It also notes that the tool makes no API call, implying it is for quick checks rather than live operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

join_sheetsA

Joins two sheets LIVE on key columns and returns the merged rows, with filter_sheet's truncation contract (total_matched, truncated, limit). Omit left_on/right_on to let the server pick keys from the workspace's known relationships — it uses a declared or high-confidence inferred relationship and REFUSES with the candidate list when confidence is low, rather than guessing. The keys actually used and their source are in data.keys. Key matching is normalised (case, whitespace, 45 vs 45.0); null keys never join. join_type: inner, left, right, outer. Colliding column names get _left/_right suffixes. Use this instead of stitching filter_sheet results together yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
left_onNo
right_onNo
join_typeNoinner
left_fileYes
left_sheetYes
right_fileYes
folder_pathNo
right_sheetYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It details the live join behavior, truncation contract, refusal with candidate list when confidence is low, key normalization, null key handling, join types, and column suffixing. This is exceptionally transparent for a data tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph that front-loads the core purpose, then logically covers optional behavior, key handling, and an explicit usage recommendation. Every sentence adds valuable information without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is highly complete given the tool's complexity, covering core behavior, edge cases, and output details. However, it does not explain the 'folder_path' parameter, which is part of the schema. While not critical to the main join functionality, this leaves a minor gap in the overall contextual picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero description coverage, so the description must compensate. It explains the semantics of left_on/right_on, join_type, limit, and the data.keys output field. It even covers edge cases like colliding column names and normalized matching, adding rich meaning beyond the raw parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Joins two sheets LIVE on key columns and returns the merged rows,' naming a specific verb and resource. It also distinguishes itself from sibling tools by explicitly recommending this tool over stitching filter_sheet results together.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes explicit guidance on when to use this tool versus alternatives: 'Use this instead of stitching filter_sheet results together yourself.' It also explains the optional behavior of omitting key parameters and the server's decision-making process, giving the agent clear context for invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookupA

ONE-CALL semantic lookup: finds a single cell value anywhere in the workspace and returns it WITH PROVENANCE (file, sheet, cell address, the matched row) and a confidence signal. Reads only the key column and the matched row — never whole sheets.

Two ways to call it:

  1. Natural language: lookup(query="contracted rate for Titanium Dioxide under the BESTEX contract"). The server resolves the key value against values sampled at scan time and picks the return column lexically. Works best when the query contains a literal value that appears in the data (a client, a material).

  2. Explicit: lookup(key_column="Material", key_value= "Titanium Dioxide", return_column="Contracted Rate"). Use this when the query form reports it could not parse, or for values too rare to be sampled. scope={"file": ..., "sheet": ...} narrows the search.

READ confidence BEFORE using the value: "high" — single row matched; corroborating sheets (if any) agree. provenance.corroborated_by lists them. "ambiguous" — the key matched SEVERAL ROWS. value is null; every row is in alternatives. Never pick one silently. "conflict" — several sheets DISAGREE. value is null; every version is in alternatives. Surface the conflict to the user. found=false — key not found; suggestions holds fuzzy near-misses (retry with exact spelling), or ambiguity explains why routing failed. NEVER present a value from this tool without citing provenance.file, provenance.sheet and provenance.cell.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
scopeNo
key_valueNo
key_columnNo
folder_pathNo
return_columnNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden, and it does so thoroughly: it states that only the key column and matched row are read, never whole sheets; it explains the confidence signals (high/ambiguous/conflict) and their consequences; and it mandates citing provenance. This goes far beyond what the schema alone could convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured and front-loaded with the core behavior, then branches into invocation modes, confidence semantics, and a hard safety rule. The line breaks and indented sections make it scannable, and every paragraph adds necessary information rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the lack of annotations, the description is exceptionally complete: it covers both call styles, scope, confidence interpretation, fallback suggestions, and provenance requirements. An output schema exists for return-value structure, so not restating the full return object is acceptable. The omitted folder_path parameter is minor and does not undermine the overall completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage and bare properties, so the description must compensate. It adds real meaning to query, key_column, key_value, return_column, and scope with examples and semantic roles. The only gap is folder_path, which is never mentioned, and the description does not explicitly state the mutual exclusivity of query versus explicit key parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'ONE-CALL semantic lookup: finds a single cell value anywhere in the workspace and returns it WITH PROVENANCE...' — a specific verb and resource that clearly distinguishes this from generic query or get_cell tools. The two invocation modes (natural language vs explicit keyed) leave no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to choose the natural-language mode versus the explicit keyed mode, including the trigger 'Use this when the query form reports it could not parse, or for values too rare to be sampled.' It also explains how scope narrows the search. However, it does not explicitly compare against sibling tools or state when NOT to use lookup, so it falls just short of full alternative-based guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

queryA

Natural language question with automatic RAG routing. Embeds your question, retrieves candidate sheets by vector similarity, reranks them by lexical overlap with column names and sampled values, fetches the winners LIVE from OneDrive, and returns results. Use for exploratory questions when you do not know which specific file or sheet contains the answer. n_results controls how many sheets are fetched (default 5); min_score drops weak matches. CHECK data.routing: when routing_ambiguous is true the top candidates scored within a tie margin and the choice between them is effectively arbitrary — confirm with inspect_file or ask the user instead of trusting one. Including a distinctive literal value in the question (a client name, a material) strongly improves routing. Response metadata.fetched_at confirms this is live data. For known file/sheet combinations use filter_sheet instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
questionYes
min_scoreNo
n_resultsNo
folder_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and goes beyond a basic statement of function. It discloses the RAG mechanism, that data is fetched live from OneDrive, and importantly warns about non-deterministic behavior when routing_ambiguous is true, where the choice is 'effectively arbitrary.' This level of behavioral disclosure is exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than the ideal but every sentence earns its place: purpose, mechanism, usage, parameters, ambiguity warning, routing tip, and alternative tool. It is front-loaded with the primary purpose and structured clearly, though it could be tightened slightly without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no annotations and a rich output schema, the description covers the essential decision factors: when to use it, how it works, how to interpret routing ambiguity, and how to confirm live data. It also points to the output schema via metadata.fetched_at, making it sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero descriptions, so the description must compensate. It explains n_results (count, default 5) and min_score (threshold for weak matches), and the question parameter is self-evident. However, folder_path is not described at all, leaving its role to inference from its name, which is a small gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states this is a natural-language query tool with automatic RAG routing, describes the full pipeline (embed, retrieve, rerank, fetch live), and explicitly distinguishes it from filter_sheet for known file/sheet combinations. This leaves no ambiguity about what the tool does and when it is the right choice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to use this tool for exploratory questions when the specific file or sheet is unknown, and names filter_sheet as the alternative for known cases. It also provides actionable guidance for ambiguous routing ('confirm with inspect_file or ask the user') and tips for improving routing accuracy.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_workspaceA

Rescans the OneDrive folder and rebuilds the structure index and embeddings. SLOW — makes many API calls. ONLY call when: new .xlsx files have been added to OneDrive, or existing sheet names or column headers have changed. DO NOT call this at session start. DO NOT call this before every query. The workspace is already indexed from setup. Use get_workspace_graph for instant structure access.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full transparency burden. It discloses that the operation is SLOW and makes many API calls, and explains that it rebuilds the index and embeddings. It doesn't detail side effects (e.g., does it overwrite the existing index?), but it provides strong behavioral context and performance warnings.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: first states the action, then the performance warning, then precise call conditions, then explicit what-not-to-dos, and finally the alternative tool. It's front-loaded and highly scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite its short length, the description covers all decision-relevant context: when to use, when not to use, performance implications, and a link to a faster alternative. Since an output schema exists, the description doesn't need to detail return values. This fully equips an agent to decide correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema shows one optional folder_path parameter with no description, and the description never mentions this parameter. Since schema_description_coverage is 0%, the description should clarify whether folder_path is the OneDrive root or a subfolder, but it does not. The only implicit hint is 'the OneDrive folder', leaving the parameter's behavior ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and object ('Rescans the OneDrive folder') and explains the purpose (rebuilds structure index and embeddings). It clearly distinguishes itself from get_workspace_graph by positioning itself as an occasional maintenance operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit, highly actionable usage criteria: only call when new .xlsx files are added or sheet/column names change, and do not call at session start or before every query. It also points to get_workspace_graph as the instant-access alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.3.0
    • First observedaggregate
    • First observedcross_file_aggregate
    • First observedderive
    • First observedfilter_sheet
    • First observedget_cell
    • First observedget_workspace_graph
    • First observedinspect_file
    • First observedjoin_sheets
    • First observedlookup
    • First observedquery
    • First observedscan_workspace

TDQS

A4.7/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct operation: structure discovery, metadata inspection, rescanning, natural-language query, filtered row fetch, grouped aggregation, cross-file totals, joins, signed net calculations, single-cell address reads, and semantic cell lookup. The descriptions include explicit guidance on when to use each tool and warn against alternatives (e.g., aggregate vs. cross_file_aggregate). There is no meaningful overlap or ambiguity between tool purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case: get_workspace_graph, inspect_file, scan_workspace, filter_sheet, join_sheets, get_cell, etc. Short verb-only names like query, aggregate, derive, and lookup are also consistent in style and fit the pattern of using a single verb when the object is implied. No camelCase or mixing of conventions.

Tool Count5/5

With 11 tools, the server is well-scoped for an Excel workspace analysis tool. Each tool serves a clear and necessary purpose, covering discovery, querying, aggregation, joining, and cell-level access. The count is comfortably within the 3-15 range and does not feel bloated or sparse.

Completeness5/5

The tool surface covers the full read/analysis lifecycle: workspace structure discovery (get_workspace_graph, inspect_file, scan_workspace), flexible data retrieval (query, filter_sheet, get_cell, lookup), grouped aggregation (aggregate), multi-file totals (cross_file_aggregate), complex net computations (derive), and joins (join_sheets). There are no obvious missing operations for the apparent purpose of reading and analyzing Excel data.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers