Skip to main content
Glama

TianshangScribe

中文版

PyPI CI License TianshangScribe MCP server

개발자, CLI 자동화, AI 에이전트를 위한 크로스 플랫폼 Office 문서 처리 도구입니다. Word(.docx), Excel(.xlsx), PowerPoint(.pptx) 문서를 생성, 편집, 템플릿 채우기, 변환할 수 있으며, LaTeX 스타일 마크업, 네이티브 OMML 수식, 템플릿 엔진({{placeholders}}, {{#each}} 루프, {{#if}} 조건)을 지원합니다. stdio, SSE, Streamable HTTP 전송 방식으로 7가지 도구(create, edit, fill template, convert, extract, validate, compare)를 제공하는 MCP Server가 포함되어 있으며, bearer-token 인증과 rate limiting을 지원합니다.

경고: 불안정한 API — 호환성 변경 예정

이 프로젝트는 1.0 미만(0.x) 버전입니다. CLI 옵션, MCP 도구 시그니처, 템플릿 문법, 출력 형식은 고정되지 않았으며 사전 공지 없이 변경될 수 있습니다. 호환성 약속: 모든 호환성 변경 사항은 최소 한 릴리스 전에 CHANGELOG에 공지되며 마이그레이션 가이드가 함께 제공됩니다. 프로덕션 환경에서는 특정 버전을 고정하여 사용하고, 업그레이드 전에 CHANGELOG를 검토하세요.

설치

pip install tianshang-scribe

# Or from source:
git clone https://github.com/Tianshang301/TianshangScribe.git
cd TianshangScribe
pip install -e ".[dev]"

Linux 배포

Docker (Streamable HTTP 기반 MCP Server에 권장):

git clone https://github.com/Tianshang301/TianshangScribe.git
cd TianshangScribe
docker compose up -d
# Streamable HTTP MCP Server at http://localhost:8080/mcp
# (override transport / auth / rate limits via TIANSHANG_SCRIBE_* env vars)

.deb 패키지 (Debian / Ubuntu):

# Download from GitHub Releases
sudo dpkg -i tianshang-scribe_0.7.1_all.deb
tianshang-scribe --help

pipx (격리된 CLI):

pipx install tianshang-scribe
tianshang-scribe --help

Python 3.10+ 필요 · python-docx · openpyxl · python-pptx · typer · rich · lxml

Related MCP server: docx-forge-mcp

빠른 시작

# Create a Word document
tianshang-scribe -w --create -a "Hello World" -o hello.docx

# Replace text (--regex for regex mode)
tianshang-scribe input.docx -r "old" --replace-new "new" -o output.docx

# LaTeX markup with nesting
tianshang-scribe -w --create --latex-style \
  -s "font=Times New Roman,size=14" \
  -a "\bfseries{\itshape{bold italic}} \fontsize{24}{Heading} \color{FF0000}{red}" \
  -o styled.docx

# Math formulas —auto-converted to native Word OMML
tianshang-scribe -w --create \
  --math "x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}" \
  --math "\sum_{i=0}^{n} i^2" \
  -o formulas.docx

# Template filling (JSON / CSV / YAML →{{placeholder}})
tianshang-scribe template.docx -t data.json -o filled.docx

# Convert to PDF (office2pdf ~2MB, or LibreOffice fallback)
tianshang-scribe input.docx --topdf -o output.pdf

# MCP Server —stdio mode (Claude Code / Cursor)
python -m tianshang_scribe.mcp.server

# MCP Server —SSE mode (Dify / Coze / FastGPT)
python -m tianshang_scribe.mcp.server --transport sse --port 8080

# Excel: import CSV, sort, export JSON
tianshang-scribe -e --create --from-csv data.csv --sort "A1:A10 asc" --to-json -o out.json

# Excel: add formula, protect workbook
tianshang-scribe budget.xlsx --formula "B10 =SUM(B2:B9)" --protect "p@ss" -o protected.xlsx

전역 옵션

매개변수

설명

input_file

입력 문서 경로 (--create 사용 시 생략)

-w --word

Word 문서 처리

-e --excel

Excel 통합 문서 처리

-p --ppt

PowerPoint 프레젠테이션 처리

-o --output

출력 파일 경로

--force

기존 파일 덮어쓰기 허용

--topdf

PDF로 출력

--stdin

표준 입력에서 읽기

--stdout

표준 출력에 쓰기

-w/-e/-p를 생략하면 입력 파일 확장자로 문서 유형을 자동 판별합니다.

작업

옵션

설명

예시

-cr --create

빈 문서 생성

--create -w

-a --add

텍스트 추가

-a "Hello"

--column

--add 대상 열 지정

--column 2

-r --replace

찾기 및 바꾸기

-r "foo" --replace-new "bar"

-d --delete

내용 삭제

-d "keyword"

-cl --clear

내용 / 서식 / 링크 지우기

--clear formats

-m --modify

내용 수정

-m "old" --modify-new "new"

-s --style

스타일 설정

-s "font=Times,size=14,bold"

-t --template

템플릿 채우기

-t data.json

-x --extract

데이터 추출 (math/latex 등)

-x latex

--meta

속성 설정

--meta "title=Report,author=John"

--latex-style

LaTeX 파싱 활성화

--math

수식 추가 (Word)

--math "\frac{a}{b}"

--math-style

수식 파싱 방언 (office/mathtype)

--math-style mathtype

--math-font

OMML 수식 글꼴 (기본값 Cambria Math)

--math-font "Times New Roman"

--math-mtef

MathType OLE 객체(MTEF)로 삽입

--math "\frac{a}{b}" --math-mtef

--heading

제목 추가 (Word)

--heading "level:1 text:Intro"

--regex

정규식 모드

--replace --delete와 함께 사용

--merge

파일 병합

--merge "a.docx,b.docx"

--split

문서 분할 (Excel 전용: --split by-sheet)

--split by-sheet

--comment

주석 추가 (Word) / 발표자 노트 (PPT)

--comment "2 Note text"

--add-table

표 추가 (Word)

--add-table "H1,H2|a1,a2"

--chart-add

차트 추가 (Excel)

--chart-add "type=bar data=B1:C10"

--batch

배치 모드

--batch

--files

배치용 Glob 패턴

--files "reports/*.docx"

--schedule-db

스케줄 SQLite DB 경로

--schedule-db ~/.tianshang-scribe/schedules.db

--schedule-add

스케줄 등록

--schedule-add "daily|0 9 * * *|echo hi"

--schedule-rm

스케줄 제거

--schedule-rm daily

--schedule-list

스케줄 목록

--schedule-list

--schedule-run

스케줄 즉시 실행

--schedule-run daily

--schedule-run-all

실행 예정인 스케줄 실행

--schedule-run-all

--run-script

샌드박스에서 스크립트 실행

--run-script build.py

--stdin

표준 입력에서 읽기

--stdout

표준 출력에 쓰기

Word 전용 옵션

옵션

설명

예시

--heading

제목 추가

--heading "level:1 text:Intro"

--math

수식 추가

--math "\frac{a}{b}"

--latex-style

LaTeX 마크업 활성화

--toc

목차 생성

--toc

--section-break

구역 나누기 삽입

--section-break

--header

페이지 머리글 설정

--header "Chapter 1"

--footer

페이지 바닥글 설정

--footer "Page X"

--watermark

텍스트 워터마크

--watermark "DRAFT"

--tomd

Markdown으로 변환

--tomd

--tohtml

HTML로 변환

--tohtml

Excel 전용 옵션

옵션

설명

예시

--sheet-add

워크시트 추가

--sheet-add "Q1"

--sheet-delete

워크시트 삭제

--sheet-delete "Sheet2"

--sheet-rename

워크시트 이름 변경

--sheet-rename "Old New"

--column-width

열 너비 설정

--column-width "2=20"

--row-height

행 높이 설정

--row-height "3=30"

--formula

셀 수식 설정

--formula "A1 =SUM(B1:B10)"

--from-csv

CSV 데이터 가져오기

--from-csv data.csv

--sort

범위 정렬

--sort "A1:A10 asc"

--chart-add

차트 추가

--chart-add "type=bar data=B1:C10"

--protect

비밀번호 설정

--protect "p@ss"

--unprotect

비밀번호 제거

--unprotect

--to-csv

CSV로 내보내기

--to-json

JSON으로 내보내기

--to-html

HTML로 내보내기

LaTeX 스타일 마크업

--add 내용에 다음 마크업을 포함하세요. --latex-style으로 활성화합니다. 중첩을 지원합니다.

구문

효과

\bfseries{text}

굵게

\itshape{text}

기울임

\scshape{text}

작은 대문자

\underline{text}

밑줄

\rmfamily{text}

로만(세리프)

\sffamily{text}

산세리프

\ttfamily{text}

고정폭

\fontfamily{Arial}{text}

특정 글꼴

\fontsize{18}{text}

글꼴 크기(pt)

\color{FF0000}{text}

색상(hex)

\centering{...}

가운데 정렬 *

\raggedright{...}

왼쪽 정렬 *

\raggedleft{...}

오른쪽 정렬 *

\linespread{1.5}{...}

줄 간격 *

\indent{...} / \noindent{...}

들여쓰기 *

\heading{2}{Title}

제목 삽입

\newpage

페이지 나누기

\includegraphics{path}

이미지 삽입

* 문단 수준 서식(새 문단을 생성합니다).

글꼴 구성

명령어

효과

\setmainfont{Name}

기본 서양 글꼴

\setCJKmainfont{Name}

기본 CJK 글꼴

\setsansfont{Name}

산세리프 글꼴

\setCJKsansfont{Name}

CJK 산세리프 글꼴

\setmonofont{Name}

고정폭 글꼴

\setCJKmonofont{Name}

CJK 고정폭 글꼴

Word OOXML은 기본적으로 w:ascii(서양)와 w:eastAsia(CJK) 글꼴을 분리하여 저장하므로, 혼합 스크립트 텍스트에서 자동 글꼴 전환이 가능합니다.

수식

LaTeX 수학 공식은 --math를 통해 네이티브 Word OMML(Office Math Markup Language)로 변환됩니다. 변환기는 중첩된 불변 토큰 트리(분수, 근호, N-항, 위/아래 첨자, 강세, 스타일, 구분 기호 토큰)를 처리하는 수제 재귀 하강 파서(expression → term → factor → atom)이며, 사전 컴파일된 정규식과 제로 카피 인자 슬라이싱을 사용하는 O(1) 명령 테이블을 통해 디스패치됩니다. --math-font "Times New Roman"을 사용하면 Word 기본값인 Cambria Math(<m:mathPr><m:mathFont>) 대신 MathType 스타일의 세리프 글꼴로 방정식을 렌더링할 수 있습니다. --math-style mathtype은 MathType 호환성을 위해 LaTeX 파싱 방식을 전환합니다. --math-mtef를 사용하면 수식을 실제 MathType OLE 객체(MTEF 바이너리)로 임베드할 수 있습니다 — 레거시 MathType(6.x 및 이전 버전)에서 편집 가능하며, --extract math가 읽어오는 것과 동일한 형식입니다. 출력은 릴리스 간 바이트 단위로 안정적입니다(골든 스냅샷 회귀 테스트 스위트로 보호됨).

지원 구문

카테고리

명령

분수

\frac{num}{den}

근호

\sqrt{content} \sqrt[n]{content}

위/아래 첨자

x^{2} x_{i} x_{i}^{n}

합/적분

\sum \int \oint \prod \coprod \bigcup \bigcap \bigvee \bigwedge

극한

\lim_{x \to 0} \max \min \sup \inf

명명된 함수

\sin \cos \tan \cot \sec \csc \log \ln \det \Pr \gcd \deg \dim \hom \ker \arg

그리스 문자

\alpha \beta \gamma\Gamma \Delta \Theta

기호

\pm \times \div \cdot \infty \partial \nabla \forall \exists

관계

\leq \geq \neq \approx \equiv \propto \subset \supset \in

화살표

\to \rightarrow \leftarrow \mapsto \uparrow

강세

\hat{x} \bar{x} \tilde{x} \dot{x} \ddot{x} \vec{x} \widehat{x} \widetilde{x}

괄호

\left( \right) \left[ \right] \left\{ \right\}

수학 글꼴

\mathrm{abc} \mathbf{abc} \mathit{abc} \mathcal{ABC} \mathbb{ABC} \mathsf{abc} \mathtt{abc}

수학 타이포그래피

주류 수학 저널 표준(AMS, Elsevier, Springer)을 따릅니다:

콘텐츠

스타일

예시

단일 문자 변수

이탤릭

a b x y

숫자

로만

0 1 2

명명된 함수

로만

\sin \cos \log

소문자 그리스

이탤릭

\alpha \beta \gamma

대문자 그리스

로만

\Gamma \Delta \Theta

자동 감지

--add 텍스트의 명령은 $...$ 래핑 없이도 자동으로 수학으로 인식됩니다:

  • 인자 포함: \frac \sqrt \sum \int \prod \lim

  • 강세: \hat{x} \bar{x} \vec{x}

  • 단항 연산자: \sin \cos \tan \log \ln

  • 일반 텍스트의 H_{2}Om^{2}는 유니코드 위/아래 첨자(H₂O / m²)가 됩니다

스타일 구문

--style은 쉼표로 구분된 키-값 쌍을 사용합니다:

--style "font=Times New Roman,size=14,bold,italic,color=FF0000,align=center"

별칭

설명

font

font_name, font-family

글꼴 이름

서양 글꼴

cjk-font

cjk_font_name, cjk-font-family

글꼴 이름

CJK 글꼴

size

font_size, font-size

pt

글꼴 크기

bold

플래그

굵게

italic

플래그

이탤릭

underline

플래그

밑줄

color

font_color, font-color

FF0000

16진수 색상

align

alignment

left/center/right/justify

정렬

bold, italic, underline 불리언 키는 존재 시 True입니다.

템플릿 채우기

JSON, CSV, YAML 데이터 소스를 지원합니다. 문서의 {{placeholder}}를 대체합니다. 중첩 객체는 점 표기법으로 확장됩니다. 루프는 목록 값을 반복합니다. 조건문은 블록을 표시/숨깁니다.

{
  "name": "John Doe",
  "date": "2026-07-28",
  "user": { "city": "Beijing" },
  "show": true,
  "paid": false,
  "items": [
    { "product": "Widget", "price": "10" },
    { "product": "Gadget", "price": "20" }
  ]
}
{{name}}              → John Doe
{{user.city}}         → Beijing
{{#each items}}       → repeats the block for each item
  {{product}}: {{price}}
{{/each}}
{{#if show}}          → shown only when show is truthy
  Confidential content
{{/if}}
{{#if role=admin}}    → shown only when role equals "admin"
  Admin dashboard
{{/if}}
{{#unless paid}}      → shown only when paid is falsy
  Payment required
{{/unless}}

Excel 기능

기능

CLI 옵션

시트 관리

--sheet-add --sheet-delete --sheet-rename

열/행 크기

--column-width --row-height

수식

--formula "A1 =SUM(B1:B10)"

데이터 가져오기

--from-csv

데이터 내보내기

--to-csv --to-json --to-html

정렬

--sort "A1:A10 asc"

차트

--chart-add "type=bar data=B1:C10"

보호

--protect --unprotect

PPT 기능

기능

설명

슬라이드 관리

슬라이드 추가, 삭제, 재정렬 (--slide-add, --slide-delete, --slide-move)

레이아웃

이름 또는 인덱스로 슬라이드 레이아웃 적용 (--layout)

발표자 노트

발표자 노트 추가 (--notes)

수학 공식

$...$ / $$...$$를 네이티브 OMML로 렌더링

전환

슬라이드 전환 효과 설정 — 페이드, 푸시, 와이프 등 (--transition)

내보내기

슬라이드를 이미지로 저장 (--toimg), PDF로 변환 (--topdf)

미디어 압축

이미지 압축 (--compress-media "1920,80")

보호

비밀번호 설정/해제 (--protect, --unprotect)

종료 코드

코드

의미

0

성공

1

일반 오류

2

인자 오류

3

미구현

MCP 서버

TianshangScribe에는 MCP(Model Context Protocol) 서버가 포함되어 있습니다 — AI 에이전트가 Office 문서를 생성, 편집, 템플릿 채우기, 변환, 데이터 추출을 수행할 수 있습니다.

빠른 연결

stdio (Claude Code, Cursor):

{"mcpServers": {"tianshang-scribe": {
  "command": "python", "args": ["-m", "tianshang_scribe.mcp.server"]
}}}

SSE (Dify, Coze, FastGPT):

python -m tianshang_scribe.mcp.server --transport sse --host 0.0.0.0 --port 8080
{"mcpServers": {"tianshang-scribe": {
  "url": "http://localhost:8080/sse", "transport": "sse"
}}}

도구 (7)

도구

설명

create_office_document

구조화된 콘텐츠 블록으로 .docx / .xlsx / .pptx 생성

edit_office_document

기존 문서에 대해 교체, 삭제, 수정, 스타일, 추가 작업 수행

fill_template

데이터로 {{placeholders}} 채우기; {{#each}} / {{#if}} 지원

convert_document

형식 간 변환 (docx↔pdf/md/html, xlsx↔csv/json)

extract_document_data

메타데이터, 전체 텍스트 또는 문서 구조 추출

validate_template

채우기 전에 템플릿 플레이스홀더를 데이터와 사전 검증

compare_documents

두 .docx 파일 간 문단 수준 차이 비교

기능

기능

세부 사항

프로토콜

MCP 2024-11-05 · stdio + SSE · JSON-RPC 2.0

리소스

resources/list + resources/read — 문서를 읽기 가능한 URI로 노출

프롬프트

5개의 내장 워크플로 템플릿 (prompts/list + prompts/get)

진행 상황

PDF 변환 및 장기 작업 중 notifications/progress

응답

다중 유형 content[]: 텍스트 메시지 + 리소스 (파일 URI, MIME 유형, 크기)

스키마

모든 매개변수에 enum, default, examples, minimum/maximum 제약 조건

프로덕션 (SSE 전용)

# With authentication
TIANSHANG_SCRIBE_AUTH_TOKEN="secret" \
python -m tianshang_scribe.mcp.server --transport sse --host 0.0.0.0 --port 8080

# Health check
curl http://localhost:8080/health
# {"status":"ok","version":"0.7.1","uptime_seconds":3600,"active_sessions":3,"tools_available":7}

# CORS whitelist
python -m tianshang_scribe.mcp.server --transport sse --cors-origins "https://coze.com,https://dify.ai"

엔드포인트: GET /health · GET /sse · POST /message?session_id=X

전체 문서: docs/mcp/README.md.

python tests/integration/mcp/mcp_stdio_smoke.py     # 9/9 quick tests (stdio)
python tests/integration/mcp/test_sse.py        # 3/3 SSE transport tests
python tests/integration/mcp/mcp_agent_sim.py      # 11-scenario Agent simulation

아키텍처

src/
└── tianshang_scribe/    # importable package (tianshang_scribe.*)
    ├── cli/               # Typer CLI entry
    │  ├── main.py        # Command parsing & dispatch
    │  └── global_opts.py # File path / type inference
    ├── core/              # Document engine abstraction
    │  ├── document.py    # DocumentABC unified interface
    │  ├── word_engine.py # Word engine (python-docx)
    │  ├── excel_engine.py# Excel engine (openpyxl)
    │  └── ppt_engine.py  # PPT engine (python-pptx)
    ├── rendering/         # Style & formula rendering
    │  ├── styles.py      # TextStyle dataclass
    │  ├── latex_parser.py # LaTeX markup parser
    │  ├── math_omml.py   # LaTeX →OMML math converter
    │  └── template.py    # Template filling engine
    ├── transform/         # Format conversion
    │  └── pdf.py         # PDF export (office2pdf + LibreOffice)
    ├── mcp/                    # MCP Server (official mcp SDK 2.x)
    │  ├── server.py           # build_server + entry (stdio / SSE / Streamable HTTP)
    │  ├── transport.py        # transport wiring + ASGI middleware
    │  ├── schemas.py          # pydantic models + as_dict
    │  ├── auth.py             # Bearer token auth
    │  ├── rate_limit.py       # token bucket rate limiting
    │  ├── metrics.py          # Prometheus-style metrics
    │  ├── security.py         # read-only / destructive classification
    │  ├── prompts.py          # 5 prompt workflows
    │  ├── tools/              # 7 Agent tools
    │  │  ├── _registry.py    # tool registry (schemas auto-derived)
    │  │  ├── create.py / edit.py / template.py / convert.py
    │  │  ├── validate.py / compare.py
    │  └── errors.py           # structured error codes + fixes
    └── utils/             # Utility functions
        └── file_utils.py

기술 스택

구성 요소

기술

CLI

Typer + Rich

Word

python-docx

Excel

openpyxl

PPT

python-pptx

수학

수제 재귀 하강 파서 → OMML XML (불변 토큰 트리, 명령 디스패치 테이블)

템플릿

사용자 정의 엔진 ({{placeholder}}, {{#each}}, {{#if}})

PDF

office2pdf (~2MB Rust 바이너리, 제로 의존성) + LibreOffice 폴백

품질

pytest (936개 테스트) · ruff · mypy

EXE 빌드

pip install pyinstaller
pyinstaller --onefile --name tianshang-scribe --hidden-import openpyxl.cell._writer --hidden-import openpyxl.cell.read_only --hidden-import openpyxl.styles --hidden-import openpyxl.chart --hidden-import openpyxl.comments src/tianshang_scribe/cli/main.py
# dist/tianshang-scribe.exe (~35 MB)

데모

python -m demo.generate_demos
# demo/demo_word.docx   —LaTeX + math + TOC + watermark
# demo/demo_excel.xlsx  —CSV import + formulas + chart + protection
# demo/demo_ppt.pptx    —slides + notes + transitions + math formulas

CLI 규정 준수 테스트:

python demo/test_cli.py

개발

git clone https://github.com/Tianshang301/TianshangScribe.git
cd TianshangScribe
pip install -e ".[dev]"

pytest tests/ -v        # Run tests
ruff check src/tianshang_scribe/ tests/  # Lint
mypy src/tianshang_scribe/               # Type check

라이선스

Apache-2.0

Available Tools

12 tools
analyze_excel_dataA
Read-onlyIdempotent

Analyze an Excel workbook without touching it: per-sheet row/column counts, headers, inferred column types (numeric min/max/mean, categorical values), null counts, sample rows, and duplicate-row detection. Read-only — never modifies the input file. After analysis use edit_excel_workbook to apply fixes, or extract_document_data for raw text and metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNo
input_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only, non-destructive, and idempotent behavior. The description reinforces this with 'never modifies the input file' and 'Read-only', adding explicit confirmation. It also discloses the scope of analysis (per-sheet counts, headers, inferred types), which goes beyond annotations by describing what the tool inspects, but doesn't detail edge cases like formula evaluation or large file behavior.

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, with the key purpose and read-only guarantee front-loaded. It lists specific outputs in a compressed list and then mentions alternatives in a final sentence. No wasted words, and every sentence contributes to understanding.

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 tool has a detailed output schema (not shown in detail but indicated as 'true'), the description doesn't need to explain return values. With only 2 parameters (one required), the description covers what the tool does and its safety profile. The only gap is not specifying which options from the shared ToolOptions are relevant, but for a read-only analysis tool, most options (like backup, restore) are likely inapplicable, and the description's clarity about read-only behavior implicitly signals that. Slight incompleteness for an agent unfamiliar with the options structure.

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 schema has 0% description coverage, and the only functional parameter is 'input_path' which is self-explanatory. The options parameter is a complex nested object with many fields for other tools, but the description doesn't clarify which options apply to this tool. Even with low schema coverage, the input_path is obvious, and the options are likely irrelevant to this read-only analysis, so the description adds no extra meaning beyond what the parameter name suggests.

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: analyzing an Excel workbook without modifying it, and lists specific analysis outputs (row/column counts, headers, column types, null counts, sample rows, duplicate detection). It distinguishes itself from sibling tools by explicitly mentioning edit_excel_workbook and extract_document_data as alternatives.

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 clear guidance on when to use the tool: for analysis before applying fixes or extracting text. It names alternatives (edit_excel_workbook for fixes, extract_document_data for raw text), but doesn't provide explicit when-not-to-use conditions, though the alternative mentions serve as implicit exclusions.

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

compare_documentsA

Compare two Word (.docx) documents and report paragraph-level differences: additions, removals, and changes with paragraph indices. Note: comparison and snapshots are ONLY supported for Word (.docx); Excel (.xlsx) and PowerPoint (.pptx) comparison is not yet available (you will receive an UNSUPPORTED_FORMAT error). Also manages document snapshots via options.action: "snapshot" records path_a state, "list_snapshots" lists recorded snapshots, and "restore" writes a snapshot back to path_b (snapshot store default: ~/.tianshang-scribe/snapshots/). The compare mode never modifies its inputs; snapshot/restore write to the snapshot store. To read a single document, use extract_document_data.

ParametersJSON Schema
NameRequiredDescriptionDefault
path_aYesPath to the first document.
path_bYesPath to the second document.
optionsNoTool options.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

The description explicitly states that compare mode never modifies inputs, while snapshot/restore write to the snapshot store, and restore overwrites path_b. It also mentions backup and dry_run options, providing full transparency about side effects despite annotations not indicating these behaviors.

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 well-structured, starting with the core purpose, then detailing snapshot actions, format limitations, and an alternative. Every sentence adds necessary information without redundancy, maintaining a balance between completeness and brevity.

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 (multiple actions, options, and side effects), the description covers all essential aspects: supported formats, error conditions, alternative tools, default behaviors, and side effects. The presence of an output schema further completes the picture, so nothing critical is missing.

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 already provides descriptions for all parameters (100% coverage). The tool description adds valuable context, such as the default snapshot_dir and the meaning of each action, enriching the semantic understanding beyond the schema alone.

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 primary function: comparing two Word documents for paragraph-level differences. It explicitly names the resource (two .docx files) and the actions (additions, removals, changes). It also distinguishes itself from a sibling tool (extract_document_data) and specifies format limitations, ensuring unambiguous purpose.

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 provides explicit guidance on when to use the tool (for comparing two documents) and when not to (unsupported formats like .xlsx/.pptx), and offers an alternative for single-document reading (extract_document_data). It also explains the snapshot actions and side effects, making usage conditions clear.

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

convert_documentA

Convert a document between formats while preserving structure where possible: Word (.docx) to PDF/Markdown/HTML, Excel (.xlsx) to PDF/CSV/JSON/HTML, PowerPoint (.pptx) to PDF. Writes the converted file to output_path (default: .). PDF conversion requires office2pdf or LibreOffice to be installed. To read content for analysis instead, use extract_document_data.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoTool options.
input_pathYesPath to the source document.
output_pathNoOutput file path.
target_formatYesTarget output format: - "pdf": PDF document (requires office2pdf or LibreOffice) - "csv": Comma-separated values (Excel only) - "json": JSON array of rows (Excel only) - "html": HTML table (Excel) / styled HTML (Word) - "md"/"markdown": Markdown (Word only)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

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

The description discloses that the tool writes a converted file to output_path, and notes a dependency for PDF conversion. However, it does not mention overwrite behavior, idempotency, or failure modes. Since annotations provide no hints (all false), the description bears the burden, and it provides some but not comprehensive behavioral transparency.

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 fluff, front-loading the core purpose and including necessary caveats and alternatives.

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 covers the main functionality, dependencies, and provides an alternative tool for reading content. It does not describe the options parameter (shared across tools) or return values, but the output schema exists, and the schema covers the options. Given the complexity, it is reasonably complete, though it could mention overwrite semantics.

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 description adds meaning beyond the schema by specifying which target formats are valid per source type (e.g., CSV/JSON only for Excel, Markdown only for Word). It also clarifies the default output_path behavior. This goes beyond the schema's generic 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 clearly states the verb 'Convert', the resource 'document between formats', and enumerates specific source-target combinations (Word, Excel, PowerPoint to various formats). It also distinguishes itself from the sibling tool extract_document_data by explicitly saying to use that for reading content instead.

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 provides explicit when-not-to-use guidance: 'To read content for analysis instead, use extract_document_data.' It also mentions the prerequisite for PDF conversion (office2pdf or LibreOffice), which guides the agent on environment requirements. This is clear context.

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

create_excel_workbookA

Create a NEW Excel workbook from typed sheet specs: each sheet carries name, headers, rows, cell formulas, freeze panes, number_format, conditional_format, data_validation, and column widths. Writes a new .xlsx at output_path and overwrites any file already there. For targeted changes to an existing workbook use edit_excel_workbook; for read-only inspection use analyze_excel_data.

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetsYesWorksheets to build (in order).
optionsNoTool options.
metadataNoOptional document properties (title/author/...).
output_pathYesOutput .xlsx path to create.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior1/5

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

The description warns that the tool 'overwrites any file already there,' which is important behavioral context. However, the annotation destructiveHint=false contradicts this warning, since overwriting an existing file is a destructive side effect. Per the rubric, a description that contradicts annotations scores 1.

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 composed of three purposeful sentences, with the core creation intent first, the overwrite warning second, and usage routing third. The enumeration of sheet properties is somewhat redundant with the schema but still contributes to quick understanding.

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 covers core behaviors including creation, overwriting, and sibling routing. It acknowledges the diversity of sheet configuration through the property list and explains the difference between creating versus editing. The main gap is the contradiction with the destructive annotation, which could mislead agents.

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 each parameter. The description repeats the sheet property names but does not add deeper meaning or usage context beyond the schema. A 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 clearly states a specific verb and resource: 'Create a NEW Excel workbook' from typed sheet specs, and lists the specific capabilities (headers, rows, formulas, freeze panes, etc.). It also implicitly differentiates from siblings by focusing on creation versus modification or analysis.

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 provided: use edit_excel_workbook for targeted changes to an existing workbook and analyze_excel_data for read-only inspection. This tells the agent exactly when to choose this tool versus the alternatives.

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

create_office_documentA

Create a NEW Word (.docx), Excel (.xlsx), or PowerPoint (.pptx) file from a structured content list of typed blocks (heading, paragraph, formula, table, image), with LaTeX-style markup (\bfseries{bold}) and math formulas (\frac{a}{b}). Writes to output_path (default: a temp file) and persists. To edit an existing file, use edit_office_document. Excel blocks may carry: sheet_name, cell+formula, freeze, chart_type+chart_data_range, number_format, conditional_format, data_validation, hyperlink, named_range. PPT blocks may carry: slide_index, slide_layout, notes, transition, chart_type+chart_data, rows (table), path (picture), fill/line (shape). Multiple PPT text/table/chart blocks stack onto one slide unless slide_index is set.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleNoGlobal document style.
formatYesDocument format: - "docx": Word document — reports, letters, contracts, proposals - "xlsx": Excel workbook — spreadsheets, data tables, charts - "pptx": PowerPoint — slides, presentations, pitch decks
contentYesOrdered list of content blocks.
optionsNoTool options.
metadataNoDocument metadata (title, author, etc.).
output_pathNoOutput file path.
template_dataNoKey-value pairs to fill {{placeholder}} in content.

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?

Reveals concrete behaviors: persists output, default temp file, PPT block stacking overwrites slides unless slide_index provided. This goes well beyond the annotations. Could mention whether it overwrites existing output_path files (destructiveHint=false but not stated) — that's the main gap.

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 moderately long but front-loaded with the core action ('Create a NEW Word, Excel, or PowerPoint file') and switches to the sibling tool early. The format-specific details (Excel vs PPT block properties) are useful but slightly dense; still, they are organized and valuable. Minor redundancy with the schema ('action' default, 'output_path' default) but not 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?

Covers most end-to-end context: when to use, what formats are supported, how blocks map to formats, output behavior, and the sibling tool for editing. Given 7 parameters and nested blocks, it could add a short example or note about template_data interplay, but it's already quite complete. The block types in description map well to schema fields (cell, formula, rows, style, template_data).

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 schema coverage is 100% (7 parameters fully described), the description adds significant semantic value: it explains the relationship between blocks and formats (Excel-only properties like cell/formula, PPT-only like slide_index/transition), clarifies 'Writes to output_path (default: a temp file) and persists', and emphasizes that unlisted-block properties are typed. The schema defines the shape; the description explains usage semantics (stacking, default behavior, format applicability), which is exactly what an agent needs.

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 action ('Create a NEW Word, Excel, or PowerPoint file') with a clear verb ('create'), object ('office document'), and scope (docx/xlsx/pptx). It explicitly says 'To edit an existing file, use edit_office_document', which differentiates it from the editing sibling. The description also names the three supported formats and details per-format capabilities (Excel blocks with formulas/conditional formatting, PPT blocks with slides/transitions), so an agent can unambiguously tell what this tool produces and how it differs from edit_office_document.

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?

Gives clear context (create vs edit, format selection) and explicitly mentions the alternative tool. Missing explicit 'when NOT to use' exclusions beyond the edit case, but the guidance is sufficient.

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

create_presentationA

Create a NEW PowerPoint deck from typed slide specs: layout, title, bullets, positioned text boxes, tables, charts, pictures, speaker notes, and transitions. Writes a new .pptx at output_path and overwrites any file already there. To change an existing deck slide by slide instead, use edit_presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
slidesYesSlides to build (in order).
optionsNoTool options.
metadataNoOptional document properties (title/author/...).
output_pathYesOutput .pptx path to create.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior1/5

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

Annotation Contradiction: The description explicitly states the tool 'overwrites any file already there,' which is a destructive side effect on the output path, yet annotations declare destructiveHint=false. This creates conflicting signals for the agent about whether an existing file may be lost. The overwrite warning is transparent, but the annotation contradicts it, so the score must drop to 1 per the rubric.

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 with no filler. The first sentence states the primary purpose, the second exposes the overwrite side effect, and the third names the sibling alternative. Information is front-loaded and 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?

The description is largely complete: it names the tool's purpose, enumerates the supported slide components, discloses the overwrite behavior, and points to the alternative for editing. It does not describe the return value, but the context indicates an output schema exists. The only true gap is the annotation contradiction, which is addressed separately; otherwise, the description provides enough context for an agent to invoke 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 schema already documents the parameters and nested slide structures. The description adds general context about output_path and the kinds of slide content supported, but it does not clarify ambiguous schema details such as the generic ToolOptions block (which references compare_documents actions unrelated to presentation creation). Baseline 3 is appropriate because the schema carries the parameter-semantic burden.

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 and resource ('Create a NEW PowerPoint deck') and enumerates the supported slide components (layout, title, bullets, positioned text boxes, tables, charts, pictures, notes, transitions). It explicitly distinguishes itself from edit_presentation by saying it creates from scratch rather than changing an existing deck slide by slide.

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 a clear condition for use: create a new .pptx from typed slide specs. It explicitly routes to a sibling tool: 'To change an existing deck slide by slide instead, use edit_presentation.' This gives the agent a direct when-to-use/when-not-to-use rule.

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

edit_excel_workbookA
Destructive

Edit an existing .xlsx workbook with typed operations: write_cell, set_formula, freeze_panes, add_chart, conditional_format, data_validation, add_table, sort, add_sheet, set_range_style, and number_format. Rewrites the file — when output_path is omitted the INPUT FILE IS OVERWRITTEN IN PLACE, so pass output_path or options {"backup": true} to keep a .bak copy. To build a new workbook use create_excel_workbook; to inspect one first use analyze_excel_data.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoTool options (dry_run, backup).
input_pathYesPath to the existing .xlsx workbook.
operationsYesTyped Excel edit operations applied in order.
output_pathNoOutput path (defaults to the input file).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

While the annotations already indicate destructiveHint=true, the description adds critical behavioral specifics: rewriting the file, overwriting in place when output_path is omitted, and the backup option. It also mentions the dry_run option for validation without writing, providing a comprehensive picture of side effects.

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 well-structured: it opens with the core action, lists the operations compactly, then provides essential behavioral warnings and sibling alternatives. It is concise yet comprehensive, with no unnecessary fluff, and the key information (overwrite, backup) is prominently placed.

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 tool is a mutation tool with output schema present, so return values need no explanation. The description covers all necessary context: how to perform edits, optional output path, backup behavior, dry-run validation, and how to avoid overwriting. It is complete for an agent to invoke the 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?

All parameters have descriptions (schema coverage 100%), and the ExcelEditOp description in the schema explicitly lists which fields are meaningful for each action (e.g., 'write_cell': cell, value, sheet_name, style, is_formula). This gives clear parameter semantics beyond the terse per-field descriptions, ensuring the agent understands how to use each field.

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 edits an existing .xlsx workbook and lists the specific typed operations (write_cell, set_formula, etc.), distinguishing it from creation and analysis tools. The verb 'edit' and resource '.xlsx workbook' make the purpose explicit.

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 provides explicit usage guidance by naming sibling tools: 'To build a new workbook use create_excel_workbook; to inspect one first use analyze_excel_data.' This tells the agent when to use this tool versus alternatives, and the mention of overwriting and backup options further clarifies usage scenarios.

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

edit_office_documentA
Destructive

Legacy general-purpose editor kept for backward compatibility; for Excel use edit_excel_workbook and for PowerPoint use edit_presentation instead of this wide operation model. Still supports replace/delete/modify/style/add/clear on any type plus the Excel/PPT capability actions. Rewrites the file — when output_path is omitted the INPUT FILE IS OVERWRITTEN IN PLACE, so pass output_path or options {"backup": true} for a .bak copy. New documents belong to create_office_document.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoTool options.
input_pathYesPath to the existing document.
operationsYesList of edit operations applied in order.
output_pathNoOutput path (defaults to the input file).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

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

No annotations are provided to indicate read-only or destructive nature meaningful. The description only states it edits Word documents without describing side effects, reversibility, or whether it overwrites the source file, which is a significant gap for an edit 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?

A single concise sentence that states the tool's purpose and names alternatives. Clear and efficient.

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

Completeness3/5

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

The description gives purpose and alternative routing but lacks behavioral details like output format, mutation of input, or return value. With no destructive/read-only hints beyond the false flags, the agent relies on the schema for specifics.

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 schema provides detailed per-operation parameter descriptions with 100% coverage illustration. The description itself adds little parameter detail, relying on the schema, which is acceptable given the coverage. Slight deduction because the description does not summarize the key operation fields.

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 identifies the tool as an editor for office documentsaisôcienta and specifies it can still edit Word documents, while naming the sibling tools for Excel and PPT. An agent can readily distinguish it from related tools.

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 instructs to use edit_excel_workbook or edit_presentation instead for Excel/PPT, leaving no ambiguity about when this tool should be used.

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

edit_presentationA
Destructive

Edit an existing .pptx with typed operations: add_slide, add_text, replace_text, add_table, add_chart, add_picture, add_shape, apply_layout, set_transition, and add_notes. Rewrites the deck — when output_path is omitted the INPUT FILE IS OVERWRITTEN IN PLACE, so pass output_path or options {"backup": true} for a .bak copy. To generate a new deck use create_presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoTool options (dry_run, backup).
input_pathYesPath to the existing .pptx presentation.
operationsYesTyped PowerPoint edit operations applied in order.
output_pathNoOutput path (defaults to the input file).

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?

Annotations already mark destructiveHint=true, but the description adds crucial context: rewriting the deck and in-place overwrite when output_path is omitted. It also discloses the mitigation (output_path or backup option), which goes well beyond the structured annotation and is vital for safe invocation.

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 wasted words. It front-loads the purpose, lists operations efficiently, then delivers the critical overwrite warning and sibling pointer. Every sentence earns its place.

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 covers the most important context for a mutation tool: the destructive overwrite behavior and how to prevent it. Since an output schema exists and the input schema documents the per-operation fields, nothing essential is missing for an agent to call 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 baseline is 3. The description lists the operation names but does not add parameter-level meaning beyond what the schema already provides; the schema itself documents per-action field mapping in the PptEditOp description. Therefore the description neither compensates nor degrades 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 uses a specific verb and resource: 'Edit an existing .pptx with typed operations' and enumerates the exact supported operations. It also distinguishes itself from the sibling create_presentation by explicitly saying 'To generate a new deck use create_presentation', so an agent can tell them apart.

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 (editing an existing .pptx) and names the alternative for new decks: 'To generate a new deck use create_presentation'. It also gives essential usage guidance around output_path and the backup option, telling the agent to pass output_path or options {'backup': true} to avoid overwriting the input file.

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

extract_document_dataA
Read-onlyIdempotent

Read data from a document: metadata (author/title/etc.), text (plain text plus a block count), or structure (paragraphs/sheets/slides). Read-only — never modifies the input file. To compare two documents, use compare_documents.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoWhat to extract: metadata, text, or structure.metadata
optionsNoTool options.
input_pathYesPath to the source document.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

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

The description restates the read-only and non-destructive behavior that the annotations already provide (`readOnlyHint: true`, `destructiveHint: false`, `idempotentHint: true`), so it adds little new behavioral disclosure. The mode-specific output hints (e.g., "plain text plus a block count") offer minor added context, but no deeper risks, auth needs, or side effects are described.

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 three short clauses, front-loaded with the core action, and every sentence earns its place. It conveys purpose, read-only safety, and a sibling alternative with 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 presence of an output schema and strong annotations, the description is largely complete: it states what the tool extracts, confirms it is non-destructive, and offers a comparison alternative. The only notable gap is the confusing `options` parameter, which is not addressed, but the schema's 100% coverage mitigates this.

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 already covers all parameters with 100% description coverage, so the baseline is 3. The description adds useful meaning to the `mode` parameter by giving examples (author/title, paragraphs/sheets/slides). However, it does not clarify the `options` parameter, whose schema references compare_documents-specific actions, so the description doesn't fully disambiguate all 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 uses a specific verb and resource: "Read data from a document," and enumerates the three extraction modes (metadata, text, structure) with concrete examples. It also distinguishes itself from the sibling `compare_documents` tool by saying "To compare two documents, use compare_documents."

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 clearly states when to use the tool: when you need to read metadata, text, or structure. It gives an explicit alternative for a different use case (comparison), and the read-only declaration makes it clear this is not for editing or modifying documents.

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

fill_templateA

Fill {{key}} placeholders in a template document with data, expanding {{#each list}} loops and {{#if}}/{{#unless}} conditions. Writes a NEW file to output_path (default: _filled.); the input template is left unchanged. Run validate_template first to catch missing keys early.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesKey-value data to fill placeholders. Supports nested objects.
optionsNoTool options.
output_pathNoOutput file path.
template_pathYesPath to the template document containing placeholders.

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?

Beyond the annotations (which only mark non-readOnly, non-destructive), the description adds key behavioral context: it writes a NEW file, leaves input unchanged, and expands specific template constructs. This helps the agent understand side effects. It doesn't mention whether it can overwrite an existing output_path, but overall it adds meaningful behavior beyond annotations.

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, front-loaded with the core verb and resource, then details output behavior and a recommended prerequisite. Every sentence contributes unique information, with no padding. It's concise and well-structured for quick scanning.

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 tool has an output schema (not detailed here) and rich annotations, the description covers the main functionality, output behavior, and a usage tip. It doesn't elaborate on options like dry_run or backup, but those are already in the schema. The description is sufficient for an agent to decide when and how to call it, though it could mention how it handles nested data structures more explicitly.

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% (all parameters are described in the schema). The description adds value by specifying the default output_path behavior ('<template>_filled.<ext>'), which the schema does not mention. It also indirectly explains how data interacts with loops/conditions, though that's not parameter-specific. This raises the score above baseline from schema.

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 fills placeholders in a template document, expanding loops and conditions, and writes a new file. It distinguishes itself from siblings like edit_office_document by explicitly noting it creates a new file and leaves the input unchanged. The verb 'fill' plus specific placeholder syntax and condition handling make the purpose 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 advises running validate_template first to catch missing keys early, providing a clear sequencing guideline. It does not explicitly mention when not to use this tool versus alternatives like edit_office_document or convert_document, but the 'new file' behavior implicitly contrasts with in-place modification. The guidance is adequate but lacks explicit alternatives and exclusions.

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

validate_templateA
Read-onlyIdempotent

Validate that all {{placeholder}} variables, {{#each}} loops, and {{#if}}/{{#unless}} conditions in a template can be resolved against data, reporting missing keys. Read-only — never modifies the file. Call this BEFORE fill_template to catch missing keys early.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesKey-value data to validate against placeholders.
template_pathYesPath to the template document (.docx/.xlsx).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by specifying what constructs are validated and that it reports missing keys, going slightly beyond the structured annotations without contradicting them.

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 core purpose, states the safety guarantee, and gives actionable usage guidance. Every sentence earns its place.

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 has rich annotations, a complete input schema, an output schema, and a clear relationship to fill_template, the description covers purpose, timing, and safety sufficiently. No critical context is missing for an agent to select and invoke this 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%, with both parameters already described clearly in the input schema: data is 'Key-value data to validate against placeholders' and template_path is 'Path to the template document (.docx/.xlsx).' The description does not add significant parameter-level detail beyond what the schema provides, so the baseline of 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 uses a specific verb ('Validate') with a clear resource ('template') and enumerates exactly what is checked ({{placeholder}} variables, {{#each}} loops, {{#if}}/{{#unless}} conditions). It also states the outcome ('reporting missing keys') and distinguishes itself from fill_template by name.

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 says 'Call this BEFORE fill_template to catch missing keys early,' giving clear when-to-use guidance and naming the related alternative tool. It also clarifies the read-only nature, reinforcing that this is a pre-flight check rather than a mutation operation.

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. Dates show when Glama detected each change.

  1. 7 tool updatesv0.8.0
    • Addedanalyze_excel_data
    • Addedcreate_excel_workbook
    • Changedcreate_office_document16 fields changed
      • addedInput schema / $defs / ContentBlock / properties / cell
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target cell reference, e.g. \"A1\" (Excel). Used by formula/hyperlink/write_cell.",
        +  "title": "Cell"
        +}
      • addedInput schema / $defs / ContentBlock / properties / chart_data
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "items": {},
        +        "type": "array"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "PPT chart data: first row series names, then [category, *values] rows.",
        +  "title": "Chart Data"
        +}
      • addedInput schema / $defs / ContentBlock / properties / chart_data_range
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel chart data range, e.g. \"Sheet1!A1:B10\".",
        +  "title": "Chart Data Range"
        +}
      • addedInput schema / $defs / ContentBlock / properties / chart_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Chart type: bar, line, pie, area, doughnut, scatter (Excel/PPT).",
        +  "title": "Chart Type"
        +}
      • addedInput schema / $defs / ContentBlock / properties / conditional_format
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel conditional format spec, e.g. \"B2:B100=color_scale\" or \"C1:C5=cell_is:greaterThan:20\".",
        +  "title": "Conditional Format"
        +}
      • addedInput schema / $defs / ContentBlock / properties / data_validation
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel data validation spec, e.g. \"C2:C50=list:yes,no\" or \"B1:B10=whole:1:100\".",
        +  "title": "Data Validation"
        +}
      • addedInput schema / $defs / ContentBlock / properties / formula
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel formula string, e.g. \"=SUM(B1:B10)\". Requires cell.",
        +  "title": "Formula"
        +}
      • addedInput schema / $defs / ContentBlock / properties / freeze
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel freeze panes cell, e.g. \"A2\".",
        +  "title": "Freeze"
        +}
      • addedInput schema / $defs / ContentBlock / properties / hyperlink
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "URL to hyperlink the cell given by `cell` to (Excel).",
        +  "title": "Hyperlink"
        +}
      • addedInput schema / $defs / ContentBlock / properties / named_range
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel named range spec, e.g. \"MyRange=A1:B2\".",
        +  "title": "Named Range"
        +}
      • addedInput schema / $defs / ContentBlock / properties / notes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "PPT speaker notes text for the target slide.",
        +  "title": "Notes"
        +}
      • addedInput schema / $defs / ContentBlock / properties / number_format
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel number format spec, e.g. \"A1:A10=0.00%\".",
        +  "title": "Number Format"
        +}
      • addedInput schema / $defs / ContentBlock / properties / sheet_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target worksheet name (Excel). Routes write/formula/style to this sheet.",
        +  "title": "Sheet Name"
        +}
      • addedInput schema / $defs / ContentBlock / properties / slide_index
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target slide index (0-based) for PPT content (tables/charts/text). None = current/last slide.",
        +  "title": "Slide Index"
        +}
      • addedInput schema / $defs / ContentBlock / properties / slide_layout
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "PPT slide layout name or index (applied on slide creation).",
        +  "title": "Slide Layout"
        +}
      • addedInput schema / $defs / ContentBlock / properties / transition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "PPT slide transition name, e.g. \"fade\".",
        +  "title": "Transition"
        +}
    • Addedcreate_presentation
    • Addededit_excel_workbook
    • Changededit_office_document29 fields changed
      • changedInput schema / $defs / EditOperation / properties / action / description
        Previous value: -"Operation type:\n- \"replace\": find old_text, replace with new_text (regex optional)\n- \"delete\": remove text matching target\n- \"modify\": find old_text, replace with new_text\n- \"style\": apply a style string to the whole document\n- \"add\": append text at a column (Excel)\n- \"clear\": clear document content"New value: +"Operation type. Only the listed fields are meaningful per action:\n- \"replace\": old_text, new_text, regex (all doc types)\n- \"delete\": target, regex (all doc types)\n- \"modify\": old_text, new_text (all doc types)\n- \"style\": style, apply_all (all doc types)\n- \"add\": text, column (Excel append; Word/PPT append paragraph)\n- \"clear\": (no fields)\n- \"write_cell\": cell, text (value), sheet_name, style, is_formula (Excel)\n- \"set_formula\": cell, formula, sheet_name (Excel)\n- \"freeze_panes\": range (Excel)\n- \"add_chart\": chart_type + chart_data_range (Excel) OR chart_type + chart_data (PPT), sheet_name (Excel)\n- \"conditional_format\": conditional_format OR range + cell_is opts (Excel)\n- \"data_validation\": data_validation OR range (Excel)\n- \"add_table\": rows (first row = header), slide_index (PPT)\n- \"add_picture\": path, slide_index (PPT)\n- \"add_shape\": slide_index, fill, line, shape_type (PPT)\n- \"apply_layout\": slide_index, layout (PPT)\n- \"set_transition\": slide_index, transition (PPT)\n- \"add_notes\": slide_index, notes (PPT)\n- \"add_slide\": layout (PPT, optional)\n- \"sort\": range, key_columns, orders, order (Excel)\n- \"add_sheet\": sheet_name (Excel)\n- \"set_range_style\": range, style (Excel)\n- \"number_format\": number_format (\"RANGE=FORMAT\", e.g. \"A1:A10=0.00%\")\nUnused fields for an action are ignored."
      • changedInput schema / $defs / EditOperation / properties / action / enum
        Previous value: -[
        -  "replace",
        -  "delete",
        -  "modify",
        -  "style",
        -  "add",
        -  "clear"
        -]New value: +[
        +  "replace",
        +  "delete",
        +  "modify",
        +  "style",
        +  "add",
        +  "clear",
        +  "write_cell",
        +  "set_formula",
        +  "freeze_panes",
        +  "add_chart",
        +  "conditional_format",
        +  "data_validation",
        +  "add_table",
        +  "add_picture",
        +  "add_shape",
        +  "apply_layout",
        +  "set_transition",
        +  "add_notes",
        +  "add_slide",
        +  "sort",
        +  "add_sheet",
        +  "set_range_style",
        +  "number_format"
        +]
      • addedInput schema / $defs / EditOperation / properties / cell
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target cell reference, e.g. \"A1\" (Excel).",
        +  "title": "Cell"
        +}
      • addedInput schema / $defs / EditOperation / properties / cf_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Conditional format type (color_scale/data_bar/cell_is/formula).",
        +  "title": "Cf Type"
        +}
      • addedInput schema / $defs / EditOperation / properties / chart_data
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "items": {},
        +        "type": "array"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "PPT chart data for add_chart.",
        +  "title": "Chart Data"
        +}
      • addedInput schema / $defs / EditOperation / properties / chart_data_range
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel chart data range for add_chart.",
        +  "title": "Chart Data Range"
        +}
      • addedInput schema / $defs / EditOperation / properties / chart_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Chart type for add_chart.",
        +  "title": "Chart Type"
        +}
      • addedInput schema / $defs / EditOperation / properties / dv_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Data validation type (list/whole/decimal/date/text_length).",
        +  "title": "Dv Type"
        +}
      • addedInput schema / $defs / EditOperation / properties / fill
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Shape fill color hex (add_shape).",
        +  "title": "Fill"
        +}
      • addedInput schema / $defs / EditOperation / properties / formula
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Excel formula string (set_formula).",
        +  "title": "Formula"
        +}
      • addedInput schema / $defs / EditOperation / properties / formula1
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Data validation formula1 (e.g. \"yes,no\").",
        +  "title": "Formula1"
        +}
      • addedInput schema / $defs / EditOperation / properties / formula2
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Data validation formula2 (e.g. upper bound).",
        +  "title": "Formula2"
        +}
      • addedInput schema / $defs / EditOperation / properties / is_formula
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "write_cell only: true stores text as a formula (must start with \"=\"), false forces a literal string even when it starts with \"=\", omitted keeps the automatic behaviour.",
        +  "title": "Is Formula"
        +}
      • addedInput schema / $defs / EditOperation / properties / key_columns
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "0-based sort key columns (sort).",
        +  "title": "Key Columns"
        +}
      • addedInput schema / $defs / EditOperation / properties / layout
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Slide layout name/index (apply_layout).",
        +  "title": "Layout"
        +}
      • addedInput schema / $defs / EditOperation / properties / line
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Shape line color hex (add_shape).",
        +  "title": "Line"
        +}
      • addedInput schema / $defs / EditOperation / properties / notes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Speaker notes text (add_notes).",
        +  "title": "Notes"
        +}
      • addedInput schema / $defs / EditOperation / properties / number_format
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Number format spec \"RANGE=FORMAT\" (number_format).",
        +  "title": "Number Format"
        +}
      • addedInput schema / $defs / EditOperation / properties / order
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Single sort order asc/desc (sort).",
        +  "title": "Order"
        +}
      • addedInput schema / $defs / EditOperation / properties / orders
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Per-key sort orders asc/desc (sort).",
        +  "title": "Orders"
        +}
      • addedInput schema / $defs / EditOperation / properties / path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Image path (add_picture).",
        +  "title": "Path"
        +}
      • addedInput schema / $defs / EditOperation / properties / range
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Cell range for freeze_panes/conditional_format/data_validation/add_chart (Excel).",
        +  "title": "Range"
        +}
      • addedInput schema / $defs / EditOperation / properties / rows
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "items": {},
        +        "type": "array"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Table rows for add_table (PPT). First row is the header.",
        +  "title": "Rows"
        +}
      • addedInput schema / $defs / EditOperation / properties / shape_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Autoshape type (add_shape), e.g. rectangle/oval/arrow/line.",
        +  "title": "Shape Type"
        +}
      • addedInput schema / $defs / EditOperation / properties / sheet_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target worksheet (Excel).",
        +  "title": "Sheet Name"
        +}
      • addedInput schema / $defs / EditOperation / properties / slide_index
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target slide index (PPT add_table/add_chart).",
        +  "title": "Slide Index"
        +}
      • changedInput schema / $defs / EditOperation / properties / text / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / EditOperation / properties / text / description
        Previous value: -"Text to add (add)."New value: +"Text to add (add) or scalar value to write (write_cell; formulas start with \"=\")."
      • addedInput schema / $defs / EditOperation / properties / transition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Transition name (set_transition).",
        +  "title": "Transition"
        +}
    • Addededit_presentation
  2. 7 tool updates
    • Changedcompare_documents4 fields changed
      • addedInput schema / $defs / ToolOptions / properties / action
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "compare",
        +        "snapshot",
        +        "list_snapshots",
        +        "restore"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sub-operation for compare_documents: \"compare\" (default) diffs two documents; \"snapshot\" records path_a state; \"list_snapshots\" lists recorded snapshots; \"restore\" writes a snapshot back to path_b.",
        +  "title": "Action"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Directory to store/read document snapshots (default: ~/.tianshang-scribe/snapshots/).",
        +  "title": "Snapshot Dir"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Snapshot identifier used by the restore action.",
        +  "title": "Snapshot Id"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "compare_documentsDictOutput",
        +  "type": "object"
        +}
    • Changedconvert_document4 fields changed
      • addedInput schema / $defs / ToolOptions / properties / action
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "compare",
        +        "snapshot",
        +        "list_snapshots",
        +        "restore"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sub-operation for compare_documents: \"compare\" (default) diffs two documents; \"snapshot\" records path_a state; \"list_snapshots\" lists recorded snapshots; \"restore\" writes a snapshot back to path_b.",
        +  "title": "Action"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Directory to store/read document snapshots (default: ~/.tianshang-scribe/snapshots/).",
        +  "title": "Snapshot Dir"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Snapshot identifier used by the restore action.",
        +  "title": "Snapshot Id"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "convert_documentDictOutput",
        +  "type": "object"
        +}
    • Changedcreate_office_document4 fields changed
      • addedInput schema / $defs / ToolOptions / properties / action
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "compare",
        +        "snapshot",
        +        "list_snapshots",
        +        "restore"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sub-operation for compare_documents: \"compare\" (default) diffs two documents; \"snapshot\" records path_a state; \"list_snapshots\" lists recorded snapshots; \"restore\" writes a snapshot back to path_b.",
        +  "title": "Action"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Directory to store/read document snapshots (default: ~/.tianshang-scribe/snapshots/).",
        +  "title": "Snapshot Dir"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Snapshot identifier used by the restore action.",
        +  "title": "Snapshot Id"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "create_office_documentDictOutput",
        +  "type": "object"
        +}
    • Changededit_office_document4 fields changed
      • addedInput schema / $defs / ToolOptions / properties / action
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "compare",
        +        "snapshot",
        +        "list_snapshots",
        +        "restore"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sub-operation for compare_documents: \"compare\" (default) diffs two documents; \"snapshot\" records path_a state; \"list_snapshots\" lists recorded snapshots; \"restore\" writes a snapshot back to path_b.",
        +  "title": "Action"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Directory to store/read document snapshots (default: ~/.tianshang-scribe/snapshots/).",
        +  "title": "Snapshot Dir"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Snapshot identifier used by the restore action.",
        +  "title": "Snapshot Id"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "edit_office_documentDictOutput",
        +  "type": "object"
        +}
    • Changedextract_document_data4 fields changed
      • addedInput schema / $defs / ToolOptions / properties / action
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "compare",
        +        "snapshot",
        +        "list_snapshots",
        +        "restore"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sub-operation for compare_documents: \"compare\" (default) diffs two documents; \"snapshot\" records path_a state; \"list_snapshots\" lists recorded snapshots; \"restore\" writes a snapshot back to path_b.",
        +  "title": "Action"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Directory to store/read document snapshots (default: ~/.tianshang-scribe/snapshots/).",
        +  "title": "Snapshot Dir"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Snapshot identifier used by the restore action.",
        +  "title": "Snapshot Id"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "extract_document_dataDictOutput",
        +  "type": "object"
        +}
    • Changedfill_template4 fields changed
      • addedInput schema / $defs / ToolOptions / properties / action
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "compare",
        +        "snapshot",
        +        "list_snapshots",
        +        "restore"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sub-operation for compare_documents: \"compare\" (default) diffs two documents; \"snapshot\" records path_a state; \"list_snapshots\" lists recorded snapshots; \"restore\" writes a snapshot back to path_b.",
        +  "title": "Action"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Directory to store/read document snapshots (default: ~/.tianshang-scribe/snapshots/).",
        +  "title": "Snapshot Dir"
        +}
      • addedInput schema / $defs / ToolOptions / properties / snapshot_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Snapshot identifier used by the restore action.",
        +  "title": "Snapshot Id"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "fill_templateDictOutput",
        +  "type": "object"
        +}
    • Changedvalidate_template1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "validate_templateDictOutput",
        +  "type": "object"
        +}
  3. 7 tool updatesv0.3.0
    • First observedcompare_documents
    • First observedconvert_document
    • First observedcreate_office_document
    • First observededit_office_document
    • First observedextract_document_data
    • First observedfill_template
    • First observedvalidate_template

TDQS

A4/5.0
Disambiguation2/5

Multiple tools have unclear boundaries: create_office_document can produce Excel and PowerPoint files, making its purpose overlap directly with create_excel_workbook and create_presentation. Similarly, the legacy edit_office_document duplicates the typed editors, and extract_document_data overlaps with analyze_excel_data for reading. The long cross-referencing descriptions try to compensate, but an agent could easily pick the wrong tool for a create-xlsx or create-pptx task.

Naming Consistency4/5

The server follows a consistent verb_noun snake_case convention throughout (create_*, edit_*, analyze_*, extract_*, convert_*, compare_*, fill_*, validate_*), making the intent of each tool predictable. Minor deviations exist: compare_documents is plural while others are singular, and objects alternate granularity (excel_workbook vs office_document vs presentation vs template) rather than using one unifying noun. Overall the pattern is easy to learn and apply.

Tool Count5/5

At 12 tools, the server sits comfortably in the well-scoped 3-15 range for a document-processing domain covering Word, Excel, PowerPoint, and templates. The count is substantial enough to cover the full workflow without feeling bloated or sparse.

Completeness4/5

The server covers the document lifecycle well: create (excel/office/presentation), read (extract/analyze), update (edit variants), plus convert, compare, snapshots, and template fill/validate. Major gaps include the lack of delete/remove operations (e.g., no remove_sheet or delete_slide) and comparison that only supports Word, with Excel/PPT hitting UNSUPPORTED_FORMAT errors. These are workable gaps rather than dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Tianshang301/TianshangScribe'

If you have feedback or need assistance with the MCP directory API, please join our Discord server