Skip to main content
Glama

OfficeAgent.NET

build NuGet downloads license

Give coding agents a structured way to create and edit real Word documents, PowerPoint decks, and Excel workbooks. OfficeAgent.NET turns an agent's intent into typed, validated operations and applies them directly to OOXML packages while preserving document structure.

Use it to generate documents and presentations, make targeted edits, update tables, styles, and images, or manage comments and review state. The engine ships as an MCP server, Microsoft Agent Framework tools, and a .NET API, with filesystem, SharePoint, session, and inline document workflows.

One example is a targeted Word edit whose result remains reviewable:

OfficeAgent.NET finds, previews, and applies a contract edit as a tracked change in Word.

What this project does

An Office Open XML file is a package of related XML parts. A small change can affect runs, styles, numbering, comments, content controls, or revision markup. OfficeAgent.NET handles that document-specific work. The model works with structured document data and JSON-serialisable operations such as "replace this clause as a tracked change" or "add a row to this table."

The same engine is available in three forms:

  • an MCP server for agents that support the Model Context Protocol;

  • tools for Microsoft Agent Framework and Microsoft.Extensions.AI;

  • a .NET API for applications that want to control the workflow directly.

It supports Word .docx, PowerPoint .pptx, and Excel .xlsx; one client routes each document to the module that handles it. See Scope and limitations before choosing it for a workflow that depends on Office's layout or calculation engine.

What you can build

Area

Supported workflows

Word creation and editing

Create .docx files; inspect and change text, paragraphs, tables, images, styles, content controls, headers, footers, notes, page setup, and document properties

Word review

Read and manage comments, preserve or resolve review state, set one revision identity per plan, and record supported edits as tracked revisions

PowerPoint creation and editing

Build or update decks with slides, layouts, text, tables, native editable charts, images, media, notes, comments, sections, transitions, and animations

Excel inspection and editing

Inspect worksheets, tables, and bounded ranges; find raw or displayed values; set cells and formulas; append table rows; manage cell notes

Template generation

Bind unique Word content-control tags or PowerPoint shape names, expand repeating Word table rows, and create bounded batches with one receipt per output

Word comparison

Compare supported free-body paragraph text read-only and produce a snapshot-bound native redline plan only when all other package content is unchanged

Agent and application integration

Use MCP over stdio or HTTP, Microsoft Agent Framework tools, or the direct .NET API, with SHA-256 apply receipts and host-supplied audit actors

Document access

Work with bounded filesystem roots, SharePoint, in-memory sessions, or self-contained inline content

Related MCP server: docx-mcp

Choose a starting point

I want to...

Start here

Try a targeted Word edit

Try a Word edit

Create a Word document from scratch

Create a document

Create or edit a PowerPoint deck

PowerPoint support

Inspect or edit an Excel workbook

Excel support

Connect Codex, Claude Code, Copilot Studio, or Microsoft 365 Copilot

Deployment and client setup

Use OfficeAgent from C#

Getting started

Add tools to a Microsoft Agent Framework agent

Agent integration

Host the MCP server or use SharePoint

MCP server and document providers

Add per-user hosted connection authorization

Hosted gateway reference

Add optional PDF/page-image rendering

Visual rendering

Edit documents with no storage configured

Documents with no storage

Run a tracked-review workflow

Optional word-document-review skill

Build a contract-review agent

ContractReview sample

Populate quote templates or compare Word documents

Template and comparison workflows

Check support, compatibility, or security policy

Support and security

Contribute

Contributing

Try a Word edit

This small workflow demonstrates that OfficeAgent can change an existing OOXML file without flattening its structure. It uses tracked changes because the result is easy to verify in Word; review is one part of the broader document operation set.

Install the server. The published package command is:

dotnet tool install --global OfficeAgent.Mcp

Make a folder for the agent to work in and download the sample contract into it — a fictional services agreement with a clause to change, a table, an open comment, and a pending redline:

mkdir -p ~/officeagent-documents
curl -Lo ~/officeagent-documents/services-agreement.docx \
  https://raw.githubusercontent.com/ilia-sokolov/OfficeAgent.NET/main/samples/documents/services-agreement.docx

PowerShell:

$officeAgentDocuments = Join-Path $env:USERPROFILE "officeagent-documents"
New-Item -ItemType Directory -Force $officeAgentDocuments | Out-Null
Invoke-WebRequest `
  https://raw.githubusercontent.com/ilia-sokolov/OfficeAgent.NET/main/samples/documents/services-agreement.docx `
  -OutFile (Join-Path $officeAgentDocuments "services-agreement.docx")

Any .docx of your own works too — the sample just gives you something with a comment and a pending revision already in it.

Register the server with Claude Code, pointed at that folder and nothing else:

claude mcp add \
  --env OfficeAgent__FileSystemConnections__0__ConnectionId=documents \
  --env OfficeAgent__FileSystemConnections__0__RootPath=$HOME/officeagent-documents \
  --transport stdio \
  officeagent -- officeagent-mcp --stdio

PowerShell:

claude mcp add `
  --env OfficeAgent__FileSystemConnections__0__ConnectionId=documents `
  --env "OfficeAgent__FileSystemConnections__0__RootPath=$officeAgentDocuments" `
  --transport stdio `
  officeagent -- officeagent-mcp --stdio

For this review-specific workflow, you can optionally install the word-document-review skill before starting the client.

Then ask:

In services-agreement.docx, change the payment terms from thirty days to forty-five days.

Open the file in Word. Clause 3 now reads forty-five days as a tracked change you can accept or reject, and everything else — the table, the comment, the redline that was already there — is exactly as it was. This demonstrates a key engine property: apply the requested operation while preserving unrelated package content.

What else the sample is good for — reviewing comments, accepting revisions, editing the table.

Next, try creating a Word document, generating a PowerPoint deck, or using the direct .NET workflow.

If it does not work

claude mcp list shows officeagent as failed

Check RootPath is an absolute path to a directory that exists.

The agent says it cannot find the document

Use a relative name, or an absolute path that still resolves inside RootPath.

io-error on save

Close the file in Word, then check filesystem permissions and the available disk space.

Configure broader workflows

The quick start above is deliberately the smallest thing that works. Four settings extend it:

Setting

Adds

OfficeAgent__AllowCreation=true

create_document, so "draft a project brief in brief.docx" makes a new file instead of failing

OfficeAgent__FileSystemConnections__0__AllowedExtensions__0=.docx plus OfficeAgent__FileSystemConnections__0__AllowedExtensions__1=.pptx

Word and PowerPoint on one connection. Declaring this list replaces the .docx default. Set OfficeAgent__FileSystemConnections__0__DefaultChangeMode=Direct for decks, and send "mode": "Tracked" explicitly for reviewable Word edits on that mixed connection.

OfficeAgent__EphemeralConnectionId=session

Names the in-memory session connection explicitly. With no configuration at all the server already falls back to one - this is for running it alongside storage, or under a different id

OfficeAgent__AllowInlineContent=true

Tools that carry the document as base64, for a single self-contained call

Past a couple of settings, use a file instead — the same OfficeAgent section, where a list is a list:

{
  "OfficeAgent": {
    "AllowCreation": true,
    "FileSystemConnections": [
      {
        "ConnectionId": "documents",
        "RootPath": "C:\\officeagent-documents",
        "AllowedExtensions": [ ".docx", ".pptx" ],
        "DefaultChangeMode": "Direct"
      }
    ]
  }
}

The same configuration is available as samples/config/word-and-powerpoint.json. Change RootPath before using it.

claude mcp add --transport stdio officeagent -- officeagent-mcp --stdio --config ./officeagent.json

Environment variables still override the file. Windows, PowerShell, other MCP clients, HTTP hosting and SharePoint are in Deployment and client setup; every setting is listed in MCP server.

Optional guidance for Word review

skills/word-document-review teaches the review loop: read comments and pending revisions before editing, keep reviewable Word edits as redlines, use document ids for multi-step work, and recover from stable error codes. The installation guide gives complete Bash and PowerShell steps for Claude Code and Codex, including installation from a fresh machine and verification. The skill is only needed when the task requires that review discipline; document creation, ordinary direct edits, and PowerPoint workflows use the server without it.

What reaches the model

The inspect and find tools return document text and structure to the model — that is how it locates an edit. Filesystem and SharePoint operations keep the package behind an opaque id. Inline tools carry the whole file as base64 on every call. Session import/export also carries the package as base64 if the agent performs those calls; a host integration can instead move the bytes outside model context. Connect storage and model providers appropriate for the data.

The standalone server ships no authentication layer for HTTP hosting; put it behind your own, or start from the authenticated HostedGateway reference. A filesystem root is a trust boundary: its ACLs must stop untrusted principals creating, renaming or replacing entries while the server runs.

.NET quick start

Install the core package and Word module:

dotnet add package OfficeAgent.Core
dotnet add package OfficeAgent.Word

After registering services and a document provider, the edit loop looks like this:

var client = services.GetRequiredService<OfficeAgentClient>();
var doc = await client.RegisterAsync("workspace", "/srv/workspace/contract.docx");

var inspect = await client.InspectAsync("workspace", doc.ItemId);
var hit = (await client.FindAsync(
    "workspace", doc.ItemId, new FindQuery("Acme Corp"))).First();

var plan = new DocumentPlan
{
    Snapshot = inspect.Snapshot,
    Operations = new PlanOperation[]
    {
        new ChangeTextOp
        {
            Target = hit.Anchor,
            With = "Globex Inc.",
            Mode = ChangeMode.Tracked
        }
    }
};

var preview = await client.PreviewAsync("workspace", doc.ItemId, plan);
if (preview.IsValid)
    await client.CommitAsync("workspace", doc.ItemId, plan);

The complete example, including service registration and reading the saved file, is in Getting started. The minimal direct-.NET sample runs against the bundled fictional contract, so it needs no MCP client, language model, or document of your own:

dotnet run --project samples/QuickEdit -- \
  samples/documents/services-agreement.docx quickedit-output.docx

Open quickedit-output.docx in Word and verify that the payment term is a tracked change while the existing revision, comment, table, and headings remain intact. QuickEdit also accepts an exact source and replacement text for your own document.

The repository also contains a direct IChatClient Word-editing sample and an interactive Agent Framework sample, plus a complete contract-review agent that separates model judgement from validated document writes. The TemplateBatch sample generates two quotes from one tagged template, while DocumentComparison turns covered body-paragraph differences into a reviewable Word redline. The DocumentAssembly sample combines a proposal, statement of work, and appendix into one editable package with a multi-source audit receipt. See Word document assembly for its formatting and compatibility scope.

How it works

Every edit follows the same four steps:

  1. Inspect returns a structured map of the document: its outline, paragraphs, styles, content controls, tables, images, and revisions.

  2. Find searches text and returns a content-verified anchor for each match.

  3. Preview validates a plan against the current document and reports the proposed changes without writing.

  4. Apply commits the complete plan and saves it through the configured provider.

A plan (DocumentPlan) is a typed, JSON-serialisable list of operations. An anchor records both a location and the content expected there. If the content or optional document snapshot has changed, validation fails instead of silently targeting a different location. Applying a plan is all-or-nothing.

The Word module supports changes to text, paragraphs, tables, images, styles, content controls, comment threads, footnotes and endnotes, page geometry and breaks, document properties, and tracked revisions. Operations with a Word revision representation record a redline when the connection asks for one - an inserted clause, a deleted row and a restyled heading all come back as revisions a reviewer accepts or rejects, not only a replaced phrase. Image resizing is applied directly because WordprocessingML has no revision representation for drawing dimensions. The PowerPoint module implements a broad, explicitly documented set of deck operations: text, bullets, run and paragraph formatting, template slots, style copying, tables, images, text boxes, embedded video and audio, speaker notes, resolvable comments, footers and slide numbers, sections, transitions and animations, and the slide lifecycle - adding, removing, reordering and duplicating. Several slide inserts in one plan author a deck end to end, so a single call turns nothing into a finished presentation. Any verb it does not support is named rather than silently skipped. The full operation schema is documented in Document plans, and the deck specifics in PowerPoint support.

Documents are accessed through configured providers. After registration, editing calls use a (connectionId, documentId) pair instead of a storage path or credentials. The filesystem provider restricts registrations to its root; the SharePoint provider uses the permissions of its configured identity. CreateAsync starts a new document inside a connection: the requested .docx or .pptx extension selects a registered blank-document factory. The engine applies an optional initial plan in memory, and then asks the provider to create and register it without overwriting an existing name.

Documentation

Guide

Covers

Documentation hub

Learning paths, package map, and the complete documentation set

Getting started

A complete edit from service registration to reading the result

Concepts

Anchors, snapshots, plans, providers, transactions, and capabilities

Document plans

JSON shapes and validation rules for every operation

Document providers

Filesystem, SharePoint, save modes, and custom providers

PowerPoint support

Slide addressing, the verbs the deck module implements, and what it preserves

Template population and comparison

Batch binding, repeating Word rows, comparison limits, and redline generation

Agent integration

Microsoft Agent Framework and Microsoft.Extensions.AI tools

MCP server

Server configuration, transports, security notes, and tool contracts

Deployment and client setup

Codex, Claude Code, Microsoft Copilot clients, containers, and Azure

Operations

Concurrency, streams, cancellation, telemetry, and production concerns

Troubleshooting

Startup, registration, validation, concurrency, and provider failures

Failure modes

Common plan errors and what to do next

Releasing

Publishing to NuGet, the MCP Registry, and GitHub

Contributing

Bug reports, documentation fixes, new document operations, provider integrations, and focused test cases are useful contributions. If you found a problem, open an issue with the document feature involved, the operation you attempted, and the error or unexpected result. Do not attach confidential documents; a small sanitised reproduction is enough.

To work on the code, install the .NET 8 SDK, fork the repository, and run:

dotnet build OfficeAgent.NET.sln
dotnet test OfficeAgent.NET.sln

Before starting a larger change, especially one that changes public types or the JSON wire format, open an issue so the design can be discussed. See CONTRIBUTING.md for code style, tests, and pull-request expectations.

Scope and limitations

OfficeAgent.NET edits Word .docx, PowerPoint .pptx, and Excel .xlsx files; it does not automate the Office desktop applications.

The deck module refuses the verbs a presentation has no vocabulary for - setProperty, revision, pageSetup, insertBreak and note - per operation, rather than applying part of a plan, and refuses an explicit tracked mode on any verb that carries one. PresentationML has no redline model, so tracked changes are Word-only, and a slide has no header (that is a notes and handout concept). Animations cover the effects expressible as a filtered p:animEffect; fly-in, zoom and motion paths are refused rather than approximated. See PowerPoint support for what a deck does and does not accept.

The core engine does not render pages, calculate Word fields, or evaluate Excel formulas. Formula edits set the workbook to recalculate when Excel opens it. Operations that depend on pagination, table-of-contents rendering, or field recalculation are outside the core scope. Preview reports structural changes. The optional rendering package can produce PDF-derived page images through external processes, but it does not yet detect overflow or page-fit problems. Test the workflow on representative documents and keep human review in the loop for consequential edits.

Two more limits worth knowing before you build on it:

  • Token savings depend on how you connect. Addressing a document by id keeps the package out of the conversation, and inspection can be narrowed with fidelity and paging - that is where the saving comes from. The inline *_content tools are the deliberate exception: they carry the whole file as base64 in both directions, which costs tokens in proportion to file size. They suit a single self-contained call, not a sequence of edits - a model asked to pass a document of a few kilobytes back for a second edit reproduces it imperfectly and the follow-up fails. Use a connection, or a session connection, when more than one edit is coming.

  • Review guidance is optional. For review tasks, the server alone does not make an agent read open comments before editing or choose a redline. The word-document-review skill teaches that workflow; without it, review behaviour depends on the model and the prompt.

Commercial support

OfficeAgent.NET is MIT-licensed and can be self-hosted. Commercial support and deployment assistance are available from dotaction: contact dotaction.

License

MIT. See LICENSE.

Available Tools

11 tools
apply_planA

Apply a DocumentPlan JSON to (connectionId, documentId) and save through the provider. Returns {isValid, committed, receipt, sourceDocumentId, outputConnectionId, outputDocumentId, outputVersion, outputName, outputContentType, changes, errors}; non-applicable values are null. The receipt hashes the effective plan and exact input/output bytes and keeps the host-authenticated actor separate from the plan's display revision author. saveMode: 'Replace' (default, overwrites the source after an optimistic version check), 'NewVersion' (keeps the source and mints a new id under the same connection), 'NewDocument' (mints a fresh id with an optional newName for display). On any failure nothing is written.

ParametersJSON Schema
NameRequiredDescriptionDefault
newNameYes
planJsonYes
saveModeYesReplace
documentIdYes
connectionIdYes

TDQS

A4/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses the complete return shape, receipt hashing semantics, actor-vs-author separation, optimistic version checking on Replace, and critically 'On any failure nothing is written' (atomicity). This is exactly the mutation/atomicity context an agent needs before committing a write.

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?

Front-loaded with the core action, then return shape, then receipt, then saveMode behaviors. Dense but every sentence carries load given the absent output schema. The long inline return-field list is justified but slightly dense to parse.

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 return values, failure atomicity, and saveMode differences, which is more than enough given there is no output schema and no annotations. The main residual gap is where a DocumentPlan comes from (presumably preview_plan) and its expected format, but nothing needed to invoke correctly is missing.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it largely does: all three saveMode values are spelled out with their distinct semantics, newName is tied to NewDocument, and connectionId/documentId are anchored to the apply target. planJson and the DocumentPlan format itself remain only lightly characterized, keeping it out of the top band.

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

Purpose4/5

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

States a specific verb and resource: 'Apply a DocumentPlan JSON to (connectionId, documentId) and save through the provider.' The action is unambiguous and clearly implies the committing counterpart to preview_plan. It stops short of explicitly differentiating itself from siblings like preview_plan, so it lands just under the top band.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the saveMode enumeration tells you the write destinations available, but there is no explicit 'use this when you intend to persist, use preview_plan when you only want to inspect.' No when-not guidance or named alternatives are given, so the agent must infer the routing.

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

compare_documentsA

Read two Word documents and return paragraph differences, exact input SHA-256 hashes, coverage diagnostics, and a tracked-change plan bound to the original snapshot. The first version covers free body paragraphs. Unsupported changes make isComplete false and plan null. This tool writes nothing; preview and apply the returned plan against the original document.

ParametersJSON Schema
NameRequiredDescriptionDefault
revisionAuthorYesOfficeAgent Compare
revisedDocumentIdYes
originalDocumentIdYes
revisedConnectionIdYes
originalConnectionIdYes

TDQS

A3.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it states the tool writes nothing, discloses the limitation that only free body paragraphs are covered in the first version, and specifies failure behavior (unsupported changes set isComplete false and plan null). It stops short of permission/auth or performance details, but the mutation and failure semantics are clearly conveyed.

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?

Four tight sentences, front-loaded with the core action and outputs before the caveats. Every sentence adds information (returned fields, coverage scope, failure mode, write semantics); no wasted filler.

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?

With no output schema, the description usefully describes the return payload (differences, hashes, diagnostics, plan) and the isComplete/plan-null contract. The remaining gap is parameter-level meaning for five required, undocumented inputs, but the overall behavioral picture is complete enough to invoke the tool.

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

Parameters2/5

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

All five parameters are required with 0% schema description coverage, so the description must compensate and largely does not. It conveys an original/revised pairing and 'bound to the original snapshot,' and mentions revisionAuthor only obliquely, but never explains the connectionId vs. documentId distinction or the role of each parameter.

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

Purpose4/5

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

The description opens with a specific verb (read/compare) and resource (two Word documents) and enumerates the outputs: paragraph differences, SHA-256 hashes, coverage diagnostics, and a tracked-change plan. It distinguishes itself as a non-writing producer of a plan, though it never names a sibling tool explicitly (e.g., preview_document_merge) to sharpen the contrast.

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

Usage Guidelines3/5

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

Workflow guidance is implied by 'This tool writes nothing; preview and apply the returned plan against the original document,' which situates it before preview_plan/apply_plan. However, it gives no explicit when-to-use vs. when-not criteria or named alternative for comparison/merge scenarios.

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

edit_documentA

Edit a document the user named by source, in one call: registers it, resolves targets, and applies the operations - use this instead of register_document + find_in_document + apply_plan. planJson is an operations array [ … ] or { "operations": [ … ] }, the same operations preview_plan documents. Targets may name text directly instead of a paragraph id, so no lookup call is needed first: { "op": "changeText", "target": { "find": "Acme Corp" }, "with": "Globex Inc." } If that text matches more than once the call fails with 'ambiguous-anchor' and lists each candidate with its context; re-issue with { "find": "Acme Corp", "match": 2 } (zero-based) or use more surrounding text. Text that matches nothing fails with 'anchor-not-found'. Anchors resolved from inspect_document/find_in_document ({ "paraId": …, "expect": … }) work here too, and can be mixed in the same plan. saveMode and newName behave as in apply_plan. Nothing is written unless every operation validates. Returns the apply_plan shape plus sourceDocumentId - the id of the document that was opened, usable for follow-up calls even when the edit failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYes
newNameYes
planJsonYes
saveModeYesReplace
connectionIdYes

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden and largely meets it: it discloses atomicity ('Nothing is written unless every operation validates'), named error conditions ('ambiguous-anchor', 'anchor-not-found'), the zero-based match-index retry mechanism, and the return shape including sourceDocumentId being usable 'even when the edit failed'. Permissions/rate limits are unaddressed but are not central to correct invocation here.

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 critical routing statement and the one-call summary are front-loaded, and the inline JSON examples earn their space by making the target syntax actionable. It is dense and somewhat long with several nested inline structures, but virtually no sentence is padding.

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?

No output schema, but the description compensates by describing the return ('apply_plan shape plus sourceDocumentId'). Atomicity, error codes and retry semantics are all present. The remaining gap is two under-specified required inputs (connectionId, and the exact nature of source), which an agent must guess at.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It does so thoroughly for planJson (accepted shapes, operation list contents, target object form, mixing paraId/expect anchors) and points to apply_plan for saveMode/newName. However, source is left vague ('a document the user named by source' — name? path? id?) and connectionId is never explained at all.

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

Purpose5/5

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

States a concrete verb and resource (edit a document the user named by source) and explicitly enumerates what it does in one call: registers, resolves targets, applies operations. It also names the exact siblings it supersedes (register_document + find_in_document + apply_plan), so an agent can discriminate it from them without opening any schema.

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 routing guidance: 'use this instead of register_document + find_in_document + apply_plan', plus a stated precondition-free path (targets may name text directly 'so no lookup call is needed first'). It also covers what to do on the two failure modes, i.e. when to re-issue with a match index or longer text.

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

find_in_documentB

Find content in Word, PowerPoint, or Excel. Excel can search displayed, raw, or both cell representations and returns sheetId plus A1 address anchors.

ParametersJSON Schema
NameRequiredDescriptionDefault
regexYes
patternYes
wholeWordYes
documentIdYes
connectionIdYes
caseSensitiveYes
spreadsheetValueViewYesboth

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does add real behavioral detail: the Excel search can span displayed, raw, or both representations, and results are anchored by sheetId plus A1 address. It still omits permission/auth needs, error behavior, and whether the operation is strictly read-only.

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?

Two dense sentences with the core capability front-loaded and no filler. The Excel-specific nuance is appended after the general purpose, which reads well.

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?

For a 7-parameter, zero-coverage, annotation-free tool, the description is only partially complete. It helpfully discloses return anchors, but with no output schema there is no explanation of overall match shape, multi-match behavior, or pagination.

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 0% across 7 required parameters, so the description must compensate. It usefully clarifies spreadsheetValueView semantics (displayed, raw, or both), but leaves pattern, regex, wholeWord, and caseSensitive to be inferred purely from their names.

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

Purpose4/5

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

States a specific verb (Find) and resource (content) plus the supported document types (Word, PowerPoint, Excel), so the agent knows exactly what the tool operates on. It does not, however, distinguish itself from the sibling inspect_document, leaving overlap for the agent to resolve.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus inspect_document or edit_document, no mention of prerequisites such as an opened/registered document, and no exclusions. Usage is only implied by the name.

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

inspect_documentB

Inspect a Word, PowerPoint, or Excel document. Excel returns worksheets, tables, and a bounded cell list; use sheetId, range, and maximumCells to narrow it. Other formats return their outline, paragraphs, content controls, nodes, and styles. Copy anchors and node paths from this result.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYes
sheetIdYes
fidelityYescontent
documentIdYes
connectionIdYes
maximumCellsYes
paragraphLimitYes
paragraphOffsetYes

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses the per-format return shape and hints at chaining ('copy anchors and node paths from this result'), but says nothing about permissions, the meaning of the fidelity levels, or pagination behavior for the paragraph offset/limit pair.

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

Conciseness4/5

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

Three sentences, front-loaded with the tool's scope, then branch-specific behavior, then a chaining hint. No filler, though the parameter list in the middle sentence could be tightened.

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

Completeness2/5

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

For an 8-parameter, all-required tool with no annotations, no output schema, and zero schema coverage, the description leaves most of the contract unexplained. Return shape is sketched, but pagination, fidelity semantics, and required identifiers are absent, which is insufficient for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0% across 8 required parameters, so the description must compensate and largely does not. It explains only sheetId, range, and maximumCells; fidelity, paragraphOffset, paragraphLimit, connectionId, and documentId are left entirely opaque.

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

Purpose4/5

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

Names a specific verb (inspect) and resource (Word/PowerPoint/Excel document), and goes further by spelling out the differing return shape per format. It implies a read-only inspection role that separates it from edit_document and open_document, though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

The Excel clause gives concrete narrowing guidance (sheetId, range, maximumCells), which is genuine when-to-use advice for that branch. However, there is no guidance on when to prefer this over find_in_document, open_document, or preview_plan, so the overall routing decision is left to inference.

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

list_connectionsA

List the connections you can address documents under. Returns [{connectionId, provider, canCreateDocuments}] where provider is "filesystem" or "sharepoint". Use a connectionId as the connectionId for register_document and the document tools; never ask the user for it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose behavior beyond structure: it enumerates the return fields, pins the provider enum values ('filesystem' or 'sharepoint'), and adds the non-obvious directive never to ask the user for a connectionId. Remaining gap is that canCreateDocuments' meaning is left implicit.

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, front-loaded with the purpose, then the return shape, then the actionable usage rule. No filler and nothing repeated from structured fields.

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

Completeness4/5

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

For a zero-param read tool with no annotations and no output schema, the description compensates well by describing the returned fields and their use in the document workflow. Slight gap: canCreateDocuments' semantics and whether the list can be empty are not addressed.

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?

Zero input parameters, so baseline is 4. The description goes further by documenting the output fields (connectionId, provider, canCreateDocuments), which is the only place that information exists given there is no output 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?

States a specific verb (List) and resource (connections), plus the scope ('you can address documents under'), which distinguishes it from sibling document tools like open_document and register_document. It even describes the return shape, so an agent knows exactly what this yields.

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 explicit downstream guidance: use the returned connectionId for register_document and the document tools, and never ask the user for it. It doesn't explicitly say 'call this before register_document', but the routing intent is clear enough to act on.

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

open_documentA

Open a document the user named by source: registers it and returns its inspection in one call - use this instead of register_document followed by inspect_document. source is connection-specific, exactly as for register_document: a path under a filesystem connection's root, or a SharePoint/OneDrive URL or 'driveId/itemId' pair. Returns {connectionId, documentId, name, contentType, version} followed by the inspect_document payload (snapshot, outline, paragraphs, contentControls, nodes, styles). Keep documentId for follow-up calls; paging works as in inspect_document.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYes
sourceYes
sheetIdYes
fidelityYescontent
connectionIdYes
maximumCellsYes
paragraphLimitYes
paragraphOffsetYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does so well: it discloses the side effect (registers the document), the connection-specific nature of source, the accepted source formats (filesystem path, SharePoint/OneDrive URL, driveId/itemId), and the returned field set plus inspect payload. It omits permission/auth requirements and any idempotency or collision behavior, which keeps it short of a 5.

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?

Front-loaded with the core action and the sibling-routing instruction, then progressively discloses source formats, return fields, and paging. It is dense but every sentence conveys operational information; only the exhaustive enumeration of payload fields borders on excess.

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?

For an 8-parameter, no-annotation, no-output-schema composite tool, the description helpfully spells out the return shape and follow-up guidance. However, it leaves the fidelity/sheetId/range/maximumCells parameters unexplained, which is a notable gap given the complete absence of schema descriptions and annotations.

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 0%, so the description must compensate, and it only partially does: 'source' and the paragraph paging behavior are explained in useful detail. connectionId, fidelity, sheetId, range, and maximumCells are not described at all, leaving five of eight parameters without any semantics anywhere.

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

Purpose5/5

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

States a specific verb and resource ('Open a document the user named by source') and defines the composite behavior ('registers it and returns its inspection in one call'). It explicitly names the sibling tools it replaces, so an agent can distinguish it from register_document and inspect_document without opening any schema.

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?

Directly instructs 'use this instead of register_document followed by inspect_document', giving both the alternative and the condition that selects this tool. The follow-up note ('Keep documentId for follow-up calls; paging works as in inspect_document') further routes subsequent calls.

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

preview_document_mergeA

Preview ordered whole-document Word assembly without saving. requestJson contains sources [{connectionId, documentId}] in output order and optional options {title, author}. Returns a merge plan bound to exact input hashes, source counts, identifier remapping decisions, and blocking diagnostics. Source formatting is preserved within the documented compatibility scope; each document starts on a new page. This is assembly, not reconciliation of edited versions.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestJsonYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden, and it does so well: it states nothing is saved, that source formatting is preserved within a documented compatibility scope, that each document starts on a new page, and that the result is bound to exact input hashes. It does not discuss auth requirements or size/rate limits, leaving minor gaps.

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?

Four tightly packed sentences, front-loaded with the core action and scope, each carrying distinct information (behavior, input shape, return content, exclusion). No redundancy.

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

Completeness4/5

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

With no output schema and no annotations, the description supplies the return-value summary (merge plan, hashes, remapping decisions, blocking diagnostics) as well as the input shape and safety profile, making it largely self-sufficient. A little more on preconditions or expected failure modes would round it out.

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

Parameters4/5

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

Schema description coverage is 0% and there are no nested-object hints, so the description must explain the single requestJson parameter — which it does by spelling out sources [{connectionId, documentId}] in output order and optional options {title, author}. This meaningfully compensates for the undocumented 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?

States a specific verb and resource ('Preview ordered whole-document Word assembly') and explicitly routes away from the wrong interpretation ('This is assembly, not reconciliation of edited versions'), which distinguishes it from the compare_documents sibling.

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?

'Preview ... without saving' clearly signals the dry-run context before an actual apply, and the closing sentence excludes the reconciliation use case. It stops short of naming compare_documents or apply_plan explicitly as the alternatives, so 4 rather than 5.

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

preview_planA

Dry-run a DocumentPlan JSON against (connectionId, documentId). Returns {isValid, committed, receipt, sourceDocumentId, outputConnectionId, outputDocumentId, outputVersion, outputName, outputContentType, changes, errors}; the output fields are null and committed is false. Plan shape: { "snapshot": { "eTag": "" }, "revision": { "author": "Review Bot", "timestampUtc": "2026-09-09T10:00:00Z" }, "operations": [ ... ] }. revision controls Word's displayed revision identity; omit timestampUtc to use one engine timestamp for the whole apply. The snapshot detects drift in Word text-host XML or PowerPoint slide/notes XML; other parts rely on anchors and provider version checks. Omit it only intentionally. Do not set contractVersion. Each operation is one object. Concrete examples:

// Replace text: { "op": "changeText", "target": { "paraId": "w14:...", "expect": "Acme Corp", "occurrence": 0 }, "with": "Globex Inc.", "mode": "Tracked" }

// Unified formatting (paragraph/run/table/row/cell/image): { "op": "format", "target": { "paraId": "w14:...", "expect": "important", "occurrence": 0 }, "highlight": "yellow", "bold": true, "color": "FF0000" } { "op": "format", "target": { "kind": "table", "path": "table#0" }, "styleId": "TableGrid", "borderStyle": "single" } { "op": "format", "target": { "kind": "image", "path": "image#0" }, "widthPx": 320, "heightPx": 200 }

// Fill / comment / insert paragraph / setProperty: { "op": "fill", "target": { "tag": "ClientName" }, "value": "Globex" } { "op": "comment", "target": { "paraId": "w14:...", "expect": "..." }, "text": "Confirm this." } { "op": "insert", "target": { "paraId": "w14:...", "expect": "..." }, "position": "After", "text": "New paragraph." } { "op": "insertParagraphs", "target": { "paraId": "w14:...", "expect": "..." }, "position": "After", "paragraphs": [{ "text": "First" }, { "text": "Second" }] } { "op": "removeParagraph", "target": { "paraId": "w14:...", "expect": "Complete paragraph text" } } { "op": "setProperty", "target": { "kind": "docProperty", "path": "core/title" }, "value": "My Title" }

// Every verb above that changes Word content also takes "mode": "Tracked" (the default - the edit lands as a redline a reviewer accepts or rejects) or "Direct". A deck refuses "Tracked": PresentationML has no revision markup.

// Review an existing redline. Revision paths come from inspect_document.nodes (kind "revision"): 'ins#7', 'del#7', 'markIns#7', 'rowIns#7', 'cellDel#7', 'runFormat#7', 'paraFormat#7'. 'all' takes every one; 'author:' takes one person's: { "op": "revision", "target": { "kind": "revision", "path": "all" }, "action": "Accept" } { "op": "revision", "target": { "kind": "revision", "path": "author:Jane Doe" }, "action": "Reject" }

// Reply to, resolve, or delete an existing comment (comment paths from inspect_document.nodes, kind "comment"): { "op": "comment", "target": { "kind": "comment", "path": "comment#1" }, "action": "Reply", "text": "Forty-five, per the MSA." } { "op": "comment", "target": { "kind": "comment", "path": "comment#1" }, "action": "Resolve" } { "op": "comment", "target": { "kind": "comment", "path": "comment#1" }, "action": "Remove" }

// Define a style once instead of repeating direct formatting on every paragraph. Word only. // Define it first, then apply it with format's styleId - both can sit in the same plan: { "op": "defineStyle", "styleId": "Quote", "name": "Pull Quote", "basedOn": "Normal", "next": "Normal", "fontFamily": "Georgia", "sizeHalfPoints": 24, "italic": true, "color": "444444", "alignment": "center", "indentLeftTwips": 720, "spacingBeforeTwips": 240 } { "op": "format", "target": { "paraId": "w14:...", "expect": "" }, "styleId": "Quote" } // type is paragraph (default), character or table. outlineLevel 1-9 puts a heading in the outline. // Defining a style that exists updates it; properties you leave out keep their values. Styles are // never deleted. A style cannot carry a highlight - w:highlight belongs to a run, so use color here.

// Word page geometry, breaks, and notes. All measurements are twips (1440 to the inch). Word only: { "op": "pageSetup", "paperSize": "A4", "orientation": "Landscape", "marginTopTwips": 720, "marginLeftTwips": 1080 } { "op": "insertBreak", "target": { "paraId": "w14:...", "expect": "..." }, "kind": "Page", "position": "After" } { "op": "insertBreak", "target": { "paraId": "w14:...", "expect": "..." }, "kind": "SectionNextPage" } // then pageSetup with a target inside the new section { "op": "note", "target": { "paraId": "w14:...", "expect": "thirty days" }, "kind": "Footnote", "text": "Subject to clause 8.2." } { "op": "note", "target": { "kind": "note", "path": "footnote#1" }, "action": "Update", "text": "Revised wording." } { "op": "note", "target": { "kind": "note", "path": "footnote#1" }, "action": "Remove" }

// Insert a whole new table after a paragraph, or remove an entire table (table path from inspect_document.nodes): { "op": "insertTable", "target": { "paraId": "w14:...", "expect": "..." }, "position": "After", "table": { "headers": ["Region", "Q1"], "rows": [["NL", "41850"]] } } { "op": "removeTable", "target": { "kind": "table", "path": "table#0" } }

// Add or remove table rows / columns; insert or remove image; copy or clear styles. Paths come from inspect_document.nodes: { "op": "insertTableRows", "target": { "kind": "table", "path": "table#0" }, "rows": [["NL","17","41850"]], "position": "End" } { "op": "repeatTableRow", "target": { "kind": "table", "path": "table#0" }, "templateRowIndex": 1, "records": [{ "Description": "Consulting", "Amount": "1200.00" }] } { "op": "removeTableRows", "target": { "kind": "table", "path": "table#0" }, "onlyIfEmpty": true } { "op": "insertImage", "target": { "paraId": "w14:...", "expect": "..." }, "base64Bytes": "iVBORw0KGgo...", "imageType": "png", "widthPx": 200, "heightPx": 80 } { "op": "insertImage", "target": { "paraId": "w14:...", "expect": "..." }, "imageConnectionId": "images", "imageDocumentId": "", "imageType": "png", "widthPx": 200, "heightPx": 80 } { "op": "removeImage", "target": { "kind": "image", "path": "image#0" } } { "op": "backgroundImage", "base64Bytes": "iVBORw0KGgo...", "imageType": "png", "opacity": 0.2 } { "op": "backgroundImage", "target": { "kind": "slide", "path": "slide#256" }, "base64Bytes": "iVBORw0KGgo...", "opacity": 0.15 } { "op": "headerFooter", "header": "Northwind Traders", "footer": "Confidential", "showPageNumber": true, "alignment": "edges", "differentFirstPage": true }

// Native PowerPoint chart with an editable embedded workbook: { "op": "insertChart", "target": { "kind": "slide", "path": "slide#256" }, "kind": "ClusteredColumn", "categories": ["Q1","Q2"], "series": [{ "name": "Revenue", "values": [10,12] }], "title": "Revenue", "description": "Quarterly revenue" }

// Excel cells and table rows; sheet ids and table paths come from inspection: { "op": "setCell", "target": { "sheetId": 7, "address": "B2" }, "formula": "SUM(B3:B8)" } { "op": "appendTableRows", "target": { "kind": "spreadsheetTable", "path": "table#7/Sales" }, "rows": [["APAC","15"]] }

ParametersJSON Schema
NameRequiredDescriptionDefault
planJsonYes
documentIdYes
connectionIdYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full load and mostly delivers: it discloses the exact return shape, that output fields are null and committed is false (i.e. nothing is written), the drift-detection behavior of the snapshot, and engine behaviors like a shared timestamp when timestampUtc is omitted. It does not mention auth/permission requirements or rate limits, which is the remaining gap.

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

Conciseness3/5

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

The first sentence is well front-loaded and the body is organized under comment-delimited headings, which aids scanning. But the length is extreme for a tool description; much of the operation catalog reads as a DSL reference manual, and trimming examples to the least obvious verbs would preserve the value with far less bulk.

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?

There is no output schema, so the description correctly enumerates the return object itself. For a tool whose real complexity lives in an untyped JSON string, the coverage is strong; the residual gap is the two identity parameters, whose provenance (inspection, connection listing) is never stated.

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

Parameters4/5

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

Schema coverage is 0% and planJson is an opaque string, so the description must carry all semantics — and it does, exhaustively documenting the plan envelope (snapshot/revision/operations) and every operation verb with concrete examples. The only shortfall is connectionId/documentId, which are mentioned as a tuple but never explained (their source, format, or that list_connections provides them).

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?

Opens with a precise verb+resource: dry-run a DocumentPlan against (connectionId, documentId). The word 'dry-run' combined with 'committed is false' immediately distinguishes it from apply_plan, so an agent can route between the two without opening either schema.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the dry-run framing suggests validating before a real apply, and the snapshot guidance says 'Omit it only intentionally', but the description never explicitly says 'call this before apply_plan' or when to skip previewing. It gives rich guidance about how to author the plan, not about when to invoke this tool versus its siblings.

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

register_documentA

Register an existing document with a host-configured provider connection and return its opaque documentId. source is connection-specific: for a filesystem connection, a path under its root; for a SharePoint connection, the document's SharePoint/OneDrive URL (e.g. 'https://contoso.sharepoint.com/:w:/s/…') or a 'driveId/itemId' pair (e.g. 'b!9a3f…/01ABCDEF'). Never pass credentials. Returns {connectionId, documentId, name, contentType, version}.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYes
connectionIdYes

TDQS

A3.9/5.0
Behavior4/5

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

Discloses output format, warns not to pass credentials, and explains source format specifics. With no annotations, it provides good behavioral context, though could mention error handling or idempotency.

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?

Appropriately sized with front-loaded action and return info. Includes examples and warning, no unnecessary fluff, though could be slightly more compact.

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 purpose, parameter semantics for source, output format, and a safety note. Missing error behavior and connectionId details, but sufficient for a simple registration tool with two parameters.

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

Parameters3/5

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

Schema coverage is 0%, but description explains 'source' parameter in detail with examples. 'connectionId' is not described beyond being a connection identifier, leaving some ambiguity.

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?

Clearly states it registers a document and returns a documentId. Explains source formats for different connections, distinguishing it from sibling tools like find_in_document or list_connections.

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

Usage Guidelines3/5

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

Implied usage (registering a document) but no explicit when-to-use vs alternatives or prerequisites. Sibling tools are different enough that context is clear, but lacks direct guidance.

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

remove_documentA

Remove a document registration from a provider connection by (connectionId, documentId). Only the registration is removed - the underlying file is never deleted. Returns {removed, connectionId, documentId}.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYes
connectionIdYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description adds key behavioral detail: 'the underlying file is never deleted' and specifies the return format. It does not cover idempotency or error states, but the most critical trait is disclosed.

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?

Two sentences, no redundancy, front-loaded with the action and key constraint. Every word adds value.

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 no annotations, no output schema, and 0% param coverage, the description covers the essential purpose, key behavior, and return structure. It lacks error handling or prerequisites, but for a simple removal tool it is largely sufficient.

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

Parameters3/5

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

Schema coverage is 0%, so the description must compensate. It names the required parameters (connectionId, documentId) and indicates their role via 'by (connectionId, documentId)', but adds no additional detail about format or constraints, which is minimal for the context.

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 'Remove' and the resource 'document registration', specifying it only removes the registration without deleting the file. It distinguishes from siblings like register_document by its inverse action.

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

Usage Guidelines3/5

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

The description implies when to use (to remove a registration) but lacks explicit guidance on when not to use it or alternatives. No mention of prerequisites or context compared to siblings like list_connections or inspect_document.

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

Tool Schema Changelog

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

  1. 2 tool updatesv0.8.0
    • Addedcompare_documents
    • Addedpreview_document_merge
  2. 5 tool updatesv0.7.0
    • Changedapply_plan1 field changed
      • changedInput schema / properties / saveMode / default
        Previous value: -"NewVersion"New value: +"Replace"
    • Addededit_document
    • Changedfind_in_document2 fields changed
      • addedInput schema / properties / spreadsheetValueView
        Added value: +{
        +  "default": "both",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "connectionId",
        -  "documentId",
        -  "pattern",
        -  "regex",
        -  "wholeWord",
        -  "caseSensitive"
        -]New value: +[
        +  "connectionId",
        +  "documentId",
        +  "pattern",
        +  "regex",
        +  "wholeWord",
        +  "caseSensitive",
        +  "spreadsheetValueView"
        +]
    • Changedinspect_document4 fields changed
      • addedInput schema / properties / maximumCells
        Added value: +{
        +  "default": 1000,
        +  "type": "integer"
        +}
      • addedInput schema / properties / range
        Added value: +{
        +  "default": "",
        +  "type": "string"
        +}
      • addedInput schema / properties / sheetId
        Added value: +{
        +  "default": 0,
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "connectionId",
        -  "documentId",
        -  "fidelity",
        -  "paragraphOffset",
        -  "paragraphLimit"
        -]New value: +[
        +  "connectionId",
        +  "documentId",
        +  "fidelity",
        +  "paragraphOffset",
        +  "paragraphLimit",
        +  "sheetId",
        +  "range",
        +  "maximumCells"
        +]
    • Addedopen_document
  3. 7 tool updates
    • First observedapply_plan
    • First observedfind_in_document
    • First observedinspect_document
    • First observedlist_connections
    • First observedpreview_plan
    • First observedregister_document
    • First observedremove_document

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation4/5

Most tools have clearly distinct purposes, and the descriptions explicitly distinguish convenience wrappers (open_document = register+inspect, edit_document = register+resolve+apply) from their component tools. The main residual overlap is among register_document/open_document/edit_document and among preview_plan/preview_document_merge/compare_documents, where an agent must read carefully to pick correctly.

Naming Consistency5/5

All tools use snake_case with a leading verb and a noun object (list_connections, register_document, inspect_document, apply_plan, preview_plan, etc.). The pattern is predictable throughout, with only mild variation in preview_document_merge's three-word form.

Tool Count5/5

Eleven tools is well-scoped for a multi-format document editing server, comfortably within the 3-15 range. Each tool earns its place: connection management, registration, inspection, search, preview/apply, and comparison/merge operations.

Completeness4/5

The surface covers the core lifecycle well: list connections, register/remove documents, open/inspect, find, preview and apply plans, compare, and merge. Minor gaps exist, such as no explicit create-from-scratch tool or document listing under a connection, though apply_plan's NewDocument saveMode partially covers creation.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

Appeared in Searches