> ## Documentation Index
> Fetch the complete documentation index at: https://felimet-hub.jmcores.com/llms.txt
> Use this file to discover all available pages before exploring further.

# EndNote for Word citation management toolkit

> Skill/plugin and MCP server that let AI agents find DOI-verified papers, import RIS into EndNote, and build native Cite While You Write IEEE citations in Word.

`EndNote` · `MCP` · `AI Agent` · `Windows` · `Microsoft Word`

## Overview

EndNote for Word is an AI citation-management toolkit for Microsoft Word. It is a skill/plugin plus an MCP server for Claude Code, Claude Desktop, Codex, and ChatGPT Desktop. It guides an AI agent to find papers that carry a DOI and verify them, import the records into an EndNote library, and then create genuine EndNote Cite While You Write (CWYW) IEEE citations and a real bibliography in a DOCX. Every citation is a native EndNote field, not typed text.

## Core features

* Guides the agent to find peer-reviewed papers, verify metadata and DOI, export EndNote-compatible RIS, and import it through EndNote Direct Export
* Replaces `{{CITE:id}}` markers in a DOCX with real CWYW fields: each citation is an `ADDIN EN.CITE` field carrying a traveling library, and the bibliography is an `ADDIN EN.REFLIST` field
* Never types citation text, never fabricates field codes in OOXML, and never passes off a plain-text list as a bibliography
* IEEE by default; every cited reference must have a DOI, checked through doi.org before citing, and doubled resolver prefixes are rejected
* Supports both IEEE Default Format `[x]` and Display as Author (Year), which gives narrative forms such as `Author et al. [x]`
* Reads the `.enl` library through a read-only snapshot; RIS import is the only action that writes to a library, and EndNote itself performs it
* Pre-checks the manifest against the library and the installed output styles, so an unknown record number or style name cannot make EndNote open a dialog that blocks automation
* Keeps Word hidden throughout and starts EndNote with a hidden window when the bridge has to launch it, then validates the finished document structurally

## Architecture

The agent works through a manuscript in seven stages. Searching the library and pre-checking both finish before Word opens your document; rendering is the only stage that changes it, and validation reopens the result read-only.

The manifest comes out of the fourth stage. Every citation needs a globally unique `id` and `marker`, and the marker must occur exactly once in the document. `pages` and `suffix` apply to the last target only, so they are limited to single-target citations.

```jsonc theme={null}
{
  "schema_version": 1,
  "library": { "path": "C:\\EndNoteLibraries\\ExampleLibrary.enl" },
  "style": "IEEE",
  "citations": [
    {
      "id": "thomsen2023",
      "marker": "{{CITE:thomsen2023}}",
      "targets": [ { "rec_number": 1, "author": "Thomsen", "year": 2023, "doi": "10.0000/fixture.0001" } ],
      "display": "default",
      "pages": "45-46"
    }
  ],
  "bibliography": { "expected": true }
}
```

The `library.path` in this example is a placeholder. Point it at your own `.enl` library before running it, otherwise the manifest fails the `library.path` existence check. The main directories of the repository:

**endnote-for-word**

**skills/endnote-for-word · cross-agent skill, references, and launcher**

**SKILL.md**

**references/installation-matrix.md · skill locations and MCP configuration per platform**

**references/styles-and-formatting.md · output style and DOI template specs**

**scripts/invoke-bridge.ps1**

**scripts · Word and EndNote automation bridge, library reader, MCP server, packager**

**endnote-word.ps1 · PowerShell bridge**

**run-mcp.ps1 · starts the MCP server**

**mcp\_server.py**

**endnote\_library.py**

**package\_plugin.py · builds the plugin and skill packages**

**config/defaults.json · default output style, empty library template, temporary citation delimiters, validation gates**

**examples/example-manifest.json · reference manifest**

**tests · static, MCP protocol, offline structure, library, and live integration checks**

**run-tests.ps1**

**evals · evaluation cases**

**evals.json**

## Quick start

Pick the install that matches your agent; steps 1 to 3 are alternatives.

**1. Claude Code: install the plugin**

```console theme={null}
claude plugin marketplace add felimet/endnote-for-word
claude plugin install endnote-for-word@endnote-for-word
```

To upgrade, run `claude plugin marketplace update endnote-for-word` and `claude plugin update endnote-for-word@endnote-for-word`. Restart Claude Code after installing or upgrading.

**2. Codex: install the plugin**

```console theme={null}
codex plugin marketplace add felimet/endnote-for-word
codex plugin add endnote-for-word@endnote-for-word
```

The plugin carries both the skill and the MCP server. To upgrade, run `codex plugin marketplace upgrade endnote-for-word` and then the `codex plugin add` command again. Restart Codex after installing or upgrading.

**3. Claude Desktop: upload the skill and set up MCP**

Upload `dist/endnote-for-word.skill` from **Customize > Skills**. The file is not in the repository; build it first by running `python scripts/package_plugin.py` from the repository root. Then merge this server into `%APPDATA%\Claude\claude_desktop_config.json` (keep your existing servers), replace `<REPO_ROOT>` with the absolute path of your local checkout, and restart Claude Desktop.

```json theme={null}
{
  "mcpServers": {
    "endnote-for-word": {
      "command": "powershell.exe",
      "args": ["-NoLogo", "-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", "<REPO_ROOT>\\scripts\\run-mcp.ps1"]
    }
  }
}
```

**4. Verify the installation**

From the repository root:

```console theme={null}
pwsh.exe -NoProfile -ExecutionPolicy Bypass -File scripts/endnote-word.ps1 -Action probe
pwsh.exe -NoProfile -ExecutionPolicy Bypass -File scripts/endnote-word.ps1 -Action list-styles -Style IEEE
pwsh.exe -NoProfile -ExecutionPolicy Bypass -File tests/run-tests.ps1
```

The install counts as done only when the probe reports `cwyw_macro_callable` as true and document validation returns `ok: true`. Document validation here means rendering a small fixture document once and then running validate on the output (`-Action validate` or `validate_endnote_word_document`).

**5. Put markers in the DOCX and hand it to the agent**

Prepare the markers in your DOCX first:

```text theme={null}
Automated lameness scoring is now standard {{CITE:thomsen2023}}.
Two independent trials agree {{CITE:merged}}.
```

Then give the agent the DOCX and the target `.enl` path, and tell it your preferred output style, for example `IEEE` or `APA 7th`. If you omit it, IEEE is used; the agent must confirm the style is installed before editing Word and must not silently substitute another one.

## Install options

**Pick an agent to compare install options**

Skill locations and MCP configuration for each platform are in the installation matrix inside the repository (`skills/endnote-for-word/references/installation-matrix.md`).

## Notes

> [!WARNING]
>
> Windows 10 or 11 only. You need the Microsoft Word desktop app and desktop EndNote with the Cite While You Write add-in installed and enabled, plus Python 3, PowerShell (`pwsh.exe` or `powershell.exe`), and HTTPS access to `doi.org`. The CWYW add-in is a hard prerequisite: without it there is no supported way to produce native citation fields, and the tool refuses to fake them. The EndNote web or online plugin is not a substitute. The project is developed and verified against EndNote 21; EndNote and Microsoft Office are proprietary and not distributed by the repository. From WSL Bash, call the Windows-side executable, because Linux `pwsh` cannot automate Word COM.

> [!WARNING]
>
> Several operations make EndNote or Word open a dialog, and automation then hangs until the process is killed: an unknown record number or style name, citation prefixes (such as `{see \Thomsen, 2023 #1}`), and excluded authors or years (such as `{\Thomsen, 2023 #1}`). Version 1 therefore rejects `prefix` outright. Converting to plain text (`ENRemoveFieldCodes`) hangs the same way, so there is no automated action for it; do it yourself from the Word ribbon with **EndNote > Convert Citations and Bibliography > Convert to Plain Text**. That produces a new copy, and the result is one-way: EndNote can no longer update the citations in the converted copy.

> [!WARNING]
>
> The source DOCX and the EndNote library are treated as user data. The bridge writes a new file by default and refuses to replace an existing output unless `-Overwrite` is explicit. Library searches read a temporary snapshot, the tool never edits `sdb.eni`, and RIS import is delegated to EndNote Direct Export. A new target library can only be cloned from a zero-record library while EndNote is fully closed.

## In practice

This fits anyone who already writes in Word with desktop EndNote: mark the places to cite with `{{CITE:id}}` in the manuscript, then let an AI agent find the papers, check each DOI, import the records into the library, and replace the markers, following the manifest, with native IEEE citations and a real bibliography.

## Links

* GitHub: [felimet/endnote-for-word](https://github.com/felimet/endnote-for-word)
* Listed in: [hashgraph-online/awesome-ai-plugins](https://github.com/hashgraph-online/awesome-ai-plugins)
* Listed in: [hol.org/plugins](https://hol.org/plugins)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.