docmcp

docmcp

An MCP server that generates real .docx and .xlsx files from structured data, with support for headings, tables, RTL, and frozen panes. It offers local (stdio) and hosted HTTP modes with API key quotas.

Category
Visit Server

README

docmcp

Live: https://docmcp.fly.dev — free key at POST /keys/free, 10 docs/month. Paid: $10/mo for 100, $30/mo for 500. Quotas live in PLANS in src/store.ts.

A paid MCP server that turns structured data into real .docx and .xlsx files. Agents are good at prose and bad at file formats — they emit Markdown and hope. This gives them a tool that returns a Word or Excel file with actual headings, tables, bold headers, frozen panes and RTL support.

Returns a short-lived download URL rather than a base64 blob: a 200KB docx inlined into a tool result costs the caller ~70k tokens.

Two modes, one codebase:

  • --stdio — local client (Claude Desktop / Code). No auth, no quota, no expiry; files are written to OUT_DIR and the tool returns the path.
  • default — hosted HTTP at /mcp. API key required, quota metered, files served as URLs that expire after 24h. This is the product.

Local

npm install

Already registered in Claude Desktop as docmcp (output → ~/Documents/docmcp). To register elsewhere:

{
  "mcpServers": {
    "docmcp": {
      "command": "/usr/local/bin/node",
      "args": ["<repo>/node_modules/tsx/dist/cli.mjs", "<repo>/src/index.ts", "--stdio"],
      "env": { "DATABASE_URL": "postgres://…", "OUT_DIR": "<somewhere>" }
    }
  }
}

Absolute paths matter — the client launches with a minimal PATH.

Hosted

npm start          # http://localhost:8787/mcp
curl -X POST localhost:8787/keys/free
{
  "mcpServers": {
    "docmcp": {
      "type": "http",
      "url": "https://your-host/mcp",
      "headers": { "Authorization": "Bearer dk_..." }
    }
  }
}

Tools

Tool Does
create_docx headings, paragraphs, bullet/numbered lists, tables, page breaks, rtl for Hebrew/Arabic
create_xlsx multi-sheet, bold + frozen header, auto-filter, sized columns, numbers stay numbers
usage calls used / quota this month

Env

Var Default Notes
PORT 8787
BASE_URL http://localhost:$PORT Must be the public URL — it goes in download links
DATABASE_URL Required. Any Postgres (Koyeb, Neon, Supabase)
OUT_DIR out Generated files, swept hourly, 24h TTL
STRIPE_SECRET_KEY Omit to run without billing
STRIPE_WEBHOOK_SECRET For /stripe/webhook
STRIPE_PRICE_STARTER, STRIPE_PRICE_PRO Price IDs behind /buy/:plan

Plans and quotas live in PLANS in src/store.ts.

Deploy

Any Docker host with a Postgres URL. There is no persistent disk requirement: generated files live on the container filesystem and expire in 24h anyway, so a restart only breaks links that were about to die. Everything that must survive — keys, quotas, the IP salt — is in Postgres.

Currently Render (web service, free tier) + Neon (Postgres, free, no expiry). Deliberately two providers: state lives somewhere that isn't tied to whoever is hosting the container this month. Render builds the Dockerfile straight from GitHub.

BASE_URL must be the public URL — it is baked into every download link handed to a client, so getting it wrong produces links to a host that does not exist. You only learn the URL after the first deploy, so set it then and redeploy.

Render's free tier sleeps after 15 minutes idle and takes 30–50s to wake. That is the cost of not having a card on file; fix it by upgrading once a customer pays.

Billing flow

/buy/starter → Stripe Checkout → webhook checkout.session.completed → key issued → customer lands on /success and sees the key there. No email provider needed. customer.subscription.deleted deactivates it. There are no user accounts: the key is the account.

Test

npm test

Covers both generators (including a ragged table row and a / in a sheet name — both things an LLM will send eventually), number preservation through an xlsx round-trip, and that quota stops exactly at the plan limit.

Known gaps

  • No PDF. Good PDF output needs headless Chrome or LibreOffice, which triples the deploy. Word and Excel are the actual gap — everyone already ships Markdown→PDF. Add it when a paying user asks.
  • A lost key cannot be recovered. It is shown once on /success. Add email delivery or a "resend by email" route when the first customer asks.
  • Files are on the container filesystem. Deliberate — see Deploy. Move to object storage only if 24h links breaking on restart ever actually bothers someone.
  • Free keys are rate limited, not abuse-proof. One per IP per 24h plus a global daily ceiling (FREE_KEYS_PER_DAY, default 200). Rotating VPNs still defeats it — nothing stops that, and no free tier anywhere survives a determined attacker. The limits exist to bound the worst case, not to eliminate it.
  • /admin needs ADMIN_TOKEN. Unset, the route 404s, so an unconfigured deploy never exposes it. Visit /admin?token=….

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured