MCP
MCP Server
Let Claude, Cursor, Windsurf, and other AI tools create and manage documents on mdfy.app directly.
The MCP-native memory layer for AI agents.
Read mdfy URLs as context today. Write memory back via MCP in Phase 2.
Today Live
- Read mdfy URLs as AI context
- Document CRUD via 25 MCP tools
- Auto-source detection
Coming Q2 2026
- Memory write access
- Bundle deploy
- Multi-agent memory sharing
- Real-time bundle sync
What is MCP
The Model Context Protocol (MCP) is an open standard that lets AI assistants interact with external tools and services. The mdfy MCP server exposes 25 tools across 7 categories — core CRUD, append/prepend, section editing, sharing controls, version history, folders, and stats. The hosted endpoint at https://mdfy.app/api/mcp works with any MCP-compatible client (Claude Web, Cursor, etc.).
Claude Web (Hosted MCP)
Use mdfy.app directly in claude.ai via our hosted MCP endpoint — no local install required.
Endpoint URL
https://mdfy.app/api/mcpIn Claude.ai → Settings → Integrations / Connectors → Add custom MCP server → paste the URL above.
Same hosted endpoint works for any MCP-compatible client that supports remote HTTP MCP (Cursor, ChatGPT, Gemini, etc.).
Local Installation
For local stdio-based clients (Claude Desktop, Claude Code, Cursor stdio mode), install the npm package:
npm install -g mdfy-cli && mdfy loginThe MCP server uses JWT authentication from mdfy login. No environment variables needed.
Claude Code Setup
Add to .mcp.json in your project root:
{
"mcpServers": {
"mdfy": {
"command": "npx",
"args": ["mdfy-mcp"]
}
}
}Claude Desktop Setup
Add to claude_desktop_config.json:
macOS
~/Library/Application Support/Claude/claude_desktop_config.json
Windows
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"mdfy": {
"command": "npx",
"args": ["mdfy-mcp"]
}
}
}Cursor / Windsurf
Cursor and Windsurf both support MCP. Use the hosted HTTP endpoint or the npm package.
Cursor — Settings → MCP → Add new global MCP server
{
"mcpServers": {
"mdfy": {
"url": "https://mdfy.app/api/mcp"
}
}
}All 25 Tools
The hosted MCP exposes 25 tools across 7 categories. Auth happens via the user's mdfy.app session (no API keys).
mdfy_createmdfy_readmdfy_updatemdfy_deletemdfy_listmdfy_searchmdfy_appendmdfy_prependmdfy_outlinemdfy_extract_sectionmdfy_replace_sectionmdfy_duplicatemdfy_import_urlmdfy_publishmdfy_set_passwordmdfy_set_expirymdfy_set_allowed_emailsmdfy_get_share_urlmdfy_versionsmdfy_restore_versionmdfy_diffmdfy_statsmdfy_recentmdfy_folder_listmdfy_folder_createmdfy_move_to_folderDetailed parameters for the 6 core tools below. The other 19 follow the same pattern — the AI will autocomplete arguments from the tool descriptions when called.
mdfy_createCreate a new document from Markdown content. Returns the document URL, ID, and edit token.
mdfy_readFetch a document's content and metadata by ID.
mdfy_updateUpdate an existing document's content or title.
mdfy_listList all documents owned by the authenticated user.
mdfy_publishToggle a document between draft (private) and published (shared) state.
mdfy_deleteSoft-delete a document. Can be restored by owner.
mdfy_create
Create a new document from Markdown content. Returns the document URL, ID, and edit token.
Parameters
markdownREQUIREDstringThe Markdown content.titlestringDocument title.isDraftbooleanCreate as draft. Default: false.Example
// In Claude Code:
"Publish this analysis as a document on mdfy.app"
// Claude calls mdfy_create:
{
"markdown": "# Performance Analysis\n...",
"title": "Performance Analysis",
"isDraft": false
}
// Returns:
{
"url": "https://mdfy.app/abc123",
"id": "abc123",
"editToken": "tok_..."
}mdfy_read
Fetch a document's content and metadata by ID.
Parameters
idREQUIREDstringDocument ID.Example
// "Read the document at mdfy.app/abc123"
// Claude calls mdfy_read:
{ "id": "abc123" }
// Returns full markdown content and metadatamdfy_update
Update an existing document's content or title.
Parameters
idREQUIREDstringDocument ID.markdownstringNew Markdown content.titlestringNew title.changeSummarystringDescription of changes.Example
// "Update the document with the revised version"
// Claude calls mdfy_update:
{
"id": "abc123",
"markdown": "# Revised Analysis\n...",
"changeSummary": "Added benchmarks section"
}mdfy_list
List all documents owned by the authenticated user.
Example
// "Show me my published documents"
// Claude calls mdfy_list (no parameters)
// Returns array of documents with id, title, statusmdfy_publish
Toggle a document between draft (private) and published (shared) state.
Parameters
idREQUIREDstringDocument ID.isDraftREQUIREDbooleanSet to true for draft, false for published.Example
// "Make document abc123 public"
// Claude calls mdfy_publish:
{ "id": "abc123", "isDraft": false }mdfy_delete
Soft-delete a document. Can be restored by owner.
Parameters
idREQUIREDstringDocument ID.Example
// "Delete the old draft"
// Claude calls mdfy_delete:
{ "id": "abc123" }Usage Examples
Publish a document
You: "Write a blog post about WebAssembly and publish it on mdfy.app"
Claude: I'll write the blog post and publish it for you.
[Claude writes the content, then calls mdfy_create]
Done! Your blog post is live at https://mdfy.app/abc123Update with revisions
You: "Update the document at mdfy.app/abc123 - add a section about benchmarks"
Claude: I'll read the current document and add the benchmarks section.
[Claude calls mdfy_read, then mdfy_update with new content]
Updated! The document now includes the benchmarks section.Manage documents
You: "Show me my recent documents and delete the old drafts"
Claude: Let me list your documents.
[Claude calls mdfy_list]
You have 5 documents:
1. "API Guide" (published) - updated 2h ago
2. "Draft notes" (draft) - updated 3d ago
3. "Old meeting notes" (draft) - updated 2w ago
Should I delete the old drafts (#2 and #3)?
You: "Yes"
[Claude calls mdfy_delete for each]
Done! Deleted 2 documents.