Announcing CIMD support for MCP Client registration
Learn more

Excel MCP vs Excel API for AI Agents Development

Saif Ali Shaik
Founding Developer Advocate

Microsoft does not ship an Excel MCP server for third-party agents. Its hosted Work IQ MCP treats a workbook as a document to search, fetch, or hand to Copilot, while every cell-level operation lives on the Microsoft Graph Excel API, which is delegated-only and tenant-throttled. Community servers fill the gap in three shapes, none maintained by Microsoft. This guide compares what each path lets an agent do with a spreadsheet, the Entra token each one puts you on, and how to run either across many customer tenants in production.

TL;DR

  • Microsoft does not ship an Excel MCP server for third-party agents. Its hosted option, Work IQ MCP, exposes generic Microsoft 365 tools (fetch, fetch_blob, ask, retrieve, and others) and documents no workbook, worksheet, or range operations. Agent 365's app-specific servers include Word and OneDrive but not Excel, and Microsoft marks them legacy and not for new projects. Every "Excel MCP" that edits cells is a community server.
  • The Microsoft Graph Excel API (/workbook on a driveItem) is the only documented programmatic path to cells, tables, charts, named items, PivotTables, and Excel functions. It works on Office Open XML workbooks in OneDrive for Business and SharePoint; Microsoft's overview says workbooks in consumer OneDrive are not supported.
  • Every workbook endpoint is delegated-only. The permission tables list Application permissions as "Not supported," so a headless Excel agent still needs a signed-in user's token and a refresh token to keep it alive.
  • Work IQ is the right fit when a user asks Microsoft 365 Copilot a question about a file. The Graph Excel API is the right fit when the agent must read a specific range, append rows, refresh a PivotTable, or write formulas, and when it must respect Excel's session model and its per-tenant throttling limit of 1,500 requests per 10 seconds per app.
  • Scalekit's microsoftexcel connector stores each user's Microsoft OAuth tokens in the token vault, refreshes them, and exposes 47 prebuilt Graph Excel tools, so the MCP vs API decision doesn't change your auth infrastructure.

The decision your Excel agent forces first

Your agent needs to work with your customers' spreadsheets: read the forecast tab, append this week's numbers to a table, refresh the PivotTable, and send the finance lead a chart. You search for an Excel MCP server and find community servers that open local .xlsx files, community servers that wrap Microsoft Graph, and Microsoft's own Work IQ, which can hand Copilot a file and ask it a question but documents no tool for writing a cell. So the real choice is not "official MCP vs official API." It is a generic Microsoft 365 MCP or a third-party wrapper, against the Graph Excel API your agent could call directly. Here's how to pick.

What Excel MCP and Excel API actually are

Excel MCP

Microsoft's current MCP story for Microsoft 365 is Work IQ MCP: one endpoint, authenticated with Microsoft Entra ID, with entity tools (fetch, fetch_blob, create_entity, update_entity, delete_entity, do_action, call_function), Copilot tools (ask, retrieve, list_agents), and schema tools (get_schema, search_paths). The tools take relative Graph-style resource paths such as /me/messages and discover supported paths at runtime. The tool reference names no /workbook path; fetch_blob returns whole Office files as Base64, and ask accepts OneDrive or SharePoint file URLs as context for Microsoft 365 Copilot. The retrieve tool is in public preview. Work IQ is billed through Copilot Credits on a usage-based plan, and a Global Administrator has to create its service principal in the tenant first. Docs: Work IQ MCP overview.

The other first-party servers do not reach workbook contents. Agent 365's MCP server list has Word, OneDrive, SharePoint, Mail, Calendar, Teams, and User servers, all preview, all labeled legacy and "only intended for backward compatibility purposes"; there is no Excel server. The Microsoft MCP Server for Enterprise at https://mcp.svc.cloud.microsoft/enterprise is a public preview for read-only Entra identity and directory queries. Copilot in Excel, including its agent-style editing mode, runs inside the Excel app; Microsoft documents no MCP or API surface for it.

Community servers fill the gap in three shapes. File-based servers such as excel-mcp-server edit .xlsx files on disk without Excel installed and describe no authentication. Desktop servers such as mcp-server-excel drive Excel through COM and require Windows, Excel 2016 or later, and an interactive desktop. Graph-based servers such as ms-365-mcp-server wrap Microsoft Graph, Excel included, and sign in with MSAL device code or authorization code flow. None are maintained by Microsoft.

Excel API

The Microsoft Graph Excel API hangs off a drive item: /me/drive/items/{id}/workbook/ or /me/drive/root:/{item-path}:/workbook/. It covers worksheets, ranges and usedRange, tables with their rows, columns, sort, and filter, charts with image rendering and setData, named items, PivotTables, comments, and calls into Excel's built-in functions such as pmt. It supports only Office Open XML workbooks; .xls is not supported. Docs: Excel in Microsoft Graph and best practices.

Auth is a Microsoft Entra access token with Files.Read or Files.ReadWrite, or the .All variants for files the user can reach beyond their own drive. Office Add-ins built on Office.js are a separate surface: they run inside an open Excel client, not from your agent's backend. Docs: Excel add-ins overview.

What your agent can actually do

Capability
Work IQ MCP
Community Excel MCP servers
Graph Excel API
Find a workbook by name or content
Yes
Limited: Local paths for file-based servers
Yes
Ask a natural-language question about a file
Yes: Answered by Microsoft 365 Copilot
No
No: Your agent does the reasoning
Read a specific cell range or a sheet's used range
No: No documented paths
Limited: Local files, or depends on the Graph wrapper
Yes
Write values, formulas, and number formats
No
Limited: Local files, or depends on the server
Yes
Append and list table rows
No
Limited
Yes
Sort and filter tables
No
Limited
Yes
Create charts and render chart images
No
Limited: Create in local files
Yes
Refresh PivotTables
No
Limited: COM-based servers on Windows
Yes
Evaluate an Excel function without writing a cell
No
Limited
Yes
Workbook sessions for batched calls
No
No: Not applicable to local files
Yes
Export a workbook to PDF
Yes
No
Yes
Background access with no signed-in user
No
Limited: Local file access, no Microsoft identity
No: Application permissions not supported on workbook endpoints

The pattern is clear. Work IQ treats a workbook as a document to search, fetch, or hand to Copilot. The Graph Excel API treats it as a structured object with sheets, ranges, and tables. An agent that has to change a specific cell in a cloud workbook is on the Graph Excel API, directly or through a community wrapper.

What the MCP path makes easier

Work IQ's search_paths and get_schema tools let the model discover resource paths and schemas at runtime, and ask delegates the reasoning to Microsoft 365 Copilot under the user's own permissions and sensitivity labels. For "summarize the variance in the Q3 forecast file," that is less code than reading ranges and reasoning over them yourself.

A Graph-based community server gives you ready-made tool schemas for the workbook API, and that is real work saved. Range addresses must match the shape of 2-D values arrays, null in an update array means "leave this cell alone," "" clears it, and unbounded ranges like C:C return null for cell-level properties. Writing the schema is the hard part. Not the API call.

The tradeoff is ownership. A local file-based server never touches the copy your customers edit in OneDrive. A Graph wrapper's schemas drift on its maintainer's schedule, not Microsoft's.

The auth path each one puts you on

Excel MCP: Entra for Work IQ, whatever you configure for community servers

Work IQ uses Microsoft Entra ID. Its permission, WorkIQAgent.Ask, is delegated only, requires admin consent, and "includes read and write access to Microsoft 365 resources that are accessible to Work IQ agents and scoped to the signed-in user." Microsoft documents application-only auth as not supported. That is the right model for a user in an MCP host, and a blocker for a scheduled job with nobody signed in.

Community servers vary. File-based servers authenticate nothing; whoever can reach the server can edit the files under its root folder. Graph-based servers sign a user in with device code or authorization code flow, or accept a bearer token from an environment variable that they do not refresh. That works for one developer on one tenant. It is a single-user solution.

Excel API: delegated tokens only, scoped by Files permissions

Every workbook endpoint takes Authorization: Bearer {token} from Microsoft Entra ID. The permission tables for listing worksheets and updating a range both show Files.ReadWrite for work or school and personal accounts and "Not supported" for Application. There is no client-credentials path to a cell. A background agent has to hold a user's refresh token and act as that user.

Scope choice sets the blast radius. Files.ReadWrite reaches the user's own drive. Files.ReadWrite.All reaches every file that user can open, including SharePoint libraries and files shared with them, which is what most finance and ops agents need and what a security reviewer will ask about. What the user can't do, the agent can't do; with .All scopes, what the user can do is often a lot.

Two details trip teams. Microsoft's Excel overview says workbooks in OneDrive consumer are not supported, so an Entra app registered for "personal Microsoft accounts" can sign those users in and still fail on workbook calls. And customer tenants can restrict user consent to third-party apps, so the first user in a locked-down tenant may need their IT admin to approve your app before the consent screen succeeds.

Both paths still need per-user isolation

In a multi-tenant B2B agent, MCP gives you a credential per user and the direct API gives you a credential per user. In neither case does the path itself solve storage, rotation, or revocation; those are infrastructure problems regardless of which path you choose.

Microsoft adds a tenant wrinkle. Each customer is its own Entra tenant with its own consent policy, Conditional Access rules, and admin who can revoke your app's grant for everyone at once. Your credential store has to bind each refresh token to its user and its tenant, and detect when a tenant-wide revocation turns hundreds of connected accounts invalid in one afternoon.

Recommended reading: OAuth vs API keys for AI agents

What you own in production

On the MCP path

With Work IQ, Microsoft owns the tools and the Copilot reasoning behind ask. You own the Entra tokens, the Copilot Credits bill, and the tenant enablement step for every customer. You also own the gap: any task that needs a cell-level write falls back to Graph anyway.

With a community server, you own more than you would with the API. You run and patch it, you own the token it reads, and you depend on a maintainer outside Microsoft. A file-based server adds a sync problem: the workbook it edits is a copy, and the version in SharePoint keeps changing without it.

On the API path

You own schemas, sessions, retries, and the token lifecycle. Sessions are the Excel-specific part. A persistent session saves changes; a non-persistent session discards them when it expires; sessionless calls work but make Excel locate the workbook on every request. Microsoft recommends a session for any multi-call workflow and notes that persistent sessions typically expire after about 5 minutes of inactivity and non-persistent ones after about 7, returning 404 when they do. Session creation on a large workbook can be a long-running operation: send Prefer: respond-async, accept 202 Accepted, and poll the Location header about every 30 seconds.

Throttling is per workbook and per tenant. Graph caps Excel at 5,000 requests per 10 seconds per app across all tenants and 1,500 per 10 seconds per app per tenant. Microsoft advises against parallel requests to the same workbook, especially writes: send the next request only after the current one succeeds. Throttled responses can carry Retry-After, and error codes such as tooManyRequestsUncategorized and transientFailure mean wait out the cooldown, while payloadTooLargeUncategorized and unsupportedWorkbook mean do not retry the same request. Ranges are capped at 5 million cells; rangeExceedsLimit means split the read. For a 502 or 503 on a sessionful request with no known second-level code, recreate the session.

Schema drift and versioning

The Excel API ships under Graph's v1.0 endpoint, so you pin to a stable contract and adopt changes when you choose. Work IQ's tools are generic, so they do not drift per workload, but Microsoft is already steering Agent 365 users off the app-specific servers. On the community MCP path, the maintainer decides when to adopt a change for you.

When to use MCP, when to use the API

Use Excel MCP when

  • A user in an MCP host asks "what changed in the Q3 forecast workbook?" and Work IQ's ask with the file's URL answers it under that user's permissions.
  • The agent searches across OneDrive and SharePoint for the right workbook with retrieve before a human opens it, and never writes to it.
  • A single analyst wants a local file-based server to clean up .xlsx exports on their own machine, where no Microsoft identity is involved.
  • You are prototyping a spreadsheet assistant and want to learn which questions matter before writing tool definitions for the workbook API.

Use the Excel API when

  • The agent writes to a specific place: appending a row to Table1 with microsoftexcel_add_table_row after every closed deal, or writing a month's actuals into B2:M2.
  • The workflow is a deterministic pipeline: open a session, refresh the PivotTables, render a chart with microsoftexcel_get_chart_image, and close the session.
  • The agent runs on a schedule and needs one consented user's refresh token per tenant, refreshed proactively, because there is no app-only path to the workbook.
  • Volume matters: you need sequential writes per workbook, Retry-After handling, and a budget against 1,500 requests per 10 seconds per tenant.

The credential problem that exists on both paths

Both paths hand you a credential per user. Neither hands you a vault. In a multi-tenant agent, 40 customer tenants with 6 users each is 240 Microsoft refresh tokens, each tied to an Entra tenant whose admin can revoke your app's consent, enforce Conditional Access, or change the scopes users are allowed to grant. Each one must be stored encrypted, bound to its user and tenant, refreshed before it expires, and revoked when an employee leaves or a customer churns.

The token type does not change between paths. Work IQ and a Graph-based community server both run on delegated Entra tokens, the same kind the workbook API uses directly. The tempting shortcut, one admin's token per customer shared by every user, collapses 240 credentials into 40 and gives every user of your agent the admin's Files.ReadWrite.All reach across that customer's SharePoint. Fewer secrets, larger blast radius per secret.

Scalekit's Microsoft Excel connector runs the OAuth flow, stores each user's tokens in the token vault, and refreshes them, so the MCP vs API decision doesn't change your auth infrastructure. Your agent passes an identifier; the token never enters the agent runtime or the LLM context.

Recommended reading: why a token vault matters for AI agent workflows

How to connect an Excel agent with Scalekit

Scalekit's microsoftexcel connector is an API-path connector built on the Microsoft Graph Excel API, with 47 tools (16 read, 24 write, 7 destructive). It authenticates with OAuth 2.0 through Microsoft Entra ID: each user signs in to Microsoft once, and Scalekit stores and refreshes their tokens. The tools address workbooks by OneDrive item_id, and most accept an optional session_id from microsoftexcel_create_session.

Prerequisites and the connection name

Create a Microsoft Excel connection in AgentKit > Connections in the Scalekit dashboard. The name you give it is the connection_name your code passes, and the string must match the dashboard exactly. This is the most common integration error. Copy SCALEKIT_ENVIRONMENT_URL, SCALEKIT_CLIENT_ID, and SCALEKIT_CLIENT_SECRET from Developers > API Credentials into .env.

The connection can use Scalekit's OAuth app or your own. To use your own, copy the redirect URI from the Scalekit connection (https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback), register an app in Microsoft Entra ID > App registrations with that URI as a Web redirect, create a client secret, and enter the client ID, secret, and Microsoft Graph scopes in the connection. Request Files.ReadWrite if users only work in their own OneDrive, and Files.ReadWrite.All if they work in SharePoint or shared files.

The Excel tools need an item_id. To resolve one from a file name or path, also create a OneDrive connection; this guide names it onedrive.

pip install scalekit-sdk-python python-dotenv langchain-openai

Authorize each user once

get_or_create_connected_account returns the user's connected account. If it is not ACTIVE, get_authorization_link returns a Microsoft consent link. The agent never sees the token.

import os from dotenv import load_dotenv from scalekit import ScalekitClient load_dotenv() scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions CONNECTION_NAME = "microsoftexcel" # must match the connection name in AgentKit > Connections ONEDRIVE_CONNECTION = "onedrive" # must match the connection name in AgentKit > Connections identifier = "user_123" # your app's stable ID for this user for connection in (CONNECTION_NAME, ONEDRIVE_CONNECTION): account = actions.get_or_create_connected_account( connection_name=connection, identifier=identifier, ) if account.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=connection, identifier=identifier, ) print(f"Authorize {connection}:", link.link) input("Press Enter after authorizing...") account = actions.get_or_create_connected_account( connection_name=connection, identifier=identifier, ) if account.connected_account.status != "ACTIVE": raise RuntimeError(f"{connection} is {account.connected_account.status}, not ACTIVE")

Retrieve the Excel tools this user can call

This is not a catalog load. The agent asks for the tools this user's connected account is authorized to call, and narrows them to the six a read-only reporting agent needs. Loading all 47 Excel tools would put microsoftexcel_delete_worksheet, microsoftexcel_delete_table, and five other destructive tools in front of a model whose job is to read.

tools = actions.langchain.get_tools( identifier=identifier, connection_names=[CONNECTION_NAME], tool_names=[ "microsoftexcel_list_worksheets", "microsoftexcel_get_used_range", "microsoftexcel_get_range", "microsoftexcel_list_tables", "microsoftexcel_list_table_rows", "microsoftexcel_calculate_function", ], page_size=100, ) tool_map = {t.name: t for t in tools} print(sorted(tool_map))

Run the agent loop

The loop runs until the model stops requesting tools. Every tool call executes with this user's Microsoft credential, so the agent can only open workbooks the user can open.

from langchain_core.messages import HumanMessage, SystemMessage, ToolMessage from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) WORKBOOK_ITEM_ID = os.environ["EXCEL_WORKBOOK_ITEM_ID"] # OneDrive item ID of the .xlsx file messages = [ SystemMessage( "You analyze Excel workbooks. Call microsoftexcel_list_worksheets first, then " "microsoftexcel_get_used_range to read a sheet before asking for specific ranges." ), HumanMessage( f"In workbook {WORKBOOK_ITEM_ID}, find the sheet with monthly revenue by region " "and tell me which region grew the most between the first and last month." ), ] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: tool = tool_map.get(tc["name"]) if tool: result = tool.invoke(tc["args"]) else: result = f"Unknown tool: {tc['name']}" messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

Deterministic calls with execute_tool

For pipelines, skip the model. execute_tool runs one tool with a fixed input and returns data plus an execution_id you can log. This nightly job resolves a workbook by path, opens a persistent session, appends a row to a table, refreshes the PivotTables on the summary sheet, and closes the session.

item = actions.execute_tool( tool_name="onedrive_get_item_by_path", tool_input={"item_path": "Documents/Finance/Pipeline.xlsx"}, connection_name=ONEDRIVE_CONNECTION, identifier=identifier, ) item_id = item.data["id"] # driveItem ID returned by Microsoft Graph session = actions.execute_tool( tool_name="microsoftexcel_create_session", tool_input={"item_id": item_id, "persist_changes": True}, connection_name=CONNECTION_NAME, identifier=identifier, ) session_id = session.data["id"] # Graph returns the workbook session ID as "id" try: row = actions.execute_tool( tool_name="microsoftexcel_add_table_row", tool_input={ "item_id": item_id, "table_id": "Deals", "values": [["2026-10-27", "Acme Corp", 48000, "Closed Won"]], "session_id": session_id, }, connection_name=CONNECTION_NAME, identifier=identifier, ) print(row.execution_id, row.data) refresh = actions.execute_tool( tool_name="microsoftexcel_refresh_all_pivot_tables", tool_input={ "item_id": item_id, "worksheet_id": "Summary", "session_id": session_id, }, connection_name=CONNECTION_NAME, identifier=identifier, ) print(refresh.execution_id, refresh.data) finally: actions.execute_tool( tool_name="microsoftexcel_close_session", tool_input={"item_id": item_id, "session_id": session_id}, connection_name=CONNECTION_NAME, identifier=identifier, )

microsoftexcel_calculate_function runs an Excel function without writing a cell. Function names are lowercase, and arguments uses the function's parameter names.

payment = actions.execute_tool( tool_name="microsoftexcel_calculate_function", tool_input={ "item_id": item_id, "function_name": "pmt", "arguments": {"rate": 0.045, "nper": 12, "pv": -1250}, }, connection_name=CONNECTION_NAME, identifier=identifier, ) print(payment.execution_id, payment.data)

The Excel tools take a OneDrive item_id and no drive or site ID. For a workbook in a SharePoint document library, find its drive with the onedrive connector's drive tools, then make a proxied Graph call to /v1.0/drives/{drive-id}/items/{item-id}/workbook/... on the same connected account through actions.request(). Same token vault, same user, no new credential.

Multi-tool, multi-tenant Excel agents on a virtual MCP server

The microsoftexcel connector has 47 tools. At roughly 200 tokens per tool definition, that is about 9,400 tokens of context before the agent does any work, and the model is choosing from a decision space that includes deleting worksheets, tables, and named items. Add OneDrive's file tools and Slack, and the number grows. The fix is not better prompting. It is surface reduction. A Scalekit virtual MCP server declares exactly which tools an agent role can see, and session tokens keep each run bound to one user's connected accounts. Docs: set up a virtual MCP server.

Create the server once per agent role

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = actions.mcp.create_config( name="excel-weekly-revenue-to-slack", description="Reads revenue workbooks, renders a chart, and posts a summary to Slack", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="onedrive", tools=["onedrive_search_drive_items"], ), McpConfigConnectionToolMapping( connection_name="microsoftexcel", tools=[ "microsoftexcel_list_worksheets", "microsoftexcel_get_used_range", "microsoftexcel_list_charts", "microsoftexcel_get_chart_image", ], ), McpConfigConnectionToolMapping( connection_name="slack", tools=["slack_send_message"], ), ], ) print(vmcp.config.id, vmcp.config.mcp_server_url)

Mint a session token per user, per run

One server definition serves every user. Before each run, check that the user's accounts are active and mint a short-lived session token scoped to them. Any MCP client that speaks streamable HTTP can connect; this example uses langchain-mcp-adapters (pip install langchain-mcp-adapters) and passes the token as a Bearer header.

import asyncio from datetime import timedelta from langchain_mcp_adapters.client import MultiServerMCPClient config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url user_id = "user_123" accounts = actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=user_id, include_auth_link=True, ) not_ready = [ a for a in accounts.connected_accounts if str(a.connected_account_status).upper() != "ACTIVE" ] for a in not_ready: print(f"{a.connection_name} is {a.connected_account_status}: {a.authentication_link}") if not_ready: raise RuntimeError("Connect the accounts above before starting this run") session_token = actions.mcp.create_session_token( mcp_config_id=config_id, identifier=user_id, expiry=timedelta(minutes=30), ).token async def load_tools(): client = MultiServerMCPClient( { "scalekit": { "transport": "streamable_http", "url": mcp_server_url, "headers": {"Authorization": f"Bearer {session_token}"}, } } ) return await client.get_tools() mcp_tools = asyncio.run(load_tools()) print([t.name for t in mcp_tools])

The agent sees six tools, none of them destructive. The endpoint is static; the identity is per-user.

Observability: every Excel action tied to a user

Every execute_tool call returns an execution_id, and every execution is attributed to a connected account, which maps to one of your users and one customer tenant. When a finance lead asks which agent run overwrote B2:M2 on the forecast sheet, the answer is a lookup, not an investigation. Microsoft 365 records the change against the signed-in user on its side; your execution log records which run and which tool asked for it.

A shared token breaks both halves. If every user of your agent runs on one admin's delegated token, Microsoft 365 attributes every edit to that admin, and your side can only prove that the shared credential did it. Workbook version history becomes a list of changes by one person who made none of them. Shared credentials are a single-user solution. They do not survive a second user.

Recommended reading: audit trails for agent auth

Which one to build against

If your agent answers questions about files inside Microsoft 365 and your customers already pay for Copilot Credits, Work IQ MCP is a reasonable front door; it searches, fetches, and asks Copilot, all as the user. If your agent reads specific ranges, writes cells, appends table rows, or refreshes PivotTables in cloud workbooks, you are on the Graph Excel API either way, directly or through a community wrapper, and the direct path gives you session control, sequential write ordering, and throttling behavior you own. Choose a local file-based MCP server only when the workbook never needs to live in OneDrive or SharePoint.

Either way, the credential problem is the same, and that's what needs production-grade infrastructure. If Microsoft ships workbook-level tools in Work IQ, the tool names will change. The delegated Entra token per user, per tenant, with no app-only fallback, will not.

FAQs

Does Microsoft have an Excel MCP server?

Not for third-party agents. Microsoft's hosted option, Work IQ MCP, exposes generic Microsoft 365 tools that search, fetch whole files, and ask Microsoft 365 Copilot a question, and it documents no workbook, worksheet, or range operations. Agent 365's app-specific servers cover Word and OneDrive but not Excel, and Microsoft marks them legacy. Every Excel MCP server that edits cells is a community project.

What can the Microsoft Graph Excel API do that Work IQ cannot?

Everything cell-level: read a specific range or a sheet's used range, write values, formulas and number formats, append and sort table rows, create charts and render them as images, refresh PivotTables, evaluate an Excel function without writing a cell, and batch calls inside a workbook session. It works on Office Open XML workbooks in OneDrive for Business and SharePoint; consumer OneDrive is not supported.

Can an Excel agent run without a signed-in user?

No. Every workbook endpoint is delegated-only, and Microsoft lists application permissions as not supported. A headless Excel agent still needs one consented user's token per tenant, with a refresh token to keep it alive, and Work IQ's permission is delegated-only as well. There is no client-credentials path to a cell.

What are the Excel API throttling limits?

Microsoft Graph caps Excel at 5,000 requests per 10 seconds per app across all tenants and 1,500 per 10 seconds per app per tenant. Microsoft advises against parallel requests to the same workbook, especially writes, and throttled responses can carry a retry delay. Ranges are capped at 5 million cells, and workbook sessions expire after a few minutes of inactivity.

When should an agent use the Excel API instead of an MCP server?

When it writes to a specific place, such as appending a row to a table after every closed deal; when it runs a deterministic pipeline that opens a session, refreshes PivotTables, renders a chart and closes the session; when it runs on a schedule with one consented user's refresh token per tenant; or when it needs sequential writes and a throttling budget per tenant.

How does Scalekit connect an AI agent to Excel?

Through the Microsoft Excel connector, which exposes 47 tools over the Graph Excel API. Each user signs in to Microsoft once, Scalekit stores and refreshes their Entra tokens in the token vault, a OneDrive connection resolves file names to item IDs, a virtual MCP server narrows the tools per agent role so a reporting agent never holds a delete tool, and every execution is attributed to that user and tenant.

Build your Excel agent with Scalekit

Browse the Scalekit Microsoft Excel connector and the Microsoft Excel connector docs with the full tool list. See Scalekit pricing, or talk to us.

No items found.
On this page
Share this article
Scalekit
Find us on ProductHunt

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.