| name | office-oxide-mcp-rust-document-processor |
| description | Rust-native MCP server for Office document processing (Excel, Word, PowerPoint, PDF) with sub-millisecond performance |
| triggers | ["process office documents with rust","read and write excel word powerpoint files","fill pdf forms programmatically","generate office documents from data","extract data from office files","create xlsx docx pptx files with rust","automate office document workflows","convert office documents to json markdown"] |
office-oxide-mcp-rust-document-processor
Skill by ara.so — MCP Skills collection.
Overview
office-oxide-mcp is a Rust-native MCP (Model Context Protocol) server for processing Office documents (Excel, Word, PowerPoint, PDF). It provides sub-millisecond performance for reading, writing, and manipulating office files locally without external dependencies. Think of it as an open-source alternative to Aspose with native Rust performance.
Key capabilities:
- Read: Extract content from XLSX, DOCX, PPTX, PDF to JSON/Markdown/Text/Chunks
- Write: Create and modify Excel spreadsheets, Word documents, PowerPoint presentations
- PDF Forms: Fill AcroForm/XFA fields, overlay text at coordinates, analyze layout
- Skills System: Pre-built templates for invoices, reports, dashboards, pitch decks
- Coherence Engine: Maintain consistency across linked cells and documents
Performance: ~10-50× faster than Python equivalents (openpyxl, python-docx, etc.)
Installation
Install Binary
cargo install office-oxide-mcp
Or download from GitHub Releases.
Configure MCP Client
Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"office": {
"command": "office-oxide-mcp",
"args": ["--transport", "stdio"]
}
}
}
Cursor (~/.cursor/config.json):
{
"mcpServers": {
"office-oxide-mcp": {
"command": "office-oxide-mcp",
"args": ["--transport", "stdio"]
}
}
}
VS Code Copilot (.vscode/mcp.json):
{
"servers": {
"office-oxide-mcp": {
"command": "office-oxide-mcp",
"args": ["--transport", "stdio"]
}
}
}
Build from Source
git clone https://github.com/Aimino-Tech/office-oxide-mcp.git
cd office-oxide-mcp
cargo build --release
Core MCP Tools
Document Information
list_formats - List all supported formats:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "list_formats"
},
"id": 1
}
get_document_info - Get file metadata:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "get_document_info",
"arguments": {
"file_path": "/path/to/document.xlsx"
}
},
"id": 2
}
Reading Documents
office_read - Read document content:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_read",
"arguments": {
"file_path": "/path/to/data.xlsx",
"output_format": "json"
}
},
"id": 3
}
Output formats: json, markdown, text, chunks (for RAG embeddings)
Excel Operations
Create Spreadsheet
office_create_xlsx - Create new Excel file:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_create_xlsx",
"arguments": {
"file_path": "/path/to/output.xlsx",
"sheet_name": "Q1 Revenue"
}
},
"id": 4
}
Write Data
office_write_cell - Write single cell:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_write_cell",
"arguments": {
"file_path": "/path/to/output.xlsx",
"sheet_name": "Q1 Revenue",
"cell": "A1",
"value": "Revenue",
"format": "bold"
}
},
"id": 5
}
office_write_range - Write range of cells:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_write_range",
"arguments": {
"file_path": "/path/to/output.xlsx",
"sheet_name": "Q1 Revenue",
"start_cell": "A2",
"data": [
["Jan", 120000, 95000],
["Feb", 135000, 102000],
["Mar", 148000, 110000]
]
Formatting
office_format_range - Apply formatting:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_format_range",
"arguments": {
"file_path": "/path/to/output.xlsx",
"sheet_name": "Q1 Revenue",
"range": "B2:C4",
"format": {
"number_format": "$#,##0.00",
"bold": false,
"font_size": 11
}
}
},
"id": 7
}
Charts
office_create_chart - Create chart:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_create_chart",
"arguments": {
"file_path": "/path/to/output.xlsx",
"sheet_name": "Q1 Revenue",
"chart_type": "column",
"data_range": "A1:C4",
"title": "Quarterly Revenue vs Cost",
"position": "E2"
}
},
"id": 8
}
Chart types: column, bar, line, pie, scatter, area
Sheet Management
office_add_sheet - Add worksheet:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_add_sheet",
"arguments": {
"file_path": "/path/to/output.xlsx",
"sheet_name": "Q2 Revenue"
}
},
"id": 9
}
office_merge_cells - Merge cells:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_merge_cells",
"arguments": {
"file_path": "/path/to/output.xlsx",
"sheet_name": "Q1 Revenue",
"range": "A1:D1"
}
},
"id": 10
}
Word Operations
Create Document
office_create_docx - Create Word document:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_create_docx",
"arguments": {
"file_path": "/path/to/report.docx",
"title": "Annual Business Report 2024"
}
},
"id": 11
}
Write from Markdown
office_write_docx_from_md - Convert Markdown to DOCX:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_write_docx_from_md",
"arguments": {
"file_path": "/path/to/report.docx",
"markdown": "# Executive Summary\n\nQ1 2024 revenue increased **23%** to $1.2M.\n\n## Key Metrics\n\n- Revenue: $1,200,000\n- Growth: 23%\n- Customers: 450"
}
},
"id": 12
}
Add Elements
office_add_table - Insert table:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_add_table",
"arguments": {
"file_path": "/path/to/report.docx",
"rows": [
["Metric", "Q1", "Q2", "Q3"],
["Revenue", "$1.2M", "$1.4M", "$1.6M"],
["Profit", "$320K", "$410K", "$520K"]
],
"style":
office_add_image - Insert image:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_add_image",
"arguments": {
"file_path": "/path/to/report.docx",
"image_path": "/path/to/chart.png",
"width": 400,
"height": 300
}
},
"id": 14
}
PowerPoint Operations
Create Presentation
office_create_pptx - Create PowerPoint:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_create_pptx",
"arguments": {
"file_path": "/path/to/deck.pptx",
"title": "Q4 Strategy Review"
}
},
"id": 15
}
Add Slides
office_add_slide - Add slide:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_add_slide",
"arguments": {
"file_path": "/path/to/deck.pptx",
"layout": "title_and_content",
"title": "Market Overview",
"content": "• Total addressable market: $2.5B\n• Current penetration: 3.2%\n• Growth rate: 18% YoY"
}
},
"id": 16
}
Layouts: title, title_and_content, section_header, two_content, comparison, blank
office_add_chart - Add chart to slide:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_add_chart",
"arguments": {
"file_path": "/path/to/deck.pptx",
"slide_index": 2,
"chart_type": "bar",
"data": {
"categories": ["Q1", "Q2", "Q3", "Q4"],
"series": [
{"name": "Revenue", "values": [1.2,
PDF Operations
Read PDF
office_read - Extract PDF content:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_read",
"arguments": {
"file_path": "/path/to/document.pdf",
"output_format": "markdown"
}
},
"id": 18
}
Form Filling
office_list_pdf_fields - List form fields:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_list_pdf_fields",
"arguments": {
"file_path": "/path/to/form.pdf"
}
},
"id": 19
}
office_fill_pdf_form - Fill form fields:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_fill_pdf_form",
"arguments": {
"file_path": "/path/to/form.pdf",
"output_path": "/path/to/filled_form.pdf",
"fields": {
"full_name": "John Smith",
"date_of_birth": "1985-03-15",
"email": "john.smith@example.com",
"address": "123 Main St, Boston, MA 02101"
}
}
},
"id": 20
}
Overlay Text on Flat PDFs
office_analyze_pdf_layout - Find coordinates for text placement:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_analyze_pdf_layout",
"arguments": {
"file_path": "/path/to/template.pdf"
}
},
"id": 21
}
office_overlay_pdf_text - Insert text at coordinates:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_overlay_pdf_text",
"arguments": {
"file_path": "/path/to/template.pdf",
"output_path": "/path/to/filled.pdf",
"fields": [
{"page": 1, "x": 120, "y": 680, "text": "John Smith", "font_size": 12},
{"page": 1, "x":
Skills System
Pre-built templates for common document workflows.
skill_list - List available skills:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "skill_list"
},
"id": 23
}
Available skills:
excel.basic - Financial statements, dashboards, reports
word.invoice - Invoices
word.report - Business reports, contracts
ppt.deck - Pitch decks, QBR presentations
skill_run - Execute skill:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "skill_run",
"arguments": {
"skill_name": "excel.basic",
"template": "pnl",
"output_path": "/path/to/pnl.xlsx",
"data": {
"company": "Acme Corp",
"period": "Q1 2024",
"revenue": [
{"category": "Products", "amount": 850000},
{"category":
Common Patterns
Generate Excel Report from Data
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_create_xlsx",
"arguments": {
"file_path": "/tmp/sales_report.xlsx",
"sheet_name": "Sales"
}
},
"id": 1
}
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_write_range",
"arguments": {
"file_path": "/tmp/sales_report.xlsx"
Convert Excel to JSON for Analysis
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_read",
"arguments": {
"file_path": "/path/to/data.xlsx",
"output_format": "json"
}
},
"id": 1
}
Response structure:
{
"sheets": [
{
"name": "Sales",
"rows": [
{"Month": "Jan", "Revenue": 120000, "Cost": 85000, "Profit": 35000},
{"Month": "Feb", "Revenue": 135000, "Cost": 92000, "Profit": 43000}
]
}
]
}
Generate Word Report from Template
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_create_docx",
"arguments": {
"file_path": "/tmp/monthly_report.docx",
"title": "Monthly Business Report - March 2024"
}
},
"id": 1
}
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_write_docx_from_md",
"arguments": {
"file_path": "/tmp/monthly_report.docx"
Batch Fill PDF Forms
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_list_pdf_fields",
"arguments": {
"file_path": "/path/to/application_form.pdf"
}
},
"id": 1
}
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_fill_pdf_form",
"arguments": {
"file_path": "/path/to/application_form.pdf",
"output_path":
Troubleshooting
MCP Server Not Found
Problem: AI agent can't find office-oxide-mcp command
Solution: Ensure binary is in PATH:
which office-oxide-mcp
export PATH="$HOME/.cargo/bin:$PATH"
Or use full path in config:
{
"mcpServers": {
"office": {
"command": "/Users/username/.cargo/bin/office-oxide-mcp",
"args": ["--transport", "stdio"]
}
}
}
File Permission Errors
Problem: Cannot write to output path
Solution: Check directory permissions:
mkdir -p /path/to/output
chmod 755 /path/to/output
Chart Not Appearing in Excel
Problem: Chart created but not visible
Solution: Ensure data_range includes headers and data:
{
"data_range": "A1:C10",
"chart_type": "column"
}
PDF Form Fields Not Filling
Problem: office_fill_pdf_form completes but fields empty
Solution:
- List fields first to get exact field names:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_list_pdf_fields",
"arguments": {"file_path": "/path/to/form.pdf"}
},
"id": 1
}
- Use exact field names from response (case-sensitive)
- For flat PDFs without form fields, use
office_overlay_pdf_text instead
Large File Performance
Problem: Processing large XLSX file (>100MB) is slow
Solution: Use chunked reading:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "office_read",
"arguments": {
"file_path": "/path/to/large.xlsx",
"output_format": "chunks",
"chunk_size": 1000
}
},
"id": 1
}
Memory Issues
Problem: Server crashes with large documents
Solution: Process in batches or use streaming:
ulimit -s 16384
office-oxide-mcp --transport stdio
Performance Tips
- Batch operations: Use
office_write_range instead of multiple office_write_cell calls
- Reuse files: Open file once, make multiple edits, save once
- JSON format: Use
output_format: "json" for structured data extraction (faster than markdown)
- Chunks for RAG: Use
output_format: "chunks" for embedding large documents
- PDF analysis: Run
office_analyze_pdf_layout once, save coordinates for reuse
Environment Variables
export OFFICE_OXIDE_TEMP_DIR="/path/to/temp"
export RUST_LOG=office_oxide_mcp=info
export OFFICE_OXIDE_MAX_CONCURRENT=4
Resources