Skip to main content
Glama
csvbox-io

csvbox-mcp-server

Official
by csvbox-io

csvbox-mcp-server

CSVBox용 범용 Model Context Protocol(MCP) 서버입니다. CSVBox 임포터 시트 관리를 MCP 도구로 노출하여 Claude Desktop, Cursor, Windsurf, Roo Code, Cline, VS Code, ChatGPT MCP 등 모든 MCP 호환 클라이언트에서 임포터를 생성, 교체, 패치, 생성, 검증, 스캐폴딩할 수 있습니다.

stdio로 실행되므로 모든 클라이언트에서 동일하게 작동합니다.

도구

도구

용도

API 호출

create_sheet

CSVBox 시트 생성

POST /1.1/sheet

update_sheet

기존 시트 교체

PUT /1.1/sheet/{key}

patch_sheet

시트 부분 업데이트

PATCH /1.1/sheet/{key}

generate_sheet_json

자연어 프롬프트 → 완전한 시트 JSON (LLM 경유)

없음 (LLM 호출)

create_importer_from_prompt

자연어 프롬프트 → 검증 → 생성

POST /1.1/sheet (+ LLM)

generate_import_code

통합 코드 (vanilla-js/react/vue/angular)

없음

generate_sheet_functions

자연어 프롬프트 → 가상 컬럼 / 검증 함수 / 데이터 변환 (LLM 경유)

없음 (LLM 호출)

validate_schema

로컬 스키마 검증

없음

CSVBox에는 현재 GET 또는 LIST 엔드포인트가 없으므로 의도적으로 get_sheet / list_sheet 도구가 없습니다.

또한 두 개의 MCP 프롬프트를 노출합니다:

프롬프트

용도

create_csvbox_sheet

호스트 클라이언트 자체 LLM이 완전한 CSVBox 시트를 생성하도록 합니다 (서버 측 LLM 키 불필요).

csvbox_sheet_functions

호스트 클라이언트 자체 LLM이 가상 컬럼, 검증 함수, 데이터 변환을 작성하도록 합니다 (서버 측 LLM 키 불필요).

프롬프트 → 시트 생성

generate_sheet_json 및 create_importer_from_prompt는 LLM을 사용하여 자유 형식 요청을 완전한 CSVBox 시트(title, sheet_columns, destinations, webhooks, security_settings, steps)로 변환합니다. 실제 데이터 필드만 컬럼이 되며, destinations, webhooks, domains, regions, 파일 업로드 및 단계 설정은 해당 구성 섹션에 배치되고 절대 컬럼으로 변환되지 않습니다. 세 가지 계층이 있습니다:

  1. 서버 LLM — ANTHROPIC_API_KEY 또는 OPENAI_API_KEY가 설정된 경우 서버가 LLM을 직접 호출합니다. MCP Inspector 및 헤드리스 환경에서 작동합니다.

  2. MCP 프롬프트 (create_csvbox_sheet) — 서버 키가 없는 경우 호스트 클라이언트(Cursor, Claude Desktop, Cline)가 자체 모델로 생성을 실행한 다음 validate_schema 및 create_sheet를 호출합니다. 무료입니다.

  3. 구성 없음 — generate_sheet_json은 MCP 프롬프트를 가리키는 구조화된 "LLM 공급자 미구성" 오류를 반환하고, create_importer_from_prompt는 CSVBox API를 호출하지 않습니다. 정규식 폴백은 없습니다.

카테고리 / 모듈 확장

생성기는 프롬프트에서 자동으로 선택되는 두 가지 모드 중 하나로 실행됩니다:

  • 추출 (기본값) — 프롬프트가 구체적인 필드를 지정합니다 (예: "컬럼 name, email, phone"). 해당 필드만 컬럼이 되며, 그 외에는 아무것도 생성되지 않습니다.

  • 확장 — 프롬프트가 비즈니스 모듈 / 카테고리를 목록으로 지정하거나 (예: "모듈: 회사 정보, 공급업체, 급여, 인보이스"), 포괄적/상세 스키마를 요청하거나, 컬럼 수를 요청합니다 ("최소 100개 컬럼"). 각 지정 모듈은 여러 개의 현실적이고 접두사가 붙은 올바른 유형의 컬럼으로 확장됩니다 (예: 공급업체 → supplier_id, supplier_name, supplier_gstin, supplier_email, …). 명시적 최소 개수가 존중되며 모든 column_name은 전역적으로 고유합니다.

데이터 유형과 검증은 필드 이름과 요청된 유형에서 추론됩니다:

요청 / 암시

컬럼 type

검증기

고정 옵션이 있는 드롭다운 / 상태 / 카테고리

list

values: [...] 후보 옵션

백분율 / 퍼센트

number

min_value: 0, max_value: 100

양수 숫자 (수량, 개수, 재고, 비용, 나이)

number

min_value: 0

ID / 코드 / 참조 번호

text

—

이메일

email

—

전화 / 휴대폰

phone_number

—

URL / 웹사이트

url

—

가격 / 비용 / 금액 / 급여

currency

—

날짜 필드

date

format: "YYYY-MM-DD"

불리언 / is_* / 활성

boolean

—

GST / GSTIN / 세금 ID

regex

GSTIN 패턴

PIN 코드 / 우편번호 (인도)

regex

^[1-9][0-9]{5}$

대규모 스키마: 기본 모델(claude-haiku-4-5, gpt-4o-mini)은 저렴하지만 LLM_MODEL(예: claude-sonnet-4-6)로 더 강력한 모델을 재정의하면 100개 이상의 컬럼 스키마가 눈에 띄게 더 좋아집니다. 출력 상한은 큰 시트에 맞게 상향 조정됩니다. 요청이 여전히 너무 크면 응답에 TRUNCATED 플래그가 지정되고(구문 분석 오류가 아닌 별개의 결과) CSVBox API는 호출되지 않습니다 — 컬럼 수 / 모듈을 줄이거나 더 큰 출력 예산의 모델을 사용하여 재시도하세요.

Related MCP server: mcp-tabular

함수 컬렉션 (가상 컬럼, 검증 함수, 데이터 변환)

여섯 가지 시트 속성 외에도 CSVBox Sheet API는 항목에 CSVBox가 가져오기 중에 실행하는 js_code 문자열을 포함하는 세 가지 컬렉션을 허용합니다:

컬렉션

식별자

최대

js_code 필수 조건…

virtual_columns

column_name

20

계산된 셀 값을 반환

validation_functions

function_name

10

오류 문자열 배열 반환 ([] = 유효)

data_transforms

transform_name

10

csvbox 객체를 변경하고 반환

js_code 내부에서 csvbox 객체는 row, column, virtual, user, import, environment를 노출합니다. 두 접근자는 상호 교환할 수 없습니다 — 가상 컬럼은 행 단위이며 csvbox.row.<name>(스칼라)을 사용하는 반면, "column" 범위 함수는 csvbox.column.<name>(배열)을 통해 전체 컬럼을 봅니다.

공유 선택 필드: scope (column | row; 가상 컬럼에는 없음), run_at (before_validation | after_validation; 데이터 변환 전용), columns / dynamic_columns, active, dependencies, _delete (PATCH 전용).

작성 방법

// generate_sheet_functions  (requires ANTHROPIC_API_KEY or OPENAI_API_KEY)
{
  "prompt": "add a virtual column joining first and last name, and check every email contains an @",
  "sheet": { "title": "Customers", "sheet_columns": [ ... ] }
}

{ "virtual_columns": [...], "validation_functions": [...], "source": ..., "validation": {...} }를 반환합니다. 요청이 암시하지 않는 컬렉션은 생략되며, 빈 배열로 반환되지 않습니다.

이 도구는 CSVBox API를 호출하지 않습니다. 생성된 js_code를 읽은 다음 patch_sheet로 직접 적용하세요. 모델이 실제 컬럼 이름을 참조하고 검증기가 해당 참조를 확인할 수 있도록 sheet를 전달하세요 — CSVBox에는 읽기 엔드포인트가 없으므로 인라인으로 제공해야 합니다. LLM 키가 없으면 csvbox_sheet_functions MCP 프롬프트를 대신 사용하세요.

PUT vs PATCH — 적용 전에 읽어보세요

update_sheet (PUT)

patch_sheet (PATCH)

전송하는 컬렉션

권위적 — 이름이 지정되지 않은 기존 항목은 삭제됨

병합됨 — 이름이 지정되지 않은 항목은 그대로 유지

"virtual_columns": []

20개 모두 삭제

no-op

키 생략

변경 없음

변경 없음

_delete: true

유효하지 않음

해당 항목 제거 (다른 모든 필드는 무시됨)

생성된 함수를 적용하려면 patch_sheet를 사용하세요. 먼저 해당 동사로 검증하세요:

// validate_schema
{ "sheet": { "data_transforms": [ ... ] }, "mode": "patch" }

mode는 create(기본값), put 또는 patch입니다. 함수 컬렉션에만 영향을 미칩니다 — put에서는 빈 배열이 경고가 아닌 하드 오류이며, _delete는 patch 외부에서 거부됩니다.

종속성

항목은 최대 5개의 타사 스크립트를 로드할 수 있습니다:

{ "url": "https://cdn.jsdelivr.net/npm/dayjs@1.11.10/dayjs.min.js",
  "globals": ["dayjs"],
  "integrity": "sha384-..." }

cdn.jsdelivr.net, unpkg.com, cdnjs.cloudflare.com만 허용됩니다. https만, .js/.mjs 경로, 쿼리 문자열, 프래그먼트, userinfo 또는 포트 없음.

보안. 이 서버는 js_code를 절대 실행하지 않습니다 — 여기서는 불투명한 문자열일 뿐입니다. 생성된 JavaScript는 검토되지 않은 모델 출력이므로 라이브 임포터에 PATCH하기 전에 읽어보세요. integrity 다이제스트가 없는 종속성은 언제든지 고객의 눈에 띄지 않게 변경될 수 있습니다. validate_schema는 누락된 경우 경고합니다.

전체 페이로드는 docs/sheet-functions-example.json을 참조하세요.

설치

npm install @csvbox/mcp-server

또는 소스에서 빌드:

git clone <this-repo> csvbox-mcp-server
cd csvbox-mcp-server
npm install
npm run build

이렇게 하면 MCP 클라이언트가 실행하는 진입점인 dist/index.js가 생성됩니다.

환경 변수

.env.example을 .env로 복사하고 CSVBox 자격 증명을 입력하세요:

CSVBOX_API_KEY=your_api_key
CSVBOX_API_SECRET=your_api_secret

CSVBox 자격 증명은 API 기반 도구(create_sheet, update_sheet, patch_sheet, create_importer_from_prompt)에만 필요합니다. validate_schema 및 generate_import_code는 자격 증명 없이 작동합니다.

인증 헤더 참고: 클라이언트는 x-csvbox-api-key 및 x-csvbox-secret-api-key를 전송합니다(CSVBox 참조 페이로드와 일치). 계정에서 다른 헤더 이름을 사용하는 경우 src/services/csvbox-api.ts에 상수로 정의되어 있습니다.

LLM 공급자 (프롬프트 → 시트 생성용)

generate_sheet_json 및 create_importer_from_prompt에는 LLM이 필요합니다. 다음 중 하나를 설정하세요:

ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...

공급자는 자동 감지됩니다:

조건

제공자(Provider)

기본 모델

LLM_PROVIDER=anthropic (및 해당 키 설정)

Anthropic

claude-haiku-4-5

LLM_PROVIDER=openai (및 해당 키 설정)

OpenAI

gpt-4o-mini

ANTHROPIC_API_KEY 설정됨 (LLM_PROVIDER 없음)

Anthropic

claude-haiku-4-5

OPENAI_API_KEY 설정됨 (LLM_PROVIDER 없음)

OpenAI

gpt-4o-mini

두 키 모두 설정되지 않음

없음 — 도구는 create_csvbox_sheet MCP 프롬프트를 가리키는 오류를 반환합니다

—

두 키가 모두 있을 때 LLM_PROVIDER가 모호성을 해소합니다. LLM_MODEL은 선택된 제공자에 관계없이 모델을 재정의합니다. 대규모 카테고리/모듈 스키마(100개 이상의 열)의 경우 LLM_MODEL을 더 강력한 모델(예: claude-sonnet-4-6)로 설정하세요 — 카테고리 / 모듈 확장을 참조하세요.

MCP Inspector: 서버-LLM 경로를 사용하려면 Inspector의 환경 변수 패널에 LLM 키를 설정하세요. Inspector에는 자체 호스트 LLM이 없으므로 create_csvbox_sheet 프롬프트를 렌더링할 수는 있지만 실행할 수는 없습니다 — 키 없는 경로는 모델이 있는 클라이언트(Cursor, Claude Desktop, Cline)를 사용하세요.

로컬에서 실행하기

# After building:
npm start

# Or run the built file directly:
node dist/index.js

서버는 stdio를 통해 MCP를 사용하며 csvbox-mcp-server running on stdio를 stderr에 기록합니다(stdout은 프로토콜용으로 예약됨).

클라이언트 구성

배포된 설치의 경우 npx와 함께 npm 패키지를 사용하세요. env 블록에 CSVBOX_API_KEY / CSVBOX_API_SECRET을 설정하세요.

참고: npm 패키지는 @csvbox/mcp-server이고 실행 파일은 csvbox-mcp-server입니다.

Claude Desktop

Claude Desktop MCP 구성에 다음을 추가하세요:

{
  "mcpServers": {
    "csvbox": {
      "command": "npx",
      "args": [
        "-y",
        "--package=@csvbox/mcp-server",
        "csvbox-mcp-server"
      ],
      "env": {
        "CSVBOX_API_KEY": "your_api_key",
        "CSVBOX_API_SECRET": "your_api_secret"
      }
    }
  }
}

Cursor

~/.cursor/mcp.json(전역) 또는 .cursor/mcp.json(프로젝트별)을 편집하세요:

{
  "mcpServers": {
    "csvbox": {
      "command": "npx",
      "args": [
        "-y",
        "--package=@csvbox/mcp-server",
        "csvbox-mcp-server"
      ],
      "env": {
        "CSVBOX_API_KEY": "your_api_key",
        "CSVBOX_API_SECRET": "your_api_secret"
      }
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json을 편집하세요:

{
  "mcpServers": {
    "csvbox": {
      "command": "npx",
      "args": [
        "-y",
        "--package=@csvbox/mcp-server",
        "csvbox-mcp-server"
      ],
      "env": {
        "CSVBOX_API_KEY": "your_api_key",
        "CSVBOX_API_SECRET": "your_api_secret"
      }
    }
  }
}

Roo Code

Roo Code MCP 설정(mcp_settings.json)에서:

{
  "mcpServers": {
    "csvbox": {
      "command": "npx",
      "args": [
        "-y",
        "--package=@csvbox/mcp-server",
        "csvbox-mcp-server"
      ],
      "env": {
        "CSVBOX_API_KEY": "your_api_key",
        "CSVBOX_API_SECRET": "your_api_secret"
      }
    }
  }
}

Cline

Cline MCP 설정(cline_mcp_settings.json)에서:

{
  "mcpServers": {
    "csvbox": {
      "command": "npx",
      "args": [
        "-y",
        "--package=@csvbox/mcp-server",
        "csvbox-mcp-server"
      ],
      "env": {
        "CSVBOX_API_KEY": "your_api_key",
        "CSVBOX_API_SECRET": "your_api_secret"
      }
    }
  }
}

VS Code MCP

.vscode/mcp.json(또는 전역 mcp.json)에 추가하세요:

{
  "servers": {
    "csvbox": {
      "command": "npx",
      "args": [
        "-y",
        "--package=@csvbox/mcp-server",
        "csvbox-mcp-server"
      ],
      "env": {
        "CSVBOX_API_KEY": "your_api_key",
        "CSVBOX_API_SECRET": "your_api_secret"
      }
    }
  }
}

도구 호출 예시

프롬프트에서 전체 시트 생성하기 (LLM, CSVBox API 호출 없음):

// generate_sheet_json  (requires ANTHROPIC_API_KEY or OPENAI_API_KEY)
{ "prompt": "Create employee importer with name, email, salary, joining date; destination as testapi; allow only xlsx files" }

{ "sheet": { "title": ..., "sheet_columns": [...], "destinations": [...], "steps": {...} }, "source": "llm:anthropic:claude-haiku-4-5", "validation": { "valid": true, ... } }를 반환합니다. 데이터 필드는 열이 됩니다(salary → currency, joining date → date). 대상(destination)과 xlsx 설정은 열이 아닌 destinations / steps로 이동합니다. LLM 키가 없으면 create_csvbox_sheet 프롬프트를 가리키는 오류를 반환합니다.

전송 전에 스키마 검증하기:

// validate_schema
{ "sheet": { "title": "Customers", "sheet_columns": [
  { "column_name": "email", "display_label": "Email", "type": "email" }
] } }

{ "valid": true, "errors": [], "warnings": [ ... ] }를 반환합니다.

시트 생성하기:

// create_sheet
{ "sheet": { "title": "Customer Import", "sheet_columns": [
  { "column_name": "name", "display_label": "Name", "type": "text" },
  { "column_name": "email", "display_label": "Email", "type": "email" }
] } }

한 단계로 생성 + 생성하기:

// create_importer_from_prompt  (requires an LLM key + CSVBox credentials)
{ "prompt": "Create customer importer with name, email, phone; allow for example.com" }

{ "generated_schema": { ... }, "source": ..., "validation": { ... }, "api_response": { ... } }를 반환합니다. LLM 제공자가 구성되지 않았거나 생성된 스키마가 검증에 실패하면 API를 호출하지 않고 중단합니다.

시트 교체하기:

// update_sheet
{ "sheet_license_key": "abc123", "sheet": { "title": "Updated", "sheet_columns": [ ... ] } }

보내는 모든 컬렉션에 대해 파괴적입니다 — PUT vs PATCH를 참조하세요.

시트 패치하기:

// patch_sheet
{ "sheet_license_key": "abc123", "changes": { "title": "New Title" } }

나머지 부분을 건드리지 않고 함수 하나만 제거하기:

// patch_sheet
{ "sheet_license_key": "abc123",
  "changes": { "virtual_columns": [ { "column_name": "full_name", "_delete": true } ] } }

통합 코드 생성하기:

// generate_import_code
{ "framework": "react" }

지원되는 열 유형

text, number, email, date, time, boolean, regex, ip, url, credit_card, phone_number, currency, list, dependent_list, dynamic_list, dependent_dynamic_list, multiselect_list, multiselect_dynamic_list.

개발

npm run build   # compile TypeScript → dist/
npm start       # run the built server
npm run lint    # type-check without emitting
npm test        # compile and run the unit suite (alias: npm run test:unit)

테스트

npm test는 src/tests/를 컴파일하고 Node의 내장 테스트 러너로 실행합니다 — 테스트 프레임워크도, 모킹 라이브러리도 없습니다.

이 테스트 스위트는 격리(hermetic) 되어 있습니다. 외부 호스트에 절대 접촉하지 않고, 사용자의 환경에 있는 CSVBOX_API_* / ANTHROPIC_API_KEY / OPENAI_API_KEY를 절대 읽지 않으며, 실제 CSVBox 계정에 절대 접촉하지 않으므로 자격 증명이 구성되어 있든 없든 동일하게 통과합니다. HTTP는 axios 어댑터에서 가로채고, LLM은 스크립트로 작성된 가짜(fake)입니다. 실제 요청 인코딩이 필요한 하나의 테스트는 127.0.0.1에서 임시 리스너를 시작한 후 닫습니다. 환경 변수를 읽는 테스트는 필요한 값을 명시적으로 설정하고 이전 값을 복원합니다.

E2E 테스트

npm run test:e2e         # run the Playwright suite
npm run test:e2e:report  # open the HTML report from the last run

스펙은 e2e/에 있으며 playwright.config.ts로 구성됩니다. 단위 테스트 스위트와 마찬가지로 이 스위트도 격리(hermetic) 되어 있습니다. 루프백에서 모의 CSVBox 및 LLM 서버(e2e/support/mock-csvbox-server.ts, e2e/support/mock-llm-server.ts)를 시작하고, 실제 빌드된 서버(dist/index.js)를 MCP Inspector를 통해 해당 모의 서버를 가리키는 가짜 자격 증명으로 구동합니다 — 실제 CSVBox 계정이나 LLM 제공자에 절대 접촉하지 않으며, 사용자의 .env를 절대 읽지 않습니다. 별도의 자격 증명 없는 Inspector 인스턴스가 "자격 증명 누락" 오류 경로를 다룹니다. 먼저 npm run build가 필요합니다(test:e2e webServer 항목이 자동으로 빌드함).

서버 임베딩

createServer()는 엔트리 모듈에서 내보내집니다. 모든 도구와 프롬프트를 등록하고 전송(transport)을 연결하지 않은 McpServer를 반환하므로, 사용자 자신의 전송에 연결할 수 있습니다:

import { createServer } from "@csvbox/mcp-server";

const server = createServer();
await server.connect(myTransport);

모듈을 가져와도 아무것도 시작되지 않습니다. stdio 서버는 dist/index.js가 직접 실행될 때만 실행됩니다.

라이선스

MIT

Available Tools

9 tools
create_importer_from_promptCreate Importer From PromptA

Generate a COMPLETE CSVBox sheet from a natural-language prompt via a configured LLM, validate it locally, then create it via POST /1.1/sheet. Returns { generated_schema, source, validation, api_response }. Aborts (no API call) if no LLM provider is configured or if validation fails. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY plus CSVBox credentials.

NameRequiredDescriptionDefault
promptYesNatural-language description of the importer, e.g. "Create customer importer with columns name, email, phone; allow for example.com".

TDQS

A4.4/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden. It discloses the full sequence (generate, validate locally, create via POST), the return object, the abort condition (no LLM provider or validation failure), and the required credentials (ANTHROPIC_API_KEY or OPENAI_API_KEY plus CSVBox credentials). This is comprehensive and honest about side effects (it creates a sheet).

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 deliver the purpose, flow, return value, abort conditions, and required credentials without waste. The main action is front-loaded, followed by essential caveats. Every sentence earns its place.

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?

For a tool with one parameter, no output schema, and no annotations, the description covers the essential decision points: what it does, what it returns, when it aborts, and what credentials are needed. Missing is any detail on the validation failure behavior beyond aborting, and there is no example output or error handling guidance, but these are not critical for invoking the tool correctly.

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 description coverage is 100%, and the description for 'prompt' in the schema already explains it as a natural-language description of the importer. The tool description adds no extra detail about how the prompt is used, format expectations, or examples beyond what the schema provides. Baseline 3 is appropriate when schema fully documents the 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 ('Generate ... then create') and a clear resource (CSVBox sheet via POST /1.1/sheet). It is distinct from siblings like create_sheet (which likely creates without generation) and generate_sheet_json (which likely generates without creation). The flow is explicit and unambiguous.

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 clearly implies use when you have a natural-language prompt and want a complete, validated sheet. It notes that an LLM provider must be configured and that it aborts if not, which hints at alternative workflows, but it does not explicitly name alternatives or state when to prefer create_sheet or generate_sheet_json over this tool. The context is clear but exclusions are not explicit.

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

create_sheetCreate CSVBox SheetC

Create a new CSVBox sheet via POST /1.1/sheet. Input: { sheet }. Returns the API response.

NameRequiredDescriptionDefault
sheetYesThe full CSVBox sheet object to create.

TDQS

C2.8/5.0
Behavior2/5

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

There are no annotations, so the description bears full responsibility for disclosing behavior. It only states that it returns the API response, but gives no detail on side effects, error handling, idempotency, or what happens on duplicate creation. For a creation tool this is a significant gap.

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

Conciseness3/5

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

The description is brief and front-loaded with the action, which is good. However, its brevity comes at the cost of essential context, so it is under-specified rather than appropriately concise. A few extra sentences clarifying behavior and usage would be justified.

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

Completeness2/5

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

The tool has no output schema, so the description should clarify what the response contains, but it only says 'Returns the API response' without specifics. The nested 'sheet' object is intentionally open-ended, but the description doesn't hint at required fields or validation. Given the simplicity of the tool and sibling complexity, the description is incomplete.

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?

The input schema already provides full coverage of the sole parameter, describing the 'sheet' as 'The full CSVBox sheet object to create.' The tool description adds nothing beyond restating the parameter name and format. Since coverage is 100%, the description meets the baseline but adds no extra value.

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

Purpose4/5

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

The description states a clear action: creating a new CSVBox sheet via a POST request, and identifies the resource explicitly. It distinguishes from siblings like update_sheet and patch_sheet by indicating creation, though it doesn't explicitly call out the distinction. The purpose is unambiguous.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as update_sheet or patch_sheet. It does not mention any prerequisites, when creation is appropriate, or when another sibling might be better. An agent would have to infer usage from the tool name alone.

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

generate_import_codeGenerate CSVBox Integration CodeA

Generate complete CSVBox importer integration code for a framework (vanilla-js, react, vuejs2 [Vue 2], vuejs3 [Vue 3], angular [Angular 8-13], angular2 [Angular 14+]). Input: { framework }. Replace the license key placeholder with your sheet's license key.

NameRequiredDescriptionDefault
frameworkYesTarget framework: vanilla-js | react | vuejs2 (Vue 2) | vuejs3 (Vue 3) | angular (Angular 8-13) | angular2 (Angular 14+).

TDQS

A3.8/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions replacing the license key placeholder, which is a useful note, but it does not state whether the tool has side effects, what the output format is, or any prerequisites. The agent is left guessing about the return value and if any state changes occur. This is a notable gap for a tool that generates code.

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, information-dense sentence. It front-loads the main action, immediately lists the supported frameworks with version clarifications, and includes the only crucial auxiliary instruction (replacing the license key placeholder). There is zero 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?

For a one-parameter tool with no output schema, the description covers the essential information: what it does, the input, and a critical post-processing step. While it doesn't explicitly describe the return format, the term 'integration code' makes it obvious. Minor omission: it doesn't state whether the code is returned as a string, file, or other, but this is not critical for invoking the tool correctly.

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 description coverage is 100%, so the parameter `framework` is already fully documented via enum and description. The tool description merely repeats 'Input: { framework }' without adding new parameter-specific details. The license key placeholder note concerns the output, not the input, so it doesn't enhance parameter understanding. Baseline 3 is appropriate.

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 clear action ('generate complete CSVBox importer integration code'), a specific resource (CSVBox importer integration), and the parameter (framework). It lists all supported values, distinguishing it from sibling tools like generate_sheet_json or create_sheet. It is unambiguous.

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 is self-contained and clearly implies when to use it: whenever you need integration code for a listed framework. It does not explicitly mention alternatives or exclusions, but the context is clear enough that an agent can infer appropriate usage without confusion.

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

generate_sheet_functionsGenerate CSVBox Sheet FunctionsA

Author CSVBox virtual_columns, validation_functions, and data_transforms from a natural-language prompt using a configured LLM. Does NOT call the CSVBox API — it returns JSON so you can REVIEW the generated JavaScript before applying it with patch_sheet. Collections the request does not imply are omitted, never returned as empty arrays. Returns { virtual_columns?, validation_functions?, data_transforms?, source, validation }. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY; without one it returns an error pointing to the csvbox_sheet_functions MCP prompt. Input: { prompt, sheet? }.

NameRequiredDescriptionDefault
sheetNoThe existing sheet the functions will be applied to. Supplying it lets the model reference real column names and lets validation check those references. CSVBox exposes no read endpoint, so this must be passed inline.
promptYesNatural-language description of the functions to author, e.g. "add a virtual column joining first and last name, and validate that every email contains an @".

TDQS

A4.5/5.0
Behavior5/5

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

No annotations are present, so the description carries the full burden. It discloses that the tool does not call the API, omits unmentioned collections rather than returning empty arrays, returns a specific JSON shape, requires ANTHROPIC_API_KEY or OPENAI_API_KEY, and names the error fallback. This is unusually transparent.

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 dense but every sentence earns its place: purpose, non-API behavior, output contract, authentication requirement, error handling, and input shape. The structure front-loads the main purpose before moving to constraints and fallbacks.

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?

Even though there is no output schema, the description provides the return contract, omission behavior, auth prerequisites, and the downstream patch_sheet step. With only two parameters and one required, nothing essential is left for the agent to infer.

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 description coverage is 100%, so the schema already documents both parameters well. The description only restates the input shape as '{ prompt, sheet? }' and adds no new meaning beyond what the schema's per-parameter descriptions provide. Baseline 3 is appropriate.

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?

Uses a specific verb and resource ('Author CSVBox virtual_columns, validation_functions, and data_transforms') and clearly states it returns reviewable JSON rather than calling the CSVBox API. This distinguishes it from patch_sheet, create_sheet, and generate_import_code even before reading schemas.

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?

Establishes a clear workflow: generate functions, review the returned JSON, then apply with patch_sheet. It also says the tool does not call the API and warns about missing API keys, but it does not explicitly contrast itself with generation siblings like generate_sheet_json or generate_import_code.

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

generate_sheet_jsonGenerate CSVBox Sheet JSONA

Generate a COMPLETE CSVBox sheet (title, sheet_columns, destinations, webhooks, security_settings, steps) from a natural-language prompt using a configured LLM. Does NOT call the CSVBox API. Returns { sheet, source, validation }. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY; without one it returns an error pointing to the create_csvbox_sheet MCP prompt. Input: { prompt }.

NameRequiredDescriptionDefault
promptYesNatural-language description of the importer, e.g. "Create employee importer with columns name, email, salary, joining date; destination as testapi; allow only xlsx files".

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses several key behaviors: no API call, key requirements, error fallback, and the return shape { sheet, source, validation }. However, it does not describe whether the call is synchronous, how long it may take, token/rate-limit considerations, or the meaning of the returned 'source' and 'validation' fields — moderate disclosure but not rich.

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?

Three sentences, all load-bearing: the exclusions ('Does NOT call...') and key requirement ('Requires ANTHROPIC_API_KEY...') are front-loaded before the input spec. The use of ALL-CAPS for emphasis is a minor stylistic distraction, but overall it is compact with no wasted sentences.

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?

For a single-input-parameter tool with no output schema and no annotations, the description covers the essentials: what it returns, its prerequisites, a common failure mode, and what the prompt parameter expects. The only notable gap is the absence of a minimal output/JSON example structure, which would help the agent gauge the result format.

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?

The single parameter prompt is fully documented in the schema (100% coverage, with a concrete example). The description adds only 'natural-language prompt' context, which marginally reinforces but does not extend the schema. Baseline 3 is appropriate where the schema already carries the parameter meaning.

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

Purpose4/5

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

The description uses a specific verb+resource ('Generate a COMPLETE CSVBox sheet') and enumerates the exact fields produced (title, sheet_columns, destinations, webhooks, security_settings, steps). It distinguishes itself from the API-calling siblings by explicitly stating 'Does NOT call the CSVBox API,' which is the key differentiator among the sibling list.

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 states the enabling condition (ANTHROPIC_API_KEY or OPENAI_API_KEY required) and the failure behavior when absent (returns an error pointing to create_csvbox_sheet). It clearly implies this tool generates JSON only and is the predecessor to an API-calling tool, though it doesn't name an explicit 'when not to use' sibling or a direct comparison to create_importer_from_prompt.

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

patch_sheetPatch CSVBox SheetA

Partially update a CSVBox sheet via PATCH /1.1/sheet/{sheet_license_key}. Sends only the changes object. Input: { sheet_license_key, changes }. Returns the API response. PATCH MERGES: only the items you list are touched and nothing is deleted implicitly, so an empty array is a no-op. Items in virtual_columns, validation_functions and data_transforms are matched by column_name / function_name / transform_name respectively — an unmatched name creates a new item. To remove one, send it with _delete: true; every other field on a _delete item is ignored, including js_code. This is the safe verb for applying generated functions. Run validate_schema with mode 'patch' first.

NameRequiredDescriptionDefault
changesYesOnly the partial changes to apply to the sheet.
sheet_license_keyYesThe license key of the sheet to patch.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries full burden and discloses substantial behavior: PATCH merges, only listed items are touched, empty array is a no-op, matching by names with unmatched creating new items, _delete: true for removal, and that other fields on a _delete item are ignored. It also mentions the return is 'the API response.' This exceeds typical descriptions, though it omits error handling or permission nuances.

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 each sentence earns its place: purpose, input/output, merge semantics, matching rules, deletion, and usage advice. It's front-loaded with the purpose, and while it's longer than average, the complexity of the operation justifies the length. No wasted words.

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?

Given the complexity (nested objects, merge behavior, deletion), the description covers all critical aspects: how partial updates work, how to target items, how to delete, and the prerequisite validation step. It returns the API response but doesn't detail error cases, which is acceptable without an output schema. The description is sufficient for an agent to call 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?

Schema coverage is 100%, so baseline is 3. The description adds significant meaning to the 'changes' object by explaining the internal structure (virtual_columns, validation_functions, data_transforms), how items are matched by names, and the _delete flag semantics. This goes well beyond the schema's minimal 'Only the partial changes to apply to the sheet.'

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?

States a specific verb ('Partially update'), resource ('CSVBox sheet'), and the HTTP method (PATCH /1.1/sheet/{sheet_license_key}'). It clearly differentiates from sibling tools like update_sheet by emphasizing 'partial' and 'PATCH', and from create_sheet by 'update'. The purpose is unambiguous.

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?

Provides clear context: 'This is the safe verb for applying generated functions' and instructs to 'Run validate_schema with mode patch first.' While it doesn't explicitly name update_sheet as an alternative, the 'partial' vs full update distinction and the 'safe verb' guidance effectively imply when to prefer this tool over others.

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

submit_fileSubmit File via CSVBox REST File APIA

Submit a file for import via POST /1.1/file. Provide exactly one of public_file_url (JSON submission) or file_base64 + file_name (multipart direct upload — file_base64 is decoded server-side and sent to CSVBox as true binary multipart content, never as a base64 string). Input: { sheet_license_key, public_file_url? | (file_base64?, file_name?), file_sheet_name?, user?, options?, dynamic_columns? }. Returns the API response.

NameRequiredDescriptionDefault
userNoCustom user reference object attached to the import.
optionsNoImport options: has_header (0/1), max_rows, auto_map.
file_nameNoFile name for the direct upload. Required with file_base64.
file_base64NoBase64-encoded file content for direct upload. This is an MCP-transport-only encoding: the server decodes it into raw bytes and sends CSVBox a true multipart/form-data 'file' part, never a base64 string. Mutually exclusive with public_file_url. Requires file_name. Prefer public_file_url for large files.
dynamic_columnsNoDynamic column definitions with validators.
file_sheet_nameNoWorksheet name to import, for multi-tab files.
public_file_urlNoPublic URL of the file to import. Mutually exclusive with file_base64.
sheet_license_keyYesThe license key of the sheet to import into.

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 burden and discloses key behavior: it explains the server-side decoding of file_base64 into true binary multipart content, the alternative JSON path, and that it returns the API response. It does not mention authentication or side effects, but the mutation is implied by 'submit for import' and the transport detail goes beyond basic expectations.

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 two sentences with no filler. It front-loads the endpoint and the primary decision (which submission mode), then presents the full input structure compactly. Every clause contributes information.

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?

For a tool with 8 parameters, nested objects, and two mutually exclusive alternatives, the description is thorough: it maps the parameter combos, explains the encoding nuance, and notes the return value. It omits authentication prerequisites and error handling, but those are commonly left to the API docs and the schema already covers required fields.

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 100%, but the description adds real value beyond the schema by showing the exact input structure with alternatives and grouping, clarifying the mutual exclusivity already hinted in properties, and adding the file-size preference. This is more than the baseline 3 would require.

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 action (submit a file for import), the resource (via POST /1.1/file), and the two distinct submission modes (JSON vs multipart). It distinguishes this tool from siblings like create_sheet or generate_import_code by focusing on the file submission action.

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 explicitly lays out the mutually exclusive parameter combinations ('Provide exactly one of...') and even adds a practical preference ('Prefer public_file_url for large files'). It does not explicitly contrast with sibling tools, but the sibling set is clearly different in function, so this gap is minor.

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

update_sheetUpdate (Replace) CSVBox SheetA

Replace an existing CSVBox sheet via PUT /1.1/sheet/{sheet_license_key}. Input: { sheet_license_key, sheet }. Returns the API response. DESTRUCTIVE: PUT is authoritative for every collection it sends — items listed are created or updated in place, and any existing item the array does not name is DELETED. This applies to virtual_columns, validation_functions and data_transforms: sending an empty array DELETES ALL of that collection's items, while OMITTING the key leaves them untouched. _delete is not valid here; use patch_sheet to remove a single item. Run validate_schema with mode 'put' first to catch a destructive body.

NameRequiredDescriptionDefault
sheetYesThe full replacement CSVBox sheet object.
sheet_license_keyYesThe license key of the sheet to replace.

TDQS

A4.6/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden — and it excels. It discloses the destructive PUT semantics (unnamed items are DELETED), which collections are affected (virtual_columns, validation_functions, data_transforms), the critical empty-array-deletes vs omit-preserves distinction, and invalidates `_delete`. The safety warnings cover all dangerous behavior an agent needs to avoid.

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 long, but every sentence earns its place for a destructive operation — the PUT-authoritative semantics, collection scope, and empty-vs-omit warning are all essential safety information. Core purpose is front-loaded before the behavioral warnings. Slightly verbose, justified by the risk profile.

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 destructive mutation with zero annotations and no output schema, this is complete. It covers what gets destroyed, the collection semantics, the invalid `_delete`, and pre-validates via validate_schema. Return value is minimally stated ('Returns the API response'), which is acceptable given no output schema exists. Nothing an agent needs to call this safely is missing.

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 100%, so both parameters (sheet_license_key, sheet) are already documented inline, warranting baseline 3. The description adds some value by clarifying the destructive behavior of collections inside the `sheet` object, but it doesn't add syntax or format details beyond the schema's 'full replacement CSVBox sheet object'.

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?

States a specific verb ('Replace'), resource ('an existing CSVBox sheet'), and HTTP method (PUT /1.1/sheet/{sheet_license_key}'). The title reinforces the replace-vs-patch distinction, and the description names patch_sheet for partial updates, making it distinguishable from siblings without opening schemas.

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?

Explicitly routes to alternatives with conditions: 'use patch_sheet to remove a single item', declares `_delete` is not valid here, and instructs 'Run validate_schema with mode put first'. This gives clear when-to/when-not guidance and names the safety pre-check, which is ideal for a destructive tool.

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

validate_schemaValidate CSVBox SchemaA

Validate a CSVBox sheet schema locally (no API call). Requires a non-empty title; sheet_columns is optional (absent passes, empty yields a warning). When columns are present, checks for missing column_name/display_label/type, unsupported types, duplicate names, duplicate positions, and invalid dependent column references. Also checks virtual_columns, validation_functions, and data_transforms: per-sheet caps, duplicate and colliding names, missing or oversized js_code, scope/run_at enums, column references against sheet_columns, and dependency URLs (https, allowed CDN hosts, .js/.mjs, integrity digest). Pass mode ('create' | 'put' | 'patch', default 'create') so empty-array and _delete rules match the verb you are about to use. Returns { valid, errors, warnings }.

NameRequiredDescriptionDefault
modeNoWhich write verb this payload is headed for. "create" (default) for POST, "put" for a full replace, "patch" for a partial update. Affects only the function collections: an empty array is an error under "put" (it deletes every item); `_delete` is fully valid under "patch", redundant (warning only) under "put", and an error under "create".
sheetYesThe CSVBox sheet object to validate.

TDQS

A4.8/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 of behavioral disclosure. It thoroughly describes what the tool does: it performs a local validation, enumerates all the checks (missing fields, duplicates, types, references, dependency rules), explains the mode-dependent behavior (empty array vs _delete), and states the return shape { valid, errors, warnings }. This is exceptionally transparent and leaves no ambiguity about side effects or 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 a single, information-dense paragraph that front-loads the core purpose and then systematically covers prerequisites, specific checks, mode handling, and return format. Every sentence adds value; there is no filler or repetition. The structure is logical and allows an agent to quickly grasp the tool's behavior.

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 (many validation rules), the minimal schema, and absence of annotations, the description is remarkably complete. It covers all relevant inputs (sheet, mode), the exact validation logic, the behavior under different modes, and the output structure. There is no critical information missing for an agent to call this tool correctly.

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?

Although the schema descriptions cover both parameters, the tool description adds significant meaning. For 'mode', it explains the impact of each enum value on validation rules, which the schema description only partially hints at. For 'sheet', since the schema only says 'object', the description is the sole source of truth for what the sheet object should contain (sheet_columns, virtual_columns, validation_functions, data_transforms). This goes well beyond the schema's generic definition.

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 resource: 'Validate a CSVBox sheet schema locally (no API call).' This clearly distinguishes it from sibling tools like create_sheet or update_sheet, which perform mutations. The phrase 'no API call' further separates it from any network-dependent tool. The purpose is unmistakable.

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 clearly conveys when to use this tool: before an API call to validate the schema against the intended write verb, as shown by the mode parameter explanation ('Pass mode... so empty-array and _delete rules match the verb you are about to use'). However, it does not explicitly name alternative tools or state 'use this instead of X,' so it stops short of full exclusion guidance. The context is adequate for an agent to infer usage.

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. 9 tool updatesv1.0.1
    • First observedcreate_importer_from_prompt
    • First observedcreate_sheet
    • First observedgenerate_import_code
    • First observedgenerate_sheet_functions
    • First observedgenerate_sheet_json
    • First observedpatch_sheet
    • First observedsubmit_file
    • First observedupdate_sheet
    • First observedvalidate_schema

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation4/5

Tools are mostly distinct: create/update/patch/validate/submit/generate each target different actions. The three 'generate_' tools produce different outputs (sheet JSON, code, functions), but 'create_importer_from_prompt' and 'generate_sheet_json' both involve prompt-based sheet generation, with the former actually creating while the latter only returns JSON, which could cause minor confusion.

Naming Consistency4/5

Most names follow a verb_noun pattern (create_sheet, update_sheet, patch_sheet, validate_schema, submit_file, generate_sheet_json, generate_import_code, generate_sheet_functions). The exception is 'create_importer_from_prompt', which uses 'importer' instead of the more consistent 'sheet' and breaks the pattern slightly.

Tool Count5/5

With 9 tools, the surface is well-scoped for a CSV import integration server. Each tool covers a distinct aspect (schema creation, modification, validation, file submission, and generation helpers) without redundancy, and the count fits comfortably in the ideal range.

Completeness3/5

The set covers create, update (PUT/PATCH), validation, and file submission, but lacks read operations (e.g., get_sheet, list_sheets) and explicit sheet deletion. While patch supports _delete, there is no direct delete_sheet tool. This creates a gap for agents that need to inspect or manage existing sheets outside of updates.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables comprehensive CSV file management including creating, editing, analyzing, and transforming CSV data anywhere in the filesystem. Provides statistical analysis, data validation, filtering, and grouping capabilities through MCP protocol over stdio transport.
    15
    -
  • A
    license
    B
    quality
    D
    maintenance
    Enables SQL querying over CSV and Excel files using DuckDB, providing tools to load files, inspect schemas, and run read-only queries via MCP.
    5
    MIT