# Revise (remote · mcp.revise.io)

Collaborative word processor you can use with your agent.

- Trust score: 76/100 (medium)
- Change this week: +5
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.revise.io`: 76/100 (this document), [markdown](https://verifymcp.io/servers/io-revise-mcp-server/mcp.md), [page](https://verifymcp.io/servers/io-revise-mcp-server/mcp)

## Channel facts

- Endpoint: `https://mcp.revise.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 83/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS not yet verified: we couldn't determine whether a plaintext access path exists.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 72/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4157 tokens (~218/item across 19 items; 18 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 97/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 88% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http io-revise-mcp-server https://mcp.revise.io/mcp
```

### Codex

```toml
[mcp_servers.io-revise-mcp-server]
url = "https://mcp.revise.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-revise-mcp-server": {
      "type": "remote",
      "url": "https://mcp.revise.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-revise-mcp-server --url https://mcp.revise.io/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-revise-mcp-server:
    url: "https://mcp.revise.io/mcp"
```

### Other

```json
{
  "mcpServers": {
    "io-revise-mcp-server": {
      "type": "http",
      "url": "https://mcp.revise.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 76, 0)

- [security] New tool “clean_document”, which the server declares destructive
- [security] Tool “leave_comment” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 3711 → 4157
- [cosmetic] “set_page_layout” added an optional parameter “line_numbering”
- [cosmetic] “set_page_layout” added an optional parameter “watermark”
- [cosmetic] “leave_comment” added an optional parameter “acknowledge_existing_thread_ids”

### 2026-08-02 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 75, +4)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 71, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 71, −1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “edit_document” rewrote its description, which is the text the model reads
- [security] Tool “export_document” rewrote its description, which is the text the model reads
- [security] Tool “read_document” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 168 → 206
- [functional] Schema quality: excellent → good
- [functional] New tool “leave_comment”
- [functional] New tool “style_blocks”
- [cosmetic] “read_document” added an optional parameter “start_block”
- [cosmetic] “edit_document” reworded the description of “mode”
- [cosmetic] “insert_footnote” reworded the description of “mode”

### 2026-07-28 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 71, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 71)

First indexed and scored.

## MCP tools (18)

### `create_document` (~145 tokens)

Create document (no account)

Create a Revise document without a Revise account, seeded with markdown. Returns: url (give this to your user — they open it to view the document and create a free account to keep it, in one step) and edit_token (keep it; use it as your Authorization Bearer token in future requests to read and edit this document). The document is private and deleted after 7 days if unclaimed.

Input parameters:

- `content_markdown` (string): Initial content as markdown
- `created_by` (string): Your name (e.g. "Codex", "Claude") so the user sees who made the document. Recommended.
- `title` (string, required): Document title

Output parameters:

- `edit_token` (string): Bearer token scoped to this document for future read/edit calls
- `id` (string): Document ID
- `notes` (string): Human-facing claim and retention notes
- `title` (string): Document title
- `unlock_more` (string): Agent-facing guidance for authenticating to unlock more tools
- `url` (string): Editor URL

### `import_document` (~230 tokens)

Import document (no account)

Create a Revise document from a file at a public http(s) URL (.md, .markdown, .txt, .html, .htm, .docx, .rtf, .odt; PDFs/images not yet supported). The server fetches the URL — file bytes are never passed inline. For a LOCAL file, use upload_document instead (it streams the file to the server). Returns the new document id and URL. Returns url (give it to your user — they view the document and create a free account to keep it, in one step) and edit_token (your Bearer token for future edits). The document is private and deleted after 7 days if unclaimed.

Input parameters:

- `created_by` (string): Your name (e.g. "Codex", "Claude") so the user sees who made the document. Recommended.
- `filename` (string): Filename override — its extension selects the converter (otherwise taken from the URL)
- `title` (string): Document title
- `url` (string, required): Public http(s) URL of the file for the server to fetch

Output parameters:

- `edit_token` (string): Bearer token scoped to this document for future read/edit calls
- `id` (string): Document ID
- `notes` (string): Human-facing claim and retention notes
- `title` (string): Document title
- `unlock_more` (string): Agent-facing guidance for authenticating to unlock more tools
- `url` (string): Editor URL

### `upload_document` (~190 tokens)

Upload a document file (no account)

Create a Revise document from a LOCAL file (docx, md, txt, html; PDFs/images not yet supported) without a Revise account and without putting its bytes in your context. Returns a one-time upload_url and a ready-to-run curl command — run the curl to stream the file. The curl response contains url (give it to your user — they view the document and create a free account to keep it, in one step) and edit_token (your Bearer token for future edits). For a public http(s) URL or a tiny inline file, use import_document instead. The document is private and deleted after 7 days if unclaimed.

Input parameters:

- `created_by` (string): Your name (e.g. "Codex", "Claude") so the user sees who made the document. Recommended.
- `filename` (string, required): The file's name (its extension selects the converter)

Output parameters:

- `curl` (string): Ready-to-run curl command for the upload
- `expires_in` (integer): Seconds until the upload URL expires
- `next` (string): What to do after reserving the upload
- `upload_url` (string): One-time upload endpoint

### `read_document` (~355 tokens)

Read document

Read a Revise document's content. Format "markdown" (default) is the simple dialect — best for plain prose; set with_block_ids to true to interleave <!-- block:xxxxxx --> anchors usable with edit_document. Format "html" is the full-fidelity dialect: compact HTML-like markup with a block id on every element plus everything markdown cannot express — rich marks, <latex> math, code block languages, merged table cells, page layout, and each comment thread inline as a <comment-thread transcript="..."> wrapper around its anchored text. Prefer html when a document uses rich features or has comments; edit_document accepts the same dialect in replacements. "text" is plain text. (For a styled, self-contained HTML file, use export_document instead.) view controls how pending tracked-change suggestions read: "final" (default, as if accepted) or "original" (as if rejected). Long documents are paginated: when a read exceeds the character budget it is cut at a block boundary and the response carries truncated: true, next_start_block, and a ready-to-run example call — repeat with start_block to continue. For a targeted read of a large document, prefer get_document_outline + search_within_document over paging through everything.

Input parameters:

- `format` (string)
- `id` (string, required): Document ID
- `start_block` (integer): 0-based top-level block index to start reading from (default 0). Use the previous response's next_start_block to continue a paginated read.
- `view` (string): Projection of pending suggestions: final = accepted (default), original = rejected
- `with_block_ids` (boolean): Interleave block id anchors (markdown format only)

Output parameters:

- `blocks_included` (integer): Top-level blocks included in this page
- `content` (string): Document content in the requested format
- `format` (string): Returned format
- `id` (string): Document ID
- `next_start_block` (integer): Pass as start_block to read the next page
- `note` (string): Pagination guidance
- `start_block` (integer): First top-level block index included in this page
- `total_blocks` (integer): Total top-level blocks in the document
- `truncated` (boolean): True when the read was cut at a block boundary
- `with_block_ids` (boolean): Whether markdown block anchors were included

### `search_within_document` (~95 tokens)

Search within document

Find where a query matches inside one document. Returns the matching blocks as markdown with <!-- block:xxxxxx --> anchors (usable with edit_document), each with a few neighboring blocks for context. Case-insensitive.

Input parameters:

- `context_blocks` (integer): Neighboring blocks to include on each side (default 2)
- `id` (string, required): Document ID
- `query` (string, required): Text to find (case-insensitive)

Output parameters:

- `groups` (array): Context groups containing matches
- `note` (string): Result note or truncation guidance
- `query` (string): Search query
- `returnedMatchingBlocks` (integer): Number of matching blocks returned in this response
- `totalMatchingBlocks` (integer): Matching block count

### `get_document_outline` (~46 tokens)

Get document outline

Get a document's heading outline with block ids and per-section word counts. Cheap way to orient in a long document before reading specific sections.

Input parameters:

- `id` (string, required): Document ID

Output parameters:

- `blocks` (integer): Top-level block count
- `sections` (array)
- `title`: Document title
- `totalWords` (integer): Total word count

### `get_recent_changes` (~103 tokens)

Get recent changes

See what changed in a document since YOU last looked at it — e.g. edits the human (or another collaborator) made in between. Returns added, removed, and changed blocks (with block ids), all in the accepted/projected state. Great for catching up before continuing work ("how does it look now?"). The first call on a document just establishes a baseline. Each call advances your baseline to the current state.

Input parameters:

- `id` (string, required): Document ID

Output parameters:

- `added` (array): Added blocks
- `baselineEstablished` (boolean): True when this first call only established a baseline
- `changed` (array): Changed blocks
- `note` (string): Result note or truncation guidance
- `removed` (array): Removed blocks
- `since`: ISO timestamp for the previous baseline
- `summary` (object): Exact changed-block counts

### `get_document_info` (~37 tokens)

Get document info

Get a document's metadata: title, sharing state, URLs, timestamps, and word count.

Input parameters:

- `id` (string, required): Document ID

Output parameters:

- `blocks` (integer): Top-level block count
- `createdAt`: Creation timestamp from the Revise API
- `id` (string): Document ID
- `isOwner` (boolean): Whether the current user owns the document
- `isPublic` (boolean): Whether the document is publicly shared
- `pages`: Rendered page count, or null in pageless mode
- `publicUrl`: Public URL, when enabled
- `readOnly` (boolean): Whether the current user has read-only access
- `title` (string): Document title
- `updatedAt`: Last update timestamp from the Revise API
- `url` (string): Editor URL
- `words` (integer): Word count

### `export_document` (~83 tokens)

Export document

Export a document by id to markdown, txt, html, docx, pdf. Markdown is returned inline. Every other format (txt, html, docx, pdf) is hosted at a temporary download URL (expires in ~24h) returned in the response, not streamed back inline.

Input parameters:

- `format` (string, required)
- `id` (string, required): Document ID

Output parameters:

- `bytes` (integer): Hosted file byte length
- `content` (string): Inline exported text content
- `download_url` (string): Temporary download URL
- `format` (string): Export format
- `id` (string): Document ID
- `notes` (string): Download expiry notes
- `status` (string): Export status

### `edit_document` (~222 tokens)

Edit document

Apply targeted edits to a document using Markdown or HTML content. Edits land as pending tracked changes ("suggest" mode) that the owner reviews and accepts or rejects in the editor — this is the default and the right choice unless your user explicitly asks for direct edits. Pass mode "apply" only on explicit instruction (e.g. "apply it directly", "don't leave suggestions"); it writes immediately with no review step, recorded in the revision history. One exception needs no instruction: on a short/new document (under 20 words) the default is already "apply", since there is nothing meaningful to review. Get block ids from read_document with with_block_ids: true.

Input parameters:

- `edits` (array, required): Edits to perform, in order
- `id` (string, required): Document ID
- `mode` (string): Omit for the default: suggest (tracked changes) on documents with 20+ words, apply on shorter ones. Choose "apply" on a substantial document only when your user explicitly asked for direct edits with…

Output parameters:

- `acceptedChangeRegions` (integer): Change regions accepted immediately
- `editsRequested` (integer): Requested edit count
- `note` (string): Review guidance
- `pendingSuggestionIds` (array): Tracked-change suggestion IDs
- `status` (string): Whether edits were suggested or directly applied

### `style_blocks` (~277 tokens)

Style document blocks

Style existing content with forgiving CSS-lite selectors and values. Use this for bulk formatting instead of rewriting text. Block selectors include *, #blockId, p, h1-h6, li, lists, tables, and descendants. Inline selectors such as b/strong, i/em, u, s/strike/del, code, sup, sub, mark, and a target only matching formatted text ranges. Examples: set the entire document to Georgia with selectors="*" and attrs=[{"name":"fontFamily","value":"Georgia"}]; bold headings with selectors=["h1","h2","h3"] and attrs=[{"name":"fontWeight","value":"bold"}]. Formatting lands as pending tracked changes by default on substantial documents.

Input parameters:

- `attrs` (array, required): Style attributes to set
- `id` (string, required): Document ID
- `mode` (string): Omit for the default: suggest (tracked formatting changes) on documents with 20+ words, apply on shorter ones. Choose "apply" on a substantial document only when the user explicitly asks for direct f…
- `selectors` (required): CSS-lite selectors: *, #blockId, p, h1-h6, li, ul, ol, pre, latex, img, table, tr, td/th, div, inline formatting tags, descendants, and :nth-child(n)

Output parameters:

- `acceptedChangeRegions` (integer): Formatting change regions accepted immediately
- `attributesRequested` (integer): Number of style attributes in the request
- `note` (string): Review guidance
- `pendingSuggestionIds` (array): Tracked formatting suggestion IDs
- `selectorsRequested` (integer): Number of selectors in the request
- `status` (string): Whether formatting was suggested or directly applied

### `rename_document` (~33 tokens)

Rename document

Change a document's title.

Input parameters:

- `id` (string, required): Document ID
- `title` (string, required): New document title

Output parameters:

- `status` (string): Rename status
- `title` (string): New title

### `set_page_layout` (~406 tokens)

Set page layout

Set a document's page layout: page size, orientation, margins, page numbers, line/paragraph spacing, pageless mode, or the APA-7 preset. Length values are strings with explicit units (e.g. "1in", "2.54cm", "72px").

Input parameters:

- `block_spacing` (string): Vertical spacing between blocks, e.g. "0.125in"
- `id` (string, required): Document ID
- `line_numbering`: Word-style line numbering in the left margin (pleading paper). Pass an object (possibly empty) to enable, null to disable
- `margin` (string): Uniform margin for all sides, e.g. "1in"
- `margin_bottom` (string)
- `margin_left` (string)
- `margin_right` (string)
- `margin_top` (string)
- `note_mode` (string): Bulk-convert every note in the document to this stream: footnotes (per-page bottom areas, numbered 1,2,3) or endnotes (grouped on their own page at the end, numbered i,ii,iii). Individual notes choos…
- `orientation` (string)
- `page_number_position` (string)
- `page_number_start` (integer)
- `page_size` (string): Named page size
- `pageless` (boolean): Enable pageless (continuous) mode
- `preset` (string): Layout preset applied before other overrides
- `show_page_numbers` (boolean): Show/hide page numbers (managed as an automatic header/footer page-number field slot; hand-authored header/footer content is never overwritten)
- `watermark`: Diagonal page watermark text painted on every page, e.g. "DRAFT" or "CONFIDENTIAL". Also accepts a JSON settings string {text, color?, opacity?, diagonal?, fontSizePx?}. Pass "" or null to remove the…

Output parameters:

- `applied` (object): Applied layout settings
- `status` (string): Layout update status

### `replace_document_content` (~69 tokens)

Replace document content

Replace the ENTIRE content of a document with new markdown. Destructive: existing content is removed (it remains recoverable via the document's revision history). Prefer edit_document for targeted changes.

Input parameters:

- `content_markdown` (string, required): New full document content
- `id` (string, required): Document ID

Output parameters:

- `blocks` (integer): Number of blocks in the new content
- `status` (string): Replacement status

### `insert_footnote` (~289 tokens)

Insert footnote

Insert a footnote: a numbered superscript reference placed immediately after the anchor text inside a paragraph, plus the footnote body (shown at the bottom of the page, or as an endnote in pageless documents). On substantial documents this lands as a pending tracked change by default, like edit_document. Footnote bodies appear in read_document as [^n]: definitions with their own block ids — edit or remove them with the normal editing tools (removing a footnote body also removes its reference, and vice versa).

Input parameters:

- `block_id` (string, required): Paragraph block that gets the reference (from read_document with_block_ids)
- `find` (string, required): Anchor text inside the block; the reference is inserted right after it. Pass an empty string to append at the end of the block.
- `id` (string, required): Document ID
- `kind` (string): Note stream: footnote (per-page bottom area, numbered 1,2,3 — default) or endnote (grouped on its own page at the document end, numbered i,ii,iii)
- `mode` (string): Omit for the default: suggest (pending tracked change) on documents with 20+ words, apply on shorter ones. Choose "apply" on a substantial document only when your user explicitly asked for direct edi…
- `text` (string, required): Footnote body text

Output parameters:

- `footnote_block_id` (string): Block id of the footnote body (editable with block tools)
- `footnote_label` (string): Display label as it appears in the text: arabic for footnotes, lowercase roman for endnotes
- `footnote_number` (integer): Per-stream index of the new note
- `status` (string): inserted directly, or left as a pending tracked change
- `suggestion_id` (string): Pending suggestion id when status is suggested

### `leave_comment` (~493 tokens)

Leave a comment

Leave a review comment in a document WITHOUT changing its text — either a new thread anchored to one block, or a reply to an existing thread. Comments appear in the editor's margin attributed to you, where the owner can reply or resolve. Prefer this for passage-specific critique or questions; to propose an actual text change, use edit_document in "suggest" mode instead. To START a thread: target one block (from read_document with_block_ids: true) and exactly one anchor form — anchor_text (short text occurring exactly once in the block), anchor_start_text + anchor_end_text (boundaries of a longer range, without reproducing it), or whole_block: true (structural or empty blocks). To REPLY: pass reply_to_comment_id (a comment id from a <comment-thread> element in read_document format "html", or from an earlier leave_comment result) and no block/anchor fields. Text that already carries an unresolved <comment-thread> is already under discussion: reply to that thread rather than starting a second one over the same words, which is rejected unless you pass acknowledge_existing_thread_ids.

Input parameters:

- `acknowledge_existing_thread_ids` (array): Only for a NEW thread that deliberately overlaps existing unresolved threads: list their ids to confirm you read them and are raising a genuinely different point. Without this, a new thread over text…
- `anchor_end_text` (string): Exact text at the end of that range (pair with anchor_start_text)
- `anchor_start_text` (string): Exact text at the start of a longer range (pair with anchor_end_text)
- `anchor_text` (string): Short exact text that occurs exactly once in the block; the comment anchors to it
- `block_id` (string): Target block for a NEW thread (from read_document with_block_ids: true). Required unless replying.
- `comment` (string, required): Comment body (Markdown)
- `id` (string, required): Document ID
- `reply_to_comment_id` (string): Reply to an existing thread instead of starting a new one: any comment id in the thread (the reply attaches to the thread root). Omit block_id and anchors when replying.
- `whole_block` (boolean): Anchor to the entire block instead of a text range (structural or empty blocks)

Output parameters:

- `anchored_text_range` (object): Anchored character range within the block (text anchors only)
- `block_id` (string): Block the comment is anchored to (new threads only)
- `comment_id` (string): ID of the new comment or reply
- `note` (string): Review guidance
- `status` (string): commented: new thread started; replied: reply added to an existing thread
- `thread_id` (string): Root comment id of the thread a reply was added to

### `resolve_suggestions` (~218 tokens)

Accept or reject your suggestions

Accept or reject the tracked-change suggestions YOU made on a document — only your own, never the user's edits or another agent's suggestions. Use this when the user approves your suggested changes (e.g. they say "lgtm" / "looks good") to apply them on their behalf, or asks you to withdraw them. Covers the whole document by default; pass block_ids to limit to specific blocks. (Edits made with edit_document in "apply" mode are already applied — this is for edits left as suggestions in "suggest" mode.)

Input parameters:

- `action` (string, required): accept: apply your suggested changes; reject: withdraw them
- `block_ids` (array): Limit to suggestions in these blocks (from read_document with_block_ids); omit to review the whole document
- `id` (string, required): Document ID
- `kind` (string): Limit to one kind of change (Word-style review filter): insert = added text/blocks, delete = removed text/blocks, format = formatting-only changes; omit for all kinds

Output parameters:

- `note` (string): Why no suggestions were resolved
- `resolvedChangeRegions` (integer): Resolved change-region count
- `status` (string): Suggestion resolution outcome

### `clean_document` (~243 tokens)

Clean document metadata

Scrub a document before it is shared externally ("clean this document before I send it"): remove comments, resolve ALL pending tracked-change suggestions (accept or reject — everyone's, not just yours), remove hidden text (Word w:vanish), anonymize revision/comment author names to "Author", and clear document properties (title/author/company metadata from the original file). Destructive and not undoable — confirm with the user before running it. Options all default to off; enable only what the user asked to strip. Returns a summary of what was removed.

Input parameters:

- `anonymize_authors` (boolean): Replace suggestion and comment author identities with "Author"
- `clear_core_properties` (boolean): Wipe document properties (author, title, company, created/modified dates)
- `id` (string, required): Document ID
- `remove_comments` (boolean): Remove all comment threads and their anchors
- `remove_hidden_text` (boolean): Remove hidden (invisible-in-Word) text spans; footnote/endnote numerals are kept
- `resolve_suggestions` (string): Resolve ALL pending suggestions: accept applies them, reject reverts them; omit to leave them pending

Output parameters:

- `authorsAnonymized` (integer): Distinct author identities replaced with "Author"
- `commentsRemoved` (integer): Distinct comment threads removed
- `corePropsCleared` (boolean): Whether document properties (docProps/core.xml) were wiped
- `hiddenRemoved` (integer): Hidden text spans removed (note-reference numerals are kept)
- `status` (string): Scrub outcome
- `suggestionsResolved` (integer): Distinct pending suggestions resolved

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-revise-mcp-server/mcp#diagnostics

## Score history

- 2026-08-03: 76
- 2026-08-02: 76
- 2026-08-01: 75
- 2026-07-31: 75
- 2026-07-30: 71
- 2026-07-29: 71
- 2026-07-28: 72
- 2026-07-27: 71
- 2026-07-26: 71

## Links

- Remote endpoint: https://mcp.revise.io/mcp
- Website: https://revise.io/help/mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/io-revise-mcp-server/mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-revise-mcp-server/mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/io-revise-mcp-server/mcp
