Skip to main content
Glama
writefreely-mcp-server

writefreely-mcp-server

by laxmena

writefreely-mcp-server

An MCP server for WriteFreely that enables AI agents to publish and manage content on WriteFreely instances (including self-hosted instances and Write.as).

Features

  • Publish posts (anonymous or authenticated)

  • Manage collections and posts

  • Browse public feeds

  • Support for Write.as and self-hosted WriteFreely instances

Related MCP server: Paragraph MCP

Installation

Installing uv or uvx

If you don't have uv or uvx installed, you can install them using one of the following methods:

macOS/Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

Windows (PowerShell):

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Using Homebrew (macOS):

brew install uv

Using pip:

pip install uv

After installation, uvx will be available as part of uv. See the uv documentation for more details.

Using uvx (recommended)

uvx --from writefreely-mcp-server writefreely-mcp

Using uv

uv tool install writefreely-mcp-server
writefreely-mcp

Using pip

pip install writefreely-mcp-server

Configuration

Configure via environment variables:

  • WRITEFREELY_BASE_URL - Base URL (default: https://write.as)

  • WRITEFREELY_ACCESS_TOKEN - Access token for authentication

  • WRITEFREELY_DEFAULT_LANGUAGE - Default language (default: en)

Getting an Access Token

curl -X POST https://write.as/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"alias": "your_username", "pass": "your_password"}'

MCP Client Configuration

{
  "mcpServers": {
    "writefreely": {
      "command": "uvx",
      "args": ["--from", "writefreely-mcp-server", "writefreely-mcp"],
      "env": {
        "WRITEFREELY_BASE_URL": "https://write.as",
        "WRITEFREELY_ACCESS_TOKEN": "your_token_here"
      }
    }
  }
}

Available Tools

  • login() - Authenticate with username/password

  • publish_post() - Create and publish a new post

  • edit_post() - Update an existing post

  • delete_post() - Delete a post

  • read_post() - Read a post by ID

  • list_my_posts() - List all your posts

  • list_my_collections() - List all your collections/blogs

  • browse_collection() - Browse posts in a collection

  • browse_public_feed() - Browse the public feed

License

MIT

Available Tools

10 tools
browse_collectionA
    List posts in a specific collection/blog.

    Args:
        collection_alias: The alias/name of the collection to browse
        page: Page number for pagination (default: 1, returns 10 posts per page)

    Returns:
        Formatted list of posts in the collection
    

Inputs: collection_alias (required), page. Returns: result

browse_public_feedA
    Read posts from the public read.write.as feed.

    Args:
        skip: Number of posts to skip for pagination
            (default: 0, returns 10 posts per request)

    Returns:
        Formatted list of posts from the public feed
    

Inputs: skip. Returns: result

delete_postA
    Permanently delete a post.

    Args:
        post_id: The ID of the post to delete
        access_token: Access token from login() or WRITEFREELY_ACCESS_TOKEN env var
                     (optional if token is set via env var)
        edit_token: Edit token for anonymous posts (from publish_post response)

    Returns:
        Success or error message
    

Inputs: post_id (required), access_token, edit_token. Returns: result

edit_postA
    Update an existing post's content and/or title.

    Args:
        post_id: The ID of the post to update
        content: The new body content for the post (Markdown supported)
        title: Optional new title (leave None to keep existing title)
        access_token: Access token from login() or WRITEFREELY_ACCESS_TOKEN env var
                     (optional if token is set via env var)
        edit_token: Edit token for anonymous posts (from publish_post response)

    Returns:
        Success message with updated post URL or error
    

Inputs: post_id (required), content (required), title, access_token, +1 more. Returns: result

hello_writefreelyA

Simple test tool - confirms the WriteFreely MCP server is running.

Inputs: no named parameters. Returns: result

list_my_collectionsA
    Get all blogs/collections owned by the authenticated user.

    Args:
        access_token: Access token from login() or WRITEFREELY_ACCESS_TOKEN env var
                     (optional if token is set via env var)

    Returns:
        Formatted list of all user's collections with aliases, titles, and URLs
    

Inputs: access_token. Returns: result

list_my_postsA
    Retrieve all posts for the authenticated user.

    Args:
        access_token: Access token from login() or WRITEFREELY_ACCESS_TOKEN env var
                     (optional if token is set via env var)

    Returns:
        Formatted list of all user's posts with IDs, titles, and URLs
    

Inputs: access_token. Returns: result

loginA
    Authenticate with WriteFreely and obtain an access token.

    If WRITEFREELY_ACCESS_TOKEN environment variable is set, this tool will use
    that token automatically without requiring username and password.
    You can provide username and password to authenticate with a different
    account, or use the environment variable for better security
    (recommended for production).

    Args:
        username: Your WriteFreely username
            (optional if WRITEFREELY_ACCESS_TOKEN is set)
        password: Your WriteFreely password
            (optional if WRITEFREELY_ACCESS_TOKEN is set)

    Returns:
        Success message with access token, or information about existing token
    

Inputs: username, password. Returns: result

publish_postA
    Create and publish a new post on WriteFreely.
    Supports anonymous posts or publishing to a specific collection/blog.

    Args:
        content:     The main body of the post (Markdown supported)
        title:       Optional post title
        access_token: Access token from login() or WRITEFREELY_ACCESS_TOKEN env var
                     Leave empty for anonymous publishing or to use env var token
        collection:  Optional blog/collection alias to publish into
                     (only works with access_token)

    Returns:
        Success message with post URL or error
    

Inputs: content (required), title, access_token, collection. Returns: result

read_postA
    Retrieve the content of an existing post by its ID.

    Args:
        post_id: The ID of the post (or slug for public posts)
        access_token: Optional - needed only for private/draft posts
                     Can also use WRITEFREELY_ACCESS_TOKEN env var

    Returns:
        Post title + body (or error message)
    

Inputs: post_id (required), access_token. Returns: result

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 10 tools

    Disambiguation5/5

    Each tool has a distinct purpose: browsing collections, public feed, CRUD for posts, authentication, and listing user resources. No two tools have overlapping functionality that would confuse an agent.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern using lowercase with underscores (e.g., delete_post, publish_post). The only exception is hello_writefreely, which is a test tool that stands apart from the core workflow.

    Tool Count5/5

    With 10 tools covering authentication, post CRUD, collection browsing, and public feed, the count is well-scoped for a blogging platform. It is neither too few to be useful nor too many to manage.

    Completeness4/5

    The tool set provides complete CRUD for posts and basic collection listing. However, it lacks collection creation, deletion, or update operations, which are minor gaps in managing the full lifecycle of collections.

    Maintenance

    ActivityInactive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      F
      maintenance
      MCP server that connects AI agents to your Paragraph publication, enabling post management, subscriber analytics, and search across posts and publications.
      181 npm
      1
      MIT
    • A
      license
      A
      quality
      F
      maintenance
      MCP server that gives AI agents full blog management over a Lontar headless blogging API, enabling listing, reading, drafting, publishing, updating, and deleting posts.
      8
      MIT