Skip to main content
Glama
rucister
by rucister
README.md
# openemr-wiki-mcp

A quick local-first MCP server for OpenEMR documentation.

I made this as a small practical implementation so I could get fast local access to OpenEMR wiki pages, the Users Guide, and selected API docs inside desktop AI apps, coding agents, and other MCP-capable tools.

This repository is intentionally focused on local usage. It does not try to be a full hosted platform or production-ready remote service.

## Tools

| Tool | Description | Key Parameters |
|------|-------------|----------------|
| `search_openemr_wiki` | Search the OpenEMR wiki for any topic. Returns titles, summaries, and URLs. | `query` (string), `limit` (1–10, default 5) |
| `get_openemr_wiki_page` | Fetch the plain-text content of a specific wiki page by title, optionally narrowed to a section. | `title` (string), `section` (optional string) |
| `get_users_guide_toc` | Fetch the table of contents from the OpenEMR 8.0.0 Users Guide. | _(none)_ |
| `get_openemr_api_docs` | Fetch selected OpenEMR API documentation from the OpenEMR GitHub repository. | `doc` (`fhir`, `standard`, `smart_on_fhir`) |
| `list_wiki_pages_by_category` | List wiki pages in a given MediaWiki category. | `category` (string) |

## Requirements

- Node 18+
- npm

## Quick Start

This is a local stdio MCP server. That is the supported usage mode in this repo today.

### Install And Build

```bash
git clone https://github.com/rucister/openemr-wiki-mcp.git
cd openemr-wiki-mcp
npm install
npm run build
npm install -g .
```

Verify the global binary if you want to use the npm-installed command directly:

```bash
which openemr-wiki-mcp
```

### Install Inside WSL On A Local Windows Computer

If you want the MCP server to run inside WSL, do the install from your WSL shell, not from Windows PowerShell:

```bash
cd /path/to/openemr-wiki-mcp
npm install
npm run build
npm install -g .
which openemr-wiki-mcp
```

The last command should print a Linux path inside WSL, for example:

```bash
/home/ubuntu/.nvm/versions/node/v22.16.0/bin/openemr-wiki-mcp
```

## Use It Locally

### VS Code

Open the Command Palette and run MCP: Open User Configuration, then add:

```json
{
  "servers": {
    "openemr-wiki": {
      "type": "stdio",
      "command": "openemr-wiki-mcp"
    }
  }
}
```

If VS Code cannot find the global binary, replace `openemr-wiki-mcp` with the absolute Linux or macOS path returned by `which openemr-wiki-mcp`.

### Claude Code

Register the local stdio server:

```bash
claude mcp add --scope user --transport stdio openemr-wiki openemr-wiki-mcp
```

Verify:

```bash
claude mcp list
```

If the command is not found because the client does not load your shell profile, register the absolute binary path instead of `openemr-wiki-mcp`.

### Claude Desktop

Config file:
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- Linux/WSL: `~/.config/Claude/claude_desktop_config.json`
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`

If Claude Desktop and the MCP server run in the same Linux or macOS environment, use this local stdio configuration:

```json
{
  "mcpServers": {
    "openemr-wiki": {
      "command": "openemr-wiki-mcp"
    }
  }
}
```

If Claude Desktop is running on Windows and the MCP server is installed inside WSL, use `wsl.exe` and the exact distro name:

```json
{
  "mcpServers": {
    "openemr-wiki": {
      "command": "wsl.exe",
      "args": [
        "-d",
        "Ubuntu-22.04",
        "-e",
        "/home/your-user/.nvm/versions/node/v22.16.0/bin/node",
        "/home/your-user/path/to/openemr-wiki-mcp/dist/index.js"
      ]
    }
  }
}
```

Notes:
- Replace `Ubuntu-22.04` with the exact output of `wsl -l -q` from Windows.
- Using the built `dist/index.js` path is more reliable than depending on the global shim.
- Restart Claude Desktop after saving the config.

## If You Want To Host It

This repository does not include a remote HTTP MCP transport or deployment setup.

If you want to put this online, use this project as a starting point and add the pieces that a public or shared deployment needs:
- remote MCP transport
- authentication and access control
- rate limiting
- caching
- deployment and monitoring

If someone wants to take this local-first implementation and evolve it into a hosted version, that is a good next step for a fork or contribution.

## Update

```bash
git pull && npm run build && npm install -g .
```

## Common Gotchas

- If `openemr-wiki-mcp` is not found after `npm install -g .`, your npm global bin directory is probably not in `PATH`.
- If Claude Code or Claude Desktop does not pick up your shell profile, use the absolute path from `which openemr-wiki-mcp` instead of the bare command name.
- If Claude Desktop on Windows launches the server through WSL, the distro name after `-d` must exactly match the output of `wsl -l -q`, for example `Ubuntu-22.04`.
- This is a stdio MCP server, so do not use `console.log()` for debugging. Write diagnostics to stderr with `console.error()`.

## License

MIT. See `LICENSE`.

TDQS

A4/5.0

Scored across 5 tools

Disambiguation4/5

Each tool has a distinct role: search (discovery), get_page (content retrieval), get_toc (orientation), get_api_docs (developer reference), and list_by_category (browse fallback). There is mild overlap between search_openemr_wiki and list_wiki_pages_by_category as discovery mechanisms, but descriptions clearly explain when to prefer each.

Naming Consistency5/5

All tools follow a consistent snake_case verb_noun pattern (search_, get_, get_, get_, list_). The naming is predictable and readable throughout, with no mixing of conventions.

Tool Count5/5

Five tools is well-scoped for a read-only documentation retrieval server, with each tool earning its place (search, fetch, TOC, API docs, browse). No redundant or filler tools.

Completeness4/5

The surface covers discovery, content fetching, section-level fetching, API docs, and category browsing, which is solid for a documentation server. A minor gap is the lack of a generic way to list a single page's section headings, though the Users Guide TOC partially mitigates this.

Maintenance

ActivityInactive
ResponsivenessNo issues